Cypher匹配的结果与"with"和没有"with"不同



首先,对这个笨拙的标题感到抱歉,我想不出更好的方法来公开它。

问题是,当在单个match--result中查询密码时,和在match--with--match--result结构中拆分密码时,我会得到不同的结果。

匹配结果跳过某些结果。

我的代码:

匹配---结果查询

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--with--match--result查询

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非常感谢。

我能想出一个解释来解释这种看似反常的行为。

引用neo4j手册:

在模式匹配时,Neo4j确保不包括匹配同一图形关系在单个图形中多次出现图案在大多数用例中,这样做是明智的

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

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

由于第一个查询由单个模式组成,Cypher将防止相同的COCS关系在同一结果行中出现两次。在您的案例中,这阻止了某些行显示在结果中。

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

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

相关内容

最新更新