RDF 的 Turtle、TriG、N-Triples、N-Quads、JSON-LD 和 RDF/XML 有什么区别?
rdf turtle trig ntriples nquads jsonld rdfxml graph dataset differences
Turtle、N-Triples、JSON-LD 与 RDF/XML 主要用于序列化 RDF 图;TriG 和 N-Quads 还能表达包含默认图与命名图的 RDF Dataset。它们是不同语法,不是不同的知识图谱模型。
快速对照
左右滑动查看完整对比 →| 格式 | 主要承载 | 可读性 | Prefix/Base | 典型媒体类型 | 典型用途 |
|---|---|---|---|---|---|
| Turtle | 单个 RDF Graph | 高 | 支持 | text/turtle | 人工编写、配置、文档示例 |
| TriG | RDF Dataset | 高 | 支持 | application/trig | Default + Named Graphs |
| N-Triples | 单个 RDF Graph | 低但简单 | 不支持 Prefix/Base 缩写 | application/n-triples | 行式交换、测试、Diff 前处理 |
| N-Quads | RDF Dataset | 低但简单 | 不支持 Prefix/Base 缩写 | application/n-quads | 数据集导出、图来源批处理 |
| JSON-LD | RDF Graph/Dataset 的 JSON 表达 | 对 Web 开发友好 | 通过 @context | application/ld+json | API、网页、JSON 生态 |
| RDF/XML | 单个 RDF Graph | 较冗长 | XML namespace/base | application/rdf+xml | 传统 RDF/XML 工具与兼容系统 |
RDF Graph 与 RDF Dataset 先分清
RDF Graph 是 Triple 的集合,每条 Triple 由 Subject、Predicate、Object 组成。RDF Dataset 包含一个 Default Graph 和零个或多个 Named Graph;Named Graph 由 graph name 与一个 RDF Graph 关联。
若数据只有一个 Graph,Turtle、N-Triples、JSON-LD 与 RDF/XML 都可作为候选。若要保留“这组三元组来自数据源 A、那组来自版本 B”这类图分区,则需要 Dataset-capable 格式,例如 TriG 或 N-Quads。
把 N-Quads 的第四列删除会合并图边界,信息不可逆。反过来,把单 Graph 文件装进一个随意 Named Graph 也会新增应用语义,不能称为纯格式转换。
Turtle:面向人的紧凑单图语法
Turtle 使用 Prefix、Base IRI、;、,、Blank Node property lists 与 collections 压缩重复内容:
a 是 rdf:type 的语法糖;分号复用 Subject,逗号复用 Subject 与 Predicate。它们只缩短文本,不创建额外语义层。
Turtle 适合手工维护本体、小型知识图谱和规范示例。但紧凑语法让简单逐行 parser 不可靠,必须使用合规 RDF parser。
Turtle 的 Prefix 与 Base IRI
Prefix declaration 把 schema:name 展开为完整 IRI。Prefix 名只是当前文档缩写,不进入 RDF Graph;解析后的 Predicate 是完整 IRI。两个文件可用不同 Prefix 表达同一图。
Base IRI 用于解析相对 IRI。Base 可以由文档声明、解析器参数或检索 URL 提供。移动文件或改变 Base 后,相同文本可能解析成不同完整 IRI,因此数据交换最好明确声明 Base 或使用绝对 IRI。
Prefix 不是 XML namespace,虽然都用于缩写名称,语法与解析规则不同。不能把 Turtle Prefix declaration 原样复制进 RDF/XML。
TriG:给 Turtle 加上图块
TriG 扩展 Turtle,用 graph blocks 表达 RDF Dataset:
带 graph label 的块是 Named Graph,无名称块或块外的相应语法进入 Default Graph。Graph label 通常是 IRI,也可按规范使用 Blank Node label。
TriG 适合人读的数据集、provenance 分区和 SPARQL dataset 交换,但 graph name 本身不自动断言“来源”“签名者”或“真值”。它只是 Dataset 中的名称关联,业务语义需用额外 vocabulary 建模。
Turtle 与 TriG 的关键区别
Turtle 文档表示一个 RDF Graph,TriG 文档表示 RDF Dataset。TriG 大量复用 Turtle 的 Triple 语法,所以一个简单文件看起来可能几乎相同,但媒体类型和 parser 模式不同。
不要依赖 Turtle parser 容忍 graph blocks;也不要用 TriG 导出后只读取 Default Graph,忽略所有 Named Graph。导入 API 应明确返回 Graph 还是 Dataset。
如果系统数据库内部支持多个 Named Graph,而导出端选择 Turtle,就必须为每个图分别导出或明确合并策略,否则来源边界会丢失。
N-Triples:每行一个 Triple
N-Triples 使用非常受限的行式语法:
它不支持 Prefix、Base、;、, 或 Turtle 的集合缩写。每条 Triple 独立,适合流式处理、测试 fixture、分片和许多批处理工具。
“一行一个 Triple”不等于任意换行都可无脑 split,literal escape、字符编码和语法仍需按规范解析。错误恢复与行号定位通常比 Turtle 简单,但不是 CSV。
N-Quads:N-Triples 加第四个 Graph Label
N-Quads 在 Triple 后可增加 graph label,表示该 Triple 属于哪个 Named Graph:
第一行有第四项,属于 Named Graph;第二行只有 Triple,属于 Default Graph。结尾句点仍是语法的一部分。
N-Quads 适合大规模 Dataset 导出、排序、外部合并和逐行管线。它比 TriG 冗长,却减少状态化缩写,更适合机器生成与处理。
N-Triples 与 N-Quads 的区别
N-Triples 只能承载一个 Graph;N-Quads 能承载 Dataset。将一个 N-Triples 文件作为 N-Quads 解析时,所有行可视为 Default Graph,但媒体类型与工具支持仍应正确声明。
第四项不是“来源 URL 注释”,而是 Graph Label。它不会自动表示 Triple 的创建者、时间或置信度。要表达 provenance,应在另一个 Graph 中对 graph IRI 建立明确语句,使用 PROV-O 等 vocabulary。
按文本 sort 的 N-Quads 也不是可靠 RDF Dataset canonicalization。Blank Node labels 可变化,Unicode/escape 表达不同,文本顺序本来就没有 RDF 语义。
JSON-LD:让 JSON 表达 Linked Data
JSON-LD 使用 @context 将 JSON keys 映射为 IRIs,并定义类型、语言、容器和相对 IRI 解析:
普通 JSON key name 本身没有 RDF 意义,是 Context 把它映射到 schema:name。@id 表示节点标识,@type、@value、@language、@graph 等关键字承担 Linked Data 语义。
JSON-LD 是 RDF 的标准 JSON 序列化/处理模型,不等于“任何 JSON 都自动成为知识图谱”。
@context 是语义映射,不只是字段别名
Context 可以内联,也可引用远程文档。它不仅缩短 IRI,还能指定某字段值是 IRI、语言字符串、类型化 literal、list 或 set。错误 Context 会在 JSON 结构看似正常时产生完全不同 RDF。
远程 Context 引入网络、版本与供应链风险。生产系统应固定可信 URL、缓存与完整性策略,限制递归加载和大小,不能让不可信用户指定任意 Context 触发 SSRF。
API 升级 Context 时要保持术语映射兼容。相同 key 在 v1/v2 映射不同 IRI,是语义破坏性变更,即使 JSON Schema 仍通过。
JSON-LD Expanded、Compacted、Flattened 与 Framed
JSON-LD Processing Algorithms 定义 expansion、compaction、flattening 等操作。Expanded 形式使用完整 IRI 与数组化结构,冗长但语义明确;Compacted 形式应用 Context 得到开发者友好的 keys;Flattened 形式把节点集中并用引用连接。
Framing 按 frame 组织输出形状,更像从 RDF Graph 投影出应用需要的树。Frame 改变 JSON 展示结构,不改变底层 Graph 的事实,但嵌入位置和数组形状会变化。
比较两个 JSON-LD 文件时不能直接 JSON deep-equal。不同 Context、顺序、嵌入与 Blank Node labels 可以表达等价 RDF。
JSON-LD 如何表示 Named Graph
JSON-LD 可通过 @graph、节点对象与 Dataset 处理规则表达 Named Graph。一个带 @id 和 @graph 的节点对象可关联 graph name 与其 Graph 内容。
但 JSON-LD 应用经常只使用单 Graph 子集。导入器若只调用“to RDF graph”接口,可能忽略 graph name。必须选择返回 Dataset/quads 的 API,并以 N-Quads 测试 Default/Named Graph 保真。
@graph 也可用于不命名的 graph container/组织形式,具体语义要结合周围 @id 和算法,不能看到关键字就假设一定是 Named Graph。
RDF/XML:XML 语法表示 RDF Graph
RDF/XML 使用 XML elements、attributes、namespace declarations、rdf:about、rdf:resource 等表达 RDF Triple:
XML 树只是序列化语法。解析结果是 RDF Graph,不应把 XML element hierarchy 直接当作知识图谱层级。
RDF/XML 适合已有 XML/RDF 工具链和历史数据交换,但人读性较差,序列化选择多,文本 Diff 往往噪声较大。
RDF/XML 的 QName 与表达限制
RDF/XML 使用 XML QName 表达某些 property IRIs。并非任意 IRI 都能无损拆成合法 XML namespace + local name,因此 RDF/XML 无法方便地序列化所有理论上合法的 RDF Graph 结构。
Turtle、N-Triples 和 JSON-LD 对任意 Predicate IRI 的表达更直接。迁移旧系统时应使用库实际序列化测试特殊 IRI,不要假设 RDF/XML 是所有 RDF 的万能中间格式。
XML 实体、DTD、外部资源与解析器安全也需配置。RDF parser 应禁用不必要的外部实体,防范 XXE 和资源耗尽。
Literal 在六种格式中的表达
RDF Literal 包含 lexical form,以及 datatype IRI 或 language tag。Turtle/N-Triples 可写:
Turtle 还支持数字、布尔值的简写;N-Triples通常显示更明确。JSON-LD 使用 @value、@type、@language 或 Context coercion;RDF/XML 使用 element text、rdf:datatype 和 xml:lang。
序列化表面值不同不代表 RDF Literal 不同或相同。Lexical form 与 datatype 都参与语义;"01"^^xsd:integer 和 "1"^^xsd:integer 的 lexical form 不同,即使 datatype value 可能相等。
Blank Node Labels 不是稳定 ID
Turtle、TriG、N-Triples 和 N-Quads 可用 :b1 等 label,JSON-LD 也可能出现 blank node identifier。Label 只在相应序列化/作用域内区分 Blank Nodes,不是全局 IRI。
解析再序列化时 label 可以从 :b1 变成 :genid42,Graph 仍可能同构。数据库导出两次 label 不同,不表示业务实体变化。
需要跨文件稳定引用时使用受控 IRI,不要把 Blank Node label 存进外部数据库当主键。签名、哈希与精确 Diff 需要 RDF Dataset canonicalization 算法,不能直接 hash 原文本。
Collections 与 RDF List
Turtle 的 ( ex:a ex:b ) 是语法糖,解析后生成由 rdf:first、rdf:rest、rdf:nil 和 Blank Nodes 组成的 RDF List。JSON-LD @list 也映射到相应 RDF 集合结构。
N-Triples/N-Quads 没有集合缩写,会显示所有链式 Triples。RDF/XML 使用 parseType 或显式结构表达,具体序列化可能不同。
RDF List 有顺序;普通多个相同 Predicate 的 Objects 是集合式关系,没有隐含顺序。格式转换不能把多个值的文本顺序误当 RDF 顺序。
文本顺序与重复 Triple
RDF Graph 是 Triple 集合,Triple 文本顺序没有语义;重复相同 Triple 也不会让 Graph 多一个事实。JSON-LD arrays 在没有 @list 容器语义时,通常不应被解释为 RDF 顺序。
因此格式转换后行序、对象展示顺序和 Prefix 排列改变很正常。应用若需要排序,应把序号建模为数据,或使用 RDF List/Seq 等明确结构。
流式处理可保留输入顺序作为实现细节,但 API 契约不能把它伪装成 RDF 标准语义。
Canonicalization、Hash 与数字签名
直接对 Turtle、JSON-LD 或 RDF/XML 文件做 SHA-256,只能证明文本字节相同,不能证明两个 RDF Graph 语义不同。Prefix、空白、Triple 顺序、JSON-LD compaction 和 XML 序列化方式变化,都会改变字节而不改变事实集合。
需要跨序列化的稳定 Hash 或数字签名时,应先采用适用于 RDF Dataset 的规范化算法,把 Blank Nodes 一致化并产生确定性表示,再计算摘要。简单把 N-Quads 按行排序仍不够,因为两个同构 Dataset 的 Blank Node labels 可以不同。
签名系统还要明确 Dataset 边界、Graph name、canonicalization 版本、Hash 算法和证明元数据。验证者必须重现完全相同的规范化流程,不能一方签 Turtle 原文、另一方把 JSON-LD 转换后比较。
Parser 错误、恢复与安全边界
批量导入应把语法错误与语义验证分开。RDF parser 成功只证明文本可解析,不证明 vocabulary、SHACL 约束、IRI 政策或业务规则正确;SHACL 验证通过也不保证来源可信。
对不可信数据设置文件大小、Triple/Quad 数量、literal 长度、递归 Context、网络取回、XML entity 与处理时间限制。JSON-LD 远程 Context、RDF/XML 外部实体和超长 Turtle collection 都可能带来网络访问或资源消耗。
发生错误时记录文件、行列、媒体类型、Base IRI 和 parser 版本,但避免把整份敏感数据写入日志。不要让 parser 自动猜格式后在失败时切换多种宽松模式,否则同一输入可能被不同节点解析成不同结果。
MIME Type 与 Content Negotiation
服务器应返回正确 Content-Type:Turtle text/turtle、TriG application/trig、N-Triples application/n-triples、N-Quads application/n-quads、JSON-LD application/ld+json、RDF/XML application/rdf+xml。
客户端可通过 Accept 声明偏好。服务端选择不同序列化时,Graph/Dataset 语义应保持,并设置合适 Vary: Accept,避免缓存把 RDF/XML 返回给只接受 JSON-LD 的客户端。
application/json 不等于 application/ld+json。若 API 为兼容返回普通 JSON media type,应明确 profile/contract,通用 JSON-LD processor不能仅凭内容猜测。
选型建议
人工编写和审阅单图选 Turtle;人工审阅 Dataset 选 TriG;大规模行式单图选 N-Triples;需保留 Named Graph 的批量数据选 N-Quads;Web/API 与 JSON 工具链选 JSON-LD;已有 XML/RDF 生态或对方强制时选 RDF/XML。
内部主存储不必等于外部交换格式。数据库可存 quads,面向开发者返回 JSON-LD,审计导出 N-Quads,同时确保转换测试验证 Dataset、datatype、language、Blank Node 和 Base IRI。
不要为了文件更小只看 gzip 前字节数。解析速度、流式能力、错误定位、生态兼容和语义保真通常更重要。
格式转换验收清单
- 确认输入输出是 Graph 还是 Dataset;
- 使用正确 MIME type 与 parser 模式;
- 固定或显式提供 Base IRI;
- 验证 Prefix 只影响展示,不影响完整 IRI;
- 保留 datatype 与 language tags;
- 区分 RDF List 和无序多值;
- 不比较 Blank Node label 字符串;
- 对 Named Graph 数量和 graph names 做断言;
- 用 Graph/Dataset isomorphism 比较,不用文本 Diff 证明等价;
- 对远程 JSON-LD Context 与 XML parser 做安全限制。
常见误区
- RDF 就是 RDF/XML
- 错误。RDF 是数据模型,RDF/XML 只是多种序列化之一。
- Turtle 可以原样保存 Named Graph
- 错误。Turtle 表示单 Graph;Dataset 应使用 TriG、N-Quads 或其他支持格式。
- JSON-LD 就是加了几个 @ 字段的普通 JSON
- 错误。其语义由 Context 和 JSON-LD Processing Algorithms 决定。
- Blank Node label 可跨导出当永久 ID
- 错误。Label 是局部标识,重新序列化可改变;稳定实体应使用 IRI。
- 两个 RDF 文件文本不同就表示数据不同
- 错误。Prefix、顺序、缩写和 Blank Node labels 都可不同,应比较 Graph/Dataset 同构。
参考资料
W3C:rdf11 conceptsW3C · 术语定义与技术背景 · 访问 2026-08-30
W3C:turtleW3C · 术语定义与技术背景 · 访问 2026-08-30
W3C:trigW3C · 术语定义与技术背景 · 访问 2026-08-30
W3C:n triplesW3C · 术语定义与技术背景 · 访问 2026-08-30
W3C:n quadsW3C · 术语定义与技术背景 · 访问 2026-08-30
W3C:json ld11W3C · 术语定义与技术背景 · 访问 2026-08-30
W3C:rdf syntax grammarW3C · 术语定义与技术背景 · 访问 2026-08-30