Files
X-Agents/team-require/web/neo4j-graphs.md
DESKTOP-72TV0V4\caoxiaozhu c917d6b04c feat: 添加Neo4j图数据库支持及前端代码重构
- 新增 Neo4j 图数据库 handler、service、model
- 后端添加 SaveGraph API 接口
- 前端 Database.vue 重构,拆分为独立组件
- 新增 web/src/views/database/ 组件目录
- 删除临时文件 (temp_*.go)
- 添加 Neo4j 相关 API 需求文档

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 09:11:08 +08:00

197 lines
5.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 后端需求 - Neo4j 图谱数据获取(完善版)
## 需求描述
Neo4j 连接成功后,需要获取图谱数据供前端可视化展示。前端使用 ECharts 力导向图谱展示科幻风格效果。
## Neo4j 图谱核心概念
Neo4j 是图数据库,与关系型数据库概念不同:
- **Node节点** - 类似于表,但不需要固定结构
- **Label标签** - 类似于表的类型名(如 User, Order
- **Relationship关系** - 节点之间的边
- **Relationship Type关系类型** - 关系的类型(如 KNOWS, OWNS
## 后端需要提供的接口
### 1. 获取图谱概览数据(核心接口)
返回所有 Label标签和 Relationship Type关系类型的统计信息。这是前端图谱可视化的核心数据来源。
**接口地址:** `POST /database/check` (复用现有接口,在 db_type 为 Neo4j 时返回图谱数据)
**请求参数:**
```json
{
"db_type": "Neo4j",
"uri": "bolt://localhost:7687",
"username": "neo4j",
"password": "password",
"database": "neo4j"
}
```
**返回参数:**
```json
{
"success": true,
"graphs": {
"labels": [
{"name": "User", "count": 1523},
{"name": "Order", "count": 856},
{"name": "Product", "count": 2341},
{"name": "Category", "count": 45},
{"name": "Review", "count": 5678}
],
"relationshipTypes": [
{"name": "KNOWS", "count": 2341},
{"name": "BOUGHT", "count": 5678},
{"name": "BELONGS_TO", "count": 2341},
{"name": "HAS_REVIEW", "count": 5678},
{"name": "LOCATED_IN", "count": 1523}
]
}
}
```
### 2. 获取节点详情(可选,用于点击显示)
点击某个 Label 节点时,获取该类型节点的样本数据用于详情展示。
**接口地址:** `POST /database/neo4j/nodes`
**请求参数:**
```json
{
"uri": "bolt://localhost:7687",
"username": "neo4j",
"password": "password",
"database": "neo4j",
"label": "User",
"limit": 5
}
```
**返回参数:**
```json
{
"success": true,
"nodes": [
{"id": "1", "name": "张三", "email": "zhangsan@example.com", "created_at": "2024-01-01"},
{"id": "2", "name": "李四", "email": "lisi@example.com", "created_at": "2024-01-02"}
],
"properties": [
{"name": "id", "type": "string"},
{"name": "name", "type": "string"},
{"name": "email", "type": "string"},
{"name": "created_at", "type": "datetime"}
]
}
```
### 3. 获取关系详情(可选)
获取两个节点之间的关系数据。
**接口地址:** `POST /database/neo4j/relationships`
**请求参数:**
```json
{
"uri": "bolt://localhost:7687",
"username": "neo4j",
"password": "password",
"database": "neo4j",
"relationshipType": "KNOWS",
"limit": 10
}
```
**返回参数:**
```json
{
"success": true,
"relationships": [
{
"id": "rel-1",
"source": "1",
"target": "2",
"properties": {"since": "2020-01-01"}
}
]
}
```
## 数据结构说明
### graphs.labels[] - 标签列表(前端图谱节点)
| 字段 | 类型 | 说明 | 用途 |
|------|------|------|------|
| name | string | 标签名称(如 User, Order | 作为图谱节点显示 |
| count | int | 该标签的节点数量 | 计算节点大小 symbolSize |
### graphs.relationshipTypes[] - 关系类型列表(前端图谱边)
| 字段 | 类型 | 说明 | 用途 |
|------|------|------|------|
| name | string | 关系类型(如 KNOWS, OWNS | 作为图谱边的标签 |
| count | int | 该关系的数量 | 可能影响边的粗细 |
### nodes[] - 节点详情
| 字段 | 类型 | 说明 |
|------|------|------|
| id | string | 节点唯一标识 |
| (其他) | any | 节点的其他属性 |
### relationships[] - 关系详情
| 字段 | 类型 | 说明 |
|------|------|------|
| id | string | 关系唯一标识 |
| source | string | 起始节点ID |
| target | string | 目标节点ID |
| properties | object | 关系属性 |
## 前端图谱展示逻辑
前端使用 ECharts 力导向图谱force-directed graph展示方式如下
1. **节点生成**
- 根据 `graphs.labels` 数组生成节点
- `name` 作为节点显示名称
- `count` 决定节点大小symbolSize = log2(count+1) * 12
- 节点颜色按索引分配科幻配色(紫、蓝、绿、橙、粉、青)
- 节点带发光效果shadowBlur: 20
2. **边生成**
- 根据 `graphs.relationshipTypes` 生成边
- 边 label 显示关系类型名称
- 曲线连接curveness: 0.2
- 带箭头
3. **交互效果**
- 弹簧物理效果force layout
- 节点可拖拽
- 滚轮缩放
- hover 相邻节点高亮
## 优先级
高 - Neo4j 可视化的核心数据
## 注意事项
1. Neo4j 连接使用官方 Go 驱动:`github.com/neo4j/neo4j-go-driver`
2. 注意处理连接超时和认证失败的情况
3. 大数据量时需要限制返回数量limit 参数)
4. **建议返回足够多的关系类型**(建议至少 5-10 个),以便前端生成丰富的图谱连接
5. 如果关系类型少于节点数,可以创建额外连接让图谱更美观
## 前端缓存策略
### 方案设计
- **首次加载**:获取数据并缓存
- **第二次展示**:直接使用缓存,秒开
- **刷新按钮**:用户手动点击刷新获取最新数据
### 实现说明
前端会缓存图谱数据,第二次进入时直接展示缓存数据,提升用户体验。同时提供"刷新"按钮供用户手动刷新。