跳转至

科学知识图谱:Scientific KG

本章所属 DDA 层:Scientific KG

把每篇 CSR 抽成三元组、立刻写进「企业知识图谱」,和先把断言标成候选、只让人审过的事实进 knowledge 图,是两条路。前者看起来像知识工程。后者才发得了版。

图一旦写成「已验证」,仓外推理包会把它当真理。抽错一句不良反应,比检索少召回一篇文献更难发现。

问题

Ontology 回答世界里有哪些对象、规则是什么。科学知识图谱回答:公司目前承认哪些关系为真,这些关系挂在哪条证据上,公开层的哪些边只是外部世界。

阿斯利华需要「ASH-001 作用于 c-Met」这种企业认可的断言,也需要公开库里「savolitinib 的活性数据」作为对照。两者不能进同一张未分层的图。抽取管道每天还会吐出新的主谓宾。若抽取即入库,Knowledge ≠ Truth 就碎了。

传统方案

常见两种做法。一种把知识图谱当文档库的可视化:节点是名词,边是共现。一种把 RDF 三元组仓库当「语义网项目」,公开数据和企业数据混在默认图里。

阿斯利华早期把文献里抽出的「treats」「inhibits」直接当成管线事实。BI 报表仍按临床库的状态算,两边对不上,也说不清哪条边来自哪一版 CSR。

为什么失效

文档增长速度远高于策展速度。每篇 PDF 变成本体类或知识边,图不可治理。

抽取有噪声。否定句、表格错行、OCR 误差都会产三元组。自动 validated 等于把噪声写成世界模型。

公开层和企业层混图。消费方用公开 ID 当主键查询,内部候选药消失;或反过来,把公开活性数据当成公司已确认的管线关系。

没有 PROV。审计问「这条边依据哪次抽取、哪次审校」,图里只有谓语。

属性图双写或第二套图引擎会复制同一套身份契约。换引擎不是换存储,是推翻 SPARQL、命名图和 PROV 约定。

flowchart LR
    subgraph bad [抽取即真理]
        PDF[文档] --> T[三元组]
        T --> G1[同一张图]
    end
    subgraph good [分层世界模型]
        PDF2[文档] --> EX[extracted]
        EX --> REV[科学家审校]
        REV --> VA[validated]
        VA --> G2[graph_knowledge]
        PUB[公开源] --> GB[graph_biomedical]
    end

图:候选与已验证必须分图(DDA 层:Scientific KG)

新的设计思想

科学知识图谱是已治理的运行时,不是文档的投影,也不是 Ontology 的同义词。

命名图按断言强度切开。本体结构、已验证知识、溯源、公开药理空间各有各的图。谓语可以同名,强度靠图 URI 区分。

只有 validated 物化进 knowledge。extracted 可以进湖、进溯源图,默认不进推理包。

世界模型运行时只认 RDF 图库。不引入属性图双写,不预留第二套图引擎适配层。

关系融合在签名合并之上做冲突检测和多文档聚合,仍然禁止自动验证。

发版守门看图快照,不看入湖报告。能入库不等于能发版。

架构设计

flowchart TB
    ONT[OntologyServices] --> GO[graph_ontology]
    VAL[validated_claims] --> GK[graph_knowledge]
    EX[extracted_claims] --> GP[graph_provenance]
    PUB[公开药理空间] --> GB[graph_biomedical]
    GO --> RT[RDF图库运行时]
    GK --> RT
    GP --> RT
    GB --> RT
    RT --> API[上下文接口]

图:命名图分工,单一 RDF 运行时(DDA 层:Scientific KG)

图回答「谁与谁有何已验证关系」。证据索引回答「原文怎么说」。二者经证据 ID 挂靠,不互相替代。

工程实践

决策表

决策 选择 放弃
引擎 单一 RDF 图库 Neo4j 双写、属性图投影、第二套适配层
断言 extracted ≠ validated 抽取自动进 knowledge
公开层 独立 biomedical 图 + xref 公开 ID 当企业主键
融合 冲突检测 + 多文档聚合 只按签名去重并抬置信度
发版 QualityGate 看图快照 用 IngestQA 代替发版
演进 人审后写 Git 再同步 管道直接改生产图

阿斯利华可走通的例子

csr_ash001_phase1_v3 抽出:

claim:
  subject: ASH:ENT:DC:savolitinib
  predicate: has_adverse_event
  object: rash
  status: extracted
  evidence_id: ev:csr_ash001_phase1_v3#3.2.r4
  ontology_release_id: 2026.08.1

这条边可以进溯源图,可以出现在「含候选」的调试视图。它不能出现在 get_relationships 的默认结果里,也不能单独支撑「该药已确认皮疹为不良反应」的推理包。

科学家对照原文和 MedDRA / 内部词表后,把 status 改为 validated,记录审校人与时间。同步作业才在 graph/knowledge 写下对应边,并保留 PROV:谁在何时根据哪条证据承认了它。

若另一篇文献抽出「无皮疹」,融合层标记 conflicting_values,保持 extracted,不自动改已验证边。

公开活性数据进 graph/biomedical,用 exact_match 挂到 ASH:ENT:DC:savolitinib。查询企业管线仍用企业 ID。

失败模式

  • 抽取即写 knowledge:幻觉进入世界模型,评测绿、业务红。
  • 默认图混装四类断言:SPARQL 一查,公开边和企业边无法区分强度。
  • YAML 在图库不可达时冒充运行时:演示能答,生产契约撒谎。
  • 融合只抬置信度:多篇重复抽取被当成更真。
  • 入湖通过被当成发版通过:空证据的实体带着残缺关系上线。

业界路线对照

Open PHACTS 用链接数据缓存整合公开源,身份映射与领域 API 分开。阿斯利康把知识地图当作导航层,数据产品仍在湖仓。公开层可导航、可映射;企业承认的事实单独发版。不要把「知识地图」理解成可以替代湖仓的一张大图。

最佳实践

先有身份,再有边。没有企业主键的三元组不要进 knowledge。

PROV 挂在边上,不挂在 wiki 里。

冲突要浮现。掩盖冲突等于编造单一真相。

发版号随图。推理包必须带 ontology_release_id

图引擎决策写死。换引擎等于换契约,不当成存储优化。

延伸阅读

  • RDF 与命名图:用图 URI 区分断言强度。
  • PROV:出处作为一等公民,而不是日志附件。
  • Open PHACTS:公开药理空间与应用层分离。

Checklist

  • 是否澄清 Ontology 与 Scientific KG 的分工,未把本书写成「企业知识图谱项目」?
  • extractedvalidated 是否分图、分生命周期?
  • 公开层是否独立,企业主键是否仍是 ASH:ENT:*
  • 世界模型是否只认单一 RDF 运行时,未做属性图双写?
  • 融合是否检测冲突,且禁止自动验证?
  • 发版守门是否看图快照,而不是复用 IngestQA?
  • 每条 knowledge 边是否能回到证据与审校记录?

公司承认的事实,和文档里抽出来的句子,不是同一张图。命名图分层,知识不等于抽取。