当到达集合中的特定节点时,Neo4j停止图遍历

当到达集合中的特定节点时,Neo4j停止图遍历,neo4j,cypher,Neo4j,Cypher,我试图在密集图中找到从一组源节点到一组目标节点的最短路径。连接的一个例子是 (节点1)-[:连接到]->(节点2)-[…]->(节点端)->(节点端) 我面临的挑战是NodeN可能连接到NodeM,其中两个节点都在我的目标列表中。当到达目标列表中的任何节点时,我希望停止遍历该路径 输出的一个示例是: 其中,GMPP和DelHub都是目标,并且GMPP与DelHub有一个连接,所以我只想停止并返回到GMPP的第二条路径 如果您想了解更多细节,请告诉我。我相信我已经找到了答案。我为检查节点的路径添加

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

(节点1)-[:连接到]->(节点2)-[…]->(节点端)->(节点端)

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

输出的一个示例是:

其中,GMPP和DelHub都是目标,并且GMPP与DelHub有一个连接,所以我只想停止并返回到GMPP的第二条路径


如果您想了解更多细节,请告诉我。

我相信我已经找到了答案。我为检查节点的路径添加了“notany”,并排除了目标集中的节点不是路径中最后一个节点的路径。我还通过对路径集合的展开改进了返回集的格式

匹配(t:TestNode),(m:Node),其中t.Node\u ID=m.Node\u ID
与m
匹配路径=最短路径((m:Node)-[r:ConnectsTo*0..5]->(n:Node))
其中n.NODE\u ID位于
['123','283','21232','244464','35102','38591','53011']    
而不是任何(x在节点(路径)中,其中x.NODE_ID位于['123'、'283'、'21232'、'244464'、'35102'、'38591'、'53011']
和xlast(节点(路径)))
使用collect(提取(节点中的e(路径)| e.name))作为路径
按顺序展开(路径)

很好,不过您可以做的一个改进是,在
not any()
中确保获取忽略最后一个节点的集合切片:
,而不是节点(路径)[…-1]中的任何(x)其中…
将允许您删除显式谓词,即x不应是路径中的最后一个节点。此外,您可以将
not any()
替换为
none()
。谢谢。我将调整这一行。如何检索每个路径中的最后一个节点并将其放入不同的集合中?这将从集合中获取一个片段。
节点(路径)[…-1]
提供除最后一个节点外的路径上所有节点的集合(-1位)。如果需要除第一个节点以外的所有节点,则
尾部(节点(路径))
应该可以工作。
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]]
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