我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

从本文开始,苏南大叔描述的cypher语句可能相对而言就不是太常用了。如果您是个CRUD党,敬请参考苏南大叔的前几篇文章,讲述的就是增删改查的事情,描述的还是挺详细的。本文中,要描述的语句是merge,它相当于match+create,也是挺好用的。

苏南大叔:neo4j图数据库,merge语句和create语句有何区别? - neoj-merge-create
neo4j图数据库,merge语句和create语句有何区别?(图9-1)

大家好,这里是苏南大叔的“程序如何灵动”博客,这里讲述苏南大叔和计算机代码的故事。本文讲述cypher语言中的merge的用法。本文测试环境:win10neo4j@4.4.5

这个merge语句的基本思想,和以前苏南大叔介绍果的npx命令的思路差不多。就是:没有条件创造条件也要上。怎么理解呢?

merge的话,先在图中寻找目标数据,如果没有就创建一个,最终返回对应的节点或关系数据。create会创造重复数据,而merge更加聪明,如果现实上已经存在节点的话,就不会再次创建。

create节点对比merge节点

先初始化一个图,

match(n) detach delete n;

然后用create语句执行两次,看看结果。

create (sunan:Person{name:'sunan create'});
create (sunan:Person{name:'sunan create'});
match(n) return n;

create语句生成了两条一模一样的节点。

苏南大叔:neo4j图数据库,merge语句和create语句有何区别? - 多次create相同数据节点结果
neo4j图数据库,merge语句和create语句有何区别?(图9-2)

merge语句执行两次,看看结果。

merge (sunan:Person{name:'sunan merge'});
merge (sunan:Person{name:'sunan merge'});
match(n) return n

merge 语句只生成了一条节点数据。

苏南大叔:neo4j图数据库,merge语句和create语句有何区别? - 多次merge相同数据的结果
neo4j图数据库,merge语句和create语句有何区别?(图9-3)

用不同的属性merge,看看结果。

merge (sunan:Person{name:'sunan merge',plus:'test'});
merge (sunan:Person{plus:'test',name:'sunan merge'});
match(n) return n

添加了新属性的merge,添加了新的节点。但是对于属性顺序不一样的merge,会识别出以前的的数据。

苏南大叔:neo4j图数据库,merge语句和create语句有何区别? - 多次merge不同属性数据的结果
neo4j图数据库,merge语句和create语句有何区别?(图9-4)

merge关系对比create关系

merge (sunan:Person{name:'sunan merge'})-[r:similar]->(sunan2:Person{name:'sunan create'})

虽然有相同属性的sunan mergesunan create节点存在,但是因为没有事先match。这里merge语句也给创建了两个新的节点,再创建了对应关系。第二次执行的时候,就不会创建节点和关系了。
所以,苏南大叔觉得,这里的匹配标准是有着关系r的节点nm

苏南大叔:neo4j图数据库,merge语句和create语句有何区别? - 关系多次merge
neo4j图数据库,merge语句和create语句有何区别?(图9-5)

create (sunan:Person{name:'sunan merge'})-[r:similar2]->(sunan2:Person{name:'sunan create'})

虽然有相同属性的sunan mergesunan create节点存在,但是因为没有事先match。这里create语句也给创建了两个新的节点,再创建了对应关系。而且执行几次,就多创建几组节点和关系。看来,这个create关系的语句,不match的话,问题很大啊。

苏南大叔:neo4j图数据库,merge语句和create语句有何区别? - 多次create关系
neo4j图数据库,merge语句和create语句有何区别?(图9-6)

对于关系来说,无论是merge还是create,都要先match数据,否则都会添加新的节点,只不过是数量的区别而已。(merge至少生成两个节点)。

再次对比关系create和merge

重新初始化图,到建立关系之前:

match(n) detach delete n;
create (sunan:Person{name:'sunan create'});
create (sunan:Person{name:'sunan create'});
merge (sunan:Person{name:'sunan merge'});
merge (sunan:Person{name:'sunan merge'});
merge (sunan:Person{name:'sunan merge',plus:'test'});
merge (sunan:Person{plus:'test',name:'sunan merge'});
match (n) return n;

苏南大叔:neo4j图数据库,merge语句和create语句有何区别? - 初始化
neo4j图数据库,merge语句和create语句有何区别?(图9-7)

再执行merge两次:

match (sunan:Person{name:'sunan merge'}),(sunan2:Person{name:'sunan create'}) 
merge (sunan)-[r:similar]->(sunan2) return r;

只在第一次执行的时候,创建了4条关系。(因为各有两个匹配到的节点)

苏南大叔:neo4j图数据库,merge语句和create语句有何区别? - 多次merge2
neo4j图数据库,merge语句和create语句有何区别?(图9-8)

再执行create两次:

match (sunan:Person{name:'sunan merge'}),(sunan2:Person{name:'sunan create'}) 
create (sunan)-[r:similar2]->(sunan2) return r;

每次执行的时候,都创建了4条关系(因为各有两个匹配到的节点),但是没有新建节点。

苏南大叔:neo4j图数据库,merge语句和create语句有何区别? - 多次create2
neo4j图数据库,merge语句和create语句有何区别?(图9-9)

参考文献

综述

苏南大叔的实验结论是:能用merge就别用create,感觉merge更加靠谱一些。更多经验文章,请参考:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   neo4j    cypher