第2章:药物知识图谱基础概念
好,咱们开始搭建地基。
做知识图谱,很多人一上来就堆数据、写代码。我见过不少项目,跑了半年,图也导进去了,最后发现查出来的东西乱七八糟。为什么?因为最基础的概念没想清楚。
这一章,咱们就把四个核心概念掰开揉碎了讲。你搞懂它们,后面的路就好走了。
2.1 实体:知识图谱里的“名词”
实体,说白了就是知识图谱里的基本单位。你把它理解成“这个东西”就好了。
在药物领域,实体到处是:
- 药物本身:阿司匹林、二甲双胍、PD-1抑制剂
- 疾病:2型糖尿病、高血压、肺癌
- 基因/蛋白:EGFR、HER2、CYP2C9
- 靶点:COX-2、PD-L1
- 临床试验:NCT04280705
- 不良反应:恶心、肝功能异常
每个实体都有一个唯一标识。我习惯用URI(统一资源标识符)来做这件事。比如:
http://example.org/drug/aspirin
http://example.org/disease/hypertension
http://example.org/gene/EGFR
2.2 关系:把实体串起来的“动词”
光有实体不行,它们得连起来。关系就是那根线。
关系是有方向的。它描述两个实体之间的特定联系。
| 头实体 | 关系 | 尾实体 |
|---|---|---|
| 阿司匹林 | 治疗 | 头痛 |
| 奥美拉唑 | 与...相互作用 | 氯吡格雷 |
| EGFR | 与...相关 | 非小细胞肺癌 |
| 二甲双胍 | 引起 | 恶心 |
关系三元组就是(实体, 关系, 实体)。这是知识图谱最基本的数据单元。我在项目中遇到过一个问题:两个团队定义了不同的关系词汇,一个用“治疗”,一个用“用于治疗”,结果数据合并时乱成一锅粥。所以,关系词汇表必须统一。
2.3 属性:实体自己的“形容词”
实体除了跟别人有联系,自己也有特征。这就是属性。
属性通常是一个键值对。它描述实体的内在特征,而不是跟其他实体的关联。
举个例子:
实体:阿司匹林
- 分子式:C9H8O4
- 分子量:180.16 g/mol
- 商品名:拜阿司匹灵
- 剂量规格:100mg
- 给药途径:口服
关系连接两个实体,属性描述一个实体。我刚开始做的时候,经常把“药物-公司”这个关系写成属性。你想想看,“拜耳公司”本身就是一个实体,应该用关系连接,而不是写成阿司匹林的一个字符串属性。这两个的差别,直接决定了你的图能不能做深度推理。
2.4 语义网络:用图看世界
把实体、关系、属性放在一起,你得到的就是一个语义网络。
它本质上是一个有向图。节点是实体,边是关系。属性挂在节点上。
为什么要画成网络?因为药物知识天然适合用图来表示。一种药作用于多个靶点,一个靶点关联多种疾病,一种疾病有多种基因突变……这套相互关联的体系,用关系数据库查起来得做N次JOIN,用图结构却能一步直达。
2.5 RDF:知识图谱的“语法”
语义网络只是个概念。怎么把它存下来、传出去、让机器读懂?这就需要标准了。
RDF(资源描述框架) 就是W3C制定的那个标准。它把一切陈述都写成三元组:
主体(Subject) → 谓语(Predicate) → 客体(Object)
示例(实际SPARQL查询结果):
@prefix drug: <http://example.org/drug/> .
@prefix dis: <http://example.org/disease/> .
@prefix rel: <http://example.org/relation/> .
drug:aspirin rel:treats dis:headache .
drug:aspirin rel:hasSideEffect "nausea" .
RDF的好处是万物皆可URI。药物、疾病、甚至关系本身,都能用URI表示。这样全世界的数据就能互相链接。
核心理解:RDF不关心你怎么存数据,它只规定你怎么说数据。你可以把它存在文件里、关系数据库里、专门的图数据库里。格式不重要,三元组才重要。
2.6 OWL:知识图谱的“逻辑”
光有RDF还不够。你只能描述“A治疗B”,但机器不知道“治疗”是什么意思。它只是两个字符串。
OWL(Web本体语言) 就是给这些词汇加上了逻辑含义。它让你能定义:
- 类(Class):药物是一种类,疾病是另一种类
- 属性限制:“治疗”关系的域是药物,范围是疾病
- 等价关系:如果A治疗B,且B是C的子类,那么A也隐含地治疗C
- 不相交关系:一种物质不能同时是“药物”和“毒物”的实例
举个例子,用OWL定义一下“药物”这个类:
<owl:Class rdf:about="&http://example.org/onto#Drug">
<rdfs:subClassOf rdf:resource="&http://example.org/onto#ChemicalSubstance"/>
<rdfs:label>药物</rdfs:label>
</owl:Class>
<owl:ObjectProperty rdf:about="&http://example.org/onto#treats">
<rdfs:domain rdf:resource="&http://example.org/onto#Drug"/>
<rdfs:range rdf:resource="&http://example.org/onto#Disease"/>
<rdfs:label>治疗</rdfs:label>
</owl:ObjectProperty>
有了OWL,机器才能做推理。比如,如果你知道“阿司匹林属于NSAID类药物,NSAID类药物有抗炎作用”,那机器就能自动推出“阿司匹林有抗炎作用”。这就是知识图谱比简单标签厉害的地方。
我的建议:如果不是做生物医学本体研究,不用深入到OWL的复杂公理。先用RDF把数据结构化,用OWL的类层次关系把逻辑理顺就行。我见过太多人一开始就搞复杂推理,结果图建了半年,连基本的数据查询都没跑通。
2.7 各概念的层次结构
咱们用一张SVG图把这些概念串起来。你看,从底层的数据载体,到顶层的逻辑推理,层次很清楚。
一句话总结:实体、关系、属性是砖块;语义网络是房子的结构图;RDF是盖房的施工标准;OWL是房子的智能系统,能自动判断哪面墙该开窗。