75 lines
2.1 KiB
Python
75 lines
2.1 KiB
Python
"""
|
||
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())
|
||
|