ORDER BY(排序)

ORDER BY 是跟在 WITH 之后的子句。ORDER BY 指定输出应该排序以及如何排序。

简介

注意,你不能对节点或关系进行排序,排序必须在属性上进行。ORDER BY 依赖比较来对输出进行排序。参见值的排序和比较。

在变量作用域方面,ORDER BY 遵循特殊规则,取决于投影的 RETURN 或 WITH 子句是聚合还是 DISTINCT。如果是聚合或 DISTINCT 投影,则只有投影中可用的变量可用。如果投影不改变输出基数(聚合和 DISTINCT 会改变),则投影子句之前可用的变量也可用。当投影子句遮蔽已存在的变量时,只有新变量可用。

最后,如果聚合表达式未在投影子句中列出,则不允许在 ORDER BY 子句中使用。此规则确保 ORDER BY 不会更改结果,只更改结果的顺序。

注意!
在YMatrix AGE中,order by 不保证全局有序。因此 order by + limit 不保证取全局有序的前三个。 如果需要保证全局有序,需要在 ORDER BY 之前使用 WITH 语句。

  • RETURN p ORDER BY p.age LIMIT 3, 每个 segment 各自排序取前 3,最终结果不一定是全局的前 3。
  • WITH p ORDER BY p.age LIMIT 3 RETURN p, WITH 会触发数据汇聚(Motion 节点),在汇聚后做全局排序再取前 3。

按属性排序节点

ORDER BY 用于对输出进行排序。

查询

SELECT *
FROM cypher('graph_name', $$
    MATCH (n)
    WITH n.name as name, n.age as age
    ORDER BY n.name
    RETURN name, age
$$) as (name agtype, age agtype);

节点按名称排序返回。

结果

name age
"A" 34
"B" 34
"C" 32
(1 row)

按多个属性排序节点

你可以通过在 ORDER BY 子句中列出每个变量来按多个属性排序。Cypher 将按列出的第一个变量排序,对于相等的值,转到 ORDER BY 子句中的下一个属性,依此类推。

查询

SELECT *
FROM cypher('graph_name', $$
    MATCH (n)
    WITH n.name as name, n.age as age
    ORDER BY n.age, n.name
    RETURN name, age
$$) as (name agtype, age agtype);

返回节点,先按年龄排序,然后按名称排序。

结果

name age
"C" 32
"A" 34
"B" 34
(1 row)

按降序排序节点

在排序变量后添加 DESC[ENDING],排序将以逆序进行。

查询

SELECT *
FROM cypher('graph_name', $$
    MATCH (n)
    WITH n.name AS name, n.age AS age
    ORDER BY n.name DESC
    RETURN name, age
$$) as (name agtype, age agtype);

该示例返回按名称逆序排列的节点。

结果

name age
"C" 32
"B" 34
"A" 34
(3 rows)

Null 值排序

排序结果集时,升序排序中 null 始终排在结果集末尾,降序排序中排在最前面。

查询

SELECT *
FROM cypher('graph_name', $$
    MATCH (n)
    WITH n.name AS name, n.age AS age, n.height AS height
    ORDER BY n.height
    RETURN name, age, height
$$) as (name agtype, age agtype, height agtype);

节点按 height 属性排序返回,没有该属性的节点排在最后。

结果

name age
"A" 34 170
"C" 32 185
"B" 34
(3 rows)