Как найти кратчайший путь в транспортном соединении с помощью запроса Cypher (neo4j) по данным GTFS? - PullRequest
0 голосов
/ 17 февраля 2020

Я новичок в neo4j, я создал график, следуя этим шагам , на основе модели данных из GTFS. Я хотел бы найти все кратчайшие косвенные маршруты на графике (с пересадками). Модель данных графовой базы данных содержит 4 объекта: Route, Trip, Stop, Stoptime. Вот скриншот db.scheme () .

На основании запроса , который написал Bruggen, я изменил его для своего использования:

MATCH 
(from:Stop {code:'VBR'})--(st_from:Stoptime),
(to:Stop {code:'VIR'})--(st_to:Stoptime),
p1=((st_from)-[:PRECEDES*]->(st_midway_arr:Stoptime)),
(st_midway_arr)--(midway:Stop),
(midway)--(st_midway_dep:Stoptime),
p2=((st_midway_dep)-[:PRECEDES*]->(st_to))
WHERE
st_from.departure_time > '00:00'
AND st_from.departure_time < '23:00'
AND st_midway_arr.arrival_time > st_from.departure_time
AND st_midway_dep.departure_time > st_midway_arr.arrival_time
AND st_to.arrival_time > st_midway_dep.departure_time
RETURN
from,st_from,to,st_to,p1,p2,midway
order by (st_to.arrival_time_int-st_from.departure_time_int) ASC
limit 1;

Этот запрос не использует кратчайший путь, и он занимает в среднем 30 с, чтобы найти путь, но результат запроса хороший .

Поэтому я попытался написать еще один запрос, с методом allshortestpaths, он действительно быстрый (0,3 с). Но он также возвращает мне поездки, которые выполняются в другом направлении (VIR -> VBR) ... еще одна проблема - это время соединения.

Не могли бы вы помочь мне, как получить доступ к узлу передачи (станции), когда я использую метод allshortestpath? Я хочу написать условие для синхронизации и stop_sequence, чтобы быть уверенным, что это правильно направление.

match (from:Stop {code:'VBR'}),(to:Stop {code:'VIR'})
with from,to
match p = allshortestpaths((from)-[*]-(to))
where NONE (x in relationships(p) where type(x)="OPERATES")
return p
limit 10;

1 Ответ

0 голосов
/ 17 февраля 2020
match (from:Stop {code:'VBR'}),(to:Stop {code:'VIR'})
with from,to
match p = allshortestpaths((from)-[*]->(to)) // here you needed you give the direction to make sure paths are from 'VBR' to 'VIR'
where NONE (x in relationships(p) where type(x)="OPERATES")
return p
limit 10;

Далее, если вы хотите увидеть узлы в пути, то вы можете использовать узлы (p)

match (from:Stop {code:'VBR'}),(to:Stop {code:'VIR'})
with from,to
match p = allshortestpaths((from)-[*]->(to)) 
where NONE (x in relationships(p) where type(x)="OPERATES")
AND ALL(node in nodes WHERE node = from OR node = to OR YOUR CONDTION ON TRANSFER NODE)
limit 10
...