В поисках правильного пути в Cypher Neo4j - PullRequest
0 голосов
/ 17 июня 2020

Я работаю с базой данных Flight Analyzer (https://neo4j.com/graphgist/flight-analyzer). У нас есть несколько узлов и типов отношений. Узлы: Аэропорт

(SEA:Airport { name:'SEA' })

Рейс

(f0:Flight { date:'11/30/2015 04:24:12', duration:218, distance:1721, airline:'19977' })

Билет

(t1f0:Ticket { class:'economy', price:1344.75 })

Отношения Пункт назначения

(f0)-[:DESTINATION]->(ORD)

Пункт отправления

(f0)-[:ORIGIN]->(SEA)

Назначьте

(t1f0)-[:ASSIGN]->(f0)

Теперь мне нужно найти какой-то путь, и у меня проблема с этим соединением ORIGIN - FLIGHT - DESTINATION. Мне нужно найти все аэропорты, которые связаны с аэропортом LAX с суммой цен на билеты <3000. </p>

Я пробовал

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

, но в этом решении LAX также может быть ORIGIN и DESTINATION. Я хочу выбирать только пути, которые всегда имеют один и тот же порядок aiport1 <- origin - flight1 - destination -> airport2 <- origin - flight2 - destination -> aiport et al c ..

Мне нужно включить вылет и время прибытия, так что дата полета1 + продолжительность <дата полета2, затем дата полета2 + продолжительность <дата полета3 и т.д. c ... </p>

1 Ответ

0 голосов
/ 17 июня 2020

[ОБНОВЛЕНО]

Этот запрос должен проверять, что:

  • совпадающие пути имеют чередующиеся отношения ORIGIN/DESTINATION и
  • каждый вылетающий рейс приземляется не менее 30 минут до следующего вылетающего рейса (если есть), и
  • сумма цен на билеты узлов Flight (то есть всех остальных узлов, начиная со второго) <3000 </li>
MATCH p = (origin:Airport {name: 'LAX'})-[:ORIGIN|DESTINATION*..5]-(destination:Airport)
WHERE
  ALL(i IN RANGE(0, LENGTH(p)-1) WHERE
    TYPE(RELATIONSHIPS(p)[i]) = ['ORIGIN', 'DESTINATION'][i] AND
    (i%4 <> 1 OR (i + 2) > LENGTH(p) OR
      (apoc.date.parse(NODES(p)[i].date,'m','MM/dd/yyyy hh:mm:ss') + NODES(p)[i].duration + 30) < apoc.date.parse(NODES(p)[i+2].date,'m','MM/dd/yyyy hh:mm:ss'))
  ) AND
  REDUCE(s = 0, n IN [k IN RANGE(1, LENGTH(p), 2) | NODES(p)[k]] |
    s + [(n)<-[:ASSIGN]-(ticket) | ticket.price][0]
  ) < 3000
RETURN p

Запрос использует функцию apo c .date.parse для преобразования каждого date в количество минут эпохи, так что duration (предполагается, что также находится в минут).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...