Neo4j - MERGE 合并命令
MERGE命令是CREATE命令和MATCH命令的组合。
Neo4j CQL MERGE 命令在图表中搜索给定模式。 如果存在,则返回结果。
如果图中不存在,则会创建一个新的节点/关系并返回结果。
在本章中,您将学习如何 −
- 合并带有标签的节点
- 合并具有属性的节点
- OnCreate 和 OnMatch
- 合并关系
语法
以下是 MERGE 命令的语法。
MERGE (node: label {properties . . . . . . . })
在继续本节中的示例之前,请在数据库中创建两个带有标签 Dhawan 和 Ind 的节点。创建从 Dhawan 到 Ind 的类型为"BATSMAN_OF"的关系,如下所示。
CREATE (Dhawan:player{name: "Shikar Dhawan", YOB: 1985, POB: "Delhi"}) CREATE (Ind:Country {name: "India"}) CREATE (Dhawan)-[r:BATSMAN_OF]->(Ind)
将节点与标签合并
您可以使用 MERGE 子句根据标签合并数据库中的节点。 如果您尝试根据标签合并节点,那么 Neo4j 会验证是否存在具有给定标签的节点。 如果没有,将创建当前节点。
语法
以下是基于标签合并节点的语法。
MERGE (node:label) RETURN node
示例 1
以下是一个示例 Cypher 查询,它将节点合并到 Neo4j 中(基于标签)。 当您执行此查询时,Neo4j 会验证是否存在带有标签 player 的节点。 如果没有,它会创建一个名为"Jadeja"的节点并返回它。
如果存在具有给定标签的任何节点,Neo4j 将返回所有节点。
MERGE (Jadeja:player) RETURN Jadeja
要执行上述查询,请执行以下步骤 −
第 1 步 − 打开 Neo4j 桌面应用程序并启动 Neo4j 服务器。 使用 URL http://localhost:7474/ 打开 Neo4j 的内置浏览器应用程序,如下面的屏幕截图所示。
第 2 步 − 将所需的查询复制并粘贴到 $ 美元提示符中,然后按以下屏幕截图中突出显示的player按钮(以执行查询)。
结果
执行后,您将得到以下结果。 由于您已经在数据库中创建了一个名为"Dhawan"且标签为"player"的节点,Neo4j 将返回它,如下图所示。
示例 2
现在,尝试将名为"CT2013"的节点与名为 Tournament 的标签合并。 由于没有带有此标签的节点,Neo4j 创建一个具有给定名称的节点并返回它。
MERGE (CT2013:Tournament{name: "ICC Champions Trophy 2013"}) RETURN CT2013, labels(CT2013)
要执行上述查询,请执行以下步骤 −
第 1 步 − 打开 Neo4j 桌面应用程序并启动 Neo4j 服务器。 使用 URL http://localhost:7474/ 打开 Neo4j 的内置浏览器应用程序,如下面的屏幕截图所示。
第 2 步 − 将所需的查询复制并粘贴到 $ 美元提示符中,然后按以下屏幕截图中突出显示的player按钮(以执行查询)。
结果
执行后,您将得到以下结果。 正如所讨论的,因为没有具有给定标签(锦标赛)的节点。 Neo4j 创建并返回指定的节点,如下面的屏幕截图所示。
将节点与属性合并
您还可以将节点与一组属性合并。 如果这样做,Neo4j 会搜索指定节点的相等匹配项,包括属性。 如果没有找到,就会创建一个。
语法
以下是使用属性合并节点的语法。
MERGE (node:label {key1:value, key2:value, key3:value . . . . . . . . })
示例
以下是使用属性合并节点的 Cypher 查询示例。 此查询尝试使用属性和标签合并名为"jadeja"的节点。 由于不存在具有确切标签和属性的此类节点,Neo4j 创建了一个。
MERGE (Jadeja:player {name: "Ravindra Jadeja", YOB: 1988, POB: "NavagamGhed"}) RETURN Jadeja
要执行上述查询,请执行以下步骤 −
第 1 步 − 打开 Neo4j 桌面应用程序并启动 Neo4j 服务器。 使用 URL http://localhost:7474/ 打开 Neo4j 的内置浏览器应用程序,如下面的屏幕截图所示。
第 2 步 − 将所需的查询复制并粘贴到 $ 美元提示符中,然后按以下屏幕截图中突出显示的player按钮(以执行查询)。
结果
执行后,您将得到以下结果。 正如所讨论的,由于没有具有指定标签和属性的节点,因此它创建一个,如以下屏幕截图所示。
OnCreate 和 OnMatch
每当我们执行合并查询时,就会匹配或创建一个节点。 使用on create和on match,您可以设置用于指示节点是创建还是匹配的属性。
语法
以下是 OnCreate 和 OnMatch 子句的语法。
MERGE (node:label {properties . . . . . . . . . . .}) ON CREATE SET property.isCreated ="true" ON MATCH SET property.isFound ="true"
示例
以下是一个 Cypher 查询示例,演示了 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
要执行上述查询,请执行以下步骤 −
第 1 步 − 打开 Neo4j 桌面应用程序并启动 Neo4j 服务器。 使用 URL http://localhost:7474/ 打开 Neo4j 的内置浏览器应用程序,如下面的屏幕截图所示。
第 2 步 − 将所需的查询复制并粘贴到 $ 美元提示符中,然后按以下屏幕截图中突出显示的player按钮(以执行查询)。
结果
执行后,您将得到以下结果。 正如所讨论的,由于没有具有指定详细信息的节点,Neo4j 将其与属性 isFound 一起创建,如以下屏幕截图所示。
合并关系
就像节点一样,您也可以使用 MERGE 子句合并关系。
示例
以下是一个示例 Cypher 查询,它使用 Neo4j 中的 MATCH 子句合并关系。 此查询尝试合并节点"ind" (label: Country & name: India) 和 ICC13 (label: Tournament & name: ICC Champions Trophy 2013) 之间名为 WINNERS_OF 的关系。
由于这种关系不存在,Neo4j 创建一个。
MATCH (a:Country), (b:Tournament) WHERE a.name = "India" AND b.name = "ICC Champions Trophy 2013" MERGE (a)-[r:WINNERS_OF]->(b) RETURN a, b
要执行上述查询,请执行以下步骤 −
第 1 步 − 打开 Neo4j 桌面应用程序并启动 Neo4j 服务器。 使用 URL http://localhost:7474/ 打开 Neo4j 的内置浏览器应用程序,如下面的屏幕截图所示。
第 2 步 − 将所需的查询复制并粘贴到 $ 美元提示符中,然后按以下屏幕截图中突出显示的player按钮(以执行查询)。
结果
执行后,您将得到以下结果。 由于数据库中不存在指定的关系,Neo4j 创建一个关系,如下图所示。
同样,您也可以合并多个关系和无向关系。