Neo4j Cypher:根据节点属性的值匹配和删除子图

时间:2016-12-15 22:17:08

标签: neo4j cypher graph-databases subgraph

假设我在Neo4j中有3个子图,如果子图中的所有节点都符合每个节点的属性值&lt的过滤条件,我想选择并删除整个子图。 ; = 1.但是,如果子图中的至少一个节点与条件不匹配,则子图将不会被删除。

在这种情况下,左子图将被删除,但右子图和中间子图将保留。 即使某些节点的值为1,也不会删除正确的节点,因为还有一些节点的值大于1。

用户标识是节点属性。

enter image description here

如果有人可以向我推荐可用于执行该操作的密码查询,我将感激不尽。请注意,查询将在整个图表上,如果已经存在,则会在所有三个子图表上显示。

1 个答案:

答案 0 :(得分:3)

感谢您的澄清,这是一个棘手的要求,并且我不能立即明白哪种最佳方法可以很好地适应大型图形,因为大多数可能性似乎都是昂贵的全图操作。我们可能需要使用几个步骤来设置图表,以便以后更容易查询。我也假设你的意思是“断开连接的子图”,否则这个答案将不起作用。

一个开始可能是将节点标记为:Alive或:基于属性值的Dead。如果所有节点都具有相同的标签,并且该标签的value属性上有索引,那么它应该会有所帮助,因为我们的匹配操作可以利用索引而不必进行完整的标签扫描和属性比较。

MATCH (a:MyNode)
WHERE a.value <= 1
SET a:Dead

并单独

MATCH (a:MyNode)
WHERE a.value > 1
SET a:Alive

然后,您要标记要删除的节点的查询将是:

MATCH (a:Dead)
WHERE NOT (a)-[*]-(:Alive)
SET a:ToDelete

如果您标记为删除的节点看起来都很好,您可以使用APOC程序中的apoc.periodic.commit()运行删除操作,以便在必要时批量处理操作。

MATCH (a:ToDelete)
DETACH DELETE a

如果对断开连接的子图的操作很常见,我强烈建议使用连接到您创建的每个子图的特殊节点(例如单个:子图头部的簇节点),这样您就可以开始执行以下操作:群集节点,可以大大加快这些类型的查询,因为您的查询操作将按群集执行,而不是每个:死节点。