neo4j

时间:2016-02-17 15:37:58

标签: neo4j cypher

首先,对不起我的英语。我在neo4j中为铁路的数据库建模。我想使用停靠表来按照铁路链接的顺序链接车站。每个站点都有一个“停止序列”,遗憾的是它不像1,2,3(并不总是),而只是像1,3,4,6那样的渐进式。我写了这个查询,对于所描述的问题,它总是不起作用。

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”

1 个答案:

答案 0 :(得分: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);

它在我的Mac上的2.3.2中正常工作(但http://console.neo4j.org/处的neo4j版本在查询到达MERGE时无法正常工作。)