其中vs属性规范

时间:2016-12-20 01:25:38

标签: neo4j

尝试了解何时使用属性值与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

Returned 1 row in 14 ms.

为什么单独的MATCHing在属性规范没有的情况下有效?

2 个答案:

答案 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仍应该建立连接。