Neo4j Cypher遍历 - 通过多种关系类型查找路径

时间:2015-03-27 22:51:17

标签: java neo4j cypher traversal

我有一个架构,其中节点通过两种类型的关系连接 - r:A和r:B。我试图编写一个模式,它将找到从节点N到节点M的每条路径。这可以通过跟随密码查询来完成:

match path = (n)-[:A|:B*]->(m) return path;

不幸的是,这不是我所需要的。我需要找到从(n)到(m)的每条路径,其中深度通过关系r:A可以是无限的,但沿途只能使用有限数量的r:B关系。在快乐的一天场景中,密码查询将如下所示:

match path = (n)-[:A*|:B*0..3]->(m) return path;

但是cypher不允许这种语法。即使使用另一个"帮助"我也无法解决这个问题。路上的节点:

match path = (n)-[:A*]->()-[:B*0..3]->(m) return path;

这也不符合我的需要,因为节点可以以任何可能的方式互连。例如:

(n)-[r:A]-()-[r:A]-()-[r:A]-(m)
(n)-[r:A]-(m)
(n)-[r:A]-()-[r:B]-()-[r:A]-()-[r:B]-()-[r:A]-()-[r:A]-(m)

有没有办法实现这一目标?如果不是在密码中,可以在gremlin / neo4j遍历api /嵌入式函数的spring数据neo4j项目中完成吗?

感谢答案。

1 个答案:

答案 0 :(得分:1)

试试这个:

  

匹配路径=(n) - [:A |:B *] - >(m)
  与路径,关系(路径)AS r,   过滤器(相互关系(路径)
  WHERE类型(rel)=' B')AS Brels
  WITH path,reduce(Bcount = 0,rel IN Brels | Bcount + 1)AS Bcount
  在哪里Bcount< = 3
  返回路径

我不知道我是否完全理解这个问题。请告诉我。

编辑:
我在评论后添加了第二个查询。这个解决方案很难看,但它是一个很好的解决方法。

  

匹配路径=(n) - [:A |:B *] - (m)
  WITH path,filter(rel in   关系(路径)WHERE类型(rel)=' B')AS Brels
  与路径,   减少(Bcount = 0,rel IN Brels | Bcount + 1)AS Bcount
  在哪里Bcount   < = 3
  与路径,关系(路径)AS rels
  与路径,相关,   reduce(count = 0,rel IN rels | count + 1)AS count
  与路径,相关,   范围(0,计数-1)作为计数器
  WITH path,reduce(x = 0,c IN counter |
  情况何时(类型(rels [c])=' B' AND类型(rels [c + 1])=' B')那么x + 200000   ELSE x + 1 END)AS countX
  在哪里countX< 200000
  RETURN路径,countX