2. 药物领域知识建模

药物知识图谱的推理能力,首先取决于底层知识模型是否把药物世界里真正重要的对象、联系和约束表达清楚。知识建模不是把数据库表换个名字,而是先回答三个问题:领域里有哪些必须被区分的对象?这些对象之间有哪些有方向、有语义的联系?每个对象需要携带哪些属性,才能支撑后续的检索、校验和推理?本节围绕实体类型、关系类型、属性设计以及本体与词表构建方法展开,并给出可落地的建模过程。

一、实体类型:从“药物”这一笼统概念拆开

在药物领域,最容易被误用的做法是把所有东西都塞进一个“药物”实体。实际上,一个药物分子、一个上市药品、一个活性成分、一个靶点、一个疾病、一个不良反应、一个代谢酶,在推理中扮演的角色完全不同。合理的实体类型划分通常包括:

  • 化学实体类:活性成分(ActiveIngredient)、盐型/酯型、代谢产物、杂质。
  • 药品类:上市药品(DrugProduct)、剂型、规格、批准文号、商品名。
  • 生物靶点类:靶点(Target)、基因、蛋白、酶、受体、转运体。
  • 疾病与表型类:疾病(Disease)、症状、适应症、禁忌症。
  • 药效与安全类:不良反应(AdverseEvent)、药物相互作用、毒性终点。
  • 证据与来源类:文献、临床试验、数据库记录、监管文件。

实体类型划分的关键判据是“是否具有独立标识和独立属性”。例如“阿司匹林”作为活性成分有分子式、分子量、SMILES;“拜阿司匹灵”作为药品有商品名、剂型、规格、批准文号。二者不能合并,否则查询“某成分的所有上市剂型”时就会丢失层级。

二、关系类型:有方向、有语义、可推理

关系类型决定图谱能否做路径推理。药物领域常见关系可归为几组:

  • 成分—药品:hasActiveIngredient、isIngredientOf。
  • 药物—靶点:targets、inhibits、activates、agonizes、antagonizes。
  • 药物—疾病:indicatedFor、contraindicatedIn。
  • 药物—药物:interactsWith、synergizesWith、antagonizesDrug。
  • 药物—不良反应:causesAdverseEvent、associatedWith。
  • 代谢关系:metabolizedBy、inhibitsEnzyme、inducesEnzyme。

关系必须带方向。例如“华法林抑制CYP2C9”与“CYP2C9代谢华法林”方向相反,推理含义也不同。前者用于判断相互作用风险,后者用于解释血药浓度变化。若方向缺失,路径推理会得出错误结论。

三、属性设计:区分标识属性、描述属性与推理属性

属性不是越多越好,而应按用途分层。以活性成分为例:

属性类别示例字段用途
标识属性InChIKey、CAS号、DrugBank ID实体对齐、去重
描述属性分子式、分子量、SMILES展示、相似性计算
推理属性logP、氢键供体数、靶点亲和力规则推理、打分
证据属性来源文献、置信度、更新时间溯源与可信度评估

属性设计要避免两个极端:一是把关系硬塞成属性,例如把“靶点”写成药物表里的一个文本字段,导致无法反向查询;二是把属性拆成实体,例如把“分子量”也建成节点,造成图谱膨胀。判断标准是:若某值需要被独立引用、参与多跳推理或与其他实体建立联系,就应建为实体或关系;否则保留为属性。

四、本体与词表构建方法

本体(Ontology)提供类、属性、约束和公理;词表(Vocabulary)提供受控术语和同义词映射。构建过程可概括为:

  1. 确定范围与复用:优先复用 ChEBI、GO、MeSH、DrugBank、SNOMED CT 等已有本体,避免自造术语。
  2. 抽取候选术语:从药品说明书、文献、数据库字段中抽取名词短语。
  3. 归类与定义:把候选术语归入实体类型,给出自然语言定义和形式化约束。
  4. 建立层级与同义:用 subClassOf、exactMatch、closeMatch 建立上下位和同义关系。
  5. 校验与迭代:用推理机检查一致性,用真实查询验证覆盖度。

下面这张图展示了一个药物知识模型的核心结构:左侧是实体类型,中间是关系类型,右侧是属性与证据,底部是本体与词表的支撑关系。

药物知识模型:实体—关系—属性—本体支撑结构 实体类型 活性成分 上市药品 靶点/酶/受体 疾病/适应症 不良反应 证据/文献 关系类型(有向) hasActiveIngredient targets / inhibits indicatedFor interactsWith metabolizedBy causesAdverseEvent supportedBy 属性与证据 标识属性:InChIKey / CAS / DrugBank ID → 实体对齐与去重 描述属性:分子式 / 分子量 / SMILES → 展示与相似性计算 推理属性:logP / 氢键供体数 / 亲和力 → 规则推理与打分 证据属性:来源 / 置信度 / 更新时间 → 溯源与可信度评估 本体与词表支撑层 复用 ChEBI / GO / MeSH subClassOf 层级 exactMatch 同义映射 推理机一致性校验

五、一个可执行的建模片段

以“华法林—CYP2C9—不良反应”为例,建模结果可表示为:

实体:
  DrugProduct: 华法林钠片(规格2.5mg,批准文号H...)
  ActiveIngredient: 华法林(InChIKey: PJVWKTKQMONHTI-UHFFFAOYSA-N)
  Target: CYP2C9(UniProt: P11712)
  AdverseEvent: 出血

关系:
  华法林钠片 --hasActiveIngredient--> 华法林
  华法林 --metabolizedBy--> CYP2C9
  华法林 --causesAdverseEvent--> 出血
  CYP2C9 --inhibitsEnzyme--> 华法林代谢(方向:抑制代谢)

属性:
  华法林.logP = 3.0(示例值)
  华法林.氢键供体数 = 1
  出血.置信度 = 0.87
  出血.来源 = 说明书 + 文献

这段模型可以直接支撑一条推理:若患者同时使用某种CYP2C9抑制剂,则华法林代谢被抑制,血药浓度升高,出血风险上升。推理链为:DrugProduct → ActiveIngredient → metabolizedBy → CYP2C9 ← inhibitsEnzyme ← 抑制剂。如果关系方向或实体类型划分错误,这条链就会断裂。

建模检查要点:实体是否有独立标识?关系是否有方向且语义明确?属性是否区分了标识、描述、推理和证据?本体术语是否优先复用已有标准?用一条真实推理链测试模型,若路径能走通且结论可解释,说明模型基本可用。

药物知识建模的最终目标不是画出一张漂亮的类图,而是让图谱能够回答“这个药通过什么靶点起作用”“这个成分可能和哪些药相互作用”“这个不良反应有哪些证据支持”等问题。实体类型决定能问什么,关系类型决定能推什么,属性决定能信什么,本体与词表决定这些答案是否一致、可复用、可扩展。