Начало работы
Подключение
Тесты производительности
Развёртывание
Использование данных
Загрузка данных
Миграция данных
Запрос данных
Управление кластерами
Обновление
Глобальное обслуживание
Масштабирование
Мониторинг
Безопасность
Лучшие практики
Технические принципы
Типы данных
Хранилище
Исполняющий движок
Потоковая обработка (Domino)
MARS3 Индексы
Расширения
Расширенные функции
Расширенный запрос
Федеративные запросы
Grafana
Резервное копирование и восстановление
Аварийное восстановление
Графовая база данных
Введение
Предложения
Функции
Расширенные темы
Руководство
Настройка производительности
Устранение неполадок
Инструменты
Параметры конфигурации
SQL-команда
Часто задаваемые вопросы
Предложение MATCH позволяет задать шаблон, который Cypher будет искать в графе. Это основной механизм извлечения данных для последующего использования в запросе.
После MATCH часто используется предложение WHERE, чтобы добавить пользовательские ограничения к совпавшему шаблону и тем самым уточнить результирующий набор. Предикаты являются частью описания шаблона и не должны интерпретироваться как фильтры, применяемые только после завершения сопоставления. Следовательно, WHERE всегда должно располагаться непосредственно после соответствующего предложения MATCH.
MATCH может находиться в начале запроса или позже — например, после предложения WITH. Если это первое предложение в запросе, переменные ещё не привязаны; Cypher построит план поиска для нахождения элементов, удовлетворяющих шаблону и связанным предикатам WHERE. Найденные вершины и рёбра становятся привязанными элементами шаблона и могут использоваться для последующего сопоставления подграфов. Их также можно ссылаться в последующих предложениях, где Cypher использует известные элементы для обнаружения новых неизвестных.
Cypher — декларативный язык: в запросах обычно не указывается точный алгоритм сопоставления шаблонов. Предикаты в WHERE могут вычисляться до, во время или после сопоставления шаблона.
Чтобы вернуть все вершины графа, укажите шаблон, содержащий одну непомеченную вершину.
SELECT * FROM cypher('graph_name', $$
MATCH (v)
RETURN v
$$) AS (v agtype);
Возвращает все вершины в базе данных.
| v |
|---|
{id: 0; label: 'Person'; properties: {name: 'Charlie Sheen'}}::vertex |
{id: 1; label: 'Person'; properties: {name: 'Martin Sheen'}}::vertex |
{id: 2; label: 'Person'; properties: {name: 'Michael Douglas'}}::vertex |
{id: 3; label: 'Person'; properties: {name: 'Oliver Stone'}}::vertex |
{id: 4; label: 'Person'; properties: {name: 'Rob Reiner'}}::vertex |
{id: 5; label: 'Movie'; properties: {name: 'Wall Street'}}::vertex |
{id: 6; label: 'Movie'; properties: {title: 'The American President'}}::vertex |
| 7 строк возвращено |
Чтобы извлечь все вершины с конкретной меткой, укажите её в шаблоне вершины.
SELECT * FROM cypher('graph_name', $$
MATCH (movie:Movie)
RETURN movie.title
$$) AS (title agtype);
Возвращает все фильмы в базе данных.
| title |
|---|
'Wall Street' |
'The American President' |
| 2 строки возвращено |
Синтаксис -[]- задаёт неориентированное ребро без ограничений по типу или направлению.
SELECT * FROM cypher('graph_name', $$
MATCH (director {name: 'Oliver Stone'})-[]-(movie)
RETURN movie.title
$$) AS (title agtype);
Возвращает все фильмы, связанные с вершиной Person с именем 'Oliver Stone'.
| title |
|---|
'Wall Street' |
| 1 строка возвращена |
Чтобы ограничить вершину определённой меткой внутри шаблона, добавьте метку с помощью двоеточия.
SELECT * FROM cypher('graph_name', $$
MATCH (:Person {name: 'Oliver Stone'})-[]-(movie:Movie)
RETURN movie.title
$$) AS (title agtype);
Возвращает все вершины Movie, связанные с вершиной Person 'Oliver Stone'.
| title |
|---|
'Wall Street' |
| 1 строка возвращена |
Используйте -, чтобы сопоставить неориентированные рёбра.
SELECT * FROM cypher('graph_name', $$
MATCH (:Person {name: 'Oliver Stone'})-[]-(movie)
RETURN movie
$$) AS (title agtype);
Возвращает все вершины, связанные с Person 'Oliver Stone'.
| title |
|---|
'Wall Street' |
| 1 строка возвращена |
Используйте -> или <-, чтобы задать направление ребра.
SELECT * FROM cypher('graph_name', $$
MATCH (:Person {name: 'Oliver Stone'})-[]->(movie)
RETURN movie.title
$$) AS (title agtype);
Возвращает все вершины, достижимые из 'Oliver Stone' по исходящим рёбрам.
| title |
|---|
'Wall Street' |
| 1 строка возвращена |
Чтобы ссылаться на ребро — например, для фильтрации по его свойствам или возврата — присвойте его переменной в шаблоне.
SELECT * FROM cypher('graph_name', $$
MATCH (:Person {name: 'Oliver Stone'})-[r]->(movie)
RETURN type(r)
$$) AS (title agtype);
Возвращает тип каждого исходящего ребра от 'Oliver Stone'.
| title |
|---|
'DIRECTED' |
| 1 строка возвращена |
Если метка ребра известна, укажите её явно с помощью :Label.
SELECT * FROM cypher('graph_name', $$
MATCH (:Movie {title: 'Wall Street'})<-[:ACTED_IN]-(actor)
RETURN actor.name
$$) AS (actors_name agtype);
Возвращает всех актёров, участвовавших в фильме 'Wall Street'.
| actors_name |
|---|
'Charlie Sheen' |
'Martin Sheen' |
'Michael Douglas' |
| 3 строки возвращено |
Чтобы одновременно привязать ребро к переменной и ограничить его метку, укажите оба параметра в шаблоне.
SELECT * FROM cypher('graph_name', $$
MATCH ({title: 'Wall Street'})<-[r:ACTED_IN]-(actor)
RETURN r.role
$$) AS (role agtype);
Возвращает свойство role каждого ребра ACTED_IN, инцидентного 'Wall Street'.
| role |
|---|
'Gordon Gekko' |
'Carl Fox' |
'Bud Fox' |
| 3 строки возвращено |
Рёбра можно объединять в цепочки для сопоставления путей произвольной длины. Пока соблюдается базовый шаблон ()-[]-(), пользователи могут комбинировать вершины и рёбра для выражения сложных структурных шаблонов.
SELECT * FROM cypher('graph_name', $$
MATCH (charlie {name: 'Charlie Sheen'})-[:ACTED_IN]->(movie)<-[:DIRECTED]-(director)
RETURN movie.title, director.name
$$) AS (title agtype, name agtype);
Возвращает фильмы со звёздой 'Charlie Sheen' и их режиссёров.
| title | name |
|---|---|
'Wall Street' |
'Oliver Stone' |
| 1 строка возвращена |
Когда количество рёбер между двумя вершинами неизвестно или переменно, используйте синтаксис переменной длины для сопоставления последовательностей рёбер (и промежуточных вершин).
Примечание!
В YMatrix AGE:
- Поддерживается только
(u)-[*]-(v). Другие формы — например,(u)-[*]-(v)-[]-()или(u)-[*]->(v)-[*]-()— вызывают ошибку:
ERROR: variable-length relationships in paths are only supported for paths of length 3.- Шаблоны переменной длины не могут ссылаться на уже привязанные переменные. Например,
MATCH (u) MATCH (u)-[*]-(v)вызывает ошибку:
ERROR: VLE paths cannot reference existing variables.- SQL-функция
age_vle()недоступна в YMatrix AGE. Сопоставление путей переменной длины поддерживается только через синтаксис VLE в Cypher (например,(u)-[*1..3]->(v)).
Вместо того чтобы явно расписывать длинные пути с повторяющимися шаблонами вершина–ребро, можно описать несколько рёбер (и промежуточные вершины), задав длину непосредственно в части шаблона, относящейся к рёбрам.
(u)-[*2]->(v)
Описывает ориентированный справа путь из трёх вершин и двух рёбер, эквивалентный:
(u)-[]->()-[]->(v)
Можно также задать диапазон:
(u)-[*3..5]->(v)
Эквивалентно сопоставлению всех следующих шаблонов:
(u)-[]->()-[]->()-[]->(v)
(u)-[]->()-[]->()-[]->()-[]->(v)
(u)-[]->()-[]->()-[]->()-[]->()-[]->(v)
В приведённых примерах задаются нижняя и верхняя границы количества рёбер (и промежуточных вершин) между u и v. Любая из границ может быть опущена.
(u)-[*3..]->(v)
Возвращает все пути между u и v, содержащие три и более рёбер.
(u)-[*..5]->(v)
Возвращает все пути между u и v, содержащие пять и менее рёбер.
(u)-[*]->(v)
Возвращает все пути между u и v.
SELECT * FROM cypher('graph_name', $$
MATCH p = (actor {name: 'Willam Dafoe'})-[:ACTED_IN*2]-(co_actor)
RETURN relationships(p)
$$) AS (r agtype);
Возвращает списки рёбер, представляющие отношения ACTED_IN 'Willam Dafoe' и двух его коллег по роли Человека-паука.
| r |
|---|
[{"id": 0; "label":"ACTED_IN"; "properties": {"role": "Green Goblin"}}::edge, {"id": 1; "label": "ACTED_IN"; "properties": {"role": "Spiderman", "actor": "Toby Maguire"}}::edge] |
[{"id": 0; "label":"ACTED_IN"; "properties": {"role": "Green Goblin"}}::edge, {"id": 2; "label": "ACTED_IN"; "properties": {"role": "Spiderman", "actor": "Andrew Garfield"}}::edge] |
| 2 строки возвращено |