在单个查询Neo4j中找到节点列表之间的最短路径

时间:2017-07-03 10:23:30

标签: neo4j cypher py2neo

我有两个列表

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

['james','bond']

我想找到

之间的短路径
avia -> james
paul -> james
tom -> james
avia -> bond
paul -> bond
tom -> bond

我用两个循环创建查询并每次查询neo4j 所以对neo4j进行了多次调用。是一种在一个存储过程中创建它的方法,只需要调用一次neo4j。示例查询如下所示

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

此外,请使用标签!

答案 2 :(得分:0)

最简单的方法应该是使用索引查找(通过列表参数中的属性成员资格)来匹配起始节点和结束节点,然后运行shortestPath。这样的东西,但参数化输入:

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

您希望索引:人(姓名)(或您使用的任何等效物),以便利用索引查找