Neo4j MERGE
Neo4j MERGE命令是CREATE和MATCH命令的组合。此命令用于在图形中搜索给定的模式。如果它存在于图形中,则它将返回结果,否则它将创建一个新的节点/关系并返回结果。
使用MERGE命令,您可以执行以下操作:
合并带有标签的节点。
合并具有属性的节点。
OnCreate和OnMatch。
合并关系。
语法:
MERGE (node: label {properties . . . . . . . })
示例:
首先在Neo4j数据库中创建两个标签为sachin和Ind的节点。从sachin到Ind创建类型为" BATSMAN_OF"的关系。
CREATE (sachin:player{name: "Sachin Tendulkar", YOB: 1968, POB: "Mumbai"})
CREATE (Ind:Country {name: "India"})
CREATE (sachin)-[r:BATSMAN_OF]->(Ind)
合并带有标签的节点
MERGE子句用于基于标签合并数据库中的节点。如果尝试基于标签合并节点,则Neo4j会验证是否存在带有给定标签的节点。否则,将创建当前节点。
语法:
MERGE (node:label) return node
示例1:
让我们将节点" Sehwag"合并到标签播放器中。 Neo4j验证标签播放器是否存在任何节点。如果没有,它将创建一个名为" Sehwag"的节点并返回它。
如果存在带有给定标签的任何节点,则Neo4j将全部返回。
MERGE (Sehwag:player) return Sehwag
输出:
这里已经有很多带有标签的节点播放器。因此,无需创建另一个要合并的节点。
示例2:
合并一个名为" CT"的节点和一个名为" Tornament"的标签。由于没有带有该标签的节点,Neo4j将创建一个具有给定名称的节点并将其返回。
MERGE (CT:Tornament{name: "ICC Champions Trophy"})
return CT, labels(CT)
输出:
合并具有属性的节点
您可以在合并的节点中添加属性。
语法:
MERGE (node:label {key1:value, key2:value, key3:value . . . . . . . . })
示例:
MERGE (Sehwag:player {name: "Virendra Sehwag", YOB: 1978, POB: "Najafgarh"})
return Sehwag
输出:
OnCreate和OnMatch
OnCreate和OnMatch命令用于指示节点是创建还是匹配。每当我们执行合并查询时,就会匹配或创建一个节点。
语法:
MERGE (node:label {properties . . . . . . . . . . .})
ON CREATE SET property.isCreated ="true"
ON MATCH SET property.isFound ="true"
示例:
MERGE (Sehwag:player {name: "Virendra Sehwag", YOB: 1978, POB: "Najafgarh"})
ON CREATE SET Sehwag.isCreated = "true"
ON MATCH SET Sehwag.isFound = "true"
return Sehwag
下面的示例演示Neo4j中OnCreate和OnMatch子句的用法。如果指定的节点已存在于数据库中,则将匹配该节点,并在该节点中创建键值对isFound ="true"的属性。如果指定的节点在数据库中不存在,则将创建该节点,并在其中创建具有键值对isCreated ="true"的属性。
输出:
合并关系
MERGE子句也可以像节点一样用于合并关系。
参见此示例,该示例使用Neo4j中的MATCH子句合并关系。该查询尝试在节点之间查找名为WINNERS_OF的关系。(标签: 国家和地区名称: 印度)和ICC(标签: 比赛和名称: ICC冠军杯)。
MATCH (a:Country), (b:Tournament)
WHERE a.name = "India" AND b.name = "ICC Champions Trophy"
MERGE (a)-[r:WINNERS_OF]->(b)
return a, b