You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Neo4j中查询总价低于3000的LAX出发所有航线路径

解决方案:关联Ticket并筛选总价低于3000的路径

首先,我先结合你的描述和路径示例梳理下数据模型:

  • :Airport 节点(比如LAX、BOS)通过 :ORIGIN 关系连接到 :Flight 节点(代表航班从该机场出发)
  • :Flight 节点通过 :DESTINATION 关系连接到下一个 :Airport 节点(代表航班抵达该机场)
  • 每个 :Flight 节点通过 :ASSIGN 关系关联到 :Ticket 节点,Ticket 的 price 属性存储机票价格

你的原查询仅匹配了路径结构,但未关联Ticket也未做价格筛选,下面是修改后的完整查询及详细说明:

最终查询语句

// 匹配从LAX出发、最多包含5个关系的路径(和原查询保持一致的长度限制)
MATCH path = (origin:Airport {name:"LAX"})-[:ORIGIN|:DESTINATION*..5]-(destination:Airport)
// 提取路径中的所有Flight节点
WITH path, [node IN nodes(path) WHERE node:Flight] AS flightNodes
// 为每个Flight节点匹配对应的Ticket
UNWIND flightNodes AS flight
MATCH (flight)-[:ASSIGN]->(ticket:Ticket)
// 计算当前路径下所有Ticket的总价
WITH path, sum(ticket.price) AS totalPrice
// 筛选总价低于3000的路径
WHERE totalPrice < 3000
// 返回路径及对应总价
RETURN path, totalPrice

关键步骤解释

  1. 精准匹配路径:原查询的 [r*..5] 会匹配任意关系,这里我保留了长度限制,但明确了关系类型为 :ORIGIN 和 :DESTINATION,避免匹配到无关关系。如果想确保路径是单向出发(无回头路),可以加上关系方向约束:

    MATCH path = (origin:Airport {name:"LAX"})-[:ORIGIN]->(:Flight)-[:DESTINATION]->(:Airport)-[:ORIGIN*0..4]->(:Flight)-[:DESTINATION*0..4]->(destination:Airport)
    

    这样会强制路径遵循「机场→航班→机场→航班→...」的正向结构,避免循环或反向路径。

  2. 提取Flight节点:通过 nodes(path) 获取路径中的所有节点,再用 [node IN nodes(path) WHERE node:Flight] 过滤出所有航班节点——毕竟只有航班才关联Ticket。

  3. 关联Ticket并计算总价:用 UNWIND 拆分每个Flight节点单独处理,匹配对应的Ticket后,通过 sum(ticket.price) 计算整个路径的机票总价。

  4. 筛选符合预算的路径:最后通过 WHERE totalPrice < 3000 过滤出满足条件的路径,同时返回总价方便你查看验证。

额外优化建议

  • 如果一个Flight关联多个Ticket(比如不同舱位的价格),上面的查询会返回该路径的所有可能总价组合。若只需每个路径的最低总价,可修改为:
    MATCH path = (origin:Airport {name:"LAX"})-[:ORIGIN|:DESTINATION*..5]-(destination:Airport)
    WITH path, [node IN nodes(path) WHERE node:Flight] AS flightNodes
    UNWIND flightNodes AS flight
    MATCH (flight)-[:ASSIGN]->(ticket:Ticket)
    WITH path, min(ticket.price) AS flightMinPrice
    WITH path, sum(flightMinPrice) AS totalMinPrice
    WHERE totalMinPrice < 3000
    RETURN path, totalMinPrice
    
  • 若想避免路径中出现重复机场(比如循环路径),可添加简单路径约束:
    MATCH path = (origin:Airport {name:"LAX"})-[:ORIGIN|:DESTINATION*..5]-(destination:Airport)
    WHERE all(node IN nodes(path) WHERE single(n IN nodes(path) WHERE n = node))
    // 后续步骤同上
    

内容的提问来源于stack exchange,提问作者Adishone

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:18:09