Cypher Получить действующую поездку

Допустим, у меня есть граф, который содержит поездки как отношения в neo4j, каждое отношение имеет время начала и время окончания, и мне нужно найти допустимый путь от узла 1 к узлу 2. Мне нужно найти этот путь, который придерживается ограничений отношения1.время прибытия ‹ отношения2.отправления.

Есть ли способ включить эту функциональность в предложение MATCH, или мне придется фильтровать существующие пути, которые я нахожу, с помощью предложения WHERE?


person jab    schedule 05.10.2012    source источник


Ответы (2)


Как сказал Питер, для проверки свойств вам нужно использовать предложение where. Шаблоны сопоставления предназначены для сопоставления шаблонов без проверки свойств. Однако вы можете использовать индексы, чтобы найти узлы, которые, например, начинаются с определенного диапазона времени.

Я построил пример для вас:

create 
(_1 {city:"DC"}), 
(_2 {city:"NY"}), 
(_3 {city:"SF"}),
(_4 {city:"LA"}), 
_1-[:flight {leave:1349431200, arrive:1349445600}]->_2,
_1-[:flight {leave:1349427600, arrive:1349442000}]->_2,
_1-[:flight {leave:1349424000, arrive:1349438400}]->_2,
_1-[:flight {leave:1349420400, arrive:1349434800}]->_2,
_1-[:flight {leave:1349416800, arrive:1349431200}]->_2,
_1-[:flight {leave:1349409600, arrive:1349424000}]->_2,
_2-[:flight {leave:1349431200, arrive:1349445600}]->_3,
_2-[:flight {leave:1349427600, arrive:1349442000}]->_3,
_2-[:flight {leave:1349424000, arrive:1349438400}]->_3,
_3-[:flight {leave:1349431200, arrive:1349445600}]->_4,
_3-[:flight {leave:1349427600, arrive:1349442000}]->_4,
_3-[:flight {leave:1349424000, arrive:1349438400}]->_4,
_3-[:flight {leave:1349438400, arrive:1349445600}]->_4,
_3-[:flight {leave:1349442000, arrive:1349449200}]->_4,
_3-[:flight {leave:1349445600, arrive:1349452800}]->_4;

Ради интереса вот запрос, который показывает все рейсы, соответствующие пунктам назначения (до фильтрации): http://console.neo4j.org/r/6ropic Чтобы поездка считалась действительной, везде должна быть отрицательная разница во времени.

Вот запрос с фильтрацией предложения where:

start dc=node(1), la=node(4)  
match trip=dc-[dcny]->ny-[nysf]->sf-[sfla]->la  
where dcny.arrive < nysf.leave and nysf.arrive < sfla.leave  
return dcny.arrive - nysf.leave, nysf.arrive - sfla.leave, dcny.arrive, nysf.leave, nysf.arrive, sfla.leave;
+-----------------------------------------------------------------------------------------------------------+
| dcny.arrive - nysf.leave | nysf.arrive - sfla.leave | dcny.arrive | nysf.leave | nysf.arrive | sfla.leave |
+-----------------------------------------------------------------------------------------------------------+
| -3600.0                  | -3600.0                  | 1349424000  | 1349427600 | 1349442000  | 1349445600 |
+-----------------------------------------------------------------------------------------------------------+
1 row
0 ms

http://console.neo4j.org/r/79qr9s

Это немного сложнее, если вы хотите попытаться сделать это с путями переменной длины, но для этого варианта использования, вероятно, не конец света, чтобы указать максимум несколько остановок.

Обновление:

Думал об этом еще немного - вы также можете выбрать группу отношений в своем предложении start на основе индекса времени прибытия и ухода. Сильно ограничит ваши поиски.

person Eve Freeman    schedule 06.10.2012

Вы используете предложение where для фильтрации свойств отношений. Если вам нужен детальный контроль над обходом, вы также можете использовать Traverser Java API, см. http://docs.neo4j.org/chunked/snapshot/tutorials-java-embedded-traversal.html

person Peter Neubauer    schedule 05.10.2012