3. 图数据库与图计算基础

在批流一体图谱API体系中,图数据库负责在线存储与实时查询,图计算框架负责离线/批量大规模图分析。两者互补,共同支撑从“存储查询”到“计算挖掘”的全链路能力。本节聚焦核心概念与主流选型。

3.1 图数据库核心概念

图数据库以节点(Vertex)、边(Edge)和属性(Property)为基本数据模型,天然适合表达关联关系。与关系型数据库的JOIN操作相比,图数据库在深度遍历和关联查询上性能提升显著。

概念 说明 示例
节点 实体对象,可带标签(Label)分类 用户、订单、商品
边 节点间有向/无向关系,可带类型(Type) 购买、关注、属于
属性 节点或边的键值对描述 用户姓名、下单时间
遍历 按图结构路径访问节点/边 查找“朋友的朋友”
索引 加速属性或全文检索 用户ID索引、名称全文索引

3.1.1 Neo4j 核心特性

  • 原生图存储:采用“免索引邻接”架构,遍历速度与图大小无关。
  • 查询语言 Cypher:声明式模式匹配,语法直观,适合开发与运维。
  • ACID 事务:单实例强一致性,适合在线交易型图谱场景。
  • 集群模式:主从复制 + 因果集群,支持读写分离与高可用。
适用场景:社交关系、实时推荐、知识图谱、权限管理。Neo4j 在中小规模(百亿节点以内)在线查询场景中表现优异。

3.1.2 JanusGraph 核心特性

  • 分布式可扩展:底层依赖 HBase/Cassandra/ScyllaDB 等 NoSQL 存储,支持水平扩展。
  • 多后端集成:存储后端、索引后端(Elasticsearch/Solr)可独立选型。
  • Gremlin 查询语言:Apache TinkerPop 标准,支持图遍历与复杂分析。
  • 事务与并发:基于后端存储的乐观锁或悲观锁,适合大规模写入场景。
注意:JanusGraph 不提供原生图存储,遍历性能依赖后端存储的局部性;部署运维复杂度高于 Neo4j,适合超大规模(千亿级)或已有 Hadoop/NoSQL 基础设施的团队。

3.2 图数据库选型对比

维度 Neo4j JanusGraph
存储架构 原生图存储 后端 NoSQL 存储
查询语言 Cypher Gremlin
事务模型 ACID(单机/集群) 依赖后端(最终一致性常见)
水平扩展 有限(因果集群) 强(存储后端分片)
在线查询 ★★★★★ ★★★★
批量写入 ★★★ ★★★★★
生态成熟度 高(社区、工具、文档) 中(Apache 项目)

3.3 图计算框架简介

图计算框架面向全图迭代分析,典型算法包括 PageRank、连通分量、社区发现、最短路径等。与图数据库的“单次查询”不同,图计算通常需要多轮超步(Superstep)迭代,适合离线或准实时场景。

3.3.1 Apache Spark GraphX

  • 基于 RDD/DataFrame:将图表示为顶点表 + 边表,复用 Spark 调度与容错。
  • Pregel API:顶点中心编程模型,支持自定义消息传递与聚合。
  • 与批流一体集成:可直接读取 Kafka、HDFS 数据构建图,输出结果写入数据库或消息队列。
  • 性能特点:适合百亿级边以内的图分析;迭代开销受 Spark Shuffle 影响。

3.3.2 Apache Flink Gelly

  • 基于 Flink DataSet/DataStream:利用 Flink 的流批一体能力,支持有状态迭代。
  • 迭代模型:支持 Bulk Iteration 和 Delta Iteration,适合收敛型算法。
  • 库函数丰富:内置 PageRank、Connected Components、Label Propagation 等常用算法。
  • 与 Flink 生态融合:可与 Flink SQL、CEP、State 无缝衔接,实现实时图计算。
选型建议:如果团队已有 Spark 技术栈且图规模在百亿级以内,优先选择 GraphX;如果团队正在构建流批一体数据平台,且需要实时图更新与计算,Flink Gelly 是更自然的选择。

3.4 图数据库与图计算协同架构

下图展示了一个典型的批流一体图谱平台中,图数据库与图计算框架的协同关系:

图数据库与图计算协同架构 图数据库与图计算协同架构 数据源层:Kafka / HDFS / 关系型数据库 / 日志 图计算层:GraphX / Gelly 批量迭代:PageRank、连通分量、社区发现 图数据库:Neo4j / JanusGraph 在线存储、实时查询、事务写入 API 服务层:图谱查询 / 分析结果 REST / gRPC / WebSocket 业务应用:推荐、风控、搜索、知识图谱

3.5 图计算核心流程

以 GraphX 的 Pregel 模型为例,一次典型的图计算迭代包含以下步骤:

  1. 初始化:为每个顶点设置初始值(如 PageRank 初始 1/N)。
  2. 发送消息:每个顶点根据当前状态向邻居发送消息。
  3. 接收消息:顶点聚合所有入边消息,更新自身状态。
  4. 收敛判断:检查是否达到最大迭代次数或状态变化小于阈值。
  5. 输出结果:将最终顶点状态写入外部存储或返回给 API 层。
批流一体中的图计算:在批处理模式下,GraphX/Gelly 读取全量数据构建静态图;在流处理模式下,Flink Gelly 支持动态图更新(边/节点增删改),实现“边流入、边计算”的准实时图谱分析。

3.6 本章小结

  • 图数据库(Neo4j / JanusGraph)负责在线存储与实时查询,选型需权衡原生图性能与分布式扩展能力。
  • 图计算框架(GraphX / Gelly)负责批量迭代分析,与批流一体平台天然集成。
  • 实际生产环境中,图数据库与图计算框架协同工作:图计算产出离线特征写入图数据库,图数据库支撑在线 API 查询。
  • 下一章将深入图数据库的 API 封装与发布实践,包括 Cypher/Gremlin 查询优化与 REST 接口设计。