# 后端需求 - 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. 如果关系类型少于节点数,可以创建额外连接让图谱更美观 ## 前端缓存策略 ### 方案设计 - **首次加载**:获取数据并缓存 - **第二次展示**:直接使用缓存,秒开 - **刷新按钮**:用户手动点击刷新获取最新数据 ### 实现说明 前端会缓存图谱数据,第二次进入时直接展示缓存数据,提升用户体验。同时提供"刷新"按钮供用户手动刷新。