首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Neo4j Cypher:基于节点属性值的子图匹配与删除

Neo4j Cypher:基于节点属性值的子图匹配与删除
EN

Stack Overflow用户
提问于 2016-12-15 22:17:08
回答 1查看 491关注 0票数 0

假设Neo4j中有3个子图,如果每个节点的属性值<= 1与子图中的所有节点匹配,则选择和删除子图。但是,如果子图中至少有一个不匹配条件的,那么子图就不会被删除。

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

使用和值是节点属性。

如果有人能建议我可以使用密码查询,我将非常感激。请注意,查询将对整个图,即所有三个子图或更多,如果有更多。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-16 02:28:48

谢谢你的澄清,这是一个棘手的要求,而且我现在还不清楚什么是最好的方法,在大图中可以很好地扩展,因为大多数可能性似乎都是昂贵的全图操作。我们可能需要使用几个步骤来设置图形,以便以后更容易地查询。我也假设你的意思是“断续子图”,否则这个答案就行不通了。

一个开始可能是根据属性值将节点标记为:活着的或:死的。如果所有节点都具有相同的标签,如果该标签的value属性上有索引,则会有所帮助,因为我们的匹配操作可以利用索引,而不必进行全标签扫描和属性比较。

代码语言:javascript
复制
MATCH (a:MyNode)
WHERE a.value <= 1
SET a:Dead

和单独

代码语言:javascript
复制
MATCH (a:MyNode)
WHERE a.value > 1
SET a:Alive

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

代码语言:javascript
复制
MATCH (a:Dead)
WHERE NOT (a)-[*]-(:Alive)
SET a:ToDelete

如果您标记为delete的节点看起来都很好,那么您可以运行delete操作,必要时可以使用APOC过程中的apoc.periodic.commit()对操作进行批处理。

代码语言:javascript
复制
MATCH (a:ToDelete)
DETACH DELETE a

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41174220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档