首页 文章

遍历具有条件边缘类型的neo4j图

提问于
浏览
0

我有一个固定的数据库,其中包含连接人和边的节点与六种不同类型的关系 . 为了简单起见,我在这篇文章中称之为关系类型A,B,C,D,E和F.这些关系都不是方向性的 . 语法新,所以谢谢你的帮助 .

我需要获得基于条件路径A到(B或CD)到E到F遍历图的关系集 . 所以这意味着我首先需要链接两个节点的关系() - [:A] - ( ),但后来我对如何表达条件关系感到困惑 . 为了到达下一个节点,我需要B或C然后D,以便它是() - [:B] - ()OR() - [:C] - () - [:D] - () . 如何在MATCH语法中表达这种条件遍历?

尝试了所有这些并得到语法错误:

(node2:Node)-[rel2:B|rel3:C]-(node3:Node)
(node2:Node)-[rel2:B]OR[rel3:C]-(node3:Node)

2 回答

  • 0

    此纯Cypher查询应返回所有匹配的路径:

    MATCH p=()-[:A]-()-[r:B|C|D*1..2]-()-[:E]-()-[:F]-()
    WHERE (SIZE(r) = 1 AND TYPE(r[0]) = 'B') OR
          (SIZE(r) = 2 AND TYPE(r[0]) = 'C' AND TYPE(r[1]) = 'D')
    RETURN p
    

    [r:B|C|D*1..2] 模式匹配1或2个关系,这些关系具有 BC 和/或 D 类型(可以包含您不需要的子路径);并且 WHERE 子句过滤掉您不想要的子路径 .

  • 1

    当遍历的跳数不同时,这不能用Cypher真正表达出来 .

    最简单的方法可能是使用APOC过程中的apoc.cypher.run()来执行UNION查询以覆盖这两个路径,然后使用调用的结果:

    //assume `node2` is in scope
    CALL apoc.cypher.run("MATCH (node2)-[:B]-(node3:Node) RETURN node3
     UNION
     MATCH (node2)-[:C]-()-[:D]-(node3:Node) RETURN node3",
     {node2:node2}) YIELD value
    WITH value.node3 as node3 // , <whatever else you want in scope>
    ...
    

相关问题