LatticeDB —— 图数据库界的 SQLite

查看原文 HN 讨论

文章摘要

LatticeDB 是一个用 Zig 写的、零依赖、MIT 协议的嵌入式属性图数据库,把图遍历、向量相似度检索(HNSW)和 BM25 全文检索塞进同一个引擎、同一套查询语言、同一个文件里。作者 Jeff Hajewski(HN 用户 smiths1999)在 Show HN 的自述里说明了动机:「我们在工作中越来越多地用图数据库。我发现它们在本地用起来很痛苦,于是决定试着做个更好的。」

项目的自我定位是四个「一」:一个文件(整个数据库就是一个可移植的单文件,无服务端、零配置)、一套查询层(图遍历、HNSW 向量相似度、BM25 全文检索用同一种查询语言)、一份事件日志(持久化的具名流和内建的图变更订阅流与图写入共享同一条事务/WAL 路径)、本地优先(单机单写入进程,WAL 保证持久性)。README 的招牌示例是一条同时用上三种检索的 Cypher:从与查询向量距离小于阈值的 Chunk 出发,沿 PART_OF 走到 Document、再沿 AUTHORED_BY 走到 Person,同时用全文操作符筛选文档内容,最后按向量距离排序——向量距离操作符是 <=>,全文检索操作符是 @@

查询语言是 Cypher 的一个子集:MATCH / WHERE / RETURN / CREATE / DELETE / SET / REMOVE、ORDER BY / LIMIT / SKIP / DETACH DELETE、MERGE / WITH / UNWIND 和聚合函数(count、sum、avg、min、max、collect)、变长路径(*1..3)、参数。功能面还包括:带标签和任意属性的节点与边、可持久化的显式等值索引、ACID 事务与崩溃恢复;向量侧支持可配置 M/ef 的 HNSW、内建哈希嵌入或对接 Ollama/OpenAI 的 HTTP 客户端、批量向量插入;全文侧是带分词与词干还原的 BM25 倒排索引,外加可配置 Levenshtein 距离的模糊搜索。运维面有:热备份(lattice backup,不需要关库)、持续备份(把变更推送到一个目录并支持时间点恢复)、把数据库序列化成字节流以及从字节流打开(方便把大量小库放进对象存储)、:memory: 内存库、在线空闲列表复用加 lattice compact 物理回收。绑定覆盖 CLI、Python、TypeScript/Node、Go、Java(JDK 21+,JNI)和一套干净的 C API。

性能数字是 README 的重头戏(Apple M1、单线程):节点查找 0.13 μs(790 万次/秒)、节点创建 0.65 μs、边遍历 9 μs、100 篇文档的全文检索 19 μs、100 万向量的 10-NN 检索 0.83 ms 且召回率 100%。向量部分给了完整的规模曲线(1K 到 1M,延迟从 65 μs 到 832 μs,召回 99–100%,内存 1 MB 到 1040 MB),并说明用了 HNSW 论文算法 4 的启发式邻居选择、连接页打包(内存约降为 1/4.5)、预归一化点积。与 SQLite 递归 CTE 的头对头对比是最扎眼的一组:10 万节点/50 万边规模下,1 跳快 36 倍、2 跳快 14 倍、3 跳快 6 倍、变长路径(1..5)快 75 倍;而深度受限遍历随深度拉开差距——深度 50 时 500 μs 对 1.4 s,即 2819 倍。作者在这里做了很克制的方法论声明:只有 SQLite 那几行是在同一台机器、同一套测试框架里头对头测出来的,Kuzu 和 Neo4j 的数字来自第三方博客、硬件和方法都不受他控制,「只能当量级参考,不能当基准测试结果」。

README 里被评论区反复称赞的是「什么时候该用别的东西」这一节,坦率程度罕见:需要多个应用同时写同一个库时用 Neo4j 或 PostgreSQL(LatticeDB 是单写入者模型,一个进程打开文件就占有它);数据本质上是表格型(销售记录、用户账号、时间序列)时用 SQLite 或 PostgreSQL 更简单也一样快,「图数据库的优势在于关系本身就是重点,而不是事后补的东西」;需要跨机器扩展时看 Neo4j 集群、Dgraph 或 Neptune——LatticeDB 能持续把单文件的变更推送到别处,「但那是备份而不是集群」;需要完整 Cypher 时用 Neo4j(OPTIONAL MATCHCALL 过程尚未实现);需要成熟工具链和生态时也别选它,「新和精简对嵌入式是优点,对需要丰富运维生态的场景就是缺点」。

HN 评论精华

这条 Show HN 拿到 187 分。作者全程在场,回帖密度极高,而且在讨论进行中就现场改了两次代码,这是本帖最有意思的部分。