我有一个架构,其中节点通过两种类型的关系连接 - 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项目中完成吗?
感谢答案。
答案 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