科学知识图谱: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 的分工,未把本书写成「企业知识图谱项目」?
-
extracted与validated是否分图、分生命周期? - 公开层是否独立,企业主键是否仍是
ASH:ENT:*? - 世界模型是否只认单一 RDF 运行时,未做属性图双写?
- 融合是否检测冲突,且禁止自动验证?
- 发版守门是否看图快照,而不是复用 IngestQA?
- 每条 knowledge 边是否能回到证据与审校记录?
公司承认的事实,和文档里抽出来的句子,不是同一张图。命名图分层,知识不等于抽取。