Graph 存储后端
图存储后端
相关源文件
本章引用的主要源码文件:
lightrag/kg/faiss_impl.pylightrag/kg/json_doc_status_impl.pylightrag/kg/json_kv_impl.pylightrag/kg/memgraph_impl.pylightrag/kg/milvus_impl.pylightrag/kg/mongo_impl.pylightrag/kg/nano_vector_db_impl.pylightrag/kg/neo4j_impl.pylightrag/kg/networkx_impl.pylightrag/kg/postgres_impl.pylightrag/kg/qdrant_impl.pylightrag/kg/redis_impl.pytests/README_WORKSPACE_ISOLATION_TESTS.mdtests/test_graph_storage.pytests/test_neo4j_fulltext_index.pytests/test_postgres_index_name.pytests/test_postgres_retry_integration.pytests/test_workspace_isolation.pytests/test_workspace_sanitization.pytests/test_write_json_optimization.py
LightRAG 为知识图谱(KG)存储提供了可插拔的架构,支持从本地基于文件的图到企业级分布式图数据库的多种后端。每个后端都实现了 BaseGraphStorage 接口,提供了实体和关系管理、子图检索以及工作空间隔离的方法。
后端实现
LightRAG 支持五种主要的图存储后端,每种后端针对不同的规模和性能需求进行了优化。
1. NetworkX(默认)
默认后端使用 NetworkX 库进行内存中的图操作,并将数据持久化到 .graphml 文件中。它非常适合本地开发和小型到中型数据集。
- 基于文件的持久化:数据以
graph_{namespace}.graphml格式保存在工作空间目录中lightrag/kg/networkx_impl.py:51-53。 - 并发处理:使用
get_namespace_lock和get_update_flag来协调多个进程之间的访问,如果其他进程修改了图,则会从磁盘重新加载lightrag/kg/networkx_impl.py:77-96。 - 性能优化:包含
upsert_nodes_batch和upsert_edges_batch等批量方法,以最小化入库期间的异步开销lightrag/kg/networkx_impl.py:157-181。
2. Neo4j
一个适用于企业级用例的健壮实现,支持 Cypher 查询和高级图算法。
- BFS 检索:使用 Neo4j 的
apoc.path.subgraphAll(如果可用)或标准 Cypher 进行广度优先搜索子图检索lightrag/kg/neo4j_impl.py:383-400。 - 中日韩(CJK)全文索引:实现了针对实体 ID 的专用全文索引。它会检测 CJK 字符以应用合适的分析器,确保对中文、日文和韩文文本的高效检索
lightrag/kg/neo4j_impl.py:121-133。 - 弹性恢复:通过
READ_RETRY装饰器实现了指数退避重试机制,用于读取操作lightrag/kg/neo4j_impl.py:56-61。
3. 带 Apache AGE 的 PostgreSQL
使用 Apache AGE 扩展在关系型 PostgreSQL 数据库中实现图功能。
- 通过 SQL 执行 Cypher:通过将 Cypher 包装在 PostgreSQL 的
ag_catalog.cypher函数中来执行图查询lightrag/kg/postgres_impl.py:1162-1175。 - 安全标识符:包含一个
_safe_index_name工具函数,通过对长表名进行哈希处理,防止 PostgreSQL 的 63 字节标识符截断问题lightrag/kg/postgres_impl.py:74-104。 - 美元符号引用:使用动态的
_dollar_quote辅助函数,安全地包装包含特殊字符的 Cypher 字符串lightrag/kg/postgres_impl.py:112-140。
4. MongoDB
使用 MongoDB 的文档模型和 $graphLookup 聚合来模拟图关系。
- 图模拟:将节点和边存储在一个集合中。关系被建模为边文档,遍历通过
$graphLookup操作符执行lightrag/kg/mongo_impl.py:41-42。 - BFS 策略:通过
MONGO_GRAPH_BFS_MODE环境变量支持"双向"、"上游"或"下游"的 BFS 模式lightrag/kg/mongo_impl.py:41。
5. Memgraph
一个与 Neo4j bolt 协议兼容的内存图数据库。
- 高性能:针对低延迟图遍历进行了优化。
- 索引:在初始化期间,自动在工作空间标签内的
entity_id上创建索引lightrag/kg/memgraph_impl.py:99-104。
数据流与抽象
BaseGraphStorage 类定义了所有后端必须遵循的契约。下图展示了 LightRAG 核心如何与这些后端交互。
系统架构:核心到存储
来源: lightrag/base.py:30-32, lightrag/kg/networkx_impl.py:26, lightrag/kg/neo4j_impl.py:66, lightrag/kg/postgres_impl.py:143, lightrag/kg/mongo_impl.py:86, lightrag/kg/memgraph_impl.py:35
工作空间隔离
LightRAG 使用"工作空间"概念实现了严格的数据隔离。这使得单个数据库实例可以托管多个独立的知识图谱。
| 后端 | 隔离机制 | 实现细节 |
|---|---|---|
| NetworkX | 目录路径 | 文件存储在 working_dir/{workspace}/ 目录下 lightrag/kg/networkx_impl.py:42-44 |
| Neo4j | 节点标签 | 所有节点都标记有经过消毒处理的 :workspace 标签 lightrag/kg/neo4j_impl.py:93-101 |
| Postgres | 图名称 | AGE 图使用工作空间标识符命名 lightrag/kg/postgres_impl.py:1120-1125 |
| MongoDB | 命名空间前缀 | 集合名称以 {workspace}_{namespace} 为前缀 lightrag/kg/mongo_impl.py:119-121 |
| Memgraph | 节点标签 | 与 Neo4j 类似,使用反引号引用的工作空间标签 lightrag/kg/memgraph_impl.py:61-73 |
关键函数与检索策略
子图检索(get_knowledge_graph)
此函数对于可视化器和本地检索模式至关重要。它获取节点和边的局部邻域。
- Neo4j 实现:使用
MATCH (n) WHERE n:label RETURN n构建图结构lightrag/kg/neo4j_impl.py:348-360。 - NetworkX 实现:直接返回内部的
nx.Graph对象lightrag/kg/networkx_impl.py:255-257。
广度优先搜索(embed_nodes)
在检索期间用于查找相关上下文。
- Neo4j:利用
apoc.path.subgraphAll进行高效的多跳遍历lightrag/kg/neo4j_impl.py:383-388。 - NetworkX:使用基于
collections.deque的手动 BFS 实现lightrag/kg/networkx_impl.py:220-253。
实现映射:代码到存储
来源: lightrag/kg/networkx_impl.py:81-97, lightrag/kg/neo4j_impl.py:348-381, lightrag/types.py:16-18
配置摘要
| 后端 | 关键环境变量 |
|---|---|
| Neo4j | NEO4J_URI, NEO4J_USERNAME, NEO4J_PASSWORD, NEO4J_DATABASE lightrag/kg/neo4j_impl.py:137-188 |
| Postgres | POSTGRES_HOST, POSTGRES_USER, POSTGRES_PASSWORD, POSTGRES_DB lightrag/kg/postgres_impl.py:145-150 |
| MongoDB | MONGO_URI, MONGO_DATABASE, MONGO_GRAPH_BFS_MODE lightrag/kg/mongo_impl.py:41-63 |
| Memgraph | MEMGRAPH_URI, MEMGRAPH_USERNAME, MEMGRAPH_PASSWORD lightrag/kg/memgraph_impl.py:77-86 |
来源:
lightrag/kg/networkx_impl.pylightrag/kg/neo4j_impl.pylightrag/kg/postgres_impl.pylightrag/kg/mongo_impl.pylightrag/kg/memgraph_impl.pylightrag/base.py