我的Neo4j数据库包含可能具有特殊属性的关系:
(a) -[{sustains:true}]-> (b)
这意味着a
支持 b
:当删除支持b
的最后一个节点时,应删除b
本身。我试图写一个删除给定节点的Cypher语句PLUS所有节点现在变得不稳定了。这可能引发连锁反应,我不知道如何在Cypher中对此进行编码。 Cypher表达得足够吗?
在任何其他语言中,我都可以提出多种方法来实现这一点。对此的递归算法类似于:
delete(a) :=
MATCH (a) -[{sustains:true}]-> (b)
REMOVE a
WITH b
MATCH (aa) -[{sustains:true}]-> (b)
WHERE count(aa) = 0
delete(b)
另一种描述要删除的额外节点集的方法是使用定点函数:
setOfNodesToDelete(Set) :=
RETURN Set' ⊆ Set such that for all n ∈ Set'
there is no (m) -[{sustains:true}]-> (n) with m ∉ Set
我们将从z
的所有(a) -[{sustains:true}*1..]-> (z)
开始,然后删除a
,在集合上运行setOfNodesToDelete
,直到它不再发生变化为止,然后删除该组指定的节点。这需要不确定的迭代次数。
有什么方法可以实现我在Cypher的目标?