9.5 With
- 9.5.1 Фильтрация по результатам агрегатных функций
- 9.5.2 Сортировка результатов до использования группировки
- 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" |