RDF 1.2 TriG

RDF 数据集语言

W3C 工作草案

关于本文档的更多详细信息
此版本:
https://www.w3.org/TR/2026/WD-rdf12-trig-20260612/
最新发布版本:
https://www.w3.org/TR/rdf12-trig/
最新编辑草案:
https://w3c.github.io/rdf-trig/spec/
历史:
https://www.w3.org/standards/history/rdf12-trig/
提交历史
测试套件:
https://w3c.github.io/rdf-tests/rdf/rdf12/rdf-trig/
最新推荐标准:
https://www.w3.org/TR/trig
编辑:
Gregg Kellogg(至 2025-09-06),谨此 追思
Dominik Tomaszuk
前任编辑:
Gavin Carothers(RDF 1.1)
Andy Seaborne(RDF 1.1)
作者:
Chris Bizer 柏林自由大学
Richard Cyganiak柏林自由大学
反馈:
GitHub w3c/rdf-trig拉取请求新议题未解决议题
public-rdf-star-wg@w3.org 并使用主题行 [rdf12-trig] … 消息主题 …归档

摘要

本文档定义了一种名为 TriG 的 RDF 文本语法, 它允许将 RDF 数据集 以紧凑且自然的文本形式完整写出, 并为常见使用模式和 数据类型提供缩写。TriG 是 Turtle [RDF12-TURTLE] 格式的扩展。

RDF 1.2 TriG 与 [RDF12-TURTLE] 共享 三元组术语, 作为第四种 RDF 术语, 它可以用作另一个 三元组宾语, 从而可以对其他语句作出语句。 RDF 1.2 TriG 还与 [RDF12-TURTLE] 共享 带方向的语言标记字符串

此外,RDF 1.2 TriG 与 [RDF12-TURTLE] 共享 具体化三元组注释语法扩展,这使得 三元组术语也可以被 断言

本文档状态

本节描述本文档在发布时的状态。当前 W3C 出版物的列表以及本技术报告的最新修订版可在 W3C 标准和草案 索引中找到。

本文档是 RDF 1.2 文档套件的一部分。 TriG 旨在满足 RDF & SPARQL 工作组章程中 定义用于多个图的 RDF 语法的要求。TriG 是 RDF 的 Turtle 语法 [RDF12-TURTLE] 的扩展。当前文档基于 Chris Bizer 和 Richard Cyganiak 的最初提案。

本文档由 RDF & SPARQL 工作组作为 工作草案发布,并使用 推荐标准 轨道

作为 工作草案发布并不意味着 获得 W3C 及其成员的认可。

这是一份草案文档,可能在任何时候由其他 文档更新、替换或废弃。除作为正在进行的工作外, 不应引用本文档。 对这个即将成为推荐标准的文档的未来更新可能会纳入 新特性

本文档由一个依据 W3C 专利 政策运作的小组制作。 W3C 维护一份 任何专利 披露的公开列表, 这些披露与该小组的交付成果相关;该页面还包括 披露专利的说明。任何实际 知晓某项专利,且认为该专利包含 必要权利要求的个人, 必须按照 W3C 专利政策第 6 节 披露相关信息。

本文档受 2025 年 8 月 18 日 W3C 流程文档管辖。

1. 引言

本节是非规范性的。

本文档定义了 TriG,即 RDF 的一种具体语法,RDF 定义于 RDF 概念和抽象语法文档 [RDF12-CONCEPTS]。TriG 是 Turtle [RDF12-TURTLE] 的扩展,扩展后 支持表示完整的 RDF 数据集

本规范扩展了原始 TriG 语法,该语法定义于 RDF 1.1 TriG [TRIG], 以支持 RDF 1.2 概念和抽象数据模型 [RDF12-CONCEPTS] 引入的新特性。 此扩展完全向后兼容。

2. TriG 语言

本节是非规范性的。

TriG 文档允许以紧凑的文本形式写下一个 RDF 数据集。 它由一系列指令、三元组语句、 包含会生成三元组的语句的图语句以及可选空行组成。 注释可以出现在一个不属于其他 词法记号的 # 之后,并持续到行尾。

图语句是一对 IRI空白 节点 以及一组三元组语句, 这些三元组语句由大括号({})包围。 图语句中的 IRI空白 节点 可以用于另一个图语句中, 这意味着取每个图语句生成的三元组的并集。 用作图标签的 IRI空白 节点 也可以作为任何三元组语句的一部分再次出现。 可选地,图语句可以没有 IRI 标签。 这样的图语句对应于 默认图,该默认图属于一个 RDF 数据集

TriG 文档构造 RDF 数据集的方式定义于 4. TriG 语法5. 解析

2.1 版本声明

TriG 使用与 Turtle [RDF12-TURTLE] 相同的版本声明机制。

2.2 三元组语句

由于 TriG 是 Turtle 语言的扩展,它允许使用 Turtle 语言中的任何构造。 简单三元组谓词列表宾语列表 都可以在图语句内部使用,也可以像在 TriG 文档中一样单独使用。 当位于图语句之外时,这些三元组被视为 默认图的一部分, 该默认图属于该 RDF 数据集

2.3 图语句

图语句将一个 IRI空白节点与一个 RDF 图配对。 构成该图的三元组语句被包围在 {}中。

TriG 文档中,一个图 IRI 或 空白节点可以用作 多个图语句的标签。 图语句的图标签可以省略。 在这种情况下,该图被视为该 RDF 数据集默认图

一个 RDF 数据集可能只包含单个图。

示例 1: 包含单个图的数据集

# This document encodes one graph.
PREFIX ex: <http://www.example.org/vocabulary#>
PREFIX : <http://www.example.org/exampleDocument#>

:G1 { :Monica a ex:Person ;
    ex:name "Monica Murphy" ;
    ex:homepage <http://www.monicamurphy.org> ;
    ex:email <mailto:monica@monicamurphy.org> ;
    ex:hasSkill ex:Management ,
                ex:Programming .
}

一个 RDF 数据集可以包含一个 默认图,以及/或者零个 或更多 命名图

示例 2:包含默认图和命名图的数据集

# This document contains a default graph and two named graphs.

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX dc: <http://purl.org/dc/terms/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>

