第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
注意:别把实体和字符串搞混。“阿司匹林”这个字符串可能在文本里出现100次,但它在图谱里只有一个实体。这是去重和消歧的基础。

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(Web本体语言) 添加逻辑语义与推理能力 RDF是框架,OWL是逻辑;前者让你存数据,后者让你推新知

一句话总结:实体、关系、属性是砖块;语义网络是房子的结构图;RDF是盖房的施工标准;OWL是房子的智能系统,能自动判断哪面墙该开窗。