Skip to content

[Bug][数据一致性] 图谱写入跨 Neo4j 与 PostgreSQL 两个独立事务,Neo4j 成功而 PG 失败时靠重试收敛 #879

Description

@Alex-Fleet

标题: [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_graphmark_graph_structure_indexed。若 PG 在 Neo4j 成功之后失败

  • chunk 的 graph_structure_indexed 不置位;
  • build_pending_chunks 将其计为 write_failed 并整体抛 RuntimeError,任务标记 failed;
  • 只有再次 reset+rebuild 或 reconcile 才可能收敛。

虽然 Cypher 用 MERGE、PG 用 ON CONFLICT 兜底了重复执行,但跨存储没有原子性/补偿,失败重试的成本与复杂度高。

建议

  1. 设计幂等补偿:PG 失败时,图谱构建任务应可安全重入(MERGE/ON CONFLICT 已保证重复执行无害,关键是失败后自动重试而非人工 reset);
  2. 调整顺序使"结果可判定":先落 PG 状态,再写 Neo4j,最后置 indexed;任一步失败进入自动重试队列;
  3. 补充 Neo4j 成功、PG 失败场景的集成测试。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions