名称:使用图数据库 描述:图数据库实现,适用于关系密集的数据模型。在构建社交网络、推荐引擎、知识图谱或欺诈检测时使用。涵盖Neo4j(主要)、ArangoDB、Amazon Neptune、Cypher查询模式和图形数据建模。
图数据库
目的
本技能指导选择和实现图数据库,适用于实体间关系为一等公民的应用。与通过外键和连接建模关系的关系数据库不同,图数据库原生将连接表示为属性,支持高效的遍历密集型查询。
何时使用此技能
在以下情况使用图数据库:
- 深度关系遍历(4+跳):“朋友的朋友的朋友”
- 变量/演化关系:模式变更不会破坏现有查询
- 路径查找:最短路径、网络分析、依赖链
- 模式匹配:欺诈检测、推荐引擎、访问控制
不要在以下情况使用图数据库:
- 固定模式且连接浅(2-3表)→ 使用PostgreSQL
- 主要为聚合/分析 → 使用列式数据库
- 仅键值查找 → 使用Redis/DynamoDB
快速决策框架
数据特性?
├── 固定模式,浅连接(≤3跳)
│ └─ PostgreSQL(关系型)
│
├── 已使用PostgreSQL + 简单图形
│ └─ Apache AGE(PostgreSQL扩展)
│
├── 深度遍历(4+跳)+ 通用目的
│ └─ Neo4j(经过实战检验,最大生态系统)
│
├── 多模型(文档 + 图形)
│ └─ ArangoDB
│
├── AWS原生,无服务器
│ └─ Amazon Neptune
│
└── 实时流处理,内存中
└─ Memgraph
核心概念
属性图模型
图数据库将数据存储为:
- 节点(顶点):带有标签和属性的实体
- 关系(边):带有属性的类型化连接
- 属性:节点和关系上的键值对
(人物 {名字: "爱丽丝", 年龄: 28})-[:朋友 {自: "2020-01-15"}]->(人物 {名字: "鲍勃"})
查询语言
| 语言 | 数据库 | 可读性 | 最佳用途 |
|---|---|---|---|
| Cypher | Neo4j, Memgraph, AGE | ⭐⭐⭐⭐⭐ 类SQL | 通用目的 |
| Gremlin | Neptune, JanusGraph | ⭐⭐⭐ 函数式 | 跨数据库 |
| AQL | ArangoDB | ⭐⭐⭐⭐ 类SQL | 多模型 |
| SPARQL | Neptune, RDF存储 | ⭐⭐⭐ W3C标准 | 语义网 |
常见Cypher模式
参考references/cypher-patterns.md获取完整示例。
模式1:基本匹配
// 查找公司所有用户
MATCH (u:用户)-[:工作于]->(c:公司 {名称: 'Acme Corp'})
RETURN u.名称, u.标题
模式2:可变长度路径
// 查找最多3度距离的朋友
MATCH (u:用户 {名称: '爱丽丝'})-[:朋友*1..3]->(朋友)
WHERE u <> 朋友
RETURN DISTINCT 朋友.名称
LIMIT 100
模式3:最短路径
// 查找两个用户间最短连接
MATCH 路径 = shortestPath(
(a:用户 {名称: '爱丽丝'})-[*]-(b:用户 {名称: '鲍勃'})
)
RETURN 路径, length(路径) AS 距离
模式4:推荐
// 协同过滤:相似用户喜欢的产品
MATCH (u:用户 {id: $用户Id})-[:购买]->(p:产品)<-[:购买]-(相似)
MATCH (相似)-[:购买]->(推荐:产品)
WHERE NOT exists((u)-[:购买]->(推荐))
RETURN 推荐.名称, count(*) AS 分数
ORDER BY 分数 DESC
LIMIT 10
模式5:欺诈检测
// 检测循环资金流
MATCH 路径 = (a:账户)-[:发送*3..6]->(a)
WHERE all(r IN relationships(路径) WHERE r.金额 > 1000)
RETURN 路径, [r IN relationships(路径) | r.金额] AS 金额列表
数据库选择指南
Neo4j(主要推荐)
用于:通用目的图形应用
优势:
- 最成熟(2007年),最大社区(200万+开发者)
- 65+图形算法(GDS库):PageRank、Louvain、Dijkstra
- 最佳工具:Neo4j浏览器、Bloom可视化
- 全面的Cypher支持
安装:
# Python驱动
pip install neo4j
# TypeScript驱动
npm install neo4j-driver
# Rust驱动
cargo add neo4rs
参考:references/neo4j.md
ArangoDB
用于:多模型应用(文档 + 图形)
优势:
- 在一个数据库中存储文档和图形
- AQL结合文档和图形查询
- 具有关系的模式灵活性
参考:references/arangodb.md
Apache AGE
用于:向现有PostgreSQL添加图形功能
优势:
- 用图形查询扩展PostgreSQL
- 无需新基础设施
- 查询关系型和图形数据
参考:Implementation details in examples/
Amazon Neptune
用于:AWS原生,无服务器部署
优势:
- 完全托管,自动扩展
- 支持Gremlin和SPARQL
- AWS生态系统集成
图形数据建模模式
参考references/graph-modeling.md获取完整模式。
最佳实践1:关系作为一等公民
反模式(将关系存储在节点属性中):
// 错误
(:人物 {名称: '爱丽丝', 朋友_ids: ['b123', 'c456']})
模式(显式关系):
// 正确
(:人物 {名称: '爱丽丝'})-[:朋友]->(:人物 {id: 'b123'})
(:人物 {名称: '爱丽丝'})-[:朋友]->(:人物 {id: 'c456'})
最佳实践2:关系属性用于元数据
// 在关系上跟踪交互细节
(:人物)-[:朋友 {
自: '2020-01-15',
强度: 0.85,
最后交互: datetime()
}]->(:人物)
最佳实践3:有界遍历以提高性能
// 慢:无界遍历
MATCH (a)-[:朋友*]->(遥远)
RETURN 遥远
// 快:有界深度加索引
MATCH (a)-[:朋友*1..4]->(遥远)
WHERE 遥远.活跃 = true
RETURN 遥远
LIMIT 100
最佳实践4:避免超级节点
问题:具有数千关系的节点会减慢遍历。
解决方案:中间聚合节点
// 替代:(:用户)-[:发布]->(:帖子) [100万关系]
// 使用时间分区:
(:用户)-[:发布_于]->(:年 {年份: 2025})
-[:有_月份]->(:月 {月份: 12})
-[:有_帖子]->(:帖子)
用例示例
社交网络
模式和实现在examples/social-graph/中
关键特性:
- 朋友推荐(朋友的朋友)
- 共同连接
- 新闻源生成
- 影响力指标
用于AI/RAG的知识图谱
集成示例在examples/knowledge-graph/中
关键特性:
- 混合向量 + 图形搜索
- 实体关系映射
- LLM提示的上下文扩展
- 语义关系遍历
与向量数据库集成:
# 步骤1:在Qdrant/pgvector中进行向量搜索
向量结果 = qdrant.search(collection="概念", query_vector=嵌入)
# 步骤2:用图形关系扩展
概念_ids = [r.id for r in 向量结果]
图形上下文 = neo4j.run("""
MATCH (c:概念) WHERE c.id IN $ids
MATCH (c)-[:相关_于|是_一种*1..2]-(相关)
RETURN c, 相关, relationships(路径)
""", ids=概念_ids)
推荐引擎
示例在examples/social-graph/中
策略:
- 协同过滤:“购买X的用户也购买Y”
- 基于内容:“与您喜欢的产品相似”
- 基于会话:“最近查看的物品”
欺诈检测
模式检测在examples/中
检测模式:
- 循环资金流
- 跨账户共享设备
- 快速交易链
- 连接模式异常
性能优化
参考references/cypher-patterns.md获取详细优化。
索引
// 单属性索引
CREATE INDEX 用户_邮箱 FOR (u:用户) ON (u.邮箱)
// 复合索引(Neo4j 5.x+)
CREATE INDEX 用户_名称_位置 FOR (u:用户) ON (u.名称, u.位置)
// 全文搜索
CREATE FULLTEXT INDEX 产品_搜索 FOR (p:产品) ON EACH [p.名称, p.描述]
缓存昂贵聚合
// 将朋友计数物化为属性
MATCH (u:用户)-[:朋友]->(f)
WITH u, count(f) AS 朋友计数
SET u.朋友_计数 = 朋友计数
// 查询变为即时
MATCH (u:用户) WHERE u.朋友_计数 > 100
RETURN u.名称, u.朋友_计数
扩展策略
| 规模 | 策略 | 实现 |
|---|---|---|
| 垂直 | 添加RAM/CPU | 内存缓存,更大实例 |
| 水平(读) | 读副本 | Neo4j集群,ArangoDB集群 |
| 水平(写) | 分片 | ArangoDB SmartGraphs,JanusGraph |
| 缓存 | 应用级缓存 | Redis用于热门路径 |
语言集成
Python(Neo4j)
完整示例在examples/social-graph/python-neo4j/中
from neo4j import GraphDatabase
class 图形数据库:
def __init__(self, uri: str, 用户: str, 密码: str):
self.driver = GraphDatabase.driver(uri, auth=(用户, 密码))
def 查找朋友的朋友(self, 用户_id: str, 最大深度: int = 2):
query = """
MATCH (u:用户 {id: $用户Id})-[:朋友*1..$最大深度]->(朋友的朋友)
WHERE u <> 朋友的朋友
RETURN DISTINCT 朋友的朋友.id, 朋友的朋友.名称
LIMIT 100
"""
with self.driver.session() as session:
result = session.run(query, 用户Id=用户_id, 最大深度=最大深度)
return [dict(record) for record in result]
# 使用
数据库 = 图形数据库("bolt://localhost:7687", "neo4j", "密码")
朋友 = 数据库.查找朋友的朋友("u123", 最大深度=3)
TypeScript(Neo4j)
完整示例在examples/social-graph/typescript-neo4j/中
import neo4j, { Driver } from 'neo4j-driver'
class Neo4j服务 {
private driver: Driver
constructor(uri: string, 用户名: string, 密码: string) {
this.driver = neo4j.driver(uri, neo4j.auth.basic(用户名, 密码))
}
async 查找朋友的朋友(用户Id: string, 最大深度: number = 2) {
const session = this.driver.session()
try {
const result = await session.run(
`MATCH (u:用户 {id: $用户Id})-[:朋友*1..$最大深度]->(朋友的朋友)
WHERE u <> 朋友的朋友
RETURN DISTINCT 朋友的朋友.id, 朋友的朋友.名称
LIMIT 100`,
{ 用户Id, 最大深度 }
)
return result.records.map(r => r.toObject())
} finally {
await session.close()
}
}
}
Go(ArangoDB)
import (
"github.com/arangodb/go-driver"
"github.com/arangodb/go-driver/http"
)
func 查找朋友的朋友(数据库 driver.Database, 用户Id string, 最大深度 int) ([]用户, error) {
query := `
FOR 顶点, 边, 路径 IN 1..@最大深度 OUTBOUND @起始顶点 GRAPH '社交图形'
FILTER 顶点._id != @起始顶点
RETURN DISTINCT 顶点
LIMIT 100
`
cursor, err := 数据库.Query(ctx, query, map[string]interface{}{
"起始顶点": 用户Id,
"最大深度": 最大深度,
})
// 处理结果...
}
模式验证
使用scripts/validate_graph_schema.py检查:
- 无界遍历(缺少深度限制)
- 频繁查询属性上缺少索引
- 超级节点(关系过多的节点)
- 关系属性一致性
运行验证:
python scripts/validate_graph_schema.py --database neo4j://localhost:7687
与其他技能集成
与databases-vector(混合搜索)
结合向量相似性和图形上下文用于AI/RAG应用。
见examples/knowledge-graph/
与search-filter
实现基于关系的查询:“查找所有在3度连接内的用户”
与ai-chat
使用知识图谱通过结构化关系丰富LLM上下文。
与auth-security(ReBAC)
实现基于关系的访问控制:“用户X能否通过关系Z访问资源Y?”
常见模式模式
星型模式(中心和辐条)
(:用户)-[:购买]->(:产品)
(:用户)-[:查看]->(:产品)
(:用户)-[:评分]->(:产品)
层次模式(树)
(:首席执行官)-[:管理]->(:副总裁)-[:管理]->(:总监)
时间模式(事件序列)
(:事件 {时间戳})-[:下一个]->(:事件 {时间戳})
入门指南
- 选择数据库:使用上述决策框架
- 设计模式:参考
references/graph-modeling.md - 实现查询:使用
references/cypher-patterns.md中的模式 - 验证:运行
scripts/validate_graph_schema.py - 优化:添加索引、有界遍历、缓存聚合
进一步阅读
references/neo4j.md- Neo4j设置、驱动、GDS算法references/arangodb.md- ArangoDB多模型模式references/cypher-patterns.md- 全面的Cypher查询库references/graph-modeling.md- 数据建模最佳实践examples/social-graph/- 完整的社交网络实现examples/knowledge-graph/- 用于AI/RAG的混合向量 + 图形