1. 页面概览
图分区压缩页(GraphPartitionPage.vue)是 LightGotham V5 Stage 4 图谱域(B4-2)的社区发现工具:对当前图执行 simplifiedLouvain 多层折叠分区,把图拆成若干社区(每个节点归属一个社区 ID),并产出「压缩图」——把社区聚合成超节点、社区间边聚合为权重边,用于宏观观察。页面提供三层折叠参数,点击「运行分区」后展示多层折叠统计表、社区统计表(含成员预览)、社区规模柱状图与社区间关系桑基图(基于压缩图),并列出历史分区记录。
一句话总结:图分区压缩页把"全图社区发现 + 压缩图可视化 + 历史回溯"合为一体,是图谱域的结构洞察工具。
2. 访问入口
- 路由 path
/gotham/graph-partition、nameGothamGraphPartition、meta.title「图分区压缩」、requiresAuth 为真,挂在 GothamLayout 子路由;侧边栏入口见 GothamLayout.vue 菜单「图分区压缩」。前端源码action/web/src/views/gotham/GraphPartitionPage.vue(380 行),API 客户端为 gothamClient.js 直连。 - 认证:
aip_token+gotham_refresh_token;本页接口挂/analysis/graph/*admin 组,非 admin 角色返回 403{"code":"AUTHZ_ERROR","error":"admin role required"}。 - 端口 18083,API 前缀
/gotham-api/v1。
3. 界面布局
+---------------------------------------------------------------+
| Gotham 图分区与压缩 [刷新] |
+---------------------------------------------------------------+
| [alert 操作结果提示条(可关闭)] |
+---------------------------------------------------------------+
| [分区参数] Levels | MinCommunitySize | Parallel |
| [运行分区] 共 N 个社区,模块度 X |
+---------------------------------------------------------------+
| [多层折叠统计(K 层)] 层 | 社区数 | 模块度 |
+---------------------------------------------------------------+
| [社区统计(N)] 社区 | 大小 | Top 标签 | 成员预览 |
+---------------------------------------------------------------+
| [社区关系可视化] [社区规模分布柱状图] [社区间关系桑基图] |
+---------------------------------------------------------------+
| [历史分区记录(M)] ID | 参数 | 模块度 | 创建时间 |
+---------------------------------------------------------------+
- 页头:标题 +「刷新」(重载历史分区记录)。
- 分区参数卡片:Levels / MinCommunitySize / Parallel 三个数值输入 +「运行分区」。
- 多层折叠统计表:每层的社区数与模块度。
- 社区统计表:社区 ID、大小、Top 标签与成员预览(前 12 个节点 ID)。
- 社区关系可视化:ECharts 柱状图(社区规模分布)+ 桑基图(社区间关系,边权 = 社区间原始边计数)。
- 历史分区记录表:最近 100 条分区记录。
4. 交互元素
| 控件 | 位置 | 含义与作用 |
|---|---|---|
| Levels | 分区参数卡片 | 多层折叠迭代次数(默认 2),每轮后按社区折叠再跑一轮 |
| MinCommunitySize | 分区参数卡片 | 小社区合并阈值(默认 3),成员数小于该值的社区并入共享边权最大的邻居 |
| Parallel | 分区参数卡片 | 并行 goroutine 数(默认 4),邻居遍历按节点分片并行,小图自动降级串行 |
| 「运行分区」 | 分区参数卡片 | POST /analysis/graph/partition,运行中禁用并显示「分区中…」,成功后展示汇总「共 N 个社区,模块度 X」 |
| 「刷新」 | 页头 | 重载历史分区记录 |
5. 后端关联
| 方法 | 路径 | 用途 |
|---|---|---|
| POST | /analysis/graph/partition | 执行分区,body {levels, min_community_size, parallel},同参数命中缓存直接返回 |
| GET | /analysis/graph/partitions | 历史分区记录(ga_partitions,created_at 倒序,最多 100 条) |
关键机制
分区算法:simplifiedLouvain 多层折叠——每轮发现社区后按社区折叠压缩图再跑下一轮(共 Levels 轮),min_community_size 把过小社区并入共享边权最大的邻居社区,parallel 控制邻居遍历并行度。
响应结构 PartitionResult:communities(nodeID → 社区ID 映射)、modularity(最终划分在原图上的模块度,保留 4 位小数)、levels[](每层 {level, communities, modularity})、compressed(压缩图摘要 SubgraphSummary{nodes: CommunityNode[{community_id,size,top_labels}], edges: CommunityEdge[{from,to,weight}]})。
缓存:请求按参数 hash 查 ga_partitions 缓存,同参数命中直返;未命中执行后写缓存(保存失败仅 warn 不影响返回)。
前端成员预览:从 communities 反查属于某社区的节点 ID(取前 12 个),社区 ID 前缀 c 在反查时剥离。
6. 权限与安全
- 认证:JWT Bearer;
/analysis/graph/*挂 admin 中间件,rbacService.IsUserAdmin判定,非 admin 403。 - 只读分析能力:分区只读图数据、写缓存表,不改写节点/边,安全面小。
- 写操作防护:仅缓存写(ga_partitions),无业务数据变更,无需审计写路径。
7. 常见问题与排错
7.1 点「运行分区」提示 403
- 现象:提示「分区失败:...」且 DevTools 里返回 403
AUTHZ_ERROR。 - 原因:当前用户非 admin 角色,
/analysis/graph/*为管理能力。 - 处理:使用 admin 角色账号操作;或让管理员在 RBAC 中授予 admin 角色。
7.2 分区完成但表格显示「空图」
- 现象:汇总正常但「多层折叠统计」与「社区统计」为空。
- 原因:图存储中没有节点/边,或压缩图摘要为空。
- 处理:先在图谱映射页配置并执行图谱化,确认图中有数据后再运行分区。
7.3 桑基图区域显示「暂无社区间关系」
- 现象:左侧柱状图正常,右侧桑基图显示提示文字。
- 原因:压缩图仅一个社区或无跨社区边,
compressed.edges为空。 - 处理:属预期展示,调整分区参数(如减小 min_community_size)后重跑可能产生更多社区间边。
7.4 历史分区记录为空
- 现象:「历史分区记录(0)」,且控制台有 404 警告。
- 原因:
GET /analysis/graph/partitions返回 404(表未迁移)时前端静默忽略。 - 处理:确认 gotham bootstrap 已执行 task.AutoMigrate / ga_partitions 迁移;重启后端后重试。
8. 已知缺陷与边界
| 缺陷/边界 | 说明 |
|---|---|
| 仅 admin 可执行 | /analysis/graph/partition 挂 admin 中间件,非 admin 403 |
| 参数缓存 | 同参数重复运行直接返回缓存结果,不会反映图中新增数据(需变更参数或清缓存) |
| 历史最多 100 条 | 后端 Limit(100) 硬编码,前端无分页 |
| 图表无数据时降级 | 空图时多层统计/社区统计显示「空图」,桑基图显示提示文案 |
| 可视化基于压缩图 | 柱状图/桑基图仅使用 compressed 摘要,不展开社区内部结构 |