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