我正在尝试在 Neo4j 中实现软删除。从 Alice 的角度来看,Cypher 中描述的图是这样的:
(clyde:User)<-[:FOLLOWS]-(alice:User)-[:LIKES]->(bob:User)
我没有实际删除节点及其关系,而是
- 更改其标签,使其无法再直接查找,即删除其标签
User
标签并添加_User
标签(注意下划线)
- 替换它的关系,这样我的正常查询就无法再访问它,例如删除其
:FOLLOWS
关系并将其替换为:_FOLLOWS
关系。
因此,这基本上相当于将一行移动到关系数据库中的归档表中。我认为这是一种非常有效的方法,因为您实际上永远不会访问图表中已被软删除的部分。此外,您不必修改任何现有查询。
软删除Alice的结果应该是这样的:
(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
and 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)
有谁知道我该如何解决这个问题?
谢谢,
扬