3. 本体与语义网络:给知识图谱搭骨架

说实话,我刚开始接触知识图谱时,觉得"本体"这个词玄乎得很。后来在真实的药物研发项目中一折腾,才明白本体就是给数据定规矩的那张蓝图。这一章我们就来聊聊本体、语义网络,以及怎么用工具把概念关系画出来。

3.1 本体到底是个啥?

打个比方。你手里有一堆关于药物的资料——哪个药治什么病、什么成分、什么剂量。如果没有统一规则,"阿司匹林"会被描述成"止痛药""解热镇痛药",甚至"那个白色小片"。本体就是规定:在我们这个领域里,阿司匹林是"一种非甾体抗炎药",它的活性成分是"乙酰水杨酸"。

从技术角度看,本体包含几个核心要素:

  • 类(Class):比如"药物""疾病""成分"
  • 属性(Property):比如"治疗""含有""剂量为"
  • 关系(Relation):比如"阿司匹林 ⊑ 非甾体抗炎药"
  • 个体(Individual):比如"布洛芬片500mg"这个具体的药

我个人习惯把本体看作知识图谱的模式层。图结构的数据是血肉,本体就是骨架,两者缺一不可。

▶ 本体 vs 知识图谱
本体 = 定义概念和关系(模式层)
知识图谱 = 实例化这些概念和关系(数据层)
一句话:有了本体,知识图谱才不会变成一堆散沙。

3.2 从语义网络到本体语言

语义网络这个概念早在1960年代就出现了。说白了就是"节点-边"的图结构:节点表示概念,边表示关系。我最早在文献里看到那个经典的"麻雀-鸟-动物"层次图时,第一反应是——这不就是最朴素的图谱吗?

但单纯的语义网络有个硬伤:缺乏形式化逻辑。你说"猫是哺乳动物",我也能说"猫是会飞的动物"——对不对?本体语言的任务,就是用严格的逻辑给语义网络加一层铠甲。

最常见的两种本体语言是:

语言全称特点
RDFResource Description Framework三元组结构(主体-谓词-客体),适合数据表达
OWLWeb Ontology Language基于描述逻辑,具备推理能力
💡 我的经验
在项目中我倾向于:RDF用于数据交换,OWL用于定义业务逻辑。你如果只做数据整合,RDF就够;要想做推理(比如"所有NSAIDs都有抗炎作用→推导出阿司匹林能抗炎"),就得用OWL。

3.2.1 RDF 上手

RDF 的基本单位是三元组:

@prefix drug: <http://example.org/drug/> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .

drug:Aspirin rdf:type drug:NSAID .
drug:Aspirin drug:treats drug:Headache .

你看,每个语句就是"一件事物-属性-值"。简洁明了,但表达能力有限——比如你没法直接说"所有止痛药都是药物下的一种",这就得靠OWL了。

3.2.2 OWL 核心能力

OWL 在 RDF 之上加入了描述逻辑的运算符。举个例子:

<owl:Class rdf:ID="NSAID">
  <rdfs:subClassOf rdf:resource="Drug"/>
  <owl:intersectionOf rdf:parseType="Collection">
    <rdf:Description rdf:about="AntiInflammatoryDrug"/>
    <rdf:Description rdf:about="NonSteroidalDrug"/>
  </owl:intersectionOf>
</owl:Class>

这段代码说:NSAID = AntiInflammatoryDrug ∩ NonSteroidalDrug。推理器就能自动判定,凡是满足"抗炎+非甾体"的药物都属于NSAID。我在搭建药物禁忌知识库时就靠这个自动推出来700多条新关系。

3.3 Protégé:画本体的利器

Protégé 是斯坦福大学开发的免费本体编辑器。我当年刚入行时被它丑萌的界面吓到过,但用习惯就离不开了。

基本操作步骤:

  1. 新建项目:选"OWL/RDF Project"
  2. 定义类:Classes 标签页里添加"Drug""Disease""Ingredient"
  3. 添加属性:Object Properties 用来连接类(如"treats"),Data Properties 用来表示值(如"dosage")
  4. 创建实例:Individuals 标签下填入具体药物
  5. 推理验证:用 Pellet 或 HermiT 推理器检查逻辑一致性
⚠️ 我曾经踩过的坑
Protégé 默认用 UTF-8 编码,但很多中文药物名直接复制进来会乱码。我后来习惯先在 Notepad++ 里转成纯文本再粘贴。另一个坑是推理器选错了——Pellet 对大规模本体性能更好,HermiT 适合精确推理,别混用。

3.4 药物领域本体示例

你在真实项目中大概率不需要从头造一个本体。直接用现成的行业本体,然后按需求做修剪扩展就行。我个人最常用的是这两个:

本体全称覆盖范围
DRONDrug Ontology药物、成分、剂型、制造商
ChEBIChemical Entities of Biological Interest化学实体、分子结构、生物功能

3.4.1 DRON 的结构

DRON 把药物组织成几个大类:

  • Drug Product(成品药)
  • Drug Component(活性成分)
  • Dosage Form(剂型)
  • Manufacturer(生产商)

DRON 在设计上大量复用了已有的 BFO(Basic Formal Ontology)和 ChEBI,所以你通常在 Protégé 里 import 这两个本体就能直接用。我自己做过一个 DRON 的子集抽取,只保留抗肿瘤药物部分,跑了不到三分钟就拿到了4000多个概念。

3.4.2 ChEBI 的独到之处

ChEBI 在化学层面上做得非常精细。它不光有类,还定义了"has part""is a""role of"等语义关系。举个例子:

Acetylsalicylic acid 是 cyclooxygenase inhibitor 的 role
Acetylsalicylic acid 是 Carboxylic acid 的子类

把 DRON 的药品信息和 ChEBI 的化学结构结合起来,就能回答"哪些药物同时具有抗炎和抗凝血功能"这类跨界问题。我在做药物重定位项目时,这种融合本体起了大作用。

▶ 实用建议
如果你刚开始做药物知识图谱,直接拿 ChEBI 的 OWL 版本(大约20MB)作为基础,不要自己写类。然后用 Protégé 的 import 功能把 DRON 拖进来。最多两天,一个药物领域本体框架就有了。

3.5 本体与语义网络知识体系

本体与语义网络技术栈 本体与语义网络技术栈 语义网络(节点+边) 推理器 (Pellet/HermiT) RDF 三元组|数据交换 OWL 描述逻辑|推理 Protégé 建模|编辑|验证 药物领域本体 DRON · ChEBI 药物知识图谱 实例化本体后的图数据 核心工程原则 • 用 RDF 作为数据层,用 OWL 作为模式层 • 复用行业本体(DRON/ChEBI)而非自创 • 推理器选 Pellet 用于大规模,HermiT 用于精确

上图从左到右、从下到上展示了这章的技术栈。你从语义网络起步,依次经过 RDF/OWL 的形式化,再用 Protégé 工具建模,最后落到特定领域的应用程序——DRON 和 ChEBI 就是现成的资产。想做好药物知识图谱,把这套体系吃透就够了。

▶ 本章要点回顾
• 本体是知识图谱的骨架,定义类、属性、关系和个体。
• RDF 负责数据层三元组,OWL 负责模式层逻辑推理。
• Protégé 是本体编辑器,配合 Pellet/HermiT 做推理验证。
• DRON 和 ChEBI 是药物领域现成的高质量本体,拿来即用。