JSON-LD 1.1 処理アルゴリズムおよび API

W3C 勧告

このバージョン:
https://www.w3.org/TR/2020/REC-json-ld11-api-20200716/
最新の公開バージョン:
https://www.w3.org/TR/json-ld11-api/
最新の編集者草案:
https://w3c.github.io/json-ld-api/
テストスイート:
https://w3c.github.io/json-ld-api/tests/
実装報告:
https://w3c.github.io/json-ld-api/reports/
以前のバージョン:
https://www.w3.org/TR/2020/PR-json-ld11-api-20200507/
以前の勧告:
https://www.w3.org/TR/2014/REC-json-ld-api-20140116/
編集者:
Gregg Kellogg (v1.0 および v1.1)
Dave Longley (Digital Bazaar) (v1.1)
Pierre-Antoine Champin (LIRIS - Université de Lyon) (v1.1)
旧編集者:
Markus Lanthaler (Google) (v1.0)
Manu Sporny (Digital Bazaar) (v1.0)
著者:
Dave Longley (Digital Bazaar) (v1.0 および v1.1)
Gregg Kellogg (v1.0 および v1.1)
Markus Lanthaler (Google) (v1.0)
Manu Sporny (Digital Bazaar) (v1.0)
Niklas Lindström (v1.0)
参加:
GitHub w3c/json-ld-api
バグを報告
コミット履歴
プルリクエスト

公開以降に報告されたエラーまたは問題については、 正誤表を確認してください。

以下も参照してください: 翻訳

この文書は、次の非規範的な形式でも入手できます: EPUB


概要

この仕様は、JSON-LD 文書をプログラムによって変換するための 一連のアルゴリズムを定義します。定義された変換に従ってデータを再構成することで、 その利用がしばしば劇的に簡素化されます。さらに、この文書は、 指定されたアルゴリズムを実装する開発者向けに、 アプリケーション・プログラミング・インターフェイス(API)を提案します。

この仕様は、 JSON-LD 1.0 処理アルゴリズムおよび API [JSON-LD10-API] で定義された機能の上位集合を記述し、 特記されている場合を除き、 この仕様で記述されるアルゴリズムは、 JSON-LD 1.0 [JSON-LD10] を使用して作成された文書と完全に互換性があります。

この文書のステータス

この節は、この文書の公開時点におけるステータスを説明します。 他の文書がこの文書に取って代わる可能性があります。現在の W3C 公開文書の一覧およびこの技術報告書の 最新改訂版は、 https://www.w3.org/TR/ にある W3C 技術報告書 索引で確認できます。

この文書は、 JSON-LD Working Group によって開発され、JSON-LD Community GroupFinal Report から派生したものです。

この文書で説明される機能を実演できる ライブ JSON-LD プレイグラウンドがあります。

この仕様は、JSON-LD 1.0 処理アルゴリズムおよび API [JSON-LD10-API] 仕様を 置き換えることを意図しています。

この文書は、JSON-LD Working Group によって 勧告として公開されました。

この仕様に関する議論には、 GitHub Issues が推奨されます。 または、メーリングリストにコメントを送信することもできます。 コメントは public-json-ld-wg@w3.org (アーカイブ) 宛に送信してください。

Working Group の 実装報告を参照してください。

この文書は、W3C メンバー、ソフトウェア開発者、 および他の W3C グループや関心のある関係者によってレビューされ、 Director によって W3C 勧告として承認されています。 これは安定した文書であり、参照資料として使用したり、他の文書から引用したりできます。 勧告を作成することにおける W3C の役割は、 仕様に注意を喚起し、その広範な展開を促進することです。これにより、Web の機能性と 相互運用性が向上します。

この文書は、 W3C 特許方針の下で運営されるグループによって作成されました。 W3C は、 グループの成果物に関連して行われた 特許開示の公開一覧を 維持しています。そのページには、特許を開示するための手順も含まれています。 ある個人が、その個人の考えるところによれば Essential Claim(s) を含む特許について実際の知識を有している場合、 W3C 特許方針の第 6 節に従って その情報を開示しなければなりません。

この文書は、 2019年3月1日版 W3C プロセス文書に準拠します。

文書セット

この文書は、JSON-LD Working Group によって作成された 3 つの JSON-LD 1.1 勧告の 1 つです:

1. はじめに

この節は非規範的です。

この文書は、JSON-LD 処理アルゴリズムの詳細な仕様です。 この文書は主に、次の読者を対象としています:

この仕様の基礎を理解するには、まず JSON に精通している必要があります。これは [RFC8259] で詳述されています。また、 JSON-LD 1.1 Syntax specification [JSON-LD11] で定義される JSON-LD 構文も理解している必要があります。これは、この文書のすべてのアルゴリズムで使用される 基本構文です。API と、それがプログラミング環境でどのように動作することを意図しているかを理解するには、 JavaScript プログラミング言語 [ECMASCRIPT] および WebIDL [WEBIDL] についての実用的な知識があると役立ちます。JSON-LD が RDF にどのように対応するかを理解するには、 基本的な RDF の概念 [RDF11-CONCEPTS] に精通していると役立ちます。

1.1 この文書の読み方

この節は非規範的です。

この文書は、JSON における Linked Data のシリアライズに関する詳細な仕様です。 この文書は主に、次の読者を対象としています:

関連文書である JSON-LD 1.1 仕様 [JSON-LD11] は、JSON-LD 文書の文法を規定します。

この仕様の基礎を理解するには、まず JSON に精通している必要があります。これは [RFC8259] で詳述されています。

この文書では、JSON-LD 1.0 版以降の変更を強調表示できます。 変更を するには選択してください。

1.2 貢献

この節は非規範的です。

この仕様の開発に参加する方法はいくつかあります:

1.3 表記上の規約

この節は非規範的です。

この仕様では、次の表記上の規約を使用します:

markup
マークアップ(要素、属性、プロパティ)、 機械処理可能な値(文字列、文字、メディアタイプ)、 プロパティ名、 またはファイル名は赤橙色の等幅フォントで示されます。
variable
疑似コードまたはアルゴリズム記述内の変数はイタリックで示されます。
定義
この仕様または他の仕様の別の箇所で使用される用語の定義は、 太字かつイタリックで示されます。
定義参照
この文書内の定義への参照は 下線付きで示され、定義自体へのアクティブリンクにもなります。
マークアップ定義参照
この文書内の定義への参照で、 その参照自体もマークアップであるものは、下線付き、 赤橙色の等幅フォントで示され、定義自体へのアクティブリンクにもなります。
外部定義参照
別の文書内の定義への参照は 下線付き、イタリックで示され、定義自体へのアクティブリンクにもなります。
マークアップ外部定義参照
別の文書内の定義への参照で、 その参照自体もマークアップであるものは、 下線付き、イタリックの赤橙色等幅フォントで示され、 定義自体へのアクティブリンクにもなります。
ハイパーリンク
ハイパーリンクは下線付きで青色です。
[参照]
文書参照(規範的または参考情報)は角括弧で囲まれ、 参考文献の節へリンクします。
勧告からの変更
以前の勧告から変更された節または句は、 § 1.1 この文書の読み方のコントロールを使用して 強調表示される場合があります。
注記

注記は、薄緑色のボックスに緑色の左境界線を付け、 緑色の「注記」見出しを付けて表示されます。 注記は常に参考情報です。

例は薄いカーキ色のボックスで表示され、カーキ色の左境界線と、
番号付きの「例」見出しがカーキ色で表示されます。
例は常に参考情報です。例の内容は等幅フォントで表示され、構文に色が付けられる場合があります。

例にはタブ付きナビゲーションボタンがある場合があり、
例を他の表現へ変換した結果を表示できます。

1.4 用語

この文書では、外部仕様で定義された次の用語を使用し、 JSON-LD に固有の用語を定義します。

他の仕様から取り込まれた用語

ECMAScript Language Specification [ECMASCRIPT]、 The JavaScript Object Notation (JSON) Data Interchange Format [RFC8259]、 Infra Standard [INFRA]、および Web IDL [WEBIDL] から取り込まれた用語

配列
JSON シリアライズでは、 array 構造は 0 個以上の値を角括弧で囲むことで表されます。 値はコンマで区切られます。 内部表現では、 リスト配列とも呼ばれる)は、 0 個以上の値の順序付きコレクションです。 JSON-LD は JSON と同じ配列表現を使用しますが、 コレクションはデフォルトでは順序なしです。 通常の JSON 配列では順序が保持されますが、 通常の JSON-LD 配列では、明示的に定義されない限り保持されません (JSON-LD 1.1 の Sets and Lists 節を参照)。
ブール値
2 つの可能な状態のいずれかを表すために使用される true および false の値。
JSON オブジェクト
JSON シリアライズでは、 object 構造は、 0 個以上の名前/値ペア(またはメンバー)を波括弧で囲むことで表されます。 名前は 文字列です。 各名前の後には単一のコロンが続き、 名前と値を分離します。 単一のコンマが値と次の名前を分離します。 JSON-LD では、オブジェクト内の名前は一意でなければなりません。

内部表現では、JSON オブジェクトマップ ([INFRA] を参照)として記述され、 キー/値ペアを持つ エントリから構成されます。

アプリケーション・プログラミング・インターフェイスでは、 マップは [WEBIDL] の record を使用して記述されます。

null
JSON-LD 内で null 値を使用することは、値を無視またはリセットするために使用されます。 @context 内の マップエントリで、 値、または値の @idnull である場合、 その用語と IRI との関連付けを明示的に切り離します。 マップエントリJSON-LD 文書の本文内にあり、 その値が null である場合、 その マップエントリが定義されていない場合と同じ意味を持ちます。 展開形式で @value@list、または @setnull に設定されている場合、 JSON オブジェクト全体が無視されます。
数値
JSON シリアライズでは、number は ほとんどのプログラミング言語で使用されるものと似ていますが、 8 進および 16 進形式は使用されず、先頭の 0 は許可されません。 内部表現では、 number は、 その数値に 0 でない小数部があるかどうかに応じて、 long または double のいずれかに相当します ([WEBIDL] を参照)。
スカラー
スカラーは、文字列数値true、または false のいずれかです。
文字列
文字列は、 0 個以上の Unicode(UTF-8)文字の列であり、 ダブルクォートで囲まれ、必要に応じてバックスラッシュエスケープを使用します。 文字は 1 文字の文字列として表されます。

Internationalized Resource Identifiers (IRIs) [RFC3987] から取り込まれた用語

IRI
scheme を含み、さらに path と任意の query および fragment セグメントを含む IRI の絶対形式。
IRI 参照
Internationalized Resource Identifier の一般的な使用を示します。 IRI 参照は 絶対である場合も、 相対である場合もあります。 ただし、このような参照から得られる「IRI」には 絶対 IRI のみが含まれます。 すべての 相対 IRI 参照は 絶対形式に解決されます。
相対 IRI 参照
相対 IRI 参照は、他の何らかの IRI 参照に対して相対的な IRIであり、 通常は文書の 基底 IRI に対するものです。 プロパティ@type の値、 および語彙相対として定義された 用語の値は、 語彙マッピングに対して解決され、 基底 IRIに対してではないことに注意してください。

RDF 1.1 Concepts and Abstract Syntax [RDF11-CONCEPTS]、RDF Schema 1.1 [RDF-SCHEMA]、および Linked Data Design Issues [LINKED-DATA] から取り込まれた用語

基底 IRI
基底 IRIは、 コンテキストで確立された IRI、 または JSON-LD 文書の場所に基づくものです。 基底 IRIは、相対 IRI 参照IRIに変換するために使用されます。
空白 ノード
グラフ内の ノードであり、 IRIでも リテラルでもないものです。 空白 ノードは、 その性質上一時的であるか、linked data graph の外部からリンクされる必要のある情報を含まないため、 参照解決可能な識別子を含みません。 JSON-LD では、 空白ノードには接頭辞 _: で始まる識別子が割り当てられます。
空白ノード 識別子
空白ノード 識別子は、JSON-LD 文書のスコープ内で 空白ノードの識別子として使用できる文字列です。 空白ノード識別子は _: で始まります。
データセット
ちょうど 1 つの デフォルトグラフと、 0 個以上の 名前付きグラフを含む RDF グラフのコレクションを表す データセット
データ型 IRI
データ型 IRIは、 字句形式がどのように リテラル値へ対応するかを決定するデータ型を識別する IRIです。
デフォルト グラフ
データセットデフォルトグラフは、 名前を持たない RDF グラフであり、空であってもかまいません。
グラフ 名
名前付きグラフを識別する IRIまたは 空白 ノード
言語タグ付き 文字列
言語タグ付き 文字列は、 [BCP47] で定義される文字列と空でない言語タグから構成されます。 言語タグは、 [BCP47] の section 2.2.9 Classes of Conformance に従って整形式でなければなりません。 プロセッサは 言語タグを 小文字に正規化してもかまいません。
Linked Data
それぞれが linked data graph または データセットの表現を含む文書の集合。
リスト
リストは、 IRI空白ノード、および リテラルの順序付き列です。
リテラル
文字列数値などの値として表現される オブジェクト。 暗黙的または明示的に データ型 IRIを含み、データ型が rdf:langString の場合は任意の 言語タグを含みます。
名前付き グラフ
名前付き グラフは、 IRIまたは 空白 ノードによって識別される linked data graphです。
ノード
RDF グラフ内の ノードであり、 少なくとも 1 つの トリプル主語および オブジェクトのいずれかです。 ノードは、同じ トリプル内であっても、 主語オブジェクトの 両方の役割を グラフ内で果たすことができることに注意してください。
オブジェクト
オブジェクトは、 少なくとも 1 つの入ってくる辺を持つ ノードであり、 linked data graph内にあります。
プロパティ
linked data graph内の有向弧の名前。 すべての プロパティは方向性を持ち、 IRIまたは 空白ノード 識別子でラベル付けされます。 可能な場合は常に、プロパティIRIでラベル付けされるべきです。
注記
プロパティにラベルを付けるために 空白ノード 識別子を使用することは廃止されており、 JSON-LD の将来のバージョンで削除される可能性があります。
また、[RDF11-CONCEPTS] の 述語も参照してください。
RDF グラフ
ラベル付き有向 グラフ、 すなわち、有向弧によって接続された ノードの集合。 linked data graphとも呼ばれます。
リソース
IRI空白 ノード、または リテラルによって示される リソースであり、 世界の何か(「議論領域」)を表します。
主語
主語は、 ノードであり、 linked data graph内で少なくとも 1 つの出ていく辺を持ち、 プロパティを通じて オブジェクトノードと関連付けられます。
トリプル
RDF グラフの構成要素であり、 主語述語、および オブジェクトを含み、 RDF グラフのノード-弧-ノードの部分を表します。

JSON-LD 固有の用語定義

アクティブ コンテキスト
処理アルゴリズムの実行中に 用語を解決するために使用される コンテキスト
基底方向
基底 方向は、文字列に直接関連付けられた方向がない場合に使用される方向です。 これは コンテキスト内で @direction キーを使用して設定でき、 その値は文字列 "ltr""rtl"、または null のいずれかでなければなりません。 規範的な説明については、JSON-LD 1.1 の Context Definitions 節を参照してください。
コンパクト IRI
コンパクト IRI は、接頭辞:suffix の形式を持ち、 接頭辞によって識別される共通語彙内に含まれる 各 IRI について個別の 用語定義を作成することなく、 IRIを表現する方法として使用されます。
コンテキスト
JSON-LD 1.1 の The Context 節で説明され、 JSON-LD 1.1 の Context Definitions 節で規範的に指定される、 JSON-LD 文書を解釈するための規則の集合。
デフォルト 言語
デフォルト言語は、 文字列に直接関連付けられた言語がない場合に使用される言語です。 これは コンテキスト内で @language キーを使用して設定でき、 その値は [BCP47] 言語コードを表す 文字列または null でなければなりません。 規範的な説明については、JSON-LD 1.1 の Context Definitions 節を参照してください。
デフォルトオブジェクト
デフォルト オブジェクトは、@default キーを持つ マップです。
展開された用語 定義
展開された用語定義は、値が マップである 用語定義であり、 関連付けられた IRI、 それが逆プロパティであるかどうか、 文字列値に関連付けられた型、およびコンテナマッピングを定義するための 1 つ以上の キーワードキーを含みます。 規範的な説明については、JSON-LD 1.1 の Expanded Term Definition 節を参照してください。
フレーム
マッチング規則および埋め込み規則を使用して、別の JSON-LD 文書を変換する形式を記述する JSON-LD 文書。 フレーム文書では、マッチングおよび変換プロセスを記述するために、 追加のキーワードと特定の マップエントリを使用できます。
グラフ オブジェクト
グラフ オブジェクトは、名前付きグラフノード オブジェクト内の マップエントリの値として表します。 展開された場合、グラフオブジェクトは @graph エントリを持たなければならず、 @id および @index エントリを持ってもかまいません。 単純グラフ オブジェクトは、 @id エントリを持たない グラフ オブジェクトです。 ノードオブジェクト@graph エントリを持つことがありますが、 その他の エントリを含む場合は グラフオブジェクトとは見なされないことに注意してください。 @graph から構成されるトップレベルオブジェクトも グラフオブジェクトではありません。 ノードオブジェクトは、 他のプロパティを含む場合、名前付きグラフを表すこともあることに注意してください。 規範的な説明については、JSON-LD 1.1 の Graph Objects 節を参照してください。
id マップ
id マップは、 @container@id に設定された 用語マップ値です。 id マップの値は ノード オブジェクトでなければならず、 そのキーは関連する ノードオブジェクト@id を表す IRIとして解釈されます。 id マップ内の値が @id に展開されるキーを含む場合、 その値は id マップ内の参照キーと等価でなければなりません。 規範的な説明については、JSON-LD 1.1 の Id Maps 節を参照してください。
包含ブロック
包含ブロックは、 キーが @included または @included の別名であり、 値が 1 つ以上の ノードオブジェクトである、 ノード オブジェクト内の エントリです。 規範的な説明については、JSON-LD 1.1 の Included Blocks 節を参照してください。
index マップ
index マップは、@container@index に設定された 用語マップ値であり、 その値は次のいずれかの型でなければなりません: 文字列数値truefalsenullノード オブジェクト値 オブジェクトリスト オブジェクトセット オブジェクト、または 上記の可能性を 0 個以上含む 配列。 形式的な説明については、JSON-LD 1.1 の Index Maps 節を参照してください。
JSON リテラル
JSON リテラルは、 関連付けられた データ型 IRIrdf:JSON である リテラルです。 値オブジェクト表現では、 @type の値は @json です。 JSON リテラルは、有効な JSON [RFC8259] である値を表します。 規範的な説明については、JSON-LD 1.1 の The rdf:JSON Datatype 節を参照してください。
JSON-LD 文書
JSON-LD 文書は、 RDF データセットのシリアライズです。 形式的な説明については、JSON-LD 1.1 の JSON-LD Grammar 節を参照してください。
JSON-LD 内部 表現
JSON-LD 内部表現は、 JSON 構文構造を、直接処理に適した中核データ構造へ変換した結果です: 配列マップ文字列数値ブール値、および null
JSON-LD Processor
JSON-LD Processorは、JSON-LD 1.1 Processing Algorithms and API で定義されたアルゴリズムを実行できるシステムです。 形式的な説明については、JSON-LD 1.1 API の Conformance 節を参照してください。
JSON-LD 値
JSON-LD 値は、文字列数値true または false型付き 値、 または 言語タグ付き 文字列です。 これは RDF リテラルを表します。
キーワード
JSON-LD に固有の 文字列であり、 JSON-LD 1.1 の Syntax Tokens and Keywords 節で説明され、 JSON-LD 1.1 の Keywords 節で規範的に指定されます。
言語 マップ
言語 マップは、@container@language に設定された 用語マップ値であり、 そのキーは [BCP47] 言語コードを表す 文字列でなければならず、 値は次のいずれかの型でなければなりません: null文字列、 または 上記の可能性を 0 個以上含む 配列。 規範的な説明については、JSON-LD 1.1 の Language Maps 節を参照してください。
リストオブジェクト
リスト オブジェクトは、@list キーを持つ マップです。 @index キーを持ってもかまいませんが、その他の エントリを持ってはなりません。 規範的な説明については、JSON-LD 1.1 の Lists and Sets 節を参照してください。
ローカル コンテキスト
マップを用いて指定され、 @context キーワードを介して指定される コンテキスト
ノード オブジェクト
ノード オブジェクトは、 JSON-LD 文書によってシリアライズされる グラフ内の ノードの 0 個以上の プロパティを表します。 マップは、 JSON-LD コンテキストの外側に存在し、かつ次の条件を満たす場合、 ノード オブジェクトです:
  • @value@list、または @set キーワードを含まない、または
  • JSON-LD 文書内で最上位の マップではなく、 @graph および @context 以外の エントリを含まないものではない。
キーがキーワードでない ノード オブジェクトエントリは、 その ノード オブジェクトプロパティとも呼ばれます。 規範的な説明については、JSON-LD 1.1 の Node Objects 節を参照してください。
接頭辞
接頭辞は、 コンパクト IRIの最初の構成要素であり、 これは 用語に由来します。その用語は文字列に対応し、 コンパクト IRIの suffix に前置されると、 IRIになります。
処理 モード
処理モードは、 JSON-LD 文書がどのように処理されるかを定義します。 デフォルトでは、すべての文書はこの仕様に適合していると見なされます。 コンテキスト内の @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 の Lists and Sets 節を参照してください。
用語
用語は、 コンテキスト内で定義された短い語であり、 IRIへ展開される場合があります。 規範的な説明については、JSON-LD 1.1 の Terms 節を参照してください。
用語 定義
用語定義は、コンテキスト内のエントリであり、 そのキーは 用語を定義します。 この用語は、マップ内でキー、型、 または文字列が語彙項目として解釈される別の箇所で使用される場合があります。 その値は、IRIへ展開される文字列 (単純用語 定義)、 またはマップ(展開された用語 定義)のいずれかです。
type マップ
type マップは、 @container@type に設定された 用語マップ値であり、 そのキーは、関連する ノードオブジェクト@type を表す IRIとして解釈されます。 値は ノードオブジェクト、 またはノードオブジェクトの 配列でなければなりません。 値が @type に展開される 用語を含む場合、 展開時にその値はマップ値とマージされます。 規範的な説明については、JSON-LD 1.1 の Type Maps 節を参照してください。
型付き値
型付き 値は、値と型から構成されます。 値は 文字列であり、 型は IRIです。
値 オブジェクト
値 オブジェクトは、 @value エントリを持つ マップです。 規範的な説明については、JSON-LD 1.1 の Value Objects 節を参照してください。
語彙 マッピング
語彙マッピングは、コンテキスト内で @vocab キーを使用して設定され、 その値は IRIコンパクト IRI用語、または null でなければなりません。 規範的な説明については、JSON-LD 1.1 の Context Definitions 節を参照してください。

1.4.1 アルゴリズム用語

次の用語は、特定のアルゴリズム内で使用されます。

アクティブグラフ
処理時にプロセッサが使用すべき、現在アクティブなグラフの名前。
アクティブプロパティ
処理時にプロセッサが使用すべき、現在アクティブな プロパティまたは キーワードアクティブ プロパティは元の字句形式で表され、 アクティブコンテキスト内で型強制マッピングを検索するために使用されます。
値を追加する
さまざまなアルゴリズム内で、指定された key を使用して valueマップobject)内の エントリへ 追加するためのマクロとして使用されます。 呼び出しには、既定値が falseas array フラグを含めることができます。
  1. as arraytrue であり、 object 内の key の値が存在しない、 または 配列でない場合、 元の値を含む新しい 配列に設定します。
  2. value配列である場合、 value 内の各要素 v について、 値を追加するを 再帰的に使用して、entry 内の keyv を追加します。
  3. それ以外の場合:
    1. keyobject 内のエントリでない場合、 valueobject 内の key の値として追加します。
    2. それ以外の場合
      1. object 内の key エントリの値が 配列でない場合、 元の値を含む新しい 配列に設定します。
      2. valueobject 内の key エントリの値へ 追加します。
IRI 圧縮
さまざまなアルゴリズム内で、直接指定された、 またはこの用語を使用するアルゴリズムステップのスコープから得られる active context を使用して、 文字列 varIRIまたは キーワードを表す) を圧縮する過程を記述する言葉を減らすためのマクロとして使用されます。 明示的に指定された場合、任意の value が使用されます。 指定がない限り、vocab フラグの既定値は truereverse フラグの既定値は false です。
  1. IRI 圧縮 アルゴリズムを使用した結果を返します。 その際、active contextvarvalue(指定されている場合)、 vocab、 および result を渡します。
IRI 展開
さまざまなアルゴリズム内で、直接指定された、 またはこの用語を使用するアルゴリズムステップのスコープから得られる active context を使用して、 文字列 valueIRIまたは キーワードを表す) を展開する過程を記述する言葉を減らすためのマクロとして使用されます。 明示的に指定された場合、任意の defined および local context 引数が使用されます。 指定がない限り、 document relative フラグの既定値は falsevocab フラグの既定値は true です。
  1. IRI 展開 アルゴリズムを使用した結果を返します。 その際、active contextvaluelocal context(指定されている場合)、 defined(指定されている場合)、 document relative、 および vocab を渡します。
JSON-LD 入力
アルゴリズムへの入力として提供される JSON-LD データ構造。

1.4.2 構文トークンおよびキーワード

JSON-LD 1.1 Syntax 仕様 [JSON-LD11] で定義される キーワードに加え、 この仕様は JSON-LD 1.1 Framing [JSON-LD11-FRAMING] をサポートするために、 追加の キーワードを加えます:

@preserve
フレーミングアルゴリズムの結果として作成された 展開文書内で使用され、 展開アルゴリズムの一部として本来削除される可能性のある値を表します。

1.5 例の規約

この節は非規範的です。

この文書で使用される例では、出力は必然的に JSON としてシリアライズされた形式で示されることに注意してください。 アルゴリズムは JSON-LD 内部表現に対する操作を記述していますが、 例として表示される場合には JSON シリアライズが使用されます。特に、 内部表現における マップは、 JSON オブジェクトを使用して表されます。

2: 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"
    }
  ]
}

内部 表現では、上記の例は @context@idname、および knows エントリを含む マップであり、 それらの値は マップ文字列、 またはマップや文字列値の 配列のいずれかになります。 JSON シリアライズでは、JSON オブジェクトが マップに使用され、配列および文字列は多くのプログラミング言語に共通する 規約を使用してシリアライズされます。

2. 機能

この節は非規範的です。

JSON-LD 1.1 Syntax 仕様 [JSON-LD11] は、JSON で Linked Data を表現するための構文を定義します。この構文を使用して Linked Data を表現する方法は複数あるため、JSON-LD 文書を変換し、 特定のアプリケーションがより容易に利用できるようにすることがしばしば有用です。

これらのアルゴリズムを JSON 以外の構文にも適用できるようにするため、 アルゴリズムは JSON-LD 内部表現に対して動作します。 これは、JSON 文書によって表されるデータを記述するために、 配列マップ文字列数値ブール値、および null という汎用的な 概念を使用します。アルゴリズムはこの 内部表現に作用し、 API のエントリポイントが具体表現と内部表現の間の変換を担当します。

JSON-LD は コンテキストを使用して、 Linked Data を、特定の人やアプリケーションに特化した方法で 表現できるようにします。コンテキストを提供することで、 JSON データは、特定の人やアプリケーションに自然に適合する方法で表現できると同時に、 そのデータがグローバルな規模でどのように理解されるべきかも示せます。 人やアプリケーションが、自分たちとは異なる コンテキストを使用して作成されたデータを 共有できるようにするためには、JSON-LD プロセッサは文書を ある コンテキストから別のものへ変換できなければなりません。 JSON-LD プロセッサに、考え得るすべての コンテキスト切り替えの場面ごとに 固有のコードを書くことを要求する代わりに、 任意の コンテキストを削除できる 単一のアルゴリズムを指定する方がはるかに容易です。同様に、 任意の コンテキストを 後から適用する別のアルゴリズムを指定できます。これら 2 つのアルゴリズムは、 JSON-LD 文書の最も基本的な変換を表します。それぞれ 展開および 圧縮と呼ばれます。

