9.5 With

  1. 9.5.1 Фильтрация по результатам агрегатных функций
  2. 9.5.2 Сортировка результатов до использования группировки
  3. 9.5.3 Ограничение ветвления вашего пути поиска

С помощью WITH вы можете манипулировать результирующей последовательностью прежде чем она будет передана следующим частям запроса. Эти манипуляции могут относиться к форме и/или числу входов в результирующий набор.

Часто WITH используется для ограничения числа входов, которые затем передаются другим предложениям MATCH. Комбинируя ORDER BY и LIMIT, можно получить первые X входов по некоторым критериям, а затем ввести дополнительные данные из графа.

Другим примером использования является фильтрация по агрегатным значениям. WITH используется для ввода агрегатов, которые затем применяются в предикатах предложения WHERE. Эти агрегатные выражения создают новые привязки в результатах. WITH, так же, как и RETURN, может использовать алиасы выражений, которые вводятся в результаты с помощью алиасов в качестве имени привязки.

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


Рис. 9.5 Граф

9.5.1 Фильтрация по результатам агрегатных функций

Агрегированные результаты должны проходить через предложение WITH, чтобы по ним можно было выполнить фильтрацию.

Запрос

MATCH (david { name: "David" })--(otherPerson)-->()
WITH otherPerson, count(*) AS foaf
WHERE foaf > 1
RETURN otherPerson;

Лицо, связанное с Давидом (David), по крайней мере, более чем одной исходящей связью, будет возвращено запросом.

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

otherPerson
Node[2]{name:"Anders"}

9.5.2 Сортировка результатов до использования группировки

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

Запрос

MATCH (n)
WITH n
ORDER BY n.name DESC LIMIT 3
RETURN collect(n.name)

возвращает коллекцию из списка имён людей в обратном порядке (список ограничен тремя элементами).

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

collect(n.name)
["Emil","David","Ceasar"]

9.5.3 Ограничение ветвления вашего пути поиска

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

Запрос

MATCH (n { name: "Anders" })--(m)
WITH m
ORDER BY m.name DESC LIMIT 1
MATCH (m)--(o)
RETURN o.name

Начиная с Андерса (Anders), находим все сопоставленные ему узлы, сортируем по убыванию и берем первый результат; затем находим все узлы, связанные с этим первым результатом, и возвращаем их имена.

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

o.name
"Anders"
"Bossman"

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