Neo4j: реализация мягкого удаления с необязательными отношениями

Я пытаюсь реализовать мягкое удаление в Neo4j. График, описанный в Cypher с точки зрения Алисы, таков:

(clyde:User)<-[:FOLLOWS]-(alice:User)-[:LIKES]->(bob:User)

Вместо того, чтобы фактически удалить узел и его отношения, я

изменив метку так, чтобы ее больше нельзя было искать напрямую, т.е.User пометить и добавить_User этикетка (обратите внимание на подчеркивание)заменяя его отношения, чтобы он больше не мог быть достигнут моими обычными запросами, например удаляя его:FOLLOWS отношения и замена его:_FOLLOWS отношения.

Так что это в основном эквивалент перемещения строки в таблицу архивации в реляционной базе данных. Я подумал, что это довольно эффективный подход, потому что вы фактически никогда не посещаете те части графика, которые были удалены. Кроме того, вам не нужно изменять какие-либо из ваших существующих запросов.

Результат мягкого удаления Алисы должен быть следующим:

(clyde:User)<-[:_FOLLOWS]-(alice:_User)-[:_LIKES]->(bob:User)

Моя первая попытка запроса была такой:

match (user:User {Id: 1})
optional match (user)-[follows:FOLLOWS]->(subject)
remove user:User set user:_User
delete follows
create (user)-[:_FOLLOWS]->(subject);

Проблема в том, что когда этот пользователь никого не преследует, запрос пытается создать связь междуuser а такжеnull потому что второе совпадение не является обязательным, поэтому оно дает мне эту ошибку:Other node is null.

Моя вторая попытка была такая:

match (user:User {Id: 1})
remove user:User set user:_User
optional match (user)-[follows:FOLLOWS]->(subject)
foreach (f in filter(f in collect({r: follows, n: subject}) where f.r is not null) | delete f.r create (user)-[:_FOLLOWS]->(f.n));

Поэтому я помещаю отношения и предмет в карту, собираю эти карты в коллекцию, выбрасываю каждую «пустую» карту и зацикливаю коллекцию. Но этот запрос дает мне эту ошибку:

SyntaxException: Invalid input '.': expected an identifier character, node labels, a property map, whitespace or ')' (line 1, column 238)

Кто-нибудь знает, как я могу это исправить?

Спасибо Ян

Ответы на вопрос(1)

Ваш ответ на вопрос