我试图找出MERGE和CREATE UNIQUE之间的区别。我知道这些功能:
如果不存在模式,我能够创建节点。
MERGE (n { name:"X" }) RETURN n;
这个创建节点" n"具有属性名称,空节点" m"和关系相关。
MERGE (n { name:"X" })-[:RELATED]->(m) RETURN n, m;
我无法像这样创建节点。
CREATE UNIQUE (n { name:"X" }) RETURN n;
如果存在节点" n",则创建唯一的空节点" m"和关系相关。
MATCH (n { name: 'X' }) CREATE UNIQUE (n)-[:RELATED]->(m) RETURN n, m;
如果存在此模式,则不会创建任何内容,只返回模式。
从我的角度来看,我看到MERGE和CREATE UNIQUE是完全相同的查询,但是使用CREATE UNIQUE,你无法在关系中创建起始节点。如果有人能够解释这个问题并比较这些问题,我将不胜感激,谢谢。
答案 0 :(得分:32)
CREATE UNIQUE
的语义比MERGE
稍微模糊一些。 MERGE
是一种替代方案,其行为比CREATE UNIQUE
更直观;如果有疑问,MERGE
通常是正确的选择。
考虑MERGE
的最简单方法是作为MATCH或创建。也就是说,如果数据库中的某些内容MATCH
是MERGE
中使用的模式,则MERGE
将返回该模式。如果没有匹配,MERGE
将在模式中创建所有缺少的元素,其中缺少的元素表示任何未绑定的标识符。
<强>鉴于强>
MATCH (a {uid:123})
MERGE (a)-[r:LIKES]->(b)-[:LIKES]->(c)
&#34;&#34;从MERGE的角度来看是绑定标识符。这意味着密码以某种方式已经知道它代表哪个节点。
这句话可以有两个结果。整个模式已经存在,并且不会创建任何内容,或者缺少部分模式,并且将创建一组全新的关系和与模式匹配的节点。
<强>实施例强>
// Before merge:
(a)-[:LIKES]->()-[:LIKES]->()
// After merge:
(a)-[:LIKES]->()-[:LIKES]->()
// Before merge:
(a)-[:LIKES]->()-[:OWNS]->()
// After merge:
(a)-[:LIKES]->()-[:OWNS]->()
(a)-[:LIKES]->()-[:LIKES]->()
// Before merge:
(a)
// After merge:
(a)-[:LIKES]->()-[:LIKES]->()