排除具有重复节点的路径

时间:2017-06-14 08:40:08

标签: neo4j cypher data-modeling flightpath

在我的飞行模型中,我想搜索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

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

谢谢!

2 个答案:

答案 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)

但是有一个与起点和终点位置相同的航班真是奇怪......

干杯