обновить отношения между двумя узлами, если один существует, или создать новые отношения, если один еще не существует NEO4j - PullRequest
0 голосов
/ 11 октября 2018

Я хочу написать запрос, который;

  • обновляет отношение между двумя узлами, если один уже существует, или
  • , если отношения не существует, создают один между двумя узлами.

В действительности это означает, что один пользователь программы может «заблокировать» другого пользователя программы, независимо от того, были ли у двух пользователей ранее какие-либо отношения (их количество).Для одной половины запроса, при необходимости, можно вернуть отношение, если оно существует;

MATCH (a:user {name: {aParam}) 
OPTIONAL MATCH (a) -[r]- (b:user {name: {bParam}) 
RETURN type(r), a

Для другой половины запроса обновить отношение между двумя узлами (учитывая, что оно уже существует);

MATCH (a:user {name: {aParam}) <- [r:originalRelationship] - (b:user {name: {bParam})
WITH a, r, b
MERGE (a) - [:updatedRelationship] - (b)
WITH r
DELETE r

Но, комбинируя два, которые я не создал, работающий пример, я попытался объединить их вместе, но Франкенштейн не ожил;

MATCH (a:user {name: {aParam})
OPTIONAL MATCH (a) - [r] - (b:user {name: {bParam})
WITH a, b, r
MERGE (a) - [:block] -> (b)
WITH r
DELETE r

Может кто-то указать на мои ошибки здесь и указать мне вправильное направление?

1 Ответ

0 голосов
/ 11 октября 2018

Поскольку у вас есть несколько связанных отношений, и вы хотите удалить все существующие отношения и заменить их заблокированными, вы можете попробовать это:

Match (p1:Person{name:"hj"}),(p2:Person{name:"bg"})
OPTIONAL Match (p1)-[r]->(p2) where TYPE(r)<>"Blocked"
MERGE (p1)-[:Blocked{blocked: True}]->(p2)
DELETE r
return *

Сохранение приведенной ниже части на случай, если это кому-то поможет.Если у вас есть только 1 тип отношений, и вы просто хотите обновить значения, вы можете использовать это:

Вы можете использовать Merge предложение с ON MATCH и ON CREATE options.

Поскольку вы не указали явно узлы и структуру отношений, я приведу другой пример.Принимая во внимание 2 узла Person, в которых поле «имя» однозначно идентифицирует человека.

Запрос создает отношение, если оно отсутствует, и, если оно уже присутствует, вы можете указать поля, которые хотите обновить.

Match (p1:Person{name:"hj"}),(p2:Person{name:"bg"})
Merge (p1)-[r:originalRelationship]->(p2)
ON CREATE SET r.created = True
ON MATCH SET r.updated = True
return p1,p2,r
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...