图数据库应用技能Skill using-graph-databases

这个技能专注于图数据库的选择、实现和应用,用于处理深度关系遍历、模式匹配和路径查找,适用于社交网络、推荐系统、知识图谱和欺诈检测等场景。关键词:图数据库、Neo4j、Cypher、关系建模、查询优化、数据科学、后端开发。

后端开发 0 次安装 0 次浏览 更新于 3/23/2026

名称:使用图数据库 描述:图数据库实现,适用于关系密集的数据模型。在构建社交网络、推荐引擎、知识图谱或欺诈检测时使用。涵盖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/

策略

  1. 协同过滤:“购买X的用户也购买Y”
  2. 基于内容:“与您喜欢的产品相似”
  3. 基于会话:“最近查看的物品”

欺诈检测

模式检测在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?”

常见模式模式

星型模式(中心和辐条)

(:用户)-[:购买]->(:产品)
(:用户)-[:查看]->(:产品)
(:用户)-[:评分]->(:产品)

层次模式(树)

(:首席执行官)-[:管理]->(:副总裁)-[:管理]->(:总监)

时间模式(事件序列)

(:事件 {时间戳})-[:下一个]->(:事件 {时间戳})

入门指南

  1. 选择数据库:使用上述决策框架
  2. 设计模式:参考references/graph-modeling.md
  3. 实现查询:使用references/cypher-patterns.md中的模式
  4. 验证:运行scripts/validate_graph_schema.py
  5. 优化:添加索引、有界遍历、缓存聚合

进一步阅读

  • 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的混合向量 + 图形