【发布时间】:2013-12-16 08:08:28
【问题描述】:
我正在尝试在 Neo4j 中实现软删除。从 Alice 的角度来看,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)
有谁知道我该如何解决这个问题?
谢谢, 一月
【问题讨论】:
标签: neo4j cypher soft-delete