neo4j图数据库,merge语句和create语句有何区别?
发布于 作者:苏南大叔 来源:程序如此灵动~
从本文开始,苏南大叔描述的cypher语句可能相对而言就不是太常用了。如果您是个CRUD党,敬请参考苏南大叔的前几篇文章,讲述的就是增删改查的事情,描述的还是挺详细的。本文中,要描述的语句是merge,它相当于match+create,也是挺好用的。

大家好,这里是苏南大叔的“程序如何灵动”博客,这里讲述苏南大叔和计算机代码的故事。本文讲述cypher语言中的merge的用法。本文测试环境:win10,neo4j@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语句生成了两条一模一样的节点。

用merge语句执行两次,看看结果。
merge (sunan:Person{name:'sunan merge'});
merge (sunan:Person{name:'sunan merge'});match(n) return nmerge 语句只生成了一条节点数据。

用不同的属性merge,看看结果。
merge (sunan:Person{name:'sunan merge',plus:'test'});
merge (sunan:Person{plus:'test',name:'sunan merge'});match(n) return n添加了新属性的merge,添加了新的节点。但是对于属性顺序不一样的merge,会识别出以前的的数据。

merge关系对比create关系
merge (sunan:Person{name:'sunan merge'})-[r:similar]->(sunan2:Person{name:'sunan create'})虽然有相同属性的sunan merge和sunan create节点存在,但是因为没有事先match。这里merge语句也给创建了两个新的节点,再创建了对应关系。第二次执行的时候,就不会创建节点和关系了。
所以,苏南大叔觉得,这里的匹配标准是有着关系r的节点n和m。

create (sunan:Person{name:'sunan merge'})-[r:similar2]->(sunan2:Person{name:'sunan create'})虽然有相同属性的sunan merge和sunan create节点存在,但是因为没有事先match。这里create语句也给创建了两个新的节点,再创建了对应关系。而且执行几次,就多创建几组节点和关系。看来,这个create关系的语句,不match的话,问题很大啊。

对于关系来说,无论是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;
再执行merge两次:
match (sunan:Person{name:'sunan merge'}),(sunan2:Person{name:'sunan create'})
merge (sunan)-[r:similar]->(sunan2) return r;只在第一次执行的时候,创建了4条关系。(因为各有两个匹配到的节点)

再执行create两次:
match (sunan:Person{name:'sunan merge'}),(sunan2:Person{name:'sunan create'})
create (sunan)-[r:similar2]->(sunan2) return r;每次执行的时候,都创建了4条关系(因为各有两个匹配到的节点),但是没有新建节点。

参考文献
- https://newsn.net/say/neo4j-create.html
- https://newsn.net/say/neo4j-merge.html
- https://newsn.net/say/neo4j-match-node.html
- https://newsn.net/say/neo4j-match-relationship.html
综述
苏南大叔的实验结论是:能用merge就别用create,感觉merge更加靠谱一些。更多经验文章,请参考: