Cypher

Создание узлов с помощью MERGE

Запрос:

MERGE (a:Person {name: $name, age: $age})

Объяснение:

  • MERGE: Проверяет, существует ли узел с указанными свойствами. Если не существует, создаёт его. Если существует, повторного создания не будет.
  • (a:Person ...): Создаётся или ищется узел с меткой Person. Метка (label) описывает тип сущности (например, Person для человека).
  • {name: $name, age: $age}: Свойства узла. name и age задаются через параметры (обозначены как $name и $age), значения которых передаются из кода.

Создание уникальных связей с помощью MERGE

Запрос:

MATCH (a:Person {name: $name1}), (b:Person {name: $name2})
MERGE (a)-[:FRIENDS]->(b)

Объяснение:

  • 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})-[:FRIENDS]->(friend)
RETURN friend.name AS name, friend.age AS age

Объяснение:

  • 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((a:Person {name: $start})-[:FRIENDS*]-(b:Person {name: $end}))
RETURN p

Объяснение:

  • 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 = (a:Person {name: $start})-[:FRIENDS*]-(b:Person {name: $end})
RETURN p, length(p) AS pathLength
ORDER BY pathLength DESC
LIMIT 1

Объяснение:

  • 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: Ограничивает результат одним самым длинным путем.