在我的飞行模型中,我想搜索1档的路径,这在图表中等效,从源到目的地有4个跳跃关系。使用以下方法搜索路径时:
match (s:Airport{airportName:'CAN'}),
(d:Airport{airportName:'ICN'})
with s,d
match p = (s)<-[*4]->(d)
return nodes(p), relationships(p)
但这也给了我两次访问机场节点的路径,如下所示:airport node
所以我的问题是,如何排除包含重复节点的路径? 如何检测路径中是否存在重复节点?
谢谢!
答案 0 :(得分:2)
如果您有权访问APOC Procedures,则可以尝试使用apoc.algo.allSimplePaths()
,它不会包含任何循环回到路径中先前访问过的节点。
match (s:Airport{airportName:'CAN'}),
(d:Airport{airportName:'ICN'})
call apoc.algo.allSimplePaths(s, d, '', 4) yield path
return nodes(path), relationships(path)
答案 1 :(得分:0)
在MATCH中,您可以多次遍历一个节点,但不是关系的情况。
因此,对于您的模型,是否可以定义要遍历的关系类型(或列表)以避免出现这种情况?
但我认为更好的答案是用更精确的模式重写您的查询:
MATCH p=(s:Airport {airportName:'CAN'})<--(:Flight)-->(stop:Airport)<--(:Flight)-->(d:Airport {airportName:'ICN'})
RETURN nodes(p), relationships(p)
如果您向此查询添加方向和关系类型,我认为您将不再有问题。
如果它仍然存在,您可以将其添加到where子句:WHERE id(stop)<>id(d)
但是有一个与起点和终点位置相同的航班真是奇怪......
干杯