我有两个列表
['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
答案 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
您希望索引:人(姓名)(或您使用的任何等效物),以便利用索引查找