图数据库选型指南:Neo4j vs TigerGraph vs NebulaGraph

选型的核心问题

图数据库市场从 2020 年开始快速增长,主流产品已超过 30 种。对于知识图谱的生产落地,选择合适的图数据库直接决定了项目的可行性、性能天花板和运维成本。本文聚焦三个最具代表性的产品:Neo4j(全球市场份额第一)、TigerGraph(高性能分析型)、NebulaGraph(国产分布式),从架构、性能、生态、成本四个维度做工程级对比。


产品定位与架构对比

三者定位

┌─────────────────────────────────────────────────────────────┐
│                   图数据库定位光谱                            │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  OLTP(事务型)                              OLAP(分析型)  │
│  ←─────────────────────────────────────────────────────→    │
│                                                             │
│      Neo4j                NebulaGraph           TigerGraph   │
│        │                      │                     │       │
│   事务一致性强            分布式+事务           分析性能极致  │
│   生态最丰富              水平扩展               图算法强    │
│   单机性能好              成本较低               深度遍历快  │
└─────────────────────────────────────────────────────────────┘

架构对比

维度 Neo4j TigerGraph NebulaGraph
存储引擎 原生图存储(索引游离指针) 原生图存储(压缩邻接表) 分布式 KV(RocksDB)
查询语言 Cypher (GQL 标准) GSQL nGQL (兼容部分 Cypher)
分布式 Enterprise 集群 (Raft) 原生分布式 原生分布式 (Raft)
事务 ACID (完整) ACID (有限制) ACID (快照隔离)
开源 Community 版开源 免费 Developer 版 完全开源 (Apache 2.0)
架构风格 共享存储集群 MPP 并行计算 存算分离

架构图对比

Neo4j 集群架构:
┌──────────┐  ┌──────────┐  ┌──────────┐
│  Core 1  │  │  Core 2  │  │  Core 3  │
│ (Leader) │──│(Follower)│──│(Follower)│
│ 读 + 写  │  │ 读 + 写  │  │ 读 + 写  │
└──────────┘  └──────────┘  └──────────┘
      │
┌─────▼─────┐ ┌───────────┐
│  Read     │ │  Read     │
│  Replica  │ │  Replica  │
└───────────┘ └───────────┘

TigerGraph 架构:
┌───────────────────────────────────┐
│          REST API 层              │
└───────────────┬───────────────────┘
                │
┌───────────────▼───────────────────┐
│        GPE (Graph Processing)     │
│  Partition 1 │ Partition 2 │ ...  │
│  (并行计算)  │  (并行计算)  │      │
└───────────────┬───────────────────┘
                │
┌───────────────▼───────────────────┐
│        GSE (Graph Storage)        │
│        分区存储 + 副本             │
└───────────────────────────────────┘

NebulaGraph 架构:
┌──────────────────┐
│   Graph Client   │
└────────┬─────────┘
         │
┌────────▼─────────┐
│   graphd (计算)   │──── 无状态,水平扩展
└────────┬─────────┘
         │
┌────────▼─────────┐
│   metad (元数据)  │──── Raft 共识
└────────┬─────────┘
         │
┌────────▼─────────┐
│  storaged (存储)  │──── 分片 + 副本
│   基于 RocksDB    │
└──────────────────┘

查询语言对比

同一查询的三种写法

查询需求:找到"张三"的朋友的朋友中在"腾讯"工作的人。

Cypher (Neo4j):

MATCH (p:Person {name: "张三"})-[:KNOWS*2]->(fof:Person)-[:WORKS_AT]->(c:Company {name: "腾讯"})
WHERE p <> fof
RETURN DISTINCT fof.name AS friend_of_friend;

GSQL (TigerGraph):

CREATE QUERY find_fof_at_company(STRING person_name, STRING company_name) FOR GRAPH social {
  SetAccum<STRING> @@results;

  start = {Person.*};
  level1 = SELECT t FROM start:s -(KNOWS)-> Person:t
            WHERE s.name == person_name;

  level2 = SELECT t FROM level1:s -(KNOWS)-> Person:t
            WHERE t.name != person_name;

  targets = SELECT t FROM level2:s -(WORKS_AT)-> Company:t
            WHERE t.name == company_name;

  result = SELECT s FROM level2:s -(WORKS_AT)-> Company:t
           WHERE t.name == company_name
           ACCUM @@results += s.name;

  PRINT @@results;
}

nGQL (NebulaGraph):

GO 2 STEPS FROM "张三" OVER KNOWS YIELD dst(edge) AS fof
| GO FROM $-.fof OVER WORKS_AT WHERE properties($$).name == "腾讯"
  YIELD $-.fof AS friend_of_friend;

-- 或使用 MATCH 语法(NebulaGraph 3.x+)
MATCH (p:Person {name: "张三"})-[:KNOWS*2]->(fof:Person)-[:WORKS_AT]->(c:Company {name: "腾讯"})
WHERE p <> fof
RETURN DISTINCT fof.name;

查询语言对比总结

特性 Cypher (Neo4j) GSQL (TigerGraph) nGQL (NebulaGraph)
学习曲线 低(类 SQL) 高(过程式) 中(GO + MATCH)
表达力 极高(图灵完备) 中高
模式匹配 原生支持 需手写遍历 支持(3.x+)
变长路径 *1..5 语法 需循环 GO N STEPS
子图返回 原生支持 需额外处理 支持
聚合分析 内置 累加器 (Accum) 内置
存储过程 APOC 插件 原生(编译优化) UDF
GQL 标准化 主推 GQL 标准 自有语言 兼容部分 Cypher

性能基准对比

测试环境

硬件配置:
  CPU: 32 核 (Intel Xeon)
  内存: 128 GB
  存储: NVMe SSD 1 TB
  网络: 10 Gbps

数据集:
  节点数: 1000 万
  边数: 1 亿
  属性: 平均每节点 5 个属性

核心场景性能

查询场景 Neo4j 5.x TigerGraph 4.x NebulaGraph 3.x 说明
单点查询(1 跳) 1-2 ms 2-3 ms 3-5 ms Neo4j 索引游离最快
2 跳邻域 5-15 ms 3-8 ms 10-20 ms TigerGraph 并行优势
3 跳邻域 50-200 ms 10-30 ms 80-300 ms TigerGraph 深度遍历强
最短路径(6 跳内) 100-500 ms 20-80 ms 200-800 ms TigerGraph MPP 并行
PageRank(全图) 分钟级 秒级 十秒级 TigerGraph 图算法最强
社区检测(全图) 分钟级 秒级 十秒级 TigerGraph 内置算法库
批量写入(100万边/批) 30-60 s 20-40 s 15-30 s NebulaGraph 写入快
ACID 事务延迟 5-10 ms 10-20 ms 8-15 ms Neo4j 事务最成熟

性能分析

性能特征总结:

Neo4j:
  优势 ──→ 短路径查询极快(索引游离指针)、事务一致性最强
  劣势 ──→ 深度遍历(>3跳)和全图分析性能下降明显
  适合 ──→ OLTP 场景、实时查询、事务性操作

TigerGraph:
  优势 ──→ 深度遍历和图算法性能极强(MPP + 编译优化)
  劣势 ──→ 事务支持相对较弱、查询语言学习成本高
  适合 ──→ 图分析、深度遍历、大规模图算法

NebulaGraph:
  优势 ──→ 水平扩展能力强、写入性能好、成本低
  劣势 ──→ 短路径查询略慢(KV 存储需额外查找)
  适合 ──→ 大规模图谱、高写入吞吐、成本敏感场景

生态与工具链

开发者生态

维度 Neo4j TigerGraph NebulaGraph
可视化工具 Neo4j Browser / Bloom GraphStudio NebulaGraph Studio / Explorer
驱动语言 Java/Python/JS/Go/C#/.NET Java/Python/JS/C++ Java/Python/Go/C++/Rust
ORM/ODM neomodel / py2neo 无成熟ORM nebula-python
ETL 工具 Neo4j Data Importer / APOC GSQL Loading Job NebulaGraph Importer
图算法库 GDS (Graph Data Science) 内置 100+ 算法 NebulaGraph Analytics
AI/ML 集成 LangChain / LlamaIndex pyTigerGraph + ML LangChain (社区)
向量索引 原生(5.18+) 不支持 不支持(需外部)
社区规模 极大(Stack Overflow 最多) 中等 中等(国内活跃)

LangChain 集成对比

Neo4j + LangChain:

from langchain_community.graphs import Neo4jGraph
from langchain.chains import GraphCypherQAChain
from langchain_openai import ChatOpenAI

graph = Neo4jGraph(url="bolt://localhost:7687", username="neo4j", password="password")

chain = GraphCypherQAChain.from_llm(
    llm=ChatOpenAI(model="gpt-4o", temperature=0),
    graph=graph,
    verbose=True,
    allow_dangerous_requests=True
)

result = chain.invoke({"query": "张三的朋友中谁在腾讯工作?"})

NebulaGraph + LangChain:

from langchain_community.graphs import NebulaGraph
from langchain.chains import NebulaGraphQAChain

