确实,随着图形模型的发展,保持deleted 属性很快变得难以管理:该属性会渗透到您的每一个查询中。据我所知,Neo4j 没有提供任何帮助。
但是,我在使用 albertoperdomo 的方法时取得了成功。一些细节在几个月前的a question I asked here 中。
您想替换要软删除的节点的两件事:它们的标签(因此无法直接查找它们)和它们的关系(因此无法从其他节点访问它们)。就我而言,我只是在标签和关系类型前加上下划线 (_)。
好处很明显:您现有的查询(可能!)是安全的,因为不再考虑软删除的节点(它们无法再访问,除非您明显省略关系类型,即(a)--(b)什么的)。
我还认为这是实现软删除的最高效方式,因为您实际上是在截断图表的各个部分——而不是匹配某个属性(即使它已编入索引)。
但是,有一个问题。没有通用的方法替换标签和关系。例如,您不能说出以下内容:
match (:Person {id: 123})-[r]-()
set type(r) = '_' + type(r);
对于您拥有的每种类型的节点,您必须分别替换每个标签和关系。如果关系是可选的,事情也会变得棘手,因为很难在整个查询中“携带”初始节点(因此my initial question)。
我解决这个问题的方法是将查询的不同部分与UNION 串在一起:
MATCH (review:Review {Id: {id}})<-[wrote:WROTE_REVIEW]-(owner)
DELETE wrote CREATE (review)<-[:_WROTE_REVIEW]-(owner)
UNION
MATCH (review:Review {Id: {id}})-[evaluates:EVALUATES]->(product)
DELETE evaluates CREATE (review)-[:_EVALUATES]->(product)
UNION
...
UNION
MATCH (review:Review {Id: {id}})
REMOVE review:Review") SET review:_Review;
是的,您在每个子查询中 MATCHing 同一个节点,但我认为如果您的属性被索引,则性能影响可以忽略不计,但主要是因为您创建/读取节点的频率远高于删除它们(否则,您的数据库将是空的!)