查找具有相同 属性 值的所有关系的两个节点之间的最短路径
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;`
这个呢?
设置 key
和 value
的参数,例如到“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
考虑下图:
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;`
这个呢?
设置 key
和 value
的参数,例如到“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