[英]Neo4J - Cypher: shortest path between multiple nodes
假设我们有4个节点:
{id:1, name:"one"} {id:2, name:"two"} {id:3, name:"three"} {id:4, name:"four"}
假设节点1链接到节点2,节点2到3,3到4,则结果将类似于:
(1)-->(2)-->(3)-->(4)
如何以给定顺序获得多个给定节点之间的最短路径? 一些例子:
findShortestPath(2,4,3)
应导致: (2)-->(3)-->(4)
findShortestPath(3,1)
应导致: (1)-->(2)-->(3)
findShortestPath(4,1)
应导致: (1)-->(2)-->(3)-->(4)
findShortestPath(3,2)
应导致: (2)-->(3)
我已经尝试过类似的方法,但是我觉得我走错了路,这不是最有效的解决方案。 请注意,我的查询以编程方式构造,因为它可以包含任意数量和种类的节点。
如果输入为:(2),(3),(1)
这将导致double for循环构造如下内容:
match p=allShortestPaths((p2)-[*]-(p3)),allShortestPaths((p2)-[*]-(p1)),allShortestPaths((p3)-[*]-(p1)) where p1.name="Keanu Reeves" and p2.name="Gene Hackman" and p3.name="Clint Eastwood" return p;
我的问题是我无法为allShortestPaths()
函数提供多个节点。 只允许2个具有1个关系的节点。
您可以遍历所有节点对,并检查其他节点是否在这些对之间的可能路径中:
WITH ["Keanu Reeves", "Gene Hackman", "Clint Eastwood"] AS names
UNWIND names AS nn
MATCH (n {name: nn})
WITH collect(n) AS nds
UNWIND nds AS n1
UNWIND nds AS n2
WITH nds, n1, n2 WHERE id(n1) > id(n2)
MATCH path = allShortestPaths((n1)-[*]-(n2))
WITH nds, path WHERE ALL(n IN nds WHERE n IN nodes(path))
RETURN path ORDER BY length(path) ASC
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.