能够在2.2中不再在查询中来回跳转

时间:2015-05-20 12:53:37

标签: neo4j cypher

我以前在2.1.x中运行的查询工作正常,已停止在2.2.x中运行

实施例

创建对象:

Create (n:Test {val:"n"})-[:CONNECTION]->(o:Test {val:"o"})-[:CONNECTION]->(p:Test {val:"p"})

在2.1.8中,如果我运行此查询(请注意MATCH子句的顺序):

MATCH (n:Test)-[:CONNECTION*1..2]-(p:Test),(p)-[:CONNECTION*1..2]-(o:Test)
Where(n.val = 'n')
and(o.val = 'o')
and(p.val = 'p')
return n,o,p

我收到回复。

如果我在2.2.x中运行查询,则无法获得结果。

这是打算吗?在我看来,由于我没有在查询上指示方向,它应该能够来回跳转,并且每个-[:CONNECTED]-应该能够看到两种方式,而不管它是否先前访问过一个节点。 / p>

1 个答案:

答案 0 :(得分:1)

有趣!

为此,我重新制定了你的查询,以便它在2.2.0下工作:

.positionDivs div:nth-child(3n-1){
   /* CSS Properties */
 } 

我只是将您的MATCH (n:Test {val: 'n'})-[:CONNECTION*1..2]-(p:Test {val: 'p'}) WITH n,p MATCH p-[:CONNECTION*1..2]-(o:Test {val:'o'}) RETURN n,p,o; 条件移动到匹配中,然后使用WHERE块来绑定WITH,以明确表示您的p第一场比赛与第二场比赛相同。

您的第一个查询的方式有点含糊不清。因为您使用p,所以与:CONNECTION*1..2节点的匹配可以一直到您正在使用值“o”创建的节点。几乎像cypher正在做一个贪婪的比赛(两个CONNECTION跳,而不是一个)。在那种条件下,第二场比赛无法奏效,你什么也得不到。

我无法阐明为什么在2.2.0下这种行为会比早期版本有所不同,但是我可以看到你的查询表达有点时髦,并且如上所述重新制作是正确的,并且是也更容易理解。