ORDER BY
is a sub-clause following RETURN
or WITH
, and it specifies that the output should be sorted and how.
Note that you can not sort on nodes or relationships, just on properties on these.
ORDER BY
relies on comparisons to sort the output, see the section called “Ordering and Comparison of Values”.
In terms of scope of variables, ORDER BY
follows special rules, depending on if the projecting RETURN
or WITH
clause is either aggregating or DISTINCT
.
If it is an aggregating or DISTINCT
projection, only the variables available in the projection are available.
If the projection does not alter the output cardinality (which aggregation and DISTINCT
do), variables available from before the projecting clause are also available.
When the projection clause shadows already existing variables, only the new variables are available.
Lastly, it is not allowed to use aggregating expressions in the ORDER BY
sub-clause if they are not also listed in the projecting clause.
This last rule is to make sure that ORDER BY
does not change the results, only the order of them.
Order nodes by property
ORDER BY
is used to sort the output.
Query
MATCH (n) RETURN n ORDER BY n.name
The nodes are returned, sorted by their name.
Result
n |
---|
3 rows |
|
|
|
Try this query live create (_0 {`age`:34, `length`:170, `name`:"A"}) create (_1 {`age`:34, `name`:"B"}) create (_2 {`age`:32, `length`:185, `name`:"C"}) create (_0)-[:`KNOWS`]->(_1) create (_1)-[:`KNOWS`]->(_2) ; match (n) return n order by n.name
Order nodes by multiple properties
You can order by multiple properties by stating each variable in the ORDER BY
clause. Cypher will sort the result by the first variable listed, and for equals values, go to the next property in the ORDER BY
clause, and so on.
Query
MATCH (n) RETURN n ORDER BY n.age, n.name
This returns the nodes, sorted first by their age, and then by their name.
Result
n |
---|
3 rows |
|
|
|
Try this query live create (_0 {`age`:34, `length`:170, `name`:"A"}) create (_1 {`age`:34, `name`:"B"}) create (_2 {`age`:32, `length`:185, `name`:"C"}) create (_0)-[:`KNOWS`]->(_1) create (_1)-[:`KNOWS`]->(_2) ; match (n) return n order by n.age, n.name
Order nodes in descending order
By adding DESC[ENDING]
after the variable to sort on, the sort will be done in reverse order.
Query
MATCH (n) RETURN n ORDER BY n.name DESC
The example returns the nodes, sorted by their name reversely.
Result
n |
---|
3 rows |
|
|
|
Try this query live create (_0 {`age`:34, `length`:170, `name`:"A"}) create (_1 {`age`:34, `name`:"B"}) create (_2 {`age`:32, `length`:185, `name`:"C"}) create (_0)-[:`KNOWS`]->(_1) create (_1)-[:`KNOWS`]->(_2) ; match (n) return n order by n.name DESC
Ordering NULL
When sorting the result set, NULL
will always come at the end of the result set for ascending sorting, and first when doing descending sort.
Query
MATCH (n) RETURN n.length, n ORDER BY n.length
The nodes are returned sorted by the length property, with a node without that property last.
Result
n.length | n |
---|---|
3 rows | |
|
|
|
|
|
|
Try this query live create (_0 {`age`:34, `length`:170, `name`:"A"}) create (_1 {`age`:34, `name`:"B"}) create (_2 {`age`:32, `length`:185, `name`:"C"}) create (_0)-[:`KNOWS`]->(_1) create (_1)-[:`KNOWS`]->(_2) ; match (n) return n.length, n order by n.length