JSON-LD 1.1 は、 JSON-LD 1.0 [JSON-LD10] と互換性のある新機能を導入しますが、JSON-LD 1.0 プロセッサで処理されると、 異なる結果を生成する可能性があります。プロセッサは、 processingMode API オプションが 明示的に json-ld-1.0 に設定されていない限り、 既定で json-ld-1.1 になります。 公開者は、JSON-LD 1.0 プロセッサが JSON-LD 1.1 の機能を誤って解釈しないようにするため、 コンテキスト内の @version マップエントリ1.1 に設定して使用することが推奨されます。

この文書で説明する変換には、展開、圧縮、平坦化、RDF シリアライズ/デシリアライズという 4 つの主要な種類があります。

2.1 展開

この節は非規範的です。

コンテキストを削除するアルゴリズムは、 展開と呼ばれます。JSON-LD 文書に対して他の変換を行う前に、 その文書から任意の コンテキストを 削除し、データ構造をより規則的にするのが最も容易です。

コンテキストとデータ構造化が同じデータにどのように影響するかを理解するために、 用語のみを使用し、 かなりコンパクトな JSON-LD の例を示します:

次の入力例は、1 つの IRIを使用して プロパティを表現し、 マップを使用して値をカプセル化しますが、 残りの情報はそのままにしています。

両方の入力は有効な JSON-LD であり、同じ情報を表していることに注意してください。 違いは、それらの コンテキスト情報と、 使用されるデータ構造にあります。JSON-LD プロセッサは コンテキストを削除し、 展開を用いることで データをより規則的にできます。

展開には 2 つの重要な目標があります: 文書から任意のコンテキスト情報を削除すること、およびすべての値が規則的な形式で表されるようにすることです。 これらの目標は、すべての エントリキーを IRIへ展開し、 すべての値を 展開形式配列で表現することで達成されます。 展開形式は、 JSON-LD において値を表現する最も冗長で規則的な方法です。文書のすべてのコンテキスト情報は、 代わりに各値のローカルに格納されます。 上記の例に対して 展開アルゴリズムexpand() 操作)を実行すると、次の出力が得られます:

5: IRI を使用する展開済み 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 としてシリアライズしたものです。 ここでは、アルゴリズムで使用される マップJSON オブジェクトに置き換えられています。

上記の出力では、すべての コンテキスト定義が 削除され、すべての 用語および コンパクト IRIが 絶対 IRIへ展開され、 すべての JSON-LD 値展開形式配列で表されていることに注意してください。 出力はより冗長で人間には読みにくいものになりますが、非常に規則的な構造であるため、 JSON-LD 処理を容易にする基準を確立します。

2.2 圧縮

この節は非規範的です。

展開が与えられた入力から コンテキストを削除する一方で、 圧縮の主な機能は、 反対の操作を行うこと、すなわち与えられた入力を特定の コンテキストに従って表現することです。 圧縮は、 情報の表現方法を特定の人またはアプリケーション向けに特化させる コンテキストを適用します。 これにより、JSON または JSON-LD を利用するアプリケーションは、アプリケーション固有の用語で データを表現できるため簡素化され、また人間にとってもデータが読みやすくなります。

圧縮は、開発者が提供する コンテキストを使用して、 IRI用語または コンパクト IRIへ短縮し、 展開形式で表現された JSON-LD 値を、 文字列数値などの単純な値へ変換します。

たとえば、次の展開済み JSON-LD 入力文書を想定します:

6: 展開済みサンプル文書
[
  {
    "@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 コンテキストを想定します:

7: 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/namename に写像しましたが、 開発者が提供する任意の他の用語に写像することもできます。

2.3 平坦化

この節は非規範的です。

展開は文書が均一な構造になることを保証しますが、 平坦化はさらに一歩進み、 データの形状が決定的であることを保証します。展開済み文書では、単一の ノードプロパティが、 複数の異なる ノード オブジェクトに分散していることがあります。文書を平坦化することで、 ある ノードの すべての プロパティは単一の ノード オブジェクトに集められ、すべての 空白ノードには 空白ノード識別子でラベルが付けられます。 これにより、特定のアプリケーションで JSON-LD データを処理するために必要なコードを 大幅に簡素化できる場合があります。

たとえば、次の JSON-LD 入力文書を想定します:

9: 圧縮形式の 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"}
  ]
}

圧縮を防ぐためにコンテキストを null に設定して 平坦化アルゴリズムflatten() 操作)を実行すると、次の文書が返されます:

上記の例は、 平坦化アルゴリズムの出力を JSON-LD としてシリアライズしたものです。 ここでは、アルゴリズムで使用される マップJSON オブジェクトに置き換えられています。

上記の出力では、ある ノードの すべての プロパティが 単一の ノードオブジェクトに集められていること、 また "Dave Longley" を表す 空白ノード空白ノード識別子 _:b0 が割り当てられていることに注意してください。

人間が読みやすくしたり、特定のアプリケーションで処理しやすくしたりするために、 平坦化済み文書は コンテキストを渡すことで圧縮できます。 入力文書と同じコンテキストを使用すると、平坦化され圧縮された文書は 次のようになります:

文書を平坦化して 圧縮した結果は、 常に マップ (シリアライズ時には JSON オブジェクトとして表される)であり、 デフォルト グラフを表す @graph エントリを含むことに注意してください。

2.4 RDF シリアライズ/デシリアライズ

この節は非規範的です。

JSON-LD は、 [RDF11-CONCEPTS] で説明されるように、 RDF データをシリアライズするために使用できます。これにより、任意の RDF 構文との間で、 忠実性を損なうことなくデータを往復変換できます。

たとえば、Turtle [TURTLE] で シリアライズされた次の RDF 入力を想定します:

12: Turtle 文書の例
@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 に変換できます:

13: JSON-LD に変換された Turtle 文書の例
[
  {
    "@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 に戻すことも可能です。

3. 適合性

非規範的と明示された節に加え、この仕様内のすべての作成ガイドライン、図、例、および注記は 非規範的です。この仕様内のそれ以外のすべては規範的です。

この文書内のキーワード MAYMUSTMUST NOT、および SHOULD は、 ここに示すようにすべて大文字で現れる場合に限り、 BCP 14 [RFC2119] [RFC8174] で説明されるとおりに解釈されます。

この仕様への適合を主張できる製品には、2 つのクラスがあります: JSON-LD Processor、 および RDF シリアライザ/デシリアライザです。

適合する JSON-LD Processor は、 展開圧縮、 および 平坦化操作を この仕様で定義されたアルゴリズムと整合する方法で 実行できるシステムです。

JSON-LD ProcessorMUST NOT 不正な形式の IRI または 言語タグを修正しようとしてはなりません。 ただし、検証警告を発行することが SHOULD です。 IRI は、 相対 IRI と絶対 IRI の間の変換を除いて変更されません。

適合する RDF シリアライザ/デシリアライザは、 この仕様で定義されるとおりに JSON-LD を RDF へデシリアライズし、 RDF を JSON-LD としてシリアライズできるシステムです。

processingMode API オプションを使用して指定されない限り、 処理モードは、 ローカル コンテキスト内の @version エントリを使用して設定され、 展開および 圧縮を含むアルゴリズムの動作に影響します。 一度設定されると、別の処理モードへ変更しようとすることはエラーであり、 プロセッサは MUST processing mode conflict エラーを生成し、以後の処理を中止します。

この仕様のアルゴリズムは、一般に効率よりも明確さを重視して書かれています。したがって、 JSON-LD Processor は、 最終結果がこの仕様のアルゴリズムによって得られる結果と区別できない限り、 この仕様で与えられるアルゴリズムを任意の方法で実装してかまいません。

キーワードに対する操作を記述するアルゴリズム手順では、 それらの手順は キーワード別名にも適用されます。

注記

実装者は、 JSON-LD テストスイートの テストケースに合格することで、この仕様への適合レベルを部分的に確認できます。 ただし、テストスイート内のすべてのテストに合格しても、 この仕様への完全な適合を意味するものではありません。それは単に、 実装がテストスイートによってテストされる側面に適合していることを意味するだけです。

この仕様は、次の名前空間接頭辞を使用します:

接頭辞 IRI
rdf http://www.w3.org/1999/02/22-rdf-syntax-ns#
xsd http://www.w3.org/2001/XMLSchema#

4. コンテキスト処理アルゴリズム

以下の節では、JSON-LD コンテキストを処理するためのアルゴリズムを説明します。

4.1 コンテキスト処理アルゴリズム

JSON-LD データ構造を処理する際、各処理規則は アクティブコンテキストによって提供される情報を使用して適用されます。この 節では、アクティブコンテキストを生成する方法を説明します。

アクティブコンテキスト は次のものから構成されます:

用語 定義は次のものから構成されます:

用語定義は、 用語IRIへマッピングするためだけでなく、用語キーワードへマッピングするためにも使用できます。 この場合、それは キーワード別名と呼ばれます。

処理時、active context は、 null逆コンテキストを持つ状態で 初期化され、 用語 定義語彙 マッピングデフォルト基底方向、または デフォルト 言語を持ちません。 処理中に ローカルコンテキストが 見つかった場合、既存の active context を複製して、新しい active context が作成されます。次に、 ローカルコンテキストからの情報が 新しい active context にマージされます。 ローカル コンテキストはリモートコンテキストへの参照を含むことがあるため、 これにはそれらの取得も含まれます。

4.1.1 概要

この節は非規範的です。

まず、現在の アクティブコンテキストを複製して、 新しい アクティブコンテキスト result を準備します。次に、元の ローカルコンテキスト の形式を 配列へ正規化します。 ローカルコンテキストは、 マップ文字列、またはその 2 つの組み合わせを含む 配列の形式を取ることがあります。 最後に、ローカル コンテキスト配列に含まれる 各 コンテキストを 次のように処理します。

コンテキスト文字列である場合、 それはリモートコンテキストへの参照を表します。リモートコンテキストを参照解決し、 コンテキストを、 取得した JSON-LD 文書内のトップレベルオブジェクトの @context エントリの値で置き換えます。 そのような エントリが存在しない場合、 invalid remote context が検出されています。そうでなければ、循環参照がないことを保証しつつ、 このアルゴリズムを再帰的に使用して コンテキストを処理します。

コンテキストマップである場合、 それは コンテキスト定義です。 まず、 基底 IRIデフォルト基底 方向デフォルト 言語コンテキスト伝播処理モード、 および 語彙マッピングを、 6 つの特定のキーワード @base@direction@language@propagate@version、 および @vocabを処理することによって更新します。 これらは、ローカルコンテキスト内の他の エントリより前に処理されます。 なぜなら、それらは他の エントリがどのように処理されるかに影響するからです。 コンテキスト@import が含まれる場合、それは取得され、包含するコンテキストへ逆マージされるため、 JSON-LD 1.0 コンテキストを JSON-LD 1.1 へアップグレードできます。 リモートコンテキストを処理する際、@base は無視されることに注意してください。

コンテキストが伝播されない場合、 新しい ノードオブジェクトに入ったときに ロールバックできるように、 以前の コンテキストへの参照が保持されます。 デフォルトでは、型スコープ付きコンテキストを除き、 すべてのコンテキストが伝播されます。

アクティブ コンテキストが初期化されるとき、 元の基底 URLの値は、 利用可能であれば、最初の コンテキストを含む文書の元の documentUrl から初期化され、 そうでなければ base API オプションから初期化されます。 これは、アクティブコンテキストnull に設定してリセットする際に、 元のデフォルトの 基底 IRIを保持するために必要です。

初期化時、または アクティブ コンテキストのいずれかのエントリが変更されたとき、 または関連する 用語定義が追加、変更、 または削除されたとき、 逆コンテキストフィールドは アクティブ コンテキスト内で null に設定されます。

次に、ローカルコンテキスト内の他のすべての エントリについて、 result 内の 用語 定義を更新します。ローカルコンテキスト内の 用語 定義自体が 用語または コンパクト IRIを 含む場合があるため、再帰が必要になることがあります。 その際、エラーとなる循環依存がないことを確実にしなければなりません。 用語 定義の依存関係を処理した後、 現在の 用語定義を更新します。 これは キーワード 別名である場合があります。

最後に、新しい アクティブコンテキストとして result を返します。

4.1.2 アルゴリズム

このアルゴリズムは、新しい アクティブコンテキストローカル コンテキストで更新する方法を指定します。このアルゴリズムは、3 つの必須 および 4 つの任意 入力変数を取ります。 必須入力は、 active contextlocal contextおよび相対コンテキスト URL を解決するときに使用される base URL です。 任意入力は、 配列 remote contextsであり、 新しい空の 配列を既定値とし、循環するコンテキスト包含を検出するために使用されます。 override protected は既定値が false で、 保護された用語の変更を許可するために使用されます。 propagate は既定値が true で、 非伝播の コンテキストに関連付けられた 用語 定義をマークするために使用されます。 また、validate scoped context は既定値が true で、 再帰する可能性のある スコープ付きコンテキストを検証する際に再帰を制限するために使用されます。

  1. active context を複製した結果として result を初期化し、 逆コンテキストnull に設定します。
  2. local context がメンバー @propagateを含むオブジェクトである場合、 その値は ブール値 true または false であることが MUST であり、 propagate をその値に設定します。
    注記
    エラー処理は 手順 5.11で実行されます。
  3. propagatefalse で、かつ result以前のコンテキストを持たない場合、result 内の 以前のコンテキストactive context に設定します。
  4. local context配列でない場合、 local context のみを含む 配列local context を設定します。
  5. local context 内の各項目 context について:
    1. contextnull である場合:
      1. override protectedfalse であり、 active context保護済み用語 定義を含む場合、 invalid context nullification が検出され、処理は中止されます。
      2. result を、 新しく初期化された アクティブ コンテキストとして初期化し、 基底 IRI元の基底 URLの両方を、active context 内の 元の基底 URLの値に設定し、 また、propagatefalse の場合は、 result 内の 以前のコンテキストを、 result の以前の値に設定します。
      3. 次の context へ続けます。
    2. context文字列である場合、
      1. context を、 base URL に対して context を解決した結果で初期化します。 base URL が有効な IRIでない場合、 context は有効な IRIであることが MUST であり、そうでなければ loading document failed エラーが 検出され、処理は中止されます。
        注記
        base URL は、多くの場合、 baseactive context基底 IRIと同じではありません。
      2. validate scoped contextfalse であり、 remote contexts がすでに context を含む場合、 context をそれ以上処理せず、local context 内の次の context へ続けます。
      3. remote contexts 配列内のエントリ数が プロセッサ定義の上限を超える場合、 context overflow エラーが検出され、処理は中止されます。 そうでなければ、contextremote contexts に追加します。
      4. context が以前に参照解決されていた場合、 プロセッサはそれ以上の参照解決を行ってはならず(MUST NOT)、 context は 以前に確立された 内部表現に設定されます: context document を以前に参照解決された文書に設定し、 loaded contextcontext document 内の文書から得た @context エントリの値に設定します。
        注記
        @context エントリのみを 保持すれば十分です。
      5. それ以外の場合、context document を、 LoadDocumentCallbackを使用して context を参照解決することにより得られる RemoteDocumentに設定します。 その際、 urlには context を渡し、 profileおよび requestProfileには http://www.w3.org/ns/json-ld#context を渡します。
        1. context を参照解決できない場合、 または context document からの document内部表現へ変換できない場合 loading remote context failed エラーが検出され、処理は中止されます。
        2. document@context エントリを持つ トップレベルの マップがない場合、 invalid remote context が検出され、処理は中止されます。
        3. loaded context を、その エントリの値に設定します。
      6. このアルゴリズムを再帰的に呼び出した結果として result を設定し、 active context には resultlocal context には loaded context base URL には context documentdocumentUrl remote contextsコピーおよび validate scoped contextを渡します。
        注記
        context が以前に参照解決されていた場合、 プロセッサは、この手順で発生する可能性のある 相対コンテキスト URL の解決を可能にするために、その コンテキストbase URLを保持するための措置を講じなければなりません(MUST)。
      7. 次の context へ続けます。
    3. contextマップでない場合、 invalid local context エラーが検出され、処理は中止されます。
    4. それ以外の場合、contextコンテキスト 定義です。
    5. context@version エントリを持つ場合:
      1. 関連付けられた値が 1.1 でない場合、 invalid @version value が検出され、処理は中止されます。
        注記
        @version の値として 1.1を使用することは、 JSON-LD 1.0 プロセッサに処理を停止させることを意図しています。 これは明らかに JSON-LD 1.1 に関連することを意図していますが、 それ以外の点では Semantic Versioning の要件には従いません。 0 でない小数部を持つ 数値 の値を比較する際、実装は numbersについて 特別な考慮を必要とする場合があります。
      2. 処理 モードjson-ld-1.0 に設定されている場合、 processing mode conflict エラーが検出され、処理は中止されます。
    6. context@import エントリを持つ場合:
      1. 処理 モードjson-ld-1.0 である場合、 invalid context entry エラーが検出され、処理は中止されます。
      2. それ以外の場合、@import の値が 文字列でない場合、 invalid @import value エラーが検出され、処理は中止されます。
      3. @import の値を base URL に対して解決した結果として import を初期化します。
      4. LoadDocumentCallbackを使用して import を参照解決します。その際、 urlには import を渡し、 profileおよび requestProfileには http://www.w3.org/ns/json-ld#context を渡します。
      5. import を参照解決できない場合、 または 内部 表現へ変換できない場合loading remote context failed エラーが検出され、処理は中止されます。
      6. 参照解決された文書に @context エントリを持つ トップレベルの マップがない場合、 または @context の値が コンテキスト 定義 (すなわち マップ)でない場合、 invalid remote context が検出され、処理は中止されます。そうでなければ、 import context をその エントリの値に設定します。
      7. import context@import エントリを持つ場合、 invalid context entry エラーが検出され、処理は中止されます。
      8. contextimport context にマージした結果として context を設定し、共通するエントリを context からのもので置き換えます。
    7. context@base エントリを持ち、かつ remote contexts が空である、すなわち現在処理されているコンテキストが リモートコンテキストでない場合:
      1. @base エントリに関連付けられた値として value を初期化します。
      2. valuenull である場合、 result基底 IRIを削除します。
      3. それ以外の場合、valueIRIであれば、 result基底 IRIvalue に設定します。
      4. それ以外の場合、value相対 IRI 参照であり、 かつ result基底 IRInull でない場合、 result基底 IRIを、 valueresult の現在の 基底 IRIに対して 解決した結果に設定します。
      5. それ以外の場合、 invalid base IRI エラーが検出され、処理は中止されます。
    8. context@vocab エントリを持つ場合:
      1. @vocab エントリに関連付けられた値として value を初期化します。
      2. valuenullである場合、 result から任意の 語彙 マッピングを削除します。
      3. それ以外の場合、valueIRI または 空白 ノード識別子である場合、result語彙 マッピング document relativetrue を使用して valueIRI 展開した結果 に設定します。 それが IRIまたは 空白 ノード識別子でない場合、 invalid vocab mapping エラーが検出され、処理は中止されます。
        注記
        @vocab の値に 空白 ノード識別子を使用することは廃止されており、 JSON-LD の将来のバージョンで削除される可能性があります。
    9. context@language エントリを持つ場合:
      1. @language エントリに関連付けられた値として value を初期化します。
      2. valuenull である場合、 result から任意の デフォルト 言語を削除します。
      3. それ以外の場合、value文字列である場合、 resultデフォルト 言語value に設定します。 それが 文字列でない場合、 invalid default language エラーが検出され、処理は中止されます。 value が [BCP47] の section 2.2.9 に従って 整形式でない場合、 プロセッサは警告を発行することが SHOULD です。
        注記
        プロセッサは 言語 タグを小文字に正規化してもかまいません(MAY)。
    10. context@direction エントリを持つ場合:
      1. 処理 モードjson-ld-1.0 である場合、 invalid context entry エラーが検出され、処理は中止されます。
      2. @direction エントリに関連付けられた値として value を初期化します。
      3. valuenull である場合、 result から任意の 基底 方向を削除します。
      4. それ以外の場合、value文字列である場合、 result基底 方向value に設定します。それが null"ltr"、または "rtl" でない場合、 invalid base direction エラーが検出され、処理は中止されます。
    11. context@propagate エントリを持つ場合:
      1. 処理 モードjson-ld-1.0 である場合、 invalid context entry エラーが検出され、処理は中止されます。
      2. それ以外の場合、@propagate の値が ブール値 true または false でない場合、 invalid @propagate value エラーが検出され、処理は中止されます。
        注記
        以前のコンテキストは、実際にはこのアルゴリズム内で より前に設定されています。 前の 2 つの手順はエラー検査のためにのみ存在します。
    12. マップ defined を作成し、 用語が再帰中にすでに定義されたか、 または現在定義中であるかどうかを追跡します。
    13. context 内の各 key-value ペアについて、 key@base@direction@import@language@propagate@protected@version、または @vocabでない場合、 用語定義作成アルゴリズムを呼び出し、 active context には resultlocal context には contextkeydefined base URL、 存在する場合は context@protected エントリの値を protected として、 override protected、 および remote contexts のコピー を渡します。
  6. result を返します。

4.2 用語定義の作成

このアルゴリズムは、 コンテキスト処理アルゴリズムから呼び出され、 ローカル コンテキスト内で処理されている 用語について、 アクティブコンテキスト内に 用語 定義を作成します。

4.2.1 概要

この節は非規範的です。

用語 定義は、与えられた 用語について、与えられた ローカルコンテキスト内の情報を 解析することで作成されます。与えられた 用語コンパクト IRIである場合、その 接頭辞が独自の 用語 定義を持つことに依存することで、 IRI マッピングを省略できます。 接頭辞エントリとして ローカル コンテキスト内にある場合、その 用語定義は、 続行する前に再帰を通じてまず作成されなければなりません。 用語 定義は他の 用語 定義に依存できるため、循環依存を検出するための仕組みを 使用しなければなりません。ここで採用されている解決策では、 defined というマップを使用し、 用語が 定義済みか、または現在定義中かを追跡します。 このマップは、再帰を試みる前に確認されます。

用語のすべての依存関係が定義された後、 与えられた 用語についての ローカルコンテキスト内の残りの情報が考慮され、 その 用語について、 適切な IRI マッピングコンテナマッピング、 および type マッピング言語マッピングまたは 方向マッピング が作成されます。

4.2.2 アルゴリズム

このアルゴリズムには 4 つの必須入力と 5 つの任意入力があります。 必須入力は、 active contextlocal contextterm、 およびマップ defined です。 任意入力は、 既定値が nullbase URL、 既定値が falseprotected、 保護された用語の変更を許可するために使用され、既定値が falseoverride protected配列 remote contextsであり、 新しい空の 配列を既定値とし、循環する コンテキスト包含を検出するために使用されます。 そして、既定値が truevalidate scoped contextであり、 再帰する可能性のある スコープ付きコンテキストを検証するときに再帰を制限するために使用されます。

  1. definedtermエントリを含み、関連付けられた値が true用語 定義がすでに作成済みであることを示す)である場合、戻ります。そうでなく、 値が false である場合、 cyclic IRI mapping エラーが検出され、処理は中止されます。
  2. term が空文字列("")である場合、 invalid term definition エラーが検出され、処理は中止されます。 そうでなければ、definedterm エントリに 関連付けられた値を false に設定します。これは、その 用語定義が 現在作成中であり、まだ完了していないことを示します。
  3. local context 内の term エントリに関連付けられた値のコピーとして value を初期化します。
  4. term@type であり、 処理モードjson-ld-1.0 である場合、 keyword redefinition エラーが 検出され、処理は中止されます。 この時点で、 value は、次の エントリの いずれか一方または両方のみを持つ マップであることが MUST です:
    • @set を値とする @container のエントリ。
    • @protected のエントリ。
    その他の値は、 keyword redefinition エラーが 検出され、処理が中止されることを意味します。
  5. それ以外の場合キーワードは上書きできないため、 termキーワードであってはならず(MUST NOT)、 keyword redefinition エラーが検出され、処理は中止されます。 term がキーワードの形式を持つ場合 (すなわち、[RFC5234] の ABNF 規則 "@"1*ALPHA に一致する場合)、 戻ります。プロセッサは警告を生成することが SHOULD です。
  6. active context 内の term についての既存の 用語 定義があれば、それを previous definition として初期化し、 その 用語定義active context から削除します。
  7. valuenull である場合、 キーが @id で値が null である単一の エントリからなる マップに変換します。
  8. それ以外の場合、value文字列であれば、それを キーが @id で値が value である単一の エントリからなる マップに変換します。 simple termtrue に設定します
  9. それ以外の場合、valueマップであることが MUST です。そうでない場合、 invalid term definition エラーが検出され、処理は中止されます。 simple termfalse に設定します
  10. 新しい 用語定義 definition を作成し、 接頭辞フラグfalse に、 protectedprotected に、 そして 逆 プロパティfalse に初期化します
  11. value@protected エントリを持つ場合、 definition 内の protected フラグを このエントリの値に設定します。 @protected の値が ブール値でない場合、 invalid @protected value エラーが検出され、 処理は中止されます。 処理モードjson-ld-1.0 である場合、 invalid term definition が検出され、処理は中止されます。
  12. valueエントリ @typeを含む場合:
    1. @type エントリに関連付けられた値として type を初期化します。これは 文字列であることが MUST です。そうでなければ、 invalid type mapping エラーが検出され、処理は中止されます。
    2. local contextdefined を使用して、 typeIRI 展開した結果type を設定します。
    3. 展開された type@json または @none であり、かつ 処理モードjson-ld-1.0 である場合、 invalid type mapping エラーが検出され、処理は中止されます。
    4. それ以外の場合、展開された type@id@json@none@vocab、 または IRIの いずれでもない場合、 invalid type mapping エラーが検出され、処理は中止されます。
    5. definitiontype マッピングtype に設定します。
  13. valueエントリ @reverseを含む場合:
    1. value@id または @nestエントリを含む場合、 invalid reverse property エラーが検出され、処理は中止されます。
    2. @reverse エントリに関連付けられた値が 文字列でない場合、 invalid IRI mapping エラーが検出され、処理は中止されます。
    3. @reverse エントリに関連付けられた値が文字列であり、 キーワードの形式を持つ場合 (すなわち、[RFC5234] の ABNF 規則 "@"1*ALPHA に一致する場合)、 戻ります。プロセッサは警告を生成することが SHOULD です。
    4. それ以外の場合、definitionIRI マッピングを、 @reverse エントリに関連付けられた値を IRI 展開した結果に設定します。 その際、local contextdefined を使用します。 結果が 形式として IRIまたは 空白ノード 識別子でない場合、 invalid IRI mapping エラーが検出され、処理は中止されます。
    5. value@container エントリを含む場合、 definitionコンテナマッピングを、 その値を含む 配列に設定します。 その値が @set@indexnull の いずれでもない場合、 invalid reverse property エラーが検出され(逆プロパティは set コンテナおよび index コンテナのみをサポートします)、処理は中止されます。
    6. definition逆 プロパティフラグを true に設定します。
    7. active context 内の term用語定義definition に設定し、definedterm エントリに関連付けられた値を true に設定して、戻ります。
  14. valueエントリ @idを含み、その値が term と等しくない場合:
    1. value@id エントリnull である場合、その用語は IRI 展開には使用されませんが、 この用語の将来の再定義を検出できるように保持されます。
    2. それ以外の場合:
      1. @id エントリに関連付けられた値が 文字列でない場合、 invalid IRI mapping エラーが検出され、処理は中止されます。
      2. @id エントリに関連付けられた値が キーワードではないが、 キーワードの形式を 持つ場合 (すなわち、[RFC5234] の ABNF 規則 "@"1*ALPHA に一致する場合)、 戻ります。プロセッサは警告を生成することが SHOULD です。
      3. それ以外の場合、definitionIRI マッピングを、 @id エントリに関連付けられた値を IRI 展開した結果に設定します。 その際、local contextdefined を使用します。 結果の IRI マッピングキーワードIRI、または 空白 ノード識別子のいずれでもない場合、 invalid IRI mapping エラーが検出され、処理は中止されます。それが @context と等しい場合、 invalid keyword alias エラーが検出され、処理は中止されます。
      4. term が 最初または最後の文字以外のどこかにコロン (:) を含む場合、 またはどこかにスラッシュ (/) を含む場合:
        1. definedterm エントリに 関連付けられた値を true に設定します。
        2. local contextdefined を使用して termIRI 展開した結果が、 definitionIRI マッピングと同じでない場合、 invalid IRI mapping エラーが検出され、処理は中止されます。
      5. term がコロン (:) もスラッシュ (/) も含まず、 simple termtrue でありdefinitionIRI マッピングが、 IRIgen-delim 文字で終わるもの、または 空白 ノード識別子のいずれかである場合、 definition 内の 接頭辞フラグtrue に設定します。
  15. それ以外の場合で、term がコロン (:) を 最初の文字の後のどこかに含む場合:
    1. termコンパクト IRIであり、 その 接頭辞local context 内の エントリである場合、 依存関係が見つかっています。このアルゴリズムを再帰的に使用し、 active contextlocal context接頭辞term として、そして defined を渡します。
    2. term接頭辞active context 内に 用語 定義を持つ場合、 definitionIRI マッピングを、 接頭辞IRI マッピングに関連付けられた値と termsuffix を連結した結果に設定します。
    3. それ以外の場合、termIRIまたは 空白ノード 識別子です。definitionIRI マッピングterm に設定します。
  16. それ以外の場合で、term がスラッシュ (/) を含む場合:
    1. Term相対 IRI 参照です。
    2. definitionIRI マッピングを、 termIRI 展開した結果に設定します。 結果の IRI マッピングIRIでない場合、 invalid IRI mapping エラーが検出され、処理は中止されます。
  17. それ以外の場合で、term が @type である場合、 definitionIRI マッピング@type に設定します。
  18. それ以外の場合で、active context語彙マッピングを持つ場合、 definitionIRI マッピングは、 語彙マッピングに関連付けられた値と term を連結した結果に設定されます。 語彙マッピングを持たない場合、 invalid IRI mapping エラーが検出され、処理は中止されます。
  19. valueエントリ @containerを含む場合:
    1. @container エントリに関連付けられた値として container を初期化します。これは @graph@id@index@language@list@set@type またはこれらのキーワードのいずれか 1 つだけを含む 配列@graph@id または @index のいずれかを含み、任意で @set を含む 配列、 または @set と、 @index@graph@id@type@language の任意の組み合わせを任意の順序で含む 配列 のいずれかであることが MUST です。 そうでなければ、 invalid container mapping が検出され、処理は中止されます。
    2. コンテナ値が @graph@id、または @typeである場合、 またはそれ以外で 文字列でない場合、 処理モードjson-ld-1.0 であれば、 invalid container mapping エラーを生成し、処理を中止します。
    3. definitionコンテナマッピングcontainer に設定し、 必要であれば 配列へ強制変換します
    4. definitionコンテナマッピング@type を含む場合:
      1. definition 内の type mapping が未定義であれば、それを @id に設定します。
      2. definition 内の type mapping@id でも @vocab でもない場合、 invalid type mapping エラーが検出され、処理は中止されます。
  20. valueエントリ @indexを含む場合:
    1. 処理モードjson-ld-1.0 である場合、または コンテナ マッピング@index を含まない場合、 invalid term definition が検出され、処理は中止されます。
    2. @index エントリに関連付けられた値として index を初期化します。 その値を IRI 展開した結果が IRIでない場合、 invalid term definition が検出され、処理は中止されます。
    3. definitionindex マッピングindex に設定します
  21. valueエントリ @contextを含む場合:
    1. 処理モードjson-ld-1.0 である場合、 invalid term definition が検出され、処理は中止されます。
    2. @context エントリに関連付けられた値として context を初期化します。これは ローカル コンテキストとして扱われます。
    3. コンテキスト処理アルゴリズムを呼び出し、 active contextlocal context として contextbase URLoverride protectedtrueremote contextsコピー、 および validate scoped contextfalse を使用します。 何らかのエラーが検出された場合、 invalid scoped context エラーが 検出され、処理は中止されます。
      注記

      コンテキスト処理アルゴリズムの結果は 破棄されます。これは定義時にエラーを検出するために呼び出されます。 使用される場合、そのコンテキストは再処理され、 アクティブ コンテキストに対し、 展開または 圧縮の一部として適用されます。

    4. definitionローカルコンテキストcontext に設定し、 base URLbase URL に設定します。
  22. valueエントリ @languageを含み、 エントリ @typeを 含まない場合:
    1. @language エントリに関連付けられた値として language を初期化します。これは null または 文字列のいずれかであることが MUST です。 language が [BCP47] の section 2.2.9に従って 整形式でない場合、 プロセッサは警告を発行することが SHOULD です。 そうでなければ、 invalid language mapping エラーが検出され、処理は中止されます。
    2. definition言語マッピングlanguage に設定します。
      注記
      プロセッサは 言語 タグを小文字に正規化してもかまいません(MAY)。
  23. valueエントリ @directionを含み、 エントリ @typeを 含まない場合:
    1. @direction エントリに関連付けられた値として direction を初期化します。これは null"ltr"、または "rtl" のいずれかであることが MUST です。そうでなければ、 invalid base direction エラーが検出され、処理は中止されます。
    2. definition方向マッピングdirection に設定します。
  24. valueエントリ @nestを含む場合:
    1. 処理モードjson-ld-1.0 である場合、 invalid term definition が検出され、処理は中止されます。
    2. definition 内の nest 値を、 @nest エントリに関連付けられた値で初期化します。 これは 文字列であることが MUST であり、 @nest 以外のキーワードであってはなりません(MUST NOT)。 そうでなければ、 invalid @nest value エラーが検出され、処理は中止されます。
  25. valueエントリ @prefixを含む場合:
    1. 処理モードjson-ld-1.0 である場合、または term がコロン (:) またはスラッシュ (/) を含む場合、 invalid term definition が検出され、処理は中止されます。
    2. 接頭辞 フラグを、 @prefix エントリに関連付けられた値に設定します。 これは ブール値であることが MUST です。そうでなければ、 invalid @prefix value エラーが検出され、処理は中止されます。
    3. definition接頭辞 フラグtrue に設定されており、 かつその IRI マッピングキーワードである場合、 invalid term definition が検出され、処理は中止されます。
  26. value が、@id@reverse@container@context@direction@index@language@nest@prefix@protected、 または @type 以外の エントリを含む場合、 invalid term definition エラーが 検出され、処理は中止されます。
  27. override protectedfalse で、 previous definition が存在し、かつ保護済みである場合:
    1. definitionprevious definition と同一でない場合 (protected の値を除く)、 protected term redefinition エラーが 検出され、 処理は中止されます。
    2. protected の値を保持するため、 definitionprevious definition に設定します。
  28. active context 内の term用語 定義definition に設定し、definedterm エントリに関連付けられた値を true に設定します。

4.3 逆コンテキストの作成

用語が複数あり、それらを選択して IRIを圧縮できる場合、 アルゴリズムの複雑さを考慮しつつ、用語の 選択が決定的であり、かつコンテキストに最も適した選択を表すことを保証しなければなりません。

用語を 選択するために、 逆コンテキストという概念が 導入されます。逆コンテキストは、 本質的には、与えられた アクティブコンテキストについて、 コンテナマッピングtype マッピング、および 言語マッピングを単純な 用語へマッピングする 逆引き表です。 逆コンテキストは、 アクティブコンテキスト圧縮に使用される場合にのみ 生成する必要があります。

逆 コンテキストを利用するには、特定の IRIに関連付けられた値について、 優先される コンテナマッピングのリストと、 type マッピングまたは 言語マッピングが 収集されます。 これらのパラメータはその後 用語選択アルゴリズムへ渡され、 値のマッピングに最も適切に一致する 用語を見つけます。

4.3.1 概要

この節は非規範的です。

与えられた アクティブ コンテキストについて 逆 コンテキストを作成するために、 アクティブ コンテキスト内の各 用語を、長さ順、短いものから順に訪問します (同じ長さの場合は辞書順で最小の 用語を選んで その同順位を解決します)。各 用語について、 コンテナマッピングtype マッピング または 言語マッピングの 合法的に一致し得る各組み合わせについて、 逆コンテキストに エントリが追加されます。不正な一致には、値の type マッピングまたは 言語マッピングと、 その 用語のものとの違いが 含まれます。用語コンテナマッピングtype マッピング、または 言語マッピングを持たない (またはこれらの何らかの組み合わせを持たない)場合、 特別なキー @none を使用して 逆コンテキスト内にエントリを持ちます。これにより、 用語選択アルゴリズムは、特定の IRIと値の組み合わせに対して、 より具体的に一致する 用語が利用できない場合に、 より汎用的な 用語を選択するようフォールバックできます。

言語タグの正規化は任意ですが、 逆コンテキストは、 正規化された 言語 タグに基づいてエントリを作成するため、表現にかかわらず適切な用語を選択できます。

4.3.2 アルゴリズム

このアルゴリズムは 1 つの必須入力を取ります: 逆コンテキストが 作成される対象の active context です。

  1. result を空の マップに初期化します。
  2. default language@none に初期化します。 active contextデフォルト言語を持つ場合、 default languageアクティブ コンテキストからの デフォルト言語へ設定し、 小文字に正規化します
  3. active context 内の各キー termおよび値 term definitionについて、 用語の短いものから順に (同じ長さの場合は辞書順で最小の 用語を選んで):
    1. term definitionnull である場合、 term圧縮中に選択できないため、次の termへ続けます。
    2. container@none に初期化します。 コンテナマッピングが空でない場合、 containerコンテナマッピングのすべての値を 辞書順で連結したものに設定します
    3. var を、 term definitionIRI マッピングの値に 初期化します。
    4. varresultエントリでない場合、 キーが var で値が空の マップである エントリresult に追加します。
    5. result 内の var エントリに関連付けられた値を、 変数 container map を使用して参照します。
    6. container mapcontainer エントリを持たない場合、 それを作成し、その値を 3 つの エントリを持つ新しい マップに設定します。 最初の エントリ@language で、その値は新しい空の マップです。2 番目の エントリ@type で、その値は新しい空の マップです。 そして 3 番目の エントリ@any で、その値は マップであり、処理中の termに 設定された @none エントリを持ちます
    7. container map 内の container エントリに関連付けられた値を、 変数 type/language map を使用して参照します。
    8. type/language map 内の @type エントリに 関連付けられた値を、変数 type map を使用して参照します。
    9. type/language map 内の @language エントリに 関連付けられた値を、変数 language map を使用して参照します。
    10. term definitionが、 term逆プロパティを表すことを示す場合:
      1. type map@reverse エントリを持たない場合、 それを作成し、その値を処理中の termに設定します。
    11. それ以外の場合で、term definition@none である type マッピングを 持つ場合:
      1. language map@any エントリを持たない場合、 それを作成し、その値を処理中の termに設定します。
      2. type map@any エントリを持たない場合、 それを作成し、その値を処理中の termに設定します。
    12. それ以外の場合で、term definitiontype マッピングを 持つ場合:
      1. type map が、term definition内の type マッピングに対応する エントリを持たない場合、 それを作成し、その値を処理中の termに設定します。
    13. それ以外の場合で、term definition言語 マッピング方向マッピングの両方を持つ場合:
      1. 新しい変数 lang dir を作成します。
      2. 言語マッピング方向マッピングのどちらも null でない場合、lang dir言語マッピング方向マッピングを アンダースコア("_")で区切って連結したものに設定し、 小文字に正規化します。
      3. それ以外の場合で、言語マッピングnull でない場合、 lang dir言語マッピングに設定し、 小文字に正規化します。
      4. それ以外の場合で、方向マッピングnull でない場合、 lang dir を、アンダースコア("_")を前置した 方向マッピングに設定します。
      5. それ以外の場合、lang dir@null に設定します。
      6. language maplang dir エントリを持たない場合、 それを作成し、その値を処理中の termに設定します。
    14. それ以外の場合で、term definition言語 マッピングを持つ場合(null の場合もあります):
      1. 言語マッピングnull と等しい場合、 language@null に設定します。それ以外の場合は 言語マッピングに設定し、 小文字に正規化します
      2. language maplanguage エントリを持たない場合、 それを作成し、その値を処理中の termに設定します。
    15. それ以外の場合で、term definition方向 マッピングを持つ場合(null の場合もあります):
      1. 方向マッピングnull と等しい場合、 direction@none に設定します。それ以外の場合は アンダースコア("_")を前置した 方向マッピングに設定します。
      2. language mapdirection エントリを持たない場合、 それを作成し、その値を処理中の termに設定します。
    16. それ以外の場合で、active contextデフォルト基底 方向を持つ場合:
      1. 変数 lang dir を、 デフォルト 言語デフォルト基底 方向をアンダースコア("_")で区切って連結したものとして 初期化し、小文字に正規化します。
      2. language maplang dir エントリを持たない場合、 それを作成し、その値を処理中の termに設定します。
      3. language map@none エントリを持たない場合、 それを作成し、その値を処理中の termに設定します。
      4. type map@none エントリを持たない場合、 それを作成し、その値を処理中の termに設定します。
    17. それ以外の場合:
      1. language mapdefault language エントリを持たない場合 (小文字に正規化した後)、 それを作成し、その値を処理中の termに設定します。
      2. language map@none エントリを持たない場合、 それを作成し、その値を処理中の termに設定します。
      3. type map@none エントリを持たない場合、 それを作成し、その値を処理中の termに設定します。
  4. result を返します。

4.4 用語選択

このアルゴリズムは、IRI 圧縮アルゴリズムを介して呼び出され、 アクティブコンテキスト逆コンテキストを使用して、 用語を見つけます。 この用語は、IRI圧縮するために最も適しています。 IRIに関連付けられた値についての 他の情報も与えられます。これには、どの コンテナ マッピング およびどの type マッピングまたは 言語マッピングを 値を表現するために最もよく使用すべきかが含まれます。

4.4.1 概要

この節は非規範的です。

逆コンテキストIRI用のエントリは、まず、優先される コンテナマッピングに従って、 与えられた順序で検索されます。一致する コンテナマッピングを持つ 用語の中では、 一致する type マッピングまたは 言語 マッピングを持つものが、 type マッピングまたは 言語マッピングを持たないものよりも 優先されます。一致する コンテナ マッピングを持つ 用語が 存在しない場合、与えられた type マッピングまたは 言語マッピングに一致する、 コンテナ マッピングを持たない 用語が選択されます。 それでも選択された 用語がない場合、 利用可能であれば、 type マッピングまたは 言語マッピングを持たない 用語が選択されます。 競合する type マッピングまたは 言語 マッピングを持つ 用語は 選択されません。同じマッピングを持つ 用語間の同順位は、 まず最短の用語を選択し、次に辞書順で最小の用語を選択することで解決されます。 これらの同順位は、 逆コンテキスト作成アルゴリズムを使用して 逆コンテキストを作成した際にすでに解決されているため、 自動的に解決されることに注意してください。

4.4.2 アルゴリズム

このアルゴリズムには 5 つの必須入力があります。それらは次のとおりです: active contextキーワードまたは IRIである var、 優先される コンテナマッピングの 順序付きリストを表す 配列 containers、 一致する type マッピングを持つ 用語を探すか、 言語マッピングを 持つものを探すかを示す 文字列 type/language、 および、探すべき type マッピングまたは 言語マッピングpreferred values の順序付きリストを表す 配列です。

  1. active contextnull逆コンテキストを持つ場合、 active context 内の 逆コンテキストを、 active context を使用して 逆コンテキスト作成アルゴリズムを呼び出した結果に設定します。
  2. inverse context を、 active context 内の 逆コンテキストの値に初期化します。
  3. container map を、 inverse context 内の var に関連付けられた値に初期化します。
  4. containers 内の各項目 container について:
    1. containercontainer mapエントリでない場合、 それに一致する コンテナ マッピングを持つ 用語は存在しないため、 次の container へ続けます。
    2. type/language map を、 container map 内の container エントリに関連付けられた値に 初期化します。
    3. value map を、 type/language map 内の type/language エントリに関連付けられた値に 初期化します。
    4. preferred values 内の各 item について:
      1. itemvalue mapエントリでない場合、 一致する type マッピングまたは 言語マッピングを持つ 用語は存在しないため、 次の item へ続けます。
      2. それ以外の場合、一致する用語が見つかりました。 value map 内の item エントリに関連付けられた値を 返します。
  5. 一致する用語は見つかりませんでした。null を返します。

4.4.3

この節は非規範的です。

以下の例は、異なる用語定義および値に対して、用語選択アルゴリズムがどのように 振る舞うかを示すことを意図しています。網羅的なものではなく、 アルゴリズムの異なる部分を説明することを意図しています。

言語マップ用語

用語定義が "@container": "@language" を持つ場合、@type を持たない 値 オブジェクトにのみ一致します。

データ型付き用語

用語定義がデータ型を持つ場合、一致するデータ型を持つ 値 オブジェクトにのみ一致します。

5. 展開アルゴリズム

以下の節では、JSON-LD 文書、IRI、および値を展開するためのアルゴリズムを説明します。

5.1 展開アルゴリズム

このアルゴリズムは JSON-LD 文書を展開します。これにより、すべての コンテキスト 定義が削除され、すべての 用語および コンパクト IRIIRI空白 ノード識別子、または キーワードへ展開され、 すべての JSON-LD 値配列内で 展開形式として表現されます。

5.1.1 概要

この節は非規範的です。

ルート element から開始し、完全に 展開された result が得られるまで、JSON-LD 文書を再帰的に処理できます。 element展開する際、 問題を分解するため、その型に応じてそれぞれを異なる方法で扱うことができます:

  1. elementnull である場合、展開するものはありません。
  2. それ以外の場合で、elementスカラーである場合、 値展開アルゴリズムに従ってそれを展開します。
  3. それ以外の場合で、element配列である場合、その各項目を 再帰的に展開し、新しい 配列で返します。
  4. それ以外の場合、elementマップです。その各 エントリを展開し、 それらを result に追加し、その後、各 エントリの各値を再帰的に展開します。 一部の エントリキーは 用語または コンパクト IRI であり、その他は キーワードであるか、 コンテキスト内に定義がないために単に無視されます。 すべての IRIは、 IRI 展開アルゴリズムを使用して展開されます。

最後に、result配列であることを保証した後、 result を返します。

注記

[RDF11-CONCEPTS] に基づく データモデルは、 複数の順序なしプロパティ値をサポートしませんが、 このアルゴリズムは展開中に順序なしの 配列内で見つかる可能性のある重複を削除しません。 § 6.1 圧縮アルゴリズム§ 7.1 平坦化アルゴリズムなどの他のアルゴリズムは、 順序なし配列から重複値を削除します。 この仕様の将来バージョンでは、配列値が集合を形成する場合に 重複する配列値を削除するよう更新される可能性があります。

5.1.2 アルゴリズム

このアルゴリズムは 4 つの必須入力変数と 3 つの任意入力変数を取ります。 必須入力は、active contextactive property、展開される elementおよび展開対象の元文書の documentUrlに関連付けられた base URLです。 任意入力は、 frameExpansion フラグであり、フレーム展開で使用される特殊な形式の入力を許可します。 また、ordered フラグは、 注記されている箇所で マップエントリのキーを 辞書順に並べるために使用されます。 そして from map フラグは、非伝播の コンテキストに関連付けられた アクティブコンテキスト内の 以前の 用語定義を戻す処理を制御するために使用されます。 渡されない場合、任意フラグは false に設定されます

このアルゴリズムは、 JSON-LD Frameの展開に固有の処理手順も実行します。フレームでは、@id および @type エントリは、IRIの配列または 空の マップを受け入れることができます。 値オブジェクトエントリも、 文字列配列、または空の マップを受け入れることができます。 フレーミングでは追加のキーワード エントリも使用します: (@explicit@default@embed@explicit@omitDefault、または @requireAll)であり、これらは展開を通じて保持されます。 JSON-LD Frameの特別な処理は、 frameExpansion フラグが true に設定されている場合に呼び出されます。

注記

Terms [JSON-LD11] で述べられているように、 前方互換性の問題を避けるため、用語@ 文字で始めるべきではありません。JSON-LD の将来バージョンで追加の キーワードが導入される可能性があるためです。 このアルゴリズムはそのような用語を他の用語と同様に扱います。すなわち、 IRIへマッピングされていない限り無視されます。 このアルゴリズムの実装は、そのような用語が検出された場合に警告を表示するための 実行時フラグを提供することを検討してもかまいません。

注記

空の 用語"")の使用は、 すべてのプログラミング言語が空の JSON キーを処理できるわけではないため許可されません。 このアルゴリズムの実装は、そのような用語が検出された場合に警告を表示するための 実行時フラグを提供することを検討してもかまいません。

注記

プロパティにラベルを付けるために 空白ノード 識別子を使用することは廃止されており、 JSON-LD の将来バージョンで削除される可能性があります。 このアルゴリズムの実装は、そのような用語が検出された場合に警告を表示するための 実行時フラグを提供することを検討してもかまいません。

  1. elementnull である場合、null を返します。
  2. active property@default である場合、 frameExpansion フラグを false に初期化します。
  3. active propertyactive context 内に ローカルコンテキストを持つ 用語定義を持つ場合、 property-scoped context をその ローカルコンテキストに初期化します。
  4. elementスカラーである場合、
    1. active propertynull または @graph である場合、 自由浮動の スカラーを削除するため、 null を返します。
    2. property-scoped context が定義されている場合、 コンテキスト処理アルゴリズムの結果に active context を設定します。 その際、active contextproperty-scoped contextlocal context として渡し、 active context 内の active property についての 用語定義からの base URL を渡します。
    3. 値展開アルゴリズムの結果を返します。 その際、 active contextactive property、および elementvalue として渡します。
  5. element配列である場合、
    1. 空の配列 result を初期化します。
    2. element 内の各 item について:
      1. このアルゴリズムを再帰的に使用した結果に expanded item を初期化します。 その際、active contextactive propertyitemelement として、 base URLframeExpansion ordered、 および from map フラグを渡します。
      2. active propertyコンテナマッピング@list が含まれ、 かつ expanded item配列である場合、 expanded item を、元の expanded item を値とする @list エントリを含む新しい マップに設定します。
      3. expanded item配列である場合、 その各項目を result に追加します。それ以外の場合で、 expanded item が null でない場合、それを result に追加します。
    3. result を返します。
  6. それ以外の場合、elementマップです。
  7. active context以前のコンテキストを持つ場合、 その active context は伝播されません。 from map が未定義または false であり、 かつ element@value へ展開される エントリを含まず、 かつ element@id へ展開される単一の エントリだけから構成されない場合 (エントリIRI 展開される)、 active contextactive context からの 以前のコンテキストに設定します。 これは、用語スコープ付き コンテキストのスコープが、新しい ノードオブジェクトの処理時には適用されないためです。
  8. property-scoped context が 定義されている場合、 コンテキスト処理アルゴリズムの結果に active context を設定します。 その際、active contextproperty-scoped contextlocal context として、 active property についての 用語定義からの base URLactive context内で渡し、 override protectedtrue を渡します。
  9. elementエントリ @context を含む場合、 コンテキスト処理アルゴリズムの結果に active context を設定します。 その際、active context@context エントリの値を local context として および base URLを渡します。
  10. type-scoped contextactive context に初期化します。 これは、以前の任意の 型スコープ付きコンテキストに関係する可能性のある値を 展開するために使用されます。
  11. element 内の各 key および value について、 key の辞書順で並べ、 keyIRI 展開されて @type になるものについて:
    1. 必要であれば、value配列に変換します。
    2. value の値である各 term について辞書順で処理し、 term文字列であり、 かつ type-scoped context 内の term用語定義ローカルコンテキストを持つ場合、 コンテキスト処理アルゴリズムの結果に active context を設定します。 その際、active contexttermローカルコンテキストの値を local context として、 active context 内の value についての 用語定義からの base URLを渡し、 propagatefalse を渡します。
  12. 2 つの空の マップresult および nestsを初期化します。 input type を、element 内で @type へ展開される最初の エントリの 最後の値の展開に初期化します(存在する場合)。 エントリはキーの辞書順で並べます。 一致したエントリのキーと値はいずれも IRI 展開されます。
  13. element 内の各 key および value について、 orderedtrue である場合は key の辞書順で:
    1. key@context である場合、次の key へ続けます。
    2. keyIRI 展開した結果に expanded property を初期化します。
    3. expanded propertynull であるか、コロン (:) を含まず、かつ キーワードでもない場合、 key を削除し、次の key へ続けます。
    4. expanded propertyキーワードである場合:
      1. active property@reverse と等しい場合、 invalid reverse property map エラーが検出され、処理は中止されます。
      2. result がすでに expanded propertyエントリを持つ場合、 @included または @type を除き (ただし 処理 モードjson-ld-1.0 である場合を除く)colliding keywords エラーが検出され、処理は中止されます。
      3. expanded property@id である場合:
        1. value文字列でない場合、 invalid @id value エラーが検出され、処理は中止されます。 frameExpansion フラグが設定されている場合、value は空の マップ、または 1 つ以上の 文字列配列であってもかまいません(MAY)。
        2. それ以外の場合、 valueIRI 展開した結果に expanded value を設定します。 その際、document relativetruevocabfalse を使用します。 frameExpansion フラグが設定されている場合、expanded value は、 1 つ以上の値の 配列になります。 文字列値は上記のように IRI 展開アルゴリズムを使用して展開されます。
      4. expanded property@type である場合:
        1. value文字列でも、 文字列配列でもない場合、 invalid type value エラーが検出され、処理は中止されます。 frameExpansion フラグが設定されている場合、value は空の マップ、 または @default の値が IRIに制限された デフォルト オブジェクトであってもかまいません(MAY)。 その他のすべての値は、 invalid type value エラーが検出され、処理が中止されることを意味します。
        2. value が空の マップである場合、 expanded valuevalue に設定します。
        3. それ以外の場合で、valueデフォルト オブジェクトである場合、@default の値を、 valueIRI 展開した結果に設定した 新しい デフォルト オブジェクトexpanded value を設定します。 その際、active context には type-scoped contextを使用し、 document relative には true を使用します。
        4. それ以外の場合、 各値を IRI 展開した結果に expanded value を設定します。 その際、active context には type-scoped contextを使用し、 document relative には true を使用します。
        5. result がすでに @type のエントリを持つ場合、 result 内の @type の値を expanded value の前に追加し、 必要であれば 配列へ変換します。
          注記
          文字列 value から 配列 expanded value への変換は含意されず、value の 形式は expanded value 内で保持されるべきです。
      5. expanded property@graph である場合、 このアルゴリズムを再帰的に使用した結果に expanded value を設定します。 その際、active contextactive property@graphelementvaluebase URLおよび frameExpansionordered フラグを渡し、 expanded value が 1 つ以上の マップからなる 配列であることを保証します
      6. expanded property@included である場合:
        1. 処理 モードjson-ld-1.0 である場合、 element から次の key へ続けます。
        2. このアルゴリズムを再帰的に使用した結果に expanded value を設定します。 その際、active contextactive propertynullelementvaluebase URL、 および frameExpansionordered フラグを渡し、 結果が 配列であることを保証します。
        3. expanded value のいずれかの要素が ノード オブジェクトでない場合、 invalid @included value エラーが検出され、処理は中止されます。
        4. result がすでに @included のエントリを持つ場合、 result 内の @included の値を expanded value の前に追加します。
      7. expanded property@value である場合:
        1. input type@json である場合、 expanded valuevalue に設定します。 処理 モードjson-ld-1.0 である場合、 invalid value object value エラーが検出され、処理は中止されます。
        2. それ以外の場合で、valueスカラー または null でない場合、 invalid value object value エラーが検出され、処理は中止されます。 frameExpansion フラグが設定されている場合、value は空の マップ、または スカラー 値の配列であってもかまいません(MAY)。
        3. それ以外の場合、expanded valuevalue に設定します。 frameExpansion フラグが設定されている場合、 expanded value は 1 つ以上の 文字列 値の 配列、 または空の マップを含む 配列になります。
        4. expanded valuenull である場合、result@value エントリnull に設定し、element から次の key へ続けます。この場合、@type エントリの意味は @value エントリの存在に依存するため、 null 値は保持される必要があります。
      8. expanded property@language である場合:
        1. value文字列でない場合、 invalid language-tagged string エラーが検出され、処理は中止されます。 frameExpansion フラグが設定されている場合、value は空の マップ、または 0 個以上の 文字列の 配列であってもかまいません(MAY
        2. それ以外の場合、expanded valuevalue に設定します。 value が [BCP47] の section 2.2.9 に従って 整形式でない場合、 プロセッサは警告を発行することが SHOULD です。 frameExpansion フラグが設定されている場合、 expanded value は 1 つ以上の 文字列 値の 配列、 または空の マップを含む 配列になります。
          注記
          プロセッサは 言語 タグを小文字に正規化してもかまいません(MAY)。
      9. expanded property@direction である場合:
        1. 処理 モードjson-ld-1.0 である場合、 element から次の key へ続けます。
        2. value"ltr" でも "rtl" でもない場合、 invalid base direction エラーが検出され、処理は中止されます。 frameExpansion フラグが設定されている場合、value は空の マップ、または 0 個以上の 文字列の 配列であってもかまいません(MAY)。
        3. それ以外の場合、expanded valuevalue に設定します。 frameExpansion フラグが設定されている場合、 expanded value は 1 つ以上の 文字列 値の 配列、 または空の マップを含む 配列になります。
      10. expanded property@index である場合:
        1. value文字列でない場合、 invalid @index value エラーが検出され、処理は中止されます。
        2. それ以外の場合、 expanded valuevalue に設定します。
      11. expanded property@list である場合:
        1. active propertynull または @graph である場合、自由浮動のリストを削除するため、 element から次の key へ続けます。
        2. それ以外の場合、 このアルゴリズムを再帰的に使用した結果に expanded value を初期化します。 その際、active contextactive propertyelementvaluebase URLおよび frameExpansionordered フラグを渡し、 結果が 配列であることを保証します
      12. expanded property@set である場合、 このアルゴリズムを再帰的に使用した結果に expanded value を設定します。 その際、active contextactive propertyelementvaluebase URLおよび frameExpansionordered フラグを渡します。
      13. expanded property@reverse である場合:
        1. valueマップでない場合、 invalid @reverse value エラーが検出され、処理は中止されます。
        2. それ以外の場合、 このアルゴリズムを再帰的に使用した結果に expanded value を初期化します。 その際、active contextactive property@reverseelementvaluebase URLおよび frameExpansionordered フラグを渡します。
        3. expanded value@reverse エントリ、 すなわち 2 回反転された プロパティを含む場合、 その各 property および item について次の手順を実行します:
          1. 値を追加するを使用して、 result 内の property エントリitem を追加します。 その際、as arraytrue を使用します。
        4. expanded value@reverse 以外の エントリを含む場合:
          1. result 内の @reverse エントリの値に reverse map を設定し、 必要であれば空の マップに 初期化します。
          2. expanded value 内の @reverse 以外の各 property および items について:
            1. items 内の各 item について:
              1. item値 オブジェクトまたは リスト オブジェクトである場合、 invalid reverse property value が検出され、処理は中止されます。
              2. 値を追加するを使用して、 reverse map 内の property エントリitem を追加します。 その際、as arraytrue を使用します。
        5. element から次の key へ続けます。
      14. expanded property@nest である場合、 nestskey を追加し、必要であれば空の 配列に初期化します。 element から次の key へ続けます。
      15. frameExpansion フラグが 設定されている場合で、 expanded property がその他のフレーミングキーワード (@default@embed@explicit@omitDefault、または @requireAll)のいずれかである場合、 展開アルゴリズムを再帰的に実行した結果に expanded value を設定します。 その際、active contextactive propertyelementvaluebase URLおよび frameExpansionordered フラグを渡します。
      16. expanded valuenull でない限り、 expanded property@value であり、 input type@json でない場合、 resultexpanded property エントリexpanded value に設定します。
      17. element から次の key へ続けます。
    5. container mapping を、 active context 内の keyコンテナ マッピングに初期化します。
    6. active context 内の key用語定義@jsontype マッピングを持つ場合、 expanded value を新しい マップに設定し、 エントリ @valuevalue に設定し、エントリ @type@json に設定します。
    7. それ以外の場合で、container mapping@language含みvalueマップである場合、 value言語マップから次のように展開されます:
      1. expanded value を空の 配列に初期化します。
      2. directionactive context からの デフォルト基底 方向に初期化します。
      3. アクティブ コンテキスト内の key用語 定義方向マッピングを持つ場合、 direction をその値で更新します。
      4. value 内の各キー-値ペア language-language value について、 orderedtrue である場合は language の辞書順で:
        1. language value配列でない場合、 language value のみを含む 配列language value を設定します。
        2. language value 内の各 item について:
          1. itemnull である場合、 language value 内の次のエントリへ続けます。
          2. item文字列で なければなりません。そうでなければ、 invalid language map value エラーが検出され、処理は中止されます。
          3. 2 つのキー-値ペア (@value-item) および (@language-language) からなる新しい マップ v を初期化します。 item@none でもなく、 [BCP47] の section 2.2.9 に従って 整形式でもない場合、 プロセッサは警告を発行することが SHOULD です。
            注記
            プロセッサは 言語 タグを小文字に正規化してもかまいません(MAY)。
          4. language@none であるか、 @none へ展開される場合、 v から @language を削除します。
          5. directionnull でない場合、 direction を値として @directionエントリv に追加します。
          6. vexpanded value に追加します。
    8. それ以外の場合で、container mapping@index@type、または @id含みvalueマップである場合、 value はマップから次のように展開されます:
      1. expanded value を空の 配列に初期化します。
      2. index keyアクティブ コンテキスト内の keyindex マッピングに初期化し、 存在しない場合は @index に初期化します。
      3. value 内の各キー-値ペア index-index value について、 orderedtrue である場合は index の辞書順で:
        1. container mapping@id または @type を含む場合、 active context以前のコンテキストが存在すれば map context をそれに初期化し、 そうでなければ map contextactive context に設定します。
        2. container mapping@type を含み、 map context 内の index用語 定義ローカル コンテキストを持つ場合、 コンテキスト処理 アルゴリズムの結果に map context を更新します。 その際、map contextactive context として、 indexローカル コンテキストの値を local context として、 map context 内の index についての 用語 定義からの base URLを渡します。
        3. それ以外の場合、map contextactive context に設定します。
        4. indexIRI 展開した結果に expanded index を初期化します。
        5. index value配列でない場合、 index value のみを含む 配列index value を設定します。
        6. このアルゴリズムを再帰的に使用した結果に index value を初期化します。 その際、 map contextactive context として、 keyactive property として、 index valueelement として、 base URLfrom maptrue、 および frameExpansionordered フラグを渡します。
        7. index value 内の各 item について:
          1. container mapping@graph を含み、 かつ itemグラフ オブジェクトでない場合、 item を、キー-値ペア @graph-item を含む新しい マップに設定し、 その値が 配列を使用して表されることを保証します。
          2. container mapping@index を含み、 index key@index でなく、 かつ expanded index@none でない場合:
            1. 値展開 アルゴリズムを呼び出した結果に re-expanded index を初期化します。 その際、active contextactive property として index keyvalue として indexを渡します。
            2. index keyIRI 展開した結果に expanded index key を初期化します。
            3. index property values を、 re-expanded index に続いて item 内の expanded index key の 連結の既存値(存在する場合)を含む 配列に初期化します。
            4. キー-値ペア (expanded index key-index property values) を item に追加します。
            5. item が値オブジェクトである場合、 追加のプロパティを含んではならず(MUST NOT)、 invalid value object エラーが検出され、処理は中止されます。
          3. それ以外の場合で、container mapping@index を含み、 item@indexエントリを 持たず、 かつ expanded index@none でない場合、 キー-値ペア (@index-index) を item に追加します。
          4. それ以外の場合で、container mapping@id を含み、 item@idエントリを 持たず、 かつ expanded index@none でない場合、 キー-値ペア (@id-expanded index) を item に追加します。 ここで expanded index は、 indexIRI 展開した結果に設定され、 document relativetruevocabfalse を使用します。
          5. それ以外の場合で、 container mapping@type を含み、 かつ expanded index@none でない場合、 types を、expanded index に続いて item 内の @type の既存値を含む新しい 配列に初期化します。 キー-値ペア (@type-types) を item に追加します。
          6. itemexpanded value に追加します。
    9. それ以外の場合、 このアルゴリズムを再帰的に使用した結果に expanded value を初期化します。 その際、active contextactive propertykeyelementvaluebase URLおよび frameExpansionordered フラグを渡します。
    10. expanded valuenull である場合、key を無視し、 element から次の key へ続けます。
    11. container mapping@list含み、 かつ expanded value がまだ リストオブジェクトでない場合、 expanded valueリストオブジェクトへ変換します。 まず、それがまだ 配列でない場合には、 expanded value のみを含む 配列に設定し、 次に、キー-値ペア @list-expanded value を含む マップに設定します。
    12. container mapping@graph含み@id@index も含まない場合、 必要であれば expanded value配列へ変換し、 その後、expanded value 内の各値 evグラフ オブジェクトへ変換します:
      1. evグラフオブジェクトへ変換します。 そのために、キー-値ペア @graph-ev を含む マップを作成し、 ev配列として表されます。
        注記
        これにより、ev がすでに グラフ オブジェクトの形式であった場合、 グラフ オブジェクトが別の グラフ オブジェクトを含むことになる可能性があります。
    13. key に関連付けられた 用語定義が、 それが 逆プロパティであることを示す場合
      1. result@reverseエントリを持たない場合、 それを作成し、その値を空の マップに初期化します。
      2. result 内の @reverse エントリの値を、 変数 reverse map を使用して参照します。
      3. expanded value配列でない場合、 expanded value を含む 配列に設定します。
      4. expanded value 内の各 item について
        1. item値 オブジェクトまたは リスト オブジェクトである場合、 invalid reverse property value が検出され、処理は中止されます。
        2. reverse mapexpanded property エントリを持たない場合、 それを作成し、その値を空の 配列に初期化します。
        3. 値を追加するを使用して、 reverse map 内の expanded property エントリitem を追加します。 その際、as arraytrue を使用します。
    14. それ以外の場合、key逆プロパティではありません。 値を追加するを使用して、 result 内の expanded property エントリexpanded value を追加します。 その際、as arraytrue を使用します。
  14. nests 内の各キー nesting-key について、 orderedtrue である場合は 辞書順で:
    1. element 内の nesting-key の値に nested values を初期化し、それが 配列であることを保証します。
    2. nested values 内の各 nested value について:
      1. nested valueマップでない場合、 または nested value 内のいずれかのキーが @value へ展開される場合、 invalid @nest value エラーが 検出され、処理は中止されます。
      2. 手順 13 および 14 を、 nested valueelement として使用して再帰的に繰り返します。
        注記
        nested value に対して 手順 13 および 14 を呼び出すことで、 任意のレベルの入れ子を展開し、その結果を result にマージできます。 手順 13nested value 内の各エントリを反復処理して展開し、 各レベルで見つかった新しい nested values を収集します。 これは、すべての入れ子が抽出されるまで行われます。
  15. resultエントリ @value を含む場合:
    1. result は、 @direction@index@language@type、 および @value 以外の エントリを含んではなりません。 また、@language または @direction エントリのいずれかを含む場合、 @type エントリを含んではなりません。 そうでなければ、invalid value object エラーが検出され、処理は中止されます。
    2. result@type エントリ@json である場合、@value エントリは 任意の値を含むことができ、 JSON リテラルとして扱われます。
    3. それ以外の場合で、result@value エントリの値が null、または空の 配列である場合、null を返します。
    4. それ以外の場合で、result@value エントリの値が 文字列でなく、 かつ resultエントリ @language を含む場合、 invalid language-tagged value エラーが検出されます(言語タグ付きにできるのは 文字列のみです)、 そして処理は中止されます。
    5. それ以外の場合で、result@type エントリを持ち、 かつその値が IRIでない場合、 invalid typed value エラーが検出され、処理は中止されます。
  16. それ以外の場合で、resultエントリ @type を含み、 その関連付けられた値が 配列でない場合、 それを、関連付けられた値のみを含む 配列に設定します。
  17. それ以外の場合で、resultエントリ @set または @list を含む場合:
    1. result は多くとも 1 つの他の エントリを含むことができ、 それは @index でなければなりません。そうでなければ、 invalid set or list object エラーが検出され、処理は中止されます。
    2. resultエントリ @set を含む場合、 result を、その エントリに関連付けられた値に設定します。
  18. result@languageエントリのみを含む マップである場合、 null を返します
  19. active propertynull または @graph である場合、 自由浮動値を次のように削除します:
    1. result が空であるか、 エントリ @value または @list のみを含む マップである場合、 resultnull に設定します。
    2. それ以外の場合で、result が 唯一の エントリとして @id を持つ マップである場合、 resultnull に設定します。 frameExpansion フラグが設定されている場合、 @id エントリのみを含む マップは保持されます。
  20. result を返します。

5.2 IRI 展開

JSON-LD 文書では、一部のキーおよび値が IRIを表す場合があります。この節では、 文字列であり、IRIを表すものを、 絶対 IRIまたは 空白ノード識別子へ 変換するアルゴリズムを定義します。 また、キーワード別名キーワードへ変換することも扱います。

IRI 展開は、コンテキスト処理中または 他の任意の JSON-LD アルゴリズム中に発生することがあります。 IRI 展開がコンテキスト処理中に発生する場合、 ローカルコンテキストと、 コンテキスト処理アルゴリズムからの関連する defined マップがこのアルゴリズムへ渡されます。これにより、 用語定義の 依存関係を 用語定義作成アルゴリズムを介して処理できます。

5.2.1 概要

この節は非規範的です。

valueIRIへ展開するには、 まずそれが null用語キーワード別名、 または何らかの形式の IRIであるかを判定しなければなりません。 見つかった内容に基づき、特定の種類の展開を処理します。たとえば、 キーワード別名キーワードへ展開し、 用語を、 アクティブ コンテキスト内の IRI マッピングに従って、 IRIへ展開します。 value を調べている間に、コンテキスト処理中にこのアルゴリズムを実行しているため、 用語定義の依存関係を作成する必要があることもあります。 コンテキスト処理中に実行しているかどうかは、 ローカル コンテキストnull と照合することで判断できます。 valueローカルコンテキスト内の エントリであり、 defined マップが value について関連付けられた値が trueエントリを 持たない場合、 アクティブコンテキスト内に 用語定義を作成する必要があることがわかります。 defined マップは、どの 用語がすでに定義済みか、 または定義中かを追跡するために、 コンテキスト処理中に使用されます。 用語定義作成アルゴリズムを使用して 用語 定義を作成します。

注記

キーワードの形式を持つものの、 キーワードではない値(すなわち "@" で始まる値)は、 将来の使用のために予約されているため、どの値にもマップされません。 このアルゴリズムは null を返し、そのような値が遭遇されたときに無視されるようにします。

5.2.2 アルゴリズム

このアルゴリズムは 2 つの必須入力変数と 4 つの任意入力変数を取ります。 必須入力は、active context と、展開される value です。 任意入力は 2 つのフラグ、 document relativevocab であり、 value を、文書の基底 IRIに対する 相対 IRI 参照として解釈できるか、 または アクティブコンテキスト語彙 マッピングに対して解釈できるかを、それぞれ指定します。 また、コンテキスト処理中にこのアルゴリズムが使用される場合に用いる local context とマップ defined があります。 渡されない場合、2 つのフラグは false に設定され、 local contextdefinednull に初期化されます。

  1. valueキーワードまたは null である場合、 value をそのまま返します。
  2. value がキーワードの形式を持つ場合 (すなわち、[RFC5234] の ABNF 規則 "@"1*ALPHA に一致する場合)、 プロセッサは警告を生成し、null を返すことが SHOULD です。
  3. local contextnull でなく、 value と等しいキーを持つ エントリを含み、 かつ defined 内の value についての エントリの値が true でない場合、 用語定義作成アルゴリズムを呼び出し、 active contextlocal contextvalueterm として、そして defined を渡します。 これにより、コンテキスト処理中に active context 内で value についての 用語 定義が作成されることが保証されます。
  4. active contextvalue についての 用語定義を持ち、 関連付けられた IRI マッピングキーワードである場合、 その キーワードを返します。
  5. vocabtrue であり、 active contextvalue についての 用語定義を持つ場合、 関連付けられた IRI マッピングを返します。
  6. value がコロン (:) を 最初の文字より後のどこかに含む場合、 それは IRIコンパクト IRI、または 空白ノード 識別子のいずれかです:
    1. value を、最初に出現するコロン (:) の位置で prefixsuffix に分割します。
    2. prefix がアンダースコア (_) である場合、 または suffix が二重スラッシュ (//) で始まる場合、value はすでに IRIまたは 空白ノード 識別子であるため、そのまま返します。
    3. local contextnull でなく、 prefix エントリを含み、かつ defined 内の prefix エントリの値が true でない場合、 用語定義作成アルゴリズムを呼び出し、 active contextlocal contextprefixterm として、 および defined を渡します。これにより、 コンテキスト処理中に active context 内で prefixについての 用語 定義が作成されることが保証されます。
    4. active contextprefix についての 用語定義を含み、 それが非 nullIRI マッピングを持ち、 かつその 用語定義接頭辞 フラグtrue である場合prefix に関連付けられた IRI マッピングsuffix を連結した結果を返します。
    5. value形式として IRIである場合value を返します。
  7. vocabtrue であり、 active context語彙マッピングを持つ場合、 語彙マッピングvalue を連結した結果を返します。
  8. それ以外の場合で、document relativetrue である場合、 valueactive context からの 基底 IRIに 対して解決した結果に設定します。[RFC3986] の section 5.2にある 基本アルゴリズムのみが使用されます。 構文ベース正規化も、 スキームベース正規化も 実行されません。IRI 参照で追加的に許可される文字は、 [RFC3987] の section 6.5に従い、 URI 参照において非予約文字が扱われるのと同じ方法で扱われます。
  9. value をそのまま返します。

5.3 値展開

JSON-LD 内の一部の値は、 圧縮形式で表現できます。 これらの値は、JSON-LD 文書の処理時に 展開される必要がある場合があります。 このアルゴリズムの適用後、値は 展開形式であると言われます。

5.3.1 概要

この節は非規範的です。

アクティブプロパティが、 アクティブ コンテキスト内で @id または @vocab に設定された type マッピングを持ち、 かつ値が 文字列である場合、 単一の エントリ @id を持つ マップが 返されます。その値は、valueIRI 展開 アルゴリズムを使用した結果です。

それ以外の場合、結果は value を値に設定した @value エントリを含む マップになります。 さらに、アクティブプロパティに関連付けられた type マッピングがある場合は、 @type エントリが含まれます。 または、value文字列であり、 アクティブ プロパティに関連付けられた 言語マッピングがある場合は、 @language エントリが含まれます。

IRIとして解釈される値は、 2 つのカテゴリに分かれることに注意してください: document relative なものと、 語彙相対なものです。プロパティおよび @type の値、 ならびに "@type": "@vocab" としてマークされた用語は 語彙相対です。つまり、それらは定義済みの 用語コンパクト IRIであって 接頭辞用語であるもの、 または 語彙マッピングを使用して IRIへ変換される文字列である必要があります。

5.3.2 アルゴリズム

このアルゴリズムは 3 つの必須入力を取ります: active contextactive property、および展開する value です。

  1. active propertyactive context 内に @id である type マッピングを持ち、 かつ value文字列である場合、 キーが @id で、値が valueIRI 展開した結果である単一の エントリを含む 新しい マップを返します。 その際、document relativetruevocabfalse を使用します。
  2. active propertyactive context 内に @vocab である type マッピングを持ち、 かつ value文字列である場合、 キーが @id で、値が valueIRI 展開した結果である単一の エントリを含む 新しい マップを返します。 その際、document relativetrue を使用します。
  3. それ以外の場合、result を、 値が value に設定された @value エントリを持つ マップに初期化します。
  4. active propertyactive context 内に type マッピングを持ち、 @id@vocab、または @none 以外である場合、 @typeresult に追加し、その値を type マッピングに 関連付けられた値に設定します。
  5. それ以外の場合で、value文字列である場合:
    1. language を、active context 内の active property についての 言語マッピングに初期化します。 存在しない場合は、active contextデフォルト言語に初期化します。
    2. direction を、active context 内の active property についての 方向マッピングに初期化します。 存在しない場合は、active contextデフォルト基底 方向に初期化します。
    3. languagenull でない場合、 @languageresult に追加し、その値を language に設定します。
    4. directionnull でない場合、 @directionresult に追加し、その値を direction に設定します。
  6. result を返します。

6. 圧縮アルゴリズム

以下の節では、JSON-LD 文書、IRI、および値を圧縮するためのアルゴリズムを説明します。

6.1 圧縮アルゴリズム

このアルゴリズムは、与えられた コンテキストが適用されるように、 JSON-LD 文書を圧縮します。これにより、 適用可能なすべての IRI用語または コンパクト IRIへ、 適用可能なすべての キーワードキーワード別名へ、 そして 展開形式で表現された 適用可能なすべての JSON-LD 値が、 文字列数値などの単純な値へ 短縮されなければなりません。

6.1.1 概要

この節は非規範的です。

ルート element から開始し、完全に 圧縮された result が得られるまで、JSON-LD 文書を再帰的に処理できます。 element圧縮する際、 問題を分解するため、その型に応じてそれぞれを異なる方法で扱うことができます:

  1. elementスカラーである場合、それは すでに 圧縮 形式であるため、そのまま返します。
  2. element配列である場合、その各項目を 再帰的に圧縮し、新しい 配列で返します。
  3. それ以外の場合、elementマップです。element 内の各 エントリの値は 再帰的に圧縮されます。一部の エントリキーは、 IRI 圧縮アルゴリズムを使用して、 用語または コンパクト IRIへ圧縮され、 その他は キーワードから キーワード別名へ圧縮されるか、 コンテキスト内に定義がないため単に 変更されずに残されます。 値は 値圧縮アルゴリズムを介して 圧縮形式へ変換されます。一部のデータは、 @index@language マップなど、コンテキスト内で指定された コンテナマッピングに基づいて再形成されます。

6.1.2 アルゴリズム

このアルゴリズムは、3 つの必須入力変数と 2 つの任意入力変数を取ります。 必須入力は、active contextactive property、 および圧縮される element です。 任意入力は、 compactArrays フラグ と、注記されている箇所で マップエントリのキーを 辞書順に並べるために使用される ordered フラグです。 渡されない場合、両方のフラグは false に設定されます

  1. type-scoped contextactive context に初期化します。 これは、以前の任意の 型スコープ付きコンテキストに関係する可能性のある値を 圧縮するために使用されます。
  2. elementスカラーである場合、それはすでに最も 圧縮された形式であるため、単に element を返します。
  3. element配列である場合:
    1. result を空の 配列に初期化します。
    2. element 内の各 item について:
      1. このアルゴリズムを再帰的に使用した結果に compacted item を初期化します。 その際、active contextactive propertyitemelement として、 および compactArraysordered フラグを渡します。
      2. compacted itemnull でない場合、それを result に追加します。
    3. result が空であるか、複数の値を含む場合、 または compactArraysfalse である場合、 または active property@graph または @set のいずれかである場合、 または active context 内の active property についての コンテナマッピング@list または @set のいずれかを含む場合、 result を返します。
    4. それ以外の場合、result 内の値を返します。
  4. それ以外の場合、elementマップです。
  5. active context以前のコンテキストを持つ場合、 その active context は伝播されません。 element@value エントリを含まず、 かつ element が単一の @id エントリだけから構成されない場合、 active contextactive context からの 以前のコンテキストに設定します。 これは、用語スコープ付き コンテキストのスコープが、 新しい ノードオブジェクトの処理時には 適用されないためです。
  6. active context 内の active property についての 用語定義ローカル コンテキストを持つ場合:
    1. コンテキスト処理アルゴリズムの結果に active context を設定します。 その際、active contextactive propertyローカルコンテキストの値を local context として、 active context 内の active property についての 用語定義からの base URL、 および override protectedtrueを渡します。
  7. element@value または @idエントリを持ち、 値圧縮アルゴリズムを使用した結果が スカラーである場合 (active contextactive property、および elementvalue として渡す)、 または active property についての 用語定義@jsontype マッピングを 持つ場合、 その結果を返します。
  8. elementリストオブジェクトであり、 active context 内の active property についての コンテナ マッピング@list含む場合、 このアルゴリズムを再帰的に使用した結果を返します。 その際、 active contextactive propertyelement 内の @list の値を element として、 および compactArraysordered フラグを渡します。
  9. active property@reverse と等しい場合は inside reversetrue に初期化し、 そうでなければ false に初期化します。
  10. result を空の マップに初期化します。
  11. element@type エントリを持つ場合、 その エントリの各 expanded type を 圧縮形式へ変換することで、 新しい配列 compacted types を作成して初期化します。 これは expanded typeIRI 圧縮することで行います。 次に、compacted types 内の各 term について 辞書順で:
    1. type-scoped context 内の term についての 用語定義ローカル コンテキストを持つ場合、 コンテキスト処理アルゴリズムの結果に active context を設定します。 その際、active context と、type-scoped context 内の termローカル コンテキストの値を local context として渡し、 type-scoped context 内の term についての 用語定義からの base URL、 および propagatefalseを渡します。
  12. element 内の各キー expanded property および値 expanded value について、 orderedtrue である場合は expanded property の辞書順で:
    1. expanded property@id である場合:
      1. expanded value文字列である場合、 compacted valueexpanded valueIRI 圧縮し、vocabfalse に設定することで 初期化します。
      2. aliasexpanded propertyIRI 圧縮することで 初期化します。
      3. resultaliasエントリを追加し、 その値を compacted value に設定して、次の expanded property へ続けます。
    2. expanded property@type である場合:
      1. expanded value文字列である場合、 compacted valueexpanded valueIRI 圧縮し、active contexttype-scoped context を使用することで 初期化します。
      2. それ以外の場合、expanded value@type 配列でなければなりません:
        1. compacted value を空の 配列に初期化します。
        2. expanded value 内の各項目 expanded type について:
          1. termexpanded typeIRI 圧縮し、 active contexttype-scoped context を 使用することで 設定します。
          2. termcompacted value に追加します。
      3. aliasexpanded propertyIRI 圧縮することで 初期化します。
      4. as array を、 処理 モードjson-ld-1.1 であり、 active context 内の alias についての コンテナマッピング@set を含む場合は true に初期化し、 そうでなければ compactArrays の否定に 初期化します。
      5. 値を追加するを使用して、 result 内の alias エントリcompacted value を追加します。 その際、as array を使用します。
      6. 次の expanded property へ続けます。
    3. expanded property@reverse である場合:
      1. このアルゴリズムを再帰的に使用した結果に compacted value を初期化します。 その際、active contextactive property@reverseelementexpanded valueおよび compactArraysordered フラグを渡します。
      2. compacted value 内の各 property および value について:
        1. active context 内の property についての 用語 定義が、property逆プロパティであることを示す場合
          1. as array を、 active context 内の property についての コンテナ マッピング@set を含む場合は true に初期化し、 そうでなければ compactArrays の否定に 初期化します。
          2. 値を追加するを使用して、 result 内の property エントリvalue を追加します。 その際、as array を使用します。
          3. compacted value から property エントリを 削除します。
      3. compacted value に残りの マップエントリがある場合、 すなわち、それが空の マップでない場合:
        1. alias@reverseIRI 圧縮することで 初期化します。
        2. resultalias エントリの値を compacted value に設定します。
      4. element から次の expanded property へ続けます。
    4. expanded property@preserve である場合:
      1. このアルゴリズムを再帰的に使用した結果に compacted value を初期化します。 その際、 active contextactive propertyelementexpanded valueおよび compactArraysordered フラグを渡します。
      2. expanded value が空の 配列でない限り、 result 内の @preserve の値として compacted value を追加します。
    5. expanded property@index であり、 active propertyactive context 内に @index含む コンテナマッピングを持つ場合、 圧縮結果は @index コンテナの内部に入るため、 @index エントリを削除し、 次の expanded property へ続けます。
    6. それ以外の場合で、expanded property@direction@index@language、 または @value である場合:
      1. aliasexpanded propertyIRI 圧縮することで 初期化します。
      2. resultaliasエントリを追加し、 その値を expanded value に設定して、次の expanded property へ続けます。
    7. expanded value が空の 配列である場合:
      1. item active propertyexpanded propertyIRI 圧縮することで初期化します。 その際、valueexpanded value を使用し、 reverseinside reverse を使用します
      2. active context 内の item active property についての 用語 定義nest 値 エントリnest term)を持つ場合:
        1. nest term@nest でなく、 または active context 内で @nest へ展開される 用語でもない場合、 invalid @nest value エラーが検出され、処理は中止されます。
        2. resultnest term エントリを持たない場合、 それを空の マップに初期化します。
        3. result 内の nest term の値に nest result を初期化します。
      3. それ以外の場合、nest resultresult に初期化します。
      4. 値を追加するを使用して、空の 配列nest result 内の item active property エントリに追加します。 その際、as arraytrue を使用します。
    8. この時点で、展開アルゴリズムにより、 expanded value配列でなければなりません。 expanded value 内の各項目 expanded item について:
      1. item active propertyexpanded propertyIRI 圧縮することで初期化します。 その際、valueexpanded item を使用し、 reverseinside reverse を使用します
      2. active context 内の item active property についての 用語 定義nest 値 エントリnest term)を持つ場合:
        1. nest term@nest でなく、 または active context 内で @nest へ展開される 用語でもない場合、 invalid @nest value エラーが検出され、処理は中止されます。
        2. resultnest term エントリを持たない場合、 それを空の マップに初期化します。
        3. result 内の nest term の値に nest result を初期化します。
      3. それ以外の場合、nest resultresult に初期化します。
      4. container を、active context 内の item active property についての コンテナマッピングに初期化します。 そのような コンテナマッピングがない場合は、新しい空の 配列に初期化します。
      5. as array を、 container@set を含む場合、 または item active property@graph または @list である場合は true に初期化し、 そうでなければ compactArrays の否定に 初期化します。
      6. このアルゴリズムを再帰的に使用した結果に compacted item を初期化します。 その際、 active contextactive propertyitem active propertyelementexpanded itemあわせて compactArraysordered フラグを渡します。 expanded itemリストオブジェクトまたは グラフオブジェクトである場合、 element には expanded item の代わりに それぞれ @list または @graph エントリの値を使用します。
      7. expanded itemリストオブジェクトである場合:
        1. compacted item配列でない場合、 compacted item のみを含む 配列compacted item を設定します。
        2. container@list を含まない場合:
          1. compacted itemリスト オブジェクトへ変換します。 そのために、それを マップに設定します。 そのマップは、キーが @listIRI 圧縮した結果であり、 値が元の compacted item である エントリを含みます。
          2. expanded item@index-valueエントリを含む場合、 compacted itemエントリを追加します。 そのキーは @indexIRI 圧縮した結果であり、 値は value です。
          3. 値を追加するを使用して、 nest result 内の item active property エントリcompacted itemを追加します。 その際、as array を使用します。
        3. それ以外の場合、nest result 内の item active property エントリの値を compacted item に設定します。
      8. expanded itemグラフオブジェクトである場合:
        1. container@graph および @id を含む場合:
          1. map objectnest result 内の item active property の値に初期化し、 必要であれば新しい空の マップに 初期化します。
          2. map keyexpanded item 内の @id の値を IRI 圧縮したもの、またはそのような値が存在しない場合は @none に初期化します。 expanded item 内に @id エントリがある場合は、 vocabfalse に設定します
          3. 値を追加するを使用して、 map object 内の map key エントリに compacted itemを追加します。 その際、as array を使用します。
        2. それ以外の場合で、container@graph および @index を含み、 かつ expanded item単純な グラフオブジェクトである場合:
          1. map objectnest result 内の item active property の値に初期化し、 必要であれば新しい空の マップに 初期化します。
          2. map key を、 expanded item 内の @index の値、 またはそのような値が存在しない場合は @none に初期化します。
          3. 値を追加するを使用して、 map object 内の map key エントリに compacted itemを追加します。 その際、as array を使用します。
        3. それ以外の場合で、container@graph を含み、 かつ expanded item単純な グラフオブジェクトである場合、 その値はマップオブジェクトとして表現できません。
          1. compacted item が複数の値を持つ 配列である場合、 複数のオブジェクトが異なる名前付きグラフとして解釈されるため、 直接表現できません。 compacted item を新しい マップに設定します。 そのマップは、@includedIRI 圧縮したものをキーとし、 元の compacted item を値として含みます。
          2. 値を追加するを使用して、 nest result 内の item active property エントリに compacted itemを追加します。 その際、as array を使用します。
        4. それ以外の場合、container@graph を含まないか、 または前述のいずれのケースにも一致しません。
          1. compacted item を、元の compacted item を値として使用し、 @graphIRI 圧縮したものをキーとして含む新しいマップに設定します。
          2. expanded item が @id エントリを含む場合、 compacted item にエントリを追加します。 そのキーは @idIRI 圧縮したものから得られ、 値は、expanded item 内の @id の値を IRI 圧縮し、 vocabfalse を使用したものです。
          3. expanded item が @index エントリを含む場合、 compacted item にエントリを追加します。 そのキーは @indexIRI 圧縮したものから得られ、 値は expanded item 内の @index の値です。
          4. 値を追加するを使用して、 nest result 内の item active property エントリに compacted itemを追加します。 その際、as array を使用します。
      9. それ以外の場合で、container@language@index@id、 または @type含みかつ container@graph を含まない場合:
        1. map objectnest result 内の item active property の値に初期化し、 必要であれば新しい空の マップに 初期化します。
        2. container の内容に基づき、 @language@index@id、または @type のいずれかを IRI 圧縮することで、 container key を初期化します。
        3. index key を、 active context 内の item active property に関連付けられた 用語 定義内の index マッピングの値に初期化し、 そのような値が存在しない場合は @index に初期化します。
        4. container@language を含み、 expanded item@value エントリを含む場合、 compacted item をその @value エントリに関連付けられた値に設定します。 expanded item 内の @language の値があれば、 map key をその値に設定します。
        5. それ以外の場合で、container@index を含み、 index key@index である場合、 expanded item 内の @index の値があれば、 map key をその値に設定します。
        6. それ以外の場合で、 container@index を含み、 index key@index でない場合:
          1. index keyIRI 圧縮することで、 container key を再初期化します。
          2. compacted item 内の container key の最初の値があれば、 map key をその値に設定します。
          3. compacted item 内の container key について残りの値がある場合、 値を追加するを使用して、 それらの残りの値を compacted item 内の container key に追加します。 そうでなければ、その エントリcompacted item から削除します。
        7. それ以外の場合で、container@id を含む場合、 map keycompacted item 内の container key の値に設定し、container keycompacted item から削除します。
        8. それ以外の場合で、container@type を含む場合:
          1. compacted item 内の container key の最初の値があれば、 map key をその値に設定します。
          2. compacted item 内の container key について残りの値がある場合、 値を追加するを使用して、 それらの残りの値を compacted item 内の container key に追加します。
          3. それ以外の場合、その エントリcompacted item から削除します。
          4. compacted item@id へ展開されるキーを持つ単一の エントリを含む場合、 このアルゴリズムを再帰的に使用した結果に compacted item を設定します。 その際、 active contextactive propertyitem active property、 および element には expanded item からの @id の単一の エントリで構成される マップを渡します。
        9. map keynull である場合、 @noneIRI 圧縮した結果に設定します。
        10. 値を追加するを使用して、 map object 内の map key エントリに compacted item を追加します。 その際、as array を使用します。
      10. それ以外の場合、 値を追加するを使用して、 nest result 内の item active property エントリに compacted itemを追加します。 その際、as array を使用します。
  13. result を返します。

6.2 IRI 圧縮

このアルゴリズムは、IRI用語または コンパクト IRIへ、または キーワードキーワード別名へ圧縮します。 IRIに関連付けられた値を渡すことで、 最もコンテキストに適した 用語の選択を補助できます。

6.2.1 概要

この節は非規範的です。

渡された IRInull である場合、 単に null を返します。 それ以外の場合、まず、その IRIまたは キーワードアクティブコンテキスト語彙 マッピングに対して相対的である場合に圧縮できる 用語を探します。 最も適切な 用語を選択するため、 渡された value についての情報を収集する必要がある場合があります。 この情報には、value を表現するための優先される コンテナマッピングtype マッピングまたは 言語マッピングを 判定することが含まれます。 JSON-LD リストの場合、 type マッピング または 言語マッピングは、 リスト内のすべての項目に対して機能する最も具体的な値に基づいて選択されます。 この情報が収集されると、 用語選択アルゴリズムへ渡され、 それが最も適切な 用語を返します。

用語が見つからず、 その IRIを圧縮するために使用できない場合、 アクティブコンテキスト語彙 マッピングが存在すれば、それを使用して IRIを圧縮しようとします。 IRIを圧縮できなかった場合、 コンパクト IRIを見つけようとします。 用語は、その 用語定義が 値 true接頭辞フラグを含む場合にのみ、 コンパクト IRIを作成するために使用されます。 適切な コンパクト IRIが存在せず、 compactToRelative オプションが true である場合、 その IRIは、文書の 基底 IRIを使用して 相対 IRI 参照へ変換されます。 最後に、その IRIまたは キーワードをなお圧縮できなかった場合、 それはそのまま返されます。

言語マッピングを考慮する場合、 方向マッピングも、 言語マッピングの有無にかかわらず 考慮され、 言語 マッピングは小文字に正規化されます。

このアルゴリズムが入力 IRIをそのまま返す場合で、 その IRIアクティブコンテキスト内で コンパクト IRIと誤認され得る場合、 このアルゴリズムはエラーを発生させます。 これは、元の IRIの曖昧でない表現を返す方法がないためです。

6.2.2 アルゴリズム

このアルゴリズムは、2 つの必須入力と 3 つの任意入力を取ります。 必須入力は、active context、 および圧縮される var です。 任意入力は、var に関連付けられた value、 渡された varアクティブコンテキスト語彙 マッピングを使用して圧縮すべきかを指定する vocab フラグ、 および 逆プロパティが圧縮されているかを指定する reverse フラグです。 渡されない場合、valuenull に設定され、 vocabreverse はいずれも false に設定されます。

  1. varnull である場合、null を返します。
  2. active contextnull逆コンテキストを持つ場合、 active context 内の 逆コンテキストを、 active context を使用して 逆コンテキスト作成アルゴリズムを呼び出した結果に設定します。
  3. inverse context を、 active context 内の 逆コンテキストの値に初期化します。
  4. vocabtrue であり、varinverse contextエントリである場合:
    1. default language を、 アクティブコンテキストデフォルト言語 (小文字に正規化)および デフォルト基底 方向に基づいて初期化します:
      1. アクティブ コンテキストデフォルト基底 方向null でない場合、 アクティブ コンテキストデフォルト 言語デフォルト基底 方向を、アンダースコア("_")で区切って連結し、 小文字に正規化したものに設定します。
      2. それ以外の場合、 アクティブ コンテキストデフォルト 言語があればそれを小文字に正規化したものに設定し、 なければ @none に設定します。
    2. value@preserve エントリを含む マップである場合、 @preserve の値から最初の要素を value として使用します。
    3. containers を空の 配列に初期化します。この 配列は、 value と互換性があるものに基づいて、 用語について優先される コンテナマッピングの順序付きリストを追跡するために使用されます。
      注記
      アルゴリズム手順は同じ値を containers に追加することがありますが、 最も適切な用語を選択するうえで、追加される順序が重要です。
    4. type/language@language に、 type/language value@null に初期化します。これら 2 つの 変数は、value と互換性があるものに基づいて、 用語について 優先される type マッピングまたは 言語 マッピングを追跡します。
    5. value@index エントリを含む マップであり、 かつ valueグラフオブジェクトでない場合、 値 @index および @index@setcontainers に追加します。
    6. reversetrue である場合、type/language@type に、type/language value@reverse に設定し、@setcontainers に追加します。
    7. それ以外の場合で、valueリストオブジェクトである場合、 type/language および type/language value を、 リスト内のすべての項目に対して機能する最も具体的な値に次のように設定します:
      1. @indexvalue 内の エントリでない場合、 @listcontainers に追加します。
      2. list を、value 内の @list エントリに関連付けられた 配列に初期化します。
      3. common type および common languagenull に初期化します。 list が空である場合、common languagedefault language に設定します。
      4. list 内の各 item について:
        1. item language@none に、 item type@none に初期化します。
        2. item@value エントリを含む場合:
          1. item@direction エントリを含む場合、 item language を、 item@language エントリ(存在する場合)と item@direction を、 アンダースコア("_")で区切って連結し、 小文字に正規化したものに設定します。
          2. それ以外の場合で、item@language エントリを含む場合、 item language をその関連付けられた値に設定し、 小文字に正規化します。
          3. それ以外の場合で、item@type エントリを含む場合、 item type をその関連付けられた値に設定します。
          4. それ以外の場合、item language@null に設定します。
        3. それ以外の場合、item type@id に設定します。
        4. common languagenull である場合、 common languageitem language に設定します。
        5. それ以外の場合で、item languagecommon language と等しくなく、かつ item@value エントリを含む場合、 リスト項目の言語が競合しているため、 common language@none に設定します。
        6. common typenull である場合、 common typeitem type に設定します。
        7. それ以外の場合で、item typecommon type と等しくない場合、 リスト項目の型が競合しているため、common type@none に設定します。
        8. common language@none であり、 common type@none である場合、 リスト内の項目間に共通の言語または型が存在しないことが検出されたため、 リスト内の項目の処理を停止します。
      5. common languagenull である場合、 common language@none に設定します。
      6. common typenull である場合、 common type@none に設定します。
      7. common type@none でない場合、 type/language@type に設定し、 type/language valuecommon type に設定します。
      8. それ以外の場合、type/language valuecommon language に設定します。
    8. それ以外の場合で、valueグラフオブジェクトである場合、 その特定の値に最も適したマッピングを優先します。
      1. value@index エントリを含む場合、 値 @graph@index および @graph@index@setcontainers に追加します。
      2. value@id エントリを含む場合、 値 @graph@id および @graph@id@setcontainers に追加します。
      3. @graph@graph@set、 および @setcontainers に追加します。
      4. value@index エントリを含まない場合、 値 @graph@index および @graph@index@setcontainers に追加します。
      5. value@id エントリを含まない場合、 値 @graph@id および @graph@id@setcontainers に追加します。
      6. @index および @index@setcontainers に追加します。
      7. type/language@type に設定し、 type/language value@id に設定します。
    9. それ以外の場合:
      1. value値オブジェクトである場合:
        1. value@direction エントリを含み、 かつ @index エントリを含まない場合、 type/language value を、 value@language エントリ(存在する場合)と value@direction エントリを アンダースコア("_")で区切って連結し、 小文字に正規化したものに設定します。 @language および @language@setcontainers に追加します。
        2. それ以外の場合で、value@language エントリを含み、 かつ @index エントリを含まない場合、 type/language value@language の値を小文字に正規化したものに設定し、 @languageおよび @language@setcontainers に追加します。
        3. それ以外の場合で、value@type エントリを含む場合、 type/language value を その関連付けられた値に設定し、type/language@type に設定します。
      2. それ以外の場合、type/language@type に設定し、 type/language value@id に設定し、 @id@id@set@type、および @set@typecontainers に追加します。
      3. @setcontainers に追加します。
    10. @nonecontainers に追加します。これは コンテナマッピングが存在しないことを表し、 最も汎用的であるため、最後に確認される コンテナマッピング値になります。
    11. 処理モードjson-ld-1.0 でなく、かつ valueマップでないか、 または @index エントリを含まない場合、 @index および @index@setcontainers に追加します。
    12. 処理モードjson-ld-1.0 でなく、 かつ value@value エントリのみを含む マップである場合、 @language および @language@setcontainers に追加します。
    13. type/language valuenull である場合、 type/language value@null に設定します。 これは、inverse context entry 内で null 値が格納されるキーです。
    14. preferred values を空の 配列に初期化します。 この 配列は、 用語type マッピングまたは 言語 マッピングについて、 優先される値を順番に示します。
    15. type/language value@reverse である場合、 @reversepreferred values に追加します。
    16. type/language value@id または @reverse であり、 かつ value@id エントリを含む マップである場合:
      1. value 内の @id エントリの値を IRI 圧縮した結果が、 active context 内に 用語 定義を持ち、 その IRI マッピングvalue 内の @id エントリの値と等しい場合、 @vocab@id、および @none を、この順序で preferred values に追加します。
      2. それ以外の場合、@id@vocab、および @none を、この順序で preferred values に追加します。
    17. それ以外の場合、type/language value および @none を、 この順序で preferred values に追加します。 value が、@list の値として空の array を持つ リストオブジェクトである場合、 type/language@any に設定します。
    18. @anypreferred values に追加します。
    19. preferred values が アンダースコア("_")を持つエントリを含む場合、 そのエントリのアンダースコアから文字列末尾までの部分文字列を preferred values に追加します。
    20. 用語選択アルゴリズムの結果に term を初期化します。 その際、 varcontainerstype/language、および preferred values を渡します。
    21. termnull でない場合、term を返します。
  5. この時点で、var を圧縮できる単純な 用語は存在しません。 vocabtrue であり、 active context語彙マッピングを持つ場合:
    1. var語彙 マッピングの値で始まり、 かつそれより長い場合、suffix を、 var のうち一致しない部分文字列に初期化します。 suffixactive context 内に 用語定義を持たない場合、 suffix を返します。
  6. varアクティブコンテキスト語彙マッピングを使用して圧縮できませんでした。 コンパクト IRIを作成しようとし、 まず compact IRInull に初期化します。この変数は、 作成された コンパクト IRIがあれば、それを格納するために使用されます。
  7. active context 内の各 用語定義 definition について:
    1. definitionIRI マッピングnull である場合、 その IRI マッピングvar と等しい場合、 その IRI マッピングvar の先頭にある部分文字列でない場合、 または definitiontrue接頭辞フラグを持たない場合、 definition のキーは 接頭辞として使用できません。 次の definition へ続けます。
    2. definition のキー、コロン(:)、 および definitionIRI マッピングの値の後に続く var の部分文字列を連結して、 candidate を初期化します。
    3. compact IRInull である場合、 candidate がより短い場合、 または同じ長さで辞書順で compact IRI より小さく、 かつ candidateactive context 内に 用語 定義を持たない場合、または、その 用語 定義var と等しい IRI マッピングを持ち、 かつ valuenull である場合、 compact IRIcandidate に設定します。
  8. compact IRInull でない場合、compact IRI を返します。
  9. IRI varコンパクト IRIと混同されないことを保証するため、 varIRI スキームが、 接頭辞フラグtrue に設定している アクティブコンテキスト内の いずれかの用語と一致し、 かつ var が二重スラッシュ(//)で先行される IRI オーソリティを持たない場合、 IRI confused with prefix エラーが検出され、 処理は中止されます。
  10. vocabfalse である場合、 active context からの 基底 IRIが存在すればそれを使用して、 var相対 IRI 参照へ変換します。
  11. 最後に、var をそのまま返します。

6.3 値圧縮

展開は、JSON-LD 内のすべての値を 展開形式へ変換します。 このアルゴリズムはその逆の操作を行い、 値を 圧縮形式へ変換します。このアルゴリズムは、 与えられた アクティブコンテキスト内の 用語定義に従って値を圧縮します。 その用語定義は、その値に関連付けられた アクティブプロパティに関連付けられています。

6.3.1 概要

この節は非規範的です。

圧縮する value は、@id または @value エントリのいずれかを持ちます。

前者の場合、 アクティブプロパティtype マッピング@id または @vocab に設定されており、 value@id エントリのみから構成され、 かつ アクティブプロパティコンテナマッピング@index含む場合は @index エントリも含むなら、 @id エントリに関連付けられた値を IRI 圧縮アルゴリズムで圧縮した結果を返すことで、 value文字列へ圧縮できます。 それ以外の場合、value は圧縮できず、そのまま返されます。

後者の場合、value@value エントリに関連付けられた値だけへ 圧縮できる可能性があります。 これは、アクティブプロパティが一致する type マッピングまたは 言語マッピングを持ち、 かつ @index エントリがないか、または アクティブプロパティコンテナマッピング@index含む場合に可能です。また、 @valuevalue 内の唯一の エントリであり (アクティブプロパティコンテナマッピング@index含む場合は @index エントリを除く)、 かつ、その関連付けられた値が 文字列でないか、 デフォルト 言語がないか、または アクティブプロパティについて明示的な null言語 マッピングがある場合にも可能です。

6.3.2 アルゴリズム

このアルゴリズムには3 つの必須入力があります: active contextactive property、および圧縮される valueです。

  1. resultvalue のコピーに初期化します。
  2. active contextnull逆コンテキストを持つ場合、 active context 内の 逆コンテキストを、 active context を使用して 逆コンテキスト作成アルゴリズムを呼び出した結果に設定します。
  3. inverse context を、 active context 内の 逆コンテキストの値に初期化します。
  4. language を、active context 内の active property についての 言語マッピングに初期化します。 存在しない場合は、active contextデフォルト言語に初期化します。
  5. direction を、active context 内の active property についての 方向マッピングに初期化します。 存在しない場合は、active contextデフォルト基底方向に 初期化します。
  6. value@id エントリを持ち、 @index 以外の他の エントリを持たない場合:
    1. active propertytype マッピング@id に設定されている場合、result を、 @id エントリに関連付けられた値を IRI 圧縮し、 vocabfalse を使用した結果に設定します。
    2. それ以外の場合で、active propertytype マッピング@vocab に設定されている場合、result を、 @id エントリに関連付けられた値を IRI 圧縮した結果に設定します。
  7. それ以外の場合で、value@type エントリを持ち、 その値が active propertytype マッピングと一致する場合、 result を、value@value エントリに関連付けられた値に設定します。
  8. それ以外の場合で、active propertytype マッピング@none である場合、 または value@type エントリを持ち、 かつ value 内の @type の値が active propertytype マッピングと 一致しない場合、 値圧縮は無効化されているため、value をそのままにします。
    1. result 内の @type の任意の値を、 @type エントリの値を IRI 圧縮した結果で置き換えます。
  9. それ以外の場合で、@value エントリの値が 文字列でない場合:
    1. value@index エントリを持ち、 かつ active property に関連付けられた コンテナマッピング@index を含む場合、 または value@index エントリを持たない場合、 result@value エントリに 関連付けられた値に設定します。
  10. それ以外の場合で、value@language エントリを持ち、 その値が language と正確に一致する場合 (それが null でない場合は 大文字小文字を区別しない比較を使用します)、 または languagenull である場合に存在しない場合、 かつ value@direction エントリを持ち、 その値が direction と正確に一致する場合 (それが null でない場合)、または directionnull である場合に存在しない場合:
    1. value@index エントリを持ち、 かつ active property に関連付けられた コンテナマッピング@index を含む場合、 または value@index エントリを持たない場合、 result@value エントリに 関連付けられた値に設定します。
  11. resultmap である場合、 result 内の各キーを、そのキーを IRI 圧縮した結果で置き換えます。
  12. result を返します。

7. 平坦化アルゴリズム

以下の節では、JSON-LD 文書を平坦化し、 ノードマップを作成し、空白ノードを生成するためのアルゴリズムを説明します。

7.1 平坦化アルゴリズム

このアルゴリズムは、ノードのすべての プロパティを単一の マップ に集め、すべての 空白ノード空白 ノード識別子を付与することで、展開済み JSON-LD 文書を平坦化します。 結果として得られるこの文書の一様な形は、特定のアプリケーションで JSON-LD データを処理するために必要なコードを大幅に簡素化する可能性があります。

7.1.1 概要

この節は非規範的です。

まず、 ノードマップ生成アルゴリズムを使用して node map が生成されます。これは、ノードのすべての プロパティを単一の マップに集めます。 次の手順で、node map平坦化文書形式の JSON-LD 文書に変換されます。

7.1.2 アルゴリズム

このアルゴリズムは、1 つの必須入力変数と 1 つの任意入力変数を取ります。 必須入力は、平坦化する element です。 任意入力は ordered フラグであり、注記されている箇所で マップエントリのキーを 辞書順に並べるために使用されます。 渡されない場合、 ordered フラグは false に設定されます

このアルゴリズムは、 空白ノード識別子生成アルゴリズムを使用して、 新しい 空白ノード 識別子を生成し、 既存の 空白ノード 識別子にラベルを付け直します。 空白ノード識別子生成アルゴリズムは、 identifier map を維持します。 これは、ソース文書内の空白ノード識別子が、 衝突を避けながら新しい空白ノード識別子へ一貫して再マップされることを保証するためです。 したがって、このアルゴリズムを実行する前に、identifier map はリセットされます。

  1. node map を、単一の エントリからなる マップに初期化します。そのキーは @default であり、その値は 空の マップです。
  2. ノードマップ生成アルゴリズムを実行し、 elementnode map を渡します。
  3. default graph を、node map@default エントリの値に初期化します。 これは デフォルトグラフを表す マップです。
  4. node map 内の各キー-値ペア graph name-graph について、 graph name@default でない場合、 orderedtrue であれば graph name の辞書順で並べ、 次の手順を実行します:
    1. default graphgraph nameエントリを持たない場合、 1 つ作成し、 その値を @id エントリからなる マップに初期化します。 その値は graph name に設定されます。
    2. default graph 内の graph name エントリに関連付けられた値を、 変数 entry を使用して参照します。
    3. entry@graph エントリを追加し、 それを空の 配列に 設定します。
    4. graph 内の各 id-node ペアについて、 orderedtrue であれば id の辞書順で並べ、 node の唯一の エントリ@id でない限り、 nodeentry@graph エントリに追加します。
  5. 空の 配列 flattened を初期化します。
  6. default graph 内の各 id-node ペアについて、 orderedtrue であれば id の辞書順で並べ、 node の唯一の エントリ@id でない限り、 nodeflattened に追加します。
  7. flattened を返します。

7.2 ノードマップ生成

このアルゴリズムは、渡された展開済み文書で表現されている グラフおよび ノードの索引付き表現を保持する マップ node map を作成します。 IRI によって一意に識別されていないすべての ノードには、 (新しい)空白ノード識別子が割り当てられます。 結果として得られる node map は、文書内のすべてのグラフについて マップエントリを持ち、 その値は、文書内で表現されているすべての ノードについて エントリを持つ別のオブジェクトです。 デフォルトグラフは @default エントリの下に格納され、 その他のすべてのグラフはそれらの グラフ名の下に格納されます。

7.2.1 概要

この節は非規範的です。

このアルゴリズムは、展開済み JSON-LD 文書を再帰的に走査し、 ノードのすべての エントリを 単一の マップに集めます。このアルゴリズムは、 マップ node map を更新します。そのキーは文書内で使用される グラフ名 を表し (デフォルト グラフ@default エントリの下に格納されます)、 その関連付けられた値は マップです。 これは グラフ内の ノードを索引付けします。 エントリの 値が ノード オブジェクトである場合、 それは @id エントリのみからなる ノードオブジェクトで置き換えられます。 ノードオブジェクト@id エントリを持たない場合、 または 空白ノード 識別子で識別される場合、 新しい 空白ノード識別子が生成されます。この 空白ノード 識別子のラベル付け直しは、 プロパティおよび @type の値に対しても行われます。

7.2.2 アルゴリズム

このアルゴリズムは、展開済み JSON-LD 文書 element と、 マップ node map への参照を入力として取ります。さらに、任意パラメータとして active graph(既定値は @default)、active subjectactive property、および マップ list への参照を持ちます。渡されない場合、 active subjectactive property、および listnull に設定されます。

  1. element が配列である場合、element 内の各 item を 次のように処理してから返します:
    1. このアルゴリズムを再帰的に実行し、itemelement として、 node mapactive graphactive subjectactive property、および list を渡します。
  2. それ以外の場合、elementマップです。 node mapアクティブグラフ エントリの値である マップを、 変数 graph を使用して参照します。 active subjectnull である場合、nodenull に設定し、そうでない場合は、 graphactive subject エントリを 変数 subject node を使用して参照します。
  3. element@type エントリ内の各 item について(存在する場合)、 または @type の値が存在し、かつ 配列でない場合は @type の値について:
    1. item空白ノード 識別子である場合、それを新しく 生成された空白ノード識別子で置き換えます。 その際、itemidentifier として渡します。
  4. element@value エントリを持つ場合、次の手順を実行します:
    1. listnull である場合:
      1. subject nodeactive property エントリを持たない場合、 それを作成し、その値を element を含む 配列に初期化します。
      2. それ以外の場合、subject nodeactive property エントリに関連付けられた 配列内の すべての項目と element を比較します。 element と等価な項目が存在しない場合、 element をその 配列に追加します。2 つの マップは、 等価な マップエントリを持つ場合に 等しいとみなされます。
    2. それ以外の場合、elementlist@list エントリに追加します。
  5. それ以外の場合で、element@list エントリを持つ場合、 次の手順を実行します:
    1. 単一の エントリ @list からなる新しい マップ result を初期化します。その値は空の 配列に初期化されます。
    2. このアルゴリズムを再帰的に呼び出し、element@list エントリの値を element として、 node mapactive graphactive subjectactive property、および resultlist として渡します。
    3. listnull である場合、 resultsubject nodeactive property エントリの値に 追加します。
    4. それ以外の場合、resultlist@list エントリに 追加します。
  6. それ以外の場合、elementノードオブジェクトです。次の手順を実行します:
    1. element@id エントリを持つ場合、 id をその値に設定し、その エントリelement から削除します。 id空白ノード 識別子である場合、それを新しく 生成された空白ノード識別子で置き換えます。 その際、ididentifier として渡します。
    2. それ以外の場合、id空白ノード識別子生成アルゴリズムの結果に設定します。 その際、nullidentifier として渡します。
    3. graphidエントリを含まない場合、 それを作成し、その値を単一の エントリ @id からなる マップに初期化します。 その値は id です。
    4. graphid エントリの値を、 変数 node を使用して参照します。
    5. active subjectマップである場合、逆プロパティ関係が 処理されています。次の手順を実行します:
      1. nodeactive property エントリを持たない場合、 それを作成し、その値を active subject を含む 配列に初期化します。
      2. それ以外の場合、nodeactive property エントリに関連付けられた 配列内の すべての項目と active subject を比較します。 active subject と等価な項目が存在しない場合、 active subject をその 配列に追加します。2 つの マップは、等価な マップエントリを持つ場合に 等しいとみなされます。
    6. それ以外の場合で、active propertynull でない場合、 次の手順を実行します:
      1. 単一の エントリ @id からなる新しい マップ reference を作成します。その値は id です。
      2. listnull である場合:
        1. subject nodeactive property エントリを持たない場合、 それを作成し、その値を reference を含む 配列に初期化します。
        2. それ以外の場合、 subject nodeactive property エントリに関連付けられた 配列内のすべての項目と reference を比較します。 reference と等価な項目が存在しない場合、 reference をその 配列に追加します。2 つの マップは、 等価な マップエントリを持つ場合に 等しいとみなされます。
      3. それ以外の場合、referencelist@list エントリに追加します。
    7. element@type エントリを持つ場合、 その関連付けられた 配列の各項目を、 node@type エントリに関連付けられた 配列に追加します。 ただし、それがすでにその 配列内にある場合を除きます。最後に、 @type エントリelement から削除します。
    8. element@index エントリを持つ場合、 node@index エントリを その値に設定します。node がすでに 異なる値を持つ @index エントリを持つ場合、 conflicting indexes エラーが検出され、処理は中止されます。それ以外の場合、 @index エントリelement から削除して続行します。
    9. element@reverse エントリを持つ場合:
      1. 単一の エントリ @id を持つ マップ referenced node を作成します。その値は id です。
      2. reverse map を、element@reverse エントリの値に初期化します。
      3. reverse map 内の各キー-値ペア property-values について:
        1. values の各 value について:
          1. このアルゴリズムを再帰的に呼び出し、 valueelement として、 node mapactive graphreferenced nodeactive subject として、 そして propertyactive property として渡します。 active subjectマップを渡すことは、 逆プロパティ関係が処理されていることを アルゴリズムに示します。
      4. @reverse エントリelement から削除します。
    10. element@graph エントリを持つ場合、 このアルゴリズムを再帰的に呼び出し、 @graph エントリの値を element として、 node map、および idactive graph として渡します。 その後、 @graph エントリelement から削除します。
    11. element@included エントリを持つ場合、 このアルゴリズムを再帰的に呼び出し、@included エントリの値を element として、 node map、および active graph を渡します。 その後、@included エントリelement から削除します。
    12. 最後に、element 内の各キー-値ペア property-value について、 property の順序で次の手順を実行します:
      1. property空白 ノード識別子である場合、それを新しく 生成された空白ノード識別子で置き換えます。 その際、propertyidentifier として渡します。
        注記
        プロパティにラベルを付けるために 空白 ノード識別子を使用することは廃止されており、 JSON-LD の将来バージョンで削除される可能性があります。
      2. nodeproperty エントリを持たない場合、 それを作成し、その値を空の 配列に初期化します。
      3. このアルゴリズムを再帰的に呼び出し、valueelement として、 node mapactive graphidactive subject として、 そして propertyactive property として渡します。

7.3 ノードマップのマージ

このアルゴリズムは、 ノードマップ生成アルゴリズムを使用して作成された graph map に含まれるすべてのグラフを使用して、 主語から ノードへの新しいマップを作成し、 node map に含まれる各グラフ内で特定の 主語について定義された情報を含む、 マージされた ノード オブジェクトを作成します。

  1. result を空の マップとして作成します。
  2. graph map 内の各 graph name および node map について、 さらに node map 内の各 id および node について:
    1. merged node を、result 内の id に対する値に初期化します。 存在しない場合は、 値が id である単一の エントリ @id からなる 新しい マップで 初期化します。
    2. node 内の各 property および values について:
      1. property@type 以外の キーワードである場合、 property と値を merged node に追加します。
      2. それ以外の場合、values からの各要素を merged node 内の property に対する値へマージし、 必要であれば空の 配列に初期化します。
  3. result を返します。

7.4 空白ノード識別子の生成

このアルゴリズムは、新しい 空白 ノード識別子を生成するため、または 新しい識別子の導入による衝突を避けるために、既存の 空白ノード識別子へ ラベルを付け直すために使用されます。

7.4.1 概要

この節は非規範的です。

最も単純なケースは、渡された identifier について identifier map 内にすでに 空白ノード識別子が存在する場合で、 その場合は単にそれが返されます。それ以外の場合、新しい 空白ノード識別子が 生成されます。渡された identifiernull でない場合、 identifier空白ノード 識別子に関連付けるエントリが identifier map 内に作成されます。

7.4.2 アルゴリズム

このアルゴリズムは、null である可能性のある単一の入力変数 identifier を取ります。このアルゴリズムは、 既存の 空白 ノード識別子を新しい 空白ノード 識別子へラベル付け直しするため、 identifier map を維持します。 これは呼び出し元のアルゴリズムが初期化されるときにリセットされます

  1. identifiernull でなく、 identifier map 内にエントリを持つ場合、マップされた識別子を返します。
  2. それ以外の場合、新しい一意の 空白ノード 識別子を生成します。
  3. identifiernull でない場合、 identifier map 内に identifier 用の新しいエントリを作成し、 その値を新しい 空白ノード 識別子に設定します。
  4. 新しい 空白ノード 識別子を返します。
注記

新しい 空白ノード 識別子を生成する方法の 1 つは、 カウンタを維持し、新しい識別子を生成するときにそれをインクリメントして、 _:b のような文字列に追加することです。

8. RDF シリアライズ/デシリアライズアルゴリズム

この節では、JSON-LD 文書を RDF データセットへデシリアライズするアルゴリズム、および その逆を説明します。このアルゴリズムは、マップ要素へのランダムアクセスを持つ インメモリ実装向けに設計されています。

8.1 JSON-LD を RDF へ デシリアライズするアルゴリズム

このアルゴリズムは、JSON-LD 文書を RDF データセットへデシリアライズします。 RDF では、空白ノードプロパティとして使用することは許可されませんが、 JSON-LD では許可される点に注意してください。したがって、既定では、 プロパティとして 空白ノードを含むことになった トリプルは、 JSON-LD を RDF として解釈する際に破棄されます。

注記

プロパティにラベルを付けるために 空白ノード 識別子を使用することは廃止されており、 JSON-LD の将来バージョンで削除される可能性があります。

rdfDirection オプションが null でない場合、 i18n-datatype または compound-literal 形式から 変換するために特別な処理が使用されます。

実装は、トリプルおよび グラフ名として、 整形式のもののみを生成しなければなりません(MUST):

8.1.1 概要

この節は非規範的です。

JSON-LD 文書は展開され、 ノードマップ生成アルゴリズムを使用して node map に変換されます。 これにより、文書内で表現される各グラフを抽出して平坦化でき、 各 ノードオブジェクトを 処理しやすくなります。 node map からの各グラフは、トリプルを抽出するために処理され、 そこに任意の(デフォルトでない)グラフ名が適用されて RDF データセットが作成されます。 node map 内の各 ノードオブジェクトは、 主語に対応する @id エントリを持ち、 その他の エントリ述語を表します。 各 エントリ値は、 IRIまたは 空白ノード識別子のいずれかであるか、 トリプルを生成するために RDF リテラルへ変換できます。 リストは、 リストから RDF への変換アルゴリズムを使用して RDF コレクションへ変換されます。

8.1.2 アルゴリズム

このアルゴリズムは、 マップ node map を取ります。 これは ノードマップ生成アルゴリズムの結果であり、 新しい グラフおよび トリプルが 追加される RDF データセット dataset も取ります。 また、2 つの任意入力変数 produceGeneralizedRdf および rdfDirection を取ります。 produceGeneralizedRdf オプションが true に設定されていない限り、 空白ノード述語を含む トリプルは出力から除外されます。

注記

プロパティにラベルを付けるために 空白ノード 識別子を使用することは廃止されており、 JSON-LD の将来バージョンで削除される可能性があります。 一般化 RDF データセットのサポートも同様であり、 したがって produceGeneralizedRdf オプションも 削除される可能性があります。

  1. node map 内の各 graph name および graph について、 graph name の順序で:
    1. graph name整形式でない場合、 次の graph name-graph ペアへ続けます。
    2. graph name@default である場合、 triplesdatasetdefaultGraph 属性の値に初期化します。 それ以外の場合、triples を空の RdfGraphとして初期化し、 その add メソッドを使用して、 graphNamegraph name を指定して dataset に追加します。
    3. graph 内の各 subject および node について、 subject の順序で:
      1. subject整形式でない場合、 次の subject-node ペアへ続けます。
      2. node 内の各 property および values について、 property の順序で:
        1. property@type である場合、 values 内の各 type について、 subjectpredicaterdf:type、および objecttype から構成される新しい RdfTripleを作成し、 type整形式でない場合を除き、 その add メソッドを使用して triples に追加します
        2. それ以外の場合で、propertyキーワードである場合、 次の property-values ペアへ続けます。
        3. それ以外の場合で、property空白 ノード識別子であり、 produceGeneralizedRdf オプションが true でない場合、 次の property-values ペアへ続けます。
          注記
          プロパティにラベルを付けるために 空白 ノード識別子を使用することは廃止されており、 JSON-LD の将来バージョンで削除される可能性があります。 一般化 RDF データセットのサポートも同様であり、 したがって produceGeneralizedRdf オプションも削除される可能性があります。
        4. それ以外の場合で、property整形式でない場合、 次の property-values ペアへ続けます。
        5. それ以外の場合、propertyIRIまたは 空白 ノード識別子です。values 内の各 item について:
          1. list triples を空の 配列として初期化します。
          2. subjectproperty、および item list triplesを渡して オブジェクトから RDF への変換 アルゴリズムを使用した結果から構成される トリプルを、 結果が null でない限り、 triplesadd メソッドを使用して triples に追加します。 null は、無視されなければならない 整形式でない リソース を示します。
          3. list triples からのすべての RdfTriple インスタンスを、 その add メソッドを使用して triples に追加します。

8.2 オブジェクトから RDF への変換

このアルゴリズムは、 ノードオブジェクトリストオブジェクト、または 値オブジェクトを取り、 トリプル目的語として使用される リソースへ変換します。 相対 IRI 参照を含む ノードオブジェクトが このアルゴリズムに渡された場合、null が返され、その結果生成される トリプルは 無視されます。 入力が リストオブジェクトである場合、 その入力から作成されたトリプルも返します。

8.2.1 概要

この節は非規範的です。

値オブジェクトは、 § 8.6 データの 往復変換で説明されているように RDF リテラルへ 変換される一方、 ノード オブジェクトIRI空白 ノード識別子、または null へ変換されます。

8.2.2 アルゴリズム

このアルゴリズムは 2 つの引数を取ります。item は、 値 オブジェクトリスト オブジェクト、または ノードオブジェクトのいずれかでなければならず(MUST)、 list triples は空の配列です。

  1. itemノードオブジェクトであり、 その @id エントリの値が 整形式でない場合、 null を返します。
  2. itemノードオブジェクトである場合、 その @id エントリに関連付けられた IRIまたは 空白ノード 識別子を返します。
  3. itemリストオブジェクトである場合、 item からの @list エントリに関連付けられた値と list triples を渡して、 リスト変換アルゴリズムの結果を返します。
  4. それ以外の場合、item値オブジェクトです。 value を、item 内の @value エントリに 関連付けられた値に初期化します。
  5. datatype を、item@type エントリに関連付けられた値に初期化し、 item がそのような エントリを持たない場合は null に初期化します。
  6. datatypenull でなく、 かつ 整形式IRIでも @json でもない場合、null を返します。
  7. item@language エントリを持ち、 それが 整形式でない場合、 null を返します。
  8. datatype@json である場合、 value内部表現を JSON へ変換した結果を使用して、 value正準字句形式へ変換し、 datatyperdf:JSON に設定します。
    課題
    JSON Canonicalization Scheme (JCS) [RFC8785] は、JSON 正準化の新興標準です。 この仕様は、そのような正準表現を要求するよう更新される可能性があります。 直列化の詳細がこの文書の将来改訂で変更される可能性があるため、 利用者は JSON リテラルの字句表現を RDF リテラルとして 依存することに注意する必要があります。
  9. valuetrue または false である場合、value§ 8.6 データの往復変換で説明されている 正準字句 形式である 文字列 true または false に設定します。 datatypenull である場合、 datatypexsd:boolean に設定します。
  10. それ以外の場合で、value が 非ゼロの小数部(modulo-1 演算の結果)を持つ 数値である場合、 または絶対値が 1021 以上である場合、 あるいは value数値であり datatypexsd:double と等しい場合、 value を [XMLSCHEMA11-2] で定義され、 § 8.6 データの往復変換で説明されている xsd:double正準 字句形式文字列へ変換します。 datatypenull である場合、 datatypexsd:double に設定します。
  11. それ以外の場合で、value数値である場合、 [XMLSCHEMA11-2] で定義され、 § 8.6 データの往復変換で説明されている xsd:integer正準 字句形式文字列へ変換します。 datatypenull である場合、 datatypexsd:integer に設定します。
    注記
    前の手順から、value には非ゼロの小数部がないことになります。
  12. それ以外の場合で、datatypenull である場合、 item が @language エントリを持つかどうかに応じて、 datatypexsd:string または rdf:langString に設定します。
  13. item@direction エントリを含み、 rdfDirectionnull でない場合、 item は特別な規則を使用してシリアライズされる 値オブジェクトです。
    1. language を、item 内の @language の値を 小文字に正規化したもの、またはそのようなエントリがない場合は空文字列 ("") に初期化します。
      注記
      一般に、言語タグは正規化されませんが、 i18n-datatype または compound-literal の値を作成する場合、 相互運用性を向上させるため、値は小文字に正規化されます。
    2. rdfDirectioni18n-datatype である場合、 datatype を、languageitem 内の @direction の値をアンダースコア ("_") で区切って連結した結果を https://www.w3.org/ns/i18n# に追加したものに設定します。 valuedatatype を使用して、 literalRDF リテラルとして初期化します。
      注記
      プロセッサは 言語 タグを小文字に正規化してもかまいません(MAY)。
      注記
      @direction@language なしで使用されることがあるため、 http://w3.org/ns/i18n#_ltr のように、 言語タグをエンコードしないデータ型 IRIを作成することは可能であり、正当です。
    3. それ以外の場合で、 rdfDirectioncompound-literal である場合:
      1. literal を新しい 空白ノードとして初期化します。
      2. literal を主語、 rdf:value を述語、item 内の @value の値を 目的語として使用して新しいトリプルを作成し、 それを list triples に追加します。
      3. item@language のエントリを持つ場合、 literal を主語、 rdf:language を述語、language を目的語として使用して 新しいトリプルを作成し、それを list triples に追加します。
      4. literal を主語、 rdf:direction を述語、item 内の @direction の値を目的語として使用して新しいトリプルを作成し、 それを list triples に追加します。
  14. それ以外の場合、valuedatatype を使用して、 literalRDF リテラルとして初期化します。 item@language エントリを持つ場合、 @language エントリに関連付けられた値を literal言語タグとして追加します。
  15. literal を返します。

8.3 リストから RDF への変換

リスト変換とは、 リストオブジェクトを取り、 RDF Semantics [RDF11-MT] で定義される RDF コレクションへ 変換する処理です。

8.3.1 概要

この節は非規範的です。

リストの各要素について、 新しい 空白ノード識別子が 割り当てられ、それを使用して rdf:first および rdf:rest が生成されます。この アルゴリズムはリストの先頭を返します。これは最初に割り当てられた 空白 ノード識別子、または リストが 空である場合は rdf:nil です。リスト要素が IRIを表す場合、 対応する rdf:first トリプルは省略されます。

8.3.2 アルゴリズム

このアルゴリズムは 2 つの入力を取ります: 配列 list と、 生成された トリプルを返すために使用される 空の 配列 list triples です。

  1. list が空である場合、rdf:nil を返します。
  2. それ以外の場合、list 内の各エントリについて 新しく生成された空白ノード識別子から構成される 配列 bnodes を作成します。
  3. bnodes からの subjectlist からの item の各ペアについて:
    1. embedded triples を新しい空の配列に初期化します。
    2. item を渡し、 embedded tripleslist triples として渡して、 オブジェクトから RDF への変換アルゴリズムを 使用した結果に object を初期化します。
    3. objectnull でない限り、 subjectrdf:first、および object から構成される トリプルlist triples に追加します。
    4. restbnodes 内の次のエントリに初期化し、 それが存在しない場合は rdf:nil に初期化します。 subjectrdf:rest、および rest から構成される トリプルlist triples に追加します。
    5. embedded triples からのすべての値を list triples に追加します
  4. bnodes から最初の 空白ノードを返し、 bnodes が空である場合は rdf:nil を返します。

8.4 RDF を JSON-LD として シリアライズするアルゴリズム

このアルゴリズムは、 デフォルトグラフと 0 個以上の 名前付きグラフからなる RDF データセットを JSON-LD 文書へシリアライズします。

RDF 抽象構文では、 RDF リテラルは、 [RDF11-CONCEPTS] で定義される 字句形式を持ちます。これらの リテラルの形式は、これらのリテラルに基づいて JSON-LD 値を作成する際に使用されます。

8.4.1 概要

この節は非規範的です。

データセット内の各グラフを反復処理し、各 RDF コレクションリストへ変換し、 すべての RDF リテラルIRI、 および 空白ノード 識別子について、展開形式の JSON-LD 文書を生成します。 useNativeTypes フラグが true に設定されている場合、 xsd:integer または xsd:double と等しい データ型 IRIを持つ RDF リテラルJSON 数値へ変換され、 xsd:boolean と等しい データ型 IRIを持つ RDF リテラルは、 § 8.6 データの 往復変換で説明されているように、その 字句形式に基づいて true または false へ変換されます。 useRdfType フラグが true に設定されていない限り、 rdf:type 述語は、関連付けられた目的語が IRIまたは 空白ノード 識別子のいずれかである限り、@type としてシリアライズされます。

rdfDirection オプションが null でない場合、 i18n-datatype または compound-literal 形式から 変換するために特別な処理が使用されます。

8.4.2 アルゴリズム

このアルゴリズムは 1 つの必須入力と 4 つの任意入力を取ります: 必須入力は RDF データセット dataset であり、 4 つの任意引数は、 ordered フラグです。既定値は false で、注記されている箇所で マップエントリのキーを 辞書順に並べるために使用されますrdfDirection は既定で nulluseNativeTypes フラグは既定で false、 そして useRdfType フラグは既定で false です。

dataset は、 RdfDataset 内に含まれる グラフおよび グラフ名を 反復処理するために iterableです。各 グラフも、 RdfGraph 内に 含まれる トリプルを反復処理するために iterableです。

  1. default graph を空の マップに初期化します。
  2. graph map を、単一の エントリ @default からなる マップに初期化します。その値は default graph を参照します。
  3. referenced once を空の マップに初期化します。
  4. compound literal subjects を空の マップに初期化します。
  5. dataset 内の各 graph について:
    1. graphデフォルトグラフである場合、 name@default に初期化し、それ以外の場合は graph に関連付けられた グラフ名に初期化します。
    2. graph mapname エントリを持たない場合、 1 つ作成し、その値を空の マップに設定します。
    3. compound literal subjectsname エントリを持たない場合、 1 つ作成し、その値を空の マップに設定します。
    4. graphデフォルトグラフでなく、 default graphname エントリを持たない場合、 そのような エントリを作成し、その値を、 単一の エントリ @id を持つ新しい マップに初期化します。 その値は name です。
    5. graph map 内の name エントリの値を、 変数 node map を使用して参照します。
    6. compound literal subjects 内の name エントリの値を、 変数 compound map を使用して参照します。
    7. graph 内の各 トリプルについて。 これは subjectpredicate、および objectから構成されます:
      1. node mapsubject エントリを持たない場合、 1 つ作成し、その値を マップに初期化します。 そのマップは、値が subject に設定された単一の エントリ @id から構成されます。
      2. node map 内の subject エントリの値を、 変数 node を使用して参照します。
      3. rdfDirection オプションが compound-literal であり、predicaterdf:direction である場合、 compound map 内に subject のエントリを追加し、その値を true に設定します。
      4. objectIRIまたは 空白 ノード識別子であり、 かつ node mapobject エントリを持たない場合、 1 つ作成し、その値を、値が object に設定された単一の エントリ @id からなる 新しい マップに初期化します。
      5. predicaterdf:type と等しく、 useRdfType フラグが true でなく、かつ objectIRIまたは 空白 ノード識別子である場合、 objectnode@type エントリの値に追加します。 ただし、そのような項目がすでに存在する場合を除きます。 そのような エントリが存在しない場合は、 それを作成し、object のみを含む 配列に初期化します。 最後に、次の トリプルへ続けます。
      6. objectrdfDirection、 および useNativeTypes を渡して RDF からオブジェクトへの変換アルゴリズムを 使用した結果に value を初期化します。
      7. nodepredicate エントリを持たない場合、 1 つ作成し、その値を空の 配列に初期化します。
      8. nodepredicate エントリに関連付けられた 配列内に value と等価な項目が存在しない場合、 value への参照をその 配列に追加します。2 つの マップは、 等価な マップエントリを持つ場合に 等しいとみなされます。
      9. objectrdf:nil である場合、 それは RDF コレクションの終端を表します:
        1. node mapobject エントリusages エントリを、 変数 usages を使用して参照します。
        2. 3 つの エントリ nodeproperty、および value からなる新しい マップusages 配列に追加します。 node エントリnode への参照に設定され、 propertypredicate に設定され、 valuevalue への参照に設定されます。
      10. それ以外の場合で、referenced onceobject のエントリを持つ場合、 referenced onceobject エントリfalse に設定します。
      11. それ以外の場合で、object空白 ノード識別子である場合、 それはリストノードを表している可能性があります:
        1. referenced onceobject エントリを、 3 つの エントリ nodeproperty、および value からなる新しい マップに設定します。 node エントリnode への参照に設定され、 propertypredicate に設定され、 valuevalue への参照に設定されます。
  6. graph map 内の各 name および graph object について:
    1. compound literal subjectsname のエントリを持つ場合、そのエントリ内のキーである各 cl について:
      1. cl entryreferenced once 内の cl の値に初期化し、 cl entryマップでない場合は 次の cl へ続けます。
      2. nodecl entry 内の node の値に初期化します。
      3. propertycl entry 内の property の値に初期化します。
      4. valuecl entry 内の value の値に初期化します。
      5. cl nodegraph object 内の cl の値に初期化し、その エントリgraph object から削除します。 cl nodeマップでない場合は、 次の cl へ続けます。
      6. node 内の property の値の 各 cl reference について。 ここで、cl reference 内の @id の値が cl であるもの:
        1. cl reference 内の @id エントリを削除します。
        2. cl reference に、rdf:value エントリから取得した値を持つ @valueエントリを追加します。
        3. cl reference に、存在する場合は cl node 内の rdf:language エントリから取得した値を持つ @languageエントリを追加します。 その値が [BCP47] の section 2.2.9 に従って 整形式でない場合、 invalid language-tagged string エラーが検出され、処理は中止されます。
        4. cl reference に、存在する場合は cl node 内の rdf:direction エントリから取得した値を持つ @directionエントリを追加します。 その値が "ltr" または "rtl" でない場合、 invalid base direction エラーが検出され、処理は中止されます。
    2. graph objectrdf:nil エントリを持たない場合、 そのグラフには変換が必要なリストが含まれていないため、 次の name-graph object ペアへ続けます。
    3. nil を、graph objectrdf:nil エントリの値に初期化します。
    4. nilusages エントリ内の各項目 usage について、次の手順を実行します:
      1. nodeusagenode エントリの値の値に初期化し、 propertyusageproperty エントリの値に初期化し、 headusagevalue エントリ の値に初期化します。
      2. 2 つの空の 配列 listlist nodes を初期化します。
      3. propertyrdf:rest と等しく、 node@id エントリの値が 空白 ノード識別子であり、 node@id エントリに関連付けられた referenced onceエントリの値が マップであり、 noderdf:first および rdf:rest エントリを持ち、 そのどちらの値も単一の要素からなる 配列であり、 かつ node が、値が rdf:List と等しい単一の項目を持つ配列である任意の @type エントリ以外に 他の エントリを持たない間、 node整形式リストノードを表します。 リストをその先頭へ向けて逆向きにたどるため、次の手順を実行します:
        1. noderdf:first エントリの唯一の項目を list 配列に追加します。
        2. node@id エントリの値を list nodes 配列に追加します。
        3. node@id エントリに関連付けられた referenced onceエントリの値に node usage を初期化します。
        4. nodenode usagenode エントリ の値に設定し、propertynode usageproperty エントリの値に設定し、 headnode usagevalue エントリ の値に設定します。
        5. node@id エントリが、 空白 ノード識別子ではなく IRIである場合、 while ループを終了します。
      4. @id エントリhead から削除します。
      5. list 配列の順序を反転します。
      6. head@list エントリを追加し、 その値を list 配列に初期化します。
      7. list nodes 内の各項目 node id について、 node id エントリgraph object から削除します。
  7. 空の 配列 result を初期化します。
  8. default graph 内の各 subject および node について、 orderedtrue である場合は subject の辞書順で:
    1. graph mapsubject エントリを持つ場合:
      1. node@graph エントリを追加し、 その値を空の 配列に初期化します。
      2. graph mapsubject エントリ内の各キー-値ペア s-n について、 orderedtrue である場合は s の辞書順で、 nusages エントリを削除した後、 n の残りの唯一の エントリ@id でない限り、 nnode@graph エントリに追加します。
    2. nodeusages エントリを削除した後、 node の残りの唯一の エントリ@id でない限り、 noderesult に追加します。
  9. result を返します。

8.5 RDF からオブジェクトへの変換

このアルゴリズムは、RDF リテラルを JSON-LD 値オブジェクトへ変換し、 RDF 空白 ノードまたは IRIを JSON-LD ノードオブジェクトへ変換します。

8.5.1 概要

この節は非規範的です。

RDF リテラル値オブジェクトへ 変換される一方、 IRIおよび 空白 ノード識別子ノード オブジェクトへ変換されます。

rdf:JSON データ型を持つリテラルは、 [JSON-LD11] の JSON データ型で定義された字句から値へのマッピングに基づく内部表現を使用し、 @type@json を使用して、値オブジェクトへ変換されます。

rdfDirection オプションが i18n-datatype に設定されている場合、 https://www.w3.org/ns/i18n# で始まるデータ型を持つリテラルは、 そのデータ型から 言語 タグおよび 基底方向をデコードすることで、 値オブジェクトへ変換されます。

rdfDirection オプションが compound-literal に設定されている場合、 rdf:direction を使用する空白ノードオブジェクトは、 rdf:valuerdf:language、および rdf:direction プロパティを デコードすることで 値オブジェクトへ変換されます。

useNativeTypes フラグが true に設定されている場合、 xsd:integer または xsd:double と等しい データ型 IRIを持つ RDF リテラルJSON 数値へ変換され、 xsd:boolean と等しい データ型 IRIを持つ RDF リテラルは、 § 8.6 データの 往復変換で説明されているように、その 字句形式に基づいて true または false へ変換されます。

8.5.2 アルゴリズム

このアルゴリズムは 3 つの必須入力を取ります: マップへ変換される valuerdfDirection、 およびフラグ useNativeTypes です。

  1. valueIRIまたは 空白ノード 識別子である場合、 値が value に設定された単一の エントリ @id からなる 新しい マップを返します。
  2. それ以外の場合、valueRDF リテラルです:
    1. 新しい空の マップ result を初期化します。
    2. converted valuevalue に初期化します。
    3. typenull に初期化します
    4. useNativeTypestrue である場合
      1. valueデータ型 IRIxsd:string と等しい場合、 converted valuevalue字句 形式に設定します。
      2. それ以外の場合で、valueデータ型 IRIxsd:boolean と等しい場合、 value字句 形式true に一致するなら converted valuetrue に設定し、 false に一致するなら false に設定します。 どちらにも一致しない場合は、 typexsd:boolean に設定します。
      3. それ以外の場合で、valueデータ型 IRIxsd:integer または xsd:double と等しく、かつその 字句 形式が [XMLSCHEMA11-2] に従って 有効な xsd:integer または xsd:double である場合、 converted value を、 字句 形式を JSON 数値へ 変換した結果に設定します。
    5. それ以外の場合で、 処理モードjson-ld-1.0 でなく、 かつ valueJSON リテラルである場合、 converted value を、 value の字句値を JSON-LD 内部表現へ変換した結果に設定し、 type@json に設定します。 value の字句値が [RFC8259] の JSON 文法に従って有効な JSON でない場合、 invalid JSON literal エラーが検出され、処理は中止されます。
    6. それ以外の場合で、valueデータ型 IRIhttps://www.w3.org/ns/i18n# で始まり、 かつ rdfDirectioni18n-datatype である場合:
      1. converted valuevalue字句形式に設定します。
      2. フラグメント 識別子のうち、 データ型 IRIの アンダースコア ("_") までの文字列接頭辞が空でない場合、 result@languageエントリを追加し、 その値をその接頭辞に設定します。
        注記
        @direction@language なしで使用されることがあるため、 http://w3.org/ns/i18n#_ltr のように、 言語タグをエンコードしないデータ型 IRIを 作成することは可能であり、正当です。
      3. result@directionエントリを追加し、 その値を、 アンダースコア ("_") に続く フラグメント 識別子の部分文字列に設定します。
    7. それ以外の場合で、value言語タグ付き 文字列である場合、 result@languageエントリを追加し、 その値を value言語タグに設定します。
    8. それ以外の場合、valueデータ型 IRItype に設定します。ただし、それが xsd:string と等しい場合は無視されます。
    9. result@valueエントリを追加し、 その値を converted value に設定します。
    10. typenull でない場合、 result@typeエントリを追加し、 その値を type に設定します。
    11. result を返します。

8.6 データの往復変換

JSON-LD を RDF へデシリアライズする場合、 JSON ネイティブの 数値は、 その 数値が 非ゼロの小数部を持つかどうか(modulo-1 演算の結果)に応じて、 自動的に xsd:integer または xsd:double に型強制され、 ブール値 true および falsexsd:boolean に強制され、 文字列xsd:string に強制されます。 JSON、数値、またはブール値そのものは、 正準字句形式、 すなわち [XMLSCHEMA11-2] で定義される 決定論的な文字列表現へ変換されます。

整数、すなわち非ゼロの小数部を持たず、 かつ絶対値が 1021 未満である 数値、 または xsd:integer に強制された 数値正準字句 形式は、任意の先頭のマイナス記号を持つ有限長の 10 進数字 (0-9) の列です。先頭のゼロは禁止されます。 JavaScript では、実装者は整数を 正準字句 形式へ変換するために、次のコード断片を使用できます:

20: JavaScript による整数シリアライズ実装の例
(value).toFixed(0).toString()

double、すなわち 非ゼロの小数部を持つか、絶対値が 1021 以上である 数値、 または xsd:double に強制された 数値正準字句 形式は、仮数部に文字 E が続き、その後に指数が続く形式です。 仮数部は 10 進数で、指数は整数です。指数内の先頭のゼロおよび 先頭のプラス記号 (+) は禁止されます。 指数がゼロである場合は E0 で示されます。 仮数部では、先頭の任意のプラス記号は禁止され、小数点は必須です。 先頭および末尾のゼロは禁止されますが、以下に従います: 数値表現は、小数点の左側にゼロでない単一の数字があり、 表される値がゼロでない限り、小数点の右側に少なくとも単一の数字があるように 正規化されなければなりません。 ゼロの正準表現は 0.0E0 です。 xsd:double の値空間は IEEE 倍精度 64 ビット浮動小数点型 [IEEE-754-2008] によって定義されますが、 JSON 数値の値空間は 指定されていません。JSON-LD を RDF へデシリアライズする際、仮数部は小数点以下 15 桁に丸められます。JavaScript では、実装者は double を 正準字句 形式へ変換するために、次のコード断片を使用できます:

21: JavaScript による浮動小数点数シリアライズ実装の例
(value).toExponential(15).replace(/(\d)0*e\+?/,'$1E')

ブール値 true および false正準字句 形式は、文字列 true および false です。

JSON リテラル正準字句形式は、 [RFC8259] の JSON 形式へ 内部表現をシリアライズした結果です。 これは、[JSON-LD11] の rdf:JSON データ型内の 値空間説明の制約に準拠します。

JSON ネイティブの 数値が RDF へデシリアライズされる場合、 丸め誤差が発生する可能性があるため、損失のないデータ往復変換は保証できません。 RDF を JSON-LD としてシリアライズする場合にも、 同様の丸め誤差が発生する可能性があります。さらに、データ型または字句表現が失われる可能性があります。 たとえば、値が 2.0xsd:double は、 RDF から JSON-LD へ、そして RDF へ戻す変換時に、 正準字句形式で値が 2xsd:integer になります。 実際には、xsd:integer の値空間は制限されていないため、 それを 数値へ 損失なく変換することは不可能な場合があることを強調することが重要です。 JSON 仕様 [RFC8259] も 数値の値空間を 制限していませんが、具体的な実装では通常、制限された値空間を持ちます。

損失のない往復変換を保証するため、 RDF を JSON-LD としてシリアライズするアルゴリズムは、 xsd:integerxsd:double、または xsd:boolean と等しい データ型 IRIを持つ RDF リテラルが それらの JSON ネイティブ対応物へ変換されるかどうかを制御する useNativeTypes フラグを指定します。 useNativeTypes フラグが false に設定されている場合、すべてのリテラルは元の文字列表現のままです。

一部の JSON シリアライザ、たとえば一部のバージョンの PHP ネイティブ実装は、 スラッシュ文字をバックスラッシュでエスケープします。たとえば、値 http://example.com/http:\/\/example.com\/ としてシリアライズされます。 これは、他の JSON パーサがそれらのエスケープ文字を理解できない可能性があるため問題です。 JSON-LD ではスラッシュをバックスラッシュでエスケープする必要はありません。 JSON-LD プロセッサ間の相互運用性を支援するため、 スラッシュはバックスラッシュでエスケープしてはなりません(MUST NOT)。

9. アプリケーションプログラミング インターフェイス

この API は、開発者が JSON-LD データを、扱いやすいことが多いさまざまな出力形式へ 変換できる明確な仕組みを提供します。

JSON-LD API は、さまざまな遅延操作の結果を表すために Promise を使用します。 Promise は [ECMASCRIPT] で定義されています。 仕様内での一般的な使用方法は [promises-guide] にあります。 実装は、同じメソッド、引数、オプションを一般に使用し、 同じ結果を返す限り、 ネイティブ環境に適した方法で実装を選択してもかまいません(MAY)。

注記

インターフェイスには [Exposed=JsonLd] が付けられており、 これによりグローバルインターフェイスが作成されます。 JSON-LD における WebIDL の使用は、ブラウザ内での使用に適していますが、 そのような使用に限定されるものではありません。

9.1 JsonLdProcessor インターフェイス

JsonLdProcessor インターフェイスは、開発者が JSON-LD 変換メソッドにアクセスするために使用する高レベルのプログラミング構造です。

実装は入力パラメータを変更しないことを強調しておくことが重要です。 エラーが検出された場合、Promise は、適切な code を持つ JsonLdError により reject され、処理は停止されます。

documentLoader オプションが指定されている場合、それはリモート文書およびコンテキストを参照解決するために使用されます。 返された RemoteDocument 内の documentUrlbase IRI として使用され、 contextUrl は HTTP Link Header を直接見る代わりに使用されます。簡潔さのため、 この文書内のいずれのアルゴリズムもこれを直接言及しません。

WebIDL/*
 * The JsonLd interface is created to expose the JsonLdProcessor interface.
 */
[Global=JsonLd, Exposed=JsonLd]
interface JsonLd {};

[Exposed=JsonLd]
interface JsonLdProcessor {
  constructor();
  static Promise<JsonLdRecord> compact(
    JsonLdInput input,
    optional JsonLdContext context = null,
    optional JsonLdOptions options = {});
  static Promise<sequence<JsonLdRecord>> expand(
    JsonLdInput input,
    optional JsonLdOptions options = {});
  static Promise<JsonLdRecord> flatten(
    JsonLdInput input,
    optional JsonLdContext context = null,
    optional JsonLdOptions options = {});
  static Promise<sequence<JsonLdRecord>> fromRdf(
    RdfDataset input,
    optional JsonLdOptions options = {});
  static Promise<RdfDataset> toRdf(
    JsonLdInput input,
    optional JsonLdOptions options = {});
};
compact()

指定された input を、 圧縮アルゴリズムの手順に従って context を使用して 圧縮します:

最終出力は、compacted output から導出された マップです。 compacted output配列である場合、 (別名化されている可能性のある)@graph のエントリとして含まれ、 その値は compacted output です。 それ以外の場合、compacted outputマップ結果として使用されます。 contextnull でない場合、 マップ結果に @context エントリが追加されます。

  1. 新しい Promise promise を作成し、それを返します。 その後、以下の手順は遅延されます。
  2. 提供された inputRemoteDocument である場合、 remote documentinput に初期化します。
  3. それ以外の場合で、提供された input がリモート文書の IRI を表す 文字列である場合、 inputurl として渡し、 options からの extractAllScripts オプションを extractAllScripts として渡して、 LoadDocumentCallback を使用し、 それを remote document として await して参照解決します。
  4. expanded input を、 expand() メソッドを使用した結果に設定します。 その際、remote document、または input 用の remote document が存在しない場合は input を使用し、 options を渡し、 orderedfalse に設定しextractAllScripts を既定で false にします
  5. context base を、利用可能であれば remote document からの documentUrl に設定し、そうでなければ options からの base オプションに設定します。
  6. context@context エントリを持つ マップである場合、 context をその エントリの値に設定し、 それ以外の場合は context に設定します。
  7. active context を、 コンテキスト処理 アルゴリズムの結果に初期化します。 その際、新しい空の コンテキストactive context として、 contextlocal context として、 そして context basebase URL として渡します。
  8. active context 内の base IRI を、 設定されている場合は options からの base オプションに設定します。 それ以外の場合で、 compactToRelative オプションが true であれば、 利用可能な場合は現在処理中の文書の IRI に設定し、 それ以外の場合は null に設定します。
  9. compacted output を、 圧縮アルゴリズムを使用した結果に設定します。 その際、 active contextactive propertynullelement として expanded input、 そして options からの compactArrays および ordered フラグを使用します。
    1. compacted output が空の 配列である場合、 それを新しい マップに置き換えます。
    2. それ以外の場合で、compacted output配列である場合、 単一の エントリを持つ 新しい マップに置き換えます。 そのキーは、 @graphIRI 圧縮 した結果であり、値は compacted output です。
    3. contextnull でなかった場合、 compacted output@context エントリを追加し、その値を 提供された context に設定します。
  10. compacted output内部 表現から JSON シリアライズへ変換してpromisecompacted output で resolve します。
input
圧縮を行う対象の マップマップの配列、 または圧縮する JSON-LD 文書を参照する IRI
context
input圧縮する際に使用するコンテキスト。 これは マップIRI、 または マップIRIからなる配列を使用して指定できます。
options
アルゴリズムを構成するためのオプションの集合です。 これにより、たとえば入力文書の base IRIを設定できます。 JsonLdOptions 型は 既定のオプション値を定義します。
expand()

指定された input を、 展開アルゴリズムの手順に従って 展開します:

  1. 新しい Promise promise を作成し、それを返します。 その後、以下の手順は遅延されます。
  2. 提供された inputRemoteDocument である場合、 remote documentinput に初期化します。
  3. それ以外の場合で、提供された input がリモート文書の IRI を表す 文字列である場合、 inputurl として渡し、 options からの extractAllScripts オプションを extractAllScripts として渡して、 LoadDocumentCallback を使用し、 それを remote document として await して参照解決します。
  4. remote document からの document文字列である場合、 内部 表現へ変換します。 document内部 表現へ変換できない場合、 loading document failed エラーを渡して promise を reject します。
  5. 新しい空の active context を初期化します。 active contextbase IRI および original base URL は、利用可能であれば remote document からの documentUrl に設定されます。 それ以外の場合は、options からの base オプションに設定されます。 設定されている場合、options からの base オプションは base IRI を上書きします。
  6. options 内の expandContext オプションが設定されている場合、 expandContextlocal context として、 そして active context からの original base URLbase URL として渡して、 コンテキスト処理アルゴリズムを使用して active context を更新します。 expandContext@context エントリを持つ マップである場合、 代わりにその エントリの値を local context として渡します。
  7. remote documentcontextUrl を持つ場合、 contextUrllocal context として渡し、 contextUrlbase URL として渡して、 コンテキスト処理アルゴリズムを使用して active context を更新します。
  8. expanded output を、 展開アルゴリズムを使用した結果に設定します。 その際、active contextremote document からの document、または remote document が存在しない場合は inputelement として、 active property として null、 利用可能な場合は documentUrlbase URL として、 そうでなければ options からの base オプションを渡し、 そして options からの frameExpansion および and ordered フラグを使用します。
    注記
    remote document が存在しない場合、 inputJsonLdRecord または JsonLdRecordssequence であり、 これらは暗黙にすでに 内部表現です。
    1. expanded output@graph エントリのみを含む マップである場合、 expanded output をその値に設定します。
    2. expanded outputnull である場合、 expanded output を空の 配列に設定します。
    3. expanded output配列でない場合、 expanded output のみを含む 配列expanded output を設定します。
  9. expanded output内部 表現から JSON シリアライズへ変換してpromiseexpanded output で resolve します。
input
展開を行う対象の マップ、 または マップの配列、 または展開する JSON-LD 文書を 参照する IRI
options
使用されるアルゴリズムを構成するためのオプションの集合です。 これにより、たとえば入力文書の base IRIを設定できます。 JsonLdOptions 型は 既定のオプション値を定義します。
flatten()

指定された input平坦化し、任意で提供された context を使用して 圧縮し平坦化アルゴリズムの手順に従います:

  1. 新しい Promise promise を作成し、それを返します。 その後、以下の手順は遅延されます。
  2. 提供された inputRemoteDocument である場合、 remote documentinput に初期化します。
  3. それ以外の場合で、提供された input がリモート文書の IRI を表す 文字列である場合、 inputurl として渡し、 options からの extractAllScripts オプションを extractAllScripts として渡して、 LoadDocumentCallback を使用し、 それを remote document として await して参照解決します。
  4. expanded input を、 expand() メソッドを使用した結果に設定します。 その際、remote document、または input 用の remote document が存在しない場合は input を使用し、 options を渡し、 orderedfalse に設定します
  5. 空の identifier map を初期化します。
  6. flattened output を、 平坦化アルゴリズムを使用した結果に設定します。 その際、expanded inputelement として渡し、 そして ordered フラグを options から渡します
    1. contextnull でない場合、 flattened output を、 compact() メソッドを使用した結果に設定します。 その際、flattened outputinput として、 context、 および options を使用します。 active context 内の base IRI を、 設定されている場合は options からの base オプションに設定し、 それ以外の場合で、 compactToRelative オプションが true であれば、 利用可能な場合は現在処理中の文書の IRI に設定し、 それ以外の場合は null に設定します。
  7. 必要であれば、flattened output内部 表現から JSON シリアライズへ変換してpromiseflattened output で resolve します。
input
平坦化を行う対象の マップ、 または マップの配列、 または平坦化する JSON-LD 文書を参照する IRI
context
平坦化された expanded input圧縮する際に使用するコンテキスト。 これは マップIRI、 または マップIRIからなる配列を使用して指定できます。 null の場合、結果は圧縮されず、展開形式のまま保持されます。
options
使用されるアルゴリズムを構成するためのオプションの集合です。 これにより、たとえば入力文書の base IRIを設定できます。 JsonLdOptions 型は 既定のオプション値を定義します。
fromRdf()

指定された input を、 RDF を JSON-LD としてシリアライズするアルゴリズムの 手順に従って、JSON-LD 文書展開形式で 変換します:

注記

このインターフェイスは、toRdf() メソッド以外に、 任意の入力から RdfDataset を作成する手段を定義しません。

  1. 新しい Promise promise を作成し、それを返します。 その後、以下の手順は遅延されます。
  2. expanded result を、 RDF を JSON-LD としてシリアライズするアルゴリズム メソッドを呼び出した結果に設定します。 その際、dataset および options を使用します。
  3. expanded result内部 表現から JSON シリアライズへ変換してpromiseexpanded result で resolve します。
input
マップ、 または マップの配列、 または平坦化する JSON-LD 文書を参照する IRI
options
使用されるアルゴリズムを構成するためのオプションの集合です。 これにより、たとえば入力文書の base IRIを設定できます。 JsonLdOptions 型は 既定のオプション値を定義します。
toRdf()

指定された input を、 JSON-LD を RDF へデシリアライズするアルゴリズムの 手順に従って RdfDatasetへ変換します:

  1. 新しい Promise promise を作成し、それを返します。 その後、以下の手順は遅延されます。
  2. expanded input を、 expand() メソッドを使用した結果に設定します。 その際、input および options を使用し、 orderedfalse に設定します
  3. 新しい RdfDataset dataset を作成します。
  4. 新しい マップ node map を作成します。
  5. ノードマップ生成アルゴリズムを呼び出し、 expanded inputelement として、 node map を渡します。
  6. JSON-LD を RDF へデシリアライズするアルゴリズム を呼び出し、 node mapdataset、 および options からの produceGeneralizedRdf フラグを渡します。
    注記
    プロパティにラベルを付けるために 空白 ノード識別子を使用することは廃止されており、 JSON-LD の将来バージョンで削除される可能性があります。 一般化 RDF データセットのサポートも同様であり、 したがって produceGeneralizedRdf オプションも 削除される可能性があります。
  7. promisedataset で resolve します。
input
マップ、 または マップの配列、 または平坦化する JSON-LD 文書を参照する IRI
options
使用されるアルゴリズムを構成するためのオプションの集合です。 これにより、たとえば入力文書の base IRIを設定できます。 JsonLdOptions 型は 既定のオプション値を定義します。
WebIDLtypedef record<USVString, any> JsonLdRecord;

JsonLdRecord は、 任意の マップ エントリを含むために使用される マップの定義です。 それらのエントリは、JSON Object を解析した結果です。

WebIDLtypedef (JsonLdRecord or sequence<JsonLdRecord> or USVString or RemoteDocument) JsonLdInput;

JsonLdInput インターフェイスは、 次のいずれかである可能性のある入力値を参照するために使用されます: JsonLdRecordJsonLdRecordssequence、 有効な JSON 文書を取得するために参照解決できる IRIを表す 文字列またはすでに参照解決済みの RemoteDocument

値が JsonLdRecord または JsonLdRecords の sequence である場合、 それらの値は等価な内部表現値として扱われます。 ここで、JsonLdRecordマップに相当し、 JsonLdRecords の sequence は マップ配列に相当します。 マップエントリは [INFRA] におけるそれらの等価物へ変換されます。

WebIDLtypedef (JsonLdRecord or sequence<(JsonLdRecord or USVString)> or USVString) JsonLdContext;

JsonLdContext インターフェイスは、 次のいずれかである可能性のある値を参照するために使用されます: JsonLdRecordJsonLdRecordssequence、 または有効な JSON 文書を取得するために参照解決できる IRIを表す 文字列

値が JsonLdRecord または JsonLdRecords の sequence である場合、 それらの値は等価な内部表現値として扱われます。 ここで、JsonLdRecordマップに相当し、 JsonLdRecords の sequence は マップ配列に相当します。 マップエントリは [INFRA] におけるそれらの等価物へ変換されます。

9.2 RDF データセットインターフェイス

RdfDataset インターフェイスは、 RDF データセットに対する操作を記述します。 これは JsonLdProcessor インターフェイス内の fromRdf() および toRdf() メソッドによって使用されます。 このインターフェイスは、新しい RDF データセットを構築するために使用できます。 それは defaultGraph 属性を介してアクセス可能な デフォルトグラフを持ちます。

WebIDL[Exposed=JsonLd]
interface RdfDataset {
  constructor();
  readonly attribute RdfGraph defaultGraph;
  void add(USVString graphName, RdfGraph graph);
  iterable<USVString?, RdfGraph>;
};
add()

RdfGraph とそれに関連付けられた グラフ名RdfDatasetに追加します。 JSON-LD を RDF へデシリアライズする アルゴリズムによって使用されます。

graphName
graph に関連付けられた グラフ名graphName整形式IRI または 空白ノード 識別子でなければなりません(MUST)。
graph
RdfDatasetに追加する RdfGraph
defaultGraph
RDF データセットに関連付けられた デフォルトグラフへのアクセスを提供します。
iterable
反復処理する値ペアは、 graph name-graph ペアのリストです。 graph namenullデフォルトグラフの場合)、 IRI、 または 空白ノード識別子であり、 graph は RdfGraph インスタンスです。

RdfGraph インターフェイスは、 JsonLdProcessor インターフェイス内の fromRdf() および toRdf() メソッドによって使用される RDF グラフに対する操作を記述します。 このインターフェイスは、新しい RDF グラフを構築するために使用できます。 これは 0 個以上の RdfTriple インスタンスで構成されます。

WebIDL[Exposed=JsonLd]
interface RdfGraph {
  constructor();
  void add(RdfTriple triple);
  iterable<RdfTriple>;
};
add()

RdfTripleRdfGraphに追加します。 JSON-LD を RDF へデシリアライズする アルゴリズムによって使用されます。

triple
RdfGraphに追加する RdfTriple
iterable
グラフに関連付けられた RdfTriple インスタンス上の 値イテレータです。 なお、特定の RdfTriple インスタンスは、 特定の RdfDataset インスタンス内の 複数のグラフに現れる可能性があります。

RdfTriple インターフェイスは トリプルを記述します。

WebIDL[Exposed=JsonLd]
interface RdfTriple {
  constructor();
  readonly attribute USVString subject;
  readonly attribute USVString predicate;
  readonly attribute (USVString or RdfLiteral) _object;
};
subject
トリプル主語を示す、 絶対 IRI または 空白ノード識別子
predicate
トリプル述語を示す、 絶対 IRI一般化 RDF データセットを表すために使用される場合、 これは 空白ノード 識別子でもかまいません。
注記
プロパティにラベルを付けるために 空白ノード 識別子を使用することは廃止されており、 JSON-LD の将来バージョンで削除される可能性があります。 一般化 RDF データセットのサポートも同様です。
object
トリプル目的語を示す、 絶対 IRI空白ノード 識別子、または リテラル

