Начало работы
Подключение
Тесты производительности
Развёртывание
Использование данных
Загрузка данных
Миграция данных
Запрос данных
Управление кластерами
Обновление
Глобальное обслуживание
Масштабирование
Мониторинг
Безопасность
Лучшие практики
Технические принципы
Типы данных
Хранилище
Исполняющий движок
Потоковая обработка (Domino)
MARS3 Индексы
Расширения
Расширенные функции
Расширенный запрос
Федеративные запросы
Grafana
Резервное копирование и восстановление
Аварийное восстановление
Графовая база данных
Введение
Предложения
Функции
Расширенные темы
Руководство
Настройка производительности
Устранение неполадок
Инструменты
Параметры конфигурации
SQL-команда
Часто задаваемые вопросы
Предложение UNWIND в Cypher преобразует список в последовательность отдельных строк. Каждый элемент входного списка становится отдельной строкой, а указанная переменная связывается с этим элементом. Если выражение вычисляется в NULL, UNWIND создаёт одну строку, в которой переменная равна NULL. Если выражение вычисляется в пустой список, UNWIND не создаёт ни одной строки. Такое поведение одинаково во всех реализациях AGE.
UNWIND особенно полезен при обработке свойств вершин или рёбер, содержащих списки, а также при итерации по коллекции значений внутри запроса.
Все приведённые ниже примеры используют следующий набор тестовых данных:
SELECT * FROM cypher('cypher_unwind', $$
CREATE (n {name: 'node1', a: [1, 2, 3]}),
(m {name: 'node2', a: [4, 5, 6]}),
(o {name: 'node3', a: [7, 8, 9]}),
(n)-[:KNOWS]->(m),
(m)-[:KNOWS]->(o)
$$) AS (i agtype);
Этот пример демонстрирует простейшее применение UNWIND: расширение литерального списка целых чисел в отдельные строки.
SELECT * FROM cypher('cypher_unwind', $$
UNWIND [1, 2, 3] AS i
RETURN i
$$) AS (i agtype);
i
---
1
2
3
(3 строки)
В этом примере показано, как использовать UNWIND для обработки свойства вершины, содержащего список, на основе подготовленных данных.
SELECT * FROM cypher('cypher_unwind', $$
MATCH (n)
WITH n.a AS a
UNWIND a AS i
RETURN *
$$) AS (i agtype, j agtype);
i | j
-----------+---
[1, 2, 3] | 1
[1, 2, 3] | 2
[1, 2, 3] | 3
[4, 5, 6] | 4
[4, 5, 6] | 5
[4, 5, 6] | 6
[7, 8, 9] | 7
[7, 8, 9] | 8
[7, 8, 9] | 9
(9 строк)
UNWIND может быть вложен для «расплющивания» глубоко вложенных списков.
SELECT * FROM cypher('cypher_unwind', $$
WITH [[1, 2], [3, 4], 5] AS nested
UNWIND nested AS x
UNWIND x AS y
RETURN y
$$) AS (i agtype);
i
---
1
2
3
4
5
(5 строк)
nodes()UNWIND можно использовать совместно с функциями путей, например nodes(), чтобы обрабатывать отдельные вершины в пути.
SELECT * FROM cypher('cypher_unwind', $$
MATCH p=(n)-[:KNOWS]->(m)
UNWIND nodes(p) AS node
RETURN node
$$) AS (i agtype);
i
-----------------------------------------------------------------------------------------------
{"id": 281474976710657, "label": "", "properties": {"a": [1, 2, 3], "name": "node1"}}::vertex
{"id": 281474976710658, "label": "", "properties": {"a": [4, 5, 6], "name": "node2"}}::vertex
{"id": 281474976710658, "label": "", "properties": {"a": [4, 5, 6], "name": "node2"}}::vertex
{"id": 281474976710659, "label": "", "properties": {"a": [7, 8, 9], "name": "node3"}}::vertex
(4 строки)
relationships()Аналогично, UNWIND можно использовать с relationships() для обработки отдельных рёбер в пути.
SELECT * FROM cypher('cypher_unwind', $$
MATCH p=(n)-[:KNOWS]->(m)
UNWIND relationships(p) AS relation
RETURN relation
$$) AS (i agtype);
i
---------------------------------------------------------------------------------------------------------------------------
{"id": 844424930131969, "label": "KNOWS", "end_id": 281474976710658, "start_id": 281474976710657, "properties": {}}::edge
{"id": 844424930131970, "label": "KNOWS", "end_id": 281474976710659, "start_id": 281474976710658, "properties": {}}::edge
(2 строки)
relationships() и явным разворачиванием путиВ этом примере демонстрируется разворачивание рёбер из пути, который сам по себе явно помещён в список.
SELECT * FROM cypher('cypher_unwind', $$
MATCH p=({name:'node1'})-[e:KNOWS*]->({name:'node3'})
UNWIND [p] AS path
UNWIND relationships(path) AS edge
RETURN edge
$$) AS (i agtype);
i
---------------------------------------------------------------------------------------------------------------------------
{"id": 844424930131969, "label": "KNOWS", "end_id": 281474976710658, "start_id": 281474976710657, "properties": {}}::edge
{"id": 844424930131970, "label": "KNOWS", "end_id": 281474976710659, "start_id": 281474976710658, "properties": {}}::edge
(2 строки)
UNWIND можно комбинировать с SET, чтобы обновлять свойства на основе развернутых значений.
SELECT * FROM cypher('cypher_unwind', $$
MATCH p=(n)-[:KNOWS]->(m)
UNWIND nodes(p) AS node
SET node.type = 'vertex'
$$) AS (i agtype);
i
---
(0 строк)
Этот пример иллюстрирует, как UNWIND обрабатывает NULL. Понимание этого поведения критически важно при работе с необязательными свойствами-списками или выражениями, которые могут выдавать NULL.
SELECT * FROM cypher('cypher_unwind', $$
UNWIND NULL AS i
RETURN i
$$) AS (i agtype);
i
---
(1 строка)