Neo4j:按集合中的值排序输出
Neo4j: ordering output by values in a collection
我正在处理来自 csv 文件的数据,该文件包含四列数据:stationID
、stationName
、stationLong
、stationLat
,其中 stationID
是站的唯一编号,stationName
是站名,stationLong
是站所在的经度,stationLat
是站所在的纬度。
示例数据如下:
第 1 行 1, "Cranbourne", 22.6932, 100.5347
第 2 行 2, "Dandenong", 25.6589, 98.5679
第 3 行 3, "Flinders Street", 33.1674, 66.3287
此数据已加载到 Neo4J 中并标记为 Station
。
我有一个 运行 查询来获取从每个站点到所有其他站点的距离。例如,“Cranbourne”到“Dandenong”、“Cranbourne”到“Flinders Street”等站的距离。
MATCH (s1: Station), (s2: Station)
WHERE s1 <> s2
RETURN s1.stationName AS `Station`, collect([s2.stationName, round(distance(
point({longitude: s1.stationLong, latitude: s1.stationLat}),
point({longitude: s2.stationLong, latitude: s2.stationLat})))]) AS `Distance to all other stations`
输出:
第一行:"Cranbourne", [["Dandenong", 15], ["Flinders Street", 45], ["Springvale", 25], ["Yarraman", 19]]
就结果而言,此输出是我想要的,但是有没有办法确保输出按距车站的距离递增排序?
期望的输出:
第一行:"Cranbourne", [["Dandenong", 15], ["Yarraman", 19], ["Springvale", 25], ["Flinders Street", 45]]
你有两个选择:
- 在执行 COLLECT 之前获取您单独排序的值。
- 使用apoc.coll.sort或apoc.coll.sort地图在收集后进行排序
您可以在 COLLECT
之前对数据进行排序:
MATCH (s1: Station), (s2: Station)
WHERE s1 <> s2
WITH
s1.stationName AS Station, s2.stationName AS sn2,
round(distance(
point({longitude: s1.stationLong, latitude: s1.stationLat}),
point({longitude: s2.stationLong, latitude: s2.stationLat}))) AS dist
ORDER BY dist
RETURN Station, COLLECT([sn2, dist]) AS `Distance to all other stations`
我正在处理来自 csv 文件的数据,该文件包含四列数据:stationID
、stationName
、stationLong
、stationLat
,其中 stationID
是站的唯一编号,stationName
是站名,stationLong
是站所在的经度,stationLat
是站所在的纬度。
示例数据如下:
第 1 行 1, "Cranbourne", 22.6932, 100.5347
第 2 行 2, "Dandenong", 25.6589, 98.5679
第 3 行 3, "Flinders Street", 33.1674, 66.3287
此数据已加载到 Neo4J 中并标记为 Station
。
我有一个 运行 查询来获取从每个站点到所有其他站点的距离。例如,“Cranbourne”到“Dandenong”、“Cranbourne”到“Flinders Street”等站的距离。
MATCH (s1: Station), (s2: Station)
WHERE s1 <> s2
RETURN s1.stationName AS `Station`, collect([s2.stationName, round(distance(
point({longitude: s1.stationLong, latitude: s1.stationLat}),
point({longitude: s2.stationLong, latitude: s2.stationLat})))]) AS `Distance to all other stations`
输出:
第一行:"Cranbourne", [["Dandenong", 15], ["Flinders Street", 45], ["Springvale", 25], ["Yarraman", 19]]
就结果而言,此输出是我想要的,但是有没有办法确保输出按距车站的距离递增排序?
期望的输出:
第一行:"Cranbourne", [["Dandenong", 15], ["Yarraman", 19], ["Springvale", 25], ["Flinders Street", 45]]
你有两个选择:
- 在执行 COLLECT 之前获取您单独排序的值。
- 使用apoc.coll.sort或apoc.coll.sort地图在收集后进行排序
您可以在 COLLECT
之前对数据进行排序:
MATCH (s1: Station), (s2: Station)
WHERE s1 <> s2
WITH
s1.stationName AS Station, s2.stationName AS sn2,
round(distance(
point({longitude: s1.stationLong, latitude: s1.stationLat}),
point({longitude: s2.stationLong, latitude: s2.stationLat}))) AS dist
ORDER BY dist
RETURN Station, COLLECT([sn2, dist]) AS `Distance to all other stations`