# default graph
{
  <http://example.org/bob> dc:publisher "Bob" .
  <http://example.org/alice> dc:publisher "Alice" .
}

<http://example.org/bob> {
   _:a foaf:name "Bob" .
   _:a foaf:mbox <mailto:bob@oldcorp.example.org> .
   _:a foaf:knows _:b .
}

<http://example.org/alice> {
   _:b foaf:name "Alice" .
   _:b foaf:mbox <mailto:alice@work.example.org> .
}

TriG 提供多种替代方式来书写图 和三元组,让数据编写者可以根据清晰性进行选择:

示例 3:书写命名图的替代方式

# This document contains a same data as the previous example.

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX dc: <http://purl.org/dc/terms/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>

# default graph - no {} used.
<http://example.org/bob> dc:publisher "Bob" .
<http://example.org/alice> dc:publisher "Alice" .

# GRAPH keyword to highlight a named graph
# Abbreviation of triples using ;
GRAPH <http://example.org/bob>
{
   [] foaf:name "Bob" ;
      foaf:mbox <mailto:bob@oldcorp.example.org> ;
      foaf:knows _:b .
}

GRAPH <http://example.org/alice>
{
    _:b foaf:name "Alice" ;
        foaf:mbox <mailto:alice@work.example.org>
}

2.4 其他术语

所有其他术语、语法形式和指令均来自 RDF Turtle

2.4.1 空白节点的 特殊注意事项

空白节点 在带有不同标签的图语句中共享同一个 标识符时, 被视为同一个空白节点。

3. 一致性

除了标记为非规范性的各节之外,本规范中的所有创作指南、图示、示例和注释都是非规范性的。 本规范中的其他所有内容都是规范性的。

本文档中的关键词 MUSTMUST NOTSHOULD 应按 BCP 14 [RFC2119] [RFC8174] 中的描述进行解释,但仅当它们像此处所示那样以 全部大写形式出现时才如此。

本规范为以下对象定义一致性准则:

符合要求的 TriG 文档是一个 Unicode 字符串,它符合 4. TriG 语法中定义的语法 和附加约束, 并以 trigDoc 产生式开始。 TriG 文档序列化一个 RDF 数据集

符合要求的 TriG 解析器是一个能够代表应用程序读取 TriG 文档的系统。 它使序列化后的 RDF 数据集, 按 5. 解析中的定义, 可供应用程序使用,通常通过某种形式的 API 实现。

标识 TriG 语言的 IRI 为: http://www.w3.org/ns/formats/TriG

本规范未定义 TriG 解析器如何处理 不符合要求的输入文档。

3.1 媒体类型和内容 编码

TriG 的媒体类型是 application/trig。 TriG 内容的内容编码始终是 UTF-8。

4. TriG 语法

TriG 文档是一个以 UTF-8 [RFC3629] 编码的 RDF 字符串。 只允许 Unicode 标量值, 范围为 U+0000U+D7FF 以及 U+E000U+10FFFF。 这排除了范围为 U+D800U+DFFF代理码点

4.1 空白字符

空白字符(产生式 WS) 用于分隔两个否则会被(误)识别为一个终结符的终结符。 下方大写的规则名表示空白字符具有重要意义的位置; 这些规则名构成了用于构造 TriG 解析器的一种可能的终结符选择。

空白字符在产生式 String 中具有重要意义。

4.2 注释

TriG 中的注释以位于 IRIREFSTRING_LITERAL_SINGLE_QUOTESTRING_LITERAL_QUOTESTRING_LITERAL_LONG_SINGLE_QUOTESTRING_LITERAL_LONG_QUOTE 之外的一个 # 开始, 并持续到行尾(由 LFsCRs 标记), 如果注释标记后没有行尾,则持续到文件结束。 注释被视为空白字符。

4.3 IRI 引用

相对 IRI 引用会按照 统一 资源标识符(URI):通用语法 [RFC3986] 使用基础 IRI 解析,并且仅使用第 5.2 节中的 基本算法。 不执行基于语法的规范化,也不执行基于方案的规范化 (见 RFC3986 第 6.2.2 和 6.2.3 节)。 IRI 引用中额外允许的字符会按照 URI 引用中未保留字符的相同方式处理,依据 国际化资源标识符 (IRIs) [RFC3987] 第 6.5 节。

@baseBASE 指令 定义用于解析相对 IRI 引用的基础 IRI, 依据 [RFC3986] 第 5.1.1 节,“嵌入内容中的基础 URI”第 5.1.2 节,“来自封装实体的基础 URI” 定义了作用域内基础 IRI 如何来自封装文档, 例如带有 xml:base 指令的 SOAP 信封或带有 Content-Location 标头的 MIME multipart 文档。 第 5.1.3 节,“来自检索 URI 的基础 URI”中标识的“检索 URI”, 是从中检索特定 TriG 文档的 URL。 如果以上都没有指定基础 URI,则使用默认 基础 URI(第 5.1.4 节,“默认基础 URI”)。 每个 @baseBASE 指令都会设置 一个新的作用域内基础 URI, 该 URI 相对于前一个基础 URI。

4.4 转义序列

TriG 文档中使用三种形式的转义:

每类转义序列可使用的上下文
数字
转义
字符串
转义
保留字符
转义
IRI, 用作 RDF 术语, 或用于 PREFIXBASE 声明中
局部 名称
字符串

%-编码序列位于 IRI 的字符范围内, 并且在局部名称中被明确允许。 它们表现为一个 '%' 后跟两个十六进制字符,并表示同一个 三字符序列。 这些序列在处理期间不会被解码。 在 TriG 中写作 <http://a.example/%66oo-bar> 的术语 指定 IRI http://a.example/%66oo-bar, 而不是 IRI http://a.example/foo-bar。 带有前缀 PREFIX ex: <http://a.example/> 的术语 ex:%66oo-bar 也指定 IRI http://a.example/%66oo-bar

4.5 文法

此处使用的 EBNF 定义于 XML 1.0 [EBNF-NOTATION]。

