Neo4j停止图表在到达集合中的特定节点时进行遍历

时间:2017-02-28 17:03:22

标签: neo4j cypher

我试图在密集图中找到从一组源节点到一组目标节点的最短路径。连接的一个例子是

(节点1) - [:ConnectsTo] - GT;(节点2) - [...] - >(节点N) - >(NodeM)

我遇到的挑战是NodeN可能连接到NodeM,其中两个节点都在我的目标列表中。当我的目标列表中的任何节点到达时,我想停止遍历路径。

Match (t:TestNode),(m:Node) where t.NODE_ID=m.NODE_ID    
with m   
MATCH path=shortestPath((m:Node)-[r:ConnectsTo*0..5]->(n:Node) )   
where n.NODE_ID in    
['123','283','21232','244464','35102','38591','53011']    
RETURN last(nodes(path)),collect(extract(e IN nodes(path)| e.name))

输出的一个例子是:

     [[DF2396, GMPP, DelHub], [DF2396, GMPP]]

其中GMPP和DelHub都是目标,而GMPP与DelHub有连接,因此我想停止并仅返回GMPP的第二条路径。

如果您想了解更多详情,请与我们联系。

1 个答案:

答案 0 :(得分:0)

我相信我的答案已经解决了。我为检查节点和排除路径的路径添加了“not any”,其中目标集中的节点不是路径中的最后一个节点。我还通过路径集合中的展开来改进了返回集的格式。

Match (t:TestNode),(m:Node) where t.NODE_ID=m.NODE_ID    
with m   
MATCH path=shortestPath((m:Node)-[r:ConnectsTo*0..5]->(n:Node) )   
where n.NODE_ID in    
['123','283','21232','244464','35102','38591','53011']    
and not any(x in nodes(path) where x.NODE_ID in ['123','283','21232','244464','35102','38591','53011']  
and x<>last(nodes(path)))
with collect(extract(e IN nodes(path)| e.name)) as paths
unwind (paths) as sequences