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

时间:2017-07-25 03:06:09

标签: 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

然而,它非常慢,并且根本不适合具有数百万个节点的图形,因此我想知道是否可以以更快的方式完成此操作。

2 个答案:

答案 0 :(得分:0)

您可以像这样使用size()

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

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

答案 1 :(得分:0)

您可能想看看使用Neo4j Graph Algorithms库,因为connected components procedures可能会做您想要的事情:

  

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

有多种方法可以使用此方法,从流式传输结果到将partition属性写入节点供以后使用。

这是流式传输的示例,返回集合的ID和集合的节点数,而对节点的标签或关系类型没有限制:

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