huhan3000/documentation/analysis/phallic-worship-analysis/initialize.py

112 lines
3.7 KiB
Python

#!/usr/bin/env python3
"""
项目初始化脚本
设置数据库连接、创建必要的表结构和索引
"""
import logging
import logging.config
from config import DATABASE_CONFIG, LOGGING_CONFIG
from database.connections import DatabaseManager
# 配置日志
logging.config.dictConfig(LOGGING_CONFIG)
logger = logging.getLogger(__name__)
def initialize_project():
"""初始化项目"""
logger.info("开始初始化阳具崇拜文化分析项目...")
try:
# 初始化数据库管理器
db_manager = DatabaseManager(DATABASE_CONFIG)
# 初始化PostgreSQL
logger.info("初始化PostgreSQL数据库...")
db_manager.initialize_postgresql()
# 初始化Neo4j
logger.info("初始化Neo4j知识图谱...")
db_manager.initialize_neo4j()
# 创建Neo4j约束和索引
create_neo4j_constraints(db_manager.get_neo4j())
logger.info("项目初始化完成!")
return db_manager
except Exception as e:
logger.error(f"项目初始化失败: {e}")
raise
def create_neo4j_constraints(neo4j_conn):
"""创建Neo4j约束和索引"""
constraints = [
# 文化传播节点约束
"CREATE CONSTRAINT cultural_transmission_id IF NOT EXISTS FOR (ct:CulturalTransmission) REQUIRE ct.id IS UNIQUE",
# 皇帝节点约束
"CREATE CONSTRAINT emperor_name IF NOT EXISTS FOR (e:Emperor) REQUIRE e.name IS UNIQUE",
# 建筑节点约束
"CREATE CONSTRAINT building_name IF NOT EXISTS FOR (b:ReligiousBuilding) REQUIRE b.name IS UNIQUE",
# 民俗节点约束
"CREATE CONSTRAINT custom_id IF NOT EXISTS FOR (fc:FolkCustom) REQUIRE fc.id IS UNIQUE",
# 地区节点约束
"CREATE CONSTRAINT region_name IF NOT EXISTS FOR (r:Region) REQUIRE r.name IS UNIQUE"
]
indexes = [
# 时期索引
"CREATE INDEX period_index IF NOT EXISTS FOR (n:CulturalTransmission) ON (n.transmission_period)",
# 地区索引
"CREATE INDEX region_index IF NOT EXISTS FOR (n:CulturalTransmission) ON (n.source_region, n.target_region)",
# 文化类型索引
"CREATE INDEX cultural_type_index IF NOT EXISTS FOR (n:CulturalTransmission) ON (n.cultural_type)",
# 可靠性索引
"CREATE INDEX reliability_index IF NOT EXISTS FOR (n) ON (n.reliability)"
]
# 执行约束
for constraint in constraints:
try:
neo4j_conn.execute_query(constraint)
logger.info(f"创建约束成功: {constraint}")
except Exception as e:
logger.warning(f"创建约束失败: {constraint}, 错误: {e}")
# 执行索引
for index in indexes:
try:
neo4j_conn.execute_query(index)
logger.info(f"创建索引成功: {index}")
except Exception as e:
logger.warning(f"创建索引失败: {index}, 错误: {e}")
if __name__ == "__main__":
db_manager = initialize_project()
# 测试连接
logger.info("测试数据库连接...")
# 测试PostgreSQL
pg_conn = db_manager.get_postgresql()
result = pg_conn.execute_query("SELECT version()")
logger.info(f"PostgreSQL版本: {result[0]['version'] if result else 'Unknown'}")
# 测试Neo4j
neo4j_conn = db_manager.get_neo4j()
result = neo4j_conn.execute_query("CALL dbms.components() YIELD name, versions RETURN name, versions[0] as version")
if result:
logger.info(f"Neo4j版本: {result[0]['name']} {result[0]['version']}")
logger.info("数据库连接测试完成!")
# 关闭连接
db_manager.close_all()