【问题标题】:Why does a neo4j query return things out of order and how do I put things in order?为什么 neo4j 查询会乱序返回,我该如何整理?
【发布时间】:2025-12-24 01:10:12
【问题描述】:

我希望 Neo4J 查询为每个条目返回以相同顺序列出的数据(数据 1 排在第一位,数据 2 排在第二位,或者至少是一致的顺序。)我执行了一个查询以返回一堆相同类型的节点结果出来了:

节点1: 数据1,数据2

节点2: 数据1,数据2

节点3: 数据2,数据1

节点 4: 数据2,数据1

等等等等。为什么属性是随机顺序的?我该如何解决这个问题?

编辑:

我用它来创建节点:

USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM
'filepath' AS row
CREATE (:Node {Data1: row.Data1, Data2: row.Data2})

然后我使用了这个查询:

MATCH (n:Node) RETURN n LIMIT 25

它返回 18 行是正确的,但是某些节点以不同的顺序列出属性。

【问题讨论】:

  • 这很奇怪。你能发布你的查询。我可以在示例图上尝试类似的东西。
  • 添加了给出输出的查询。我以前见过这种情况,但一直不明白为什么会这样。

标签: database neo4j cypher graph-databases


【解决方案1】:

我可能错了,但是在查询中缺少 ORDER BY 子句,我听说过的任何查询语言(包括密码)都不能保证任何特定的顺序。

neo4j 中的节点是映射(属性名键);一般来说,除非您使用特定类型的地图,否则地图/哈希表不保证键的顺序。

我认为对于大多数数据查询语言来说,依赖隐式排序并不是一个好主意;例如,如果您只执行MATCH n RETURN nn 节点将以什么顺序返回?创建顺序?最后更新顺序?数字上的ID?我认为答案是“永远不要假设,使用ORDER BY”。

如果您需要顺序一致,请使用ORDER BY

你可以这样做:

MATCH n 
WITH id(n) as idn, keys(n) as kz unwind kz as items 
RETURN idn, items 
ORDER BY idn, items;

【讨论】:

  • 我想你误解了我的意思。我不是在谈论以特定顺序对节点进行排序,而是在谈论如何列出属性。基本上,A 节点具有属性 data1 和属性 data2。但是,在显示节点内容时,有时会将 data2 放在 data1 之前。
  • 我明白了——这确实是同一个问题。节点是其属性的映射。不保证按地图键排序。因此,不能保证节点的属性顺序。如果您想订购它们,请使用 ORDER BY。
  • @cluemein 您是否有理由期望这些属性具有特定的顺序?我假设您不是按顺序访问它们,而是通过键访问它们,不是吗?
  • 据我所知,ORDER BY 仅适用于根据属性值对节点进行排序,而不是根据属性名称对属性进行排序。
  • keys() 函数提取地图中的键。 unwind 函数将集合转换为单独的项目,因此将它们组合起来,ORDER BY 应该可以做到。请参阅答案中的更新。