知识图谱数据模型
知识图谱数据模型
相关源文件
本章引用的主要源码文件:
graphiti_core/edges.pygraphiti_core/models/__init__.pygraphiti_core/models/edges/__init__.pygraphiti_core/models/edges/edge_db_queries.pygraphiti_core/models/nodes/__init__.pygraphiti_core/models/nodes/node_db_queries.pygraphiti_core/nodes.pygraphiti_core/utils/maintenance/community_operations.pygraphiti_core/utils/maintenance/graph_data_operations.py
本文档详细介绍了构成 Graphiti 时序知识图谱的核心数据结构和模式。它涵盖了图数据库中的节点类型、边类型、它们的属性以及它们之间的关系。
有关这些数据结构如何处理和维护的信息,请参阅数据处理管线。有关时序推理和有效期细节,请参阅时序感知与双时模型。
概述
Graphiti 的知识图谱实现了一个时序、多层的数据模型,包含四种节点类型(EpisodicNode、EntityNode、CommunityNode、SagaNode)和五种边类型(EpisodicEdge、EntityEdge、CommunityEdge、HasEpisodeEdge、NextEpisodeEdge)。所有数据结构都继承自定义在 graphiti_core/nodes.py:93-109 和 graphiti_core/edges.py:49-57 中的抽象 Pydantic BaseModel 类(Node、Edge)。该模型在保留原始片段内容的同时,提取结构化的实体和关系,并具备完整的时序追踪能力,通过 Saga 片段链支持叙事组织。
来源:graphiti_core/nodes.py:93-109、graphiti_core/edges.py:49-57
图模式架构
下图展示了包含所有节点和边类型的完整数据模型:
时序知识图谱模式
来源:graphiti_core/nodes.py:93-99、graphiti_core/nodes.py:307-318、graphiti_core/nodes.py:450-456、graphiti_core/nodes.py:618-621、graphiti_core/nodes.py:798-817、graphiti_core/edges.py:49-55、graphiti_core/edges.py:143-144、graphiti_core/edges.py:228-247、graphiti_core/edges.py:503-504、graphiti_core/edges.py:586-587、graphiti_core/edges.py:719-720
节点类型
EpisodicNode
EpisodicNode 类表示原始片段数据。定义在 graphiti_core/nodes.py:307-351 中,它作为实体和关系提取的源材料。
| 属性 | 类型 | 描述 |
|---|---|---|
uuid | str | 通过 uuid4() 生成,主键 |
name | str | 片段标识符 |
group_id | str | 多租户分区键 |
labels | list[str] | 从 Node 继承,默认为空列表 |
created_at | datetime | 通过 utc_now() 生成的系统创建时间 |
valid_at | datetime | 片段时间戳(事件发生时间) |
source | EpisodeType | 枚举:message、json、text 或 fact_triple |
source_description | str | 关于来源的元数据 |
content | str | 原始片段内容 |
entity_edges | list[str] | 从该片段提取的 EntityEdge 实例的 UUID 列表 |
关键方法:
async save(driver: GraphDriver)- 使用get_episode_node_save_query()持久化节点graphiti_core/nodes.py:319-344async get_by_uuid(driver, uuid)- 检索单个片段graphiti_core/nodes.py:346-367async get_by_group_ids(driver, group_ids, limit, uuid_cursor)- 分页支持graphiti_core/nodes.py:390-427
EpisodeType 枚举:
定义在 graphiti_core/nodes.py:54-91 中,该枚举指定输入格式:
message- 参与者前缀格式:"user: Hello"json- 结构化 JSON 字符串text- 纯文本内容fact_triple- 主语-谓语-宾语结构graphiti_core/nodes.py:77-77
来源:graphiti_core/nodes.py:307-427、graphiti_core/nodes.py:54-91
EntityNode
EntityNode 类表示带有语义嵌入向量的提取实体。定义在 graphiti_core/nodes.py:450-615 中,它存储具有动态类型的结构化知识。
| 属性 | 类型 | 描述 |
|---|---|---|
uuid | str | 通过 uuid4() 生成,主键 |
name | str | 实体名称(为语义搜索嵌入) |
group_id | str | 分区键 |
labels | list[str] | 动态实体类型(例如 ["Person", "Engineer"]) |
created_at | datetime | 系统创建时间 |
summary | str | 大语言模型(LLM)生成的上下文摘要 |
attributes | dict[str, Any] | 标签特定属性 |
name_embedding | list[float] | None | 向量嵌入 |
关键方法:
async generate_name_embedding(embedder: EmbedderClient)- 创建嵌入向量graphiti_core/nodes.py:457-464async save(driver: GraphDriver)- 使用get_entity_node_save_query()持久化graphiti_core/nodes.py:504-535
数据库提供者处理:
- Kuzu:将
attributes序列化为 JSON,存储labels数组graphiti_core/nodes.py:514-520、graphiti_core/models/nodes/node_db_queries.py:150-163 - Neo4j/FalkorDB/Neptune:将
attributes展平为属性,使用多标签语法graphiti_core/nodes.py:522-531、graphiti_core/models/nodes/node_db_queries.py:142-149
来源:graphiti_core/nodes.py:450-615、graphiti_core/models/nodes/node_db_queries.py:137-163
CommunityNode
CommunityNode 类表示通过图算法发现的实体集群。定义在 graphiti_core/nodes.py:618-755 中,它提供层次化摘要。
| 属性 | 类型 | 描述 |
|---|---|---|
uuid | str | 通过 uuid4() 生成,主键 |
name | str | 大语言模型(LLM)生成的社区描述 |
group_id | str | 分区键 |
created_at | datetime | 系统创建时间 |
summary | str | 成员的聚合摘要 |
name_embedding | list[float] | None | 名称的向量嵌入 |
关键方法:
async save(driver: GraphDriver)- 使用get_community_node_save_query()graphiti_core/nodes.py:622-640build_community()- 使用层次化大语言模型(LLM)调用生成社区摘要graphiti_core/utils/maintenance/community_operations.py:174-212get_community_clusters()- 使用label_propagation识别集群graphiti_core/utils/maintenance/community_operations.py:30-90
来源:graphiti_core/nodes.py:618-755、graphiti_core/utils/maintenance/community_operations.py:30-212
SagaNode
SagaNode 类表示叙事序列。定义在 graphiti_core/nodes.py:798-941 中,它支持将片段组织成连贯的故事线。
| 属性 | 类型 | 描述 |
|---|---|---|
uuid | str | 通过 uuid4() 生成,主键 |
name | str | Saga 标识符 |
group_id | str | 分区键 |
created_at | datetime | 系统创建时间 |
来源:graphiti_core/nodes.py:798-941、graphiti_core/models/nodes/node_db_queries.py:47
边类型
EpisodicEdge(MENTIONS 关系)
EpisodicEdge 类在 EpisodicNode 和 EntityNode 之间创建 MENTIONS 关系。定义在 graphiti_core/edges.py:143-226 中。
| 属性 | 类型 | 描述 |
|---|---|---|
uuid | str | 通过 uuid4() 生成,主键 |
group_id | str | 分区键 |
created_at | datetime | 系统创建时间 |
source_node_uuid | str | EpisodicNode.uuid |
target_node_uuid | str | EntityNode.uuid |
来源:graphiti_core/edges.py:143-226、graphiti_core/models/edges/edge_db_queries.py:19-27
EntityEdge(RELATES_TO 关系)
EntityEdge 类表示实体之间带有双时追踪的事实关系。定义在 graphiti_core/edges.py:228-501 中。
| 属性 | 类型 | 描述 |
|---|---|---|
uuid | str | 通过 uuid4() 生成,主键 |
group_id | str | 分区键 |
created_at | datetime | 事务时间 |
source_node_uuid | str | 源 EntityNode.uuid |
target_node_uuid | str | 目标 EntityNode.uuid |
name | str | 关系类型 |
fact | str | 自然语言描述 |
fact_embedding | list[float] | None | 向量嵌入 |
episodes | list[str] | 支持的片段 UUID 列表 |
valid_at | datetime | None | 事实开始时间 |
invalid_at | datetime | None | 事实结束时间 |
expired_at | datetime | None | 软删除时间戳 |
来源:graphiti_core/edges.py:228-501、graphiti_core/models/edges/edge_db_queries.py:63-122
CommunityEdge(HAS_MEMBER 关系)
CommunityEdge 类从社区到成员实体创建 HAS_MEMBER 关系。定义在 graphiti_core/edges.py:503-584 中。
来源:graphiti_core/edges.py:503-584、graphiti_core/models/edges/edge_db_queries.py:40
HasEpisodeEdge 和 NextEpisodeEdge
- HasEpisodeEdge:将
SagaNode链接到EpisodicNodegraphiti_core/edges.py:586-717。 - NextEpisodeEdge:链接连续的
EpisodicNode实例以形成序列graphiti_core/edges.py:719-852。
来源:graphiti_core/edges.py:586-852
类层次结构和方法
Pydantic 模型层次结构
来源:graphiti_core/nodes.py:93-109、graphiti_core/edges.py:49-57
数据持久化流程
片段到图持久化管线
来源:graphiti_core/nodes.py:319-344、graphiti_core/nodes.py:504-535、graphiti_core/edges.py:304-339、graphiti_core/models/nodes/node_db_queries.py:30-66、graphiti_core/models/edges/edge_db_queries.py:63-122
分区和组管理
所有节点和边都包含一个 group_id 字段,用于实现多租户的图分区。
Node.delete_by_group_id():对特定分区的节点及其关系执行批量删除graphiti_core/nodes.py:178-226。Edge.delete_by_uuids():跨提供者按 UUID 批量删除边graphiti_core/edges.py:93-130。clear_data():维护函数,用于从图中清除所有数据或特定group_ids的数据graphiti_core/utils/maintenance/graph_data_operations.py:34-65。
来源:graphiti_core/nodes.py:178-226、graphiti_core/edges.py:93-130、graphiti_core/utils/maintenance/graph_data_operations.py:34-65