2015-01-07 2 views
2

Я довольно новичок в Neo4j, и я пытаюсь создать небольшой пример приложения: планировщик общественного транспорта. Он выглядит следующим образом (очевидно, сильно упрощенный пример):Свойства отношений доступа в кратчайшем пути в neo4j

simplified example

Отход и время прибытия каждого автобуса (поездки) хранится как свойство отношений. Я хочу, чтобы автобус уходил рядом (или после) в указанное время, прибывая как можно скорее после вылета (т. Е. Не обязательно самый короткий, но самый быстрый маршрут).

Я много экспериментировал в Cypher, но я не смог этого сделать. Любой совет?

EDIT: обновленная схема

updated simplified example

ответ

2

Чтобы включить простой Cypher запрос, вы можете изменить модель графика на что-то вроде:

(:Trip)-[:LEG {start: 10, end: 20}]->(:Stop)-[:LEG {start: 30, end: 40}]->(:Stop) ... 
             |         | 
             [:AT]        [:AT] 
             |         | 
             v         v 
           (Location {name: "Paris"})   (Location {name: "London"}) 

Чтобы подвести итоги, каждая поездка состоит из цепи из N ножек и N остановок. Каждая остановка относится к местоположению, и каждый ног сохраняет время начала и окончания.

С приведенной выше моделью возвращается следующий запрос: (a) путь быстрого отключения, начинающийся с или после времени 40, и (b) продолжительность этой поездки.

MATCH p=(t:Trip)-[legs:LEG*1..]->(s:Stop)-[:AT]->(loc:Location) 
WHERE HEAD(legs).start >= 40 AND NOT (s)-[:LEG]->() 
WITH p, LAST(legs).end - HEAD(legs).start AS duration 
RETURN p, duration ORDER BY duration LIMIT 1; 

Here is a console, который показывает образцы результатов.

+0

Я экспериментировал с вашим и моим собственным решением, и я заставил их обоих работать («LAST()» и «HEAD()», где это важно). Тем не менее, у меня теперь есть проблема (в обоих решениях), что если я добавлю больше строк, она будет иногда начинаться с остановки a в момент времени t, переходить к некоторой остановке и брать первую шину там со временем Ben

+0

@Ben Я думаю, что вы не используете мою модель правильно. Невозможно покинуть Стоп, прежде чем вы придете, потому что все остановки в цепочке находятся в строгом хронологическом порядке. Возможно, вы повторно используете экземпляр Stop, если вы пересматриваете одно и то же местоположение - это не разрешено в моей модели (вам нужно создать новый Stop, даже если вы перейдете в Location). Означает ли это проблему? Если нет, укажите набор данных (например, в консоли), которые показывают проблему. – cybersam

+0

Я согласен, что остановка в цепочке важна. У вас две модели. Поездка (связанный список остановок) и расписание (время прибытия и отправления, которое также может быть смоделировано как дельта на первой остановке и в промежутках времени и в определенные будни (рабочий день, выходные, праздничные дни) и часовые интервалы (час пик, утро , ночь, полдень)) –

Смежные вопросы