首页 > 解决方案 > 在 Neo4j 中查找价格低于 3000 的机场之间的所有路径

问题描述

我有一个图形数据库,其中机场通过航班使用关系:ORIGIN 和:DESTINATION 相互连接。每个航班都有一张通过关系 :ASSIGN 连接的票。价格保存在车票上。

现在我需要找到从机场 LAX 开始的所有路径,但价格低于 3000。我能够找到所有路径,但我不知道如何将票连接到它。

我查找路径的查询:

MATCH (origin:Airport { name:"LAX" }),(destination:Airport)
WITH origin,destination
MATCH path = (origin)-[r*..5]-(destination)
RETURN path

从该查询返回的一个路径:

[{"name":"LAX"},{},{"date":"11/29/2015 15:18:22","duration":269,"dista nce":2611,"airline":" 19977"},{"date":"11/29/2015 15:18:22","duration": 269,"distance":2611,"airline":"19977"},{},{"name" :"BOS"},{"name":"BOS" },{},{"date":"11/29/2015 01:20:17","duration":289,"distance":2704,"航空公司":"19977"},{"date":"11/29/2015 01:20:17","duration":289,"distance":2704,"airline":"19977"},{} ,{"name":"SFO"}]

如何分配票给它,并在哪里只有价格低于 3000 的那些?

标签: neo4jcypher

解决方案


使用此查询生成示例数据:

CREATE (origin:Airport { name:"LAX" })<-[:ORIGIN]-(f1:Flight {date:"11/29/2015 15:18:22",duration:269,distance:2611,airline:"19977"})-[:DESTINATION]->(d1:Airport {name:"BOS"})<-[:ORIGIN]-(f2:Flight {date:"11/29/2015 01:20:17",duration:289,distance :2704,airline:"19977"})-[:DESTINATION]->(d2:Airport {name:"SFO"}),
(t:Ticket {id: 1, price: 1234})-[:ASSIGN]->(f1),
(t1:Ticket {id: 2, price: 555})-[:ASSIGN]->(f2)

此查询应生成长度为 5 且每条边的价格小于 3000 的所有路径:

MATCH path = (origin:Airport { name:"LAX" })<-[r:ORIGIN|DESTINATION*..5]->(destination:Airport)
WHERE ALL(f IN [n IN NODES(path) WHERE 'Flight' IN LABELS(n)]
  WHERE [(f)<-[:ASSIGN]-(ticket) | ticket.price < 3000][0])
RETURN path

结果将包含 2 条路径。如果您将价格更改t1为 3000,则结果将仅包含 1 个路径(较短的路径)。

[更新]

如果您只想要总票价低于 3000 的路径,那么这将起作用:

MATCH path = (origin:Airport { name:"LAX" })<-[r:ORIGIN|DESTINATION*..5]->(destination:Airport)
WHERE REDUCE(s = 0, n IN [x IN NODES(path) WHERE 'Flight' IN LABELS(x)] |
  s + [(n)<-[:ASSIGN]-(ticket) | ticket.price][0]
  ) < 3000
RETURN path

推荐阅读