10.5 Агрегация

  1. 10.5.1 Введение
  2. 10.5.2 COUNT
  3. 10.5.3 Статистика
  4. 10.5.4 COLLECT
  5. 10.5.5 DISTINCT

10.5.1 Введение

Для вычисления агрегированных данных Cypher предлагает агрегацию во многом похожую на GROUP BY в SQL.

Агрегатные функции принимают на входе множество значений и вычисляют по ним агрегатное значение. Примерами служат avg, которая вычисляет среднее множества числовых значений, или min, которая находит наименьшее числовое значение в наборе.

Агрегация может быть выполнена по всем сопоставимым подграфам, или же может быть выполнено дальнейшее разбиение по вводимым ключевым значениям. Это - неагрегатные выражения, которые используются для группировки значений на входе агрегатных функций.

Итак, если оператор возврата результата выглядит примерно так:

RETURN n, count(*)

Мы получим два выражения на выходе -  n и count(*). Первое – n – не является агрегатной функцией и, следовательно, оно будет служить ключом группировки. Последнее count(*) – является агрегатным выражением. Поэтому сопоставимые подграфы будут подразделяться на различные кусты, в зависимости от ключа группировки. Затем агрегатная функция будет выполняться на этих кустах, вычисляя агрегатные значения.

Если вы хотите использовать агрегаты для сортировки вашего результирующего набора, агрегация должна быть включена в RETURN, чтобы использоваться в ORDER BY.

Последний кусок головоломки – ключевое слово DISTINCT. Оно используется, чтобы сделать все значения уникальными, прежде чем пропустить их через агрегатную функцию.

Здесь полезным будет пример. В нём мы выполняем запрос на следующих данных:

Запрос

MATCH (me:Person)-->(friend:Person)-->(friend_of_friend:Person)
WHERE me.name = 'A'
RETURN count(DISTINCT friend_of_friend), count(friend_of_friend)

В этом примере мы пытаемся найти всех друзей наших друзей и пересчитать их. Первая агрегатная функция, count(DISTINCT friend_of_friend), учтёт friend_of_friend только раз — DISTINCT устранит дубликаты. Последняя агрегатная функция, count(friend_of_friend), сможет обнаружить того же friend_of_friend неоднократно. В этом случае, оба B и C знают D, в результате чего D будет учтен дважды при отсутствии DISTINCT.

Таблица 10.46 Результат

count(distinct friend_of_friend)count(friend_of_friend)
12

Предыдущая | Следующая