Найти все пути между аэропортами с ценой менее 3000 в Neo4j - PullRequest
0 голосов
/ 30 мая 2018

У меня есть графовая база данных, в которой аэропорты связаны между собой рейсами, используя отношения: 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": "29.11.2015 15:18:22", "duration": 269, "Dista NCE": 2611, "Airlines": "19977"}, {"дата ":" 29.11.2015 15:18:22 "," продолжительность ": 269," расстояние ": 2611," авиакомпания ":" 19977 "}, {}, {" name ":" BOS "},{"name": "BOS"}, {}, {"date": "29.11.2015 01:20:17", "duration": 289, "distance": 2704, "air line": "19977"}, {" дата ":" 29.11.2015 01:20:17 "," продолжительность ": 289," расстояние ": 2704," авиакомпания ":" 19977 "}, {}, {" имя ":"SFO"}]

Как назначить на него билет и сделать где взять только тех, у кого цена меньше 3000?

1 Ответ

0 голосов
/ 31 мая 2018

Использование этого запроса для получения образцов данных:

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