如果我有如下图所示的图表。我想在子图中找到最大值,子图中的最小值取差值并返回。
例如,最右边的子图有4个节点。最大值是3,最小值是1,我想采取差异并返回,对于这种情况是2.这应该发生在整个图数据库中的每个断开连接的子图。我更喜欢使用一个查询来处理每个子图,这样就可以批量完成,并且可以返回每个子图的差异。
我会感激得到一些直觉。
答案 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
...