知识图谱基础:实体、关系、属性、三元组概念

先问你一个问题:我们为什么要搞知识图谱?

我在药企做项目的时候,团队里最头疼的事就是「数据孤岛」。基因变异结果在一张表,药物信息在另一个数据库,临床表型又在PDF里。你想想看,怎么把这些东西连起来?

说白了,知识图谱就是干这个的。它用一套统一的「语言」,把散落的数据串成一张网。今天我们就先把这套语言说清楚。

实体:图谱里的「名词」

实体是知识图谱中最基本的单元。你可以把它理解成现实世界中某个具体对象,比如:

  • 一种药物 —— 阿司匹林
  • 一个基因 —— CYP2C9
  • 一个靶点蛋白 —— VKORC1
  • 一种疾病 —— 房颤

每个实体都有一个唯一的ID。我习惯用「身份证」来类比——没有身份证,图谱就会乱套。

关键点:实体必须具有可标识性。在药物靶点场景里,一个实体通常对应一个数据库的条目,比如DrugBank ID、UniProt ID或HGNC基因名。

关系:连接实体的「动词」

光有实体是死的,得让它们动起来。关系就是那个「动词」。

举个例子:

  • 「阿司匹林 作用于 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"

每一个三元组都是一个原子事实。整个知识图谱就是由成千上万条这样的三元组构成的。

曾经踩过的坑:最开始我用中药方剂做实验,结果发现一味药里几十个化合物,每个化合物又对应多个靶点。一个方剂生成上万条三元组,里面有不少冗余。后来我加了「证据类型」和「置信度」属性,才把噪音降下来。

什么是药物靶点知识图谱?

说清楚了三元组,药物靶点知识图谱无非就是:把与「药物-靶点」相关的所有实体,用标准化的关系串联起来。

它的核心实体至少包括:

  1. 药物实体 —— 小分子、大分子、生物制剂
  2. 靶点实体 —— 蛋白、酶、受体、离子通道
  3. 基因实体 —— 编码靶点的基因
  4. 变异实体 —— SNP、Indel、CNV
  5. 表型实体 —— 疾病、药物反应、副作用

它们之间的关系网络,我画了张图,你看看就明白了:

药物靶点知识图谱:核心实体与关系 药物 华法林 · 阿司匹林 靶点蛋白 VKORC1 · COX-1 基因 CYP2C9 · VKORC1 基因变异 rs9923231 · *2/*3 临床表型 出血 · 治疗无效 VCF变异文件 作用于 编码于 包含变异位点 关联 影响(间接) 提取变异 核心关系链:药物 → 作用于 → 靶点蛋白 → 编码于 → 基因 → 包含变异位点 → 变异 → 关联 → 临床表型

从这张图你可以看出:

  • 药物通过「作用于」关系连到靶点蛋白
  • 靶点蛋白通过「编码于」关系连到基因
  • 基因通过「包含变异位点」连到具体的变异
  • 变异直接「关联」到临床表型
  • VCF文件就是变异实体的数据来源
实用建议:最开始构建图谱时不要贪多。我一般建议从「药物-靶点-基因」这条主干出发,先把这三类实体和它们的关系建好,再逐步加入变异和表型。一次纳入太多实体类型,关系容易乱。

为什么VCF要跟知识图谱绑定?

这个问题我去很多团队交流时都会被问到。

VCF文件本质上是二维表格,每一行是一个变异位点。但临床决策需要的是「这个变异影响了哪个药物?靶点是什么?有没有替代方案?」

把VCF里的变异映射到知识图谱的变异实体上,你就可以用一条SPARQL查询,直接从变异走到用药建议:

PREFIX dg: 
SELECT ?drug ?recommendation
WHERE {
    ?var dg:rsID "rs9923231" .
    ?var dg:affectsDrug ?drug .
    ?drug dg:adjuvant ?recommendation .
}

这就是知识图谱最朴素的价值:把扁平数据变成一个可以推理、可以导航的知识网络。

嗯,这里要注意:VCF里的变异标识符(rsID、CHROM-POS-REF-ALT)必须跟知识图谱里的实体标识一致。不一致会导致查询结果为空。我见过一个项目,因为NCBI数据库升级,rsID前缀格式变了,结果图谱里三千多个变异实体全没对上。后来我加了个「同义标识符」属性,才算彻底解决。

最后再总结一句话:实体是神经元,关系是突触,三元组是信号传递的基本单位。药物靶点知识图谱就是把这些信号搭成一张能回答「这个变异该怎么用药」的网。