Neo4j Cypher:找到每个断开连接的子图中的最大和最小节点值,并取得差异

时间:2017-01-24 20:54:22

标签: neo4j cypher

如果我有如下图所示的图表。我想在子图中找到最大值,子图中的最小值取差值并返回。

例如,最右边的子图有4个节点。最大值是3,最小值是1,我想采取差异并返回,对于这种情况是2.这应该发生在整个图数据库中的每个断开连接的子图。我更喜欢使用一个查询来处理每个子图,这样就可以批量完成,并且可以返回每个子图的差异。

我会感激得到一些直觉。

1 个答案:

答案 0 :(得分:1)

真正的问题是找到那些子图,因为Neo4j没有对断开连接的子图检测或跟踪的原生支持,并且需要一些密集的完整图查询来识别它们。

我提供了一种方法来查找断开连接的子图,并将一个:子图节点附加到this answer中子图中id最小的节点到类似的问题。

一旦:子图节点到位,您就可以自由地对子图进行批量查询。

如该答案中所述,它没有提供一种方法来跟上最终影响子图的图变化(创建新的子图,合并子图,划分子图)。

修改

一旦你有一个:子图节点附加到每个断开连接的子图,你就可以轻松地对子图进行操作。

您可以使用此查询来计算差异:

MATCH (s:Subgraph)-[*]-(subgraphNode)
WITH DISTINCT s, subgraphNode
WITH s, MIN(subgraphNode.value) as minimum, MAX(subgraphNode.value) as maximum
WITH s, maximum - minimum as difference
...

如果您需要批量处理该查询,那么您将需要使用APOC程序,可能是apoc.periodic.iterate()

修改

经过一些测试后,似乎APOC's Path Expander functionality使用NODE_GLOBAL唯一性,可以更有效地找到子图中的所有节点。

我会相应地改变我的链接答案。以下是这对子图查询的作用:

MATCH (s:Subgraph)
CALL apoc.path.expandConfig(s,{minLevel:1, bfs:true, uniqueness:"NODE_GLOBAL"}) YIELD path
WITH s, last(nodes(path)) as subgraphNode
WITH s, MIN(subgraphNode.value) as minimum, MAX(subgraphNode.value) as maximum
WITH s, maximum - minimum as difference
...