与聚合和多个order by子句匹配后创建关系

时间:2019-10-16 20:18:21

标签: neo4j cypher

关注This question

上的问题

我现在需要创建车站与附近(LOCATED_IN)之间的关系。第一个查询每个站仅成功返回一行(1个组合)。我要在其中创建关系的第二个查询创建了太多的关系。

v-combobox

查询2:

MATCH (n:Neighborhood),(s:Station)
WITH n, s, distance(n.centerLocation, s.point) AS dist
ORDER BY dist
RETURN s.stationId, COLLECT(n)[0].name AS name, COLLECT(dist)[0] AS shortest
ORDER BY s.stationId

查询3:

MATCH (n:Neighborhood),(s:Station)
WITH n, s, distance(n.centerLocation, s.point) AS dist
ORDER BY dist
CREATE (s)-[r:LOCATED_IN]->(nbh)
RETURN s.stationId, COLLECT(n)[0] AS nbh, COLLECT(dist)[0] AS shortest
ORDER BY s.stationId

查询2之后: 工作站(蓝色节点)连接到不代表邻居节点的多个节点。他们只有一个ID。 Query 2

查询3之后: 站点(蓝色节点)连接到多个邻域节点。每个站点只能是一个邻居。 Query 3

我应该如何编写查询以使每个站点有1个邻居?

1 个答案:

答案 0 :(得分:1)

查询2存在缺陷,因为CREATE使用的是未绑定的nbh变量。

对于查询3,您需要创建从每个测站到仅一个最近邻域的关系。例如:

MATCH (n:Neighborhood), (s:Station)
WITH n, s, distance(n.centerLocation, s.point) AS dist
ORDER BY dist
WITH s, COLLECT(dist)[0] AS shortest, COLLECT(n)[0] AS nbh
CREATE (s)-[:LOCATED_IN]->(nbh)
RETURN s.stationId, nbh, shortest
ORDER BY s.stationId