【问题标题】:Cypher matched results difer with "with" and without "with"Cypher 匹配结果因“with”和不带“with”而异
【发布时间】:2015-04-15 11:13:08
【问题描述】:

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

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

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

我的代码:

匹配---结果查询

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---结果查询

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 cypher


    【解决方案1】:

    对于这种看似异常的行为,我能想出一个解释。

    引用neo4j manual

    在模式匹配时,Neo4j 确保不包含匹配 同一个图关系在一次中多次发现 图案。在大多数用例中,这是明智的做法。

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-09-28
      • 1970-01-01
      • 2015-02-17
      • 2015-11-16
      • 2014-06-06
      • 2016-08-12
      • 2017-01-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多