标题: [Bug][数据一致性] 图谱写入跨 Neo4j 与 PostgreSQL 两个独立事务,Neo4j 成功而 PG 失败时靠重试收敛
正文:
问题
backend/package/yuxi/knowledge/graphs/milvus_graph_service.py(约 561 行)write_chunk_graph 的写入路径:
neo4j_write(self.driver, query) # Neo4j 事务(MERGE 节点/边)
# ...
await self.graph_repo.upsert_chunk_graph(...) # 独立 PG 事务
await self.chunk_repo.mark_graph_structure_indexed(...)
Neo4j 写事务成功后,才执行 PG 的 upsert_chunk_graph 与 mark_graph_structure_indexed。若 PG 在 Neo4j 成功之后失败:
- chunk 的
graph_structure_indexed 不置位;
build_pending_chunks 将其计为 write_failed 并整体抛 RuntimeError,任务标记 failed;
- 只有再次 reset+rebuild 或 reconcile 才可能收敛。
虽然 Cypher 用 MERGE、PG 用 ON CONFLICT 兜底了重复执行,但跨存储没有原子性/补偿,失败重试的成本与复杂度高。
建议
- 设计幂等补偿:PG 失败时,图谱构建任务应可安全重入(MERGE/ON CONFLICT 已保证重复执行无害,关键是失败后自动重试而非人工 reset);
- 调整顺序使"结果可判定":先落 PG 状态,再写 Neo4j,最后置 indexed;任一步失败进入自动重试队列;
- 补充 Neo4j 成功、PG 失败场景的集成测试。
标题: [Bug][数据一致性] 图谱写入跨 Neo4j 与 PostgreSQL 两个独立事务,Neo4j 成功而 PG 失败时靠重试收敛
正文:
问题
backend/package/yuxi/knowledge/graphs/milvus_graph_service.py(约 561 行)write_chunk_graph的写入路径:Neo4j 写事务成功后,才执行 PG 的
upsert_chunk_graph与mark_graph_structure_indexed。若 PG 在 Neo4j 成功之后失败:graph_structure_indexed不置位;build_pending_chunks将其计为 write_failed 并整体抛RuntimeError,任务标记 failed;虽然 Cypher 用 MERGE、PG 用 ON CONFLICT 兜底了重复执行,但跨存储没有原子性/补偿,失败重试的成本与复杂度高。
建议