MATCH

Предложение 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 строки возвращено