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

Recursion 在Neo4j Cypher查询中使用递归/定点/迭代结构,recursion,neo4j,set,cypher,Recursion,Neo4j,Set,Cypher,我的Neo4j数据库包含可能具有特殊属性的关系: (a)-[{sustains:true}]->(b) 这意味着a维持b:当维持b的最后一个节点被删除时,应删除b本身。我试图编写一个Cypher语句,删除一个给定的节点加上所有因此变得不可持续的节点。这可能会引发连锁反应,我不知道如何用密码编码。塞弗的表现力够强吗 在任何其他语言中,我都可以想出许多方法来实现这一点。这方面的递归算法类似于: delete(a) := MATCH (a) -[{sustains:true}]-> (b

我的Neo4j数据库包含可能具有特殊属性的关系:

(a)-[{sustains:true}]->(b)

这意味着
a
维持
b
:当维持
b
的最后一个节点被删除时,应删除
b
本身。我试图编写一个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
,在集合上运行
setOfNodeToDelete
,直到它不再更改,然后删除集合指定的节点。这需要未指定的迭代次数


有什么方法可以实现我在Cypher中的目标吗?

一个节点是否需要由一个紧邻的节点来维持,或者是否可以由一个>1步远的节点来维持?根据定义,这将是一个紧邻的节点。然而,“维持”关系是可传递的。所以在某种程度上,你可以说一个大于1的节点“维持”了关系,也在维持它。