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

Neo4J-Cypher:多个节点之间的最短路径,neo4j,cypher,Neo4j,Cypher,假设我们有4个节点: {id:1,name:“one”} {id:2,名称:“两”} {id:3,名字:“三”} {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) fi

假设我们有4个节点:

{id:1,name:“one”}
{id:2,名称:“两”}
{id:3,名字:“三”}
{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)

这将导致双for循环构造如下内容:

match p=allshortestpath((p2)-[*]-(p3))、allshortestpath((p2)-[*]-(p1))、allshortestpath((p3)-[*]-(p1)),其中p1.name=“Keanu Reeves”和p2.name=“Gene Hackman”和p3.name=“Clint Eastwood”返回p


我的问题是我不能为
allshortestpath()
函数提供多个节点。仅允许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

哦,对了,这看起来很有趣。我在Neo4J网站上偶然发现了双重放松。然而,所有的部分(bla-IN-bla)似乎就是我想要的。谢谢最后,多亏了你的解决方案,我才得以解决。我不得不稍微修改一下,因为我使用的不是name属性,而是节点的ID。我有一个问题,我的节点可能是另一种类型。如果我将其作为第一行
,并以[“基努·里夫斯”、“矩阵”、“克林特·伊斯特伍德”]作为名称
,那么我将收到3个节点,但矩阵节点不在图形中,即使基努·里夫斯与之有关系(在中)。我希望有一个节点从矩阵到基努·里维斯,从基努到克林特·伊斯特伍德。你能解释一下为什么这个没有出现吗?假设我得到了与使用Hackman相同的结果。问题是电影类型节点没有
名称
属性,但有
标题
属性。所以你需要这个改变:
。。。匹配(n),其中n.name=nn或n.title=nn…
或类似的内容:
。。。匹配(n)(其中有)(键中的k,其中n[k]=nn).