3. 本体与语义网络:给知识图谱搭骨架
说实话,我刚开始接触知识图谱时,觉得"本体"这个词玄乎得很。后来在真实的药物研发项目中一折腾,才明白本体就是给数据定规矩的那张蓝图。这一章我们就来聊聊本体、语义网络,以及怎么用工具把概念关系画出来。
3.1 本体到底是个啥?
打个比方。你手里有一堆关于药物的资料——哪个药治什么病、什么成分、什么剂量。如果没有统一规则,"阿司匹林"会被描述成"止痛药""解热镇痛药",甚至"那个白色小片"。本体就是规定:在我们这个领域里,阿司匹林是"一种非甾体抗炎药",它的活性成分是"乙酰水杨酸"。
从技术角度看,本体包含几个核心要素:
- 类(Class):比如"药物""疾病""成分"
- 属性(Property):比如"治疗""含有""剂量为"
- 关系(Relation):比如"阿司匹林 ⊑ 非甾体抗炎药"
- 个体(Individual):比如"布洛芬片500mg"这个具体的药
我个人习惯把本体看作知识图谱的模式层。图结构的数据是血肉,本体就是骨架,两者缺一不可。
本体 = 定义概念和关系(模式层)
知识图谱 = 实例化这些概念和关系(数据层)
一句话:有了本体,知识图谱才不会变成一堆散沙。
3.2 从语义网络到本体语言
语义网络这个概念早在1960年代就出现了。说白了就是"节点-边"的图结构:节点表示概念,边表示关系。我最早在文献里看到那个经典的"麻雀-鸟-动物"层次图时,第一反应是——这不就是最朴素的图谱吗?
但单纯的语义网络有个硬伤:缺乏形式化逻辑。你说"猫是哺乳动物",我也能说"猫是会飞的动物"——对不对?本体语言的任务,就是用严格的逻辑给语义网络加一层铠甲。
最常见的两种本体语言是:
| 语言 | 全称 | 特点 |
|---|---|---|
| RDF | Resource Description Framework | 三元组结构(主体-谓词-客体),适合数据表达 |
| OWL | Web 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é 是斯坦福大学开发的免费本体编辑器。我当年刚入行时被它丑萌的界面吓到过,但用习惯就离不开了。
基本操作步骤:
- 新建项目:选"OWL/RDF Project"
- 定义类:Classes 标签页里添加"Drug""Disease""Ingredient"
- 添加属性:Object Properties 用来连接类(如"treats"),Data Properties 用来表示值(如"dosage")
- 创建实例:Individuals 标签下填入具体药物
- 推理验证:用 Pellet 或 HermiT 推理器检查逻辑一致性
Protégé 默认用 UTF-8 编码,但很多中文药物名直接复制进来会乱码。我后来习惯先在 Notepad++ 里转成纯文本再粘贴。另一个坑是推理器选错了——Pellet 对大规模本体性能更好,HermiT 适合精确推理,别混用。
3.4 药物领域本体示例
你在真实项目中大概率不需要从头造一个本体。直接用现成的行业本体,然后按需求做修剪扩展就行。我个人最常用的是这两个:
| 本体 | 全称 | 覆盖范围 |
|---|---|---|
| DRON | Drug Ontology | 药物、成分、剂型、制造商 |
| ChEBI | Chemical 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 本体与语义网络知识体系
上图从左到右、从下到上展示了这章的技术栈。你从语义网络起步,依次经过 RDF/OWL 的形式化,再用 Protégé 工具建模,最后落到特定领域的应用程序——DRON 和 ChEBI 就是现成的资产。想做好药物知识图谱,把这套体系吃透就够了。
• 本体是知识图谱的骨架,定义类、属性、关系和个体。
• RDF 负责数据层三元组,OWL 负责模式层逻辑推理。
• Protégé 是本体编辑器,配合 Pellet/HermiT 做推理验证。
• DRON 和 ChEBI 是药物领域现成的高质量本体,拿来即用。