Neo4j Cypher:根据节点 属性 的值匹配和删除子图
Neo4j Cypher: Match and Delete the subgraph based on value of node property
假设我在 Neo4j 中有 3 个子图,如果子图中的所有节点都匹配过滤条件,我想 select 并删除 whole 子图每个节点的 属性 值 <= 1。但是,如果子图中至少有 atleast 个节点不符合条件,则子图将不会被删除。
在这种情况下,左边的子图将被删除,但右边的子图和中间的子图将保留。 右边的虽然有一些值为1的节点,但也不会被删除,因为还有大于1的节点。
userids 和 values 是节点属性。
如果有人能向我推荐可用于执行此操作的密码查询,我将不胜感激。请注意,查询将针对整个图,即针对所有三个子图或更多子图(如果有的话)。
感谢您的澄清,这是一个棘手的要求,我并不能立即清楚最好的方法是什么可以很好地扩展大型图,因为大多数可能性似乎是昂贵的全图操作。我们可能需要使用几个步骤来设置图表,以便以后更轻松地查询。我还假设你的意思是 "disconnected subgraphs",否则这个答案将不起作用。
一个开始可能是根据 属性 值将节点标记为 :Alive 或 :Dead 。如果所有节点都具有相同的标签,并且该标签的值 属性 上有索引,这应该会有所帮助,因为我们的匹配操作可以利用该索引,而不必进行完整的标签扫描和 属性比较。
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
如果对断开连接的子图的操作很常见,我强烈建议使用连接到您创建的每个子图的特殊节点(例如子图头部的单个 :Cluster 节点),以便您可以开始此类操作在 :Cluster 节点上,这将大大加快此类查询的速度,因为您的查询操作将按集群执行,而不是按 :Dead 节点执行。
假设我在 Neo4j 中有 3 个子图,如果子图中的所有节点都匹配过滤条件,我想 select 并删除 whole 子图每个节点的 属性 值 <= 1。但是,如果子图中至少有 atleast 个节点不符合条件,则子图将不会被删除。
在这种情况下,左边的子图将被删除,但右边的子图和中间的子图将保留。 右边的虽然有一些值为1的节点,但也不会被删除,因为还有大于1的节点。
userids 和 values 是节点属性。
如果有人能向我推荐可用于执行此操作的密码查询,我将不胜感激。请注意,查询将针对整个图,即针对所有三个子图或更多子图(如果有的话)。
感谢您的澄清,这是一个棘手的要求,我并不能立即清楚最好的方法是什么可以很好地扩展大型图,因为大多数可能性似乎是昂贵的全图操作。我们可能需要使用几个步骤来设置图表,以便以后更轻松地查询。我还假设你的意思是 "disconnected subgraphs",否则这个答案将不起作用。
一个开始可能是根据 属性 值将节点标记为 :Alive 或 :Dead 。如果所有节点都具有相同的标签,并且该标签的值 属性 上有索引,这应该会有所帮助,因为我们的匹配操作可以利用该索引,而不必进行完整的标签扫描和 属性比较。
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
如果对断开连接的子图的操作很常见,我强烈建议使用连接到您创建的每个子图的特殊节点(例如子图头部的单个 :Cluster 节点),以便您可以开始此类操作在 :Cluster 节点上,这将大大加快此类查询的速度,因为您的查询操作将按集群执行,而不是按 :Dead 节点执行。