Neo4j применяет отношения несколько раз в запросе на совпадение - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть два узла в базе данных, arrival_airport и departure_airport, и у меня есть 1 связь между обоими аэропортами.

Итак, когда я хочу выбрать все рейсы между двумя пунктами назначения (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 голосов
/ 21 сентября 2018

Конечно, я не знаю всех ваших требований, но я предполагаю, что слегка адаптированная графическая модель работает лучше для вас.Это может быть проще, если тип аэропорта (прибытие / отправление) определяется входящими или исходящими отношениями с другим аэропортом или рейсом, а не узлом, соответствующим образом обозначенным самой меткой.Поэтому я хотел бы предложить изменить модель вашего графа следующим образом:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...