2016-02-17 4 views
1

Во-первых, извините за мой английский. Я моделирую DB железной дороги в neo4j. Я хочу связать станцию ​​в том порядке, который связан железной дорогой, используя столы столов. Каждой остановке принадлежит «стоп-последовательность», которая, к сожалению, не похожа на 1,2,3 (не всегда), но только прогрессивно, как 1,3,4,6. Я написал этот запрос, который для описанной проблемы не работает всегда.Агрегативный запрос в neo4j

MATCH (a:Station)-[:stop]->(c:Stops_times)-[:trip]->(z:Trips)<-[:trip]-(d:Stops_times)<-[:stop]-(b:Station) WHERE toint(c.stop_sequence)=toint(d.stop_sequence)+1 CREATE (a)-[s:next]->(b) 

Чтобы найти правильный «следующий» мне нужен запрос, похожий на этот:

MATCH (a:Station)-[:stop]->(c:Stops_times)-[:trip]->(z:Trips)<-[:trip]-(d:Stops_times)<-[:stop]-(b:Station) WITH c as c, d as d, MIN(d.stop_sequence) as min_ WHERE min_>c.stop_sequence CREATE UNIQUE (a)-[s:next]->(b) 

поэтому для каждой остановке, я должен нашел минимальный «stop_sequence» между высшим, чем «stop_sequence» остановки, где я хочу найти следующий

ответ

0

Следующий запрос, кажется, делает то, что вы хотите. Он упорядочивает все остановки на stop_sequence, объединяет все остановки (все еще в порядке) для каждой поездки, соединяет все соседние остановки для каждой поездки, UNWIND с парами, так что MERGE может использовать сопряженные узлы, а затем использует MERGE, чтобы гарантировать, что существует связь :next между всеми парами узлов.

MATCH (a:Station)-[:stop]->(c:Stops_times)-[:trip]->(t:Trips) 
WITH a, c, t 
ORDER BY c.stop_sequence 
WITH t, COLLECT(a) AS s 
WITH REDUCE(x =[], i IN RANGE(1, SIZE(s)-1)| x + {a: s[i-1], b: s[i]}) AS pairs 
UNWIND pairs AS p 
WITH p.a AS a, p.b AS b 
MERGE (a)-[n:next]->(b); 

Он работает должным образом в 2.3.2 на моем Mac (но версии Neo4j доступны на http://console.neo4j.org/ не работают правильно, когда запрос попадает в MERGE).

+0

Спасибо, ваш запрос именно то, что мне нужно! Теперь у меня есть некоторые проблемы с резервированием (связанные станции, у которых также есть промежуточные станции), но я думаю, что я могу справиться. Вы были очень добры. –

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