Recursion 在Neo4j Cypher查询中使用递归/定点/迭代结构
我的Neo4j数据库包含可能具有特殊属性的关系: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
(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的节点“维持”了关系,也在维持它。