首页 > 解决方案 > CYPHER 获取节点之间的边

问题描述

我目前有一个图表,其中包含具有 Id 的路线,并且需要找到 A 和 E 之间的所有路线。我不需要做最短路径,因为所有路线都有 Id。

我目前运行多个查询,并希望一次完成。

  1. 获取连接到 A (1,2,3) 的所有边

    MATCH (n:Node {Id: "A"})-[s:Edge]->(:Node) RETURN s.Id

  2. 获取连接到 E (1,3) 的所有边

    MATCH (:Node)-[s:Edge]->(n:Node {Id: "E"}) RETURN s.Id

  3. 将 ID 保留在匹配的位置 (1,2)

  4. 检索 id 匹配的所有边。

    对于 ID 匹配匹配的每个结果 (s:Node)-[e:Edge {Id: id})->(e:Node) 返回全部

(1)A -> B -> C -> D -> E

(2)A -> B -> C -> D -> E

这可以在一个查询中完成吗?我有一种 UNWIND 参与的感觉,我也找不到如何做一个 LEFT INNER JOIN 来做到这一点。

示例:如果我想要 A 和 E 之间的所有路线,它应该返回 2。如果我想要 A 和 D 之间的所有边,它应该返回 3。

样本

Node {

string Id;
}


Edge {
long Id;
}

标签: cypher

解决方案


这里最困难的部分是“所有 rel id 都相同”,但这里是如何通过抓取路径中的第一个关系并将其与其余关系进行比较来进行检查。

MATCH p=(start{id:'A'})-[*..10]->(end{id:'E'})
WHERE ALL(r in RELATIONSHIPS(p) WHERE r.id=HEAD(RELATIONSHIPS(p)).id)
RETURN p

推荐阅读