2016-10-13 2 views
0

Я пытаюсь разработать систему маршрутизации на основе данных в базе данных Neo4j 3.0.4. График содержит несколько остановок. Некоторые из этих остановок запланированы как автобусные остановки, остановки поездов, но не все из них. Следовательно, они связаны с узлом расписания. Каждый узел расписания подключен к предложению.Cypher Query: получить связанные узлы кратчайшего пути

Подграф выглядит следующим образом:

Example_Graph

Мой вопрос: Как я могу создать запрос, который возвращает этот подграф? До сих пор я писал этот запрос в шифре:

MATCH (from:Stop{poiId:'A'}), (to:Stop{poiId:'Z'}) , 
path = allShortestPaths((from)-[r*]->(to)) 
RETURN path 

Это приводит все кратчайшие пути от остановки А до остановки Z. Между А и Z является более остановками, которые включены в возвращенном пути. Я хочу получить для всех остановок соответствующие графики и для этих расписаний соответствующие предложения.

Кроме того, было бы здорово, если бы можно было использовать ограничения, основанные на узле расписания, e. г. allShortestPath от А до Я, где фильтр (время в расписании.monday WHERE x> 1100).

Если это невозможно, возможно ли создать новый запрос с этим ограничением на основе предыдущего запроса?

EDIT1: Дополнительная информация: В расписании - время вылета для каждой остановки. Я хочу рассчитать на основе желаемого времени отправления (в качестве желаемого времени прибытия) полного времени поездки и получить 5 лучших соединений (меньше времени). . Я хочу начать с 7:00: отношение переключателя имеет время в 2 раза, поэтому проверьте расписание 1, если есть отъезд после 7:02. если да, возьмите первый вылет после 7:02. Соотношение connected_by имеет стоимость 12 минут. последнее отношение switch_to не требует затрат времени. Поэтому я приеду в 07:14. Примечание. Если мне нужно переключить служебную линию во время путешествия, я должен снова проверить расписание. Если расписание не соответствует желаемым временным окнам, исключите его из результата. Я хочу получить 5 лучших путей (в зависимости от времени поездки или времени прибытия), количество прыжков не важно. Если есть связь с e. г. 6 остановок, но с меньшим временем поездки (или более ранним временем прибытия), которые предпочитают этот. Я знаю, что это сложная и большая проблема, но я понятия не имею, как начать ... Если есть способ сделать это через REST (или, если не на Java), я был бы рад за каждый намек!

+0

Результат будет в строках и столбцах, хотя возвращаемые значения могут быть списками связанных результатов.Это поможет получить представление о том, что вы ищете в формате возвращаемых данных. Например, вы предпочли бы иметь одну строку результата для каждого пути, со списками карт, состоящими из каждой остановки и связанного с ней графика и предложения? Или вам нужна строка за стоп/расписание/предложение? Или что-то другое? – InverseFalcon

+0

Я буду использовать этот cypher через rest api, поэтому я получу объекты JSON, но идея состоит в том, чтобы увидеть строку для каждого отдельного пути со всеми остановками и отношениями между ними. «Стоп-столбец» может содержать дополнительную информацию: {stop1 {attributes}}, {switch_to {attributes}}, {stop2 {attributes}, schedule {attributes}, offer {attributes}} ... – Stefan

ответ

1

Вы можете использовать конструкцию UNWIND в Cypher, чтобы получить узлы пути и использовать OPTIONAL MATCH, чтобы найти графики &.

Я создал образец набора данных:

CREATE 
    (offer: Offer), 
    (sch1: Schedule), 
    (sch2: Schedule), 
    (stop1: Stop {name: "stop1"}), 
    (stop2: Stop {name: "stop2"}), 
    (stop3: Stop {name: "stop3"}), 
    (stop4: Stop {name: "stop4"}), 
    (stop1)-[:SWITCH_TO]->(stop2), 
    (stop2)-[:CONNECTED_BY]->(stop3), 
    (stop3)-[:SWITCH_TO]->(stop4), 
    (stop2)-[:SCHEDULED_BY]->(sch1), 
    (stop3)-[:SCHEDULED_BY]->(sch2), 
    (sch1)-[:OFFERED_BY]->(offer), 
    (sch2)-[:OFFERED_BY]->(offer) 

Чтобы получить подграф, вы можете оформить этот запрос:

MATCH 
    (from:Stop {name:'stop1'}), (to:Stop {name:'stop4'}), 
    path = allShortestPaths((from)-[r*]->(to)) 
UNWIND nodes(path) AS stopNode 
OPTIONAL MATCH (stopNode)-[sb:SCHEDULED_BY]->(schedule:Schedule)-[ob:OFFERED_BY]-(offer:Offer) 
RETURN stopNode, sb, ob, schedule, offer 

Используя этот подход, края в r отбрасываются, так что это не верните весь подграф. Визуализация на веб-интерфейс Neo4j добавляет эти края, так что результат выглядит следующим образом:

enter image description here

В любом случае, я надеюсь, что пост содержит полезную информацию - дайте мне знать, как это работает для вас.

+0

Отлично, спасибо так много! Он работает точно так, как ожидалось! Возможно, у вас есть идея для моего EDIT 1 тоже! :) – Stefan

+0

Добро пожаловать. Что касается вашего редактирования, вам нужно рассчитать кратчайший путь с взвешенными краями, который поддерживается API REST, см. Http://stackoverflow.com/questions/27346686/implementing-dijkstras-algorithm-in-neo4j –

+0

Спасибо за ваш ответ. Да, я знаю алгоритм shortestPath, но я хочу получить «все». Фактический вопрос заключается в следующем: просто предположим, что я хочу ехать в 7:00 из точки A в точку Z. Поэтому мне нужно взять линию обслуживания 1 автобуса, этот переключатель и взять служебную линию 2. Поэтому я начинаю с 700 , проверьте расписание: Линия обслуживания уходит в 705, поэтому я должен ждать 5 минут (это время ожидания зависит от текущего времени!). – Stefan

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