Как разбить путь на подпути по типу отношений? - PullRequest
1 голос
/ 29 апреля 2019

У меня есть следующий график:

(:Stop)<-[:IS_LOCATED_AT]-(:Stoptime)-[:IS_PART_OF]->(:Trip),
(:Stop)<-[:IS_LOCATED_AT]-(:Stoptime)-[:IS_PART_OF]->(:Trip)
(:Stop)-[:TRANSFER]->(:Stop)
(st1:Stoptime)-[:CONNECTION]->(st2:Stoptime)

:Stop имеет свойство stop_id.

:Trip имеет свойства startValidDate, endValidDate, tripExceptions.Поездка действительна только в определенные дни недели.Эти дни представлены как свойства, например: monday: true, sunday: false.Каждая поездка имеет два времени остановки (отправление и прибытие).

:Stoptime может иметь следующие свойства: если время остановки является событием отправления (например, st1), :Stoptime имеет свойство depatureTine, вВ другом случае время операции st :Stoptime имеет свойство arrivalTime.

Каждый :Stoptime имеет st_id.

[:CONNECTION] и [:TRANSFER] имеют свойство duration.

В следующем запросе я пытаюсь найти пути между двумя :Stop:

MATCH (o:Stop)<-[:IS_LOCATED_AT]-(sto:Stoptime)-[:IS_PART_OF]->(tro:Trip)
WHERE o.stop_id=1000001
AND tro.startValidDate<"2019-04-25"
AND tro.endValidDate>"2019-04-25"
AND NOT "2019-04-25" IN tro.tripExceptions
AND tro.thursday=true
WITH sto, o
MATCH (d:Stop)<-[:IS_LOCATED_AT]-(std:Stoptime)-[:IS_PART_OF]->(trd:Trip)
WHERE d.stop_id=1000004
AND trd.startValidDate<"2019-04-25"
AND trd.endValidDate>"2019-04-25"
WITH sto, std, o
MATCH p=((sto)-[*]-(std))
WHERE NOT o IN nodes(p)
AND NONE (y in relationships(p) WHERE type(y)="IS_PART_OF")
RETURN p

И этот запрос работает хорошо.Но я должен проверить в случае, когда путь включает отношения [:TRANSFER], действительна ли следующая Поездка для дня прибытия.

Например, у меня есть путь после запроса:

path=((sta1:Stoptime)-[c:CONNECTION]->(sta2:Stoptime)-[:IS_LOCATED_AT]->(s1:Stop)-[t:TRANSFER]->(s2:Stop)<-[:IS_LOCATED_AT]-(std3:Stoptime)-[:CONNECTION]->(sta2:Stoptime))

с:

(sta1:Stoptime)-[:IS_PART_OF]->(a:Trip)
(sta2:Stoptime)-[:IS_PART_OF]->(a:Trip)
(stb1:Stoptime)-[:IS_PART_OF]->(b:Trip)
(stb2:Stoptime)-[:IS_PART_OF]->(b:Trip)

Маршрут начинается в четверг.Я должен проверить:

if (x in relationships(path) WHERE type(z)="TRANSFER"):
    if (the sum of duration of all connections between previous stoptimes + duration of transfer > 24) AND (b.friday=true): return path
    else if (b.thursday=true): return path
else return null

Я не знаю, как я могу написать это в Cypher.Или будет лучше пройти все пути на бизнес-уровне и проверить это условие?Я подумала, может, будет лучше разделить путь на подпути между передачами?

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