Neo4j:更快的子图 coloring/labelling
Neo4j: Faster subgraph coloring/labelling
我有一个包含多个小子图的图。目标是当且仅当子图中的所有节点都是蓝色时,才将子图中的所有蓝色节点标记为红色。如果子图中的一个节点具有不同的颜色,绿色,那么我们将不会更改该子图中节点的颜色。
这是我正在使用的查询:
MATCH (a:BLUE) WHERE NOT (a)-[*]-(:GREEN) WITH a LIMIT 10000 SET a:RED REMOVE a:BLUE
这是查询前后的样子:
问题是需要多次遍历同一个子图,所以比较慢例如:
要将 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
我有一个包含多个小子图的图。目标是当且仅当子图中的所有节点都是蓝色时,才将子图中的所有蓝色节点标记为红色。如果子图中的一个节点具有不同的颜色,绿色,那么我们将不会更改该子图中节点的颜色。
这是我正在使用的查询:
MATCH (a:BLUE) WHERE NOT (a)-[*]-(:GREEN) WITH a LIMIT 10000 SET a:RED REMOVE a:BLUE
这是查询前后的样子:
问题是需要多次遍历同一个子图,所以比较慢例如:
要将 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