gpt4 book ai didi

graph - 如何在 Neo4j 中返回前 n 个最大的集群?

转载 作者:行者123 更新时间:2023-12-04 18:21:19 25 4
gpt4 key购买 nike

在我的数据库中,图表看起来像这样:

cluster

我想在我的数据中找到前 3 个最大的集群。集群是相互连接的节点的集合,连接的方向并不重要。从图中可以看出,预期结果应该有3个簇,大小分别为3 2 2。

这是我到目前为止的想法:

MATCH (n)
RETURN n, size((n)-[*]-()) AS cluster_size
ORDER BY cluster_size DESC
LIMIT 100

但是,它有两个问题:
  • 我认为查询是错误的,因为 size()函数不返回我想要的集群中的节点数,而是返回匹配模式的子图的数量。
  • LIMIT子句限制要返回的节点数,而不是取最高结果。这就是为什么我在那里放了 100。

  • 我现在该怎么办?我被卡住了:(谢谢你的帮助。

    更新

    感谢 Bruno Peres ' 回答,我可以试试 algo.unionFind查询 Neo4j Graph Algorithm .我可以使用以下查询找到连接组件的大小:
    CALL algo.unionFind.stream()
    YIELD nodeId,setId
    RETURN setId,count(*) as size_of_component
    ORDER BY size_of_component DESC LIMIT 20;

    结果如下:
    Connected Components

    但这就是我所知道的。我无法获得有关每个组件中节点的任何信息来将它们可视化。 collect(nodeId)需要永远,因为前 2 个组件太大。而且我知道将这些大型组件可视化是没有意义的,但是第三个呢? 235 个节点可以渲染。

    最佳答案

    我认为您正在寻找 Connected Componentes . Neo4j Graph Algorithms User Guide 关于连接组件的部分说:

    Connected Components or UnionFind basically finds sets of connected nodes where each node is reachable from any other node in the same set. In graph theory, a connected component of an undirected graph is a subgraph in which any two vertices are connected to each other by paths, and which is connected to no additional vertices in the graph.



    如果这是您的情况,您可以 install Neo4j Graph Algorithms并使用 algo.unionFind .我用这个示例数据集重现了你的场景:
    create (x), (y),
    (a), (b), (c),
    (d), (e),
    (f), (g),
    (a)-[:type]->(b), (b)-[:type]->(c), (c)-[:type]->(a),
    (d)-[:type]->(e),
    (f)-[:type]->(g)

    然后运行 ​​ algo.unionFind :
    // call unionFind procedure
    CALL algo.unionFind.stream('', ':type', {})
    YIELD nodeId,setId
    // groupBy setId, storing all node ids of the same set id into a list
    WITH setId, collect(nodeId) as nodes
    // order by the size of nodes list descending
    ORDER BY size(nodes) DESC
    LIMIT 3 // limiting to 3
    RETURN setId, nodes

    结果将是:
    ╒═══════╤══════════╕
    │"setId"│"nodes" │
    ╞═══════╪══════════╡
    │2 │[11,12,13]│
    ├───────┼──────────┤
    │5 │[14,15] │
    ├───────┼──────────┤
    │7 │[16,17] │
    └───────┴──────────┘

    编辑

    来自评论:

    how can I get all nodeId of a specific setId? For example, from my screenshot above, how can I get all nodeId of the setId 17506? That setId has 235 nodes and I want to visualize them.


  • 跑电话CALL algo.unionFind('', ':type', {write:true, partitionProperty:"partition"}) YIELD nodes RETURN *. This statement will create a每个节点的 partition` 属性,包含节点所属的分区 ID。
  • 运行此语句以获取前 3 个分区:match (node)
    with node.partition as partition, count(node) as ct order by ct desc
    limit 3 return partition, ct
    .
  • 现在您可以使用 match (node {partition : 17506}) return node 分别获取每个前 3 个分区的所有节点。 ,使用在第二个查询中返回的分区 ID。
  • 关于graph - 如何在 Neo4j 中返回前 n 个最大的集群?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49134739/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com