尝试了解何时使用属性值与WHERE子句。
$Match (g:GROUP {GroupID: 1}) RETURN g
给出预期的响应(所有报告的属性都是预期的)。
而且,
$match (a:ADDRESS {AddressID: 454}) return a
给出预期的响应(所有报告的属性都是预期的)。
然而,MERGE中的组合
MERGE (g:GROUP {GroupID: 1})-[r:USES]->(a:ADDRESS {AddressID: 454}) Return g.ShortName, type(r), a.Line1;
创建两个新节点(当然,没有属性,除了冗余的AddressID和GroupID。地址ID和GroupID是用toInt()创建的,我尝试将属性值放在toInt()中(同样的结果):< / p>
Added 2 labels, created 2 nodes, set 2 properties, created 1 relationship, returned 1 row in 77 ms.
因此,在DETACH删除无关节点后,我再次尝试使用(有效)
Match (g:GROUP) WHERE g.GroupID = 1
Match (a:ADDRESS) WHERE a.AddressID = 454
MERGE (g)-[r:USES]->(a)
RETURN g.ShortName, type(r), a.Line1
为什么单独的MATCHing在属性规范没有的情况下有效?
答案 0 :(得分:1)
MERGE是这种行为的一个棘手的条款。
来自MERGE的Cypher文档:
在完整模式上使用MERGE时,行为就是 整个模式匹配,或创建整个模式。 MERGE不会 部分使用现有的模式 - 它是全有或全无。如果偏 需要匹配,这可以通过拆分模式来完成 进入多个MERGE条款。
因此,当您要合并一个模式,并且您没有使用绑定到现有节点的变量时,则匹配整个模式,或者如果它不存在,则创建整个模式,在您的情况下,创建重复节点,因为您的意图是使用MERGE中的现有节点。
通常,当您想要在已存在的节点之间合并关系或模式时,最好在应该首先存在的节点上进行MATCH或MERGE,然后使用匹配或合并的变量合并模式。
修改
我认为这里有一些关于查询差异的原因的混淆。
这与属性是在WHERE子句中定义,还是在MATCH子句中的节点上内联无关。
事实上,您可以使用上次查询完成此操作,并且行为相同:
Match (g:GROUP {GroupID:1})
Match (a:ADDRESS {AddressID:454})
MERGE (g)-[r:USES]->(a)
RETURN g.ShortName, type(r), a.Line1
差异的原因,再次是MERGE的行为
真正了解正在发生的事情的最简单方法是考虑如果首先用MATCH替换MERGE会导致什么行为,然后如果找不到匹配则使用CREATE。
MATCH (g)-[r:USES]->(a)
如果没有匹配,则会改为创建
CREATE (g)-[r:USES]->(a)
这应该是有意义的......现有节点的CREATE将创建缺失的部分,即关系。
对比在整个模式上使用MERGE:
MERGE (g:GROUP {GroupID: 1})-[r:USES]->(a:ADDRESS {AddressID: 454})
Return g.ShortName, type(r), a.Line1;
首先,这将尝试MATCH:
MATCH (g:GROUP {GroupID: 1})-[r:USES]->(a:ADDRESS {AddressID: 454})
然后当找不到匹配时,创建一个
CREATE (g:GROUP {GroupID: 1})-[r:USES]->(a:ADDRESS {AddressID: 454})
根据我们对CREATE如何工作的了解,它不会尝试匹配模式的某些部分(并且没有已经与图形的现有元素匹配的变量),它会创建整个模式,创建一个全新的:GROUP和:具有给定属性的ADDRESS节点,以及新的:USES关系。
答案 1 :(得分:0)
MERGE (g:GROUP {GroupID: 1})-[r:USES]->(a:ADDRESS {AddressID: 454}) Return g.ShortName, type(r), a.Line1;
最有可能创建两个节点,因为这些属性(GROUP节点的GroupID / ADDRESS节点的AddressID)不是这些节点上的唯一属性。
首先匹配节点可确保您获得具有匹配属性的节点(也可能具有其他属性)并合并这些节点。
如果GROUP节点的GroupID和ADDRESS节点的AddressID都有唯一性约束的索引,那么首先没有匹配的MERGE仍应该建立连接。