#!/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()