112 lines
3.7 KiB
Python
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() |