Cypher如何基于前序MATCH结果过滤查询指定国家国内航班
问题背景
当前使用国际航班领域的图模型,结构示意图如下:
查询目标:统计指定国家(示例为意大利)国内航班的航司运营班次排名,国内航班判定标准为:航班通过SOURCE、DESTINATION关系关联的出发、到达机场,全部属于该目标国家。
原有查询逻辑存在缺陷:仅校验了航班任意一端连接意大利境内机场,未校验另一端机场归属,因此会将一端在意大利、一端在境外的国际航班纳入统计,导致结果不准。
修正后查询语句
核心思路是提前归集目标国家所有机场为集合,要求匹配到的航班两个端点都在集合内,从匹配阶段就过滤掉跨境航班:
// 匹配目标国家下所有机场,归集为集合 MATCH (:Country {name:'Italy'})<-[:EXIST]-(:City)<-[:IS_IN]-(airport:Airport) WITH collect(airport) AS domestic_airports // 匹配出发、到达机场均在境内集合的航班 MATCH (src:Airport)-[:SOURCE]->(f:Flight)-[:DESTINATION]->(dest:Airport) WHERE src IN domestic_airports AND dest IN domestic_airports // 关联航班所属航司,统计去重后的航班数量 MATCH (f)-[:OF]->(airline:Airline) WITH airline, count(DISTINCT f) AS flight_count ORDER BY flight_count DESC RETURN airline.name AS airline_name, flight_count AS domestic_flight_volume LIMIT 10
关键逻辑说明
- 提前归集境内机场集合,避免后续匹配时重复遍历国家、城市层级的关联关系,查询执行效率更高
- 明确按方向匹配
SOURCE、DESTINATION关系,同时校验两个端点的机场归属,彻底排除跨境航班 - 统计时对航班做去重处理,避免多关系遍历导致的重复计数问题
内容的提问来源于stack exchange,提问作者orestisf
相关产品推荐
相关产品推荐

