【问题标题】:Neo4j: Faster way to get the number of nodes of all the subgraphsNeo4j:获取所有子图节点数的更快方法
【发布时间】:2017-07-25 03:06:08
【问题描述】:

我有一个由数百万个断开连接的子图组成的图。现在我试图找到所有这些子图的节点数。例如,假设我有这张图,其中包含 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

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

【问题讨论】:

  • 如果您不能针对特定节点...这总是会很慢,因为您正在读取整个数据库。我确实想知道为什么您会期望有“另一种更快的方式”?顺便说一句...您上面的示例查询将返回... 3, 3, 3, 2, 2, 3, 3, 3 ... 它计算每个节点的子图。
  • @TomGeudens 是的,你是对的。我更改了查询以添加“图形着色”,如果它们已被访问,则在子图中标记节点。但它仍然无济于事,因为标记需要一些时间。
  • 很公平。它确实不会有太大的不同。你没有定位(我不明白你怎么能给出你的模型),因此至少遍历整个数据库一次。

标签: neo4j cypher neo4j-apoc


【解决方案1】:

你可以像这样使用 size()

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

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

【讨论】:

    【解决方案2】:

    您可能想看看使用 Neo4j 图形算法库,因为 connected components procedures 可能会做您想做的事:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-12
      相关资源
      最近更新 更多