在Neo4j找到价格低于3000的机场之间的所有路径

时间:2018-05-30 12:50:46

标签: neo4j cypher

我有一个图表数据库,其中机场通过航班使用关系相互连接: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”:“2015年11月29日15:18:22”,“持续时间”:269,“dista   nce“:2611,”airline“:”19977“},{”date“:”2015年11月29日15:18:22“,”持续时间“:   269, “距离”:2611, “航空公司”: “19977”},{},{ “名称”: “BOS”},{ “名称”: “BOS”   },{},{“date”:“2015年11月29日01:20:17”,“持续时间”:289,“距离”:2704,“空气   line“:”19977“},{”date“:”2015年11月29日01:20:17“,”持续时间“:289,”距离“   :2704, “航空公司”: “19977”},{},{ “名称”: “SFO”}]

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

1 个答案:

答案 0 :(得分:0)

使用此查询生成样本数据:

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个路径(较短的路径)。

[UPDATE]

如果您只想要总票价低于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