首页 文章

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

提问于
浏览
3

我有一个模式,其中节点通过两种类型的关系连接 - 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项目中完成吗?

谢谢你的答案 .

1 回答

  • 1

    试试这个:

    MATCH path =(n) - [:A |:B *] - >(m)WITH路径,关系(路径)AS r,过滤器(关系中的rel(路径)WHERE type(rel)='B')AS Brels WITH path,reduce(Bcount = 0,rel IN Brels | Bcount 1)AS Bcount WHERE Bcount <= 3 RETURN路径

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

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

    MATCH path =(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 WHERE Bcount <= 3 WITH path,relationships(path)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(type(rels [c])='B'AND type(rels [c 1])='B' )那么x 200000 ELSE x 1 END)AS countX WHERE countX <200000 RETURN路径,countX

相关问题