知识图谱基础:实体、关系、属性、三元组概念
先问你一个问题:我们为什么要搞知识图谱?
我在药企做项目的时候,团队里最头疼的事就是「数据孤岛」。基因变异结果在一张表,药物信息在另一个数据库,临床表型又在PDF里。你想想看,怎么把这些东西连起来?
说白了,知识图谱就是干这个的。它用一套统一的「语言」,把散落的数据串成一张网。今天我们就先把这套语言说清楚。
实体:图谱里的「名词」
实体是知识图谱中最基本的单元。你可以把它理解成现实世界中某个具体对象,比如:
- 一种药物 —— 阿司匹林
- 一个基因 —— CYP2C9
- 一个靶点蛋白 —— VKORC1
- 一种疾病 —— 房颤
每个实体都有一个唯一的ID。我习惯用「身份证」来类比——没有身份证,图谱就会乱套。
关系:连接实体的「动词」
光有实体是死的,得让它们动起来。关系就是那个「动词」。
举个例子:
- 「阿司匹林 作用于 COX-1」——关系是「作用于」
- 「华法林 代谢通过 CYP2C9」——关系是「代谢通过」
- 「VKORC1 参与 凝血级联」——关系是「参与」
我在整合公共数据库时发现一个坑:不同来源对同一关系的命名老不一致。有的叫「target」,有的叫「binds_to」,还有叫「interacts_with」的。命名规范从一开始就要定死,不然后面SPARQL查起来全是泪。
属性:给实体加「形容词」
实体本身还有很多细节。比如一个药物实体,它肯定有名、化学式、分子量、给药途径等等。这些就是属性。
| 实体类型 | 常见属性 | 示例值 |
|---|---|---|
| 药物 | 名称、SMILES、分子量、半衰期 | 阿司匹林、CC(=O)Oc1ccccc1C(=O)O、180.16 |
| 基因 | 符号、全名、染色体位置、外显子数 | CYP2C9、cytochrome P450 2C9、10q23.33、9 |
| 变异 | rsID、等位基因、人群频率、临床意义 | rs1799853、C/T、0.15、响应改变 |
| 疾病 | 名称、ICD-10编码、遗传模式 | 深静脉血栓、I80.2、多基因 |
属性跟关系的区别:属性是附属于某个实体的「内部」信息,而关系是两个实体之间的「外部」连接。搞混了会导致图结构变臃肿。
三元组:知识图谱的最小组件
好,核心来了。把实体、关系、属性组合起来,就变成了三元组。
三元组 = 主体 + 谓词 + 客体
我个人习惯把三元组比作「一句话」:
- 主体 = 主语(一个实体)
- 谓词 = 谓语(关系或属性名)
- 客体 = 宾语(另一个实体 或 一个字面量)
来看两个具体例子:
# 实体-关系-实体 模式
阿司匹林 -> 作用于 -> PTGS1
# 实体-属性-字面量 模式
阿司匹林 -> 半衰期 -> "0.25小时"
# VCF关联场景下的三元组
rs9923231 -> 影响药物 -> 华法林
rs9923231 -> 人群频率 -> "0.37"
每一个三元组都是一个原子事实。整个知识图谱就是由成千上万条这样的三元组构成的。
什么是药物靶点知识图谱?
说清楚了三元组,药物靶点知识图谱无非就是:把与「药物-靶点」相关的所有实体,用标准化的关系串联起来。
它的核心实体至少包括:
- 药物实体 —— 小分子、大分子、生物制剂
- 靶点实体 —— 蛋白、酶、受体、离子通道
- 基因实体 —— 编码靶点的基因
- 变异实体 —— SNP、Indel、CNV
- 表型实体 —— 疾病、药物反应、副作用
它们之间的关系网络,我画了张图,你看看就明白了:
从这张图你可以看出:
- 药物通过「作用于」关系连到靶点蛋白
- 靶点蛋白通过「编码于」关系连到基因
- 基因通过「包含变异位点」连到具体的变异
- 变异直接「关联」到临床表型
- VCF文件就是变异实体的数据来源
为什么VCF要跟知识图谱绑定?
这个问题我去很多团队交流时都会被问到。
VCF文件本质上是二维表格,每一行是一个变异位点。但临床决策需要的是「这个变异影响了哪个药物?靶点是什么?有没有替代方案?」
把VCF里的变异映射到知识图谱的变异实体上,你就可以用一条SPARQL查询,直接从变异走到用药建议:
PREFIX dg:
SELECT ?drug ?recommendation
WHERE {
?var dg:rsID "rs9923231" .
?var dg:affectsDrug ?drug .
?drug dg:adjuvant ?recommendation .
}
这就是知识图谱最朴素的价值:把扁平数据变成一个可以推理、可以导航的知识网络。
最后再总结一句话:实体是神经元,关系是突触,三元组是信号传递的基本单位。药物靶点知识图谱就是把这些信号搭成一张能回答「这个变异该怎么用药」的网。