注:

  1. 空白节点标识符在整个 TriG 文档中表示同一个 空白节点
  2. 单引号中的关键词 ('@base'、 '@prefix'、 '@version'、 'a'、 'true' 和 'false') 区分大小写。 双引号中的关键词 ("BASE"、 "PREFIX") 和 "VERSION") 不区分大小写。
  3. 转义序列 UCHARECHAR 区分大小写。
  4. 对输入进行分词并选择语法规则时,选择最长匹配。
  5. 当使用名称为大写的规则作为终结符时, TriG 文法是 LL(1) 和 LALR(1) 的。
  6. 进入文法的入口点是 trigDoc
  7. 在带符号数字中,符号和数字之间不允许有空白字符。
  8. 字符串 '@prefix'、 '@base' 和 '@version' 会匹配 LANG_DIR 的模式, 尽管 prefixbaseversion 都不是已注册的语言子标签。 本规范不定义后跟这些记号之一的带引号字面量 (例如 "A"@base) 是否属于 Turtle 语言。
[1] trigDoc ::= (directive | block)*
[2] block ::= triplesOrGraph | wrappedGraph | triples2 | ("GRAPH" labelOrSubject wrappedGraph)
[3] triplesOrGraph ::= (labelOrSubject (wrappedGraph | (predicateObjectList '.'))) | (reifiedTriple predicateObjectList? '.')
[4] triples2 ::= (blankNodePropertyList predicateObjectList? '.') | (collection predicateObjectList '.')
[5] wrappedGraph ::= '{' triplesBlock? '}'
[6] triplesBlock ::= triples ('.' triplesBlock?)?
[7] labelOrSubject ::= iri | BlankNode
[8] directive ::= prefixID | base | version | sparqlPrefix | sparqlBase | sparqlVersion
[9] prefixID ::= '@prefix' PNAME_NS IRIREF '.'
[10] base ::= '@base' IRIREF '.'
[11] version ::= '@version' VersionSpecifier '.'
[12] sparqlPrefix ::= "PREFIX" PNAME_NS IRIREF
[13] sparqlBase ::= "BASE" IRIREF
[14] sparqlVersion ::= "VERSION" VersionSpecifier
[15] VersionSpecifier ::= STRING_LITERAL_QUOTE | STRING_LITERAL_SINGLE_QUOTE
[16] triples ::= (subject predicateObjectList) | (blankNodePropertyList predicateObjectList?) | (reifiedTriple predicateObjectList?)
[17] predicateObjectList ::= verb objectList (';' (verb objectList)?)*
[18] objectList ::= object annotation (',' object annotation)*
[19] verb ::= predicate | 'a'
[20] subject ::= iri | BlankNode | collection
[21] predicate ::= iri
[22] object ::= iri | BlankNode | collection | blankNodePropertyList | literal | tripleTerm | reifiedTriple
[23] literal ::= RDFLiteral | NumericLiteral | BooleanLiteral
[24] blankNodePropertyList ::= '[' predicateObjectList ']'
[25] collection ::= '(' object* ')'
[26] NumericLiteral ::= INTEGER | DECIMAL | DOUBLE
[27] RDFLiteral ::= String (LANG_DIR | ('^^' iri))?
[28] BooleanLiteral ::= 'true' | 'false'
[29] String ::= STRING_LITERAL_QUOTE | STRING_LITERAL_SINGLE_QUOTE | STRING_LITERAL_LONG_SINGLE_QUOTE | STRING_LITERAL_LONG_QUOTE
[30] iri ::= IRIREF | PrefixedName
[31] PrefixedName ::= PNAME_LN | PNAME_NS
[32] BlankNode ::= BLANK_NODE_LABEL | ANON
[33] reifier ::= '~' (iri | BlankNode)?
[34] reifiedTriple ::= '<<' rtSubject verb rtObject reifier? '>>'
[35] rtSubject ::= iri | BlankNode | reifiedTriple
[36] rtObject ::= iri | BlankNode | literal | tripleTerm | reifiedTriple
[37] tripleTerm ::= '<<(' ttSubject verb ttObject ')>>'
[38] ttSubject ::= iri | BlankNode
[39] ttObject ::= iri | BlankNode | literal | tripleTerm
[40] annotation ::= (reifier | annotationBlock)*
[41] annotationBlock ::= '{|' predicateObjectList '|}'

终结符产生式

