Cypher匹配结果与“with”和“with”不同

时间:2015-04-15 11:13:08

标签: neo4j cypher

首先,对于笨拙的标题感到抱歉,我无法想出更好的曝光方式。

问题是我在单个匹配中查询密码时得到了不同的结果 - 结果和在匹配时将它分开---与---匹配---结果结构。

匹配---结果会跳过某些结果。

我的代码:

匹配---结果查询

match (up:U)-[r1:COCS]->(op:O)-[r2:CCLS]->(jp:J)-[r3:PRE]->(n:J{id:"AC"})<-[j2o:CCLS]-(o:O)<-[o2u:COCS]-(u:U)
return up,type(r1), op, type(r2), jp, type(r3), n, type(j2o), o, type(o2u), u

返回较少的结果(缺少与路径结构匹配的结果)。

匹配 - 匹配---匹配---结果查询

match (up:U)-[r1:COCS]->(op:O)-[r2:CCLS]->(jp:J)-[r3:PRE]->(n:J{id:"AC"}) 
 with up, r1, op, r2, jp, r3, n 
match(n)<-[j2o:CCLS]-(o:O)<-[o2u:COCS]-(u:U)
return up,type(r1), op, type(r2), jp, type(r3), n, type(j2o), o, type(o2u), u

返回正确的结果

我不明白为什么会这样。这对我没用。

我理解with的工作方式,两者都应该返回相同的结果。有人会抛光吗?

这是Neo4J 2.1.6 谢谢。

1 个答案:

答案 0 :(得分:1)

我能想到对这种看似异常行为的解释。

引用neo4j manual

  

在模式匹配时,Neo4j确保不包含匹配位置   在单个中多次找到相同的图形关系   图案。在大多数用例中,这是一件明智的事情。

在第一个查询中,以下子模式出现两次(在(n)节点的两侧出现一次):

(:U)-[:COCS]->(:O)

由于第一个查询由单个模式组成,因此Cypher会阻止相同的COCS关系在同一结果行中显示两次。在您的情况下,这会阻止某些行显示在结果中。

您的第二个查询拆分原始查询,以便上述子模式不再在单个模式中出现两次。因此,你得到了#34;完成&#34;结果

因此,这里的教训是:如果您使用重复关系子模式的模式,请确保您真的打算过滤掉同一关系实例多次出现的那些行。