教程 > neo4j 教程 > 阅读:344

neo4j merge 命令——迹忆客-ag捕鱼王app官网

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 会返回它,如以下屏幕截图所示。

neo4j 将节点与标签合并

现在,尝试将名为“ct2013”的节点与名为 tournament 的标签合并。 由于没有具有此标签的节点,neo4j 使用给定名称创建一个节点并将其返回。

merge (ct2013:tournament{name: "icc champions trophy 2013"}) 
return ct2013, labels(ct2013)

执行完成后,我们将得到以下结果。 如前所述,因为没有具有给定标签(tournament)的节点。 neo4j 创建并返回指定节点,如以下屏幕截图所示。

neo4j 将节点与标签合并示例2


合并带有属性的节点

我们还可以合并具有一组属性的节点。 如果这样做,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 

执行完成后,我们将得到以下结果。 如前所述,由于没有具有指定标签和属性的节点,它会创建一个,如下面的截图所示。

neo4j 合并带属性的节点


oncreate 和 onmatch

每当我们执行合并子句时,都会匹配或创建一个节点。 使用 on createon match,我们可以设置属性以指示节点是创建还是匹配。

语法

以下是 oncreateonmatch 子句的语法。

merge (node:label {properties . . . . . . . . . . .}) 
on create set property.iscreated ="true" 
on match set property.isfound ="true"

以下是一个 cql 示例,它演示了 neo4j 中 oncreateonmatch 子句的用法。 如果指定的节点已经存在于数据库中,则匹配该节点,并在该节点中创建键值对 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 ,如下面的截图所示。

neo4j oncreate 和 onmatch


合并关系

就像节点一样,我们也可以使用 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 会创建一个,如下面的截图所示。

neo4j 合并关系

查看笔记

扫码一下
查看教程更方便
网站地图