2017-07-03 79 views
0

單查詢節點列表之間的最短路徑,我有兩個列表查找Neo4j的

['avia', 'paul', 'tom'] 

['james','bond'] 

我特林找到

avia -> james 
paul -> james 
tom -> james 
avia -> bond 
paul -> bond 
tom -> bond 

我創建查詢,在兩個循環之間的shortes路徑每次查詢neo4j 因此對neo4j進行了多個調用。它是一種在一個存儲過程中創建這種方法的方法,並且只對neo4j進行一次調用。示例查詢是像下面

match p = allShortestPaths((a{name:'avia'})-[*..2]-(b {name:'james'})) return p 
+0

我解決使用下面的查詢 UNWIND [ 'AVIA', '保羅', '湯姆'] AS人 \t UNWIND [ '詹姆斯', '鍵'] AS PERSON2 \t \t匹配p = allShortestPaths((A) - [*。 .2] - (b)) \t \t WHERE a.name = person and b.name = person2 \t \t unwind relationship(p)as rels \t \t return person,person2,collect(distinct type(rels)) – user2478236

回答

2

您可以放鬆的開始節點的這樣的名單:

UNWIND ['avia','paul','tom'] AS person 
MATCH p=allShortestPaths((a {name: person})-[*..2]-(b {name: "james"})) 
RETURN person, collect(p) 

這將返回3行(假設路徑中找到)是

person, collection of paths found 

此外,請使用標籤!

+0

謝謝你提示標籤 – user2478236

3

您需要使用UNWIND函數來展開您的初始集合,如下所示。

WITH 'james' AS start_point, ['avia', 'paul', 'tom'] AS end_points 
UNWIND end_points as e 
match p = allShortestPaths((a)-[*..2]-(b)) 
WHERE a.name = start_point and b.name = e 
return start_point, p 
+0

謝謝你的答案,但第二個數組也可以有多個值,我會更新這個問題更加清晰。 – user2478236

0

最簡單的方法應該只是同時匹配啓動和使用索引查找終端節點(通過屬性的成員列表參數範圍內)兩種,那麼在運行最短路徑。事情是這樣的,但參數輸入:

WITH ['avia', 'paul', 'tom'] as startNames, ['james','bond'] as endNames 
MATCH (start:Person), (end:Person) 
WHERE start.name in startNames and end.name in endNames 
MATCH p=allShortestPaths((start)-[*..2]-(end)) 
RETURN p 

你會希望有一個指標:人(姓名)(或者你使用任何等價),因此這些利用索引查找