Neo4j:更快的子图着色/标记

标签 neo4j cypher graph-databases

我有一个包含多个小子图的图。目标是当且仅当子图中的所有节点都是蓝色时,才将子图中的所有蓝色节点标记为红色。如果子图中的一个节点具有不同的颜色,绿色,那么我们将不会更改该子图中节点的颜色。

这是我正在使用的查询:

MATCH (a:BLUE) WHERE NOT (a)-[*]-(:GREEN) WITH a LIMIT 10000 SET a:RED REMOVE a:BLUE

这是查询前后的样子: enter image description here

问题是它很慢,因为它需要多次遍历同一个子图。例如:

要将 A 标记为红色,需要遍历 A-B-C。再一次,要标记 B,它需要遍历 A-B-C。同样,标记 C 也是如此。

我想知道是否有任何方法可以一次性标记子图中的所有节点,而不是一次又一次地访问同一个子图。如果可能的话,它将减少查询时间受多种因素影响。

最佳答案

我还没有使用过图形算法插件,但是使用 APOC Procedures 通常可以比纯 Cypher 更快地完成,尽管确实需要处理所有相关子图中的所有节点以提取连接子图的单行,因为 Neo4j 没有对子图查询的原生支持。

程序 apoc.path.subgraphNodes() 特别有助于从每个节点扩展到整个子图,并且只会计算到每个节点的单个路径,而不是评估所有可能的路径.

从那里,我们可以按子图中的最小节点分组,并只保留代表整个子图的一组节点。这让我们每个子图一行,这让我们的谓词检查子图中所有节点的颜色每个子图只运行一次。

像这样:

MATCH (n:BLUE) // no need to get subgraphs that don't have blue nodes
CALL apoc.path.subgraphNodes(n, {}) YIELD node
WITH n, collect(node) as nodes, min(id(node)) as minId
WITH minId, head(collect(nodes)) as nodes // now only one row / subgraph
WHERE all(node in nodes where node:BLUE)
UNWIND nodes as node
SET node:RED
REMOVE node:BLUE

关于Neo4j:更快的子图着色/标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44729554/

相关文章:

graph - 如何将时间纳入图形映射 (Neo4j)

neo4j - Neo4j 中节点上的标签限制

neo4j - 在neo4j cypher中查找一个节点及其所有传入和传出节点

database - 从图中排除节点时出现问题

neo4j - 优化 Cypher 查询 Neo4j

lucene - 在 Neo4j 上通过带有 html 标记的富文本进行全文搜索

performance - Cypher:使用 WHERE 子句或 MATCH 属性定义进行精确匹配?

neo4j - Spring Data Neo4j 中的@Query shortestPath 返回类型

graph-databases - 如何列出正在运行的 gremlin 查询?如何取消运行缓慢或长时间运行的查询?

neo4j - 如何在 neo4j 中添加双向关系属性的值集合?