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 n
merge
语句只生成了一条节点数据。
用不同的属性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
更加靠谱一些。更多经验文章,请参考:
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。