Neo4j:获取所有子图的节点数的更快方法

Neo4j:获取所有子图的节点数的更快方法,neo4j,cypher,neo4j-apoc,Neo4j,Cypher,Neo4j Apoc,我有一个由数百万个断开连接的子图组成的图。现在,我试图找到所有这些子图的节点数。例如,假设我有一个包含A-B-C,D-E,F-G-H的图,那么返回值是3,2,3 现在,我可以通过以下查询来实现这一点: MATCH (n) CALL apoc.path.subgraphNodes(n, {}) YIELD node WITH n , count(node) as nodesnum return nodesnum 但是,它的速度非常慢,并且根本不适合具有数百万个节点的图形,因此我想知道是否可以以更

我有一个由数百万个断开连接的子图组成的图。现在,我试图找到所有这些子图的节点数。例如,假设我有一个包含A-B-C,D-E,F-G-H的图,那么返回值是3,2,3

现在,我可以通过以下查询来实现这一点:

MATCH (n) CALL apoc.path.subgraphNodes(n, {}) YIELD node WITH n , count(node) as nodesnum return nodesnum
但是,它的速度非常慢,并且根本不适合具有数百万个节点的图形,因此我想知道是否可以以更快的方式完成此操作。

您可以像这样使用size()

MATCH (n) return n.id, size((n)-[*]-()) limit 100

这使用了投影,而不是将所有节点调用到内存中,因此加载速度更快!请注意,如前所述,对于您的示例,第一个子图将获得A、3 B、3 C、3等。

您可能需要使用Neo4j图形算法库,因为该子图可能会执行您想要的操作:

连接组件或联合查找算法在无向图中查找连接节点集,其中每个节点都可以从同一集中的任何其他节点访问

有几种方法可以使用它,从流式传输结果到将分区属性写入节点以供以后使用

以下是流式处理的示例,返回集合的id和集合的节点数,对节点标签或关系类型没有限制:

CALL algo.unionFind.stream('', '', {})
YIELD nodeId,setId
RETURN setId, count(nodeId) as count

如果无法将特定节点作为目标。。。当您读取整个数据库时,这总是很慢。我真想知道为什么你会期望有“另一种更快的方式”?顺便说一句上面的示例查询将返回。。。3, 3, 3, 2, 2, 3, 3, 3 ... 它计算每个节点的子图。@TomGeudens是的,你是对的。我将查询更改为添加“图着色”,即标记子图中已访问的节点。但它仍然没有帮助,因为标记需要一些时间。这很公平。这确实不会有多大区别。您没有针对性(我不知道您如何给出您的模型),因此至少要遍历整个数据库一次。