[43] IRIREF ::= '<' ([^#x00-#x20<>"{}|^`\] | UCHAR)* '>'
/* #x00=NULL #x01-#x1F=control codes #x20=space */
[44] PNAME_NS ::= PN_PREFIX? ':'
[45] PNAME_LN ::= PNAME_NS PN_LOCAL
[46] BLANK_NODE_LABEL ::= '_:' (PN_CHARS_U | [0-9]) ((PN_CHARS | '.')* PN_CHARS)?
[47] LANG_DIR ::= '@' [a-zA-Z]+ ('-' [a-zA-Z0-9]+)* ('--' [a-zA-Z]+)?
[48] INTEGER ::= [+-]? [0-9]+
[49] DECIMAL ::= [+-]? ([0-9]* '.' [0-9]+)
[50] DOUBLE ::= [+-]? (([0-9]+ '.' [0-9]* EXPONENT) | ('.' [0-9]+ EXPONENT) | ([0-9]+ EXPONENT))
[51] EXPONENT ::= [eE] [+-]? [0-9]+
[52] STRING_LITERAL_QUOTE ::= '"' ([^#x22#x5C#x0A#x0D] | ECHAR | UCHAR)* '"'
[53] STRING_LITERAL_SINGLE_QUOTE ::= "'" ([^#x27#x5C#x0A#x0D] | ECHAR | UCHAR)* "'"
[54] STRING_LITERAL_LONG_SINGLE_QUOTE ::= "'''" (("'" | "''")? ([^'\] | ECHAR | UCHAR))* "'''"
[55] STRING_LITERAL_LONG_QUOTE ::= '"""' (('"' | '""')? ([^"\] | ECHAR | UCHAR))* '"""'
[56] UCHAR ::= ('\u' HEX HEX HEX HEX) | ('\U' HEX HEX HEX HEX HEX HEX HEX HEX)
[57] ECHAR ::= '\' [tbnrf\"']
[58] WS ::= #x20 | #x09 | #x0D | #x0A
[59] ANON ::= '[' WS* ']'
[60] PN_CHARS_BASE ::= [A-Z]
| [a-z]
| [#xC0-#xD6]
| [#xD8-#xF6]
| [#xF8-#x02FF]
| [#x0370-#x037D]
| [#x037F-#x1FFF]
| [#x200C-#x200D]
| [#x2070-#x218F]
| [#x2C00-#x2FEF]
| [#x3001-#xD7FF]
| [#xF900-#xFDCF]
| [#xFDF0-#xFFFD]
| [#x00010000-#x000EFFFF]
[61] PN_CHARS_U ::= PN_CHARS_BASE | '_'
[62] PN_CHARS ::= PN_CHARS_U | '-' | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
[63] PN_PREFIX ::= PN_CHARS_BASE ((PN_CHARS | '.')* PN_CHARS)?
[64] PN_LOCAL ::= (PN_CHARS_U | ':' | [0-9] | PLX) ((PN_CHARS | '.' | ':' | PLX)* (PN_CHARS | ':' | PLX))?
[65] PLX ::= PERCENT | PN_LOCAL_ESC
[66] PERCENT ::= '%' HEX HEX
[67] HEX ::= [0-9] | [A-F] | [a-f]
[68] PN_LOCAL_ESC ::= '\' ('_' | '~' | '.' | '-' | "!" | '$' | '&' | "'" | '(' | ')' | '*' | '+' | ',' | ';' | '=' | '/' | '?' | '#' | '@' | '%')

此文法的文本版本可在此处获取。

4.6 选定的终结符字面量 字符串

本文档使用一些特定的终结符字面量字符串 [EBNF-NOTATION]。 为了说明这些终结符字面量字符串使用的 Unicode 码点,下表 描述了本文档通篇使用的特定字符和序列。

代码 字形 描述
U+000A LF 换行
U+000D CR 回车
U+0022 " 引号
U+0023 # 数字符号
U+0027 ' 撇号
U+002D - 连字符
U+003B : 冒号
U+0040 @ at 符号
U+005C \ 反斜杠
U+005F _ 下划线
U+0061 a 拉丁小写字母 E
U+007B { 左花括号
U+007D } 右花括号

其他短终结符字面量字符串由特定的 Unicode 字符序列组成:

space
U+0020
"""
三个连续的引号字符,每个字符的码点均为 U+0022
'''
三个连续的撇号字符,每个字符的码点均为 U+0027
--
两个连续的 - 字符

5. 解析

RDF 概念和抽象语法 [RDF12-CONCEPTS] 规范定义了四种 RDF 术语IRI字面量空白 节点,以及 三元组术语。 字面量由一个 词法形式 和一个可选的 语言标签 [BCP47] 组成——可能包括一个 初始文本方向—— 或者由一个可选的 数据类型 IRI 组成。 在解析期间会使用一个额外类型 prefix,用于将字符串标识符 映射到命名空间 IRI。 本节将符合 4.5 文法中语法的字符串, 通过把匹配产生式和词法记号的字符串映射为 RDF 术语 或其组成部分(例如语言标签、字面量的词法形式),从而映射为一组三元组。 语法产生式会改变解析器状态并发出三元组。

5.1 解析器状态

解析 TriG 需要一个由十个项目组成的状态:

术语构造器可以创建这些值的栈,这会通过 “记录 curSubjectcurPredicate” 之类的措辞表示。

5.2 RDF 术语构造器

此表将产生式和词法记号映射到 RDF 术语RDF 术语的组成部分,这些内容列于 5. 解析

产生式 类型 过程
IRIREF IRI <> 之间的字符,并将其中的 数字转义序列取消转义, 以形成 IRI。相对 IRI 引用解析 按 第 6.3 节执行。 生成的 IRI MUST 遵守通用 IRI 语法的句法限制,并且 SHOULD 符合 [RFC3986] 的 第 3.3 节,并遵守相应 IRI 方案规范施加的任何更窄限制。
PNAME_NS prefix 当在 prefixIDsparqlPrefix 产生式中使用时, prefix 是可能为空的 RDF 字符串,它匹配该规则的第一个实参。 该字符串在 namespaces map 中作为键;展开后的第二个实参会存储在该键下, 以供后续查找。
IRI 当在 PrefixedName 产生式中使用时,irinamespaces map 中与该规则第一个实参对应的值。
PNAME_LN IRI 由第一个序列 PNAME_NS 标识一个可能为空的 prefixnamespaces map MUST 具有对应的 namespace。 IRI 的 RDF 字符串通过取消转义 第二个实参 PN_LOCAL 中的 保留字符, 并将其连接到 namespace 之后形成。生成的 IRI MUST 遵守通用 IRI 语法的句法限制,并且 SHOULD 遵守相应 IRI 方案规范施加的任何更窄限制。
VersionSpecifier 字面量 curVersion 取自一个字面量,该字面量使用匹配的 RDF 字符串词法形式和 xsd:string 数据类型。
STRING_LITERAL_SINGLE_QUOTE 词法形式 取最外层 ' 之间的字符,并将其中的 数字字符串转义 序列取消转义,以形成一个词法形式的 Unicode 字符串。
STRING_LITERAL_QUOTE 词法形式 取最外层 " 之间的字符,并将其中的 数字字符串转义 序列取消转义,以形成一个词法形式的 Unicode 字符串。
STRING_LITERAL_LONG_SINGLE_QUOTE 词法形式 取最外层 ''' 之间的字符, 并将其中的 数字字符串转义 序列取消转义,以形成一个词法形式的 Unicode 字符串。
STRING_LITERAL_LONG_QUOTE. 词法形式 取最外层 """ 之间的字符, 并将其中的 数字字符串转义 序列取消转义,以形成一个词法形式的 Unicode 字符串。
LANG_DIR 语言标签 @ 后面的字符形成 语言标签,并且在匹配的字符包含 -- 时,可选地形成 初始文本方向语言标签 MUST 按 [BCP47] 的 第 2.2.9 节格式良好。 如果存在,初始文本方向 MUSTltrrtl
RDFLiteral 字面量 该字面量具有第一个规则实参 String 的词法形式。如果匹配 '^^' iri 规则,则从 iri 派生 数据类型 IRI,且该字面量没有语言标签。 如果匹配 LANG_DIR 规则, 则从 LANG_DIR 取得 语言标签初始文本方向。 如果没有 初始文本方向,则数据类型为 rdf:langString。如果有 初始文本方向,则数据类型为 rdf:dirLangString。如果两者都未匹配,则数据类型为 xsd:string,且该字面量没有语言标签。
INTEGER 字面量 该字面量具有输入字符串的词法形式,以及 xsd:integer 数据类型。
DECIMAL 字面量 该字面量具有输入字符串的词法形式,以及 xsd:decimal 数据类型。
DOUBLE 字面量 该字面量具有输入字符串的词法形式,以及 xsd:double 数据类型。
BooleanLiteral 字面量 该字面量具有 truefalse 的词法形式,具体取决于输入匹配哪一个, 并具有 xsd:boolean 数据类型。
BLANK_NODE_LABEL 空白节点 匹配第二个实参 PN_LOCAL 的字符串,是 bnodeLabels 中的键。如果映射中没有对应的空白节点, 则分配一个。
ANON 空白节点 生成一个空白节点。
blankNodePropertyList 空白节点 生成一个空白节点。注意下一节中关于 blankNodePropertyList 的规则。
collection 空白节点 对于非空列表,生成一个空白节点。注意下一节中关于 collection 的规则。
IRI 对于空列表,生成的 IRI 是 rdf:nil。注意下一节中关于 collection 的规则。
reifier IRI | 空白节点 curReifier 取自 term,该 term 取自匹配的 iri 产生式 或 BlankNode 产生式(如果有)。 如果没有匹配到这样的产生式,则 term 取自一个新的 RDF 空白节点
tripleTerm 三元组术语 三元组术语 由从 ttSubjectpredicatettObject 产生式构造出的术语组成。
reifiedTriple IRI | 空白节点 term 取自匹配的 reifier(如果有), 或取自一个新的 RDF 空白节点
annotationBlock IRI | 空白节点 term 取自先前匹配的 reifier(如果有), 或取自一个新的 RDF 空白节点

由于在输入中检测错误的处理器可能导致 图包含的三元组少于输入所描述的数量 (甚至完全没有三元组), 因此消费者在使用输出三元组时, 应考虑所报告的任何错误信息, 这些输出三元组可能不完整,和/或包含 类型不正确 或格式不良的术语。

5.3 RDF 三元组构造

TriG 文档定义一个 RDF 数据集, 它由一个 默认图和零个或 更多 命名图组成。 每个图由一组 RDF 三元组组成。

5.3.1 输出图

状态 curGraph 最初未设置。它记录解析期间产生的 三元组所属图的标签。 如果未定义,则使用 默认图

规则 labelOrSubject 同时设置 curGraphcurSubject (只会使用其中一个)。

以下语法产生式子句会将 curGraph 设置为未定义,表示默认 图:

  • 规则 block 中的 语法产生式子句 wrappedGraph
  • 规则 triples2 中的语法产生式。

语法产生式 labelOrSubject predicateObjectList '.' 会在处理规则 triplesOrGraph 中的 predicateObjectList 产生式之前 取消设置 curGraph

5.3.2 三元组输出

产生的每个 RDF 三元组都会添加到 curGraph, 或者如果在解析过程的该点未设置 curGraph, 则添加到默认图

subject 产生式设置 curSubjectverb 产生式设置 curPredicate

三元组会在解析过程中的以下位置产生, 并且每个产生的 RDF 三元组都会 添加到由 curGraph 标识的图。

5.3.3 三元组生成

文档中的每个 object N 都会产生一个 RDF 三元组: curSubject curPredicate N.

5.3.4 具体化器

开始 reifier 产生式时, curReifier 取自 reifier 术语 构造器。 然后产生 RDF 三元组 curReifier rdf:reifies curTripleTerm

5.3.5 已具体化三元组

开始 reifiedTriple 产生式时, 会记录 curTripleTerm。 使用 rtSubjectverbrtObject 产生式 创建一个新的 tripleTerm 实例 curTripleTerm。 结束 reifiedTriple 产生式时, 如果未设置 curReifier,则为其分配一个新的 RDF 空白节点; 接着它产生 RDF 三元组 curReifier rdf:reifies curTripleTerm, 然后恢复 curTripleTerm 的记录值。 通过匹配 reifiedTriple 产生的节点是 curReifier

5.3.6 注释

开始 annotation 产生式时, 会记录 curSubjectcurPredicate。 使用 curSubject curPredicate curObject 创建一个新的 tripleTerm 实例 curTripleTerm, 并清除 curReifier 的值。 结束 annotation 产生式时, 会恢复 curSubjectcurPredicate 的记录值。

5.3.7 注释块

开始 annotationBlock 产生式时,会记录 curTripleTerm。 如果未设置 curReifier,则为其分配一个新的 RDF 空白节点, 并且该产生式会产生 RDF 三元组 curReifier rdf:reifies curTripleTermcurSubject 取自 curReifier。 结束 annotationBlock 产生式时, 会清除 curReifier 的值 并恢复 curTripleTerm

如果 curReifier 已经设置, 具体化三元组 curReifier rdf:reifies curTripleTerm 已在 5.3.4 具体化器中发出。

5.3.8 属性列表

开始 blankNodePropertyList 产生式时,会记录 curSubjectcurPredicate,并将 curSubject 设置为一个新的 空白节点 B。 结束 blankNodePropertyList 产生式时,会恢复 curSubjectcurPredicate。 通过匹配 blankNodePropertyList 产生的节点是 空白节点 B

5.3.9 集合

开始 collection 产生式时, 会记录 curSubjectcurPredicatecollection 产生式中的每个 object 都有一个 curSubject,它被设置为一个新的 空白节点 B,并且有一个 curPredicate 被设置为 rdf:first。 第一个之后的每个对象 objectn 都会产生一个三元组:objectn-1 rdf:rest objectn . 结束 collection 产生式时, 会创建一个额外三元组 curSubject rdf:rest rdf:nil . 并恢复 curSubjectcurPredicate。 通过匹配 collection 产生的节点, 对于非空列表是第一个空白节点 B,对于空列表是 rdf:nil

A. 隐私考量

本节是非规范性的。

TriG 格式用于表达任意应用程序数据, 其中可能包括个人身份信息(PII) 或其他可能被视为敏感的信息的表达。 建议发布此类信息的作者仔细 考虑发布此类信息的需求和用途, 以及数据预期被消费并可能被披露所在地区的适用法规 (例如 GDPRCCPA其他法规), 特别是访问这些数据是否需要授权措施。

B. 安全考量

本节是非规范性的。

STRING_LITERAL_SINGLE_QUOTESTRING_LITERAL_QUOTESTRING_LITERAL_LONG_SINGLE_QUOTESTRING_LITERAL_LONG_QUOTE 产生式允许使用未转义的控制字符。 尽管本规范不会直接向最终用户暴露此内容, 但它可能通过用户代理呈现,这可能导致呈现的文本 因这些字符的显示而被混淆。

TriG 是一种通用断言语言; 应用程序可能会评估给定数据以推断更多断言,或解引用 IRI, 从而触发该 IRI 所属方案的安全考量。 特别注意 [RFC3023] 第 10 节中关于 HTTP IRI 的隐私问题。 从不准确或恶意数据源获得的数据可能导致不准确或误导性的结论, 以及对非预期 IRI 的解引用。 必须注意使所咨询资源的可信度与 数据预期用途的敏感性相匹配; 对潜在医疗治疗的推断很可能需要与 旅行规划推断不同的信任要求。

TriG 语言用于表达任意应用程序数据; 安全考量将随使用领域而变化。 适用于文本的安全工具和协议 (例如 PGP 加密、校验和验证、密码保护压缩) 也可以用于 TriG 文档。 必须施加能够反映嵌入信息敏感性的安全/隐私协议。

TriG 可以表达呈现给用户的数据,例如 RDF Schema 标签。 渲染从不受信任的 TriG 文档中检索到的字符串, 或使用未转义字符的应用程序, SHOULD 使用警告和其他适当手段,以限制 恶意字符串被用来误导读者的可能性。 XML 媒体类型注册中的安全考量([RFC3023] 第 10 节) 围绕任意数据和标记的表达提供了额外指导。

TriG 使用 IRI 作为术语标识符。 解释以 TriG 表达的数据的应用程序 SHOULD 处理 国际化 资源标识符(IRIs) [RFC3987] 第 8 节以及 统一资源 标识符(URI):通用语法 [RFC3986] 第 7 节中的安全问题。

多个 IRI 可能 具有相同外观。 不同文字系统中的字符可能看起来相似(例如, 西里尔字母“о”(码点 U+043E)可能看起来类似于拉丁字母“o”(码点 U+006F))。 一个字符后跟组合字符时,可能与另一个字符具有相同的视觉表示 (例如,拉丁小写字母“E”(码点 U+0065) 后跟组合锐音符(码点 U+0301) 与带锐音的拉丁小写字母“E” (U+00E9)具有相同的视觉表示)。 任何在 TriG 中书写或解释数据的人或应用程序 都必须注意使用与预期语义匹配的 IRI, 并避免使用可能看起来相似的 IRI。 关于匹配视觉上相似字符的更多信息可见于 Unicode 安全考量 [UNICODE-SECURITY] 和 国际化 资源标识符(IRIs) [RFC3987] 第 8 节。

C. 互联网媒体类型和文件 扩展名

TriG 的互联网媒体类型(以前称为 MIME 类型)是“application/trig”。

建议 TriG 文件在所有平台上都使用扩展名“.trig”(全小写)。

以下信息已提交给互联网工程指导组(IESG)进行审查、 批准并向 IANA 注册。

类型名称:
application
子类型名称:
trig
必需参数:
可选参数:
version
此参数是可选的。 如果存在,version 的可接受值 定义于 [RDF12-CONCEPTS] 中的 2.1 版本标签
profile
此参数是可选的,用于包含附加信息。 在不了解 profile 的情况下处理时,它不会改变资源表示的语义。 profile 参数的值是一个由空格分隔的非空 URI 列表。 更多信息和背景请参阅 [RFC6906]。
编码考量:
TriG 的语法以 Unicode [UNICODE] 中的码点表达。 编码始终为 UTF-8 [UTF-8]。
Unicode 码点也可以使用 \uXXXX(U+0000 到 U+FFFF) 或 \UXXXXXXXX 语法(用于 U+10000 及以上)表达,其中 X 是十六进制数字 [0-9A-Fa-f]
安全考量:
B. 安全 考量
互操作性考量:
没有已知的互操作性问题。
已发布规范:
本规范。
使用此媒体类型的应用程序:
TriG 被广泛用于表示 RDF 数据。 大多数常见编程语言中都有可用实现。
附加信息:
幻数:
TriG 文档开头附近可能包含字符串“prefix”或“base”(大小写 无关)。
文件扩展名:
.trig
基础 URI:
TriG base 指令可以改变当前基础 URI, 用于该语言中稍后按顺序使用的 相对 IRI 引用
可联系以获取更多信息的人员和电子邮件地址:
W3C RDF & SPARQL 工作组 <public-rdf-star-wg@w3.org>
预期用途:
通用
使用限制:
作者:
TriG 规范是 RDF & SPARQL WG 的产物。W3C 保留对此规范的变更控制权。

profile 参数可由客户端在内容协商过程中表达其偏好, 也可由服务器用于指示 关于响应的附加信息。

如果客户端给出了 profile 参数,服务器应 返回一个遵循列表中所有 被服务器识别的 profile 的文档。 服务器不应仅基于 profile 值而以错误响应。

如果服务器给出了 profile 参数,客户端可以选择忽略它。

建议 profile URI 可以被解引用, 并在该 URI 处提供有用文档。

当作为 媒体类型参数 [RFC4288] 用于 HTTP Content-Type 标头HTTP Accept 标头 [RFC7231] 时,如果 profile 参数的值包含特殊字符,例如空白字符, 包括用于分隔多个 profile URI 的任何空格, 则需要用引号(ASCII ")括起来。

需要注意的是,profile 参数的值 包含一个或多个 URI,而不是 IRI。因此可能需要 在 IRI 和 URI 之间进行转换,如 [RFC3987] 的 第 3 节 IRI 与 URI 的关系 中所规定。

D. 致谢

本节是非规范性的。

D.1 RDF 1.1 致谢

本节是非规范性的。

编辑衷心感谢 Chris Bizer 和 Richard Cyganiak 创建原始 TriG 规范的工作。 Gregg Kellogg、Eric Prud'hommeaux 和 Sandro Hawke 对此版本作出了宝贵贡献。

本文档通过更广泛社区的审查过程得到了改进。

D.2 RDF 1.2 致谢

本节是非规范性的。

除编辑外,以下人员也对此规范作出了贡献: Andy Seaborne, Denis Ah-Kang, Niklas Lindström, Peter F. Patel-Schneider, Pierre-Antoine Champin, Ted Thibodeau Jr, and Thomas Tanon

RDF & SPARQL 工作组的成员包括
James Anderson, Dörthe Arndt, Jerven Bolleman, Erich Bremer, Pierre-Antoine Champin, Souripriya Das, Enrico Franconi, Adrian Gschwend, Olaf Hartig, Gregg Kellogg†, Ora Lassila, Niklas Lindström, Thomas Lörtsch, Peter Patel-Schneider, Dave Raggett, Felix Sasaki, Andy Seaborne, Ruben Taelman, Thomas Pellissier Tanon, Ted Thibodeau Jr, Dominik Tomaszuk, Gregory Williams, William Van Woensel, and Antoine Zimmermann
† Gregg Kellogg 于 2025 年 9 月去世。我们感激地铭记他对 RDF 及相关标准更广泛生态系统的巨大贡献。

编辑注

要表彰任务组成员吗?不容易找到贡献者列表。

E. RDF 1.1 与 RDF 1.2 之间的变更

本节是非规范性的。

本节描述了与 RDF 1.1 推荐标准相比的 主要差异。

本规范扩展了原始 TriG 语法,该语法定义于 RDF 1.1 TriG [TRIG], 以支持 RDF 1.2 概念和抽象数据模型 [RDF12-CONCEPTS] 引入的新特性。 此扩展完全向后兼容: 任何符合旧版本的文档也符合新版本,并会解析为同一个图。 此外,任何符合新版本且仅包含 RDF 1.1 特性的文档也 符合较旧版本 (VERSION 指令除外;见 2.1 版本声明)。 最后,新的语法构造在旧语法中均无效。 这意味着任何使用 RDF 1.2 特性的 TriG 文档都不 符合本规范的上一版本,也不能在该版本下 被解释为不同的图。

更具体地说,进行了以下变更:

F. 索引

F.1 由本 规范定义的术语

F.2 通过引用定义的术语

G. 参考文献

G.1 规范性参考文献

[BCP47]
用于标识语言的标签. A. Phillips, Ed.; M. Davis, Ed. IETF. 2009 年 9 月。最佳当前实践。URL: https://www.rfc-editor.org/rfc/rfc5646
[EBNF-NOTATION]
EBNF 表示法. Tim Bray; Jean Paoli; Michael Sperberg-McQueen; Eve Maler; François Yergeau et al. W3C. W3C 推荐标准。URL: https://www.w3.org/TR/xml/#sec-notation
[I18N-GLOSSARY]
国际化术语表. Richard Ishida; Addison Phillips. W3C. 2024 年 10 月 17 日。W3C 工作组说明。URL: https://www.w3.org/TR/i18n-glossary/
[RDF12-CONCEPTS]
RDF 1.2 概念和抽象数据 模型. Andy Seaborne; Gregg Kellogg; Olaf Hartig; Pierre-Antoine Champin. W3C. 2026 年 4 月 7 日。W3C 候选推荐标准。URL: https://www.w3.org/TR/rdf12-concepts/
[RFC2119]
RFC 中用于表示 要求级别的关键词. S. Bradner. IETF. 1997 年 3 月。最佳当前实践。URL: https://www.rfc-editor.org/rfc/rfc2119
[RFC3629]
UTF-8,ISO 10646 的一种转换格式. F. Yergeau. IETF. 2003 年 11 月。互联网标准。URL: https://www.rfc-editor.org/rfc/rfc3629
[RFC3986]
统一资源标识符(URI):通用 语法. T. Berners-Lee; R. Fielding; L. Masinter. IETF. 2005 年 1 月。互联网 标准。URL: https://www.rfc-editor.org/rfc/rfc3986
[RFC3987]
国际化资源标识符 (IRIs). M. Duerst; M. Suignard. IETF. 2005 年 1 月。拟议标准。URL: https://www.rfc-editor.org/rfc/rfc3987
[RFC6906]
“profile”链接关系类型. E. Wilde. IETF. 2013 年 3 月。资料性。URL: https://www.rfc-editor.org/rfc/rfc6906
[RFC8174]
RFC 2119 关键词中大写与小写的歧义. B. Leiba. IETF. 2017 年 5 月。最佳当前实践。URL: https://www.rfc-editor.org/rfc/rfc8174
[UNICODE]
Unicode 标准. Unicode Consortium. URL: https://www.unicode.org/versions/latest/

G.2 资料性参考文献

[LANG-SUBTAG-REGISTRY]
语言 子标签注册表. IANA. URL: http://www.iana.org/assignments/language-subtag-registry/language-subtag-registry
[RDF12-INTEROP]
RDF 1.2 互操作性. Pierre-Antoine Champin. W3C. W3C 编辑草案。URL: https://w3c.github.io/rdf-interop/spec/
[RDF12-N-QUADS]
RDF 1.2 N-Quads. Gregg Kellogg; Dominik Tomaszuk. W3C. 2026 年 5 月 28 日。W3C 工作草案。URL: https://www.w3.org/TR/rdf12-n-quads/
[RDF12-N-TRIPLES]
RDF 1.2 N-Triples. Gregg Kellogg; Dominik Tomaszuk. W3C. 2026 年 5 月 15 日。W3C 工作草案。URL: https://www.w3.org/TR/rdf12-n-triples/
[RDF12-NEW]
RDF 1.2 新特性. The W3C RDF & SPARQL Working Group. W3C. W3C 编辑草案。URL: https://w3c.github.io/rdf-new/spec/
[RDF12-PRIMER]
RDF 1.2 入门. Pierre-Antoine Champin; Niklas Lindström. W3C. 2026 年 4 月 16 日。DNOTE。URL: https://www.w3.org/TR/rdf12-primer/
[RDF12-SCHEMA]
RDF 1.2 Schema. Dominik Tomaszuk. W3C. 2026 年 3 月 28 日。W3C 工作草案。URL: https://www.w3.org/TR/rdf12-schema/
[RDF12-SEMANTICS]
RDF 1.2 语义. Peter Patel-Schneider; Enrico Franconi; Dörthe Arndt. W3C. 2026 年 4 月 7 日。W3C 候选推荐标准。 URL: https://www.w3.org/TR/rdf12-semantics/
[RDF12-TURTLE]
RDF 1.2 Turtle. Gregg Kellogg; Andy Seaborne; Dominik Tomaszuk. W3C. 2026 年 5 月 28 日。W3C 工作草案。URL: https://www.w3.org/TR/rdf12-turtle/
[RDF12-XML]
RDF 1.2 XML 语法. Gregg Kellogg; Jerven Bolleman. W3C. 2026 年 4 月 9 日。W3C 工作草案。URL: https://www.w3.org/TR/rdf12-xml/
[RFC3023]
XML 媒体类型. M. Murata; S. St. Laurent; D. Kohn. IETF. 2001 年 1 月。拟议标准。URL: https://www.rfc-editor.org/rfc/rfc3023
[RFC4288]
媒体类型规范和注册 程序. N. Freed; J. Klensin. IETF. 2005 年 12 月。最佳当前实践。 URL: https://www.rfc-editor.org/rfc/rfc4288
[RFC7231]
超文本传输协议(HTTP/1.1): 语义和内容. R. Fielding, Ed.; J. Reschke, Ed. IETF. 2014 年 6 月。 拟议标准。URL: https://httpwg.org/specs/rfc7231.html
[SPARQL12-CONCEPTS]
SPARQL 1.2 概念. The W3C RDF & SPARQL Working Group. W3C. W3C 编辑草案。URL: https://w3c.github.io/sparql-concepts/spec/
[SPARQL12-ENTAILMENT]
SPARQL 1.2 蕴涵机制. Peter Patel-Schneider. W3C. 2026 年 4 月 9 日。W3C 工作草案。URL: https://www.w3.org/TR/sparql12-entailment/
[SPARQL12-FEDERATED-QUERY]
SPARQL 1.2 联合 查询. Ruben Taelman; Gregory Williams. W3C. 2026 年 4 月 23 日。W3C 工作草案。 URL: https://www.w3.org/TR/sparql12-federated-query/
[SPARQL12-GRAPH-STORE-PROTOCOL]
SPARQL 1.2 图存储 协议. Andy Seaborne; Thomas Pellissier Tanon. W3C. 2024 年 12 月 19 日。W3C 工作草案。URL: https://www.w3.org/TR/sparql12-graph-store-protocol/
[SPARQL12-NEW]
SPARQL 1.2 新特性. The W3C RDF & SPARQL Working Group. W3C. W3C 编辑草案。URL: https://w3c.github.io/sparql-new/spec/
[SPARQL12-PROTOCOL]
SPARQL 1.2 协议. Andy Seaborne; Ruben Taelman; Gregory Williams; Thomas Pellissier Tanon. W3C. 2026 年 4 月 26 日。W3C 工作 草案。URL: https://www.w3.org/TR/sparql12-protocol/
[SPARQL12-QUERY]
SPARQL 1.2 查询语言. Olaf Hartig; Andy Seaborne; Ruben Taelman; Gregory Williams; Thomas Pellissier Tanon. W3C. 2026 年 5 月 28 日。 W3C 工作草案。URL: https://www.w3.org/TR/sparql12-query/
[SPARQL12-RESULTS-CSV-TSV]
SPARQL 1.2 查询结果 CSV 和 TSV 格式. Ruben Taelman; Gregory Williams; Thomas Pellissier Tanon. W3C. 2026 年 3 月 28 日。W3C 工作草案。URL: https://www.w3.org/TR/sparql12-results-csv-tsv/
[SPARQL12-RESULTS-JSON]
SPARQL 1.2 查询结果 JSON 格式. Andy Seaborne; Ruben Taelman; Gregory Williams; Thomas Pellissier Tanon. W3C. 2026 年 3 月 28 日。W3C 工作草案。URL: https://www.w3.org/TR/sparql12-results-json/
[SPARQL12-RESULTS-XML]
SPARQL 1.2 查询结果 XML 格式. Ruben Taelman; Dominik Tomaszuk; Thomas Pellissier Tanon. W3C. 2024 年 12 月 27 日。W3C 工作草案。URL: https://www.w3.org/TR/sparql12-results-xml/
[SPARQL12-SERVICE-DESCRIPTION]
SPARQL 1.2 服务 描述. Ruben Taelman; Gregory Williams. W3C. 2026 年 4 月 23 日。W3C 工作 草案。URL: https://www.w3.org/TR/sparql12-service-description/
[SPARQL12-UPDATE]
SPARQL 1.2 更新. Ruben Taelman; Andy Seaborne; Thomas Pellissier Tanon. W3C. 2026 年 4 月 23 日。W3C 工作草案。URL: https://www.w3.org/TR/sparql12-update/
[TRIG]
RDF 1.1 TriG. Gavin Carothers; Andy Seaborne. W3C. 2014 年 2 月 25 日。W3C 推荐标准。URL: https://www.w3.org/TR/trig/
[UNICODE-SECURITY]
Unicode 安全 考量. Mark Davis; Michel Suignard. Unicode Consortium. 2014 年 9 月 19 日。 Unicode 技术报告 #36。URL: https://www.unicode.org/reports/tr36/tr36-15.html