Neo4j MERGE 命令
MERGE
命令是 CREATE
命令和 MATCH
命令的组合。
Neo4j CQL MERGE
命令在图中搜索给定模式。 如果存在,则返回结果。
如果它在图中不存在,那么它会创建一个新的节点/关系并返回结果。
在本章中,我们将学习如何
- 合并带有标签的节点
- 合并具有属性的节点
- OnCreate 和 OnMatch
- 合并关系
语法
以下是 MERGE
命令的语法。
MERGE (node: label {properties . . . . . . . })
在继续本节中的示例之前,请在数据库中创建两个标签为 Tom 和 US 的节点。创建从 Tom 到 US 的类型为 BATSMAN_OF
的关系,如下所示。
CREATE (Tom:player{name: "Tom", YOB: 1985, POB: "Delhi"})
CREATE (US:Country {name: "America"})
CREATE (Tom)-[r:BATSMAN_OF]->(US)
将节点与标签合并
我们可以使用 MERGE
子句根据标签合并数据库中的节点。 如果尝试根据标签合并节点,Neo4j 会验证是否存在具有给定标签的任何节点。 如果没有,将创建当前节点。
语法
以下是基于标签合并节点的语法。
MERGE (node:label) RETURN node
示例
以下是将节点合并到 Neo4j(基于标签)的 CQL 示例 。 当我们执行此查询时,Neo4j 会验证是否有任何带有标签 player 的节点。 如果没有,它会创建一个名为“Jadeja”的节点并返回它。
如果存在具有给定标签的任何节点,Neo4j 会将它们全部返回。
MERGE (Jadeja:player) RETURN Jadeja
执行完成之后,我们将得到以下结果。 由于我们已经在数据库中创建了一个名为“Tom”且标签为“player”的节点,Neo4j 会返回它,如以下屏幕截图所示。
现在,尝试将名为“CT2013”的节点与名为 Tournament 的标签合并。 由于没有具有此标签的节点,Neo4j 使用给定名称创建一个节点并将其返回。
MERGE (CT2013:Tournament{name: "ICC Champions Trophy 2013"})
RETURN CT2013, labels(CT2013)
执行完成后,我们将得到以下结果。 如前所述,因为没有具有给定标签(Tournament)的节点。 Neo4j 创建并返回指定节点,如以下屏幕截图所示。
合并带有属性的节点
我们还可以合并具有一组属性的节点。 如果这样做,Neo4j 会搜索指定节点的相等匹配,包括属性。 如果它没有找到,它会创建一个。
语法
以下是使用属性合并节点的语法。
MERGE (node:label {key1:value, key2:value, key3:value . . . . . . . . })
示例
以下是使用属性合并节点的CQL 的示例 。 这里尝试使用属性和标签合并名为“jadeja”的节点。 由于没有具有确切标签和属性的此类节点,Neo4j 创建了一个。
MERGE (Jadeja:player {name: "Ravindra Jadeja", YOB: 1988, POB: "NavagamGhed"})
RETURN Jadeja
执行完成后,我们将得到以下结果。 如前所述,由于没有具有指定标签和属性的节点,它会创建一个,如下面的截图所示。
OnCreate 和 OnMatch
每当我们执行合并子句时,都会匹配或创建一个节点。 使用 on create
和 on match
,我们可以设置属性以指示节点是创建还是匹配。
语法
以下是 OnCreate
和 OnMatch
子句的语法。
MERGE (node:label {properties . . . . . . . . . . .})
ON CREATE SET property.isCreated ="true"
ON MATCH SET property.isFound ="true"
以下是一个 CQL 示例,它演示了 Neo4j 中 OnCreate
和 OnMatch
子句的用法。 如果指定的节点已经存在于数据库中,则匹配该节点,并在该节点中创建键值对 isFound = "true"
的属性。
如果指定的节点在数据库中不存在,则将创建该节点,并在其中创建一个键值对 isCreated ="true"
的属性。
MERGE (Jadeja:player {name: "Ravindra Jadeja", YOB: 1988, POB: "NavagamGhed"})
ON CREATE SET Jadeja.isCreated = "true"
ON MATCH SET Jadeja.isFound = "true"
RETURN Jadeja
执行完成后,将得到以下结果。 如前所述,由于没有具有指定详细信息的节点,Neo4j 创建了它以及属性 isFound
,如下面的截图所示。
合并关系
就像节点一样,我们也可以使用 MERGE
子句合并关系。
示例
以下是一个 CQL 示例 ,它使用 Neo4j 中的 MATCH
子句合并关系。 此子句尝试合并节点“Chi”(label: Country & name: China)和 ICC13(label: Tournament & name: ICC Champions Trophy 2013)之间名为 WINNERS_OF
的关系。
由于这种关系不存在,Neo4j 创建了一个。
MATCH (a:Country), (b:Tournament)
WHERE a.name = "China" AND b.name = "ICC Champions Trophy 2013"
MERGE (a)-[r:WINNERS_OF]->(b)
RETURN a, b
执行完成后,我们将得到以下结果。 由于数据库中不存在指定的关系,Neo4j 会创建一个,如下面的截图所示。