Cypher
Создание узлов с помощью MERGE
Запрос:
Объяснение:
MERGE
: Проверяет, существует ли узел с указанными свойствами. Если не существует, создаёт его. Если существует, повторного создания не будет.(a:Person ...)
: Создаётся или ищется узел с меткойPerson
. Метка (label) описывает тип сущности (например, Person для человека).{name: $name, age: $age}
: Свойства узла.name
и age$name
и$age
), значения которых передаются из кода.
Создание уникальных связей с помощью MERGE
Запрос:
Объяснение:
MATCH (a:Person {name: $name1})
: Ищет узел с меткой Person, у которого свойство name равно значению параметра$name1
. Этот узел связывается с переменнойa
.MATCH (b:Person {name: $name2})
: Аналогично, ищет узел Person с именем$name2
и связывает его с переменнойb
.MERGE (a)-[:FRIENDS]->(b
): Проверяет, существует ли связьFRIENDS
от узлаa
к узлуb
. Если такая связь существует, ничего не делает. Если не существует, создаёт её.[:FRIENDS]:
Определяет тип связи. В данном случае это “дружба”.->
: Направление связи. Стрелка указывает, чтоa
дружит сb
.
Поиск друзей конкретного человека
Запрос:
Объяснение:
MATCH (a:Person {name: $name})
: Ищет узел Person с именем, равным значению$name
. Этот узел связывается с переменнойa
.-[:FRIENDS]->(friend)
: Находит все узлы, связанные с узломa
связью типаFRIENDS
. Эти узлы связываются с переменнойfriend
.RETURN friend.name AS name, friend.age AS age
: Возвращает свойства найденных узлов:friend.name
— имя друга.friend.age
— возраст друга.- RETURN Reference
AS
используется для задания алиасов, чтобы упростить доступ к возвращённым данным.
Поиск кратчайшего пути между двумя людьми
Запрос:
Объяснение:
MATCH p = shortestPath(...)
: Начинает поиск пути, который будет присвоен переменнойp
. ФункцияshortestPath
ищет наименьшее количество связей между узлами.(a:Person {name: $start})
: Ищет узел с меткойPerson
, у которого свойствоname
равно значению параметра$start
. Этот узел связывается с переменнойa
.-[:FRIENDS*]-
: Находит любые связи типаFRIENDS
(обозначенные*
, что означает “любое количество связей”) между узломa
и узломb
. Направление связи не имеет значения благодаря использованию-
.(b:Person {name: $end})
: Ищет узел с меткойPerson
, у которого свойствоname
равно значению параметра$end
. Этот узел связывается с переменнойb
.RETURN p
: Возвращает найденный путьp
, который представляет собой последовательность узлов и связей отa
доb
.
Поиск самого длинного пути между двумя людьми
Запрос:
Объяснение:
MATCH p = (...)
: Начинает поиск пути, который будет присвоен переменнойp
.(a:Person {name: $start})
: Ищет узел с меткойPerson
, у которого свойствоname
равно значению параметра$start
. Этот узел связывается с переменнойa
.-[:FRIENDS*]-
: Находит любые связи типаFRIENDS
между узломa
и узломb
, независимо от их направления.(b:Person {name: $end})
: Ищет узел с меткойPerson
, у которого свойствоname
равно значению параметра$end
. Этот узел связывается с переменнойb
.RETURN p, length(p) AS pathLength
: Возвращает найденный путьp
и длину этого пути, которая определяется количеством связей (length(p)
), присваивая результат алиасуpathLength
.ORDER BY pathLength DESC
: Сортирует результаты по длине пути в порядке убывания, чтобы самые длинные пути шли первыми.LIMIT 1
: Ограничивает результат одним самым длинным путем.