节点语法
该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'})
上述两个查询都会创建两个节点,绑定到变量charlie
和oliver
,每个节点都有一个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'})
此查询创建了Person
Charlie Sheen 和 Oliver Stone 的节点以及Movie
华尔街的节点。它还创建了它们之间的类型ACTED_IN
关系DIRECTED
。
重用变量
上例在指定节点之间创建了一条路径。请注意,这些新创建的节点和关系与图中先前的内容无关。要将它们连接到现有数据,请将所需的节点和关系绑定到变量。然后,这些变量可以传递给查询中针对图中预先存在的元素的后续子句。
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,并分别将它们绑定到charlie
和oliver
变量。然后,这些变量被传递给后续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)
为查理·辛、奥利弗·斯通和迈克尔·道格拉斯创建所有三个节点,并将它们全部连接到代表华尔街电影的节点。然后返回从查理·辛到奥利弗·斯通的路径长度。
请注意,重复节点的变量时,不能向重复添加标签或属性。
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
n |
---|
行数:1 |
|
创建多个节点并使用其属性参数
通过为 Cypher ®提供一组地图,它将为每个地图创建一个节点。
{
"props": [ {
"name": "Andy",
"position": "Developer"
}, {
"name": "Michael",
"position": "Developer"
} ]
}
UNWIND $props AS map
CREATE (n)
SET n = map
行数:0 |
|
INSERT
作为的同义词CREATE
INSERT
可以用作创建节点和关系的同义词,并作为 Cypher 的GQL 一致性CREATE
的一部分引入。但是,要求多个标签用 & 符号分隔,而不是用冒号分隔。INSERT
&
:
INSERT (tom:Person&Actor&Director {name: 'Tom Hanks'})
创建一个节点,绑定到变量tom
,并带有标签Person
、Actor
和Director
和name
属性。