3

在我的飞行建模中,我想搜索具有 1 个停靠点的路径,这在图中等效于从源到目的地具有 4 个跃点关系。搜索路径时:

     match (s:Airport{airportName:'CAN'}),
     (d:Airport{airportName:'ICN'})
     with s,d 
     match p = (s)<-[*4]->(d)
     return  nodes(p), relationships(p) 

但这也给了我两次访问的机场节点路径,如下所示:机场节点

所以我的问题是,如何排除包含重复节点的路径?如何检测路径中是否存在重复节点?

谢谢 !

4

2 回答 2

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)
于 2017-06-14T11:06:54.100 回答
-1

在 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)

但是有一个航班的起点和终点位置相同,这很奇怪......

干杯

于 2017-06-14T10:21:13.053 回答