第 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 本体推理:

知识图谱核心理论栈 图模型(节点 + 边 + 标签) 三元组(S, P, O) RDF(资源描述框架) IRI / 字面量 / 空节点 · Turtle / RDF/XML RDFS(类、子类、domain、range) OWL 本体语言(等价 / 传递性 / 推理)

这张图从左到右、从下到上,展示了一套层层递进的知识表达体系。你不需要一次性背下所有细节,只需要记住一个原则:越往下越基础,越往上推理能力越强。

曾经踩过的坑:刚学 OWL 时,我总想给所有属性加上传递性,以为这样推理结果更准。结果很多推理结果自相矛盾——因为传递性会带来大量隐式三元组,爆了整个图谱。这个东西,后面我们在推理章节还会细说,这里先提醒你:OWL 能力越强,约束也越多,别贪多求全。

好了,这一章的理论基础就讲这些。图模型、三元组、RDF、RDFS、OWL——这几个概念是后续所有操作的地基。在实战中,我大部分时间用的还是 RDF + RDFS,OWL 只在需要复杂推理的时候才出手。但不管怎么说,理解它们之间的关系,能让你的知识图谱设计思路更清晰。