RDF 与三元组数据模型

前面我们说了三元组 (S, P, O),但没规定 S、P、O 具体「怎么写」。 W3C 的 RDF(Resource Description Framework) 把这件事标准化了:用 IRI 全局唯一地标识「事物」与「关系类型」,用字面量表示数字、字符串等值,用三元组的集合表示整张图;再通过 Turtle、RDF/XML、JSON-LD 等序列化格式存成文件或网络 payload;还有空白节点命名图(Named Graph)扩展,用于匿名实体与多图/溯源。本章把 RDF 数据模型、IRI 与字面量、三种常见序列化、以及空白节点与命名图讲清楚,为后续 SPARQL 与本体打基础。

一、RDF 数据模型与抽象语法

RDF 是 W3C 提出的、用于描述 Web 上资源的框架。其数据模型的核心就是我们在第 4、5 章见过的「图」:由节点有向边组成,边带标签。形式化地说,RDF 图是三元组 (Subject, Predicate, Object) 的集合,其中:

这就是 RDF 的抽象语法:不关心具体用哪种文件格式写,只关心「图由哪些节点和边组成、节点和边由哪几类东西构成」。存储与查询引擎在内存或磁盘中维护的,也是这套抽象图;序列化只是「图 ↔ 字节流」的编码方式。

RDF 抽象图:主体与客体可为 IRI;客体还可为字面量;谓词为 IRI

二、IRI / URI 与字面量

IRI(Internationalized Resource Identifier) 是 URI 的扩展,支持 Unicode,用于全局唯一地标识「资源」——在图里即实体或关系类型。例如 http://example.org/Einsteinhttps://www.wikidata.org/entity/Q937。RDF 1.1 用 IRI;日常中仍常把「URI」与「IRI」混用。同一实体在不同数据集中应尽量使用相同 IRI,才能实现关联与融合。

字面量(Literal) 表示「值」:字符串、数字、日期等。字面量由三部分可选组成:词法形式(Lexical Form)、可选的数据类型 IRI(如 xsd:integerxsd:date)、以及仅用于字符串的语言标签(如 @zh@en)。例如 "1921"^^xsd:gYear 表示 1921 年;"爱因斯坦"@zh 表示中文字符串。字面量不能作为三元组的 Subject 或 Predicate,只能作为 Object。

IRI 可作主体/谓词/客体;字面量仅作客体,带类型或语言标签

三、RDF 序列化:Turtle、RDF/XML、JSON-LD

同一张 RDF 图可以写成多种序列化(Serialization)格式,便于人读、机器解析或与现有 Web 技术集成。

Turtle(TTL)

紧凑、可读性好;用 @prefix 缩写 IRI,同一主体的多条谓词可合并写。常用作开发与调试、小规模数据交换。

RDF/XML

XML 语法,历史最久、工具支持广;可读性较差、冗长。适合与 XML 生态集成、或需 XML 校验的场景。

JSON-LD

基于 JSON,易与前端和 REST API 集成;通过 @context 把键映射到 IRI。搜索引擎与 Schema.org 常用。

下面用同一组三元组示例三种写法(仅示意,保持英文以符合代码规范):

Turtle 示例:同一主体 ex:Einstein 的多条谓词合并写
@prefix ex: <http://example.org/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

ex:Einstein  ex:created    ex:Relativity ;
            ex:birthYear  "1879"^^xsd:gYear .
ex:Relativity  ex:awardYear  "1921"^^xsd:gYear .
JSON-LD 示例:@context 将键映射为 IRI
{
  "@context": {
    "ex": "http://example.org/",
    "created": "ex:created",
    "birthYear": "ex:birthYear",
    "awardYear": "ex:awardYear"
  },
  "@id": "ex:Einstein",
  "created": { "@id": "ex:Relativity" },
  "birthYear": { "@value": "1879", "@type": "xsd:gYear" }
}

四、空白节点(Blank Node)

空白节点是没有全局 IRI 的节点,只在当前图内存在、用于表示「存在某个东西,但不必或无法给全局名字」。例如「爱因斯坦有一个出生地,该地是德国的一座城市」——若不想单独给「那座城市」一个 IRI,可以用空白节点 _:b1 表示,再连上「位于 德国」「类型 城市」等三元组。

在 Turtle 里常用 _:xxx[ ] 表示;在抽象模型中,空白节点只需在图的范围内可区分即可(同一文档内不同空白节点 ID 不同)。空白节点不能直接跨图引用,合并图时需做标准化(Skolemization 等)。

空白节点:无全局 IRI,仅在图内存在,用于存在性表达

五、命名图(Named Graph)与四元组

标准 RDF 图是「一堆三元组的集合」,不区分这些三元组来自哪份文档、哪个数据集。实际应用中常需要「这条三元组属于哪个图」——例如溯源(这条事实来自哪个数据源)、版本、访问控制。RDF 数据集(RDF Dataset) 在 RDF 1.1 中定义为:一个默认图(Default Graph)加上零个或多个命名图(Named Graph);每个命名图由一个 IRI 或空白节点标识,并包含一张三元组图。

这样,一条「陈述」就变成四元组 (Graph, Subject, Predicate, Object):G 指出该三元组属于哪张图。SPARQL 1.1 的 FROMFROM NAMEDGRAPH 就是针对命名图做查询。存储层若支持四元组,即可按图划分数据、按图授权与溯源。

四元组 (G, S, P, O) 示例

(:graph1, ex:Einstein, ex:created, ex:Relativity)
(:graph1, ex:Relativity, ex:awardYear, "1921"^^xsd:gYear)
(:graph2, ex:Einstein, ex:birthPlace, _:b1)

同一三元组可出现在不同 G 中;查询时可指定 FROM :graph1 或 GRAPH ?g { ... }。

命名图:四元组 (G, S, P, O),G 标识图,用于溯源与数据集划分
RDF 数据集:多个命名图,每图内为三元组集合

一句话: RDF 的数据模型是三元组 (S, P, O) 的集合,S 为 IRI 或空白节点,P 为 IRI,O 为 IRI、空白节点或字面量。IRI 全局唯一标识资源;字面量仅作客体,可带数据类型与语言标签。序列化常用 Turtle、RDF/XML、JSON-LD。空白节点表示图内匿名资源;命名图扩展为四元组 (G, S, P, O),支持溯源与多图查询。

动手试试:W3C RDF Validator 中贴入几行 Turtle,检查是否合法并查看解析出的三元组;或访问 Wikidata Query,在「Examples」里选一条查询,观察返回的 RDF 结构。

六、小结

RDF 以三元组集合表示有向标注图;主体谓词为 IRI(或主体可为空白节点),客体还可为字面量。IRI 全局唯一;字面量带可选类型与语言标签。Turtle 简洁可读,RDF/XML 为 XML 语法,JSON-LD 便于 Web 集成。空白节点表示图内匿名资源;命名图引入四元组 (G, S, P, O),支持按图溯源与查询。下一章我们对比属性图与 RDF:Neo4j 风格与 RDF 在表达力、查询与生态上的差异,以及选型考量。