graph = NebulaGraph(
    space="knowledge_graph",
    username="root",
    password="nebula",
    address="127.0.0.1",
    port=9669
)

chain = NebulaGraphQAChain.from_llm(
    llm=ChatOpenAI(model="gpt-4o", temperature=0),
    graph=graph,
    verbose=True
)

result = chain.invoke({"query": "张三的朋友中谁在腾讯工作?"})

TigerGraph + pyTigerGraph:

import pyTigerGraph as tg

conn = tg.TigerGraphConnection(
    host="http://localhost",
    graphname="knowledge_graph",
    username="tigergraph",
    password="password"
)

# TigerGraph 需要预定义查询
conn.gsql("""
CREATE QUERY friend_at_company(STRING person_name, STRING company_name) FOR GRAPH knowledge_graph {
  // ... GSQL 查询定义
}
""")

result = conn.runInstalledQuery("friend_at_company", params={
    "person_name": "张三",
    "company_name": "腾讯"
})

运维与成本对比

部署复杂度

维度 Neo4j TigerGraph NebulaGraph
Docker 单机 1 条命令 1 条命令 3 个容器(graphd/metad/storaged)
K8s 部署 Helm Chart Helm Chart Helm Chart / Operator
集群最小规模 3 Core 节点 3 节点 3 metad + 3 storaged + N graphd
配置复杂度 低(单文件) 中(多组件配置)
升级难度

成本对比

场景 Neo4j TigerGraph NebulaGraph
开发测试(单机) 免费 (Community) 免费 (Developer) 免费 (开源)
生产单机(中小规模) Enterprise 商业授权 Enterprise 商业授权 免费 (开源)
生产集群(大规模) Enterprise 商业授权 Enterprise 商业授权 免费 (开源)
云托管 AuraDB ($65/月起) TigerGraph Cloud NebulaGraph Cloud
商业支持 有 (全球) 有 (全球) 有 (国内为主)

成本估算示例(1 亿节点、10 亿边、3 节点集群):

Neo4j Enterprise:
  授权费: 约 $50,000-150,000/年(按核心数)
  基础设施: 3 台 64GB/16核 服务器 约 $3,000/月
  总计: 约 $86,000-186,000/年

TigerGraph Enterprise:
  授权费: 约 $80,000-200,000/年
  基础设施: 3 台 128GB/32核 服务器 约 $5,000/月
  总计: 约 $140,000-260,000/年

NebulaGraph (开源):
  授权费: 免费
  基础设施: 6 台 64GB/16核 服务器 约 $6,000/月
  商业支持(可选): 约 $20,000-50,000/年
  总计: 约 $72,000-122,000/年

选型决策矩阵

场景匹配度评分

评分标准:5 = 最佳,4 = 优秀,3 = 良好,2 = 可用,1 = 不推荐

场景 Neo4j TigerGraph NebulaGraph 推荐
知识图谱 + RAG 5 3 4 Neo4j
金融风控实时查询 5 4 4 Neo4j
社交网络分析 3 5 4 TigerGraph
推荐系统 4 5 4 TigerGraph
大规模图谱存储 3 4 5 NebulaGraph
供应链管理 4 5 4 TigerGraph
AI Agent 记忆 5 2 3 Neo4j
物联网设备图谱 3 3 5 NebulaGraph
学术研究 5 3 4 Neo4j
预算敏感项目 3 2 5 NebulaGraph

决策树

你的图数据库应该选哪个?

├── 数据规模 > 100 亿边?
│     └── 是 ──→ NebulaGraph 或 TigerGraph
│
├── 核心需求是深度图分析(PageRank/社区检测/路径分析)?
│     └── 是 ──→ TigerGraph
│
├── 核心需求是 OLTP(实时查询、事务一致性)?
│     └── 是 ──→ Neo4j
│
├── 需要与 LLM/AI 框架深度集成?
│     └── 是 ──→ Neo4j(生态最完整)
│
├── 预算有限,需要完全开源?
│     └── 是 ──→ NebulaGraph
│
├── 团队熟悉 Cypher?
│     └── 是 ──→ Neo4j 或 NebulaGraph(兼容 Cypher)
│
├── 需要国内部署和中文技术支持?
│     └── 是 ──→ NebulaGraph
│
└── 不确定?
      └── Neo4j(最安全的选择:生态、社区、文档最丰富)

混合架构方案

在实际生产中,不必只选一种图数据库。大型系统可采用混合架构:

