跳转到内容

Memgraph — 内存图数据库

是什么

Memgraph 是 2016 年克罗地亚萨格勒布团队(Dominik Tomicevic 等)做的内存优先图数据库,用 C++17/20 重写,主打实时图分析——把图数据全部装进 RAM,配合 neo4j 的查询语言 Cypher,让”实时反欺诈、实时推荐、实时监控”这种毫秒级图查询变得可能。

日常类比:neo4j 像图书馆——书放架子上,要查就翻架子(混合内存+磁盘);Memgraph 像把整座图书馆搬进会议桌——所有书都摊在你面前,伸手就拿(纯内存)。代价是会议桌就这么大,装不下整座图书馆。

一句话:Cypher 长得跟 Neo4j 一样,存储引擎完全不同——纯内存 + C++

为什么重要

  • Cypher 兼容:openCypher 标准 + Bolt 协议,Neo4j 客户端不改一行代码就能连——迁移成本几乎为零
  • 单机吞吐显著领先:内存图 + C++ 实现,公开 benchmark 比 Neo4j 单机快 3-5 倍(写入和深度查询都是)
  • 流接入原生支持:内置 Kafka / Pulsar / Redpanda consumer,CREATE STREAM 一句话就能把 Kafka topic 实时灌进图——这在金融实时反欺诈、电信网络监控里是杀手级特性
  • MAGE 算法库:PageRank / 社区检测 / Node2Vec / 最短路径都内置好,还能用 Python 或 C++ 写自定义图算法过程

如果场景是”数据规模能装进单机内存(几百 GB 到 TB 级)“且”必须毫秒响应”,Memgraph 是 neo4j 之外的强力候选。

核心要点

1. 全内存 + Snapshot/WAL 持久化

Memgraph 的存储设计跟传统数据库完全反过来

  • 节点和边都是 C++ 对象,常驻 RAM
  • 索引用 跳表(skip list),写入不阻塞读
  • MVCC 多版本并发控制,事务之间不互相锁
  • 持久化只做两件事:周期性 snapshot(全量序列化到磁盘) + WAL(增量日志)

类比:游戏存档机制——游戏运行时全在内存,定期写一次存档(snapshot),中间每个操作记日志(WAL)。重启时先读最近的 snapshot,再回放 WAL。

后果:RAM 即上限——内存装不下就跑不动。一台 256 GB 内存的机器大概能装下几亿节点 + 几十亿边。

2. Cypher + Bolt:与 Neo4j 协议层兼容

MATCH (a:Person {name: 'Alice'})-[:FRIEND*1..3]->(foaf)
RETURN foaf.name, count(*) AS hops

这条查询在 Neo4j 和 Memgraph 上完全一样能跑。Bolt 协议是 Neo4j 设计的二进制传输协议,Memgraph 也实现了——所以 Neo4j 的 Python / Java / JS 客户端连过来无感。

实际意义:团队不用学新语言。Cypher 学过一次,两边都通用。

3. 流式接入:CREATE STREAM

这是 Memgraph 区别于 neo4j 的核心特性:

CREATE STREAM my_stream
TOPICS transactions
TRANSFORM transactions.txn_to_graph
BOOTSTRAP_SERVERS 'kafka:9092';
START STREAM my_stream;

后台 Kafka consumer 不停拉消息,每条消息走 transform 函数变成 Cypher 写入。没有 ETL 中间层——Kafka 的事件直接变成图里的边。

类比 kafka 给传统数据库的 connector:那是另一个进程定时拉取批量同步;Memgraph 是把 consumer 内嵌进数据库,事件级别同步。

4. MAGE:可扩展算法库

MAGE = Memgraph Advanced Graph Extensions,Apache 2.0 开源。

  • 内置过程pagerank.get() / community_detection.get() / node2vec.get() / betweenness_centrality.get()
  • 自定义过程:用 Python(mgp.read_proc)或 C++ 写——Python 简单但慢,C++ 快但要会编译

例子:跑 PageRank 找网络中的影响力节点:

CALL pagerank.get() YIELD node, rank
RETURN node.name, rank ORDER BY rank DESC LIMIT 10

跟 Neo4j 的 GDS(Graph Data Science)库定位一样,但 GDS 企业版要钱,MAGE 全开源。

实践案例

案例 1:用 Docker 起本地 Memgraph

Terminal window
docker run -p 7687:7687 -p 7444:7444 -p 3000:3000 \
--name memgraph memgraph/memgraph-platform
  • 7687 = Bolt 协议(应用连这里)
  • 7444 = WebSocket(日志推送)
  • 3000 = Memgraph Lab(浏览器图编辑器,类似 Neo4j Browser)

打开 http://localhost:3000 就能拖鼠标画图,对零基础友好。

案例 2:实时反欺诈场景

