简体   繁体   English

Neo4J-Cypher:多个节点之间的最短路径

[英]Neo4J - Cypher: shortest path between multiple nodes

Let's say we have 4 nodes: 假设我们有4个节点:

{id:1, name:"one"} {id:2, name:"two"} {id:3, name:"three"} {id:4, name:"four"}

Suppose node 1 is linked to node 2, node 2 to 3, 3 to 4 so the result would be something like: 假设节点1链接到节点2,节点2到3,3到4,则结果将类似于:

(1)-->(2)-->(3)-->(4)

How would I be able to get the shortest path between multiple given nodes in any given order? 如何以给定顺序获得多个给定节点之间的最短路径? A few examples: 一些例子:

findShortestPath(2,4,3) should result in: (2)-->(3)-->(4) findShortestPath(2,4,3)应导致: (2)-->(3)-->(4)

findShortestPath(3,1) should result in: (1)-->(2)-->(3) findShortestPath(3,1)应导致: (1)-->(2)-->(3)

findShortestPath(4,1) should result in: (1)-->(2)-->(3)-->(4) findShortestPath(4,1)应导致: (1)-->(2)-->(3)-->(4)

findShortestPath(3,2) should result in: (2)-->(3) findShortestPath(3,2)应导致: (2)-->(3)

I have tried something like this, but I feel like I'm going the wrong way and it's not the most performant solution. 我已经尝试过类似的方法,但是我觉得我走错了路,这不是最有效的解决方案。 Note that my query gets constructed programmatically since it can contain any number and kind of nodes. 请注意,我的查询以编程方式构造,因为它可以包含任意数量和种类的节点。

If the input would be: (2),(3),(1) 如果输入为:(2),(3),(1)

That would result in a double for loop constructing something like this: 这将导致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;

My problem is that I can't provide multiple nodes to the allShortestPaths() function. 我的问题是我无法为allShortestPaths()函数提供多个节点。 Only 2 nodes with 1 relation is allowed. 只允许2个具有1个关系的节点。

You can go through all the pairs of nodes, and check that the other nodes are in the possible paths between these pairs: 您可以遍历所有节点对,并检查其他节点是否在这些对之间的可能路径中:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM