请查看 勘误,了解自发布以来报告的任何错误或 问题。
另请参阅 翻译。
本文档还提供以下非规范格式: EPUB
Copyright © 2010-2020 W3C® (MIT, ERCIM, Keio, Beihang). W3C liability, trademark and permissive document license rules apply.
本规范定义了一组用于以编程方式转换 JSON-LD 文档的算法。根据所定义的转换对数据进行重构, 通常会显著简化其使用。此外,本文档还为实现这些 指定算法的开发者提出了一个应用程序编程接口(API)。
本规范描述了 JSON-LD 1.0 处理算法和 API [JSON-LD10-API] 中所定义特性的超集,并且除非另有说明, 本规范中描述的算法完全兼容使用 JSON-LD 1.0 [JSON-LD10] 创建的文档。
本节描述本文档在发布时的状态。 其他文档可能会取代本文档。当前 W3C 出版物列表以及本技术报告的 最新修订版可在 W3C 技术报告 索引中找到,地址为 https://www.w3.org/TR/。
本文档由 JSON-LD 工作组开发,并源自 JSON-LD 社区组的 最终报告。
有一个 实时 JSON-LD 游乐场,能够 演示本文档中描述的特性。
本规范旨在取代 JSON-LD 1.0 处理算法和 API [JSON-LD10-API] 规范。
本文档由 JSON-LD 工作组作为 推荐标准发布。
GitHub Issues 是讨论 本规范的首选方式。 或者,你也可以将意见发送到我们的邮件列表。 请将其发送至 public-json-ld-wg@w3.org (存档)。
请参阅工作组的 实现报告。
本文档已经由 W3C 成员、软件开发者以及 其他 W3C 小组和相关方审阅,并由总监认可 为 W3C 推荐标准。它是一份稳定文档,可以用作 参考材料,或被其他文档引用。W3C 在制定 推荐标准中的作用,是引起人们对该规范的关注,并促进其 广泛部署。这增强了 Web 的功能性和互操作性。
本文档由一个根据 W3C 专利政策运行的小组制作。 W3C 维护着一个 任何专利 披露的公开列表, 这些披露与该小组的交付成果有关; 该页面还包括 披露专利的说明。实际知晓某项专利并且认为该专利包含 必要权利要求 的个人,必须按照 W3C 专利政策第 6 节 披露该信息。
本文档受 2019年3月1日 W3C 流程文档管辖。
本文档是由 JSON-LD 工作组制作的三份 JSON-LD 1.1 推荐标准之一:
本节是非规范性的。
本文档是 JSON-LD 处理算法的详细规范。 本文档主要面向以下读者:
要理解本规范中的基础内容,你必须首先熟悉 JSON,其详细说明见 [RFC8259]。你还必须 理解 JSON-LD 1.1 语法规范 [JSON-LD11] 中定义的 JSON-LD 语法,它是本文档中所有算法所使用的基础语法。 要理解 API 以及它打算如何在编程环境中运行,具备 JavaScript 编程语言 [ECMASCRIPT] 和 WebIDL [WEBIDL] 的工作知识会很有帮助。要理解 JSON-LD 如何映射到 RDF, 熟悉基本的 RDF 概念会很有帮助 [RDF11-CONCEPTS]。
本节是非规范性的。
本文档是关于 JSON 中链接数据序列化的详细规范。 本文档主要面向以下读者:
配套文档 JSON-LD 1.1 规范 [JSON-LD11] 规定了 JSON-LD 文档的语法。
要理解本规范中的基础内容,你必须首先熟悉 JSON,其详细说明见 [RFC8259]。
本文档可以突出显示自 JSON-LD 1.0 版本以来的变更。 选择以 变更。
本节是非规范性的。
可以通过多种方式参与本规范的开发:
本节是非规范性的。
本规范中使用以下排版约定:
标记标记定义引用 标记外部定义引用注释位于浅绿色框中,左侧带有绿色边框,并带有绿色的“注”标题。 注释始终是资料性的。
示例位于浅卡其色框中,左侧带有卡其色边框, 并带有编号的卡其色“示例”标题。 示例始终是资料性的。示例内容采用等宽字体,并且可能进行语法着色。 示例可以有选项卡式导航按钮, 用于显示将示例转换为其他表示形式后的结果。
本文档使用外部规范中定义的以下术语, 并定义 JSON-LD 特有的术语。
从 ECMAScript 语言 规范 [ECMASCRIPT]、 JavaScript Object Notation(JSON)数据 交换格式 [RFC8259]、 Infra 标准 [INFRA] 和 Web IDL [WEBIDL] 导入的术语
true 和 false。@context 中的一个映射条目,
如果其值,或该值的 @id 为 null,
则会显式解除某个术语与
IRI 的关联。
映射条目位于
JSON-LD
文档
主体中且其值为 null 时,
其含义与未定义该映射条目相同。
如果在展开形式中将 @value、@list 或 @set 设置为 null,
则整个 JSON
对象都会被忽略。
true 或 false 之一。
从 国际化资源标识符(IRI) [RFC3987] 导入的术语
@type 的值,
以及定义为相对于词汇表的术语的值,
都相对于词汇表映射解析,
而不是相对于基准
IRI解析。
从 RDF 1.1 概念和 抽象语法 [RDF11-CONCEPTS]、RDF Schema 1.1 [RDF-SCHEMA] 和 链接数据设计 问题 [LINKED-DATA] 导入的术语
_: 开头的标识符。
_: 开头。
rdf:langString,则包含一个可选的语言标签。
@direction 键在上下文中设置,
其值必须是字符串 "ltr"、"rtl" 或
null 之一。
有关规范性描述,请参阅 JSON-LD 1.1 的 上下文
定义章节。
@language 键在上下文中设置,
其值必须是表示
[BCP47] 语言代码的
字符串或
null。
有关规范性描述,请参阅 JSON-LD 1.1 的上下文
定义章节。
@default 键的映射。
@graph 条目,
并且还可以具有 @id 和 @index 条目。
简单图
对象
是不具有 @id 条目的
图
对象。
注意,节点对象可以具有
@graph 条目,
但如果它们包含任何其他条目,
则不被视为图对象。
仅由 @graph 组成的顶层对象也不是图对象。
注意,节点对象如果包含其他属性,
也可以表示命名图。
有关规范性描述,请参阅 JSON-LD 1.1 的图对象章节。
@container 设置为 @id 定义的术语的值。
id 映射的值必须是节点
对象,
其键被解释为表示关联节点对象的 @id 的
IRI。
如果 id
映射中的值包含展开为
@id 的键,
则其值必须等价于 id
映射中的引用键。
有关规范性描述,请参阅 JSON-LD
1.1 的 Id 映射章节。
@included 或
@included 的别名,
值为一个或多个节点对象。
有关规范性描述,请参阅 JSON-LD 1.1 的包含块
章节。
@container 设置为 @index 定义的术语的值,
其值必须是以下类型之一:
字符串、
数字、
true、
false、
null、
节点
对象、
值
对象、
列表
对象、
集合
对象,或
由零个或多个上述可能项组成的数组。
有关形式化描述,请参阅
JSON-LD 1.1 中的索引映射章节。
rdf:JSON。
在值对象
表示中,@type 的值为 @json。
JSON 字面量表示有效 JSON [RFC8259]
值。
有关规范性描述,请参阅 JSON-LD 1.1 中的
rdf:JSON 数据类型章节。
true 或 false、
一个类型化
值,
或一个带语言标签的
字符串。
它表示一个 RDF
字面量。
@container 设置为 @language 定义的术语的值,
其键必须是表示
[BCP47] 语言代码的
字符串,
其值必须是以下类型之一:
null、
字符串,
或
由零个或多个上述可能项组成的数组。
有关规范性描述,请参阅 JSON-LD 1.1 的语言映射章节。
@list
键的映射。
它还可以具有一个 @index 键,但不能有其他条目。
有关规范性描述,请参阅 JSON-LD 1.1 的列表和集合章节。
@context 关键字指定。
@version
条目定义不同版本,
发布者可以确保符合 JSON-LD 1.0
[JSON-LD10] 的处理器
不会意外处理 JSON-LD 1.1 文档,从而可能产生不同的输出。
API 提供了一个选项,用于将处理模式设置为
json-ld-1.0,
这将阻止 JSON-LD 1.1 特性被激活,
或者在上下文中的
@version
条目显式设置为
1.1 时产生错误。
本规范通过 json-ld-1.1 处理模式扩展
JSON-LD
1.0。
@context 条目的展开的术语
定义的一部分。它与嵌入式上下文具有相同形式。
当术语用作类型时,它定义一个类型作用域
上下文,
当用作属性时,它定义一个属性作用域
上下文。
@set
条目的
映射。
它还可以具有一个 @index 键,但不能有其他条目。
有关规范性描述,请参阅 JSON-LD 1.1 的列表和集合章节。
@container 设置为 @type 定义的
术语,
其键被解释为表示关联节点对象的 @type 的
IRI;
值必须是节点对象,或节点
对象的数组。
如果值包含一个展开为
@type 的术语,
则其值会在展开时与映射值合并。
有关规范性描述,请参阅 JSON-LD 1.1 的类型映射章节。
@value 条目的映射。
有关规范性描述,请参阅 JSON-LD 1.1 的值对象章节。
@vocab 键在上下文中设置,
其值必须是一个IRI、一个紧凑
IRI、一个术语,或
null。
有关规范性描述,请参阅 JSON-LD 1.1 的上下文
定义章节。
以下术语在特定算法中使用。
false。
true,
reverse 标志默认为 false。
false,
vocab 标志默认为 true。
除了 JSON-LD 1.1 语法规范 [JSON-LD11] 中定义的关键字之外, 本规范还添加了一个额外的关键字来支持 JSON-LD 1.1 成帧 [JSON-LD11-FRAMING]:
@preserve本节是非规范性的。
注意,在本文档使用的示例中,输出 必然以 JSON 的序列化形式显示。虽然算法 描述的是对JSON-LD 内部表示的操作,但当 它们作为示例显示时,使用的是 JSON 序列化。特别是, 内部表示中使用的映射会使用 JSON 对象表示。
{
"@context": {
"name": "http://xmlns.com/foaf/0.1/name",
"knows": "http://xmlns.com/foaf/0.1/knows"
},
"@id": "http://me.markus-lanthaler.com/",
"name": "Markus Lanthaler",
"knows": [
{
"name": "Dave Longley"
}
]
}
在内部
表示中,上面的示例将是一个
包含 @context、@id、name 和 knows
条目的
映射,
其值可以是映射、
字符串,或由
映射或字符串值组成的数组。在 JSON 序列化中,
JSON 对象用于
映射,而数组和字符串则使用许多编程语言常见的
约定进行序列化。
本节是非规范性的。
JSON-LD 1.1 语法规范 [JSON-LD11] 定义了一种用于 在 JSON 中表达链接数据的语法。由于使用这种语法 表达链接数据的方式不止一种,因此通常需要能够 转换 JSON-LD 文档,以便特定应用程序可以更容易地使用它们。
为了允许这些算法适配 JSON 以外的语法, 这些算法作用于 JSON-LD 内部表示, 该表示使用 数组、映射、 字符串、数字、 布尔值和 null这些通用 概念来描述 JSON 文档所表示的数据。算法作用于这种 内部表示, 而 API 入口点负责 在具体表示和内部表示之间进行转换。
JSON-LD 使用上下文来 允许链接数据 以专门适配特定人员或应用程序的方式表达。通过提供 上下文, JSON 数据可以以自然适合特定人员或应用程序的方式表达, 同时也指明这些数据应如何在全局范围内理解。 为了让人员或应用程序能够共享使用与自身不同的 上下文创建的数据, JSON-LD 处理器必须能够将文档 从一个上下文转换为另一个。 与其要求 JSON-LD 处理器为每一种可想象的 上下文切换场景编写专门代码, 不如指定一个 可以移除任何上下文的 单一算法。同样, 还可以指定另一个算法来随后应用任何 上下文。这两个 算法代表 JSON-LD 文档最基本的 转换。它们分别称为 展开和压缩。
JSON-LD 1.1 引入了与
JSON-LD 1.0
[JSON-LD10]
兼容的新特性,
但如果由 JSON-LD 1.0 处理器处理,可能会产生不同结果。
处理器默认使用 json-ld-1.1,除非
processingMode API 选项
被显式设置为 json-ld-1.0。
鼓励发布者在上下文中使用设置为
1.1 的 @version 映射条目,
以确保 JSON-LD 1.0 处理器不会误解 JSON-LD 1.1 特性。
本文档讨论了四种主要类型的转换: 展开、压缩、扁平化,以及 RDF 序列化/反序列化。
本节是非规范性的。
移除上下文的算法 称为 展开。在对 JSON-LD 文档执行任何其他 转换之前,最简单的做法是 移除其中的任何上下文, 并使数据结构 更加规则。
为了了解上下文和数据结构如何影响同一数据, 下面是一个仅使用术语 且相当紧凑的 JSON-LD 示例:
下一个输入示例使用一个IRI来表达一个属性, 并使用一个映射封装一个 值,但 其余信息保持不变。
注意,这两个输入都是有效的 JSON-LD,并且都表示相同的 信息。差异在于它们的上下文信息 以及所使用的数据结构。JSON-LD 处理器可以通过采用 展开 来移除上下文, 并确保数据更加规则。
展开有两个重要目标:
从文档中移除任何上下文
信息,并确保所有值都以规则形式表示。
这些目标通过将所有条目键展开为
IRI,
并以展开形式在
数组中表达所有
值来实现。展开形式是在 JSON-LD 中表达值的
最冗长且最规则的方式;文档中的所有上下文
信息则会在每个值本地保存。
对上面的示例运行展开算法
(expand()
操作)会得到以下输出:
[
{
"@id": "http://me.markus-lanthaler.com/",
"http://xmlns.com/foaf/0.1/name": [
{ "@value": "Markus Lanthaler" }
],
"http://xmlns.com/foaf/0.1/homepage": [
{ "@id": "http://www.markus-lanthaler.com/" }
]
}
]
上面的示例是 展开算法输出的 JSON-LD 序列化, 其中算法使用的映射被替换为JSON 对象。
注意,在上面的输出中,所有上下文定义都已被 移除,所有术语和 紧凑 IRI都已 展开为绝对 IRI,并且所有 JSON-LD 值都以 数组中的 展开形式表达。虽然 输出更加冗长且难以让人阅读,但它建立了一个 基准,使 JSON-LD 处理因其非常规则的 结构而更容易。
本节是非规范性的。
虽然展开会从给定 输入中移除上下文, 压缩的主要功能则是 执行相反的操作:根据特定 上下文表达给定输入。 压缩会应用一个 上下文, 该上下文会专门定制信息为特定人员或应用程序 表达的方式。这通过以应用程序特定的 术语表达数据,简化了使用 JSON 或 JSON-LD 的应用程序, 并使数据更易于人类阅读。
压缩使用开发者提供的 上下文将 IRI缩短为 术语或 紧凑 IRI, 并将以 展开形式表达的 JSON-LD 值 转换为简单值, 例如字符串 或数字。
例如,假设有以下展开后的 JSON-LD 输入文档:
[
{
"@id": "http://me.markus-lanthaler.com/",
"http://xmlns.com/foaf/0.1/name": [
{ "@value": "Markus Lanthaler" }
],
"http://xmlns.com/foaf/0.1/homepage": [
{ "@id": "http://www.markus-lanthaler.com/" }
]
}
]
此外,假设有以下开发者提供的 JSON-LD 上下文:
{
"@context": {
"name": "http://xmlns.com/foaf/0.1/name",
"homepage": {
"@id": "http://xmlns.com/foaf/0.1/homepage",
"@type": "@id"
}
}
}
给定上面提供的上下文,对上面提供的 JSON-LD 输入
文档运行压缩算法
(compact()
操作)将得到以下输出:
上面的示例是 压缩算法输出的 JSON-LD 序列化, 其中算法使用的映射被替换为JSON 对象。
注意,所有IRI都已
按照
上下文中指定的方式
压缩为术语,
该上下文已被注入到输出中。虽然压缩后的输出
对人类很有用,但它也用于生成易于
编程处理的结构。压缩使开发者能够将任何展开后的文档
映射为特定于应用程序的压缩文档。虽然上面提供的上下文
将 http://xmlns.com/foaf/0.1/name 映射到 name,但它
也可以映射到开发者提供的任何其他术语。
本节是非规范性的。
虽然展开确保文档处于统一结构中, 扁平化更进一步, 确保数据的形状 是确定性的。在展开文档中,单个 节点的 属性可能分散在多个不同的 节点 对象中。通过扁平化 文档,一个节点的所有 属性都会被收集到一个单一的 节点 对象中,并且所有空白节点 都会标记一个空白节点标识符。 这可以显著 简化某些应用程序中处理 JSON-LD 数据所需的代码。
例如,假设有以下 JSON-LD 输入文档:
{
"@context": {
"name": "http://xmlns.com/foaf/0.1/name",
"knows": "http://xmlns.com/foaf/0.1/knows"
},
"@id": "http://me.markus-lanthaler.com/",
"name": "Markus Lanthaler",
"knows": [
{"name": "Dave Longley"}
]
}
运行扁平化算法
(flatten()
操作),并将上下文设置为 null 以防止压缩,
会返回以下文档:
上面的示例是 扁平化算法输出的 JSON-LD 序列化, 其中算法使用的映射被替换为JSON 对象。
注意,在上面的输出中,一个节点的所有
属性都被收集到一个
单一的节点对象中,并且表示
“Dave Longley”的空白节点
已被分配空白节点标识符
_:b0。
为了使其更易于人类阅读,或更便于某些应用程序 处理,可以通过传入一个上下文来压缩扁平化文档。使用 与输入文档相同的上下文,扁平化并压缩后的文档 如下所示:
请注意,对文档进行扁平化并压缩后的结果
始终是一个映射,
(序列化时表示为JSON 对象),
其中包含一个 @graph
条目,表示默认
图。
本节是非规范性的。
JSON-LD 可用于按照 [RDF11-CONCEPTS] 中的描述序列化 RDF 数据。 这确保数据 可以在任何 RDF 语法之间来回转换,而不会损失保真度。
例如,假设有以下以 Turtle [TURTLE] 序列化的 RDF 输入:
@prefix foaf: <http://xmlns.com/foaf/0.1/> . <http://me.markus-lanthaler.com/> foaf:name "Markus Lanthaler" ; foaf:homepage <http://www.markus-lanthaler.com/> .
使用将 RDF 序列化为 JSON-LD 的算法, 开发者可以将此文档转换为展开后的 JSON-LD:
[
{
"@id": "http://me.markus-lanthaler.com/",
"http://xmlns.com/foaf/0.1/name": [
{ "@value": "Markus Lanthaler" }
],
"http://xmlns.com/foaf/0.1/homepage": [
{ "@id": "http://www.markus-lanthaler.com/" }
]
}
]
上面的示例是 将 RDF 序列化为 JSON-LD 的算法输出的 JSON-LD 序列化, 其中算法使用的映射被替换为JSON 对象。
注意,上述输出可以很容易地使用上一节概述的技术进行压缩。 也可以使用将 JSON-LD 反序列化为 RDF 的 算法将 JSON-LD 文档反序列化回 RDF。
除标记为非规范性的章节外,本规范中的所有编写指南、图表、示例和注释都是非规范性的。 本规范中的其他所有内容都是规范性的。
本文档中的关键词 MAY、MUST、MUST NOT 和 SHOULD 应按照 BCP 14 [RFC2119] [RFC8174] 中所述进行解释,但仅当它们像这里所示那样全部大写时才如此。
有两类产品可以声称符合本 规范:JSON-LD 处理器 和 RDF 序列化器/反序列化器。
符合规范的 JSON-LD 处理器 是一个能够执行 展开、压缩 和 扁平化操作的系统, 其方式与 本规范中定义的算法一致。
JSON-LD 处理器MUST NOT 尝试纠正格式错误的 IRI 或语言标签; 但是,它们 SHOULD 发出验证警告。 除了在 相对 IRI 和绝对 IRI 之间转换外,IRI 不会被修改。
符合规范的 RDF 序列化器/反序列化器是一个能够按照 本规范中的定义 将 JSON-LD 反序列化为 RDF 并 将 RDF 序列化为 JSON-LD 的系统。
除非使用
processingMode API 选项指定,
否则处理模式
通过局部上下文中的
@version 条目设置,
并影响包括展开和压缩在内的算法行为。
一旦设置,尝试更改为不同处理模式就是错误,
并且处理器 MUST 生成
processing mode conflict
错误并中止进一步处理。
本规范中的算法通常更注重清晰性而非效率。因此,JSON-LD 处理器可以 以任何所需方式实现本规范中给出的算法, 只要最终结果与通过本规范算法获得的结果不可区分即可。
在描述对关键字进行操作的算法步骤中,这些步骤 也适用于关键字别名。
实现者可以通过成功通过 JSON-LD 测试套件中的测试用例, 部分检查其对本规范的一致性级别。 但请注意,通过测试 套件中的所有测试并不意味着完全符合本规范。它只意味着 该实现符合测试套件所测试的方面。
本规范使用以下命名空间前缀:
| 前缀 | IRI |
|---|---|
| rdf | http://www.w3.org/1999/02/22-rdf-syntax-ns# |
| xsd | http://www.w3.org/2001/XMLSchema# |
以下章节描述用于处理 JSON-LD 上下文的算法。
在处理 JSON-LD 数据结构时,每条处理规则都使用 活动上下文提供的信息应用。本 节描述如何生成活动上下文。
活动上下文 由以下内容组成:
"ltr" 或 "rtl"),每个术语 定义由以下内容组成:
"ltr" 或 "rtl"),术语定义 不仅可用于将术语 映射到 IRI,还可用于将术语映射到关键字, 在这种情况下它称为关键字别名。
处理时,active context 会被初始化为
具有 null 逆上下文,
且没有任何术语
定义、
词汇表
映射、默认基准方向或默认
语言。
如果在处理期间遇到局部上下文,
则会通过克隆现有的
active context 来创建新的
active context。然后将
局部上下文中的信息
合并到新的 active context 中。
鉴于局部
上下文可能包含
对远程上下文的引用,这包括对它们的检索。
本节是非规范性的。
首先,我们通过克隆 当前活动上下文来准备一个新的 活动上下文 result。 然后,我们将原始 局部上下文 的形式规范化为数组。 局部上下文 可以是 映射、 字符串,或包含 二者组合的数组。最后,我们按如下方式处理 局部 上下文数组中包含的每个 上下文。
如果上下文是字符串,则它
表示对
远程上下文的引用。我们解引用远程上下文,并将上下文
替换为检索到的 JSON-LD 文档中顶层对象的 @context
条目的值。
如果不存在这样的条目,则检测到
invalid remote context。
否则,我们通过递归使用
此算法来处理上下文,并确保不存在循环引用。
如果上下文是映射,
则它是上下文定义。
我们首先通过处理六个特定关键字:
@base、
@direction、
@language、
@propagate、
@version
和 @vocab,
来更新
基准 IRI、
默认基准
方向、
默认
语言、
上下文传播、
处理模式
和词汇表映射。
这些会在局部上下文中的任何其他
条目之前处理,因为
它们会影响其他条目的处理方式。
如果上下文包含
@import,则检索它并将其反向合并
到包含它的上下文中,从而允许 JSON-LD 1.0 上下文升级到 JSON-LD 1.1。
请注意,在处理远程上下文时会忽略 @base。
如果上下文不应传播, 则会保留对先前 上下文的引用,以便 在进入新的节点对象时回滚。 默认情况下,除类型作用域上下文外,所有上下文都会传播。
初始化活动
上下文时,
原始基准
URL的值
会从包含初始上下文的文档的原始
初始化(如果可用),
否则从 documentUrl API 选项初始化。
这在通过将活动上下文
设置为 basenull 来重置它时是必要的,
以保留原始默认基准 IRI。
初始化时,或当
活动
上下文的任何条目发生变化时,
或任何关联的术语定义被添加、
更改或移除时,
逆上下文字段
在活动
上下文中会被设置为 null。
然后,对于局部上下文中的每个其他 条目,我们更新 result 中的术语 定义。由于 局部上下文 中的术语 定义 本身可能包含术语或 紧凑 IRI, 我们可能需要递归。 这样做时,必须确保不存在循环依赖, 这是一种错误。在处理完任何 术语 定义依赖后, 我们更新当前的术语定义, 它可能是关键字 别名。
最后,我们返回 result 作为新的活动上下文。
此算法指定如何使用局部
上下文更新新的活动上下文。
该算法接受三个必需的
和四个可选的
输入变量。
必需输入是
active context、
local context,
以及用于解析相对上下文 URL 的 base URL。
可选输入是
一个数组 remote
contexts,
默认为新的空数组,用于检测循环上下文
包含,
override protected,默认为 false,
用于允许更改受保护术语,
propagate,默认为 true,
用于标记与非传播上下文关联的术语
定义,
以及 validate scoped context,默认为 true,
用于在验证可能递归的作用域上下文时限制递归。
null。
@propagate 的对象,
则其值 MUST 为布尔值 true 或
false,
将 propagate 设置为该值。
false,并且 result
没有先前上下文,则将
result 中的先前上下文
设置为 active context。
null:
loading document failed 错误
并中止处理。
false,
且 remote contexts 已经包含 context,
则不再进一步处理 context,并继续处理 local context 中任何下一个
context。
context overflow
错误并中止处理;
否则,将 context 添加到 remote contexts。
@context
条目的值。
@context 条目。LoadDocumentCallback 解引用
context
所获得的 RemoteDocument,
传入
context
作为 url,
并传入 http://www.w3.org/ns/json-ld#context 作为profile
以及requestProfile。
document
无法转换为内部表示
,
则检测到 loading remote context failed
错误并中止处理。
document 没有
带有 @context 条目的
顶层映射,则检测到
invalid remote context
并中止处理。
documentUrl 作为
base URL,
remote contexts 的副本,
以及 validate scoped context。
invalid local context
错误并中止处理。
@version 条目:
1.1,
则检测到 invalid @version value
并中止处理。
json-ld-1.0,
则检测到 processing mode conflict
错误并中止处理。@import 条目:
json-ld-1.0,
则检测到 invalid context entry
错误并中止处理。@import 的值不是字符串,
则检测到 invalid @import value
错误并中止处理。@import 的值相对于
base URL 解析的结果。
LoadDocumentCallback 解引用
import,传入
import
作为 url,
并传入 http://www.w3.org/ns/json-ld#context 作为profile
以及requestProfile。
loading remote context failed
错误并中止处理。
@context 条目的
顶层映射,
或者如果 @context 的值不是上下文
定义
(即它不是映射),
则检测到 invalid remote context
并中止处理;否则,
将 import context 设置为该条目的值。
@import 条目,
则检测到 invalid context entry
错误并中止处理。@base 条目,并且 remote
contexts 为空,即当前
正在处理的上下文不是远程上下文:
@vocab 条目:
@language 条目:
@direction 条目:
json-ld-1.0,
则检测到 invalid context entry
错误并中止处理。@direction 条目关联的值。
null,则从 result 中移除
任何基准
方向。null、"ltr" 或
"rtl",则检测到
invalid base direction
错误并中止处理。
@propagate 条目:
json-ld-1.0,
则检测到 invalid context entry
错误并中止处理。@propagate 的值不是布尔值 true
或 false,
则检测到 invalid @propagate value
错误并中止处理。
@base、
@direction、
@import、
@language、
@propagate、
@protected、
@version 或
@vocab,
调用
创建术语定义算法,
传入 result 作为 active context,
context 作为 local context,key,
defined,
base URL,
context 中 @protected
条目的值(如果有)作为 protected,
override protected,
以及 remote contexts 的副本。
此算法由 上下文处理算法 调用,用于在活动上下文中,为正在 局部 上下文中处理的术语 创建术语 定义。
本节是非规范性的。
术语 定义通过 解析给定局部上下文中关于 给定术语的信息来创建。如果 给定术语是 紧凑 IRI,则它可以通过 依赖其前缀自身具有的 术语 定义,省略IRI 映射。如果该前缀是 条目,位于局部 上下文中,那么在继续之前,必须先通过递归创建其术语定义。 由于一个术语 定义可能依赖其他 术语 定义,因此必须 使用一种机制来检测循环依赖。这里采用的解决方案 使用一个映射 defined,它跟踪某个 术语是否已被定义, 或当前是否正在 被定义。此映射会在尝试任何递归之前进行检查。
在一个术语的所有依赖项都已定义后, 会考虑给定术语在局部上下文中的其余信息, 创建适当的 IRI 映射、容器映射、 以及 类型映射、 语言映射, 或方向映射 用于该术语。
该算法有四个必需输入,以及五个可选输入。
必需输入是
active context、
local context、
term,
以及映射 defined。
可选输入是
base URL,默认为 null;
protected,默认为 false;
以及 override protected,默认为 false,
它用于允许更改受保护术语;
一个数组 remote
contexts,
默认为新的空数组,用于检测循环
上下文包含;
以及 validate scoped context,默认为 true,
用于在验证可能递归的作用域上下文时限制递归。
true(表示
术语
定义已经创建),则返回。否则,
如果其值为 false,则检测到
cyclic IRI mapping
错误并中止处理。
""),
则检测到 invalid term definition
错误并中止处理。
否则,将与 defined 的 term 条目关联的值设置为
false。这表示术语定义
现在正在创建,但尚未完成。
@type,
并且处理模式为
json-ld-1.0,
则检测到 keyword redefinition 错误,
并中止处理。
此时,
value MUST 是一个映射,且仅包含以下
条目中的任一个或二者:
@container 条目,其值为 @set。@protected 条目。keyword redefinition 错误,
并中止处理。
keyword redefinition
错误并中止处理。
如果 term 具有关键字的形式
(即它匹配 [RFC5234] 中的 ABNF 规则
"@"1*ALPHA),
则返回;处理器 SHOULD 生成警告。
null,
将其转换为一个映射,该映射由单个条目组成,
其键为 @id,值为 null。@id,值为 value。
将 simple term 设置为 true。
invalid term definition
错误并中止处理。
将 simple term 设置为 false。
false,
将受保护初始化为
protected,
并将反向
属性初始化为 false。
@protected 条目,
将 definition 中的受保护标志设置为该条目的值。
如果 @protected 的值不是布尔值,
则检测到 invalid @protected value 错误并
中止处理。
如果处理模式为
json-ld-1.0,
则检测到 invalid term definition
并中止处理。
@type:
@type 条目关联的值,该值
MUST 是字符串。否则,
检测到 invalid type mapping
错误并中止处理。
@json 或 @none,且处理模式为
json-ld-1.0,
则检测到 invalid type mapping
错误并中止处理。
@id,也不是 @json,
也不是 @none,
也不是 @vocab,
也不是IRI,
则检测到 invalid type mapping
错误并中止处理。@reverse:
@id 或 @nest 条目,则
检测到 invalid reverse property
错误并中止处理。
@reverse 条目关联的值
不是字符串,则
检测到 invalid IRI mapping
错误并中止处理。
@reverse 条目关联的值是一个
具有关键字形式的字符串
(即它匹配 [RFC5234] 中的
ABNF 规则
"@"1*ALPHA),
则返回;处理器 SHOULD 生成警告。
@reverse 条目关联的值进行
IRI
展开
的结果,
使用 local context 和 defined。
如果结果不具有形式为
IRI或空白节点
标识符,
则检测到 invalid IRI mapping
错误并中止处理。
@container 条目,
将 definition 的容器映射
设置为包含其值的数组;
如果其值既不是 @set,也不是
@index,也不是 null,则检测到
invalid reverse property
错误(反向属性仅支持 set 和
index 容器)并中止处理。
true。true,然后返回。
@id,且其值
不等于 term:
@id 条目
为 null,则该术语不用于 IRI 展开,但会
保留以便检测该术语未来的重新定义。@id 条目关联的值不是字符串,则检测到
invalid IRI mapping
错误并中止处理。
@id 条目关联的值
不是关键字,但
具有关键字的形式
(即它匹配 [RFC5234]
中的 ABNF 规则
"@"1*ALPHA),
则返回;处理器 SHOULD 生成
警告。
@id 条目关联的值进行
IRI
展开
的结果,
使用 local context 和 defined。
如果得到的IRI 映射
既不是关键字,也不是
IRI,也不是空白
节点标识符,则检测到
invalid IRI mapping
错误并中止处理;如果它等于
@context,则检测到
invalid keyword alias
错误并中止处理。
:),且该冒号不在 term 的第一个或最后一个字符处,
或者如果它在任何位置包含斜杠(/):
true。
invalid IRI mapping
错误并中止处理。
:)也不包含
斜杠(/),
simple term 为 true,
并且如果 definition 的IRI 映射
是一个以gen-delim
字符结尾的IRI,
或者是空白
节点标识符,
则将 definition 中的前缀标志设置为
true。
:)
且该冒号位于第一个字符之后的任何位置:
/):
@type,则将 definition 的IRI 映射
设置为 @type。invalid IRI mapping
错误并中止处理。
@container:
@container 条目关联的值,该值
MUST 是
@graph、
@id、
@index、
@language、
@list、
@set、
@type,
或者是一个数组,
其中只包含这些关键字中的任意一个;
一个数组,
其中包含 @graph 以及
@id 或 @index 之一,并可选地
包含 @set;
或者是一个数组,
其中以任意顺序包含 @set 和
@index、@graph、
@id、@type、
@language 中任意项的组合
。
否则,检测到
invalid container mapping
并中止处理。
@graph、@id 或 @type,或者不是
字符串,
则在处理模式为
json-ld-1.0 时,生成
invalid container mapping
错误并中止处理。
@type:
@id。
@id
也不是 @vocab,
则检测到 invalid type mapping
错误并中止处理。
@index:
json-ld-1.0,或
容器
映射不包含 @index,
则检测到 invalid term definition
并中止处理。
@index 条目关联的值。
如果对该值进行 IRI
展开的结果不是IRI,
则检测到
invalid term definition
并中止处理。
@context:
json-ld-1.0,则检测到
invalid term definition
并中止处理。
@context 条目关联的值,该值被视为局部
上下文。
true 作为 override protected、
remote contexts 的副本,
以及 false 作为 validate scoped context。
如果检测到任何错误,则检测到
invalid scoped context 错误
并中止处理。
@language,且
不包含条目
@type:
@direction,且
不包含条目
@type:
@direction 条目关联的值,该值
MUST 是 null、
"ltr" 或 "rtl"。否则,检测到
invalid base direction
错误并中止处理。
@nest:
json-ld-1.0,则检测到
invalid term definition
并中止处理。
@nest 条目关联的值,该值
MUST 是字符串,并且
MUST NOT 是除
@nest 以外的关键字。否则,检测到
invalid @nest value
错误并中止处理。
@prefix:
json-ld-1.0,或者如果
term 包含冒号(:)或斜杠(/),则检测到
invalid term definition
并中止处理。
@prefix 条目关联的值,该值
MUST 是布尔值。否则,检测到
invalid @prefix value
错误并中止处理。
true,
且其IRI 映射是关键字,
则检测到 invalid term definition
并中止处理。@id、
@reverse、@container、
@context、
@direction、
@index、
@language、
@nest、
@prefix、
@protected
或 @type 之外的任何条目,
则检测到 invalid term definition 错误并
中止处理。
false,
且 previous definition 存在并且受保护:
protected term redefinition 错误,
并中止处理。true。
当有多个术语可被选择 用于压缩一个 IRI 时,必须确保术语 选择既是确定性的,又表示最适合上下文的 选择,同时还要考虑算法复杂度。
为了进行术语 选择,引入了 逆上下文的概念。 逆上下文 本质上是一个反向查找表,它将 容器映射、 类型映射和 语言映射映射到给定 活动上下文中的简单 术语。 只有在 逆上下文用于 压缩时,才需要为 活动上下文 生成它。
要使用逆 上下文,会为与某个 IRI 关联的特定值 收集首选 容器映射列表,以及 类型映射或 语言映射。 然后这些参数 会传给术语选择算法, 该算法将找到最适合 匹配该值的映射的术语。
本节是非规范性的。
要为给定
活动
上下文创建逆
上下文,会访问
活动
上下文中的每个术语,按长度排序,最短者
优先(平局时选择字典序最小的
术语)。对于每个术语,都会为
容器映射和
类型映射
或语言映射
的每一种可能组合,在
逆上下文中添加一个条目,
这些组合能够合法匹配该
术语。非法匹配
包括值的类型映射或
语言映射与该
术语的对应映射之间存在差异。
如果某个术语没有
容器映射、
类型映射或
语言映射(或这些项的某种组合),
则它会在逆上下文中使用特殊
键 @none 拥有一个条目。这允许
术语选择算法在无法为特定
IRI和值组合获得更
具体匹配的术语时,回退到
选择更通用的术语。
虽然规范化语言标签是可选的, 但逆上下文 会基于规范化后的 语言 标签创建条目,从而无论表示形式如何,都可以选择合适的术语。
该算法接受一个必需输入:正在为其创建 逆上下文的 active context。
@none。
如果 active context 有默认语言,
则将 default language 设置为来自
活动
上下文的默认语言,
并规范化为小写。
null,
则术语不能在
压缩期间被选择,
因此继续处理下一个术语。
@none。
如果容器映射非空,则将
container
设置为容器映射的所有值按字典序排列后的连接结果
。
@language,
其值是一个新的空
映射;第二个条目是
@type,
其值是一个新的空映射;
第三个条目是 @any,
其值是一个新的映射,其中
@none 条目被设置为正在
处理的术语。
@type
条目关联的值。
@language
条目关联的值。
@none:
null):
null):
此算法通过 IRI 压缩算法调用, 使用活动上下文的 逆上下文来查找最适合 用于压缩某个 IRI的 术语。还会给出与该 IRI关联的值的其他 信息,包括最适合用于表达该值的 容器 映射 以及类型映射或 语言映射。
本节是非规范性的。
会首先按照首选 容器映射的给定顺序 搜索逆上下文中对应于该 IRI的条目。在具有匹配 容器映射的 术语中, 优先选择具有匹配类型 映射或语言 映射的术语, 而不是没有类型 映射或 语言映射的术语。 如果没有具有匹配术语 的容器 映射,则会选择 没有容器 映射、但匹配给定 类型映射或 语言映射的 术语。如果 仍然没有选中的术语,则在可用时会选择没有 类型映射或 语言映射的 术语。不会选择任何 具有冲突类型 映射或语言 映射的 术语。 具有相同映射的术语之间的 平局会通过先选择最短术语,然后 选择字典序最小的术语来解决。请注意,这些平局会 自动解决,因为它们在先前使用 逆上下文创建算法 创建逆上下文时已经得到解决。
此算法有五个必需输入。它们是: 一个 active context, 一个关键字或 IRI var, 一个数组 containers,表示首选 容器映射的有序列表, 一个字符串 type/language,指示是否 查找具有匹配类型映射 或语言映射的 术语, 以及一个数组,表示 要为类型映射或 语言映射查找的 preferred values有序列表。
null
逆上下文,
则将 active context 中的逆上下文
设置为使用 active context 调用
逆上下文创建算法
的结果。
null。本节是非规范性的。
以下示例旨在说明术语选择算法 对不同术语定义和值的行为。它并不全面,而是 旨在说明算法的不同部分。
如果术语定义具有 "@container": "@language",它只会匹配
没有 @type 的值
对象。
如果术语定义具有数据类型,它只会匹配 具有匹配数据类型的值 对象。
以下章节描述用于展开 JSON-LD 文档、IRI 和值的算法。
此算法展开 JSON-LD 文档,使所有上下文 定义被移除,所有术语和 紧凑 IRI被 展开为 IRI、 空白 节点标识符或 关键字,并且所有 JSON-LD 值都以 数组中的展开形式表示。
本节是非规范性的。
从根 element 开始,我们可以递归处理 JSON-LD 文档,直到得到完全 展开的 result。 在 展开 element 时,我们可以根据其类型以不同方式处理 每一种情况,从而分解问题:
null,则没有需要
展开的内容。最后,在确保 result 位于数组中后, 返回 result。
虽然基于 [RDF11-CONCEPTS] 的 数据模型 不支持多个无序属性值, 但此算法不会移除展开期间在无序数组中可能发现的重复项。 其他算法,例如 § 6.1 压缩算法 和 § 7.1 扁平化算法,会从无序数组中消除 重复值。 本规范的未来版本可能会更新为在数组值形成集合时移除重复的 数组值。
该算法接受四个必需和三个可选输入变量。
必需输入是 active context、
active property、要展开的 element,
以及与原始待展开文档的
关联的
base URL。
可选输入是
documentUrl
标志,它允许用于框架展开的特殊输入形式;
frameExpansion 标志,在注明之处用于按字典序排列
映射条目键;
以及 from map 标志,用于控制是否回退
与非传播上下文关联的
活动
上下文中的先前术语定义。
如果未传入,可选标志均设为 orderedfalse。
该算法还执行特定于展开
JSON-LD
框架的处理步骤。对于框架,@id 和
@type 条目可以接受由
IRI组成的数组或
空映射。值对象的
条目也可以
接受由字符串组成的
数组,或空映射。
成帧还使用额外的关键字条目:
(@explicit、@default、
@embed、@explicit、@omitDefault 或
@requireAll),它们会在展开过程中保留。
当
标志被设置为
frameExpansiontrue 时,会调用
JSON-LD
框架的特殊处理。
如术语 [JSON-LD11]
中所述,
为避免前向兼容性问题,术语不应以
@ 字符开头,因为 JSON-LD 的未来版本可能会引入
额外的关键字。
此算法会像处理任何其他术语一样处理此类术语,即除非它们映射到
IRI,否则会被忽略。
该算法的实现可以考虑提供一个
运行时标志,以便在遇到此类术语时显示警告。
不允许使用空术语(""),
因为并非所有编程语言都能处理空 JSON 键。
该算法的实现可以考虑提供一个
运行时标志,以便在遇到此类术语时显示警告。
使用空白节点 标识符标注属性已经过时, 并可能在 JSON-LD 的未来版本中移除。 该算法的实现可以考虑提供一个 运行时标志,以便在遇到此类术语时显示警告。
null,返回 null。@default,
将 frameExpansion 标志初始化为
false。
null 或 @graph,
通过返回 null 丢弃自由浮动的标量。
frameExpansion
ordered
和 from map 标志。
@list,
并且 expanded item 是
数组,
则将 expanded item 设置为新的
映射,其中包含
@list 条目,
其值为原始的
expanded item。
false,
并且 element 不包含展开为 @value 的
条目,
且 element 也不只由单个展开为 @id 的
条目组成
(其中条目会被
IRI
展开),
则将 active context 设置为 active context 中的
先前上下文,
因为术语作用域上下文的作用域在处理新的
节点对象时不适用。
true 作为 override protected。
@context
条目,则将
active context 设置为
上下文处理算法的结果,
传入 active context、@context
条目的值作为 local
context
以及 base URL。
@type:
@type 的条目的最后一个值的展开结果
(如有),按键的字典序排列条目。
匹配条目的键和值都会被
IRI
展开。
ordered 为 true,则按
key 字典序排列:
@context,继续处理
下一个 key。null,或者它既
不包含冒号(:)也不是关键字,
则通过继续处理下一个 key 来丢弃 key。@reverse,则
检测到
invalid reverse property map
错误,并中止处理。
@included 或 @type
(除非处理
模式是 json-ld-1.0),
则检测到 colliding keywords
错误,并中止处理。
@id:
invalid @id value
错误,并中止处理。
当 frameExpansion
标志被设置时,value
MAY 是空映射,或由一个
或多个字符串组成的
数组。
true 作为 document relative
且使用 false 作为 vocab 对 value
进行
IRI
展开的结果。
当 frameExpansion
标志被设置时,expanded value 将是
由一个或多个值组成的数组,其中字符串
值使用上述 IRI
展开算法展开。
@type:
invalid type value
错误,并中止处理。
当 frameExpansion
标志被设置时,value
MAY 是空映射,或
默认
对象,
其中 @default 的值被限制为
IRI。
所有其他值都表示已检测到
invalid type value
错误,并中止处理。
@default 的值设置
为使用 type-scoped context 作为 active
context
并使用 true 作为 document relative 对
value 进行
IRI
展开的结果。
true 作为 document relative 对其每个值进行
IRI
展开
的结果。
@type 条目,
则将 result 中 @type 的值前置到
expanded value,
如有必要,将其转换为数组。
@graph,则将
expanded value 设置为递归使用此算法的结果,传入
active context、@graph
作为 active property、value 作为 element、
base URL,
以及 frameExpansion
和 ordered 标志,
并确保 expanded value 是由一个或多个映射组成的
数组。
@included:
json-ld-1.0,
继续处理 element 中的下一个 key。null 作为 active property、
value 作为 element、
base URL,
以及 frameExpansion
和 ordered 标志,
并确保结果是数组。
invalid @included value
错误,并中止处理。
@included 条目,
则将 result 中 @included 的值前置到
expanded value。
@value:
@json,
将 expanded value 设置为 value。
如果处理
模式是 json-ld-1.0,
则检测到
invalid value object value
错误,并中止处理。
null,
则检测到
invalid value object value
错误,并中止处理。
当 frameExpansion
标志被设置时,value
MAY 是空映射,或由
标量
值组成的数组。
frameExpansion
标志被设置时,
expanded value 将是由一个或
多个字符串
值组成的
数组,
或是包含空映射的
数组。
null,则将 result 的
@value
条目设置为
null,并继续处理
element 中的下一个 key。在这种情况下需要保留
Null 值,因为 @type
条目的含义取决于
@value 条目是否存在。
@language:
invalid language-tagged string
错误,并中止处理。
当 frameExpansion
标志被设置时,value
MAY 是空映射,或由零个或多个
字符串组成的数组。
frameExpansion
标志被设置时,
expanded value 将是由一个或
多个字符串
值组成的
数组,
或是包含空映射的
数组。
@direction:
json-ld-1.0,
继续处理 element 中的下一个 key。"ltr" 也不是
"rtl",则检测到
invalid base direction
错误,并中止处理。
当 frameExpansion
标志被设置时,value
MAY 是空映射,或由零个或多个
字符串组成的数组。
frameExpansion
标志被设置时,
expanded value 将是由一个或多个
字符串
值组成的
数组,
或是包含空映射的
数组。
@index:
invalid @index value
错误,并中止处理。
@list:
null 或
@graph,继续处理 element 中的下一个 key
以移除自由浮动的列表。
frameExpansion
和 ordered
标志,
并确保结果是数组。
@set,则将
expanded value 设置为递归使用此算法的结果,
传入 active context、
active property、value 作为 element、
base URL,
以及 frameExpansion
和 ordered 标志。
@reverse:
invalid @reverse value
错误,并中止处理。
@reverse 作为 active property、
value 作为 element、
base URL,
以及 frameExpansion
和 ordered
标志。
@reverse 条目,
即属性
被反转了两次,则对其每个
property 和 item 执行以下步骤:
@reverse 之外的条目:
@nest,
将 key 添加到 nests,如有必要将其初始化为空数组。
继续处理 element 中的下一个 key。frameExpansion 标志被设置时,
如果 expanded property 是任何其他
成帧关键字(@default、
@embed、@explicit、@omitDefault 或
@requireAll),
则将 expanded value 设置为递归执行
展开算法的结果,
传入 active context、
active property、value 作为 element、
base URL,
以及 frameExpansion
和 ordered 标志。
null,
expanded property 是 @value,
并且 input type 不是 @json,
否则将 result 的 expanded property
条目设置为
expanded value。
@json 的类型
映射,
则将 expanded value 设置为新的映射,将
@value 条目设置为
value,并将 @type 条目设置为
@json。
@language,并且
value 是映射,则 value
按如下方式从语言映射
展开:
ordered 为
true,则按 language 字典序排列:
null,
继续处理 language value 中的下一个条目。invalid language map value
错误,并中止处理。
@value-item)
和 (@language-language)。
如果 item 既不是
@none,也不是按照
[BCP47]
的
第
2.2.9 节格式良好,
处理器 SHOULD
发出警告。
@none,
或展开为 @none,则从 v 中移除
@language。
null,
则向 v 添加一个
@direction 的条目,
其值为
direction。
@index、
@type 或 @id,并且
value 是映射,则 value
按如下方式从映射展开:
@index。
ordered 为
true,则按 index 字典序排列:
@id 或 @type,
则将 map context 初始化为 active context 中的
先前上下文
(如果存在),
否则将 map context 设置为 active context。
@type,
且 index 在
map context 中的术语
定义具有局部
上下文,则将
map context 更新为
上下文处理
算法的结果,
传入 map context 作为 active context,
index 的局部
上下文的值
作为 local context,
以及 map context 中 index 的术语
定义中的 base URL。
true 作为 from map,
以及 frameExpansion
和 ordered
标志。
@graph,
且 item 不是图
对象,
则将 item 设置为新的映射,
其中包含键值对
@graph-item,
并确保该值使用数组表示。
@index,
index key 不是 @index,
且 expanded index 不是 @none:
invalid value object
错误,并中止处理。@index,
item 没有
@index 条目,
且 expanded index 不是 @none,
则将键值对(@index-index)添加到
item。
@id,
item 没有
@id 条目,
且 expanded index 不是 @none,
则将键值对(@id-expanded
index)添加到 item,
其中 expanded index 被设置为使用
true 作为 document relative
且使用 false 作为 vocab
对 index 进行
IRI
展开的结果。
@type
且 expanded index 不是 @none,
则将 types 初始化为一个新的数组,
由 expanded index 后跟 item 中
@type 的任何现有值组成。
将键值对(@type-types)添加到
item。
frameExpansion
和 ordered 标志。
null,则通过继续处理
element 中的下一个 key 来忽略 key。
@list
且
expanded value 尚不是列表对象,
则将 expanded value 转换为列表对象:
先在其尚不是数组时,将其设置为只包含
expanded value 的数组,
然后将其设置为包含
键值对 @list-expanded value 的映射。
@graph,
且既不包含 @id 也不包含 @index,
则在必要时将 expanded value 转换为数组,
然后将 expanded value 中的每个值 ev 转换为
图
对象:
true 作为 as array。
ordered 为 true,则按字典序排列:
@value,则检测到
invalid @nest value 错误,
并中止处理。
@value
条目:
@direction、
@index、
@language、
@type
和 @value 之外的任何条目。
如果它包含 @language 或 @direction
条目中的任意一个,
则不得包含 @type 条目。
否则,检测到 invalid value object
错误,并中止处理。
@type
条目
是 @json,则 @value
条目可以
包含任意值,并被视为JSON 字面量。
@value 条目的值是
null,或空数组,返回 null。
@value 条目的值
不是字符串,并且
result 包含
@language 条目,
则检测到
invalid language-tagged value
错误(只有字符串
可以带语言标签),并中止处理。
@type 条目,
且其值不是IRI,则检测到
invalid typed value
错误,并中止处理。
@type
条目
且其关联值不是数组,则将其设置为
只包含该关联值的数组。
@set 或 @list 条目:
@index。否则,检测到
invalid set or list object
错误,并中止处理。
@set 条目,则
将 result 设置为该条目的关联值。@language 条目的
映射,则返回
null。
null 或 @graph,
按如下方式丢弃自由浮动值:
在 JSON-LD 文档中,一些键和值可能表示 IRI。本节 定义一种算法,用于将表示 字符串的 IRI 转换为 绝对 IRI 或空白节点标识符。 它还涵盖将关键字别名 转换为关键字。
IRI 展开可能发生在上下文 处理期间,也可能发生在 任何其他 JSON-LD 算法期间。如果 IRI 展开发生在上下文 处理期间,则会将局部上下文及其相关的 defined 映射从上下文处理算法 传递给此算法。这允许通过 创建术语定义算法处理 术语定义 依赖项。
本节是非规范性的。
为了将 value 展开为IRI,我们必须
首先确定它是 null、术语、
关键字别名,
还是某种形式的IRI。根据所发现的内容,
我们处理特定类型的展开;例如,我们将
关键字别名展开为关键字,并根据
活动
上下文中IRI 映射,
将术语
展开为IRI。
在检查 value 时,我们
还可能发现需要创建术语定义
依赖项,因为我们正在上下文处理期间运行此算法。
我们可以通过检查局部
上下文是否为 null,
来判断是否正在上下文处理期间运行。
当 value 是局部上下文中的
条目,
并且 defined 映射
没有针对 value 的条目且其关联值为
true 时,我们知道需要在
活动
上下文中创建术语定义。
defined 映射在
上下文处理期间用于跟踪
哪些术语已经
被定义,或正在
被定义过程中。我们通过使用
创建术语定义算法来创建
术语
定义。
具有关键字形式、
但不是关键字的值(即它们以 "@" 开头)不会
映射到任何值,因为它们保留供将来使用。
该算法返回 null,以便在遇到它们时将其忽略。
该算法接受两个必需输入变量和四个可选输入变量。必需
输入是 active context 和要展开的 value。
可选输入是两个标志:
document relative 和 vocab,它们指定
value 是否可以分别相对于文档的基准
IRI或
活动上下文的
词汇表
映射,
将 value 解释为相对 IRI 引用;
以及一个 local context 和一个映射 defined,供
此算法在上下文处理期间使用。
如果未传入,这两个标志被设置为 false,
local context 和 defined 被初始化为 null。
null,
原样返回 value。"@"1*ALPHA),
处理器 SHOULD 生成警告并返回
null。
null,它包含
键等于 value 的条目,
并且 defined 中 value 对应
条目的值不是
true,
调用创建术语定义算法,
传入 active context、local context、
value 作为 term,以及 defined。这将确保在
上下文处理期间,为
active context 中的 value 创建
术语
定义。
true,并且
active context 对
value 有术语定义,则返回关联的
IRI
映射。
:),
它要么是
IRI,要么是紧凑 IRI,要么是
空白节点
标识符:
:)的位置,将 value 拆分为
prefix 和 suffix。
_),
或 suffix 以前置双斜杠
(//)开头,则原样返回 value,因为它已经是
IRI或空白节点
标识符。
null,它
包含 prefix 条目,且
defined 中 prefix 条目的值
不是 true,则调用
创建术语定义算法,
传入 active context、
local context、prefix 作为 term,
以及 defined。这将确保在
上下文处理期间,为
active context 中的prefix创建
术语
定义。
null 的IRI 映射,
并且该术语定义的
前缀
标志为 true,
则返回与 prefix 关联的
IRI
映射
和 suffix 连接后的结果。
true,并且
active context 有词汇表映射,
返回将该词汇表映射
与 value 连接的结果。
true,
将 value 设置为相对于
active context 中的基准 IRI
解析 value 的结果。仅使用
[RFC3986] 的
第 5.2 节中的基本算法;
不执行
基于语法的规范化或
基于方案的规范化。
按照 [RFC3987] 的
第 6.5 节,
IRI 引用中额外允许的字符
与 URI 引用中非保留字符的处理方式相同。
JSON-LD 中的一些值可以用 紧凑形式表示。在处理 JSON-LD 文档时,有时需要将这些值 展开。 应用此算法后,称一个值处于展开 形式。
本节是非规范性的。
如果活动属性在
活动
上下文中有设置为 @id 或 @vocab 的
类型映射,
且值是字符串,
则返回一个具有单个 @id
条目的映射,
该条目的值是对 value 使用
IRI 展开
算法得到的结果。
否则,结果将是一个包含
@value 条目的映射,
其值是传入的
value。
此外,如果存在与活动属性关联的
类型映射,
则会包含一个 @type 条目;或者如果 value 是
字符串,且存在与
活动
属性关联的语言映射,
则会包含一个 @language 条目。
请注意,被解释为IRI的值分为两类:
一类是 document relative,另一类是
相对于词汇表。属性和
@type 的值,
以及标记为 "@type": "@vocab" 的术语,
都是相对于词汇表的,这意味着它们需要是
已定义的术语、一个紧凑 IRI
(其中前缀是
术语),
或者是一个使用
词汇表映射转换为
IRI的字符串。
该算法接受三个必需输入:active context、 active property,以及要展开的 value。
@id 的类型映射,
且 value 是字符串,
则返回一个新的
映射,其中包含一个
条目,其键为
@id,其值为
使用 true 作为 document relative
且使用 false 作为 vocab 对 value 进行
IRI
展开的结果。
@vocab 的类型映射,
且 value 是字符串,
则返回一个新的
映射,其中包含一个
条目,其键为
@id,其值为
使用 true 作为 document relative 对 value 进行
IRI
展开的结果。
@value 条目的值被设置为
value。
@id、@vocab 或
@none 之外的
类型映射,
则将 @type 添加到
result,并将其值设置为与
类型映射关联的值。
null,
则向 result 添加 @language,其值为 language。null,
则向 result 添加 @direction,其值为 direction。
以下章节描述用于压缩 JSON-LD 文档、IRI 和值的算法。
此算法压缩 JSON-LD 文档,以便应用给定的 上下文。这 必须导致将 任何适用的 IRI 缩短为 术语或 紧凑 IRI,将任何 适用的 关键字缩短为 关键字别名,并将 任何以展开形式表示的适用 JSON-LD 值 转换为简单值,例如 字符串或 数字。
本节是非规范性的。
从根 element 开始,我们可以递归处理 JSON-LD 文档,直到得到完全 压缩的 result。 在 压缩 element 时,我们可以根据其类型以不同方式处理 每一种情况,从而分解问题:
该算法接受三个必需和两个可选输入变量。
必需输入是 active context、
active property
和要压缩的 element。
可选输入是
标志
和 compactArrays 标志,用于在注明之处按字典序排列
映射条目键。
如果未传入,两个标志均设置为 orderedfalse。
compactArrays
和 ordered 标志。
null,则将
它追加到 result。compactArrays 为
false,
或 active property 是 @graph 或
@set,
或 active context 中 active property 的
容器映射包含
@list 或
@set,
返回 result。
@value 条目,
且 element 也不只由单个 @id 条目组成,
则将 active context 设置为来自 active context 的
先前上下文,
因为术语作用域上下文的作用域在处理新的
节点对象时不适用。
@value 或 @id
条目,且使用
值压缩算法的结果
(传入 active context、
active property,以及 element 作为 value)
是标量,
或者 active property 的
术语定义
具有 @json 的类型映射,
则返回该结果。
@list,
则返回递归使用此算法的结果,传入
active context、
active property、element 中
@list 的值作为 element,
以及 compactArrays
和 ordered 标志。
@reverse,
将 inside reverse 初始化为 true,
否则初始化为 false。
@type 条目,
创建一个新数组 compacted types,通过将该
条目中的每个
expanded type
通过对 expanded type 进行 IRI
压缩转换为其压缩形式来初始化。
然后,对于按字典序排列的 compacted types 中的每个 term:
ordered 为 true,则按
expanded property 字典序排列:
@id:
@type:
@type 数组:
json-ld-1.1,且
active context 中 alias 的
容器映射包含 @set,
则将 as array 初始化为 true,
否则初始化为
compactArrays的否定。
@reverse:
@reverse 作为
active property、expanded value
作为 element,
以及 compactArrays
和 ordered 标志。
@preserve
则:
compactArrays
和 ordered 标志。
@preserve 的值添加。
@index,并且
active property 在 active context 中具有
包含
@index 的容器映射,
则压缩结果将位于 @index
容器中,通过继续处理下一个 expanded property 来丢弃
@index 条目。
@direction、
@index、
@language
或 @value:
@nest,
也不是 active context 中展开为 @nest 的
术语,
则检测到 invalid @nest value
错误,并中止处理。
true 作为 as array。
@nest,
也不是 active context 中展开为 @nest 的
术语,
则检测到 invalid @nest value
错误,并中止处理。
@set,
或 item active property 是 @graph 或
@list,
则将 as array 初始化为 true,
否则初始化为
compactArrays的否定。
compactArrays
和 ordered 标志。
如果 expanded item 是列表对象或
图对象,
则分别使用 @list 或
@graph 条目的值作为 element,
而不是 expanded item。
@graph 和
@id:
@graph 和
@index,
并且 expanded item 是简单
图对象:
@graph
且 expanded item 是简单
图对象,
该值不能表示为映射对象。
@graph,
或者不匹配前述任一情况。
@graph 进行
IRI
压缩所得的键,
并使用原始 compacted item 作为值。
@id 条目,
则在 compacted item 中添加一个条目,其键
来自对 @id 进行
IRI
压缩,
其值
使用对
expanded item 中 @id 的值进行
IRI
压缩
并使用 false 作为 vocab。
@index 条目,
则在 compacted item 中添加一个条目,其键
来自对 @index 进行
IRI
压缩,
其值为 expanded
item 中 @index 的值。
@language、
@index、@id
或 @type
且 container 不包含
@graph:
@language、@index、@id 或
@type 之一,
基于 container 的内容初始化 container key。
@index。
@language,且
expanded item 包含
@value 条目,则将
compacted item
设置为与其 @value 条目关联的值。
将 map key 设置为 expanded item 中
@language 的值(如有)。
@index
且 index key 为 @index,
则将 map key 设置为 expanded item 中
@index 的值(如有)。
@index
且 index key 不是 @index:
@id,则将
map key 设置为 compacted item 中
container key 的值,并从
compacted item 中移除 container key。
@type:
@id,则将 compacted item
设置为使用
此算法递归处理的结果,传入
active context、
item active property 作为 active property,
以及由 expanded item 中 @id 的单个
条目
组成的映射
作为 element。
null,
则将其设置为对 @none 进行
IRI
压缩的结果。
此算法将IRI压缩为术语或 紧凑 IRI,或将关键字压缩为 关键字别名。可传入与该 IRI关联的值,以帮助选择最 适合上下文的术语。
本节是非规范性的。
如果传入的IRI是 null,
我们直接返回 null。
否则,如果该IRI或关键字
相对于
活动上下文的词汇表
映射,
我们首先尝试找到一个它可被压缩成的术语。
为了选择最合适的术语,
我们可能必须收集关于传入 value 的信息。
这些信息包括确定用于表达 value 的首选
容器映射、
类型映射或语言映射。
对于JSON-LD 列表,会基于
对列表中所有项都适用的最具体值来选择
类型映射
或语言映射。
收集完这些信息后,
会将其传给术语选择算法,
该算法将返回最合适的术语。
如果没有找到可用于压缩该IRI的
术语,
则尝试使用活动上下文的
词汇表
映射
压缩该IRI,
如果存在这样的映射。
如果该IRI无法被压缩,
则尝试找到一个紧凑 IRI。
只有当术语定义包含值为
true 的前缀标志
时,才会使用术语创建紧凑
IRI。
如果没有合适的紧凑 IRI,
且 compactToRelative 选项为 true,
则使用文档的基准 IRI
将该IRI转换为相对 IRI 引用。
最后,如果该IRI或关键字仍无法被压缩,
则原样返回它。
在考虑语言映射时, 也会考虑方向映射, 无论是否带有 语言映射, 并且语言 映射会被规范化为小写。
在此算法会原样返回输入IRI的情况下, 如果该IRI在 活动上下文中 可能被误认为是紧凑 IRI, 则此算法将抛出错误, 因为它没有办法返回原始IRI的无歧义表示。
此算法接受两个必需输入和三个可选输入。
必需输入是 active context
和要压缩的 var。
可选输入是与 var 关联的 value、
vocab 标志,该标志指定传入的 var
是否应使用活动上下文的
词汇表
映射进行压缩,
以及 reverse 标志,该标志指定是否正在压缩
反向属性。
如果未传入,value 设置为 null,
且 vocab 和 reverse 都设置为 false。
null,返回 null。null
逆上下文,
则将 active context 中的逆上下文
设置为使用 active context 调用
逆上下文创建算法
的结果。
true,并且 var 是
inverse context 的条目:
@preserve 条目的映射,
则使用 @preserve 值中的第一个元素作为 value。
@language,
并将 type/language value 初始化为 @null。这两个
变量将用于跟踪某个术语的首选
类型映射或
语言
映射,
基于与 value 兼容的内容。
@index 条目的
映射,
且 value 不是图对象,
则向 containers 追加值 @index 和 @index@set。
true,将 type/language
设置为 @type,将 type/language value 设置为
@reverse,并将 @set 追加到 containers。
@index 不是 value 中的
条目,
则将 @list 追加到 containers。
@list 条目关联的
数组。
null。如果
list 为空,则将 common language 设置为
default language。
@none,并将
item type 初始化为 @none。
@value 条目:
@id。null,
将 common language 设置为 item language。@value 条目,则将
common language
设置为 @none,因为列表项具有冲突的
语言。
null,
将 common type 设置为 item type。@none,因为列表项具有冲突的
类型。
@none,且
common type 是 @none,则
停止处理列表中的项,因为已经
检测到这些项之间不存在共同的语言或类型。
null,
将 common language 设置为 @none。null,
将 common type 设置为 @none。@none,则将
type/language 设置为 @type,并将
type/language value 设置为 common type。
@index 条目,
则将值 @graph@index 和 @graph@index@set
追加到 containers。@id 条目,
则将值 @graph@id 和 @graph@id@set
追加到 containers。@graph、@graph@set
和 @set
追加到 containers。@index 条目,
则将值 @graph@index 和 @graph@index@set
追加到 containers。@id 条目,
则将值 @graph@id 和 @graph@id@set
追加到 containers。@index 和 @index@set
追加到 containers。@type,
并将 type/language value 设置为 @id。@direction
条目
且不包含 @index 条目,
则将 type/language value 设置为
value 的 @language
条目(如有)
和 value 的 @direction
条目以下划线
("_")分隔并连接后的结果,
并规范化为小写。
将 @language 和 @language@set 追加到
containers。
@language 条目
且不包含 @index 条目,
则将 type/language value 设置为
@language 的值并规范化为小写,
并将 @language
和 @language@set追加到
containers。
@type 条目,则将
type/language value 设置为
其关联值,并将 type/language 设置为
@type。
@type,
并将 type/language value 设置为 @id,
并将 @id、@id@set、
@type 和 @set@type
追加到 containers。
@set 追加到 containers。@none 追加到 containers。这表示
不存在容器映射,并且它将
是最后一个要检查的容器映射值,因为它
最通用。json-ld-1.0,并且 value 不是映射
或不包含 @index 条目,
则将 @index 和 @index@set 追加到 containers。
json-ld-1.0,并且
value 是只包含
@value 条目的映射,
则将 @language 和 @language@set 追加到 containers。
null,
将 type/language value 设置为 @null。
这是在 inverse context entry 中存储
null 值所用的键。
@reverse,将
@reverse 追加到 preferred values。
@id 或 @reverse,并且
value 是包含 @id
条目的
映射:
@none
追加到 preferred values。
如果 value 是列表对象,
且 @list 的值是空 array,
则将 type/language 设置为 @any。
@any 追加到 preferred values。"_")的条目,
则将该条目中从下划线到字符串末尾的子字符串
追加到 preferred values。null,返回 term。true,且
active context 具有词汇表映射:
null。此变量将用于
存储创建的紧凑 IRI(如有)。
null,
其IRI 映射等于
var,
其IRI 映射不是
var 开头的子字符串,
或者 definition 没有值为
true 的前缀标志,
则 definition 的键不能用作前缀。
继续处理下一个 definition。
:)和 var 中位于
definition 的
IRI
映射值之后的子字符串,
初始化 candidate。
null,或者 candidate 更短,或长度相同但字典序小于
compact IRI,
且 candidate 在 active context 中没有
术语
定义;或者如果该
术语
定义具有等于 var 的
IRI
映射
且 value 为 null,
则将 compact IRI
设置为 candidate。
null,返回 compact IRI。
true 的术语匹配,
且 var 没有IRI authority(前面带有
双斜杠(//),
则检测到 IRI confused with prefix
错误,
并中止处理。
false,
则使用active
context 中的基准 IRI(如果存在)
将 var 转换为相对 IRI 引用。展开会在 JSON-LD 中将所有值转换为 展开形式。 此算法执行相反的操作,将 一个值转换为压缩形式。此算法根据给定 活动上下文 中与该值关联的 活动属性相关联的 术语定义 压缩值。
本节是非规范性的。
要压缩的 value 具有 @id 或
@value 条目。
对于前一种情况,如果
活动属性的
类型
映射设置为 @id 或 @vocab,
且 value 只由 @id 条目组成,并且如果
活动属性的
容器映射
包含 @index,则还包含一个 @index
条目,那么
value 可以通过返回使用 IRI
压缩算法
对与 @id 条目关联的值进行压缩所得的结果,
被压缩为字符串。
否则,value 不能被压缩,并按原样返回。
对于后一种情况,可能可以将 value
仅压缩为与 @value 条目关联的值。
如果活动属性具有匹配的
类型映射或语言映射,并且
要么没有 @index 条目,要么
活动属性的
容器映射包含 @index,则可以这样做。也可以在
@value 是 value 中唯一的条目时这样做
(如果活动属性的
容器映射
包含 @index,则可另有一个 @index
条目),并且
其关联值不是字符串、不存在
默认
语言,或者存在针对
活动属性的显式
null 语言
映射。
此算法有三个必需输入:active context、 active property 和要压缩的 value。
null
逆上下文,
则将 active context 中的逆上下文
设置为使用 active context 调用
逆上下文创建算法
的结果。
@id
条目
且除了 @index 之外没有其他
条目:
@type 条目,其
值与 active property 的类型
映射匹配,
则将 result 设置为 value 的 @value 条目
关联的值。@none,
或者 value 具有 @type 条目,
且 value 中 @type 的值与
active property 的类型映射不匹配,
则让 value 保持原样,因为值压缩已禁用。
@value 条目的值不是
字符串:
@language
条目,
其值与 language 精确匹配;
如果它不是 null,则使用不区分大小写的比较;
或者如果 language 是 null,则不存在该条目,
并且 value 具有 @direction
条目,
其值与 direction 精确匹配;
如果它不是 null,则如此;或者如果 direction 是
null,则不存在该条目:
以下章节描述用于扁平化 JSON-LD 文档、 创建节点映射以及生成空白节点的算法。
此算法通过将一个节点的所有 属性收集到单个映射 中,并使用 空白 节点标识符标记所有空白节点, 来扁平化展开后的 JSON-LD 文档。 由此得到的文档统一形状,可能会显著简化 某些应用中处理 JSON-LD 数据所需的代码。
本节是非规范性的。
首先,使用 节点映射生成算法 生成一个 node map, 该算法将一个节点的所有 属性收集到单个 映射中。 在下一步,node map 会被 转换为处于 扁平化文档形式的 JSON-LD 文档。
该算法接受一个必需和一个可选输入变量。
必需输入是要扁平化的 element。
可选输入是
标志,用于在注明之处按字典序排列
映射条目键。
如果未传入,ordered 标志设置为
orderedfalse。
此算法使用 生成空白节点标识符算法 来生成新的空白节点 标识符 并重新标记现有空白节点 标识符。 生成空白节点标识符算法 维护一个 identifier map 以确保源文档中的空白节点标识符 被一致地重新映射为新的空白节点标识符, 从而避免冲突。 因此,在运行此算法之前,会重置 identifier map。
@default,其值为
空映射。@default
条目的值,该值是表示
默认图的
映射。
@default,
如果 ordered 为 true,
则按 graph name 字典序排列,
执行以下步骤:
ordered 为 true),
将 node 添加到 flattened,
除非 node 唯一的条目是
@id。
此算法创建一个映射
node map,其中保存
传入的展开文档中表示的图和节点
的索引表示。所有未由 IRI 唯一标识的
节点都会被分配一个
(新的)空白节点标识符。
生成的 node map 将为文档中的每个图拥有一个
映射条目,其值是另一个对象,该对象为文档中表示的每个
节点拥有一个
条目。
默认图存储在 @default 条目下,所有其他图
存储在其图名下。
本节是非规范性的。
该算法递归遍历一个展开的 JSON-LD 文档,以将一个
节点的所有
条目
收集到单个映射中。该算法更新一个
映射
node map,其键表示文档中使用的
图名
(默认
图存储在 @default 条目下),
其关联值是映射,
这些映射对
图中的
节点建立索引。如果某个
条目的
值是节点
对象,
它会被替换为只包含一个
@id 条目的
节点对象。
如果一个节点对象
没有 @id
条目,或者它
由空白节点
标识符标识,
则会生成一个新的
空白节点标识符。
这种对空白节点
标识符的重新标记
也会用于属性和
@type 的值。
该算法以展开的 JSON-LD 文档 element 和对
一个映射
node map 的引用作为输入。此外它还有可选参数
active graph(默认为 @default)、active subject、
active property,以及对映射 list 的引用。如果
未传入,active subject、active property 和 list
会被设置为 null。
null,则将 node 设置为 null,
否则使用变量 subject node 引用 graph 的
active subject 条目。
@type 条目中的每个
item(如果有),或者如果 @type 的值存在且
不是数组,则对于
@type 的值:
@value 条目,执行以下步骤:
@list 条目,执行
以下步骤:
@id 条目,则将 id
设置为其值,并从 element 中移除该
条目。
如果 id
是空白节点
标识符,则将其替换为一个新
生成的空白节点标识符,
传入 id 作为 identifier。
null 作为 identifier。
@id 组成,其
值为 id。
null,执行以下
步骤:
@type 条目,则将
其关联数组中的每一项追加到
node 的 @type 条目关联的
数组中,
除非它已经在该
数组中。最后
从 element 中移除 @type 条目。
@index 条目,则将
node 的 @index
条目
设置为其值。如果node 已经具有值不同的
@index 条目,则检测到
conflicting indexes
错误并中止处理。否则,继续从 element 中移除
@index 条目。
@reverse 条目:
@id,其
值为 id。
@reverse 条目的值。
@reverse 条目。
@graph 条目,则递归调用此
算法,传入 @graph 条目的值作为 element、
node map,以及 id 作为 active graph,然后移除
element 中的 @graph 条目。
@included 条目,
则递归调用此算法,传入 @included 条目的值作为
element、
node map 和 active graph,
然后从 element 中移除 @included 条目。
此算法使用由节点映射生成算法 创建的 graph map 中包含的所有图,创建一个新的映射, 该映射将主语映射到 节点, 以创建合并后的节点 对象,其中包含 node map 中每个图内为给定 主语定义的信息。
此算法用于生成新的 空白 节点标识符,或者用于 重新标记现有空白节点标识符, 以避免因引入新标识符而发生冲突。
本节是非规范性的。
最简单的情况是,identifier map 中已经存在传入
identifier 对应的
空白节点标识符,
此时直接返回它。否则,会生成一个新的
空白节点标识符。
如果传入的 identifier 不是 null,
则会在 identifier map 中创建一个条目,将
identifier 与该
空白节点
标识符关联起来。
该算法接受单个输入变量 identifier,它可以
是 null。该算法
维护一个 identifier map,用于将现有
空白
节点标识符重新标记为新的
空白节点
标识符,
该映射会在调用算法初始化时重置。
null,且在
identifier map 中有条目,则返回映射后的标识符。
null,则在
identifier map 中为 identifier 创建一个新条目,并将其值
设置为新的空白节点
标识符。
生成新的空白节点
标识符的一种方式是维护一个计数器,
在生成新标识符时递增它,并将其追加到
诸如 _:b 的字符串后。
本节描述将 JSON-LD 文档反序列化为 RDF 数据集以及 反向操作的算法。这些算法为内存中实现而设计, 可随机访问映射元素。
此算法将 JSON-LD 文档反序列化为RDF 数据集。 请注意,RDF 不允许将空白节点用作 属性, 而 JSON-LD 允许。因此,默认情况下, 在将 JSON-LD 解释为 RDF 时,会丢弃那些本来会包含空白节点作为 属性的 三元组。
使用空白节点 标识符标记属性已过时, 并可能在 JSON-LD 的未来版本中移除。
如果 选项不是 rdfDirectionnull,
则会使用特殊处理,从
i18n-datatype 或 compound-literal 形式进行转换。
本节是非规范性的。
JSON-LD 文档会被展开,并使用
节点映射生成算法转换为 node map。
这允许提取并扁平化文档中表示的每个图,
从而更容易处理每个
节点对象。
来自 node map 的每个图都会被处理以提取三元组,
任何(非默认)图名都会应用到这些三元组上,以创建
RDF 数据集。
node map 中的每个
节点对象
都有一个 @id 条目,
它对应于主语,
其他条目
表示谓词。
每个条目值
要么是 IRI、空白节点标识符,
要么可以被转换为RDF
字面量,
以生成三元组。
列表会使用
列表到 RDF 转换算法转换为
RDF 集合。
该算法接受一个映射 node
map,它是
节点映射生成算法的结果,以及一个
RDF
数据集 dataset,新的图和三元组
会被添加到其中。
它还接受两个可选输入变量:
和 produceGeneralizedRdf。
除非 rdfDirection 选项
被设置为 produceGeneralizedRdftrue,否则包含空白节点
谓词的
三元组
会从输出中排除。
使用空白节点
标识符标记属性已过时,
并可能在 JSON-LD 的未来版本中移除,
对广义 RDF
数据集的支持也是如此,
因而 选项也可能
被移除。produceGeneralizedRdf
@default,
则将 triples 初始化为 dataset 的
defaultGraph
属性值。
否则,将 triples 初始化为空
RdfGraph,
并使用 dataset 的
add 方法将其添加到
dataset,同时传入 graph
name 作为
graphName。
@type,则对于
values 中的每个 type,
创建一个新的 RdfTriple,
由 subject、作为
predicate 的
rdf:type,
以及作为 object 的
type 组成,
并使用 triples 的
add 方法
将其添加到 triples,
除非 type 不是格式良好的。
produceGeneralizedRdf
选项不是 true,
则继续处理下一个 property-values 对。
此算法接受一个节点对象、列表对象或
值对象,
并将其转换为一个资源,以用作
三元组的
宾语。
如果传给该算法的是一个包含相对
IRI 引用的
节点对象,
则返回 null,随后会导致所得
三元组被忽略。
如果输入是列表对象,它还会
返回从该输入创建的三元组。
本节是非规范性的。
值对象
会按照
§ 8.6 数据
往返转换
中所述转换为
RDF 字面量,
而节点
对象会转换为
IRI、
空白
节点标识符
或 null。
该算法接受两个参数:item,它 MUST 是 值 对象、列表 对象或节点对象; 以及 list triples,它是一个空数组。
@id 条目的值
不是格式良好的,则返回
null。
@id 条目关联的
IRI或
空白节点
标识符。
@list
条目关联的值,以及
list triples。
@value
条目关联的值。
@type 条目关联的值;如果
item 没有这样的条目,则初始化为
null。
null,
且既不是格式良好的 IRI,
也不是 @json,则返回 null。@language
条目,且该条目不是
格式良好的,则返回
null。
@json,
则使用将 value 的
内部表示转换为 JSON
的结果,将
value 转换为规范词法形式,
并将 datatype 设置为 rdf:JSON。
true 或
false,则将 value 设置为
字符串
true 或 false,这就是
规范词法
形式,如
§ 8.6
数据往返转换
中所述。如果 datatype 是 null,
则将 datatype 设置为 xsd:boolean。
xsd:double,则将 value 转换为
字符串,
其形式为 [XMLSCHEMA11-2]
中定义并在
§ 8.6
数据往返转换中描述的
xsd:double 的
规范
词法形式。
如果 datatype 是 null,
则将 datatype 设置为 xsd:double。
xsd:integer 的
规范
词法形式。
如果 datatype 是 null,
则将 datatype 设置为 xsd:integer。
null,
则根据 item 是否具有 @language
条目,
将 datatype 设置为 xsd:string 或
rdf:langString。
@direction 条目,
且 rdfDirection 不是 null,
则 item 是一个使用特殊规则序列化的
值对象。
@language 的值并规范化为小写,
如果没有这样的条目,则初始化为空字符串("")。
i18n-datatype 或 compound-literal
值时,值会被规范化为小写,以提高互操作性。rdfDirection 是
i18n-datatype,
则将 datatype 设置为把 language
和 item 中 @direction 的值以下划线
("_")分隔并追加到
https://www.w3.org/ns/i18n# 后的结果。
使用 value 和 datatype 将
literal 初始化为
RDF
字面量。
@direction 可以在没有 @language 的情况下使用,
因此可以合法地创建一个数据类型 IRI,
例如 http://w3.org/ns/i18n#_ltr,它并不编码
语言标签。rdfDirection 是
compound-literal:
rdf:value 作为谓词,以及
item 中 @value 的值作为宾语,
创建一个新的三元组,并将其添加到 list triples。
@language 条目,
使用 literal 作为主语、
rdf:language 作为谓词,以及 language
作为宾语,创建一个新的三元组,并将其添加到 list triples。
rdf:direction 作为谓词,以及
item 中 @direction 的值
作为宾语,创建一个新的三元组,并将其添加到 list triples。
@language 条目,
则将与 @language 条目关联的值添加为
literal 的语言标签。
列表转换是取得一个列表对象 并将其转换为 [RDF11-MT] 中 RDF 语义所定义的 RDF 集合 的过程。
本节是非规范性的。
对于列表中的每个元素,
都会分配一个新的
空白节点标识符,
用于生成 rdf:first 和
rdf:rest。该
算法返回列表头,它要么是第一个分配的
空白
节点标识符,要么在
列表为空时为
rdf:nil。如果某个列表元素表示
IRI,
则省略对应的 rdf:first 三元组。
该算法接受两个输入:一个数组 list 和一个空数组 list triples,后者用于返回 生成的三元组。
rdf:nil。null,否则将一个由
subject、rdf:first 和 object 组成的
三元组
追加到 list triples。
rdf:nil。将一个由
subject、
rdf:rest 和 rest 组成的
三元组
追加到 list triples。
rdf:nil。
此算法将由一个默认图 和零个或多个 命名图 组成的RDF 数据集 序列化为 JSON-LD 文档。
在 RDF 抽象语法中,RDF 字面量具有 词法形式,如 [RDF11-CONCEPTS] 中所定义。这些 字面量的形式会在基于这些 字面量创建JSON-LD 值时使用。
本节是非规范性的。
遍历数据集中的每个图,将每个
RDF
集合转换为列表,
并为所有
RDF 字面量、
IRI
和空白节点
标识符生成展开形式的 JSON-LD 文档。
如果 useNativeTypes 标志设置为 true,
具有等于 xsd:integer 或 xsd:double 的
数据类型 IRI
的 RDF 字面量
会被转换为
JSON
数字,而具有等于
xsd:boolean 的
数据类型 IRI
的 RDF 字面量
会根据其
词法形式
被转换为 true 或
false,如
§ 8.6 数据
往返转换中所述。
除非 useRdfType 标志设置为 true,否则只要关联的宾语是
IRI或
空白节点
标识符,rdf:type
谓词就会被序列化为 @type。
如果 选项不是 rdfDirectionnull,
则会使用特殊处理,从 i18n-datatype 或
compound-literal 形式进行转换。
该算法接受一个必需输入和四个可选输入:
一个 RDF
数据集 dataset;
四个可选参数是
标志,默认为
orderedfalse,用于在注明之处按字典序排列
映射条目键,
默认为
rdfDirectionnull,
useNativeTypes 标志,默认为 false,
以及 useRdfType 标志,默认为 false。
dataset 是iterable,用于遍历
图以及
图名,
它们包含在 RdfDataset
中。每个
图也都是
iterable,
用于遍历包含在 RdfGraph
中的
三元组。
@default 组成,其值引用
default graph。
@default,否则初始化为
与 graph 关联的
图名。
@id,
其值为 name。
@id
组成,其值
设置为 subject。rdfDirection 选项
是 compound-literal 且 predicate 是
rdf:direction,
则在 compound map 中为 subject 添加一个条目,其值为
true。
@id
组成,其值
设置为 object。
rdf:type,且
useRdfType 标志不是
true,并且 object
是 IRI或
空白
节点标识符,
则将 object 追加到
node 的 @type
条目的值中;
除非这样的项已经存在。
如果不存在这样的条目,则创建一个,
并将其初始化为只包含
object 的数组。最后,继续处理下一个
三元组。
rdfDirection
和 useNativeTypes。
rdf:nil,它表示
RDF
集合的终止:
false。
node 的值。property 的值。value 的值。@id 的值是 cl:
@id 条目。@value,其值取自 cl node 中的
rdf:value 条目。
@language,其值取自 cl node 中的
rdf:language 条目。
如果该值按照 [BCP47] 的
第
2.2.9 节不是格式良好的,
则检测到
invalid language-tagged string
错误,并中止处理。
@direction,其值取自 cl node 中的
rdf:direction 条目。
如果该值不是 "ltr" 或 "rtl",则检测到
invalid base direction
错误,并中止处理。
rdf:nil 条目,则继续处理
下一个 name-graph object 对,因为该图
不包含任何需要转换的列表。rdf:nil 条目
的值。
usages 条目中的每个项
usage,执行以下步骤:
node 条目的值的值,将
property 初始化为
usage 的 property 条目的值,
并将 head 初始化为
usage 的 value 条目
的值。
rdf:rest,
node 的 @id 条目
的值是空白
节点标识符,
referenced
once 中与 node 的 @id
条目关联的
条目的值是
映射,
node 具有 rdf:first 和
rdf:rest 条目,
它们的值都是由单个元素组成的
数组,
且 node 除了一个可选的 @type
条目外没有其他
条目,而该条目的值是一个
只有一个项且等于
rdf:List 的数组时,
node 表示一个格式良好的列表节点。
执行以下步骤,沿列表向其头部反向遍历:
@id 条目。
@list 条目,并将
其值初始化为 list
数组。
ordered 是 true):
此算法将 RDF 字面量转换为 JSON-LD 值对象, 并将 RDF 空白 节点或 IRI 转换为 JSON-LD 节点对象。
本节是非规范性的。
RDF 字面量 被转换为 值对象, 而 IRI 和 空白 节点标识符被 转换为节点 对象。
数据类型为 rdf:JSON 的字面量
会使用基于 [JSON-LD11] 中
JSON
datatype 所定义词法到值映射的内部表示,
转换为一个值对象,
并使用 @type 为 @json。
当 选项设置为
rdfDirectioni18n-datatype 时,
数据类型以 https://www.w3.org/ns/i18n# 开头的字面量
会通过从数据类型中解码
语言
标签和基准方向,
转换为值对象。
当 选项设置为
rdfDirectioncompound-literal 时,
使用 rdf:direction 的空白节点对象
会通过解码 rdf:value、rdf:language 和
rdf:direction 属性,转换为
值对象。
如果 useNativeTypes 标志设置为 true,
具有等于 xsd:integer 或 xsd:double 的
数据类型 IRI
的 RDF 字面量
会被转换为
JSON
数字,而具有等于
xsd:boolean 的
数据类型 IRI
的 RDF 字面量
会根据其
词法形式
被转换为 true 或
false,如
§ 8.6 数据
往返转换中所述。
该算法接受三个必需输入:
要转换为映射的 value,
,
以及一个标志 rdfDirectionuseNativeTypes。
@id 组成,其值设置为
value。
nulluseNativeTypes 是 true
xsd:string,则将
converted value 设置为
value 的
词法
形式。
xsd:boolean,则如果
value 的
词法
形式
匹配 true,将
converted value 设置为 true;如果匹配
false,则设置为 false。如果都不匹配,
将 type 设置为 xsd:boolean。
xsd:integer 或
xsd:double,且其
词法
形式
按照 [XMLSCHEMA11-2]
是有效的 xsd:integer 或 xsd:double,
则将 converted value
设置为将
词法
形式
转换为 JSON 数字的结果。
json-ld-1.0,
并且 value 是
JSON
字面量,
则将 converted value 设置为
把 value 的词法值
转换为 JSON-LD 内部表示的结果,并将 type 设置为
@json。
如果 value 的词法值不是符合
JSON 语法 [RFC8259]
的有效 JSON,
则检测到
invalid JSON literal
错误,并中止处理。
https://www.w3.org/ns/i18n# 开头,
且 rdfDirection 是
i18n-datatype:
@language,并将其值设置为
value 的
语言标签。
xsd:string。
@value,其值
设置为 converted value。
null,则向
result 添加一个条目 @type,
其值设置为 type。
在将 JSON-LD 反序列化为 RDF时,
JSON 原生数字会根据该
数字是否具有非零
小数部分
(模 1 运算的结果)自动类型强制为 xsd:integer 或
xsd:double,布尔值
true 和 false 会被强制为 xsd:boolean,
而字符串会被
强制为 xsd:string。
JSON、数值或布尔值本身会被转换为
规范词法形式,即
[XMLSCHEMA11-2]
中定义的确定性字符串表示。
整数的规范词法
形式,即没有非零
小数部分
且绝对值小于 1021 的
数字,
或被强制为 xsd:integer 的
数字,
是有限长度的十进制
数字(0-9)序列,可带可选的前导负号;禁止前导
零。在 JavaScript 中,实现者可以使用以下
代码片段将整数转换为
规范词法
形式:
(value).toFixed(0).toString()
double 的规范词法
形式,即
数字
具有非零小数部分或绝对值大于等于
1021,
或被强制为 xsd:double 的
数字,
由尾数后跟字符 E 再后跟指数组成。尾数是
十进制数,指数是整数。指数中禁止前导零和
前置加号(+)。
如果指数为零,则表示为 E0。对于
尾数,禁止前置的可选加号,并且
必须有小数点。禁止前导和尾随零,
但受以下约束:数字表示必须规范化,
使小数点左侧只有一个非零数字,并且
小数点右侧至少有一个数字,除非所表示的值为零。
零的规范表示为 0.0E0。
xsd:double 的值空间由 IEEE
双精度 64 位浮点类型 [IEEE-754-2008] 定义,而
JSON 数字的值空间未
指定;在将 JSON-LD 反序列化为 RDF 时,尾数会舍入到
小数点后 15 位。在 JavaScript 中,实现者
可以使用以下代码片段将 double 转换为
规范词法
形式:
(value).toExponential(15).replace(/(\d)0*e\+?/,'$1E')
布尔值 true 和 false 的
规范词法
形式
是字符串 true 和 false。
规范词法形式对于
JSON 字面量而言,
是将内部表示
按照 [RFC8259]
序列化为 JSON 格式的结果,并符合
[JSON-LD11] 中
rdf:JSON 数据类型
的 value space 描述中的约束。
当 JSON 原生数字被反序列化
为 RDF 时,无法保证无损数据往返转换,因为可能发生舍入
错误。在
将 RDF 序列化为 JSON-LD时,
也可能发生类似的舍入错误。此外,数据类型或词法
表示可能会丢失。例如,值为
2.0 的 xsd:double
在从 RDF 转换到 JSON-LD 再转换回 RDF 时,会得到一个值为
2 的 xsd:integer,
且处于规范词法形式。
需要强调的是,实践中可能不可能无损地
将 xsd:integer 转换为
数字,因为
其值空间不受限制。虽然 JSON 规范 [RFC8259]
也没有限制数字的值空间,
但具体实现通常确实具有有限的值空间。
为确保无损往返转换,
将 RDF 序列化为 JSON-LD 算法
指定了一个 useNativeTypes 标志,用于控制
具有等于 xsd:integer、xsd:double 或
xsd:boolean 的
数据类型
IRI
的 RDF 字面量
是否会转换为其 JSON 原生对应项。如果
useNativeTypes 标志设置为
false,所有字面量都会保留其原始字符串
表示。
某些 JSON 序列化器,例如某些版本中的 PHP 原生实现,
会用反斜杠转义正斜杠字符。例如,值
http://example.com/ 会被序列化为 http:\/\/example.com\/。
这是有问题的,因为其他 JSON 解析器可能无法理解这些转义字符。
在 JSON-LD 中无需用反斜杠转义正斜杠。为帮助
JSON-LD 处理器之间实现互操作性,正斜杠 MUST
NOT 被
反斜杠转义。
此 API 提供了一种清晰的机制,使开发者能够将 JSON-LD 数据转换为多种通常更易于 使用的输出格式。
JSON-LD API 使用 Promises 来表示 各种延迟操作的结果。 Promises 定义于 [ECMASCRIPT]。 规范中的一般用法可见于 [promises-guide]。 只要实现通常使用相同的方法、参数和选项 并返回相同结果,实现 MAY 选择以 适合其原生环境的方式来实现。
接口标记为 [Exposed=JsonLd],
这会创建一个全局接口。
JSON-LD 中使用 WebIDL 虽然适合在浏览器中使用,
但并不限于这种使用方式。
JsonLdProcessor 接口JsonLdProcessor
接口是高级编程
结构,
开发者用它来访问 JSON-LD 转换方法。
需要强调的是,实现不会修改输入参数。
如果检测到错误,Promise 会以带有适当
的 codeJsonLdError 被拒绝,
并且处理会停止。
如果指定了 documentLoader
选项,它会用于解引用远程文档和上下文。
返回的 RemoteDocument
中的
会用作基准 IRI,并且
documentUrl
会被使用,而不是直接查看 HTTP Link Header。为简单起见,本文档中的
算法
均不直接提及这一点。
contextUrl
WebIDL/* * The JsonLd interface is created to expose the JsonLdProcessor interface. */ [Global=JsonLd, Exposed=JsonLd] interfaceJsonLd{}; [Exposed=JsonLd] interfaceJsonLdProcessor{constructor(); static Promise<JsonLdRecord>compact(JsonLdInputinput, optionalJsonLdContextcontext = null, optionalJsonLdOptionsoptions = {}); static Promise<sequence<JsonLdRecord>>expand(JsonLdInputinput, optionalJsonLdOptionsoptions = {}); static Promise<JsonLdRecord>flatten(JsonLdInputinput, optionalJsonLdContextcontext = null, optionalJsonLdOptionsoptions = {}); static Promise<sequence<JsonLdRecord>>fromRdf(RdfDatasetinput, optionalJsonLdOptionsoptions = {}); static Promise<RdfDataset>toRdf(JsonLdInputinput, optionalJsonLdOptionsoptions = {}); };
compact()
按照压缩算法中的步骤, 使用 context 压缩给定的 input:
最终输出是从 compacted output 派生出的
映射。
如果 compacted output 是
数组,它会被包含在一个
(可能有别名的)@graph 条目中,
其值为 compacted output;
否则,compacted output 会用作
映射结果。
如果 context 不是 null,
则向该映射结果添加一个
@context 条目。
Promise
promise 并返回它。
随后延迟执行以下步骤。
RemoteDocument,
则将 remote document 初始化为
input。
LoadDocumentCallback 将其解引用为
remote document,传入
input
作为 url,
并传入
options 中的
extractAllScripts 选项
作为 extractAllScripts。
expand() 方法的结果,
该方法使用 remote document,
或者如果没有 remote document,则使用
input
作为 input,
并使用
options,
其中 ordered 设置为
false,
并且 extractAllScripts 默认为
false。
documentUrl,
否则设置为
options 中的
base 选项。
@context
条目的
映射,
则将 context 设置为该
条目的值,
否则设置为
context。
base 选项(如果已设置);
否则,如果 compactToRelative 选项为 true,
则设置为当前正在处理的文档的 IRI
(如果可用);
否则设置为 null。
null 作为 active property,
expanded input 作为 element,
以及
options 中的
compactArrays
和 ordered
标志。
JsonLdOptions 类型定义了
默认选项值。
expand()
Promise
promise 并返回它。
随后延迟执行以下步骤。
RemoteDocument,
则将 remote document 初始化为
input。
LoadDocumentCallback 将其解引用为
remote document,传入
input
作为 url,
并传入
options 中的
extractAllScripts 选项
作为 extractAllScripts。
document
是字符串,则将其转换为
内部
表示。
如果 document 无法转换为
内部
表示,
则拒绝 promise,并传入
loading document failed 错误。
documentUrl(如果可用);
否则设置为
options 中的
base 选项。
如果已设置,
options 中的
base 选项会覆盖
基准 IRI。
expandContext 选项已设置,
则使用上下文处理算法
更新 active context,
传入 expandContext 作为
local
context,
并传入 active context 中的
原始
基准 URL 作为 base URL。
如果 expandContext 是一个
具有 @context 条目的
映射,
则改为传入该
条目的值作为
local
context。
contextUrl,
则使用上下文处理算法
更新 active context,
传入 contextUrl 作为
local
context,
并传入 contextUrl 作为 base URL。
document,或者如果没有
remote document,则传入
input
作为 element,
null 作为 active property,
如果可用,则将
documentUrl 作为 base URL,
否则将
options 中的
base 选项作为
base URL,
并传入
frameExpansion
和 ordered
标志,这些标志来自
options。
JsonLdOptions 类型定义了
默认选项值。
flatten()
按照扁平化算法中的步骤, 扁平化给定的 input, 并可选地使用提供的 context 压缩它:
Promise
promise 并返回它。
随后延迟执行以下步骤。
RemoteDocument,
则将 remote document 初始化为
input。
LoadDocumentCallback 将其解引用为
remote document,传入
input
作为 url,
并传入
options 中的
extractAllScripts 选项
作为 extractAllScripts。
expand() 方法的结果,
该方法使用 remote document,
或者如果没有 remote document,则使用
input
作为 input,
并使用
options
,其中 ordered 设置为
false。
ordered 标志。
null,则结果不会被压缩,而会保持展开形式。
JsonLdOptions 类型定义了
默认选项值。
fromRdf()
按照将 RDF 序列化为 JSON-LD 算法中的步骤,将给定的 input 转换为JSON-LD 文档,并采用 展开形式:
此接口并未定义从任意输入创建
RdfDataset
的方式,除了 toRdf() 方法之外。
Promise
promise 并返回它。
随后延迟执行以下步骤。
JsonLdOptions 类型定义了
默认选项值。
toRdf()
按照将
JSON-LD 反序列化为 RDF 算法中的步骤,将给定的
input
转换为 RdfDataset:
Promise
promise 并返回它。
随后延迟执行以下步骤。
expand() 方法的结果,
该方法使用
input
和
options
,其中 ordered 设置为
false。
RdfDataset dataset。produceGeneralizedRdf 标志。
JsonLdOptions 类型定义了
默认选项值。
WebIDLtypedef record<USVString, any> JsonLdRecord;
JsonLdRecord 是一个映射的定义,
用于包含任意映射
条目,
这些条目是解析
JSON 对象的结果。
WebIDLtypedef (JsonLdRecordor sequence<JsonLdRecord> or USVString orRemoteDocument)JsonLdInput;
JsonLdInput 接口用于指代
一个输入值,
该值可以是 JsonLdRecord、
JsonLdRecords 的
sequence、
表示
IRI 的
字符串,
该 IRI 可以被解引用以获取有效的 JSON 文档,
或者已经解引用的
RemoteDocument。
当值是 JsonLdRecord 或
JsonLdRecords 的 sequence 时,
这些值会被视为其等价的内部表示值,
其中 JsonLdRecord
等价于一个
映射,
而 JsonLdRecords
的 sequence 等价于一个由
映射组成的
数组。这些
映射条目会被转换为
其在 [INFRA] 中的等价项。
WebIDLtypedef (JsonLdRecordor sequence<(JsonLdRecordor USVString)> or USVString)JsonLdContext;
JsonLdContext 接口用于
指代一个值,
该值可以是 JsonLdRecord、
JsonLdRecords 的
sequence,
或表示
IRI 的
字符串,
该 IRI 可以被解引用以获取有效的 JSON 文档。
当值是 JsonLdRecord 或
JsonLdRecords 的 sequence 时,
这些值会被视为其等价的内部表示值,
其中 JsonLdRecord
等价于一个
映射,
而 JsonLdRecords
的 sequence 等价于一个由
映射组成的
数组。这些
映射条目会被转换为
其在 [INFRA] 中的等价项。
RdfDataset 接口描述对
一个 RDF
数据集
的操作,该数据集由
JsonLdProcessor
接口中的
fromRdf()
和 toRdf()
方法使用。
该接口可用于构造新的 RDF
数据集,
它具有一个可通过
defaultGraph 属性访问的
默认图。
WebIDL[Exposed=JsonLd] interfaceRdfDataset{constructor(); readonly attributeRdfGraphdefaultGraph; voidadd(USVString graphName,RdfGraphgraph); iterable<USVString?,RdfGraph>; };
add()向 RdfDataset
添加一个
RdfGraph
及其关联的图名。
由将 JSON-LD 反序列化为 RDF
算法使用。
graphName MUST 是一个
格式良好的
IRI 或
空白节点
标识符。
RdfDataset 的
RdfGraph。
defaultGraphiterable
null
(用于默认图)、
IRI,
或空白节点标识符,
而 graph 是一个 RdfGraph 实例。
RdfGraph 接口描述对
RDF 图的操作,
该图由
JsonLdProcessor
接口中的
fromRdf()
和 toRdf()
方法使用。
该接口可用于构造新的
RDF 图,
它由零个或多个 RdfTriple
实例组成。
WebIDL[Exposed=JsonLd] interfaceRdfGraph{constructor(); voidadd(RdfTripletriple); iterable<RdfTriple>; };
add()向 RdfGraph 添加一个
RdfTriple。
由将 JSON-LD 反序列化为 RDF
算法使用。
RdfGraph 的
RdfTriple。
iterable
RdfTriple 实例。
注意,在特定 RdfDataset 实例中,
给定的 RdfTriple
实例可能出现在多个图中。RdfTriple 接口描述一个
三元组。
WebIDL[Exposed=JsonLd] interfaceRdfTriple{constructor(); readonly attribute USVStringsubject; readonly attribute USVStringpredicate; readonly attribute (USVString orRdfLiteral)_object; };
subjectpredicateobjectRdfLiteral 接口描述一个
RDF 字面量。
WebIDL[Exposed=JsonLd] interfaceRdfLiteral{constructor(); readonly attribute USVStringvalue; readonly attribute USVStringdatatype; readonly attribute USVString?language; };
valuedatatyperdf:langString,
则 language MUST
被指定。
languagedatatype MUST 为
rdf:langString。
JsonLdOptions
类型用于向
JsonLdProcessor
方法传递各种选项。
WebIDLdictionaryJsonLdOptions{ USVString?base= null; booleancompactArrays= true; booleancompactToRelative= true;LoadDocumentCallback?documentLoader= null; (JsonLdRecord? or USVString)expandContext= null; booleanextractAllScripts= false; booleanframeExpansion= false; booleanordered= false; USVStringprocessingMode= "json-ld-1.1"; booleanproduceGeneralizedRdf= true; USVString?rdfDirection= null; booleanuseNativeTypes= false; booleanuseRdfType= false; };
basecompactArraystrue,JSON-LD 处理器会在
压缩期间将只有一个元素的数组替换为该元素。
如果设置为 false,
所有数组都将保持为数组,即使它们只有一个元素。
compactToRelativebase 选项
或文档位置进行压缩。
documentLoaderLoadDocumentCallback。
如果指定,则用于检索远程文档和上下文;
否则,如果未指定,则使用处理器的内置加载器。expandContextextractAllScriptstrue,
当从 HTML 中提取
JSON-LD script
元素时,
除非目标是特定
片段标识符,
否则会使用数组形式(如有必要)
提取所有遇到的 JSON-LD
script 元素。
frameExpansionorderedtrue,
某些注明的算法处理步骤会按字典序排列。
如果为 false,处理时不考虑顺序。processingModejson-ld-1.0 或 json-ld-1.1,
实现必须产生与本规范中定义的算法完全相同的结果。
如果设置为其他值,
则允许 JSON-LD 处理器扩展或修改本规范中定义的算法,
以启用特定于应用的优化。
此类优化的定义超出本规范范围,
因而未作定义。
因此,不同实现可能实现不同的优化。
开发者不得定义以 json-ld 开头的模式,
因为它们为本规范的未来版本保留。produceGeneralizedRdftrue,JSON-LD 处理器可以为
三元组的
谓词
发出空白节点;
否则它们将被省略。
广义 RDF
数据集
定义于 [RDF11-CONCEPTS]。
rdfDirectioni18n-datatype,则使用基于
https://www.w3.org/ns/i18n# 的数据类型
IRI
生成 RDF
字面量,
其中同时编码语言标签(如果存在)
和基准方向。
从 RDF 转换时,会解码此数据类型以创建包含
@language(如果存在)和 @direction 的
值对象。
compound-literal,则发出一个
空白节点,
而不是字面量;
其中该空白节点是 rdf:value、rdf:direction
和 rdf:language(如果存在)属性的主语。
从 RDF 转换时,会解码此对象以创建包含
@language(如果存在)和 @direction 的
值对象。
useNativeTypes@type 的需要。useRdfTyperdf:type 属性在输出中保留为
IRI,而不是使用
@type。
API 实现的用户可以利用回调来控制 如何检索远程文档和上下文。 本节详细说明该回调的参数 以及用于返回已检索上下文的数据结构。
LoadDocumentCallback
定义了自定义文档加载器
必须实现的回调,以用于检索远程文档和上下文。
该回调返回一个解析为
RemoteDocument 的
Promise。
失败时,该
Promise 会以带有适当错误
code 的
JsonLdError
被拒绝。
WebIDLcallbackLoadDocumentCallback= Promise<RemoteDocument> ( USVString url, optionalLoadDocumentOptions? options );
以下算法描述默认回调,并对回调实现提出要求。
Promise
promise 并返回它。
随后延迟执行以下步骤。
application/ld+json,
其次是 application/json。
如果设置了 requestProfile,
它 MUST 作为
application/ld+json 上的 profile 添加。
处理器 MAY 包含其他使用
+json 后缀的媒体类型,如 [RFC6839] 中定义。
303 “See Other” 重定向,
如 [cooluris] 中所讨论)。application/json,
也不是 [RFC6839] 中定义的任何带
+json 后缀的媒体类型,
并且响应具有使用
alternate 链接关系且类型为 application/ld+json 的
HTTP Link Header [RFC8288],
则将 url 设置为关联的 href(相对于先前的 url),
并从步骤 2重新开始算法。
application/json
或 [RFC6839] 中定义的任何带
+json 后缀的媒体类型,
但不包括 application/ld+json,
并且响应具有使用
http://www.w3.org/ns/json-ld#context 链接关系的
HTTP Link Header [RFC8288],
则将 contextUrl 设置为关联的 href。
如果发现多个使用 http://www.w3.org/ns/json-ld#context
链接关系的 HTTP Link Header,
则以 JsonLdError 拒绝 promise,
其 设置为
codemultiple context link headers,
并终止处理。
处理器 MAY 将 document 转换为 内部 表示。
对于以
application/ld+json、
text/html 或 application/xhtml+xml 提供的文档,
HTTP Link Header 会被忽略。
application/json,
也不是 application/ld+json,
也不是 [RFC6839] 中定义的任何其他使用
+json 后缀的媒体类型。
拒绝 promise,并传入
loading document failed 错误。
documentUrl,
document 作为
document,
返回的Content-Type(不含参数)
作为 contentType,
任何返回的 profile 参数或 null 作为
profile,
并以 contextUrl 或 null 作为
contextUrl,
创建一个新的 RemoteDocument remote document。
通过
documentLoader 选项设置的自定义
LoadDocumentCallback
可能用于维护众所周知上下文文档的本地缓存,或实现
特定于应用的 URL 协议。
LoadDocumentOptions 类型
用于向
LoadDocumentCallback 传递各种选项。
WebIDLdictionaryLoadDocumentOptions{ booleanextractAllScripts= false; USVStringprofile= null; (USVString or sequence<USVString>)requestProfile= null; };
extractAllScriptstrue,
当从 HTML 中提取
JSON-LD script
元素时,
除非目标是特定
片段
标识符,
否则会使用数组形式(如有必要)
提取所有遇到的 JSON-LD
script 元素。
profilecontentType 为 text/html
或 application/xhtml+xml 时,
此选项确定用于选择
JSON-LD script
元素的 profile。
requestProfileprofile 参数。
(参见 [JSON-LD11] 中的
IANA 注意事项。)
RemoteDocument 类型由
LoadDocumentCallback
用于返回有关远程文档或上下文的信息。
WebIDL[Exposed=JsonLd] interfaceRemoteDocument{constructor(); readonly attribute USVStringcontentType; readonly attribute USVStringcontextUrl; attribute anydocument; readonly attribute USVStringdocumentUrl; readonly attribute USVStringprofile; };
contentTypecontextUrlhttp://www.w3.org/ns/json-ld#context 链接关系的
HTTP Link Header [RFC8288] 的值。
如果响应的
Content-Type 是
application/ld+json,
则忽略 HTTP Link Header。
如果发现多个使用 http://www.w3.org/ns/json-ld#context 链接
关系的 HTTP Link Header,
则 LoadDocumentCallback 的
Promise 会以
JsonLdError
被拒绝,
其 code 设置为
multiple context link headers。
documentdocumentUrlprofilecontentType 的一部分检索到的任何
profile 参数的值。
本节描述在支持 HTML script 提取的
documentLoader 中可用的可选特性。
documentLoader 的实现 MAY
支持从 HTML [HTML] 文档中包含的
script 元素
提取 JSON-LD。
本节描述此类处理器的规范行为。
这样的处理器支持 HTML script
提取。
本节描述对
LoadDocumentCallback 中指定的算法的扩展,
以支持从 HTML 中提取 JSON-LD。
步骤 2 更新为添加以下内容:支持
HTML
script 提取的处理器 MUST 在任何偏好级别包含
text/html,
并且 MAY 在任何偏好级别包含
application/xhtml+xml,
除非 requestProfile 是
http://www.w3.org/ns/json-ld#context。
在步骤 5之后,添加以下处理步骤:
否则,如果所检索资源的
Content-Type 是
text/html
或 application/xhtml+xml:
如果未找到这样的元素,
或找到的元素不是
JSON-LD
script 元素,
则以 JsonLdError 拒绝 promise,
其 设置为
codeloading document failed,
并终止处理。
profile
选项,
则将 source 设置为转换
document 中第一个
script
元素的
textContent 的结果,
该元素具有
application/ld+json 的
type
属性,
并带有 profile 选项的值(如果找到)。
extractAllScripts 选项不存在或为
false,
则将 source 设置为 document 中第一个
JSON-LD script
元素的
textContent。
如果未找到这样的元素,
或找到的元素不是
JSON-LD
script 元素,
则以 JsonLdError 拒绝 promise,
其 设置为
codeloading document failed,
并终止处理。
JsonLdError 拒绝 promise,
其 code 从结果设置,
并终止处理。
extractAllScripts 选项不存在或为
false,
则以 JsonLdError 拒绝 promise,
其 code 设置为
loading document failed,
并终止处理。
extractAllScripts 选项为 true。
将 document 设置为新的空
数组。
对于 input 中的每个
JSON-LD
script 元素:
JsonLdError 拒绝
promise,其 code 从结果设置,
并终止处理。
该算法将
JSON-LD script
元素的文本内容提取为
映射或由
映射组成的
数组。
JSON-LD script 元素是 HTML
[HTML] 文档中的
script
元素,
其 type 属性
设置为
application/ld+json。
该算法接受一个必需输入变量:source, 即 HTML script 元素的 textContent。
invalid script element,并中止处理。
本节描述 JSON-LD API 中用于错误处理的数据类型定义。
JsonLdError 类型用于报告
处理错误。
WebIDLdictionaryJsonLdError{JsonLdErrorCodecode; USVString?message= null; };
codemessageJsonLdErrorCode 表示有效
JSON-LD 错误代码的集合。
WebIDLenumJsonLdErrorCode{ "colliding keywords", "conflicting indexes", "context overflow", "cyclic IRI mapping", "invalid @id value", "invalid @import value", "invalid @included value", "invalid @index value", "invalid @nest value", "invalid @prefix value", "invalid @propagate value", "invalid @protected value", "invalid @reverse value", "invalid @version value", "invalid base direction", "invalid base IRI", "invalid container mapping", "invalid context entry", "invalid context nullification", "invalid default language", "invalid IRI mapping", "invalid JSON literal", "invalid keyword alias", "invalid language map value", "invalid language mapping", "invalid language-tagged string", "invalid language-tagged value", "invalid local context", "invalid remote context", "invalid reverse property map", "invalid reverse property value", "invalid reverse property", "invalid scoped context", "invalid script element", "invalid set or list object", "invalid term definition", "invalid type mapping", "invalid type value", "invalid typed value", "invalid value object value", "invalid value object", "invalid vocab mapping", "IRI confused with prefix", "keyword redefinition", "loading document failed", "loading remote context failed", "multiple context link headers", "processing mode conflict", "protected term redefinition" };
colliding keywordsconflicting indexescontext overflow@context URL 的最大数量。cyclic IRI mapping
invalid @id value@id
条目,其值不是
字符串。
invalid @import value@import 的无效值。invalid @included valueinvalid @index value@index
条目,其值不是
字符串。
invalid @nest value@nest 的无效值。invalid @prefix value@prefix 的无效值。invalid @propagate value@propagate 的无效值。invalid @protected value@protected 的无效值。invalid @reverse value@reverse
条目的无效值,
即该值不是映射。
invalid @version value@version
条目在一个
上下文
中使用了超出范围的值。
invalid base direction@direction 的值不是 "ltr"、
"rtl"
或 null,因此无效。
invalid base IRI
null。
invalid container mapping@container
条目,
其值不是以下
字符串之一:
@list、
@set、
@language、
@index、
@id、
@graph,或
@type。
invalid context entryinvalid context nullificationinvalid default languagenull,因此无效。
invalid IRI mapping
invalid JSON literalinvalid keyword aliasinvalid language map valueinvalid language mapping@language
条目,
其值既不是
字符串
也不是 null,因此无效。
invalid language-tagged stringinvalid language-tagged valuetrue 或 false。
invalid local contextinvalid remote contextinvalid reverse propertyinvalid reverse property map@context 外,反向属性映射中不允许出现
关键字。
invalid reverse property valueinvalid scoped contextinvalid script elementinvalid set or list objectinvalid term definitioninvalid type mapping@type
条目,
其值无法展开为
IRI。
invalid type value@type
条目的无效值,
即该值既不是
字符串,也不是由
字符串组成的
数组。
invalid typed valueinvalid value objectinvalid value object value@value
条目的无效值,
即它既不是
标量,也不是
null。
invalid vocab mappingnull。
IRI confused with prefix
keyword redefinitionloading document failedloading remote context failedmultiple context link headershttp://www.w3.org/ns/json-ld#context 链接关系的
HTTP Link Header [RFC8288]。processing mode conflictprotected term redefinition本节是非规范性的。
WebIDL/* * The JsonLd interface is created to expose the JsonLdProcessor interface. */ [Global=JsonLd, Exposed=JsonLd] interfaceJsonLd{}; [Exposed=JsonLd] interfaceJsonLdProcessor{constructor(); static Promise<JsonLdRecord>compact(JsonLdInputinput, optionalJsonLdContextcontext = null, optionalJsonLdOptionsoptions = {}); static Promise<sequence<JsonLdRecord>>expand(JsonLdInputinput, optionalJsonLdOptionsoptions = {}); static Promise<JsonLdRecord>flatten(JsonLdInputinput, optionalJsonLdContextcontext = null, optionalJsonLdOptionsoptions = {}); static Promise<sequence<JsonLdRecord>>fromRdf(RdfDatasetinput, optionalJsonLdOptionsoptions = {}); static Promise<RdfDataset>toRdf(JsonLdInputinput, optionalJsonLdOptionsoptions = {}); }; typedef record<USVString, any>JsonLdRecord; typedef (JsonLdRecordor sequence<JsonLdRecord> or USVString orRemoteDocument)JsonLdInput; typedef (JsonLdRecordor sequence<(JsonLdRecordor USVString)> or USVString)JsonLdContext; [Exposed=JsonLd] interfaceRdfDataset{constructor(); readonly attributeRdfGraphdefaultGraph; voidadd(USVString graphName,RdfGraphgraph); iterable<USVString?,RdfGraph>; }; [Exposed=JsonLd] interfaceRdfGraph{constructor(); voidadd(RdfTripletriple); iterable<RdfTriple>; }; [Exposed=JsonLd] interfaceRdfTriple{constructor(); readonly attribute USVStringsubject; readonly attribute USVStringpredicate; readonly attribute (USVString orRdfLiteral)_object; }; [Exposed=JsonLd] interfaceRdfLiteral{constructor(); readonly attribute USVStringvalue; readonly attribute USVStringdatatype; readonly attribute USVString?language; }; dictionaryJsonLdOptions{ USVString?base= null; booleancompactArrays= true; booleancompactToRelative= true;LoadDocumentCallback?documentLoader= null; (JsonLdRecord? or USVString)expandContext= null; booleanextractAllScripts= false; booleanframeExpansion= false; booleanordered= false; USVStringprocessingMode= "json-ld-1.1"; booleanproduceGeneralizedRdf= true; USVString?rdfDirection= null; booleanuseNativeTypes= false; booleanuseRdfType= false; }; callbackLoadDocumentCallback= Promise<RemoteDocument> ( USVString url, optionalLoadDocumentOptions? options ); dictionaryLoadDocumentOptions{ booleanextractAllScripts= false; USVStringprofile= null; (USVString or sequence<USVString>)requestProfile= null; }; [Exposed=JsonLd] interfaceRemoteDocument{constructor(); readonly attribute USVStringcontentType; readonly attribute USVStringcontextUrl; attribute anydocument; readonly attribute USVStringdocumentUrl; readonly attribute USVStringprofile; }; dictionaryJsonLdError{JsonLdErrorCodecode; USVString?message= null; }; enumJsonLdErrorCode{ "colliding keywords", "conflicting indexes", "context overflow", "cyclic IRI mapping", "invalid @id value", "invalid @import value", "invalid @included value", "invalid @index value", "invalid @nest value", "invalid @prefix value", "invalid @propagate value", "invalid @protected value", "invalid @reverse value", "invalid @version value", "invalid base direction", "invalid base IRI", "invalid container mapping", "invalid context entry", "invalid context nullification", "invalid default language", "invalid IRI mapping", "invalid JSON literal", "invalid keyword alias", "invalid language map value", "invalid language mapping", "invalid language-tagged string", "invalid language-tagged value", "invalid local context", "invalid remote context", "invalid reverse property map", "invalid reverse property value", "invalid reverse property", "invalid scoped context", "invalid script element", "invalid set or list object", "invalid term definition", "invalid type mapping", "invalid type value", "invalid typed value", "invalid value object value", "invalid value object", "invalid vocab mapping", "IRI confused with prefix", "keyword redefinition", "loading document failed", "loading remote context failed", "multiple context link headers", "processing mode conflict", "protected term redefinition" };
本节是非规范性的。
以下是在发布时仍处于开放状态的议题列表。
更紧凑的 @prefix。
Expansion 概念 “key's term definition” 对紧凑 IRI 键而言不清楚。
与 RDF/JS Dataset 接口的关系。
Expansion 未考虑嵌套属性的属性作用域上下文。
递归嵌套属性与压缩。
相对 iri 压缩。
本节是非规范性的。
frameExpansion 标志,以启用与 JSON-LD
框架关联的内容,否则这些内容可能不是有效的
JSON-LD 文档。
@context 条目,
该条目定义一个上下文,用于
由这样的术语标识的
属性
的值。此上下文同时用于展开算法和
压缩算法。
@nest 条目,
该条目标识一个展开为
@nest 的术语,用于包含使用相同
@nest 映射的属性。展开时,展开为
@nest 的条目的值
会被视为直接包含在外围
节点对象中。
@container 值现在可以
包含 @id 和 @type,分别对应
id 映射和
类型映射。
@none 值,但
JSON-LD 1.0 只允许
字符串值。现在已更新为允许(并忽略)
@none 值。
@container 的值也可以是一个
数组,其中包含任何适当的容器
关键字以及 @set(但不包括 @list)。
这提供了一种方式,以确保这样的
条目值始终
以数组形式表达。
compactToRelative 选项的支持,以允许禁用
IRI 压缩(§ 6.2 IRI 压缩)
为相对于文档的 IRI。
true 的
@prefix 条目时,
terms 才会在压缩时用作
紧凑 IRI 前缀。1.0
算法已更新为只考虑映射到以 URI
gen-delim 字符结尾的值的术语。
@container 包含 @graph,
以及 @id、@index 和 @set。
在展开算法中,这用于
从节点对象,或
id 映射或
索引映射中的
条目值对象创建
命名图。
压缩算法允许
将特定形式的图对象压缩回一组
节点对象,
或节点
对象的映射。
@none 关键字(或其别名),处理没有自然索引的映射值。
展开算法会透明地移除此索引。
此外,参见 § D. 自 JSON-LD 社区组最终报告以来的变更。
本节是非规范性的。
ordered
选项,默认为 false。它用于算法中控制
映射
条目键的迭代。先前,
算法总是要求这样的顺序。用于评估测试结果的说明也已相应更新。
@type 的值或 @type 的别名现在可以将其
@container 设置为 @set,
以确保 @type 条目始终表示为数组。这
也允许为 @type 定义术语,其中值 MUST 是一个
映射,
且 @container 设置为 @set。
:),但
prefix 不是一个
术语,则只有当
value 具有
形式为
IRI 时才返回 value,
否则继续执行算法的其余部分。
produceGeneralizedRdf 选项
也可能被移除。text/html 作为输入,
提取特定目标的
script 元素、
找到的第一个 JSON-LD
script 元素,
或所有 JSON-LD script
元素。
RemoteDocument
添加了 contentType 字段。
context overflow 错误。
"@type": "@none" 的支持,以防止值压缩。
RemoteDocument
处理整合到
LoadDocumentCallback
中,包括 HTML 处理的各种变体。
@propagate 在
局部上下文中控制这一点。
@import
条目,用于在上下文中引用远程上下文,
从而允许向最初为 JSON-LD 1.0 编写的上下文添加
JSON-LD 1.1 特性。
@type 不会发出
colliding keywords 错误;
相反,在展开时,@type 的先前值会被前置到任何新值之前。
@vocab 的可能值。
当设置此值时,相对于词汇表的
IRI 引用,例如
节点对象的
条目,
会相对于
基准 IRI和
词汇表映射通过字符串
拼接进行展开或压缩。
LoadDocumentCallback 中,如果检索到的内容不是任何 JSON
媒体类型,
并且存在带有 rel=alternate 和 type=application/ld+json 的 link header,
则重定向到该内容。@direction 设置字符串的
基准方向。
json-ld-1.1,除非明确设置为
json-ld-1.0。
"@"1*ALPHA)的术语和 IRI。本节是非规范性的。
所有变更都是编辑性的,不影响 API 的可观察行为, 也不影响预期的测试结果。
profile API 选项的一种用法中,
添加 application/xhtml+xml 作为允许的媒体类型。
i18n 数据类型或 rdf:CompoundLiteral 时,
语言标签会
被规范化为小写,以改进实现之间的互操作性。
JsonLdProcessor 处理步骤中。
JsonLdOption 初始化器,其中默认值为
null。
将 processingMode 的默认值设置为 json-ld-1.1。
rdf:JSON 字面量的规范性文本,并引用语法文档中的
rdf:JSON 数据类型,
用于JSON 字面量在
§ 8.6 数据
来回转换中的转换。
RemoteDocument 作为直接输入使用,
这解决了一个
Promise
边界问题。
本节是非规范性的。
所有变更都是编辑性的,不影响 API 的可观察行为, 也不影响预期的测试结果。
@protected 的任何布尔值,而不仅是 true。
@index 条目的值使用 @index。
null,因为
包含块
不定义与引用节点的关系。
true,从而正确管理
活动上下文的还原。
false。
@set。
@type,留给下一步骤处理。
这可能导致节点中的类型值在合并中被遗漏。
false 值使用它。
invalid container mapping 的描述中添加了缺失的
@container 值。
preserve 关键字,该关键字仅用于框架处理。
本节是非规范性的。
[Exposed=(Window,Worker)] 更改为 [Exposed=JsonLd],
它被声明为全局接口,以暴露
JsonLdProcessor 接口,
用于非浏览器环境,以回应审查建议。
本节是非规范性的。
编辑们特别感谢以下个人对本规范的撰写和编辑作出了重要贡献:
此外,以下人员在发布时是工作组成员:
还要衷心感谢 JSON-LD 社区组的参与者, 他们通过邮件列表和每周电话会议解决了许多技术问题:Chris Webber、David Wood、Drummond Reed、Eleanor Joslin、Fabien Gandon、Herm Fisher、Jamie Pitts、Kim Hamilton Duffy、Niklas Lindström、Paolo Ciccarese、Paul Frazze、Paul Warren、Reto Gmür、Rob Trainer、Ted Thibodeau Jr. 和 Victor Charpenay。