RdfLiteral インターフェイスは RDF リテラルを記述します。

WebIDL[Exposed=JsonLd]
interface RdfLiteral {
  constructor();
  readonly attribute USVString value;
  readonly attribute USVString datatype;
  readonly attribute USVString? language;
};
value
リテラルの字句値。
datatype
リテラルデータ型 IRIを示す、 絶対 IRI。 値が rdf:langString の場合、 language は指定されなければなりません(MUST)。
language
[BCP47] で定義される任意の 言語タグ。 この値が指定されている場合、datatyperdf:langString でなければなりません(MUST)。

9.3 JsonLdOptions 型

JsonLdOptions 型は、さまざまなオプションを JsonLdProcessor メソッドへ渡すために使用されます。

WebIDLdictionary JsonLdOptions {
  USVString?             base = null;
  boolean                compactArrays = true;
  boolean                compactToRelative = true;
  LoadDocumentCallback?  documentLoader = null;
  (JsonLdRecord? or USVString) expandContext = null;
  boolean                extractAllScripts = false;
  boolean                frameExpansion = false;
  boolean                ordered = false;
  USVString              processingMode = "json-ld-1.1";
  boolean                produceGeneralizedRdf = true;
  USVString?             rdfDirection = null;
  boolean                useNativeTypes = false;
  boolean                useRdfType = false;
};
base
文書を展開または 圧縮する際に使用する base IRI。 設定されている場合、これは入力文書の IRI を上書きします。
compactArrays
true に設定されている場合、JSON-LD プロセッサは 圧縮中に、要素が 1 つだけの配列をその要素で置き換えます。 false に設定されている場合、 要素が 1 つだけであっても、すべての配列は配列のままです。
compactToRelative
圧縮時に、IRI が base オプションまたは文書の位置に対して相対的に 圧縮されるかどうかを決定します。
documentLoader
リモート文書およびコンテキストの取得に使用されるローダのコールバックであり、 LoadDocumentCallback を実装します。 指定されている場合、リモート文書およびコンテキストを取得するために使用されます。 そうでなく指定されていない場合、プロセッサの組み込みローダが使用されます。
expandContext
文書を展開する際にアクティブコンテキストを初期化するために使用されるコンテキスト。
extractAllScripts
true に設定されている場合、 HTML から JSON-LD script elements を抽出するとき、 特定の フラグメント識別子が対象でない限り、 必要に応じて 配列形式を使用して、遭遇したすべての JSON-LD script elements を抽出します。
frameExpansion
展開アルゴリズムのための特別なフレーム処理規則を有効にします。
RDF を JSON-LD としてシリアライズするアルゴリズムが、 可能な場合に JSON-LD ネイティブ型を値として使用するための特別な規則を有効にします。
ordered
true に設定されている場合、 指定された特定のアルゴリズム処理手順は辞書順に並べられます。 false の場合、処理において順序は考慮されません。
processingMode
処理モードを設定します。 json-ld-1.0 または json-ld-1.1 に設定されている場合、 実装はこの仕様で定義されたアルゴリズムとまったく同じ結果を生成しなければなりません。 別の値に設定されている場合、 JSON-LD プロセッサは、アプリケーション固有の最適化を可能にするために、 この仕様で定義されたアルゴリズムを拡張または変更することが許可されます。 そのような最適化の定義はこの仕様の範囲外であり、したがって定義されません。 したがって、異なる実装は異なる最適化を実装する可能性があります。 開発者は json-ld で始まるモードを定義してはなりません。 これはこの仕様の将来バージョン用に予約されているためです。
produceGeneralizedRdf
true に設定されている場合、JSON-LD プロセッサは トリプル述語として 空白ノードを 生成してもかまいません。 そうでない場合、それらは省略されます。 一般化 RDF データセット は [RDF11-CONCEPTS] で定義されます。
注記
プロパティにラベルを付けるために 空白ノード 識別子を使用することは廃止されており、 JSON-LD の将来バージョンで削除される可能性があります。 一般化 RDF データセットのサポートも同様であり、 したがって produceGeneralizedRdf オプションも 削除される可能性があります。
rdfDirection
基底方向を含む 値オブジェクトが RDF へ、また RDF からどのように変換されるかを決定します。
  • i18n-datatype に設定されている場合、 https://www.w3.org/ns/i18n# に基づくデータ型 IRIを使用して RDF リテラルが生成されます。 そこには 言語タグ(存在する場合) と 基底方向の両方が エンコードされます。 RDF から変換する場合、このデータ型はデコードされ、 @language(存在する場合)および @direction を含む 値オブジェクトを作成します。
  • compound-literal に設定されている場合、 リテラルの代わりに 空白ノードが生成されます。 ここで、その空白ノードは rdf:valuerdf:direction、 および rdf:language(存在する場合)プロパティの主語です。 RDF から変換する場合、このオブジェクトはデコードされ、 @language(存在する場合)および @direction を含む 値オブジェクトを作成します。
