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

Neo4j-Cypher:在每个断开的子图中找到最大和最小节点值,并取差,neo4j,cypher,Neo4j,Cypher,如果我有如下所示的图表。我想找出一个子图中的最大值和一个子图中的最小值,取差值并返回 例如,最右边的子图有4个节点。最大值是3,最小值是1,我想取差值并返回,在这种情况下是2。这应该发生在整个图形数据库中的每个断开连接的子图形上。我更愿意使用一个查询来处理每个子图,这样就可以成批完成,并且可以返回每个子图的差异 我很感激能有一些直觉。真正的问题是找到那些子图,因为Neo4j本身不支持断开连接的子图检测或跟踪,需要一些密集的完整图查询来识别它们 我提供了一种方法来查找断开连接的子图,并将:子图节

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

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


我很感激能有一些直觉。

真正的问题是找到那些子图,因为Neo4j本身不支持断开连接的子图检测或跟踪,需要一些密集的完整图查询来识别它们

我提供了一种方法来查找断开连接的子图,并将:子图节点附加到子图中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过程

编辑

经过一些测试,使用NODE_全局唯一性似乎可以找到一种更有效的方法来查找子图中的所有节点

我将相应地修改我的链接答案。下面是如何处理子图查询:

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
...

谢谢,但是你能告诉我如何在子图的同一查询中获得最小值和最大值吗。谢谢。对于大型图,合并这些查询不是一个好主意。最好将设置:子图节点的查询与对子图执行操作的查询分开。与可变路径匹配相比,我发现在子图中选择节点的方法更快。APOC的路径扩展器有一些选项可以加快速度。