kgrag/entity_registry.py
2026-07-29 18:10:19 +08:00

75 lines
2.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
entity_registry.py
实体类型注册中心。
- extract_filtertext_v8.py 在生成实体时调用 register() 写入
- app.py 启动时调用 get_ontology_description() / get_node_types() 合并进配置
- 注册信息持久化到 entity_registry.json跨进程保留
"""
import json
import os
_REGISTRY_DIR = os.path.join(os.path.dirname(__file__), "registry")
_REGISTRY_FILE = os.path.join(_REGISTRY_DIR, "entity_registry.json")
os.makedirs(_REGISTRY_DIR, exist_ok=True)
# 内存缓存,避免每次读文件
_cache: dict = {}
def _load():
global _cache
if _cache:
return
if os.path.exists(_REGISTRY_FILE):
with open(_REGISTRY_FILE, encoding="utf-8") as f:
_cache = json.load(f)
else:
_cache = {}
def _save():
with open(_REGISTRY_FILE, "w", encoding="utf-8") as f:
json.dump(_cache, f, ensure_ascii=False, indent=2)
def register(entity_type: str, description: str = "", properties: list = None):
"""
注册一个实体类型。已存在则跳过,不覆盖。
参数:
entity_type: 实体类型名,如 "维修工作指导"
description: 对该类型的描述(可为空)
properties: 该类型的属性列表,如 ["名称", "内容", "knowledge_source"]
"""
_load()
if entity_type in _cache:
return # 已注册,不覆盖
_cache[entity_type] = {
"description": description,
"properties": properties or ["名称", "内容", "knowledge_source"]
}
_save()
print(f" [registry] 注册新实体类型: 【{entity_type}")
def get_ontology_description() -> dict:
"""返回 {type: [description]} 格式,可直接合并进 Ontology_DESCRIPTION。"""
_load()
return {k: [v["description"]] for k, v in _cache.items()}
def get_node_types() -> dict:
"""返回 {type: [properties]} 格式,可直接合并进 node_types。"""
_load()
return {k: v["properties"] for k, v in _cache.items()}
def get_ontology_list() -> list:
"""返回所有已注册的实体类型名列表,可合并进 ontology。"""
_load()
return list(_cache.keys())