You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Neo4j查询前N个最大人类好友连通集群的实现方法及代码示例问询

实现方案

核心思路

先过滤出仅包含Humans节点、Humans之间FRIENDS关系的子图,再通过社群检测算法划分集群,按规模排序取前N个即可,推荐用官方GDS库实现,效率更高。

操作步骤(GDS库方案,推荐)

1. 子图投影

先把需要的节点和关系投影到GDS的内存图目录,自动过滤掉无关的节点和关系:

CALL gds.graph.project(
  'human_friends_subgraph',
  'Humans', // 仅保留Humans类型节点,自动过滤Pets、Homes节点
  {
    FRIENDS: {
      type: 'FRIENDS',
      orientation: 'UNDIRECTED' // 好友关系默认无向,若你的场景是有向好友可改为NATURAL
    }
  }
)

2. 社群检测并取前N个最大集群

用最常用的Louvain算法做社群划分,也可以替换成弱连通分量、标签传播等其他社群算法:

CALL gds.louvain.stream('human_friends_subgraph')
YIELD nodeId, communityId
// 按社群ID分组,统计每个社群的规模和包含的节点
WITH communityId, count(*) AS community_size, collect(gds.util.asNode(nodeId)) AS community_members
// 按规模倒序取前N个,把5替换成你需要的N值即可
ORDER BY community_size DESC LIMIT 5
RETURN communityId, community_size, community_members

可视化操作

用Neo4j Browser自带可视化的话:

  • 运行上述查询后,切换到Graph视图即可直接看到集群结构
  • 点击视图右侧的样式设置按钮,选择按communityId属性为节点分组着色,就能直观区分不同集群,规模最大的集群会一目了然。

轻量场景替代方案(原生Cypher,适合万级以下小数据集)

如果不想装GDS库,可以用APOC库的节点分组功能实现:

// 先过滤出Humans之间的FRIENDS关系
MATCH (h1:Humans)-[:FRIENDS]-(h2:Humans)
WITH collect(DISTINCT h1) + collect(DISTINCT h2) AS all_humans, collect(DISTINCT [id(h1), id(h2)]) AS friend_edges
// 调用APOC的连通分量分组
CALL apoc.nodes.group(all_humans, friend_edges)
YIELD node, group
WITH group AS communityId, count(*) AS community_size, collect(node) AS community_members
ORDER BY community_size DESC LIMIT 5
RETURN communityId, community_size, community_members

注意:该方案需要提前安装APOC库,数据量较大时性能远低于GDS方案,仅适合小数据集测试使用。

内容的提问来源于stack exchange,提问作者Tobi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 06:45:04