ORDER BY

Предложение ORDER BY следует за WITH. Оно определяет порядок сортировки выходных данных.

Введение

Обратите внимание: вершины и рёбра нельзя сортировать напрямую — сортировка должна выполняться по их свойствам. ORDER BY использует сравнение значений для упорядочения результатов. Подробнее см. Сортировка и сравнение значений.

Что касается области видимости переменных, ORDER BY следует особым правилам в зависимости от того, является ли предшествующий проекционный оператор (RETURN или WITH) агрегирующим или использует DISTINCT:

  • Если проекция агрегирующая или содержит DISTINCT, доступны только переменные, явно указанные в ней.
  • Если проекция сохраняет кардинальность (т.е. не является ни агрегирующей, ни DISTINCT), доступны также переменные, существовавшие до проекции.
  • Если проекция вводит переменную с тем же именем, что и уже существующая, видимой остаётся только новая переменная.

Наконец, агрегатные выражения, не перечисленные явно в проекционном предложении, не могут использоваться в ORDER BY. Это правило гарантирует, что ORDER BY влияет исключительно на порядок строк в результате — но не на его состав.

Примечание!
В YMatrix AGE ORDER BY не гарантирует глобально упорядоченные результаты. Следовательно, комбинация ORDER BY + LIMIT не гарантирует получение глобально первых N строк.
Чтобы обеспечить глобальную сортировку, поместите перед ORDER BY предложение WITH:

  • RETURN p ORDER BY p.age LIMIT 3: каждая сегментная единица сортирует локально и возвращает свои топ-3 строки; итоговый результат не гарантирует глобальные топ-3 строки.
  • WITH p ORDER BY p.age LIMIT 3 RETURN p: WITH инициирует перемещение данных (узел Motion), что позволяет выполнить глобальную сортировку до применения LIMIT.

Сортировка вершин по свойству

Используйте 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.

Результат

name age
"A" 34
"B" 34
"C" 32
(1 строка)

Сортировка вершин по нескольким свойствам

Перечислите несколько переменных в предложении ORDER BY, чтобы выполнить сортировку по нескольким свойствам. Cypher сначала сортирует по самой левой переменной; при равенстве значений переходит к следующей переменной в списке и т.д.

Запрос

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);

Возвращает вершины, отсортированные сначала по age, затем по name.

Результат

name age
"C" 32
"A" 34
"B" 34
(1 строка)

Сортировка вершин в обратном порядке

Добавьте DESC или DESCENDING после имени сортируемой переменной, чтобы изменить направление сортировки на убывающее.

Запрос

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 в убывающем порядке.

Результат

name age
"C" 32
"B" 34
"A" 34
(3 строки)

Порядок значений NULL

При сортировке результирующего набора:

  • В возрастающем порядке значения NULL всегда находятся в конце.
  • В убывающем порядке значения NULL всегда находятся в начале.

Запрос

SELECT *
FROM cypher('graph_name', $$
    MATCH (n)
    WITH n.name AS name, n.age AS age, n.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 <NULL>
(3 строки)