- Neo4j CQL
- Neo4j CQL - 简介
- Neo4j CQL - 创建节点
- Neo4j CQL - 创建关系
- Neo4j CQL 写入子句
- Neo4j - MERGE 命令
- Neo4j - SET 子句
- Neo4j - DELETE 子句
- Neo4j - REMOVE 子句
- Neo4j - FOREACH 子句
- Neo4j CQL 通用子句
- Neo4j - RETURN 子句
- Neo4j - ORDER BY 子句
- Neo4j - LIMIT 子句
- Neo4j - SKIP 子句
- Neo4j - WITH 子句
- Neo4j - UNWIND 子句
- Neo4j CQL 函数
- Neo4j - 字符串函数
- Neo4j - 聚合函数
- Neo4j CQL 管理
- Neo4j - 备份与恢复
- Neo4j - 索引
- Neo4j - 创建唯一约束
- Neo4j - 删除唯一约束
- Neo4j 有用资源
- Neo4j - 快速指南
- Neo4j - 有用资源
- Neo4j - 讨论
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 https://127.0.0.1:7474/ 打开 Neo4j 的内置浏览器应用程序,如下面的屏幕截图所示。
步骤 2 - 将所需的查询复制并粘贴到美元提示符中,然后按播放按钮(执行查询),如下面的屏幕截图中突出显示的那样。
结果
执行后,您将获得以下结果。由于您已经在数据库中创建了一个名为“Dhawan”且标签为“player”的节点,因此 Neo4j 会返回它,如下面的屏幕截图所示。
示例 2
现在,尝试合并一个名为“CT2013”且标签名为 Tournament 的节点。由于没有具有此标签的节点,Neo4j 将创建一个具有给定名称的节点并返回它。
MERGE (CT2013:Tournament{name: "ICC Champions Trophy 2013"}) RETURN CT2013, labels(CT2013)
要执行上述查询,请执行以下步骤:
步骤 1 - 打开 Neo4j 桌面应用程序并启动 Neo4j 服务器。使用 URL https://127.0.0.1:7474/ 打开 Neo4j 的内置浏览器应用程序,如下面的屏幕截图所示。
步骤 2 - 将所需的查询复制并粘贴到美元提示符中,然后按播放按钮(执行查询),如下面的屏幕截图中突出显示的那样。
结果
执行后,您将获得以下结果。如上所述,由于没有具有给定标签(Tournament)的节点。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 https://127.0.0.1:7474/ 打开 Neo4j 的内置浏览器应用程序,如下面的屏幕截图所示。
步骤 2 - 将所需的查询复制并粘贴到美元提示符中,然后按播放按钮(执行查询),如下面的屏幕截图中突出显示的那样。
结果
执行后,您将获得以下结果。如上所述,由于没有具有指定标签和属性的节点,因此它会创建一个新的节点,如下面的屏幕截图所示。
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 https://127.0.0.1:7474/ 打开 Neo4j 的内置浏览器应用程序,如下面的屏幕截图所示。
步骤 2 - 将所需的查询复制并粘贴到美元提示符中,然后按播放按钮(执行查询),如下面的屏幕截图中突出显示的那样。
结果
执行后,您将获得以下结果。如上所述,由于没有具有指定详细信息的节点,Neo4j 创建了该节点以及属性isFound,如下面的屏幕截图所示。
合并关系
就像节点一样,您也可以使用 MERGE 子句合并关系。
示例
以下是一个示例 Cypher 查询,它使用 Neo4j 中的 MATCH 子句合并关系。此查询尝试在节点“ind”(标签:Country & name:India)和 ICC13(标签: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 https://127.0.0.1:7474/ 打开 Neo4j 的内置浏览器应用程序,如下面的屏幕截图所示。
步骤 2 - 将所需的查询复制并粘贴到美元提示符中,然后按播放按钮(执行查询),如下面的屏幕截图中突出显示的那样。
结果
执行后,您将获得以下结果。由于指定的关联不存在于数据库中,Neo4j 将创建一个新的关联,如下面的屏幕截图所示。
同样,您也可以合并多个关系和无向关系。