CREATE

简介

CREATE 子句允许您创建节点和关系。为了定义这些实体,CREATE 使用与 MATCH 类似的语法。但是,虽然 模式 只需要评估为真或假,但 CREATE 的语法需要准确指定要创建的节点和关系。

节点语法

CREATE 子句允许您创建一个或多个节点。每个节点都可以分配标签和属性。您可以将每个节点绑定到一个变量,您可以在查询中稍后引用该变量。多个标签用冒号分隔。

查询
CREATE (charlie:Person:Actor {name: 'Charlie Sheen'}), (oliver:Person:Director {name: 'Oliver Stone'})

从 Neo4j 5.18 开始,多个标签也可以用与号 & 分隔,与在 标签表达式 中使用的方式相同。在同一子句中不能混合使用冒号 : 和与号 & 分隔。

查询
CREATE (charlie:Person&Actor {name: 'Charlie Sheen'}), (oliver:Person&Director {name: 'Oliver Stone'})

以上两个查询都创建了两个节点,绑定到变量 charlieoliver,每个节点都有一个 Person 标签和一个 name 属性。表示 Charlie Sheen 的节点也具有 Actor 标签,而表示 Oliver Stone 的节点则分配了 Director 标签。

关系语法

也可以使用 CREATE 子句创建关系。与节点不同,关系总是需要恰好一个关系类型和一个方向。与节点类似,关系可以分配属性和关系类型,并绑定到变量。

查询
CREATE (charlie:Person:Actor {name: 'Charlie Sheen'})-[:ACTED_IN {role: 'Bud Fox'}]->(wallStreet:Movie {title: 'Wall Street'})<-[:DIRECTED]-(oliver:Person:Director {name: 'Oliver Stone'})

此查询创建了 Charlie Sheen 和 Oliver Stone 的 Person 节点,以及 Wall Street 的 Movie 节点。它还创建了它们之间的 ACTED_INDIRECTED 类型的关系。

重复使用变量

前面的示例在指定节点之间创建了一条路径。请注意,这些新创建的节点和关系没有与图中以前的内容连接。要将它们连接到现有数据,请将所需的节点和关系绑定到变量。然后,这些变量可以传递到查询中的后续子句,这些子句针对图中的现有元素。

查询
MATCH (charlie:Person {name: 'Charlie Sheen'}), (oliver:Person {name: 'Oliver Stone'})
CREATE (charlie)-[:ACTED_IN {role: 'Bud Fox'}]->(wallStreet:Movie {title: 'Wall Street'})<-[:DIRECTED]-(oliver)

在此示例中,MATCH 子句找到 Charlie Sheen 和 Oliver Stone 的节点,并将它们分别绑定到 charlieoliver 变量。然后,这些变量传递到随后的 CREATE 子句,该子句从绑定的节点创建新的关系。

您也可以在同一 CREATE 中重复使用变量,无论是在同一子句中还是在后面的子句中。这样,您可以例如定义比线性路径更复杂的构造。

查询
CREATE p = (charlie:Person:Actor {name: 'Charlie Sheen'})-[:ACTED_IN {role: 'Bud Fox'}]->(wallStreet:Movie {title: 'Wall Street'})<-[:DIRECTED]-(oliver:Person:Director {name: 'Oliver Stone'}), (wallStreet)<-[:ACTED_IN {role: 'Gordon Gekko'}]-(michael:Person:Actor {name: 'Michael Douglas'})
RETURN length(p)

创建 Charlie Sheen、Oliver Stone 和 Michael Douglas 的所有三个节点,并将它们全部连接到表示 Wall Street 电影的节点。然后,它返回从 Charlie Sheen 到 Oliver Stone 的路径长度。

请注意,当重复节点的变量时,您可能不会向重复部分添加标签或属性。

查询
MATCH (charlie:Person {name: 'Charlie Sheen'})
CREATE (charlie:Actor)

此查询将失败,因为变量 charlie 已经绑定到一个预先存在的节点,因此不能重复使用它来创建一个新节点。如果您打算添加标签,请使用 SET 子句 代替。

在属性中重复使用变量

分配给节点或关系属性的值可以由 表达式 定义。

查询
MATCH (person:Person)
  WHERE person.name IS NOT NULL
CREATE (anotherPerson:Person {name: person.name, age: $age})

此示例创建了一个 Person 节点,其名称与另一个人的名称相同,年龄来自名为 age参数

此类表达式不能包含对在同一 CREATE 语句中定义的变量的引用。这样做是为了确保属性的值始终明确。

查询
CREATE (charlie {score: oliver.score + 1}), (oliver {score: charlie.score + 1})

此查询尝试创建节点,使 Charlie 的分数高于 Oliver 的分数,反之亦然,这是矛盾的。因此,查询失败。

将参数与 CREATE 一起使用

使用属性参数创建节点

您还可以从映射创建图实体。映射中的所有键/值对都将作为创建的关系或节点的属性设置。在这种情况下,我们还向节点添加了 Person 标签。

参数
{
  "props": {
    "name": "Andy",
    "position": "Developer"
  }
}
查询
CREATE (n:Person $props)
RETURN n
表 1. 结果
n

Node[2]{name:"Andy",position:"Developer"}

行数:1
创建的节点:1
设置的属性:2
添加的标签:1

使用属性参数创建多个节点

通过向 Cypher® 提供一个映射数组,它将为每个映射创建一个节点。

参数
{
  "props": [ {
    "name": "Andy",
    "position": "Developer"
  }, {
    "name": "Michael",
    "position": "Developer"
  } ]
}
查询
UNWIND $props AS map
CREATE (n)
SET n = map
表 2. 结果

(空结果)

行数:0
创建的节点:2
设置的属性:4

INSERT 作为 CREATE 的同义词

INSERT 可以用作 CREATE 的同义词,用于创建节点和关系,并作为 Cypher 的 GQL 符合性 的一部分引入。但是,INSERT 要求多个标签用与号 & 分隔,而不是用冒号 : 分隔。

查询
INSERT (tom:Person&Actor&Director {name: 'Tom Hanks'})

创建一个节点,绑定到变量 tom,带有 PersonActorDirector 标签以及一个 name 属性。