2016-08-23 170 views
1

例如,我想要查询3个节点(A,B,C)之间的allShortestPaths,这意味着我想查询: 1. A和B之间的allShortestPaths 2. C和B 3. A和Cneo4j - 找到两个以上节点之间的所有最短路径

但我只找到allShortestPaths查询两个节点之间得到allShortestPaths之间的allShortestPaths之间的allShortestPaths。

如下:

MATCH (node1:E { eid:"a9c2f114-796f-4934-a2d0-04bb3345e1d2" }), 
(node2:E { eid:"01968dd2-1ed6-472d-82e9-be7701036b3b" }), 
p = allShortestPaths((node1)-[*]-(node2)) 
RETURN p LIMIT 25 

我想知道是否存在allShortestPaths查询支持超过2个节点的输入?

现在,搜索3个节点,我不得不调用“allShortestPaths”三次如下:

MATCH (node1:E { eid:"b73ade90-dfa1-4b94-bd0f-c16fd93bd680" }), 
(node2:E { eid:"ddb5c52d-7002-4ac7-87d5-0f727f2ab3e7" }), 
(node3:E { eid:"0398b081-6676-4a91-856b-abbabaee5e70" }) , 
p = allShortestPaths((node1)-[*]-(node2)), 
q = allShortestPaths((node3)-[*]-(node2)), 
m = allShortestPaths((node3)-[*]-(node1)) 
RETURN p,q,m LIMIT 10 

什么我想要做的是搜索节点的任意数量之间allShortestPaths 。

到目前为止,我打算写用户定义的过程,但它会花费更多再寄一次想知道谁可以提供更好的建议。

我想搜索搜索allshortestPaths在多个节点之间。 如:allShortestPaths((a)-[*]-(b)-[*]-(c)-[*]-(a))
我想获得A和B,B和C,C和A之间的所有最短路径的查询

+0

你的用例究竟是什么?如果你可以用语言表达你试图解决的问题,它可能会帮助我们提供一种替代方法。 – InverseFalcon

+0

我想搜索搜索多个节点之间的allShortestPaths。 (a) - [*] - (b) - [*] - (c) - [*] - (a))。但是我没有找到合适的查询来实现。 我想得到a和b,b和c,c和a之间的所有最短路径 – Leeon

+0

这听起来像旅行商问题。 3节点顺序无关紧要。访问顺序是否与4个节点或更多有关? – InverseFalcon

回答

0

您需要嵌套循环:

// Array of id 
WITH ["b73ade90-dfa1-4b94-bd0f-c16fd93bd680", 
     "ddb5c52d-7002-4ac7-87d5-0f727f2ab3e7", 
     "0398b081-6676-4a91-856b-abbabaee5e70"] as IDS 

UNWIND IDS as vid 
    // Looking for the desired nodes 
    MATCH (N:E {id: vid}) 
WITH collect(N) as NS 

// Nested loops 
UNWIND RANGE(0, size(NS)-2) as i1 
    UNWIND RANGE(i1+1, size(NS)-1) as i2 

    WITH NS[i1] as N1, 
     NS[i2] as N2 
    // Get paths 
    MATCH ps = allShortestPaths((N1)-[*]-(N2)) 

RETURN ps 
+0

我实际上正在计划使用嵌套循环。但是当使用嵌套循环时,成本是每个allShortestPaths((N1) - [*] - (N2))的总和。我想知道是否有更高效的密码查询来做。我希望的是,成本时间是每个allShortestPaths((N1) - [*] - (N2))的最大值,而不是总和。 – Leeon

+0

在最新版本的APOC过程(3.0.4.1或更高版本,与相应的x.x.x版本的Neo4j一起使用)中,您应该能够使用pairsMin()和通过每个配对的单个循环来处理allShortestPaths。它不会并行执行,目前没有办法做到这一点。 – InverseFalcon

+0

我想知道是否可以使用neo4j Java遍历API编写自己的并行“allShortestPaths”算法。 有没有人认识到比“allShortestPaths”密码查询更高效的算法。 – Leeon

0

Neo4j的不提供了一个版本的allShortestPaths采取多种模式,这是你想要的东西:

allShortestPaths((node1)-[*]-(node2), (node1)-[*]-(node3), (node2)-[*]-(node3)) 

您希望优化的第一个这样做的同时,第二个由捎带的遍历时间,但没有这样的东西,也不会做第三个。这是一个非常具体的用例。

你要么必须调用allShortestPathsN *(N-1)倍(对于ñ节点)在Cypher支架,或者尝试使用Traversal framework自己实现它在procedure服务器端。

相关问题