Neo4j在匹配查询中多次应用关系

时间:2018-09-21 12:56:39

标签: database neo4j nosql cypher

我在数据库arrival_airportdeparture_airport中有两个节点,两个机场之间有1个关系。

因此,当我要选择2个目的地之间的所有航班时(BOJ-> SFX),请执行以下操作:

MATCH (da:Departure_Airport {airport:'BOJ'})-[f:FlightInfo]->(aa:Arrival_Airport {airport: 'SFX'})
RETURN  f, da, aa

问题是,我如何才能多次应用FlightInfo,以便同时获得所有有腿的航班? (例如:BOJ-> FRA-> SFX)

也许查询应该类似于此查询(带有星号):

MATCH (da:Departure_Airport {airport:'BOJ'})-[f:FlightInfo]*->(aa:Arrival_Airport {airport: 'SFX'})
RETURN  f, da, aa

更新-解决方案

因此,感谢您的所有回答和评论。我必须正确地建立机场之间的关系。因此,我对机场导入和自动创建关系(航班)的查询如下:

USING PERIODIC COMMIT 1000
LOAD CSV FROM "file:///airports.csv" AS line  FIELDTERMINATOR ";"
MERGE (departure_airport: Airport {name:line[0]})
MERGE (arrival_airport: Airport {name: line[1]})
MERGE (departure_airport)-[f:Flight {departure_time:line[2], arrival_time:line[3], carrier_code:line[4], service_class:line[5], overall_conti:line[6]}]-(arrival_airport)
ON CREATE SET  departure_airport.name=line[0],arrival_airport.name=line[1], f.departure_time=line[2], f.arrival_time=line[3], f.carrier_code=line[4]

因此,您可以匹配以下提示的航班

1 个答案:

答案 0 :(得分:0)

我当然不知道您的所有要求,但是我认为略微适应的图形模型对您更有效。如果机场类型(到达/离开)是通过与另一个机场或航班的进出关系指定的,而不是由节点分别为其自身指定的,则可能会更容易。因此,我建议按照以下方式更改您的图形模型:

CREATE
  (boj:Airport {name: 'BOJ'}),
  (sfx:Airport {name: 'SFX'}),
  (fra:Airport {name: 'FRA'})

CREATE
  (boj)-[:FLIGHT_INFO]->(sfx),
  (boj)-[:FLIGHT_INFO]->(fra),
  (fra)-[:FLIGHT_INFO]->(sfx);

在这种情况下,您所需的查询将是:

MATCH
  flightPaths = (departure:Airport {name: 'BOJ'})-[:FLIGHT_INFO*]->(arivial:Airport {name: 'SFX'})
RETURN DISTINCT
  flightPaths;