2016-08-23 118 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服務器端。

相關問題