┌───────────────────────────────────────────────────┐
│                   混合图数据库架构                   │
├───────────────────────────────────────────────────┤
│                                                   │
│  实时查询层(OLTP)        分析计算层(OLAP)        │
│  ┌──────────────┐        ┌──────────────┐        │
│  │   Neo4j      │        │  TigerGraph  │        │
│  │              │  同步   │              │        │
│  │  实时风控     │ ──→    │  图算法分析   │        │
│  │  KG+RAG 查询 │        │  社区检测     │        │
│  │  Agent 记忆  │        │  影响力传播   │        │
│  └──────────────┘        └──────────────┘        │
│         ↑                        │                │
│         │                        │                │
│         └────── 分析结果回写 ──────┘                │
│                                                   │
│  大规模存储层                                       │
│  ┌──────────────────────────────────────────┐     │
│  │            NebulaGraph                    │     │
│  │                                          │     │
│  │  全量数据存储 + 高吞吐写入 + 水平扩展      │     │
│  └──────────────────────────────────────────┘     │
└───────────────────────────────────────────────────┘

数据同步方案

class GraphDataSyncer:
    """图数据库间数据同步"""

    def __init__(self, source_session, target_session):
        self.source = source_session
        self.target = target_session

    def sync_incremental(self, since_timestamp: str):
        """增量同步:将源库中新增/修改的数据同步到目标库"""

        # 1. 从源库查询增量数据
        new_nodes = self.source.run(
            """
            MATCH (n)
            WHERE n.updated_at > datetime($since)
            RETURN labels(n) AS labels, properties(n) AS props
            """,
            since=since_timestamp
        ).data()

        new_edges = self.source.run(
            """
            MATCH (s)-[r]->(t)
            WHERE r.updated_at > datetime($since)
            RETURN s.id AS source_id, type(r) AS rel_type,
                   t.id AS target_id, properties(r) AS props
            """,
            since=since_timestamp
        ).data()

        # 2. 批量写入目标库
        for node in new_nodes:
            self.target.run(
                """
                MERGE (n:{label} {{id: $id}})
                SET n += $props
                """.format(label=node["labels"][0]),
                id=node["props"]["id"],
                props=node["props"]
            )

        for edge in new_edges:
            self.target.run(
                """
                MATCH (s {{id: $source_id}})
                MATCH (t {{id: $target_id}})
                MERGE (s)-[r:{rel_type}]->(t)
                SET r += $props
                """.format(rel_type=edge["rel_type"]),
                source_id=edge["source_id"],
                target_id=edge["target_id"],
                props=edge["props"]
            )

        return {
            "synced_nodes": len(new_nodes),
            "synced_edges": len(new_edges)
        }

迁移指南

Neo4j -> NebulaGraph 迁移

# 1. 导出 Neo4j 数据为 CSV
neo4j-admin database export neo4j --to-path=/export/

# 2. 在 NebulaGraph 中创建 Schema
nebula> CREATE SPACE knowledge_graph(partition_num=10, replica_factor=3, vid_type=FIXED_STRING(64));
nebula> USE knowledge_graph;
nebula> CREATE TAG Entity(name string, type string, description string);
nebula> CREATE EDGE RELATES_TO(type string, confidence double);

# 3. 使用 NebulaGraph Importer 导入
# 配置文件 importer.yaml
# 执行导入
nebula-importer --config importer.yaml

关键注意事项

迁移项 Neo4j -> NebulaGraph Neo4j -> TigerGraph
ID 策略 Neo4j 自增 ID -> Nebula VID(需指定) Neo4j 自增 ID -> TG primary key
属性类型 基本兼容 需类型映射
查询改写 Cypher -> nGQL(部分兼容) Cypher -> GSQL(需重写)
索引 重建索引 重建索引
事务语义 基本一致 需验证

总结

一句话推荐

  • Neo4j:如果你只选一个图数据库,选 Neo4j -- 生态最完整、学习资源最丰富、与 AI 框架集成最好。适合 OLTP、知识图谱、Agent 记忆。
  • TigerGraph:如果核心需求是图分析和深度遍历 -- PageRank、社区检测、影响力传播等场景,TigerGraph 的 MPP 架构性能碾压。适合金融分析、社交网络、推荐系统。
  • NebulaGraph:如果预算有限且数据量大 -- 完全开源、水平扩展好、写入性能强。适合大规模存储、物联网、成本敏感的国内项目。

最终建议

  1. 中小团队首选 Neo4j Community 快速验证
  2. 确认图分析是核心需求后再考虑 TigerGraph
  3. 数据量超过 50 亿边或预算有限时考虑 NebulaGraph
  4. 大型系统可采用混合架构:Neo4j (OLTP) + TigerGraph (OLAP) + NebulaGraph (存储)

Maurice | maurice_wen@proton.me