繁体   English   中英

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

[英]Neo4j Cypher traversal - find path by multiple relationship types

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

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项目中完成吗?

谢谢你的答案。

尝试这个:

MATCH路径=(n) - [:A |:B *] - >(m)
WITH path,relationships(path)AS r,filter(rel in relationships(path)
WHERE type(rel)='B')AS Brels
WITH path,reduce(Bcount = 0,rel IN Brels | Bcount + 1)AS Bcount
在哪里Bcount <= 3
返回路径

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

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

MATCH路径=(n) - [:A |:B *] - (m)
WITH path,filter(rel in relationships(path)WHERE type(rel)='B')AS Brels
WITH path,reduce(Bcount = 0,rel IN Brels | Bcount + 1)AS Bcount
在哪里Bcount <= 3
WITH路径,关系(路径)AS rels
WITH path,rels,reduce(count = 0,rel IN rels | count + 1)AS count
WITH path,rels,range(0,count-1)作为计数器
WITH path,reduce(x = 0,c IN counter |
CASE WHEN(类型(rels [c])='B'和类型(rels [c + 1])='B')那么x + 200000 ELSE x + 1 END)AS countX
其中countX <200000
返回路径,countX

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM