在 Cypher 中遍历关系的次数可变

Traversing Relationships a Variable Number of Times in Cypher

我有一张机场图,它们之间的航线和运载它的航空公司。我将路线创建为单独的节点,而不仅仅是关系,这样我就可以将每个路线与航空公司和其他节点连接起来。

每个Route节点与始发机场有IS_FROM关系,与目的地有IS_TO关系。它还与其航空公司有 IS_BY 关系:

我正在尝试遍历这棵树,n 次,用于两个机场之间的路线。例如,如果 n = 3,我想获取从 LAXLHR 的所有路线,连接数不超过 3 个。

所以基本上,我的结果将是以下内容的联合: 无中转机场:

MATCH (a1:Airport {iata : 'LAX'})<-[:IS_FROM]-(r:Route)-[:IS_TO]->(a2:Airport {iata : 'LHR'}), (r)-[:IS_BY]->(ai:Airline) return a1 , r , a2 , ai;

1 个中转机场:

MATCH (a1:Airport {iata : 'LAX'})<-[:IS_FROM]-(r:Route)-[:IS_TO]->(a2:Airport)<-[IS_FROM]-(r2:Route)-[:IS_TO]->(a3:Airport {iata: 'LHR'}), (r2)-[:IS_BY]->(ai:Airline) return a1 , r , a2 , a3 , r2 , ai;

等等。

所以查询应该动态遍历 (:Airport)<-[:IS_FROM]-(:Route)-[:IS_TO]->(:Airport) 模式 n 次,return 节点(我对 return 连接的 Airline 更感兴趣到那些路线。

不知道我是否答对了你的问题。对我来说,你的问题可以这样解决:

MATCH (a1:Airport {iata : 'LAX'})<-[r1:IS_FROM]-(r:Route)-[r2:IS_TO]->(a2:Airport{iata : 'LHR'})
OPTIONAL MATCH (r)-[r3:IS_BY]->(ai:Airline)
RETURN a1,r1,r,r2,a2,r3,ai

您可以先提取 3 跳或更短距离的机场之间的所有路径,然后使用 OPTIONAL MATCH 查看路径中的哪些节点是路线,以及哪些航空公司提供这些路线。

MATCH path = (:Airport {iata:$start_airport})-[*2..6]-(:Airport {iata:$end_airport})
WITH path,nodes(path) as path_airports_and_connecting_routes
UNWIND path_airports_and_connecting_routes as node
OPTIONAL MATCH (node)-[:IS_BY]-(airline:Airline)
WITH collect(node) as airports_and_routes,airline
RETURN airports_and_routes + [airline]

警告:Variable-length 路径不允许传递参数,因此您不能执行类似 [*2..2*n].

的操作