Cypher Вземете валидно пътуване

Да кажем, че имам графика, която съдържа пътувания като релации в neo4j, всяка релация има начален час и краен час и трябва да намеря валиден път от възел1 до възел2. Трябва да намеря този път, който се придържа към ограниченията на relationship1.arrivetime ‹ relationship2.departtime.

Има ли начин да включа тази функционалност в клауза 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