查找具有相同 属性 值的所有关系的两个节点之间的最短路径

Find shortest path between two nodes with all relationships having the same property value

考虑下图:

A --p1--> B --p1--> C --p1--> D
          |                   ^
          '--------p2---------'

A、B、C、D 是节点,所有关系都有一个整数 属性 pid(值:p1、p2、... pn)用于标识路径。

问:只有一个路径id,如何找到A和D之间的最短路径?


我可以查询绝对值:

MATCH (w1 {name:"A"}), 
      (w2 {name:"D"}), 
      p = shortestPath((w1)-[:N*]->(w2))
WHERE all(r IN relationships(p) WHERE r.pid=3) 
RETURN p;`

但是pid可以是我事先不知道(也不关心)的任何值。我只关心 pid 对于所有关系都应该相同的事实。像这样:

MATCH (w1 {name:"A"}), 
      (w2 {name:"D"}), 
      p = shortestPath((w1)-[:N*]->(w2))
WHERE all(r IN relationships(p) WHERE r.pid = relationships(p)[0].pid ) 
RETURN p;`

这个呢?

设置 keyvalue 的参数,例如到“myField”和“myValue”

然后

MATCH (w1 {name:"A"}), 
      (w2 {name:"D"}), 
      p = shortestPath((w1)-[:N*]->(w2))
WHERE all(r IN relationships(p) WHERE r[$key]=$value)
RETURN p;

理想情况下,您希望最短路径算法本身检查路径中的每个关系是否具有相同的 x 值,但您也可以从起始节点中找出一个关系并检查最短的path 与第一个关系共享一个 x 值。这将为您提供每个邻居到 w1 的最短路径,然后您可以 return 其中最短的路径。

MATCH (w1 {name:"A"})
MATCH (w2 {name:"D"})
WITH w1, w2
MATCH (w1)-[first_rel:N]->()
p = shortestPath((w1)-[:N*]->(w2))
WHERE all(r IN relationships(p) WHERE r.x=first_rel.x) 
RETURN p, size(p) AS sz ORDER BY sz LIMIT 1