gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 16:24:23 29 4
gpt4 key购买 nike

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

这是我正在使用的查询:

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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com