useNativeTypes
RDF を JSON-LD としてシリアライズする アルゴリズムが、 明示的な @type の必要を避けるために、 値オブジェクト内で ネイティブ JSON 値を使用するようにします。
useRdfType
RDF を JSON-LD としてシリアライズする アルゴリズムのための特別な規則を有効にし、 rdf:type プロパティを @type を使用するのではなく、 出力内で IRIとして保持させます。

9.4 リモート文書とコンテキストの 取得

API 実装の利用者は、リモート文書およびコンテキストがどのように取得されるかを制御するために、 コールバックを利用できます。 この節では、そのコールバックのパラメータと、 取得されたコンテキストを返すために使用されるデータ構造を詳述します。

9.4.1 LoadDocumentCallback

LoadDocumentCallback は、 リモート文書およびコンテキストを取得するために使用されるカスタム文書ローダが実装しなければならない コールバックを定義します。 このコールバックは、RemoteDocument に解決される Promiseを返します。 失敗時には、適切なエラー codeを持つ JsonLdError により Promise が reject されます。

WebIDLcallback LoadDocumentCallback = Promise<RemoteDocument> (
  USVString url,
  optional LoadDocumentOptions? options
);
url
読み込むリモート文書またはコンテキストの URL。
options
コールバックの挙動を決定するためのオプションの集合。 § 9.4.2 LoadDocumentOptions を参照してください。

次のアルゴリズムは既定のコールバックを説明し、 コールバックの実装に対する要件を課します。

  1. 新しい Promise promise を作成し、それを返します。 その後、以下の手順は遅延されます。
  2. url によって識別されるリソースから取得された本文、または url に関連付けられたリソースを別の方法で位置特定したものを、 document に設定します。 リモート文書を要求する際、その要求は Content-Type application/ld+json を優先し、 その次に application/json を優先しなければなりません(MUST)。

    requestProfile が設定されている場合、 それは application/ld+json 上の profile として追加されなければなりません(MUST)。

    プロセッサは、[RFC6839] で定義される +json 接尾辞を使用する他のメディア型を含めてもかまいません(MAY)。

  3. リダイレクトを考慮して、取得されたリソースの場所を documentUrl に設定します ([cooluris] で説明される HTTP ステータス 303 "See Other" リダイレクトを除く)。
  4. 取得されたリソースの Content-Typeapplication/json でもなく、 [RFC6839] で定義される +json 接尾辞を持ついずれのメディア型でもなく、 かつレスポンスが application/ld+json 型の alternate リンク関係を使用する HTTP Link Header [RFC8288] を持つ場合、 以前の url に対する相対的な関連付けられた hrefurl を設定し、手順 2 から アルゴリズムを再開します。
  5. 取得されたリソースの Content-Typeapplication/json または [RFC6839] で定義される +json 接尾辞を持つ任意のメディア型 (application/ld+json を除く)であり、 かつレスポンスが http://www.w3.org/ns/json-ld#context リンク関係を使用する HTTP Link Header [RFC8288] を持つ場合、 関連付けられた hrefcontextUrl に設定します。

    http://www.w3.org/ns/json-ld#context リンク関係を使用する HTTP Link Header が複数見つかった場合、 JsonLdErrorpromise は reject され、その codemultiple context link headers に設定され、 処理は終了されます。

    プロセッサは document内部 表現へ変換してもかまいません(MAY)。

    注記

    application/ld+jsontext/html、または application/xhtml+xml として提供される文書では、 HTTP Link Header は無視されます。

  6. それ以外の場合、取得された文書の Content-Typeapplication/jsonapplication/ld+json、 または [RFC6839] で定義される +json 接尾辞を使用するその他のメディア型のいずれでもありません。 loading document failed エラーを渡して promise を reject します。
  7. 新しい RemoteDocument remote document を作成します。 その際、urldocumentUrl として、 documentdocument として、 返された Content-Type(パラメータなし)を contentType として、 返された任意の profile パラメータ、または nullprofile として、 そして contextUrl、または nullcontextUrl として使用します。
  8. promiseremote document で resolve します。
注記

documentLoader オプションを介して設定されるカスタム LoadDocumentCallback は、 well-known コンテキスト文書のローカルキャッシュを維持するため、 またはアプリケーション固有の URL プロトコルを実装するために使用される可能性があります。

9.4.2 LoadDocumentOptions

LoadDocumentOptions 型は、 さまざまなオプションを LoadDocumentCallbackへ渡すために使用されます。

WebIDLdictionary LoadDocumentOptions {
  boolean  extractAllScripts = false;
  USVString profile = null;
  (USVString or sequence<USVString>) requestProfile = null;
};
extractAllScripts
true に設定されている場合、 HTML から JSON-LD script elements を抽出するとき、 特定の フラグメント 識別子が対象でない限り、 必要に応じて 配列形式を使用して、遭遇したすべての JSON-LD script elements を抽出します。
profile
結果の contentTypetext/html または application/xhtml+xml である場合、 このオプションは JSON-LD script elements を選択するために使用する profile を決定します。
requestProfile
リクエスト内で profile パラメータとして使用する 1 つ以上の IRI。 ([JSON-LD11] の IANA Considerations を参照。)

9.4.3 RemoteDocument

RemoteDocument 型は、 リモート文書またはコンテキストに関する情報を返すために LoadDocumentCallback によって使用されます。

WebIDL[Exposed=JsonLd]
interface RemoteDocument {
  constructor();
  readonly attribute USVString contentType;
  readonly attribute USVString contextUrl;
  attribute any document;
  readonly attribute USVString documentUrl;
  readonly attribute USVString profile;
};
contentType
読み込まれた文書の Content-Type。 任意のパラメータは除外されます。
contextUrl
利用可能であれば、レスポンス内で http://www.w3.org/ns/json-ld#context リンク関係を使用する HTTP Link Header [RFC8288] の値。 レスポンスの Content-Typeapplication/ld+json である場合、 HTTP Link Header は無視されます。 http://www.w3.org/ns/json-ld#context リンク関係を使用する HTTP Link Header が複数見つかった場合、 LoadDocumentCallbackPromiseJsonLdError により reject され、 その codemultiple context link headers に設定されます。
document
取得された文書。 これは生のペイロード、またはすでに解析済みの文書のいずれかです。
documentUrl
読み込まれた文書の最終 URL。 これは HTTP リダイレクトを適切に処理するために重要です。
profile
元の contentType の一部として取得された 任意の profile パラメータの値。

9.5 HTML コンテンツアルゴリズム

注記

この節では、HTML script 抽出をサポートする documentLoader で利用可能な任意機能を説明します。

documentLoader の実装は、 HTML [HTML] 文書内に含まれる script elementsから JSON-LD を抽出することをサポートしてもかまいません(MAY)。 この節では、そのようなプロセッサの規範的な挙動を説明します。 そのようなプロセッサは HTML script extraction をサポートします。

9.5.1 HTML の処理

この節は、HTML から JSON-LD を抽出することをサポートするために、 LoadDocumentCallback で指定されるアルゴリズムへの拡張を説明します。

手順 2 は、次を追加するよう更新されます: HTML script extraction をサポートするプロセッサは、 requestProfilehttp://www.w3.org/ns/json-ld#context でない限り、 任意の優先度レベルで text/html を含めなければならず(MUST)、 任意の優先度レベルで application/xhtml+xml を含めてもかまいません(MAY)。

手順 5 の後に、次の処理手順を追加します: それ以外の場合で、取得されたリソースの Content-Typetext/html または application/xhtml+xml のいずれかである場合:

  1. urlDocument Base URL を、documentUrl に設定します。 これは [HTML] で定義されるように、 既存の documentUrl を文書の URL として使用します。
  2. url パラメータが フラグメント識別子を含む場合、 document 内の script elementtextContentsource に設定します。 これは、パーセントエンコードされたシーケンスを デコードした後で、フラグメント識別子に一致する id attributeを持つものです。

    そのような要素が見つからない場合、 または見つかった要素が JSON-LD script element でない場合、 promiseJsonLdError により reject され、 その codeloading document failed に設定され、 処理は終了されます。

  3. それ以外の場合で、 profile オプションが指定されている場合、 見つかれば、application/ld+jsontype attributeprofile オプションの値を持つ、 document 内の最初の script elementtextContent を変換した結果を source に設定します。
  4. source がまだ未定義であり、 extractAllScripts オプションが存在しない、または false である場合、 document 内の最初の JSON-LD script elementtextContentsource に設定します。

    そのような要素が見つからない場合、 または見つかった要素が JSON-LD script element でない場合、 promiseJsonLdError により reject され、 その codeloading document failed に設定され、 処理は終了されます。

  5. source が定義されている場合、 source を使用して Extract Script Content algorithm の結果に document を設定します。 エラーが検出された場合は、その結果から設定された code を持つ JsonLdError により promise を reject し、 処理は終了されます。
  6. それ以外の場合、source は未定義です。
    1. extractAllScripts オプションが存在しない、または false である場合、 promiseJsonLdError により reject され、 その codeloading document failed に設定され、 処理は終了されます。
    2. それ以外の場合、 extractAllScripts オプションは true です。 document を新しい空の 配列に設定します。 input 内の各 JSON-LD script element について:
      1. その textContentsource に設定します。
      2. source を使用して Extract Script Content algorithm の結果を script content に設定します。 エラーが検出された場合は、その結果から設定された code を持つ JsonLdError により promise を reject し、 処理は終了されます。
      3. script content配列である場合、 それを document の末尾へマージします。
      4. それ以外の場合、script contentdocument に追加します。

9.5.2 Extract Script Content Algorithm

このアルゴリズムは、 JSON-LD script element のテキスト内容を、 マップまたは マップ配列へ抽出します。 JSON-LD script element は、 type attributeapplication/ld+json に設定された、HTML [HTML] 文書内の script elementです。

このアルゴリズムは 1 つの必須入力変数を取ります: source、すなわち HTML script elementtextContentです。

  1. source が有効な JSON 文書でない場合、 invalid script element が検出されており、 処理は中止されます。
  2. source内部 表現へ変換した結果を返します。

9.6 エラー処理

この節では、エラー処理のために JSON-LD API 内で使用される データ型定義について説明します。

9.6.1 JsonLdError

JsonLdError 型は、 処理エラーを報告するために使用されます。

WebIDLdictionary JsonLdError {
  JsonLdErrorCode code;
  USVString?      message = null;
};
code
この文書内のさまざまなアルゴリズムで説明される、特定のエラー型を表す文字列。
message
追加のデバッグ情報を含む任意のエラーメッセージ。 エラーメッセージの具体的な内容は、この仕様の範囲外です。

9.6.2 JsonLdErrorCode

JsonLdErrorCode は、 有効な JSON-LD エラーコードの集合を表します。

WebIDLenum JsonLdErrorCode {
    "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 keywords
同じキーワードへ展開される 2 つの プロパティが検出されました。 これは、キーワード とその別名が同時に使用された場合に発生する可能性があります。
conflicting indexes
同じノードについて、複数の競合する index が見つかりました。
context overflow
@context URL の最大数を超えました。
cyclic IRI mapping
IRI マッピング内の循環が検出されました。
invalid @id value
値が 文字列でない @id エントリに遭遇しました。
invalid @import value
@import の無効な値が見つかりました。
invalid @included value
included block が 無効な値を含んでいます。
invalid @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
無効な base IRIが検出されました。 すなわち、それは IRIでも null でもありません。
invalid container mapping
次の 文字列のいずれでもない値を持つ @container エントリに遭遇しました: @list, @set, @language, @index, @id, @graph, or @type.
invalid context entry
コンテキスト内の エントリが、 処理モードの非互換性により無効です。
invalid context nullification
保護済み用語 定義を含むコンテキストを null 化しようとしました。
invalid default language
既定言語の値が 文字列 または null でないため無効です。
invalid IRI mapping
ローカル コンテキストが、無効または欠落した IRI マッピングを持つ 用語を含んでいます。
invalid JSON literal
無効な JSON リテラルが検出されました。
invalid keyword alias
無効な キーワード別名定義に遭遇しました。
invalid language map value
言語マップ内の無効な値が検出されました。 それは 文字列または 文字列配列でなければなりません (MUST)。
invalid language mapping
用語定義内の @language エントリに遭遇しましたが、 その値は 文字列でも null でもなく、したがって無効です。
invalid language-tagged string
無効な言語値を持つ 言語タグ付き 文字列が検出されました。
invalid language-tagged value
関連付けられた 言語タグを持つ 数値true、または false が検出されました。
invalid local context
無効な ローカルコンテキストが検出されました。
invalid remote context
参照されたリモートコンテキストについて、有効なコンテキスト文書が見つかりませんでした。
invalid reverse property
無効な逆プロパティ定義が検出されました。
invalid reverse property map
無効な逆プロパティマップが検出されました。 逆プロパティマップでは、@context を除く キーワードは 許可されません。
invalid reverse property value
逆プロパティの無効な値が検出されました。 逆プロパティの値は ノードオブジェクトでなければなりません。
invalid scoped context
用語定義内で定義された ローカルコンテキストが無効です。
invalid script element
フラグメント 識別子の対象である HTML 入力内の script element が、適切な type attributeを持っていません。
invalid set or list object
許可されない エントリを持つ set object または list objectが検出されました。
invalid term definition
無効な 用語定義が検出されました。
invalid type mapping
用語定義内の @type エントリに遭遇しましたが、 その値は IRIへ展開できませんでした。
invalid type value
@type エントリの無効な値が検出されました。 すなわち、その値は 文字列でも 文字列配列でもありませんでした。
invalid typed value
無効な型を持つ 型付き 値が検出されました。
invalid value object
許可されない エントリを持つ 値 オブジェクトが検出されました。
invalid value object value
値オブジェクト@value エントリについて無効な値が検出されました。 すなわち、それは スカラーでも null でもありません。
invalid vocab mapping
無効な 語彙マッピングが検出されました。 すなわち、それは IRIでも null でもありません。
IRI confused with prefix
IRIを圧縮すると、 コンパクト IRIと混同されうる IRIになる場合 (その IRI scheme用語 定義と一致し、かつ IRI authorityを持たないため)。
keyword redefinition
キーワードの 再定義が検出されました。
loading document failed
文書を読み込めなかったか、JSON として解析できませんでした。
loading remote context failed
リモートコンテキストの読み込み中に問題が発生しました。
multiple context link headers
http://www.w3.org/ns/json-ld#context リンク関係を使用する 複数の HTTP Link Headers [RFC8288] が検出されました。
processing mode conflict
以前に指定されたバージョンと互換性のない 処理モードへ 変更しようとしました。
protected term redefinition
保護済みの用語を再定義しようとしました。

10. セキュリティの考慮事項

[JSON-LD11] の Security Considerations を参照してください。

11. プライバシーの考慮事項

[JSON-LD11] の Privacy Considerations を参照してください。

12. 国際化の 考慮事項

[JSON-LD11] の Internationalization Considerations を参照してください。

A. IDL 索引

この節は非規範的です。

WebIDL/*
 * The JsonLd interface is created to expose the JsonLdProcessor interface.
 */
[Global=JsonLd, Exposed=JsonLd]
interface JsonLd {};

[Exposed=JsonLd]
interface JsonLdProcessor {
  constructor();
  static Promise<JsonLdRecord> compact(
    JsonLdInput input,
    optional JsonLdContext context = null,
    optional JsonLdOptions options = {});
  static Promise<sequence<JsonLdRecord>> expand(
    JsonLdInput input,
    optional JsonLdOptions options = {});
  static Promise<JsonLdRecord> flatten(
    JsonLdInput input,
    optional JsonLdContext context = null,
    optional JsonLdOptions options = {});
  static Promise<sequence<JsonLdRecord>> fromRdf(
    RdfDataset input,
    optional JsonLdOptions options = {});
  static Promise<RdfDataset> toRdf(
    JsonLdInput input,
    optional JsonLdOptions options = {});
};

typedef record<USVString, any> JsonLdRecord;

typedef (JsonLdRecord or sequence<JsonLdRecord> or USVString or RemoteDocument) JsonLdInput;

typedef (JsonLdRecord or sequence<(JsonLdRecord or USVString)> or USVString) JsonLdContext;

[Exposed=JsonLd]
interface RdfDataset {
  constructor();
  readonly attribute RdfGraph defaultGraph;
  void add(USVString graphName, RdfGraph graph);
  iterable<USVString?, RdfGraph>;
};

[Exposed=JsonLd]
interface RdfGraph {
  constructor();
  void add(RdfTriple triple);
  iterable<RdfTriple>;
};

[Exposed=JsonLd]
interface RdfTriple {
  constructor();
  readonly attribute USVString subject;
  readonly attribute USVString predicate;
  readonly attribute (USVString or RdfLiteral) _object;
};

[Exposed=JsonLd]
interface RdfLiteral {
  constructor();
  readonly attribute USVString value;
  readonly attribute USVString datatype;
  readonly attribute USVString? language;
};

dictionary JsonLdOptions {
  USVString?             base = null;
  boolean                compactArrays = true;
  boolean                compactToRelative = true;
  LoadDocumentCallback?  documentLoader = null;
  (JsonLdRecord? or USVString) expandContext = null;
  boolean                extractAllScripts = false;
  boolean                frameExpansion = false;
  boolean                ordered = false;
  USVString              processingMode = "json-ld-1.1";
  boolean                produceGeneralizedRdf = true;
  USVString?             rdfDirection = null;
  boolean                useNativeTypes = false;
  boolean                useRdfType = false;
};

callback LoadDocumentCallback = Promise<RemoteDocument> (
  USVString url,
  optional LoadDocumentOptions? options
);

dictionary LoadDocumentOptions {
  boolean  extractAllScripts = false;
  USVString profile = null;
  (USVString or sequence<USVString>) requestProfile = null;
};

[Exposed=JsonLd]
interface RemoteDocument {
  constructor();
  readonly attribute USVString contentType;
  readonly attribute USVString contextUrl;
  attribute any document;
  readonly attribute USVString documentUrl;
  readonly attribute USVString profile;
};

dictionary JsonLdError {
  JsonLdErrorCode code;
  USVString?      message = null;
};

enum JsonLdErrorCode {
    "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"
};

B. 未解決課題

この節は非規範的です。

以下は、公開時点で未解決の課題の一覧です。

Issue 76: より簡潔な @prefix defer-future-version

より簡潔な @prefix。

Issue 94: 展開の概念である "key's term definition" は compact IRI キーでは不明確 defer-future-version

展開の概念である "key's term definition" は compact IRI キーでは不明確です。

Issue 166: RDF/JS Dataset interface(s) との関係 defer-future-version

RDF/JS Dataset interface(s) との関係。

Issue 380: 展開は入れ子になったプロパティについて property-scoped contexts を考慮していない defer-future-versionspec:editorialtest:needs testswr:spec-updated-partial

展開は入れ子になったプロパティについて property-scoped contexts を考慮していません。

Issue 391: 再帰的に入れ子になったプロパティと 圧縮 defer-future-version

再帰的に入れ子になったプロパティと圧縮。

相対 IRI 圧縮。

C. 2014 年 1 月 16 日の 1.0 勧告以降の変更

この節は非規範的です。

さらに、§ D. JSON-LD Community Group Final Report 以降の変更を参照してください。

D. JSON-LD Community Group Final Report 以降の変更

この節は非規範的です。

E. 2019 年 12 月 12 日の Candidate Release 以降の変更

この節は非規範的です。

注記

すべての変更は編集上のものであり、API の観測可能な挙動にも 期待されるテスト結果にも影響しません。

F. 2020 年 3 月 5 日の Candidate Release 以降の変更

この節は非規範的です。

注記

すべての変更は編集上のものであり、API の観測可能な挙動にも 期待されるテスト結果にも影響しません。

G. 2020 年 5 月 7 日の Proposed Recommendation Release 以降の変更

この節は非規範的です。

H. 謝辞

この節は非規範的です。

編集者は、この仕様の作成および編集に重要な貢献をした以下の個人に特別な謝意を表します:

さらに、公開時点で以下の人々が Working Group のメンバーでした:

メーリングリストや週次電話会議で多くの技術的課題に取り組んだ JSON-LD Community Group の参加者にも、多大な謝意を表します: 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., and Victor Charpenay.

I. 参考文献

I.1 規範的参考文献

[BCP47]
Tags for Identifying Languages. A. Phillips; M. Davis. IETF. 2009 年 9 月。IETF Best Current Practice。URL: https://tools.ietf.org/html/bcp47
[DOM]
DOM Standard. Anne van Kesteren. WHATWG. Living Standard。URL: https://dom.spec.whatwg.org/
[ECMASCRIPT]
ECMAScript Language Specification. Ecma International。URL: https://tc39.es/ecma262/
[HTML]
HTML Standard. Anne van Kesteren; Domenic Denicola; Ian Hickson; Philip Jägenstedt; Simon Pieters. WHATWG. Living Standard。URL: https://html.spec.whatwg.org/multipage/
[IEEE-754-2008]
IEEE 754-2008 Standard for Floating-Point Arithmetic. Institute of Electrical and Electronics Engineers. 2008。URL: http://standards.ieee.org/findstds/standard/754-2008.html
[INFRA]
Infra Standard. Anne van Kesteren; Domenic Denicola. WHATWG. Living Standard。URL: https://infra.spec.whatwg.org/
[JSON-LD10]
JSON-LD 1.0. Manu Sporny; Gregg Kellogg; Marcus Langhaler. W3C. 2014 年 1 月 16 日。W3C Recommendation。URL: https://www.w3.org/TR/2014/REC-json-ld-20140116/
[JSON-LD11]
JSON-LD 1.1. Gregg Kellogg; Pierre-Antoine Champin; Dave Longley. W3C. 2020 年 5 月 7 日。W3C Proposed Recommendation。URL: https://www.w3.org/TR/json-ld11/
[JSON-LD11-FRAMING]
JSON-LD 1.1 Framing. Dave Longley; Gregg Kellogg; Pierre-Antoine Champin. W3C. 2020 年 5 月 7 日。W3C Proposed Recommendation。URL: https://www.w3.org/TR/json-ld11-framing/
[LINKED-DATA]
Linked Data Design Issues. Tim Berners-Lee. W3C. 2006 年 7 月 27 日。W3C-Internal Document。URL: https://www.w3.org/DesignIssues/LinkedData.html
[promises-guide]
Writing Promise-Using Specifications. Domenic Denicola. W3C. 2018 年 11 月 9 日。TAG Finding。URL: https://www.w3.org/2001/tag/doc/promises-guide
[RDF-SCHEMA]
RDF Schema 1.1. Dan Brickley; Ramanathan Guha. W3C. 2014 年 2 月 25 日。W3C Recommendation。URL: https://www.w3.org/TR/rdf-schema/
[RDF11-CONCEPTS]
RDF 1.1 Concepts and Abstract Syntax. Richard Cyganiak; David Wood; Markus Lanthaler. W3C. 2014 年 2 月 25 日。 W3C Recommendation。URL: https://www.w3.org/TR/rdf11-concepts/
[RDF11-MT]
RDF 1.1 Semantics. Patrick Hayes; Peter Patel-Schneider. W3C. 2014 年 2 月 25 日。W3C Recommendation。URL: https://www.w3.org/TR/rdf11-mt/
[RFC2045]
Multipurpose Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies. N. Freed; N. Borenstein. IETF. 1996 年 11 月。Draft Standard。URL: https://tools.ietf.org/html/rfc2045
[RFC2119]
Key words for use in RFCs to Indicate Requirement Levels. S. Bradner. IETF. 1997 年 3 月。Best Current Practice。URL: https://tools.ietf.org/html/rfc2119
[RFC3986]
Uniform Resource Identifier (URI): Generic Syntax. T. Berners-Lee; R. Fielding; L. Masinter. IETF. 2005 年 1 月。Internet Standard。URL: https://tools.ietf.org/html/rfc3986
[RFC3987]
Internationalized Resource Identifiers (IRIs). M. Duerst; M. Suignard. IETF. 2005 年 1 月。Proposed Standard。URL: https://tools.ietf.org/html/rfc3987
[RFC5234]
Augmented BNF for Syntax Specifications: ABNF. D. Crocker, Ed.; P. Overell. IETF. 2008 年 1 月。Internet Standard。URL: https://tools.ietf.org/html/rfc5234
[RFC6839]
Additional Media Type Structured Syntax Suffixes. T. Hansen; A. Melnikov. IETF. 2013 年 1 月。Informational。URL: https://tools.ietf.org/html/rfc6839
[RFC8174]
Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words. B. Leiba. IETF. 2017 年 5 月。Best Current Practice。URL: https://tools.ietf.org/html/rfc8174
[RFC8259]
The JavaScript Object Notation (JSON) Data Interchange Format. T. Bray, Ed.. IETF. 2017 年 12 月。Internet Standard。URL: https://tools.ietf.org/html/rfc8259
[RFC8288]
Web Linking. M. Nottingham. 2017 年 10 月。Proposed Standard。URL: https://tools.ietf.org/html/rfc8288
[Turtle]
RDF 1.1 Turtle. Eric Prud'hommeaux; Gavin Carothers. W3C. 2014 年 2 月 25 日。W3C Recommendation。URL: https://www.w3.org/TR/turtle/
[WEBIDL]
Web IDL. Boris Zbarsky. W3C. 2016 年 12 月 15 日。W3C Editor's Draft。URL: https://heycam.github.io/webidl/
[XMLSCHEMA11-2]
W3C XML Schema Definition Language (XSD) 1.1 Part 2: Datatypes. David Peterson; Sandy Gao; Ashok Malhotra; Michael Sperberg-McQueen; Henry Thompson; Paul V. Biron et al. W3C. 2012 年 4 月 5 日。W3C Recommendation。URL: https://www.w3.org/TR/xmlschema11-2/

I.2 参考情報

[cooluris]
Cool URIs for the Semantic Web. Leo Sauermann; Richard Cyganiak. W3C. 2008 年 12 月 3 日。W3C Note。URL: https://www.w3.org/TR/cooluris/
[JSON-LD10-API]
JSON-LD 1.0 Processing Algorithms And API. Marcus Langhaler; Gregg Kellogg; Manu Sporny. W3C. 2014 年 1 月 16 日。W3C Recommendation。URL: https://www.w3.org/TR/2014/REC-json-ld-api-20140116/
[RFC8785]
JSON Canonicalization Scheme (JCS). A. Rundgren; B. Jordan; S. Erdtman. Network Working Group. 2020 年 6 月。 Informational。URL: https://www.rfc-editor.org/rfc/rfc8785