在 Cypher 中遍历关系的次数可变
Traversing Relationships a Variable Number of Times in Cypher
我有一张机场图,它们之间的航线和运载它的航空公司。我将路线创建为单独的节点,而不仅仅是关系,这样我就可以将每个路线与航空公司和其他节点连接起来。
每个Route
节点与始发机场有IS_FROM
关系,与目的地有IS_TO
关系。它还与其航空公司有 IS_BY
关系:
我正在尝试遍历这棵树,n
次,用于两个机场之间的路线。例如,如果 n = 3
,我想获取从 LAX
到 LHR
的所有路线,连接数不超过 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]
.
的操作
我有一张机场图,它们之间的航线和运载它的航空公司。我将路线创建为单独的节点,而不仅仅是关系,这样我就可以将每个路线与航空公司和其他节点连接起来。
每个Route
节点与始发机场有IS_FROM
关系,与目的地有IS_TO
关系。它还与其航空公司有 IS_BY
关系:
我正在尝试遍历这棵树,n
次,用于两个机场之间的路线。例如,如果 n = 3
,我想获取从 LAX
到 LHR
的所有路线,连接数不超过 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]
.