* [add]Create a workspace and initialize the default ontology engineering scenario * [add]The language parameters for creating the workspace determine the default language for switching in the ontology project. * [changes]Standardized return format * [add]The default ontology is associated with the default configuration. * [add]Create a workspace and initialize the default ontology engineering scenario * [add]The language parameters for creating the workspace determine the default language for switching in the ontology project. * [changes]Standardized return format * [add]The default ontology is associated with the default configuration.
250 lines
8.8 KiB
Python
250 lines
8.8 KiB
Python
# -*- coding: utf-8 -*-
|
||
"""默认本体场景初始化器
|
||
|
||
本模块提供默认本体场景和类型的自动初始化功能。
|
||
在工作空间创建时,自动添加预设的本体场景和实体类型。
|
||
|
||
Classes:
|
||
DefaultOntologyInitializer: 默认本体场景初始化器
|
||
"""
|
||
|
||
import logging
|
||
from typing import List, Optional, Tuple
|
||
from uuid import UUID
|
||
|
||
from sqlalchemy.orm import Session
|
||
|
||
from app.config.default_ontology_config import (
|
||
DEFAULT_SCENES,
|
||
get_scene_name,
|
||
get_scene_description,
|
||
get_type_name,
|
||
get_type_description,
|
||
)
|
||
from app.core.logging_config import get_business_logger
|
||
from app.repositories.ontology_scene_repository import OntologySceneRepository
|
||
from app.repositories.ontology_class_repository import OntologyClassRepository
|
||
|
||
|
||
class DefaultOntologyInitializer:
|
||
"""默认本体场景初始化器
|
||
|
||
负责在工作空间创建时自动初始化默认的本体场景和类型。
|
||
遵循最小侵入原则,确保初始化失败不阻止工作空间创建。
|
||
|
||
Attributes:
|
||
db: 数据库会话
|
||
scene_repo: 场景Repository
|
||
class_repo: 类型Repository
|
||
logger: 业务日志记录器
|
||
"""
|
||
|
||
def __init__(self, db: Session):
|
||
"""初始化
|
||
|
||
Args:
|
||
db: 数据库会话
|
||
"""
|
||
self.db = db
|
||
self.scene_repo = OntologySceneRepository(db)
|
||
self.class_repo = OntologyClassRepository(db)
|
||
self.logger = get_business_logger()
|
||
|
||
def initialize_default_scenes(
|
||
self,
|
||
workspace_id: UUID,
|
||
language: str = "zh"
|
||
) -> Tuple[bool, str]:
|
||
"""为工作空间初始化默认场景
|
||
|
||
创建两个默认场景(在线教育、情感陪伴)及其对应的实体类型。
|
||
如果创建失败,记录错误日志但不抛出异常。
|
||
|
||
Args:
|
||
workspace_id: 工作空间ID
|
||
language: 语言类型 ("zh" 或 "en"),默认为 "zh"
|
||
|
||
Returns:
|
||
Tuple[bool, str]: (是否成功, 错误信息)
|
||
"""
|
||
try:
|
||
self.logger.info(
|
||
f"开始初始化默认本体场景 - workspace_id={workspace_id}, language={language}"
|
||
)
|
||
|
||
scenes_created = 0
|
||
total_types_created = 0
|
||
|
||
# 遍历默认场景配置
|
||
for scene_config in DEFAULT_SCENES:
|
||
scene_name = get_scene_name(scene_config, language)
|
||
|
||
# 创建场景及其类型
|
||
scene_id = self._create_scene_with_types(workspace_id, scene_config, language)
|
||
|
||
if scene_id:
|
||
scenes_created += 1
|
||
# 统计类型数量
|
||
types_count = len(scene_config.get("types", []))
|
||
total_types_created += types_count
|
||
|
||
self.logger.info(
|
||
f"场景创建成功 - scene_name={scene_name}, "
|
||
f"scene_id={scene_id}, types_count={types_count}, language={language}"
|
||
)
|
||
else:
|
||
self.logger.warning(
|
||
f"场景创建失败 - scene_name={scene_name}, "
|
||
f"workspace_id={workspace_id}, language={language}"
|
||
)
|
||
|
||
# 记录总体结果
|
||
self.logger.info(
|
||
f"默认场景初始化完成 - workspace_id={workspace_id}, "
|
||
f"language={language}, scenes_created={scenes_created}, "
|
||
f"total_types_created={total_types_created}"
|
||
)
|
||
|
||
# 如果至少创建了一个场景,视为成功
|
||
if scenes_created > 0:
|
||
return True, ""
|
||
else:
|
||
error_msg = "所有默认场景创建失败"
|
||
self.logger.error(
|
||
f"默认场景初始化失败 - workspace_id={workspace_id}, "
|
||
f"language={language}, error={error_msg}"
|
||
)
|
||
return False, error_msg
|
||
|
||
except Exception as e:
|
||
error_msg = f"默认场景初始化异常: {str(e)}"
|
||
self.logger.error(
|
||
f"默认场景初始化异常 - workspace_id={workspace_id}, "
|
||
f"language={language}, error={str(e)}",
|
||
exc_info=True
|
||
)
|
||
return False, error_msg
|
||
|
||
def _create_scene_with_types(
|
||
self,
|
||
workspace_id: UUID,
|
||
scene_config: dict,
|
||
language: str = "zh"
|
||
) -> Optional[UUID]:
|
||
"""创建场景及其类型
|
||
|
||
Args:
|
||
workspace_id: 工作空间ID
|
||
scene_config: 场景配置字典
|
||
language: 语言类型 ("zh" 或 "en")
|
||
|
||
Returns:
|
||
Optional[UUID]: 创建的场景ID,失败返回None
|
||
"""
|
||
try:
|
||
scene_name = get_scene_name(scene_config, language)
|
||
scene_description = get_scene_description(scene_config, language)
|
||
|
||
# 检查是否已存在同名场景(支持向后兼容)
|
||
existing_scene = self.scene_repo.get_by_name(scene_name, workspace_id)
|
||
if existing_scene:
|
||
self.logger.info(
|
||
f"场景已存在,跳过创建 - scene_name={scene_name}, "
|
||
f"workspace_id={workspace_id}, scene_id={existing_scene.scene_id}, "
|
||
f"language={language}"
|
||
)
|
||
return None
|
||
|
||
# 创建场景记录,设置 is_system_default=true
|
||
scene_data = {
|
||
"scene_name": scene_name,
|
||
"scene_description": scene_description
|
||
}
|
||
|
||
scene = self.scene_repo.create(scene_data, workspace_id)
|
||
|
||
# 设置系统默认标识
|
||
scene.is_system_default = True
|
||
self.db.flush()
|
||
|
||
self.logger.info(
|
||
f"场景创建成功 - scene_name={scene_name}, "
|
||
f"scene_id={scene.scene_id}, is_system_default=True, language={language}"
|
||
)
|
||
|
||
# 批量创建类型
|
||
types_config = scene_config.get("types", [])
|
||
types_created = self._batch_create_types(scene.scene_id, types_config, language)
|
||
|
||
self.logger.info(
|
||
f"场景类型创建完成 - scene_id={scene.scene_id}, "
|
||
f"types_created={types_created}/{len(types_config)}, language={language}"
|
||
)
|
||
|
||
return scene.scene_id
|
||
|
||
except Exception as e:
|
||
scene_name = get_scene_name(scene_config, language)
|
||
self.logger.error(
|
||
f"场景创建失败 - scene_name={scene_name}, "
|
||
f"workspace_id={workspace_id}, language={language}, error={str(e)}",
|
||
exc_info=True
|
||
)
|
||
return None
|
||
|
||
def _batch_create_types(
|
||
self,
|
||
scene_id: UUID,
|
||
types_config: List[dict],
|
||
language: str = "zh"
|
||
) -> int:
|
||
"""批量创建实体类型
|
||
|
||
Args:
|
||
scene_id: 场景ID
|
||
types_config: 类型配置列表
|
||
language: 语言类型 ("zh" 或 "en")
|
||
|
||
Returns:
|
||
int: 成功创建的类型数量
|
||
"""
|
||
created_count = 0
|
||
|
||
for type_config in types_config:
|
||
try:
|
||
type_name = get_type_name(type_config, language)
|
||
type_description = get_type_description(type_config, language)
|
||
|
||
# 创建类型数据
|
||
class_data = {
|
||
"class_name": type_name,
|
||
"class_description": type_description
|
||
}
|
||
|
||
# 创建类型
|
||
ontology_class = self.class_repo.create(class_data, scene_id)
|
||
|
||
# 设置系统默认标识
|
||
ontology_class.is_system_default = True
|
||
self.db.flush()
|
||
|
||
created_count += 1
|
||
|
||
self.logger.debug(
|
||
f"类型创建成功 - class_name={type_name}, "
|
||
f"class_id={ontology_class.class_id}, "
|
||
f"scene_id={scene_id}, is_system_default=True, language={language}"
|
||
)
|
||
|
||
except Exception as e:
|
||
type_name = get_type_name(type_config, language)
|
||
self.logger.warning(
|
||
f"单个类型创建失败,继续创建其他类型 - "
|
||
f"class_name={type_name}, scene_id={scene_id}, "
|
||
f"language={language}, error={str(e)}"
|
||
)
|
||
# 继续创建其他类型
|
||
continue
|
||
|
||
return created_count
|