RDF 与三元组数据模型
一、RDF 数据模型与抽象语法
RDF 是 W3C 提出的、用于描述 Web 上资源的框架。其数据模型的核心就是我们在第 4、5 章见过的「图」:由节点和有向边组成,边带标签。形式化地说,RDF 图是三元组 (Subject, Predicate, Object) 的集合,其中:
- Subject:主体,必须是IRI或空白节点(Blank Node);
- Predicate:谓词,必须是IRI;
- Object:客体,可以是IRI、空白节点或字面量(Literal)。
这就是 RDF 的抽象语法:不关心具体用哪种文件格式写,只关心「图由哪些节点和边组成、节点和边由哪几类东西构成」。存储与查询引擎在内存或磁盘中维护的,也是这套抽象图;序列化只是「图 ↔ 字节流」的编码方式。
二、IRI / URI 与字面量
IRI(Internationalized Resource Identifier) 是 URI 的扩展,支持 Unicode,用于全局唯一地标识「资源」——在图里即实体或关系类型。例如 http://example.org/Einstein、https://www.wikidata.org/entity/Q937。RDF 1.1 用 IRI;日常中仍常把「URI」与「IRI」混用。同一实体在不同数据集中应尽量使用相同 IRI,才能实现关联与融合。
字面量(Literal) 表示「值」:字符串、数字、日期等。字面量由三部分可选组成:词法形式(Lexical Form)、可选的数据类型 IRI(如 xsd:integer、xsd:date)、以及仅用于字符串的语言标签(如 @zh、@en)。例如 "1921"^^xsd:gYear 表示 1921 年;"爱因斯坦"@zh 表示中文字符串。字面量不能作为三元组的 Subject 或 Predicate,只能作为 Object。
三、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 常用。
下面用同一组三元组示例三种写法(仅示意,保持英文以符合代码规范):
@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 .
{
"@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 等)。
五、命名图(Named Graph)与四元组
标准 RDF 图是「一堆三元组的集合」,不区分这些三元组来自哪份文档、哪个数据集。实际应用中常需要「这条三元组属于哪个图」——例如溯源(这条事实来自哪个数据源)、版本、访问控制。RDF 数据集(RDF Dataset) 在 RDF 1.1 中定义为:一个默认图(Default Graph)加上零个或多个命名图(Named Graph);每个命名图由一个 IRI 或空白节点标识,并包含一张三元组图。
这样,一条「陈述」就变成四元组 (Graph, Subject, Predicate, Object):G 指出该三元组属于哪张图。SPARQL 1.1 的 FROM、FROM NAMED、GRAPH 就是针对命名图做查询。存储层若支持四元组,即可按图划分数据、按图授权与溯源。
四元组 (G, S, P, O) 示例
同一三元组可出现在不同 G 中;查询时可指定 FROM :graph1 或 GRAPH ?g { ... }。
一句话: RDF 的数据模型是三元组 (S, P, O) 的集合,S 为 IRI 或空白节点,P 为 IRI,O 为 IRI、空白节点或字面量。IRI 全局唯一标识资源;字面量仅作客体,可带数据类型与语言标签。序列化常用 Turtle、RDF/XML、JSON-LD。空白节点表示图内匿名资源;命名图扩展为四元组 (G, S, P, O),支持溯源与多图查询。
六、小结
RDF 以三元组集合表示有向标注图;主体与谓词为 IRI(或主体可为空白节点),客体还可为字面量。IRI 全局唯一;字面量带可选类型与语言标签。Turtle 简洁可读,RDF/XML 为 XML 语法,JSON-LD 便于 Web 集成。空白节点表示图内匿名资源;命名图引入四元组 (G, S, P, O),支持按图溯源与查询。下一章我们对比属性图与 RDF:Neo4j 风格与 RDF 在表达力、查询与生态上的差异,以及选型考量。