在Neo4j Cypher查询中使用递归/定点/迭代结构

时间:2015-10-01 16:55:24

标签: recursion neo4j set cypher

我的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的目标?

0 个答案:

没有答案