diff --git a/AI/Neo4j/N3_InputShiTi.py b/AI/Neo4j/N3_InputShiTi.py index 7ead4a19..55fe2d00 100644 --- a/AI/Neo4j/N3_InputShiTi.py +++ b/AI/Neo4j/N3_InputShiTi.py @@ -135,10 +135,8 @@ class LLMClient: # ================== 知识图谱模块 ================== class KnowledgeManager: - """知识图谱管理器""" - def __init__(self): - self.graph = Graph(NEO4J_URI, auth=NEO4J_AUTH) + self.graph = Graph(Config.NEO4J_URI, auth=Config.NEO4J_AUTH) self._clean_data() self.knowledge_map = self._load_knowledge() self.literacy_map = self._load_literacy() @@ -163,20 +161,25 @@ class KnowledgeManager: def store_analysis(self, question_id: str, content: str, knowledge: List[str], literacy: List[str]): - """存储分析结果""" + """事务化存储方法""" + tx = self.graph.begin() try: - # 创建题目节点 - self.graph.run( - f"MERGE (q:Question {{id: '{question_id}', content: '{content}'}})" - ) + # 转义特殊字符 + safe_content = content.replace("'", "\\'") + + # 创建/更新题目节点 + tx.run(f""" + MERGE (q:Question {{id: '{question_id}'}}) + SET q.content = '{safe_content}' + """) # 关联知识点 for kp_name in knowledge: kp_id = next((k for k, v in self.knowledge_map.items() if v == kp_name), None) if kp_id: - self.graph.run(f""" + tx.run(f""" MERGE (kp:KnowledgePoint {{id: '{kp_id}'}}) - WITH q, kp + WITH kp MATCH (q:Question {{id: '{question_id}'}}) MERGE (q)-[:REQUIRES_KNOWLEDGE]->(kp) """) @@ -185,16 +188,19 @@ class KnowledgeManager: for lit_name in literacy: lit_id = next((k for k, v in self.literacy_map.items() if v == lit_name), None) if lit_id: - self.graph.run(f""" + tx.run(f""" MERGE (lp:LiteracyNode {{value: '{lit_id}'}}) - WITH q, lp + WITH lp MATCH (q:Question {{id: '{question_id}'}}) MERGE (q)-[:DEVELOPS_LITERACY]->(lp) """) + + tx.commit() + print("✅ 数据存储成功") except Exception as e: + tx.rollback() print(f"❌ 存储失败: {str(e)}") - # ================== 核心逻辑模块 ================== class ProblemAnalyzer: """题目分析引擎"""