Copyright © 2010-2026 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
本文档定义了一种名为 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 流程文档管辖。
本节是非规范性的。
本文档定义了 TriG,即 RDF 的一种具体语法,RDF 定义于 RDF 概念和抽象语法文档 [RDF12-CONCEPTS]。TriG 是 Turtle [RDF12-TURTLE] 的扩展,扩展后 支持表示完整的 RDF 数据集。
本规范扩展了原始 TriG 语法,该语法定义于 RDF 1.1 TriG [TRIG], 以支持 RDF 1.2 概念和抽象数据模型 [RDF12-CONCEPTS] 引入的新特性。 此扩展完全向后兼容。
本节是非规范性的。
TriG
文档允许以紧凑的文本形式写下一个 RDF 数据集。
它由一系列指令、三元组语句、
包含会生成三元组的语句的图语句以及可选空行组成。
注释可以出现在一个不属于其他
词法记号的 # 之后,并持续到行尾。
图语句是一对
IRI 或
空白
节点
以及一组三元组语句,
这些三元组语句由大括号({})包围。
图语句中的 IRI 或
空白
节点
可以用于另一个图语句中,
这意味着取每个图语句生成的三元组的并集。
用作图标签的 IRI 或
空白
节点
也可以作为任何三元组语句的一部分再次出现。
可选地,图语句可以没有 IRI 标签。
这样的图语句对应于 默认图,该默认图属于一个 RDF
数据集。
从 TriG 文档构造 RDF 数据集的方式定义于 4. TriG 语法 和 5. 解析。
TriG 使用与 Turtle [RDF12-TURTLE] 相同的版本声明机制。
由于 TriG 是 Turtle 语言的扩展,它允许使用 Turtle 语言中的任何构造。 简单三元组、 谓词列表 和 宾语列表 都可以在图语句内部使用,也可以像在 TriG 文档中一样单独使用。 当位于图语句之外时,这些三元组被视为 默认图的一部分, 该默认图属于该 RDF 数据集。
图语句将一个
IRI 或
空白节点与一个
RDF
图配对。
构成该图的三元组语句被包围在
{}中。
在 TriG 文档中,一个图 IRI 或 空白节点可以用作 多个图语句的标签。 图语句的图标签可以省略。 在这种情况下,该图被视为该 RDF 数据集的默认图。
一个 RDF 数据集可能只包含单个图。
# 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 数据集可以包含一个 默认图,以及/或者零个 或更多 命名图。
# 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 提供多种替代方式来书写图 和三元组,让数据编写者可以根据清晰性进行选择:
# 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>
}
所有其他术语、语法形式和指令均来自 RDF Turtle。
除了标记为非规范性的各节之外,本规范中的所有创作指南、图示、示例和注释都是非规范性的。 本规范中的其他所有内容都是规范性的。
本文档中的关键词 MUST、MUST NOT 和 SHOULD 应按 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 解析器如何处理 不符合要求的输入文档。
TriG 的媒体类型是 application/trig。
TriG 内容的内容编码始终是 UTF-8。
TriG
文档是一个以 UTF-8 [RFC3629] 编码的
RDF
字符串。
只允许 Unicode 标量值,
范围为 U+0000 到 U+D7FF
以及 U+E000 到 U+10FFFF。
这排除了范围为 U+D800 到 U+DFFF 的
代理码点。
空白字符(产生式 WS)
用于分隔两个否则会被(误)识别为一个终结符的终结符。
下方大写的规则名表示空白字符具有重要意义的位置;
这些规则名构成了用于构造 TriG 解析器的一种可能的终结符选择。
空白字符在产生式 String 中具有重要意义。
TriG 中的注释以位于
IRIREF、
STRING_LITERAL_SINGLE_QUOTE、
STRING_LITERAL_QUOTE、
STRING_LITERAL_LONG_SINGLE_QUOTE
或
STRING_LITERAL_LONG_QUOTE
之外的一个 # 开始,
并持续到行尾(由
LFs 或
CRs 标记),
如果注释标记后没有行尾,则持续到文件结束。
注释被视为空白字符。
相对 IRI 引用会按照 统一 资源标识符(URI):通用语法 [RFC3986] 使用基础 IRI 解析,并且仅使用第 5.2 节中的 基本算法。 不执行基于语法的规范化,也不执行基于方案的规范化 (见 RFC3986 第 6.2.2 和 6.2.3 节)。 IRI 引用中额外允许的字符会按照 URI 引用中未保留字符的相同方式处理,依据 国际化资源标识符 (IRIs) [RFC3987] 第 6.5 节。
@base 或 BASE 指令
定义用于解析相对 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”)。
每个 @base 或 BASE 指令都会设置
一个新的作用域内基础 URI,
该 URI 相对于前一个基础 URI。
在 TriG 文档中使用三种形式的转义:
数字转义序列表示一个 Unicode 码点的值。
数字转义序列MUST NOT 生成
U+D800 到 U+DFFF 范围内的码点值,
该范围是 Unicode
代理项的范围。
| 转义序列 | Unicode 码点 |
|---|---|
\u hex
hex
hex
hex
|
一个 Unicode 码点,
范围为 U+0000 到 U+D7FF
以及 U+E000 到 U+D7FF,
对应于将四个十六进制数字从最高有效位到最低有效位解释后编码的值。 |
\U hex
hex
hex
hex
hex
hex
hex
hex
|
一个 Unicode 码点,
范围为 U+0000 到
U+D7FF
以及 U+E000 到 U+10FFFF,
对应于将八个十六进制数字从最高有效位到最低有效位
解释后编码的值。
|
其中 hex 是一个十六进制字符
HEX ::= [0-9] |
[A-F] | [a-f]
字符串转义序列表示传统上会在字符串字面量中 转义的字符:
| 转义序列 | Unicode 码点 |
|---|---|
\t |
U+0009 |
\b |
U+0008 |
\n |
U+000A |
\r |
U+000D |
\f |
U+000C |
\" |
U+0022 |
\' |
U+0027 |
\\ |
U+005C |
保留字符转义序列由一个
\
后跟这些字符之一 ~.-!$&'()*+,;=/?#@%_ 组成,
并表示 \ 右侧的字符。
| 数字 转义 |
字符串 转义 |
保留字符 转义 |
|
|---|---|---|---|
IRI,
用作 RDF 术语,
或用于 PREFIX
或 BASE 声明中 |
是 | 否 | 否 |
| 局部 名称 | 否 | 否 | 是 |
| 字符串 | 是 | 是 | 否 |
此处使用的 EBNF 定义于 XML 1.0 [EBNF-NOTATION]。
注:
@base'、
'@prefix'、
'@version'、
'a'、
'true' 和
'false')
区分大小写。
双引号中的关键词
("BASE"、
"PREFIX") 和
"VERSION")
不区分大小写。
UCHAR
和 ECHAR
区分大小写。
trigDoc。
@prefix'、
'@base' 和
'@version'
会匹配 LANG_DIR 的模式,
尽管 prefix、
base 和 version
都不是已注册的语言子标签。
本规范不定义后跟这些记号之一的带引号字面量
(例如 "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 |
::= | '\' ('_' | '~' | '.' | '-' | "!" | '$' | '&' | "'" | '(' | ')' | '*' | '+' | ',' | ';' | '=' | '/' | '?' | '#' | '@' | '%') |
此文法的文本版本可在此处获取。
本文档使用一些特定的终结符字面量字符串 [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 字符序列组成:
spaceU+0020"""U+0022'''U+0027--- 字符RDF 概念和抽象语法 [RDF12-CONCEPTS]
规范定义了四种 RDF
术语:
IRI、
字面量、
空白
节点,以及
三元组术语。
字面量由一个 词法形式
和一个可选的 语言标签 [BCP47]
组成——可能包括一个 初始文本方向——
或者由一个可选的 数据类型 IRI 组成。
在解析期间会使用一个额外类型 prefix,用于将字符串标识符
映射到命名空间 IRI。
本节将符合 4.5 文法中语法的字符串,
通过把匹配产生式和词法记号的字符串映射为 RDF
术语
或其组成部分(例如语言标签、字面量的词法形式),从而映射为一组三元组。
语法产生式会改变解析器状态并发出三元组。
解析 TriG 需要一个由十个项目组成的状态:
base 产生式时,
第二个规则实参 IRIREF 是用于
相对 IRI 引用解析的基础
URI。
PNAME_NS 和 IRIREF)
为前缀(PNAME_NS)
分配命名空间名称(IRIREF)。
在 prefixID 产生式之外,任何 PNAME_NS
都会被替换为该命名空间。
注意,根据 PNAME_NS 产生式:
PN_PREFIX? ":",
前缀可以是空字符串。
subject、
rtSubject、
ttSubject、
blankNodePropertyList、
collection、
tripleTerm 和
annotationBlock
产生式。
verb 产生式。
如果匹配到的记号是 a,
则 curPredicate
会被绑定到 IRI http://www.w3.org/1999/02/22-rdf-syntax-ns#type。
object、
rtObject 和
ttObject 产生式。
reifier 和
annotationBlock 产生式。
xsd:string curVersion –
用于将文档解析为 三元组的 RDF 版本。
如果作为 媒体类型的一部分指定,则
curVersion 的默认值取自 version 参数。
唯一定义的值是 "1.2"。对于其他版本值,解析器行为未定义。
如果为 curVersion 提供了不同版本,本规范不定义其行为。
术语构造器可以创建这些值的栈,这会通过 “记录 curSubject 和 curPredicate” 之类的措辞表示。
此表将产生式和词法记号映射到 RDF 术语 或 RDF 术语的组成部分,这些内容列于 5. 解析:
| 产生式 | 类型 | 过程 |
|---|---|---|
| IRIREF | IRI | 取 < 和 > 之间的字符,并将其中的
数字转义序列取消转义,
以形成 IRI。相对 IRI 引用解析
按 第 6.3 节执行。
生成的 IRI MUST 遵守通用
IRI 语法的句法限制,并且
SHOULD 符合 [RFC3986] 的
第 3.3 节,并遵守相应 IRI 方案规范施加的任何更窄限制。
|
| PNAME_NS | prefix | 当在 prefixID 或 sparqlPrefix 产生式中使用时,
prefix 是可能为空的 RDF 字符串,它匹配该规则的第一个实参。
该字符串在 namespaces map 中作为键;展开后的第二个实参会存储在该键下,
以供后续查找。
|
| IRI | 当在 PrefixedName
产生式中使用时,iri 是 namespaces
map 中与该规则第一个实参对应的值。 |
|
| PNAME_LN | IRI | 由第一个序列 PNAME_NS 标识一个可能为空的
prefix。namespaces 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 节格式良好。
如果存在,初始文本方向 MUST 是 ltr 或 rtl。
|
| 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 | 字面量 | 该字面量具有 true 或 false 的词法形式,具体取决于输入匹配哪一个,
并具有 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 | 三元组术语 |
三元组术语
由从
ttSubject、
predicate 和
ttObject 产生式构造出的术语组成。
|
| reifiedTriple | IRI | 空白节点 |
term 取自匹配的 reifier(如果有),
或取自一个新的 RDF 空白节点。
|
| annotationBlock | IRI | 空白节点 | term 取自先前匹配的 reifier(如果有), 或取自一个新的 RDF 空白节点。 |
由于在输入中检测错误的处理器可能导致 图包含的三元组少于输入所描述的数量 (甚至完全没有三元组), 因此消费者在使用输出三元组时, 应考虑所报告的任何错误信息, 这些输出三元组可能不完整,和/或包含 类型不正确 或格式不良的术语。
TriG 文档定义一个 RDF 数据集, 它由一个 默认图和零个或 更多 命名图组成。 每个图由一组 RDF 三元组组成。
状态 curGraph 最初未设置。它记录解析期间产生的 三元组所属图的标签。 如果未定义,则使用 默认图。
规则
labelOrSubject
同时设置 curGraph
和 curSubject
(只会使用其中一个)。
以下语法产生式子句会将 curGraph 设置为未定义,表示默认 图:
语法产生式
labelOrSubject predicateObjectList '.'
会在处理规则 triplesOrGraph 中的
predicateObjectList 产生式之前
取消设置 curGraph。
产生的每个 RDF 三元组都会添加到 curGraph, 或者如果在解析过程的该点未设置 curGraph, 则添加到默认图。
subject
产生式设置 curSubject。
verb
产生式设置 curPredicate。
三元组会在解析过程中的以下位置产生, 并且每个产生的 RDF 三元组都会 添加到由 curGraph 标识的图。
文档中的每个 object N 都会产生一个 RDF 三元组: curSubject curPredicate N.
开始 reifier 产生式时,
curReifier 取自 reifier 术语
构造器。
然后产生 RDF 三元组 curReifier rdf:reifies
curTripleTerm。
开始 reifiedTriple 产生式时,
会记录 curTripleTerm。
使用
rtSubject、
verb 和
rtObject 产生式
创建一个新的 tripleTerm 实例
curTripleTerm。
结束 reifiedTriple 产生式时,
如果未设置 curReifier,则为其分配一个新的 RDF
空白节点;
接着它产生 RDF 三元组 curReifier rdf:reifies
curTripleTerm,
然后恢复 curTripleTerm 的记录值。
通过匹配 reifiedTriple
产生的节点是 curReifier。
开始 annotation 产生式时,
会记录 curSubject 和 curPredicate。
使用 curSubject curPredicate curObject
创建一个新的 tripleTerm 实例
curTripleTerm,
并清除 curReifier 的值。
结束 annotation 产生式时,
会恢复 curSubject 和 curPredicate 的记录值。
开始 annotationBlock
产生式时,会记录 curTripleTerm。
如果未设置 curReifier,则为其分配一个新的 RDF
空白节点,
并且该产生式会产生 RDF 三元组 curReifier rdf:reifies
curTripleTerm。
curSubject 取自 curReifier。
结束 annotationBlock
产生式时,
会清除 curReifier 的值
并恢复 curTripleTerm。
如果 curReifier 已经设置,
具体化三元组 curReifier rdf:reifies curTripleTerm
已在 5.3.4 具体化器中发出。
开始 blankNodePropertyList
产生式时,会记录 curSubject 和 curPredicate,并将
curSubject 设置为一个新的 空白节点 B。
结束 blankNodePropertyList
产生式时,会恢复 curSubject 和 curPredicate。
通过匹配 blankNodePropertyList
产生的节点是
空白节点 B。
开始 collection 产生式时,
会记录 curSubject 和 curPredicate。
collection 产生式中的每个
object 都有一个
curSubject,它被设置为一个新的 空白节点 B,并且有一个
curPredicate 被设置为 rdf:first。
第一个之后的每个对象 objectn 都会产生一个三元组:objectn-1 rdf:rest
objectn .
结束 collection 产生式时,
会创建一个额外三元组 curSubject rdf:rest rdf:nil .
并恢复 curSubject 和 curPredicate。
通过匹配 collection 产生的节点,
对于非空列表是第一个空白节点 B,对于空列表是 rdf:nil。
本节是非规范性的。
TriG 格式用于表达任意应用程序数据, 其中可能包括个人身份信息(PII) 或其他可能被视为敏感的信息的表达。 建议发布此类信息的作者仔细 考虑发布此类信息的需求和用途, 以及数据预期被消费并可能被披露所在地区的适用法规 (例如 GDPR、 CCPA、 其他法规), 特别是访问这些数据是否需要授权措施。
本节是非规范性的。
STRING_LITERAL_SINGLE_QUOTE、
STRING_LITERAL_QUOTE、
STRING_LITERAL_LONG_SINGLE_QUOTE
和
STRING_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 节。
TriG 的互联网媒体类型(以前称为 MIME 类型)是“application/trig”。
建议 TriG 文件在所有平台上都使用扩展名“.trig”(全小写)。
以下信息已提交给互联网工程指导组(IESG)进行审查、 批准并向 IANA 注册。
versionversion 的可接受值
定义于 [RDF12-CONCEPTS] 中的
2.1 版本标签。
profile
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 的关系
中所规定。
本节是非规范性的。
本节是非规范性的。
编辑衷心感谢 Chris Bizer 和 Richard Cyganiak 创建原始 TriG 规范的工作。 Gregg Kellogg、Eric Prud'hommeaux 和 Sandro Hawke 对此版本作出了宝贵贡献。
本文档通过更广泛社区的审查过程得到了改进。
本节是非规范性的。
除编辑外,以下人员也对此规范作出了贡献: 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 及相关标准更广泛生态系统的巨大贡献。
要表彰任务组成员吗?不容易找到贡献者列表。
本节是非规范性的。
本节描述了与 RDF 1.1 推荐标准相比的 主要差异。
本规范扩展了原始 TriG 语法,该语法定义于 RDF 1.1
TriG [TRIG],
以支持 RDF 1.2
概念和抽象数据模型
[RDF12-CONCEPTS]
引入的新特性。
此扩展完全向后兼容:
任何符合旧版本的文档也符合新版本,并会解析为同一个图。
此外,任何符合新版本且仅包含 RDF 1.1 特性的文档也
符合较旧版本
(VERSION 指令除外;见 2.1 版本声明)。
最后,新的语法构造在旧语法中均无效。
这意味着任何使用 RDF 1.2 特性的 TriG 文档都不
符合本规范的上一版本,也不能在该版本下
被解释为不同的图。
更具体地说,进行了以下变更:
LANGTAG 终结符产生式更改为
LANG_DIR,以包含
可选的 初始文本方向。
NIL 终结符产生式。@version 不匹配
LANG_DIR;
先前版本的文法会允许这样的匹配,
但会产生一个根据 [BCP47] 语言标签格式不良的字面量,
并形成无效字面量。
profile 媒体类型参数,
以允许客户端和服务器为 TriG 表示传达附加 profile 信息,
而不改变其语义。Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in: