我正在尝试在 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
,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)
有谁知道我该如何解决这个问题?
谢谢,扬