Kafka 灌入交易流水 → Memgraph 实时建图 → 持续查”环形转账”模式:

MATCH path = (a:Account)-[:TXN*3..6]->(a)
WHERE all(r IN relationships(path) WHERE r.amount > 10000)
RETURN path

(a)-[...*3..6]->(a) 表示从 a 出发走 3-6 步又回到 a——典型的”洗钱回环”。Memgraph 在内存里跑这种查询比 neo4j 快得多,足以在交易完成前的几十毫秒内拦截。

案例 3:跟 Neo4j 客户端对接

from neo4j import GraphDatabase
driver = GraphDatabase.driver("bolt://localhost:7687")
with driver.session() as s:
result = s.run("MATCH (n) RETURN count(n)")
print(result.single()[0])

这是 Neo4j 官方驱动——连 Memgraph 一样跑。这就是 Bolt 协议兼容的实际价值。

踩过的坑

  • RAM 即上限:估算容量要算节点对象 + 边对象 + 索引 + MVCC 多版本——通常按”原始数据 × 3-5 倍”预留。装不下就 OOM 进程挂掉,不会优雅降级
  • Snapshot 期间内存翻倍:序列化时要复制一份给后台写盘线程。大库要预留 2× 内存,否则 snapshot 触发时 OOM
  • BSL 协议商业化限制:Business Source License 1.1,4 年后才转 Apache 2.0。SaaS 形式对外卖 Memgraph 服务受限——商用部署前要看清条款
  • MAGE 自定义过程门槛:Python 写慢但简单;C++ 快但要懂 CMake + Memgraph 的 ABI——比 nebula 内置的 nGQL GO 语句门槛高
  • 中文资料少neo4j / nebula 中文社区都很活跃,Memgraph 几乎只有英文文档。出问题主要靠 Discord 和 GitHub Issues

适用 vs 不适用场景

适用

  • 数据能装进单机内存(几百 GB 以内)的实时图分析
  • 金融反欺诈、电信网络拓扑、Cybersecurity 行为图、推荐召回(Bolt + Cypher 生态可复用)
  • Kafka 事件流 + 图模型的实时管线(CREATE STREAM 杀手锏)
  • 已有 Neo4j 项目想换更快的引擎但不想重写查询

不适用

  • 万亿级超大图 → nebula / janusgraph 的分布式存算分离才扛得住
  • 离线批量图计算 → Spark GraphX / GraphFrames 的成本更低
  • 简单关系查询(深度 ≤ 2 跳)→ postgresql / mysql 加索引足够
  • 图嵌入向量召回 → 专用向量库(chroma / faiss)配 neo4j 更合适

判断口诀:单机能装下 + 必须毫秒响应 + Cypher 生态友好 → Memgraph;超大规模或预算紧张选别的。

历史小故事(可跳过)

  • 2016 年:Dominik Tomicevic 等人在萨格勒布创立 Memgraph,目标是做 Neo4j 的内存替代品
  • 2020 年:Memgraph Cloud 上线,开始有付费客户
  • 2022 年:开源核心引擎到 GitHub(BSL 协议),社区版可免费用
  • 2023 年:MAGE 算法库 Apache 2.0 开源,PageRank / 社区检测 / Node2Vec 等都内置
  • 2024 年:v2.x 系列加强 Cypher 兼容度 + Kafka 流接入稳定性
  • 2025 年:在金融、电信、安全行业的实时图分析场景持续渗透

学到什么

  • 内存优先 ≠ 简单缓存:Memgraph 把 MVCC + 跳表索引 + WAL 都做在内存里,是完整的存储引擎,不是给 Neo4j 加一层 cache
  • 协议兼容是迁移利器:实现 Bolt + openCypher,等于免费继承了 neo4j 的客户端生态——这种”协议抄底”是后发产品最常用的策略
  • 流接入内嵌价值大:CREATE STREAM 把 Kafka consumer 拉进数据库,省了一层 ETL,对实时场景效率提升一个量级
  • 场景决定形态:不是所有图都要分布式。能装进单机的就别上集群——单机内存图的延迟和吞吐都比分布式好

延伸阅读

关联

  • neo4j —— Cypher 查询语言的发源地,Memgraph 协议层兼容它
  • nebula —— 国产分布式图数据库,规模上限远高于 Memgraph
  • janusgraph —— 可插拔后端的分布式图,定位更接近 Nebula
  • arangodb —— 多模型(文档+图+KV)数据库,灵活但单点性能弱
  • kuzu —— 把图数据库做成 DuckDB,单文件嵌入式
  • kafka —— Memgraph 流接入的主要消息源
  • redis —— 同样内存优先,但不是图模型;RedisGraph 已停维(2024)
  • postgresql —— 关系数据库代表,简单 join 仍是它的主场