第 4 章:知识图谱基础理论——图模型、三元组、RDF 与 RDFS、OWL 本体语言
这一章,我们来啃掉知识图谱最核心的理论基础。老实说,这些概念听起来挺吓人——什么 RDF、RDFS、OWL,一堆缩写。但你把它拆开看,其实就是一套描述“世界万物之间关系”的通用语言。我当年刚开始搞知识图谱时,也对着这些术语头疼过,后来发现,只要你理解了图模型和三元组,剩下的全是锦上添花。
我们先从最根本的东西说起。
4.1 图模型:知识图谱的骨架
知识图谱本质上就是一个图。但这个图不是我们平时看到的柱状图、折线图,而是由节点(Node)和边(Edge)构成的网络。
- 节点:代表实体。例如“阿司匹林”、“头痛”、“片剂”。
- 边:代表关系。例如“治疗”、“属于”、“剂型是”。
在药物领域,这个结构特别清晰。一种药物是一个节点,它的靶点是另一个节点,两者之间的“作用于”关系就是一条边。整个图谱就是由无数这样的小结构拼起来的。
核心要点:知识图谱用的是有向标签图(Directed Labeled Graph)。每条边都有方向,并且带有一个标签,用来精确描述关系的语义。
举个简单的例子——
节点A: 阿司匹林
节点B: 环氧合酶-1(COX-1)
边 (A -> B): 抑制
这个图的意思就是“阿司匹林抑制COX-1”。简单吧?但正是这种看似简单的结构,撑起了整个知识图谱的体系。我在做一个药物重定位项目时,就是靠这种图结构,从一个药物出发,沿着“药物-靶点-疾病”的路径,才找到了潜在的旧药新用方案。
4.2 三元组:知识图谱的原子单位
图模型里的每一条边,在知识图谱里都有一个正式的名字——三元组 (Triple)。它是知识图谱中最小的、不可再分的知识单元。
三元组的结构固定为:
(主体, 谓词, 客体)
(Subject, Predicate, Object)
拿上面的例子来说:
主体: 阿司匹林
谓词: 抑制
客体: COX-1
这三个元素缺一不可。没有主体,知识不知道从哪来;没有谓词,关系说不清楚;没有客体,知识没有落脚点。
| 三元组元素 | 含义 | 药物知识图谱示例 |
|---|---|---|
| 主体 | 被描述的实体 | 布洛芬 |
| 谓词 | 描述关系的谓词 | 属于 |
| 客体 | 指向的实体或值 | 非甾体抗炎药 |
我个人习惯:在构建知识图谱时,我会先把所有知识拆解成三元组,再考虑怎么存、怎么查。你可以把每个三元组看成一句最简单的陈述句。
4.3 RDF:让三元组变成标准语言
三元组是个好概念,但光有概念没法在机器之间流通。这就引出了RDF (Resource Description Framework,资源描述框架)。
RDF 定义了如何用标准化的方式表达这些三元组。说白了,它就是一个序列化格式——把三元组写成机器能读懂的文本。
RDF 的节点类型有三种,我整理成了表格,方便你对比:
| 节点类型 | 描述 | 示例 |
|---|---|---|
| IRI(国际化资源标识符) | 全局唯一的标识符,类似URL | <http://example.org/drug/aspirin> |
| 字面量 | 具体的数据值,如字符串、数字 | "阿司匹林"@zh 或 "100"^^xsd:integer |
| 空节点 | 匿名资源,没有全局IRI | _:node1 |
一段标准的 RDF 数据长这样(Turtle 格式,最常用的一种):
@prefix drug: <http://example.org/drug/> .
@prefix rel: <http://example.org/relationship/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
drug:aspirin rel:treatment drug:headache .
drug:aspirin rel:dosage "500"^^xsd:integer .
drug:aspirin rdfs:label "阿司匹林"@zh .
这里 @prefix 是命名空间声明,相当于给长长的 IRI 起了个简称。你看最后一行,rdfs:label 其实来自 RDFS——别急,我们马上就讲它。
注意:RDF 本身只提供了描述事实的骨架,它并不限制你用什么谓词。这就意味着,两个不同的数据源可能用不同的词描述同一个关系——比如“治疗”和“用于治疗”。这时候就需要 RDFS 或 OWL 来加一层约束。
4.4 RDFS:给 RDF 加上约束
RDFS (RDF Schema) 是 RDF 的扩展,它的作用很简单——定义类和属性之间的关系。
举个例子。没有 RDFS 时,我可以随口说“布洛芬 是 感冒药”,但“感冒药”到底是什么?RDFS 允许我定义一个 drug:Drug 类,然后声明“所有感冒药都是 Drug 的子类”。这样一来,机器就能自动推理出“布洛芬也是一种药物”。
RDFS 的核心词汇包括:
rdfs:Class—— 定义类。rdfs:subClassOf—— 类的继承关系。rdfs:subPropertyOf—— 属性的继承关系。rdfs:domain和rdfs:range—— 定义属性的作用域和值域。
这才是真正的工程化。比如:
drug:Drug rdf:type rdfs:Class .
drug:Analgesic rdfs:subClassOf drug:Drug .
drug:aspirin rdf:type drug:Drug .
drug:aspirin rel:treatment drug:headache .
rel:treatment rdfs:domain drug:Drug .
rel:treatment rdfs:range medical:Disease .
这段代码告诉机器:treatment 这个属性只能用于 Drug 类的实例(domain),只能指向 Disease 类的实例(range)。如果你给“阿司匹林”配置了一个“颜色:红色”的关系,机器会报错——因为“颜色”不对应到 Drug 和 Disease 的 domain/range 约束。
我记得有一次做药物相互作用图谱,有人把“副作用”和“禁忌症”混在一起用。后来我加上 RDFS 的 domain/range 约束,才把这些乱象治住。说白了,RDFS 就是帮你管住数据的“户口本”。
4.5 OWL 本体语言:更强的推理能力
如果说 RDFS 是一种轻量级的约束语言,那 OWL (Web Ontology Language) 就是重型武器了。它提供了更丰富的逻辑表达能力,能进行复杂的推理。
OWL 的核心能力包括:
- 等价关系:
owl:equivalentClass,owl:sameAs。 - 属性特征:传递性 (
owl:TransitiveProperty),对称性 (owl:SymmetricProperty),函数性 (owl:FunctionalProperty)。 - 限制:
owl:someValuesFrom,owl:allValuesFrom,owl:cardinality。
用一个实际例子来说明 OWL 的威力:
drug:Paracetamol rdf:type owl:Class .
drug:Acetaminophen owl:sameAs drug:Paracetamol .
rel:isMetabolizedBy rdf:type owl:TransitiveProperty .
rel:isMetabolizedBy rdfs:domain drug:Drug .
rel:isMetabolizedBy rdfs:range biological:Enzyme .
如果你知道“扑热息痛是通过 CYP2E1 代谢的”,并且“CYP2E1 是肝脏中的一种酶”,OWL 可以自动推理出“扑热息痛是在肝脏中代谢的”。这是 RDFS 做不到的。
一句话总结:RDF 是数据的容器,RDFS 是简单的模式定义,OWL 是带逻辑推理的本体。
4.6 本章核心知识图谱
下面这张 SVG 图展示了这一章提到的核心理论栈——从底层的图模型,到上层的 OWL 本体推理:
这张图从左到右、从下到上,展示了一套层层递进的知识表达体系。你不需要一次性背下所有细节,只需要记住一个原则:越往下越基础,越往上推理能力越强。
曾经踩过的坑:刚学 OWL 时,我总想给所有属性加上传递性,以为这样推理结果更准。结果很多推理结果自相矛盾——因为传递性会带来大量隐式三元组,爆了整个图谱。这个东西,后面我们在推理章节还会细说,这里先提醒你:OWL 能力越强,约束也越多,别贪多求全。
好了,这一章的理论基础就讲这些。图模型、三元组、RDF、RDFS、OWL——这几个概念是后续所有操作的地基。在实战中,我大部分时间用的还是 RDF + RDFS,OWL 只在需要复杂推理的时候才出手。但不管怎么说,理解它们之间的关系,能让你的知识图谱设计思路更清晰。