У меня есть следующий график:
(: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.Или будет лучше пройти все пути на бизнес-уровне и проверить это условие?Я подумала, может, будет лучше разделить путь на подпути между передачами?