|
|
|
@ -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:
|
|
|
|
|
"""题目分析引擎"""
|
|
|
|
|