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)
Кто-нибудь знает, как я могу это исправить?
Спасибо Ян