JSON-LD 1.1

Linked DataのためのJSONベースのシリアライゼーション

W3C勧告

このバージョン:
https://www.w3.org/TR/2020/REC-json-ld11-20200716/
最新公開バージョン:
https://www.w3.org/TR/json-ld11/
最新エディタードラフト:
https://w3c.github.io/json-ld-syntax/
テストスイート:
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-20200507/
以前の勧告:
https://www.w3.org/TR/2014/REC-json-ld-20140116/
編集者:
Gregg Kellogg (v1.0 and v1.1)
Pierre-Antoine Champin (LIRIS - Université de Lyon) (v1.1)
Dave Longley (Digital Bazaar) (v1.1)
元編集者:
Manu Sporny (Digital Bazaar) (v1.0)
Markus Lanthaler (Google) (v1.0)
著者:
Manu Sporny (Digital Bazaar) (v1.0)
Dave Longley (Digital Bazaar) (v1.0 and v1.1)
Gregg Kellogg (v1.0 and v1.1)
Markus Lanthaler (Google) (v1.0)
Pierre-Antoine Champin (LIRIS - Université de Lyon) (v1.1)
Niklas Lindström (v1.0)
参加する:
GitHub w3c/json-ld-syntax
バグを報告
コミット履歴
プルリクエスト

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

また、 翻訳も参照してください。

この文書は、この非規範的なフォーマットでも利用可能です: EPUB


概要

JSONは便利なデータシリアライゼーションおよびメッセージングフォーマットです。 この仕様はJSON-LD 1.1を定義します。これはJSONベースのフォーマットで、 Linked Dataをシリアライズするためのものです。この構文は、すでにJSONを使用している 展開されたシステムに容易に統合されるように設計されており、JSONからJSON-LDへの スムーズなアップグレードパスを提供します。 主に、Webベースのプログラミング環境でLinked Dataを使用し、相互運用可能なWebサービスを構築し、 JSONベースのストレージエンジンにLinked Dataを格納することを目的としています。

この仕様は JSON-LD 1.0 [JSON-LD10] で定義された機能のスーパーセットを記述し、 特に注記されている場合を除き、 この仕様の1.0バージョンを使用して作成された文書はJSON-LD 1.1との互換性を維持します。

この文書のステータス

このセクションは、この文書の公開時のステータスを記述します。他の文書が この文書を置き換える可能性があります。現在のW3C公開文書および この技術レポートの最新リビジョンのリストは、 W3C技術レポート インデックスの https://www.w3.org/TR/にあります。

この文書は JSON-LDワーキンググループによって開発され、JSON-LDコミュニティグループ最終レポートから派生しました。

この文書で説明されている機能をデモンストレーションできる ライブJSON-LDプレイグラウンドがあります。

この仕様は置き換えることを意図していますJSON-LD 1.0 [JSON-LD10]仕様。

この文書はJSON-LDワーキンググループ によって 勧告として公開されました。

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

ワーキンググループの 実装レポートを参照してください。

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

この文書は W3C 特許ポリシーの下で運営されているグループによって作成されました。 W3Cは、 グループの成果物に関連して行われた特許開示の 公開リストを維持しています。 そのページには 特許を開示するための指示も含まれています。実際に 必須クレームを含む特許の知識を持つ個人は、 W3C特許ポリシーのセクション6に従って情報を開示する必要があります。

この文書は 2019年3月1日W3Cプロセス文書によって管理されます。

文書セット

この文書は JSON-LDワーキンググループによって作成された3つのJSON-LD 1.1勧告の1つです:

1. 導入

このセクションは規範的ではありません。

Linked Data [LINKED-DATA] は、異なる文書や Webサイト間で標準ベースの機械解釈可能なデータのネットワークを作成する方法です。アプリケーションはあるLinked Dataから開始し、文書内に埋め込まれたリンクをたどって、Web上の異なるサイトにホストされている他のLinked Dataに到達できます。

JSON-LDは、Linked DataをJSONでシリアライズするための軽量な構文です [RFC8259]。その設計により、既存のJSONを最小限の変更でLinked Dataとして解釈できるようになっています。JSON-LDは主に、Webベースのプログラミング環境でLinked Dataを使用し、相互運用可能なWebサービスを構築し、JSONベースのストレージエンジンにLinked Dataを格納する手段として想定されています。JSON-LDはJSONと100%互換であるため、今日利用可能な多数のJSONパーサーやライブラリを再利用できます。JSONが提供するすべての機能に加えて、JSON-LDは以下を導入します:

JSON-LDは、RDFの知識がなくても直接JSONとして利用できるよう設計されています [RDF11-CONCEPTS]。また、SPARQLのような他のLinked Data技術と組み合わせてRDFとしても利用できるよう設計されています[SPARQL11-OVERVIEW]。上記の機能が必要な開発者や、RDF graph や JSON 構文での RDF Dataset をシリアライズする必要がある開発者は、JSON-LDに関心を持つでしょう。RDFツールと共にJSON-LDを使用することを意図する人々は、JSON-LDが他のRDF構文([Turtle]や[TriG] のように)と同様に使用できることを発見するでしょう。JSON-LDがRDFとどのように関連するかの詳細は、セクション § 10. Relationship to RDF にあります。

この構文は、すでにJSONで稼働している既存のシステムに影響を与えないように設計されており、JSONからJSON-LDへのスムーズな移行経路を提供します。こうしたデータの形状は大きく異なるため、JSON-LDは文書を決定論的な構造に変形するメカニズムを備え、処理を簡素化します。

1.1 この文書の読み方

このセクションは規範的ではありません。

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

補助文書である JSON-LD 1.1 Processing Algorithms and API 仕様 [JSON-LD11-API] は、一般的なJSON-LD操作のための標準ライブラリインターフェースを提供することで、JSON-LD をより高いレベルで扱う方法を規定しています。

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

ハイパーリンクに関しては、この文書ではほぼ例外なく略語の IRIInternationalized Resource Indicator)という用語を使用します。多くのWeb開発者は URL(Uniform Resource Locator)という用語に馴染みがあります。本書では稀にURI(Uniform Resource Indicator)という用語も使用します。これらの用語は技術コミュニティ間で混用されることが多いですが、それぞれには重要な区別があり、本仕様は常に適切な用語を使用するよう努めています。

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

1.2 貢献

このセクションは規範的ではありません。

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

1.3 組版規則

このセクションは規範的ではありません。

本仕様で使用される組版規則は以下のとおりです:

markup
マークアップ(要素、属性、プロパティ)、機械処理可能な値(文字列、文字、メディアタイプ)、プロパティ名、またはファイル名は赤橙色のモノスペースフォントで表記されます。
variable
擬似コードやアルゴリズム記述内の変数は斜体で表記されます。
definition
他の仕様で使用される用語の定義は太字+斜体で表記されます。
definition reference
この文書内の定義への参照は下線付きで、定義そのものへのアクティブなリンクです。
markup definition reference
この文書内の定義への参照で、参照自体がマークアップである場合は下線付きかつ赤橙色のモノスペースフォントで表示され、定義そのものへのアクティブなリンクになります。
external definition reference
別の文書内の定義への参照は下線付きで斜体になり、定義そのものへのアクティブなリンクです。
markup external definition reference
別の文書内の定義への参照で、参照自体もマークアップである場合は下線付きの斜体赤橙色モノスペースフォントで表示され、定義へのアクティブなリンクになります。
hyperlink
ハイパーリンクは下線付きで青色です。
[reference]
文書参照(規範的または情報的)は角括弧で囲まれ、参照セクションへのリンクになっています。
Changes from Recommendation
以前の勧告から変更されたセクションや句は、§ 1.1 この文書の読み方 のコントロールを使って 強調表示 される場合があります。
Note

注記は薄い緑色のボックスで、左の境界線は緑色、ヘッダーに "Note" が表示されます。注記は常に情報提供的です。

例は薄いカーキ色のボックス内に表示され、左の境界線はカーキ色で、番号付きの "Example" ヘッダーがカーキ色で表示されます。
例は常に情報提供的です。例の内容はモノスペースフォントで表示され、構文色分けされる場合があります。

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

1.4 用語

このセクションは規範的ではありません。

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

他の仕様からの用語のインポート

以下からインポートされた用語を含みます:ECMAScript Language Specification [ECMASCRIPT]、 The JavaScript Object Notation (JSON) Data Interchange Format [RFC8259]、 Infra Standard [INFRA]、および Web IDL [WEBIDL]

array
JSON シリアライズでは、array 構造は 0 個以上の値を囲む角括弧で表されます。値はコンマで区切られます。
内部表現では、list(arrayとも呼ばれる)は 0 個以上の値の順序付きコレクションです。JSON-LD は JSON と同じ配列表現を使用しますが、コレクションはデフォルトで順序なしとみなされます。通常の JSON 配列では順序が保持されますが、JSON-LD の通常の配列では、明示的に定義されていない限り順序は保証されません(JSON-LD 1.1 の「Sets and Lists」セクション参照)。
boolean
2 つの状態を表すために使用される truefalse の値。
JSON object
JSON シリアライズでは、object 構造は 0 個以上の name/value ペア(メンバー)を囲む中括弧で表されます。名前は string です。各名前の後にコロンがあり、名前と値が区切られます。値と次の名前は単一のコンマで区切られます。JSON-LD ではオブジェクト内の名前は一意でなければなりません。

内部表現では、JSON objectmapordered map)として記述され、キー/値のエントリで構成されます(INFRA を参照)。

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

null
JSON-LD における null 値の使用は、値を無視またはリセットするために用いられます。
map entry@context 内で値またはその値の @idnull の場合、用語の IRI との関連付けが明示的に切り離されます。文書本文の map entry の値が null の場合、その map entry が定義されていない場合と同じ意味になります。拡張形式で @value@list、または @setnull に設定されている場合、該当する JSON オブジェクト全体は無視されます。
number
JSON シリアライズでは、number は多くのプログラミング言語で使用されるものに類似していますが、8 進数および 16 進数形式は使用されず、先頭のゼロは許可されません。
内部表現では、number は、小数部分がない場合は long、そうでない場合は double に相当します(WEBIDL を参照)。
scalar
scalar は stringnumbertrue、または false のいずれかです。
string
string はゼロ個以上の Unicode(UTF-8)文字の列で、二重引用符で囲まれ、必要に応じてバックスラッシュエスケープを使用します。文字は単一文字の文字列として表されます。

Internationalized Resource Identifiers (IRIs) [RFC3987] からの用語

IRI
スキームに加え、パスおよびオプションのクエリやフラグメントセグメントを含む IRI の絶対形式。
IRI reference
Internationalized Resource Identifier の一般的な使用を示します。IRI reference は絶対または 相対である可能性があります。ただし、その参照から得られる "IRI" は絶対的な IRI のみを含みます。相対 IRI 参照は絶対形式に解決されます。
relative IRI reference
relative IRI reference は、他の IRI(通常は文書の base IRI)に対して相対的な IRI 参照です。プロパティ、@type の値、およびボキャブラリ相対(vocabulary relative)として定義された用語の値は、base IRI ではなく vocabulary mapping に対して相対的に解決される点に注意してください。

RDF 1.1 Concepts and Abstract SyntaxRDF Schema 1.1、および Linked Data Design Issues からの用語

base IRI
base IRI は、context で確立される IRI、または JSON-LD document の位置に基づくものです。base IRI は相対 IRI 参照を絶対 IRI に変換するために使用されます。
blank node
グラフ内のノードで、IRI でも literal でもないものを指します。blank node は外部から参照可能な識別子を持たず、一時的であるか、外部の linked data graph からリンクされる必要のない情報を含むため、そのように扱われます。JSON-LD では、blank node に対して _: で始まる識別子が割り当てられます。
blank node identifier
JSON-LD 文書の範囲内で blank node の識別子として使用できる文字列です。blank node identifiers は _: で始まります。
dataset
RDF グラフのコレクションを表し、ちょうど 1 つの default graph と 0 個以上の named graphs を含むものです。
datatype IRI
lexical 形式がどのように literal value にマッピングされるかを決定するデータ型を識別する IRI です。
default graph
dataset の default graph は名前を持たない RDF graph であり、空である可能性があります。
graph name
named graph を識別する IRI または blank node です。
language-tagged string
文字列と非空の言語タグから構成され、BCP47 によって定義されます。言語タグは BCP47 の適合クラスに従って正しく形成されている必要があります。プロセッサは言語タグを小文字に正規化する場合があります。
Linked Data
各文書が linked data graph または dataset の表現を含む一連の文書。
list
IRIs、blank nodes、literals の順序付き列です。
literal
文字列や数値などの値として表現されるオブジェクトで、暗黙または明示的にデータ型 IRI を含みます。datatype が rdf:langString の場合はオプションで言語タグを含みます。
named graph
IRI または blank node によって識別される linked data graph です。
node
RDF graph のノードで、少なくとも1つの triple の主語または目的語として現れます。ノードは同一の triple 内で主語と目的語の両方の役割を果たすことがあります。
object
少なくとも1つの入る辺(incoming edge)を持つ graph 内のノードです。
property
有向弧(directed-arc)の名前で、通常は IRI でラベル付けされます。可能な限り IRI を用いるべきです。
Note
プロパティに blank node identifiers をラベル付けとして使用することは廃止予定であり、将来の JSON-LD で削除される可能性があります。
また、RDF の predicate も参照してください。
RDF graph
ラベル付きの有向グラフ、つまり有向弧で接続されたノードの集合です。
resource
IRI、blank node、または literal によって示され、外界の何かを表すものです。
subject
少なくとも1つの outgoing edge を持ち、プロパティを通じて object ノードと関連付けられたノードです。
triple
subject、predicate、object を含む RDF graph の構成要素で、node-arc-node セグメントを表します。

JSON-LD 固有の用語定義

active context
処理アルゴリズムの実行中に context を使って用語を解決するために使用されるコンテキスト。
base direction
文字列に直接方向が関連付けられていない場合に使用される方向です。@direction キーを使って context 内で設定でき、その値は "ltr""rtl"、または null のいずれかになります。詳細は Context Definitions セクションを参照してください。
compact IRI
compact IRI は prefix:suffix の形式を持ち、共通語彙に含まれる各 IRI に対して個別の term 定義を定義することなく IRI を表現する方法です。
context
JSON-LD ドキュメントを解釈するための規則の集合であり、The Context セクションおよび Context Definitions セクションで詳述されています。
default language
文字列に明示的な言語がない場合に使われる言語です。@language キーで context 内に設定でき、その値は BCP47 言語コードを表す文字列または null でなければなりません。
default object
@default キーを持つ map(デフォルトオブジェクト)です。
embedded context
@context エントリとして現れる context で、node object、value object、graph object、list object、set object、nested properties の値、または expanded term definition の値として現れるものです。その値は context definition の map、IRI、またはそれらの配列のいずれかになります。
expanded term definition
値が map であり、関連する IRI、reverse property の場合は文字列値に関連付けられる型、およびコンテナマッピングを定義する 1 個以上の keyword キーを含む term definition の形式です。詳細は Expanded Term Definition セクションを参照してください。
frame
別の JSON-LD ドキュメントを一致と埋め込みルールで変換するための形式を記述する JSON-LD ドキュメントで、frame ドキュメントは追加のキーワードや特定の map エントリを許可します。
frame object
frame 内の map 要素で、入力の node object または value object に一致する frame の特定部分を表します。
graph object
node object の map entry の値として named graph を表すもので、展開された際には @graph エントリを持ち、必要に応じて @id@index を持つことがあります。simple graph object は @id エントリを持たない graph object を指します。
id map
@container@id に設定された term の map 値で、キーは関連する node object の @id を表す IRI として解釈されます。値は node objects でなければなりません。
implicitly named graph
@container@graph に設定された expanded term definition の値から作成される named graph。
included block
node object 内のエントリで、キーが @included またはそのエイリアスであり、値が1個以上の node objects であるもの。
index map
@container@index に設定された term の map 値で、その値は文字列、数値、true、false、null、node object、value object、list object、set object、またはそれらの配列のいずれかになります。
JSON literal
関連付けられたデータ型 IRI が rdf:JSON である literal であり、value object 表現では @type の値が @json になります。JSON literal は有効な JSON 値を表します。
JSON-LD document
RDF dataset のシリアライズです。JSON-LD Grammar セクションで形式的に記述されています。
JSON-LD internal representation
JSON-LD の内部表現は、JSON 構文構造を処理に適したコアデータ構造(arrays、maps、strings、numbers、booleans、null)に変換した結果です。
JSON-LD Processor
JSON-LD 1.1 Processing Algorithms and API で定義されたアルゴリズムを実行できるシステムです。
JSON-LD value
string、number、true/false、typed value、または language-tagged string のいずれかで、RDF literal を表します。
keyword
JSON-LD 固有の文字列で、Syntax Tokens and Keywords セクションおよび Keywords セクションで説明/規定されています。
language map
@container@language に設定された term の map 値で、キーは BCP47 言語コードを表す文字列、値は null、string、またはそれらの配列のいずれかです。
list object
@list キーを持つ map で、@index キーを持つ場合もありますが、他のエントリは持ちません。
local context
@context キーワードを使って map として指定される context です。
nested property
node object のキーで、その値が map であり、その map 内のエントリは node object の値として扱われるものです。nested property 自体は意味論的な意味を持たず、node object 内にサブ構造を作るためにのみ使用されます。
node object
node object は、JSON-LD ドキュメントでシリアライズされたグラフ内のノードの 0 個以上のプロパティを表す map です。map が JSON-LD context の外に存在し、@value@list@set を含まず、またトップレベルの map が @graph@context のみで構成されていない場合、それは node object と見なされます。
node reference
@id キーのみを持ち、他の場所にある node object を参照するために使われる node object。
prefix
compact IRI の最初の部分で、term がマップする文字列を接頭辞として suffix に付加することで IRI を生成するために使われます。
processing mode
JSON-LD ドキュメントがどのように処理されるかを定義します。デフォルトではすべてのドキュメントは本仕様に準拠していると見なされます。@version を context 内で定義することで、publishers は JSON-LD 1.0 準拠のプロセッサが JSON-LD 1.1 ドキュメントを誤って処理しないようにできます。API は processing mode を json-ld-1.0 に設定するオプションを提供し、これにより JSON-LD 1.1 の機能が有効にならないか、または context 内の @version エントリが明示的に 1.1 に設定されている場合にエラーを発生させます。本仕様は json-ld-1.1 の processing mode を通じて JSON-LD 1.0 を拡張します。
scoped context
expanded term definition の一部として用いられる context で、embedded context と同じ形式を取ります。用語が type として使用されると type-scoped context を、property として使用されると property-scoped context を定義します。
set object
@set エントリを持つ map で、@index を持つことはできますが、他のエントリは持ちません。
term
context 内で定義され、IRI に展開され得る短い語です。
term definition
context 内のエントリで、キーが term を定義し、その値は IRI に展開する文字列(simple term definition)または map(expanded term definition)のいずれかです。
type map
@container@type に設定された term の map 値で、キーは関連する node object の @type を表す IRI として解釈され、値は node object か node object の配列でなければなりません。
typed value
値(string など)と型(IRI)からなる値です。
value object
@value エントリを持つ map です。
vocabulary mapping
context 内で @vocab キーを使って設定され、その値は IRI、compact IRI、term、または null です。

1.5 設計目標と根拠

このセクションは規範的ではありません。

JSON-LD は次の設計目標を満たします:

シンプルさ
基本的な形式を使う場合、追加のプロセッサやソフトウェアライブラリは不要です。言語は開発者にとって学習曲線が非常に緩やかです。Linked Data に関心のない開発者は JSON を理解し、@context プロパティを含めて無視するだけで JSON-LD の基本機能を利用できます。
互換性
JSON-LD ドキュメントは常に有効な JSON ドキュメントです。これにより、標準的な JSON ライブラリが JSON-LD ドキュメントとシームレスに動作します。
表現力
この構文はラベル付き有向グラフをシリアライズします。これにより、ほとんどすべての現実世界のデータモデルを表現できます。
簡潔さ
JSON-LD 構文は非常に簡潔で人間に読みやすく、開発者の労力を最小限に抑えます。
ほとんどの場合のゼロ編集
JSON-LD は既存の JSON ベースのシステムからのスムーズで簡単な移行を保証します。多くの場合、JSON ドキュメントを編集せず、HTTP レスポンスに 1 行を追加するだけで十分です(§ 6.1 Interpreting JSON as JSON-LD を参照)。これにより、大規模な JSON ベースのインフラを既に展開している組織でも、日常業務に支障をきたすことなく JSON-LD の機能を利用できます。ただし、JSON をグラフ表現にマッピングすることが複雑な場合もあります。そのような場合、JSON-LD を拡張して稀なユースケースをサポートするのではなく、サポートしないことを選択しました。ゼロ編集は設計目標ですが、言語に大きな複雑さを加えずに常に可能であるとは限りません。JSON-LD は可能な限りシンプルさを重視します。
RDF として使用可能
JSON-LD は RDF の知識がなくても慣用的な JSON として開発者に使用され得ます。JSON-LD はまた RDF として利用できるため、RDF ツールと共に使用する場合には他の RDF 構文と同様に扱うことができます。JSON-LD が RDF とどのように関連するかの詳細は、セクション § 10. Relationship to RDF を参照してください。

1.6 データモデル概要

このセクションは規範的ではありません。

一般に、JSON-LD document によって記述されるデータモデルは、ラベル付きの有向 graph です。グラフは nodes を含み、それらは有向弧で接続されます。ノードはプロパティを持つ resource であるか、またはそれらのプロパティのデータ値(stringsnumberstyped values(日付や時刻など)、および IRIs)のいずれかです。

有向グラフ内では、ノードは resources であり、無名(IRI によって識別されない)である場合があり、これを blank nodes と呼び、blank node identifier で識別されることがあります。これらの識別子は JSON のような木構造を用いて完全に接続されたグラフを表現する際に必要となることがありますが、それ自体に本質的な意味はありません。文字列や数値などのリテラル値も resources と見なされ、JSON-LD は node objects と value objects を区別して異なる種類の resource を区別します。

この単純なデータモデルは非常に柔軟で強力であり、ほとんどあらゆる種類のデータをモデル化できます。データモデルの詳細な説明については、セクション § 8. Data Model を参照してください。

Linked Data 技術に慣れた開発者は、このデータモデルが RDF Data Model として認識されるでしょう。JSON-LD と RDF がどのように関連するかの詳細はセクション § 10. Relationship to RDF を参照してください。

表面的には、JSON-LD document は単に JSON です。コアデータ構造を記述する目的では、これは arrays、maps(解析された JSON Object の版)、strings、numbers、booleans、および null に限定されます。これを JSON-LD internal representation と呼びます。これは、表面上の構文が JSON 以外であっても、同等のコアデータ構造にマップする場合に同じアルゴリズムで操作できることを可能にします

Note

本仕様で議論されていませんが、YAML や CBOR のような並行作業やバイナリ表現は内部表現にマップでき、JSON-LD 1.1 API がソースを JSON ドキュメントであるかのように操作できるようにする可能性があります。

1.7 構文トークンとキーワード

このセクションは規範的ではありません。

JSON-LD は言語の中核をなす多数の構文トークンと keywords を定めています。キーワードの規範的な記述は § 9.16 Keywords にあります。

:
compact IRIs を使用する JSON のキーと値の区切り記号です。
@base
文書に対して相対的に解釈される相対 IRI 参照を解決するための基準となる base IRI を設定するために使用されます。詳細は § 4.1.3 Base IRI を参照してください。
@container
term のデフォルトコンテナタイプを設定するために使われます。関連する説明は複数のセクションで行われています(Value Ordering、Data Indexing、Language Indexing、Node Identifier Indexing、Node Type Indexing、Named Graphs、Named Graph Indexing、Named Graph Data Indexing 等)。
@context
JSON-LD ドキュメント全体で使用される短縮名(terms)を定義するために使用されます。詳細は § 3.1 The Context を参照してください。
@direction
typed values でない JSON-LD value(例:strings や language-tagged strings)の base direction を設定するために使用されます。詳細は § 4.2.4 String Internationalization を参照してください。
@graph
graph を表現するために使用されます。詳細は § 4.9 Named Graphs を参照してください。
@id
ドキュメント内で記述される node objects を IRI または blank node identifier で一意に識別するために使用されます。詳細は § 3.3 Node Identifiers を参照してください。node reference は @id のみを含む node object で、文書内の他の場所にある node object を参照する可能性があります。
@import
context definition 内で外部の context を読み込み、包含する context definition とマージするために使用されます。これにより JSON-LD 1.0 の contexts に JSON-LD 1.1 の機能を追加できます。
@included
トップレベルの node object 内で included block を定義し、別の node object 内に二次的な node objects を含めるために使用されます。
@index
コンテナが情報を索引化するために使われ、処理が JSON データ構造の深部へ継続することを示します。詳細は Data Indexing セクションを参照してください。
@json
@json は JSON literal の @type 値として使用されます。詳細は § 4.2.2 JSON Literals を参照してください。
@language
特定の文字列値の言語、または JSON-LD ドキュメントのデフォルト言語を指定するために使用されます。詳細は § 4.2.4 String Internationalization を参照してください。
@list
順序付きのデータ集合を表現するために使用されます。詳細は § 4.3.1 Lists を参照してください。
@nest
node object のプロパティをグループ化するために使用されるプロパティを定義しますが、それ自体はグラフのエッジではありません。
@none
index map、id map、language map、type map 等で index 値として使用され、索引化対象のノードが該当する機能を持たない場合に用いられます。
@prefix
true の場合、その term をコンパクト化時に compact IRI を構築するために使用できます。false の場合は compact IRI の構築に使用されません。compact IRIs を展開する際にその term を考慮するかどうかも決定します。
@propagate
context definition 内でその context のスコープを変更するために使用されます。デフォルトは true で、context が node objects 間で伝播することを意味します。false に設定すると、新しい node object に入るときにその context 内で作成された term definitions が削除されます。
@protected
context の term definitions が他の contexts によって上書きされるのを防ぎます。詳細は Protected Term Definitions セクションを参照してください。
@reverse
逆プロパティを表現するために使用されます。詳細は Reverse Properties セクションを参照してください。
@set
順序のないデータ集合を表現し、値が常に配列として表現されることを保証するために使用されます。詳細は Sets セクションを参照してください。
@type
ノードの型または typed value のデータ型を設定するために使用されます。詳細は Specifying the Type(§ 3.5)および Typed Values(§ 4.2.1)を参照してください。
Note
@type を node objects と value objects 両方の型を定義するために使用することは、リテラル値や複雑なリソースの両方に型付けする基本的なニーズに対応します。専門家は @type の多用途性を懸念するかもしれませんが、Web 開発者による長年の利用はそれによる誤用を招いていないことに注意してください。
@value
グラフ内の特定のプロパティに関連するデータを指定するために使用されます。文字列の国際化や typed values に関する詳細は該当セクションを参照してください。
@version
context definition 内で processing mode を設定するために使用されます。本仕様で導入された JSON-LD 1.0 以降の新機能は、processing mode が明示的に json-ld-1.0 に設定されている場合は利用できません。
Note
context definition 内では @version は特定の値 1.1 を取ります(文字列の "json-ld-1.1" ではありません)。JSON-LD 1.0 プロセッサは文字列値を受け入れる可能性がありますが、数値値を拒否するためです。
Note
@version の値として 1.1 を使用することは JSON-LD 1.1 に関連していることを意図していますが、Semantic Versioning の要件に従っているわけではありません。
@vocab
共通のプレフィックスを用いて @type 内のプロパティや値を展開するために使用されます。詳細は Default Vocabulary セクションを参照してください。

JSON-LD におけるすべてのキー、keywords、および値は大文字小文字を区別します。

2. 準拠事項

非規範として表示されている節に加えて、本仕様書の著者向けガイドライン、図、例、および注記はすべて情報提供的です。本仕様書のその他すべての部分は規範的です。

本文書におけるキーワード MAY, MUST, MUST NOT, RECOMMENDED, SHOULD, および SHOULD NOT は、すべて大文字で表示される場合に限り、BCP 14 [RFC2119] および [RFC8174] に記載されたとおりに解釈されます。

A JSON-LD document が本仕様に準拠するためには、付録の § 9. JSON-LD Grammar にある規範的記述に従う必要があります。JSON ドキュメントは、§ 6.1 Interpreting JSON as JSON-LD にある規範的記述に従うことで JSON-LD として解釈できます。便宜上、ドキュメントに対する規範的記述はしばしばドキュメントのプロパティに関する記述として表現されます。

本仕様では次の名前空間プレフィックスを使用します:

Prefix IRI
dc11 http://purl.org/dc/elements/1.1/
dcterms http://purl.org/dc/terms/
cred https://w3id.org/credentials#
foaf http://xmlns.com/foaf/0.1/
geojson https://purl.org/geojson/vocab#
prov http://www.w3.org/ns/prov#
i18n https://www.w3.org/ns/i18n#
rdf http://www.w3.org/1999/02/22-rdf-syntax-ns#
schema http://schema.org/
skos http://www.w3.org/2004/02/skos/core#
xsd http://www.w3.org/2001/XMLSchema#

これらは本書内で compact IRI の一部として使用され、生成される IRI の短縮表記として用いられます。例えば dcterms:titlehttp://purl.org/dc/terms/title を表すために使用されます。

3. 基本概念

この節は情報提供的です。

JSON [RFC8259] は軽量で言語に依存しないデータ交換フォーマットです。解析と生成が容易ですが、異なるソースからの JSON を統合するのは困難なことがあります。なぜならデータに他のソースと衝突するキーが含まれている場合があるためです。さらに、JSON にはウェブの基本要素であるハイパーリンクの組み込みサポートがありません。まず、この節で今後使用する例を見てみましょう:

Example 2: Sample JSON document
{
  "name": "Manu Sporny",
  "homepage": "http://manu.sporny.org/",
  "image": "http://manu.sporny.org/images/manu.png"
}

人間にとってはこのデータが人物についてであり、name が "Manu Sporny"、homepage がその人物のホームページの URL を含むことは明白です。しかし機械はそのような直感的理解を持たず、場合によっては曖昧さの解消が困難になることがあります。この問題は、"name" や "homepage" のようなトークンの代わりに、異なる概念を一意に表す識別子を用いることで解決できます。

Linked Data や Web 全体では、曖昧さのない識別に IRIsInternationalized Resource Identifiers)を使用します(詳細は [RFC3987])。考え方は、開発者間で有用となるデータに曖昧さのない識別子を割り当てるために IRIs を使うというものです。terms(例えば namehomepage)が IRIs に展開されると、開発者は互いの用語を誤って衝突させることを避けられます。さらに、開発者や機械はこの IRI を(例えばウェブブラウザを使って)参照し、用語の定義を得ることができます。このプロセスは IRI のデリファレンス(dereferencing)として知られています。

広く使われている schema.org ボキャブラリ を利用すると、上の例は次のように曖昧なく表現できます:

上の例では、すべてのプロパティが IRI によって一意に識別され、IRIs を表すすべての値は @id キーワードによって明示的に示されています。これはデータについて非常に明確な有効な JSON-LD ドキュメントですが、人間の開発者にとっては冗長で扱いにくい場合があります。この問題に対処するため、JSON-LD は次節で説明する context の概念を導入します。

この節では JSON-LD の最も基本的な機能のみを扱います。より高度な機能(typed valuesindexed values、および named graphs など)は、§ 4. Advanced Concepts にあります。

3.1 コンテキスト

この節は情報提供的です。

人と人がコミュニケーションする際、会話は通常共有された環境(「会話のコンテキスト」)の中で行われます。この共有コンテキストにより、共通の友人のファーストネームのようなショートカット用語を使っても正確さを失わずに素早くやり取りできます。JSON-LD のコンテキストも同様に機能します。コンテキストにより、2 つのアプリケーションがショートカット用語を使って効率的に通信しつつ、正確さを保てるようになります。

簡単に言えば、contexttermsIRIs にマッピングするために使われます。Terms は大文字小文字を区別し、予約された JSON-LD の keywords でない限り、ほとんどの有効な strings を term として使用できます。例外は空文字列 "" と、キーワードの形式(つまり先頭が "@" で続く 1 つ以上の ALPHA 文字からなる文字列)を持つ文字列であり、これらは term として使用してはなりません。また ":" を含むなど IRI の形式を持つ文字列も term として使用すべきではありません。

前節のサンプルドキュメントでは、context は次のようになります:

Example 4: 前節のサンプルドキュメント用コンテキスト
{
  "@context": {
    "name": "http://schema.org/name",
    ↑ This means that 'name' is shorthand for 'http://schema.org/name'
    "image": {
      "@id": "http://schema.org/image",
      ↑ This means that 'image' is shorthand for 'http://schema.org/image'
      "@type": "@id"
      ↑ This means that a string value associated with 'image'
        should be interpreted as an identifier that is an IRI
    },
    "homepage": {
      "@id": "http://schema.org/url",
      ↑ This means that 'homepage' is shorthand for 'http://schema.org/url'
      "@type": "@id"
      ↑ This means that a string value associated with 'homepage'
        should be interpreted as an identifier that is an IRI 
    }
  }
}

上の context が示すように、term definition の値は単純な文字列(term を IRI にマップする)であるか、または map であり得ます。

context はキー @context をもつ entry を用いて導入され、node objectvalue object の中に現れることがあります。

もし entryterm をキーとして map 値を持つ場合、その map は expanded term definition と呼ばれます。上の例では、imagehomepage の値が文字列であれば IRI として解釈されることを指定しています。Expanded term definitions はまた、用語を index maps に使用したり、配列値が sets として解釈されるか lists として解釈されるかを指定したりできます。展開された term definitions はキーとして IRI または compact IRIs を使って定義することができ、これは主に IRI や compact IRI に型や言語情報を関連付けるために使われます。

Contexts はドキュメント内に直接埋め込む(embedded context)ことも、URL で参照することもできます。もし前の例のコンテキストドキュメントが https://json-ld.org/contexts/person.jsonld で取得可能であれば、それを参照する一行を追加するだけで JSON-LD ドキュメントをはるかに簡潔に表現できます。次の例をご覧ください:

参照されるコンテキストは、Schema.org ボキャブラリ内で用語がどのように IRI にマップされるかを指定するだけでなく、homepageimage に関連する文字列値が IRI として解釈可能であること("@type": "@id"、詳細は § 3.2 IRIs を参照)を指定します。これにより、開発者はサイトごとにデータの相互運用性について合意することなく互いのデータを再利用できます。外部の JSON-LD コンテキストドキュメントは @context キーの外にある用語に関するドキュメントなどの追加情報を含む場合がありますが、外部コンテキストドキュメントとして使用される場合、その @context の外側にある情報は無視されます。

リモートコンテキストは相対 URL を使って参照することもでき、その解決は参照を含むドキュメントの位置に対して行われます。例えばドキュメントが http://example.org/document.jsonld にあり、相対参照として context.jsonld を含む場合、参照されるコンテキストドキュメントは http://example.org/context.jsonld に存在します。

Example 6: 相対コンテキストの読み込み
{
  "@context": "context.jsonld",
  "name": "Manu Sporny",
  "homepage": "http://manu.sporny.org/",
  "image": "http://manu.sporny.org/images/manu.png"
}
Note

コンテキスト URL の相対参照の解決は、リモートコンテキストドキュメント自体が他のコンテキストへの参照を含む場合にも適用されます。

JSON ドキュメントは、contextHTTP Link Header を使って参照することで、修正することなく JSON-LD として解釈できます(詳細は § 6.1 Interpreting JSON as JSON-LD を参照)。また、JSON-LD 1.1 API を使ってカスタムコンテキストを適用することも可能です。

JSON-LD ドキュメント では、contexts をインラインで指定することもできます。これにより、ウェブへの接続がない場合でもドキュメントを処理できる利点があります。最終的にはモデリング上の判断であり、ユースケースに応じた取り扱いが必要です。リモートコンテキストの使用に関する議論は Security Considerations§ C. IANA Considerations で参照してください。

この節は JSON-LD コンテキストの最も基本的な機能のみを扱っています。コンテキストは indexed values順序付き値ネストされたプロパティ のようなより複雑な JSON データ構造の解釈にも役立ちます。コンテキストに関連する高度な機能は § 4. Advanced Concepts で扱われます。

3.2 IRIs

この節は情報提供的です。

IRIsInternationalized Resource Identifiers) は Linked Data にとって基本的であり、ほとんどの nodesproperties がこれによって識別されます。JSON-LD では、IRIs は IRI reference として表現されることがあります。IRIs は [RFC3987] において、schemepath、およびオプションの queryfragment セグメントを含むものとして定義されています。相対 IRI 参照 は別の IRI に対して相対的な IRI 参照です。JSON-LD では以下に述べる例外を除き、すべての相対 IRI 参照は base IRI を基準に解決されます。

Note

「この文書の読み方」節で注意されたように、IRIs はしばしば URL と混同されます。主な相違点は、URL がリソースをウェブ上で 位置付ける(locate) のに対し、IRI はリソースを 識別する(identify) という点です。識別子がデリファレンス可能であることは良い実践ですが、常に実用的であるとは限りません。特に、UUID のような URN スキームの例に注意してください。例: urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6

Note

Properties@type の値、および用語定義で語彙マッピング(vocabulary mapping)に対して相対的であると定義されたプロパティの値は、相対 IRI 参照の形式を取ることがありますが、これらは vocabulary mapping を使って解決され、base IRI を基準にはしません。

string は、キーが @idmap entry の値である場合に IRI として解釈されます:

Example 8: @id の値は IRI として解釈される
{
  ...
  "homepage": { "@id": "http://example.com/" }
  ...
}

IRI として解釈される値は、相対 IRI 参照 としても表現できます。例えば、次のドキュメントが http://example.com/about/ にある場合、相対参照 ../http://example.com/ に展開されます(相対 IRI 参照がどこで使えるかの詳細については § 9. JSON-LD Grammar を参照してください)。

Example 9: IRI は相対にできる
{
  ...
  "homepage": { "@id": "../" }
  ...
}

IRIs はキーの位置に直接書くこともできます。例えば:

Example 10: キーとしての IRI
{
  ...
  "http://schema.org/name": "Manu Sporny",
  ...
}

上の例では、キー http://schema.org/nameIRI として解釈されます。

term が active context 内で定義されている場合、そのキーが term と一致すると、term から IRI への展開が行われます。

上の例のように、JSON キーが IRI に展開されない場合(例: status)は、そのキーは Linked Data ではないため処理時に無視されます。

もし特定の term やプロパティ IRI に対して 型の強制(coercion) ルールが @context 内で指定されている場合、文字列から IRI が生成されます:

上の例では、値 http://manu.sporny.org/ が JSON の string として表現されているため、型の強制ルールによりデータ処理時にその値は IRI に変換されます。詳細は § 4.2.3 Type Coercion を参照してください。

まとめると、IRIs は JSON-LD 内でさまざまな方法で表現できます:

  1. Map entries でキーが term にマップされている場合、(context definition の外では)そのキーは IRI に展開されます。
  2. @id または @type を使って指定された文字列値については IRI が生成されます。
  3. @type キーが @id または @vocab を値に持つような型の強制ルール(coercion)があるキーの文字列値についても IRI が生成されます。

この節では JSON-LD における IRI に関する最も基本的な機能のみを扱いました。IRI に関連する高度な機能は § 4. Advanced Concepts で扱われます。

3.3 ノード識別子

この節は情報提供的です。

RDF グラフ内のノードを外部から参照できるようにするためには、ノードに識別子があることが重要です。IRIs は Linked Data の基本概念であり、ノードが真にリンクされるためには識別子をデリファレンスするとそのノードの表現が得られるべきです。これによりアプリケーションはそのノードに関する追加情報を取得できます。

JSON-LD では、ノードは @id キーワードを使って識別されます:

上の例には、node objecthttp://me.markus-lanthaler.com/ という IRI によって識別されています。

この節では JSON-LD におけるノード識別子に関する最も基本的な機能のみを扱います。ノード識別子に関連する高度な機能は § 4. Advanced Concepts で扱われます。

3.4 JSON オブジェクトの用途

この節は情報提供的です。

構文としての JSON は限られた構文要素のみを持っています:

JSON-LD のデータモデルは RDF データモデルに基づいてより豊かな資源の集合を許容します。データモデルの詳細は § 8. Data Model に記述されています。JSON-LD は JSON オブジェクトを使ってさまざまな資源とそれらの間の関係を記述します:

Node objects
Node objects はリンクデータグラフ内のノードを定義するために使われ、入出力両方のエッジを持つことがあります。Node objects はプロパティを持つリソースを定義する主要な構造です。規範的な定義は § 9.2 Node Objects を参照してください。
Value objects
Value objects はリンクデータグラフ内のリテラルノードを記述するために使われ、通常は入る辺のみを持ちます。JSON では一部のリテラルノードが JSON オブジェクトを用いずに記述されることがあります(例:numbers、strings、boolean 値)が、expanded form ではすべてのリテラルノードが value objects を用いて記述されます。詳細は § 4.2 Describing Values および § 9.5 Value Objects を参照してください。
List Objects and Set objects
List Objects は特別な種類の JSON-LD の maps で、node objects や value objects とは異なり、array@list キーの下にラップすることで順序付き値を表現します。Set Objects は一貫性のために存在し、@set キーの配列値と同等です。詳細は § 4.3.1 Lists および § 4.3.2 Sets を参照してください。
Map Objects
JSON-LD はプロパティの値へより簡便にアクセスするためにさまざまな形式の maps を使用します。
Language Maps
言語タグごとに異なる言語に対応する複数の値をインデックス化することを可能にします。詳細は § 4.6.2 Language Indexing および § 9.8 Language Maps を参照してください。
Index Maps
複数の値(node objects または value objects)を関連する @index によってインデックス化することを可能にします。詳細は § 4.6.1 Data Indexing および § 9.9 Index Maps を参照してください。
Id Maps
複数の node objects を関連する @id によってインデックス化することを可能にします。詳細は § 4.6.3 Node Identifier Indexing および § 9.11 Id Maps を参照してください。
Type Maps
複数の node objects を関連する @type によってインデックス化することを可能にします。詳細は § 4.6.4 Node Type Indexing および § 9.12 Type Maps を参照してください。
Named Graph Indexing
複数の named graphs を関連する graph name によってインデックス化することを可能にします。詳細は § 4.9.3 Named Graph Indexing を参照してください。
Graph objects
graph object は node object に似ていますが、named graph を定義する点が異なります。詳細は § 4.9 Named Graphs および § 9.4 Graph Objects を参照してください。node object は他のプロパティと併せて named graph を記述することもできますが、graph object は named graph のみを記述する点が際立ちます。
Context Definitions
Context Definition は JSON object 形式を使用しますが、それ自体はリンクデータグラフ内のデータではありません。Context Definition は展開された term definitions を含むことがあり、これらも JSON オブジェクトで表現されます。詳細は § 3.1 The Context§ 4.1 Advanced Context Usage および § 9.15 Context Definitions を参照してください。

3.5 型の指定

この節は情報提供的です。

Linked Data では、グラフノードの型を指定することが一般的です。多くの場合、これは特定の node object 内で使用されるプロパティや、ノードが値であるプロパティに基づいて推論できます。例えば schema.org ボキャブラリでは givenName プロパティは Person と関連付けられています。したがって、もし node object に givenName が含まれていれば、そのノードの型は Person であると推論できます。@type を明示的に用いることでその関連を明確にできます。

特定のノードの型は @type キーワードを使って指定できます。Linked Data では型は IRI によって一意に識別されます。

配列を用いることで、ノードに複数の型を割り当てることもできます:

@type キーの値は、term(active context 内で定義された)であることもできます:

ノードの型を設定することに加え、@type は値の型を設定して typed value を作成するためにも使えます。この用途における @type の使用は、ノードオブジェクトの型指定に似ていますが、value objects は単一の型のみを持つ制約があります。typed values の使用については § 4.2.1 Typed Values を参照してください。

typed values は展開された term definition 内で @type を指定することで暗黙的に定義することもできます。これは § 4.2.3 Type Coercion で詳述されています。

4. 高度な概念

この節は規範的ではありません。

JSON-LD には、上で説明したコア機能を超えるさまざまな機能があります。JSON はそのような構造を使ってデータを表現するために利用でき、本節で説明する機能はさまざまな JSON 構造を Linked Data として解釈するために使用できます。JSON-LD プロセッサは、提供されたおよび埋め込まれた contexts を利用して、プロパティ値を多様な慣用的な方法で解釈します。

値の記述

JSON の一つのパターンとして、プロパティの値が文字列であることがよくあります。多くの場合、その文字列は実際には別の型付き値、例えば IRI、日付、あるいは特定の言語の文字列を表しています。そのような値の型付けの記述方法については、§ 4.2 Describing Values を参照してください。

値の順序

JSON では、配列値を持つプロパティは暗黙の順序を示唆します;JSON-LD の配列は、埋め込まれた構造や context 定義を用いて定義されていない限り、デフォルトでは含まれる要素の順序を意味しません。詳細は § 4.3 Value Ordering を参照してください。

プロパティのネスト

API でよく見られる別の JSON の慣用として、関連するプロパティをまとめるために中間オブジェクトを使うことがあります;JSON-LD ではこれらは nested properties と呼ばれ、§ 4.4 Nested Properties に記述されています。

オブジェクトの参照

Linked Data は異なるリソース間の関係を記述することがすべてです。これらの関係は、Web 上の別のドキュメントで定義されたリソース間であることもあれば、同じドキュメント内で記述されるリソース間であることもあります。

この場合、http://manu.sporny.org/about にあるドキュメントは上の例を含み、https://greggkellogg.net/foaf にある別のドキュメントを参照して同様の表現を含むことがあります。

JSON の使用でよく見られる慣用として、あるオブジェクトを別のオブジェクトの値として指定することがあります。JSON-LD ではこれをオブジェクトの embedding と呼びます;例えば、友人を Person のオブジェクト値として指定する場合などです:

これらの関係の詳細については § 4.5 Embedding を参照してください。

索引化された値(Indexed values)

JSON の別の一般的な慣用は、中間オブジェクトを使用してプロパティ値を索引化することです。JSON-LD は、§ 4.6 Indexed Values に詳細があるように、いくつかの異なる方法でデータを索引化できます。

逆プロパティ(Reverse Properties)

JSON-LD は有向な グラフ をシリアライズします。つまり、すべての プロパティノード から別の ノード または を指します。しかし、場合によっては逆方向でシリアライズすることが望ましい場合があり、その詳細は § 4.8 Reverse Properties に記載されています。

以下の節では、このような高度な機能についてさらに詳しく説明します。

4.1 高度なコンテキストの使用

この節は規範的ではありません。

セクション § 3.1 The Context では JSON-LD が機能するための基本が導入されました。本節では context の基本原則を拡張し、より高度なユースケースが JSON-LD を用いてどのように実現できるかを示します。

一般に、コンテキストはmap が定義されるときにいつでも使用できます。直接別のコンテキスト定義の子として(expanded term definition の一部としている場合を除き)コンテキストを表現できない唯一の場面です。例えば、JSON-LD document はひとつ以上の array から構成される形式を取り得て、それぞれのトップレベルの node object でコンテキスト定義を使用することがあります:

外側の配列は expanded document form および flattened document form におけるドキュメントの標準形であり、ノード同士が相互参照しない切断されたグラフを記述する際に必要となる場合があります。そのような場合、トップレベルの map@graph プロパティを用いることで @context の繰り返しを避けるのに便利です。詳細は § 4.5 Embedding を参照してください。

コンテキストの重複する terms は、 最も最近定義されたものが優先される(most-recently-defined-wins)メカニズムによって上書きされます。

上の例では、より深いネストされた details 構造内で nameterm が上書きされており、その構造は自身の embedded context を使用しています。これは通常は良い作成手法ではなく、既存の(レガシーな)アプリケーションが特定の map 構造に依存している場合に典型的に使用されます。もしコンテキスト内で term が再定義されると、その以前の定義に関連するすべてのルールは削除されます。もし termnull に再定義された場合、その用語は有効な active context に定義された terms のリストから実質的に除外されます。

複数のコンテキストは array を使って結合でき、配列は順番に処理されます。特定の map 内で定義されたコンテキストの集合は local contexts と呼ばれます。active context はドキュメント内部の特定の位置で有効な local contexts の蓄積を指します。local contextnull に設定すると、active context を以前のコンテキストで定義されていた term definitionsdefault language などがない空のコンテキストに実質的にリセットします。次の例は外部コンテキストを指定し、その上に embedded context を重ねる例です:

JSON-LD 1.1 では、スコープ付きコンテキストやインポートされたコンテキストを含む、コンテキスト導入のための他のメカニズムや、用語定義の保護の新しい方法があります。そのため、最後に定義されたインラインコンテキストが必ずしも用語のスコープを定義するものではない場合があります。詳細は § 4.1.8 Scoped Contexts§ 4.1.9 Context Propagation§ 4.1.10 Imported Contexts、および § 4.1.11 Protected Term Definitions を参照してください。

注記

可能であれば、context 定義は JSON-LD ドキュメントの先頭に置くべきです。これによりドキュメントの可読性が向上し、ストリーミングパーサの効率が上がる場合があります。ドキュメントの先頭に context がない場合でも、準拠した JSON-LD です。

注記

将来の互換性の問題を避けるため、terms は先頭が @ 文字で始まり、 その後に 1 つ以上の ALPHA 文字のみが続く形式([RFC5234] を参照) のものは避けるべきです。なぜなら将来の JSON-LD のバージョンで keyword として使われる可能性があるからです。@ で始まるが JSON-LD 1.1 keywords でない用語は他の用語と同様に扱われ、すなわち IRI にマップされない限り無視されます。さらに、空の term"")の使用は、すべてのプログラミング言語が空の JSON キーを扱えるわけではないため許されていません。

4.1.1 JSON-LD 1.1 の処理モード

この節は規範的ではありません。

JSON-LD 1.1 で定義された新機能は、processing modejson-ld-1.0 に設定されていない限り利用可能です。これは API オプションを通じて設定できます。processing mode は、context@version エントリを数値の 1.1 に設定することで、または API オプションを通じて明示的に json-ld-1.1 に設定できます。processing mode を明示的に json-ld-1.1 に設定すると、JSON-LD 1.0 プロセッサが JSON-LD 1.1 ドキュメントを誤って処理することを防止します。

23: context における @version の設定
{
  "@context": {
    "@version": 1.1,
    ...
  },
  ...
}

ドキュメントを処理する際に最初に遭遇した context@version を含む場合、それが processing mode を決定します(API オプションで明示的に定義されている場合を除く)。つまり、"/@version": 1.1 が、@version を持たないコンテキストの処理の後で現れた場合でも、前者はそのコンテキスト内に "@version": 1.1 が定義されていたと解釈されます。

注記

processing mode を明示的に json-ld-1.1 に設定することは、JSON-LD 1.0 プロセッサが JSON-LD 1.1 ドキュメントを誤って処理して異なる結果を生じさせるのを防ぐために 推奨されます

4.1.2 デフォルト語彙

この節は規範的ではありません。

すべてのプロパティや型が同じ語彙から来る場合があります。JSON-LD の @vocab キーワードは、著者が共通のプレフィックスを設定することを可能にし、これは vocabulary mapping として使用され、term に一致せず、かつ IRI や compact IRI(つまりコロンを含まない)でもないすべてのプロパティと型に対して使用されます。

@vocab が使用されているが、ある map 内の特定のキーを語彙に基づいて展開したくない場合、コンテキスト内でその term を明示的に null に設定できます。例えば下の例では、databaseId エントリは IRI に展開されず、展開時にそのプロパティは破棄されます。

JSON-LD 1.1 以降では、local contextvocabulary mapping相対 IRI 参照 に設定でき、これは有効な場合にアクティブなコンテキスト内の既存の語彙マッピングに連結されます(アクティブコンテキストに語彙マッピングがない場合の適用方法については § 4.1.4 Using the Document Base for the Default Vocabulary を参照してください)。

次の例は、前の語彙に対して相対的なデフォルト語彙を使ってプロパティを展開した影響を示しており、展開結果は下の Expanded タブに表示されます。

注記

@vocab の文法は § 9.15 Context Definitions で定義されており、値として termcompact IRI を許可します。@vocab の値に使われる用語は、コンテキストが導入される時点でスコープ内にある必要があり、さもなければ @vocab と同じコンテキストで定義された他の用語との間で循環依存が発生します。

4.1.3 Base IRI

この節は規範的ではありません。

JSON-LD では IRI を相対形式で指定でき、これはドキュメント基準(document base)に対して RFC3986 §5.1 に従って解決されます。context@base キーワードを使って、base IRI を明示的に設定できます。

例えば、JSON-LD ドキュメントが http://example.com/document.jsonld から取得された場合、相対 IRI 参照 はその IRI を基準に解決されます。

27: 相対 IRI 参照をノード識別子として使う
{
  "@context": {
    "label": "http://www.w3.org/2000/01/rdf-schema#label"
  },
  "@id": "",
  "label": "Just a simple document"
}

このドキュメントは空の @id を使用しており、これはドキュメント基準に解決されます。ただし、ドキュメントが別の場所に移動すると IRI が変わる可能性があります。これを防ぐために、context 内で @base マッピングを定義して、ドキュメントの base IRI を上書きできます。

@basenull に設定すると、相対 IRI 参照 が IRI に展開されるのを防げます。

外部コンテキスト内で使用された場合、@base は無視される点に注意してください。

4.1.4 デフォルト語彙に対してドキュメント基準を使用する

この節は規範的ではありません。

場合によっては、語彙の用語が外部の語彙ではなくドキュメント内に直接定義されることがあります。JSON-LD 1.1 以降では、local context 内の vocabulary mapping相対 IRI 参照 に設定でき、これはスコープ内に語彙マッピングがない場合に base IRI に対して解決されます。これにより、語彙に対して相対的に展開される用語(node objects のキーなど)が、base IRI を基準にして IRI を作成するようになります。

29: "#" を語彙マッピングとして使用する
{
  "@context": {
    "@version": 1.1,
    "@base": "http://example/document",
    "@vocab": "#"
  },
  "@id": "http://example.org/places#BrewEats",
  "@type": "Restaurant",
  "name": "Brew Eats"
  ...
}

このドキュメントが http://example/document にある場合、次のように展開されます:

4.1.5 コンパクト IRI

この節は情報提供的です。

コンパクト IRI は、IRI を接頭辞(prefix)と接尾辞(suffix)をコロン(:)で区切って表現する方法です。prefixterm で、active context から取られ、JSON-LD ドキュメント内の特定の IRI を識別する短い文字列です。例えば、接頭辞 foaf は Friend-of-a-Friend ボキャブラリ(IRI http://xmlns.com/foaf/0.1/)の短縮表記として使われます。開発者は FOAF ボキャブラリの用語を接頭辞の末尾に付け加えて、その語彙用語の IRI の短縮形を指定できます。例えば foaf:nameIRI http://xmlns.com/foaf/0.1/name に展開されます。

上の例では、foaf:nameIRI http://xmlns.com/foaf/0.1/name に展開され、foaf:Personhttp://xmlns.com/foaf/0.1/Person に展開されます。

Prefixes は、値の形式が compact IRIprefix:suffix 組み合わせであり、かつ prefixactive context 内で定義された term と一致し、suffix が二つのスラッシュ(//)で始まらない場合に展開されます。compact IRI は、prefix にマップされた IRI に(可能性として空の)suffix を連結することで展開されます。もし prefixactive context に定義されていないか、suffix が二つのスラッシュで始まる場合(例: http://example.com のように)、その値は IRI として解釈されます。接頭辞がアンダースコア(_)である場合、その値は代わりに ブランクノード識別子 として解釈されます。

次の例に示すように、コンテキスト内でもコンパクト IRI を使用することができます:

JSON-LD 1.0 互換のために processing mode を明示的に使う場合、用語は縮約時に compact IRI のプレフィックスとして選択され得ますが、それは値が URI の gen-delim 文字(例: /# など)で終わる単純な term 定義である場合に限られます。

JSON-LD 1.1 では、用語は展開または縮約の際に compact IRI のプレフィックスとして選択され得ますが、それは値が URI の gen-delim 文字で終わる単純な term 定義が使われている場合、あるいは展開された term 定義に @prefix エントリがありその値が true である場合に限ります。もし単純な term 定義が URI の gen-delim 文字で終わらないか、展開された term 定義に @prefix エントリがありその値が false である場合、その用語は compact IRI の展開や IRI の縮約に用いられません。

注記

1.0 プロセッサ向けの用語選択の振る舞いは、JSON-LD 1.0 に対する errata の結果変更されました(参照: ここ)。これは既存の JSON-LD ドキュメントの処理には影響しませんが、Compact IRI を用いてドキュメントを縮約する際にわずかな違いを生じさせる場合があります。

縮約時の振る舞いは、次のような展開済みの入力ドキュメントを考えることで説明できます:

Example 33: コンパクト IRI 作成を示すための展開済みドキュメント
[{
  "http://example.com/vocab/property": [{"@value": "property"}],
  "http://example.com/vocab/propertyOne": [{"@value": "propertyOne"}]
}]

以下のコンテキストを 1.0 の processing mode で使うと、関連する用語選択アルゴリズムは property よりも vocab を選びます。これは property に関連付けられた IRI の方が元の IRI をより多く含んでいるにもかかわらずです。

Example 34: Compact IRI 生成コンテキスト(1.0)
{
  "@context": {
    "vocab": "http://example.com/vocab/",
    "property": "http://example.com/vocab/property"
  }
}

上の展開済みの入力ドキュメントを前述のコンテキストで縮約すると、次のような縮約結果になります:

元の [JSON-LD10] では、用語選択アルゴリズムは property を選択して Compact IRI として property:One を生成していました。この元の振る舞いは @prefix を用いることで明示できます:

Example 36: Compact IRI 生成コンテキスト(1.1)
{
  "@context": {
    "@version": 1.1,
    "vocab": "http://example.com/vocab/",
    "property": {
      "@id": "http://example.com/vocab/property",
      "@prefix": true
    }
  }
}

この場合、property 用語は通常はプレフィックスとして使えません。なぜなら展開された term 定義で定義されており、かつその @id が URI の gen-delim 文字で終わっていないためです。そこに "@prefix": true を追加すると、property:One のような compact IRI のプレフィックス部分として使えるようになります。

4.1.6 キーワードのエイリアス化

この節は情報提供的です。

JSON-LD の各 キーワード@context を除く)は、 アプリケーション固有のキーワードへエイリアス化できます。この機能により、既存のレガシー JSON コンテンツに含まれるキーを再利用して JSON-LD として扱うことが可能になります。 また、開発者が JSON-LD の context のみを使ってドメイン固有の実装を設計することも可能になります。

上の例では、 @id@typeキーワード に対して、 それぞれ urla というエイリアスが与えられています。

@type を除き、エラーになるのは、用語が キーワード であるような 展開された用語定義 のプロパティです。 ただし processing modejson-ld-1.0 に設定されていない場合、@type に対する例外もあります。詳細や使用例は § 4.3.3 @set@type の併用 を参照してください。

processing modejson-ld-1.0 に設定されていない限り、キーワードのエイリアスは 単純な用語定義(値がキーワードであるもの)か、 @id エントリを持ち任意で @protected エントリを持つような 展開された用語定義 のいずれかでなければなりません;その他のエントリは許可されません。 上記のとおり @type に対するエイリアスには例外があります。 @protected の使用に関する詳細は § 4.1.11 保護された用語定義 を参照してください。

キーワードは再定義できないため、他のキーワードへのエイリアスも不可能です。

注記

エイリアス化されたキーワードは、その context 自身の内部で使用することはできません。

すべてのキーワードの規範的定義については § 9.16 Keywords を参照してください。

4.1.7 IRI のコンテキスト内での展開

この節は情報提供的です。

一般に、IRI が期待される場所では通常の IRI 展開ルールが適用されます(参照:§ 3.2 IRIs)。context 定義内では、用語が相互に循環依存しない限り、そのコンテキスト内で定義された用語をコンテキスト内で使用することもできます。例えば、型付き値を定義する際に xsd 名前空間を使うことは一般的です:

Example 39: コンテキスト内での IRI 展開
{
  "@context": {
    "xsd": "http://www.w3.org/2001/XMLSchema#",
    "name": "http://xmlns.com/foaf/0.1/name",
    "age": {
      "@id": "http://xmlns.com/foaf/0.1/age",
      "@type": "xsd:integer"
    },
    "homepage": {
      "@id": "http://xmlns.com/foaf/0.1/homepage",
      "@type": "@id"
    }
  },
  ...
}

この例では、xsd 用語が定義され、age プロパティの @type 強制にプレフィックスとして使われています。

用語 は、他の用語の IRI を定義する際にも使用できます:

Example 40: コンテキスト内で他の用語の IRI 定義に用語を使用する例
{
  "@context": {
    "foaf": "http://xmlns.com/foaf/0.1/",
    "xsd": "http://www.w3.org/2001/XMLSchema#",
    "name": "foaf:name",
    "age": {
      "@id": "foaf:age",
      "@type": "xsd:integer"
    },
    "homepage": {
      "@id": "foaf:homepage",
      "@type": "@id"
    }
  },
  ...
}

コンパクト IRI や IRI は、用語定義の左辺でも使用できます。

Example 41: コンパクト IRI を用語として使用する例
{
  "@context": {
    "foaf": "http://xmlns.com/foaf/0.1/",
    "xsd": "http://www.w3.org/2001/XMLSchema#",
    "name": "foaf:name",
    "foaf:age": {
      "@id": "http://xmlns.com/foaf/0.1/age",
      "@type": "xsd:integer"
    },
    "foaf:homepage": {
      "@type": "@id"
    }
  },
  ...
}

上の例では、コンパクト IRI 形式が2通りの方法で使われています。 最初の方法では foaf:age が用語の IRI(短縮形)とその用語に対応する @type の両方を宣言しています。2番目の方法では、その用語に対応する @type のみを指定しています。foaf:homepage の完全な IRI はコンテキスト内で foaf 接頭辞を参照して決定されます。

警告

もしコンパクト IRI が用語として使われる場合、それはコンパクト IRI 自身が単独で展開されるときに得られる値に展開されなければなりません。 これは、用語が別の IRI に展開されてしまい望ましくない結果を招くのを防ぐために、元の 1.0 アルゴリズムから変更されたものです。

Example 42: コンパクト IRI を別の IRI に不正にエイリアスする例
{
  "@context": {
    "foaf": "http://xmlns.com/foaf/0.1/",
    "xsd": "http://www.w3.org/2001/XMLSchema#",
    "name": "foaf:name",
    "foaf:age": {
      "@id": "http://xmlns.com/foaf/0.1/age",
      "@type": "xsd:integer"
    },
    "foaf:homepage": {
     "@id": "http://schema.org/url",
     "@type": "@id"
    }
  },
  ...
}

IRIcontext のキー位置でも使用できます:

Example 43: IRI に関連付けたコンテキスト定義
{
  "@context": {
    "foaf": "http://xmlns.com/foaf/0.1/",
    "xsd": "http://www.w3.org/2001/XMLSchema#",
    "name": "foaf:name",
    "foaf:age": {
      "@id": "http://xmlns.com/foaf/0.1/age",
      "@type": "xsd:integer"
    },
    "http://xmlns.com/foaf/0.1/homepage": {
      "@type": "@id"
    }
  },
  ...
}

上の例で IRI が一致するためには、JSON-LD ドキュメント内でその IRI が使用される必要があります。また、foaf:homepage{ "@type": "@id" } の宣言を使いません。なぜなら foaf:homepagehttp://xmlns.com/foaf/0.1/homepage と同一ではないからです。つまり、用語は接頭辞検索の前にまず文字列の直接比較によってコンテキスト内で検索されます。

警告

IRI 参照やコンパクト IRI が、他の無関係な IRI に展開されることは許されません。これは以前の 1.0 アルゴリズムで許容されていたが推奨されていなかった振る舞いからの変更です。

コンテキスト内で用語を使う際の唯一の他の例外は、循環定義が許されないことです。つまり、term1 の定義が term2 に依存し、かつ term2term1 に依存するような定義は不正です。例えば次のような context 定義は違法です:

Example 44: コンテキスト内での用語の不正な循環定義
{
  "@context": {
    "term1": "term2:foo",
    "term2": "term1:bar"
  },
  ...
}

4.1.8 スコープ付きコンテキスト

この節は情報提供的です。

展開された用語定義 (expanded term definition) は @context プロパティを含めることができ、これによりその用語で定義されたプロパティ値のための コンテキストスコープ付きコンテキスト)を定義できます。プロパティに対して使われる場合、これを プロパティスコープ付きコンテキスト と呼びます。 これにより、値側でその値自身に指定されているかのように、別のノードオブジェクトとは異なる用語定義、ベース IRI、語彙マッピング、デフォルト言語などを値が使えるようになります。

この場合、ソーシャルプロファイルは schema.org 語彙を使って定義されていますが、interest は FOAF からインポートされ、そのプロパティは FOAF 語彙に由来するノードを定義するために使われています。

このドキュメントを展開すると、外側のコンテキストで定義された用語と、その用語専用に定義された プロパティスコープ付きコンテキスト の用語を組み合わせて使用します。

スコーピングは @type の値として使われる用語を使っても行えます:

@type に対するスコーピングは、共通のプロパティが異なる型のものを関連付ける場合に有用です。エンティティによって用いられる語彙が異なるため、コンテキストのスコーピングが異なることがあります。たとえば hasPart/partOf は共通して使われる用語ですが、文脈によって意味が異なる場合があります。 型スコープ付きコンテキスト は、その型が使用されているノードオブジェクトに対してのみ有効です;別のノードオブジェクトに移る際には以前に有効だったコンテキストが再び有効になります。 § 4.1.9 Context Propagation で詳述するように、これは @propagate キーワードで制御できます。

注記

ノードオブジェクト内で導入された プロパティスコープ付き またはローカルな コンテキスト は、別のノードオブジェクトへ移動しても引き続き有効であることに注意してください。

展開時、@type の各値は(辞書順に並べられて)検討され、その値がアクティブコンテキスト内の用語でかつ独自の 型スコープ付きコンテキスト を持つ場合、そのスコープ付きコンテキストがアクティブコンテキストに適用されます。

注記

@type の値は順序付けられていないため、複数の型が列挙されている場合、適用される 型スコープ付きコンテキスト の順序は辞書順に基づきます。

例えば、次の意味論的に同等な例を考えてみてください。最初の例は、プロパティと型がそれぞれ自身のスコープ付きコンテキストを定義し、それが展開時に取り込まれる方法を示しています。

Example 47: 埋め込みとスコープ付きコンテキストを使用した展開
{
  "@context": {
    "@version": 1.1,
    "@vocab": "http://example.com/vocab/",
    "property": {
      "@id": "http://example.com/vocab/property",
      "@context": {
        "term1": "http://example.com/vocab/term1"
         ↑ "property" のスコープ付きコンテキストは term1 を定義
      }
    },
    "Type1": {
      "@id": "http://example.com/vocab/Type1",
      "@context": {
        "term3": "http://example.com/vocab/term3"
         ↑ "Type1" のスコープ付きコンテキストは term3 を定義
      }
    },
    "Type2": {
      "@id": "http://example.com/vocab/Type2",
      "@context": {
        "term4": "http://example.com/vocab/term4"
         ↑ "Type2" のスコープ付きコンテキストは term4 を定義
      }
    }
  },
  "property": {
    "@context": {
      "term2": "http://example.com/vocab/term2"
         ↑ 埋め込みコンテキストは term2 を定義
    },
    "@type": ["Type2", "Type1"],
    "term1": "a",
    "term2": "b",
    "term3": "c",
    "term4": "d"
  }
}

コンテキストは定義方法に応じて処理されます。プロパティスコープ付きコンテキスト が最初に処理され、その後に埋め込みコンテキスト、最後に適切な順序で 型スコープ付きコンテキスト が処理されます。前の例は次のように論理的に同等です:

Example 48: 埋め込みとスコープ付きコンテキストを使用した展開(埋め込み同値)
{
  "@context": {
    "@vocab": "http://example.com/vocab/",
    "property": "http://example.com/vocab/property",
    "Type1": "http://example.com/vocab/Type1",
    "Type2": "http://example.com/vocab/Type2"
  },
  "property": {
    "@context": [{
        "term1": "http://example.com/vocab/term1"
         ↑ 以前のスコープ付きコンテキスト(property)が term1 を定義
      }, {
        "term2": "http://example.com/vocab/term2"
         ↑ 埋め込みコンテキストが term2 を定義
      }, {
        "term3": "http://example.com/vocab/term3"
         ↑ 以前のスコープ付きコンテキスト(Type1)が term3 を定義
      }, {
      "term4": "http://example.com/vocab/term4"
         ↑ 以前のスコープ付きコンテキスト(Type2)が term4 を定義
    }],
    "@type": ["Type2", "Type1"],
    "term1": "a",
    "term2": "b",
    "term3": "c",
    "term4": "d"
  }
}
注記

もしある 用語スコープ付きコンテキスト を定義し、その後その用語が再定義された場合、以前の展開された用語定義で定義されたコンテキストとの関連付けはその再定義のスコープ内では失われます。これは、以前のより浅い定義からの用語定義が上書きされるという用語定義の挙動と一致します(詳細は § 4.1 Advanced Context Usage を参照)。

注記

スコープ付きコンテキスト は JSON-LD 1.1 の新機能です。

4.1.9 コンテキストの伝播

この節は規範的ではありません。

一度導入された context は、その後に別の context@contextnull に設定して除去するか、用語を再定義するまで有効なままです。ただし、効果を次の node object に入るまでに限定する type-scoped contexts の例外があります。 この挙動は @propagate キーワードによって変更できます。

次の例は、@propagatefalse に設定されたコンテキスト内で定義された用語が、 新しい node object に降りるときに実質的に除去されることを示しています。

注記

配列内に含まれるコンテキストは、JSON-LD 1.1 Processing Algorithms and API におけるロールバックの定義方法のため、すべて同じ @propagate の値である必要があります。

4.1.10 インポートされたコンテキスト

この節は規範的ではありません。

JSON-LD 1.0 には、有効な context を変更するメカニズムが含まれていました。これには、リモートの context をロードして処理し、その後新しい contexts 経由で追加の変更を適用する機能が含まれていました。

しかし、JSON-LD 1.1 の導入に伴い、リモートの context(特に既存の JSON-LD 1.0 の context)をロードして、処理前に JSON-LD 1.1 の機能を適用できるようにすることが望ましい場合があります。

context 内で @import キーワードを使用することで、別のリモートの context(インポートされた context と呼ばれる)をロードして処理前に修正できます。修正は @import キーワードを含む、いわゆるラッピング context 内で表現されます。インポートされた context がロードされると、ラッピングする context の内容が処理前にその中へマージされます。マージ操作は、ラッピング context の各キーと値のペアをロードされたインポート先の context に追加し、ラッピング側のキーと値が優先される形で行われます。

既存の context を再利用し、処理前にインラインで編集できるようにすることで、コンテキスト全体のキーワードを適用してインポートされた context 内のすべての用語定義を調整できます。同様に、用語定義を処理前に置き換えることも可能で、例えば保護された用語と整合させたり、追加の型強制情報を含めたりする調整が行えます。

次の例は、@import を使って、インポートされた context をロードし、@propagatetrue に設定することで、type-scoped context を表現する方法を示しています。

仮に URL https://json-ld.org/contexts/remote-context.jsonld で参照可能な context があるとします:

Example 50: type-scoped context 内でインポートされるリモートコンテキスト
{
  "@context": {
    "Type1": "http://example.com/vocab/Type1",
    "Type2": "http://example.com/vocab/Type2",
    "term1": "http://example.com/vocab#term1",
    "term2": "http://example.com/vocab#term2",
    ...
  }
}

ラッピング context を使ってそれをソースし、修正できます:

Example 51: type-scoped context でコンテキストを取り込み、伝播させるように設定する
{
  "@context": {
    "@version": 1.1,
    "MyType": {
      "@id": "http://example.com/vocab#MyType",
      "@context": {
        "@version": 1.1,
        "@import": "https://json-ld.org/contexts/remote-context.jsonld",
        "@propagate": true
      }
    }
  }
}

その効果は、インポートされた context 全体が type-scoped context にコピーされたかのようになります:

Example 52: type-scoped context 内でコンテキストを取り込み、伝播させるように設定した結果
{
  "@context": {
    "@version": 1.1,
    "MyType": {
      "@id": "http://example.com/vocab#MyType",
      "@context": {
        "@version": 1.1,
        "Type1": "http://example.com/vocab/Type1",
        "Type2": "http://example.com/vocab/Type2",
        "term1": "http://example.com/vocab#term1",
        "term2": "http://example.com/vocab#term2",
        ...
        "@propagate": true
      }
    }
  }
}

同様に、ラッピング context は、用語定義を置き換えたり、インポートされた context の用語定義の処理方法に影響する他のコンテキスト全体のキーワードを設定したりできます:

Example 53: @vocab と用語定義を修正するためにコンテキストを取り込む
{
  "@context": {
    "@version": 1.1,
    "@import": "https://json-ld.org/contexts/remote-context.jsonld",
    "@vocab": "http://example.org/vocab#",
     ↑ これは処理前に既存の @vocab 定義を置き換えます
    "term1": {
      "@id": "http://example.org/vocab#term1",
      "@type": "http://www.w3.org/2001/XMLSchema#integer"
    }
     ↑ これは処理前に古い term1 定義を置き換えます
  }
}

繰り返しますが、その効果はインポートされた context 全体が context にコピーされたかのようになります:

Example 54: @vocab と用語定義を修正するためにコンテキストを取り込んだ結果
{
  "@context": {
    "@version": 1.1,
    "Type1": "http://example.com/vocab/Type1",
    "Type2": "http://example.com/vocab/Type2",
    "term1": {
      "@id": "http://example.org/vocab#term1",
      "@type": "http://www.w3.org/2001/XMLSchema#integer"
    },
     ↑ 注意: term1 は処理前に置き換えられています
    "term2": "http://example.com/vocab#term2",
    ...,
    "@vocab": "http://example.org/vocab#"
  }
}

インポートされた context をロードした結果は context definition でなければならず、 IRI配列 ではあってはなりません。 さらに、インポートされたコンテキストは @importentry を含むことはできません。

4.1.11 保護された用語定義

この節は規範的ではありません。

JSON-LD は多くの仕様で指定されたデータ形式として使われていますが、 一方で一部の JSON-LD コンテンツを JSON-LD のアルゴリズムを使わずにプレーンな JSON として処理したいという要望もあります。 JSON-LD は非常に柔軟なため、元の形式のいくつかの用語は 埋め込みコンテキスト を使ってローカルに上書きされ、JSON-LD ベースの実装では異なる意味を持つことがあります。 一方で「プレーンな JSON」実装はこれらの 埋め込みコンテキスト を解釈できない可能性があり、その結果これらの用語は元の意味で解釈され続けます。 解釈の分岐を防ぐために、JSON-LD 1.1 では用語定義を 保護(protected) できるようにしています。

保護された用語定義 とは、entry @protectedtrue に設定された用語定義のことです。 これにより、通常は同名の新しい定義や "@context": null によるコンテキストのクリアによってこの用語定義を上書きすることができなくなります。 そのような試みはエラーを発生させ、処理を中止します(ただし下記 例外 に示す特定の状況を除きます)。

Example 55: 保護された用語定義は一般に上書きできない
{
  "@context": [
    {
      "@version": 1.1,
      "Person": "http://xmlns.com/foaf/0.1/Person",
      "knows": "http://xmlns.com/foaf/0.1/knows",
      "name": {
        "@id": "http://xmlns.com/foaf/0.1/name",
        "@protected": true
      }
    },
    {
      – この試みはエラーになり失敗します
      "name": "http://schema.org/name"
    }
  ],
  "@type": "Person",
  "name": "Manu Sporny",
  "knows": {
    "@context": [
      – この試みもエラーで失敗します
      null,
      "http://schema.org/"
    ],
    "name": "Gregg Kellogg"
  }
}

コンテキストの用語定義のほとんどまたはすべてを保護する必要がある場合、 コンテキスト自体に entry @protectedtrue に設定できます。 これは各用語定義を個別に保護するのと同じ効果を持ちます。 いくつかの用語定義で @protectedfalse に設定することで例外を設けることもできます。

保護された用語は一般に上書きできませんが、これには 2 つの例外があります。 第一の例外は、新しい定義が保護された用語定義と同一である場合、そのコンテキストは保護された用語定義を再定義できます(@protected フラグの差を除く)。 理由は、新しい定義が保護を侵害せず、保護された用語の意味を変更しないからです。 これは、@typetype にエイリアスするような広く使われる用語定義に便利で、複数のコンテキストで(保護された形であれ)発生し得ます。

第二の例外は、property-scoped context は保護の影響を受けず、したがって保護された用語を新しい用語定義で上書きしたり、"@context": null でコンテキストをクリアしたりできることです。

その理由は、「プレーンな JSON」実装は特定の仕様に従ったプロパティのみをたどるためです。仕様に属するプロパティに関連する スコープ付きコンテキスト は仕様の一部であり、「プレーンな JSON」実装はこれらが意味に与える変更を認識していると期待されます。他のプロパティに属する スコープ付きコンテキスト は、「プレーンな JSON」実装が無視するドキュメントの部分に適用されます。いずれの場合も、JSON-LD 対応実装と「プレーンな JSON」実装の間で解釈の分岐が生じるリスクはないため、上書きが許可されます。

注記

用語の上書きを防ぐことで、用語の適応(例えば、より正確なデータ型の定義、用語のリスト使用への制限など)も防がれます。この種の適応は汎用のコンテキストで頻繁に行われるため、保護は可用性を損なうことがあります。その結果、コンテキスト発行者はこの機能を慎重に使うべきです。

注記

保護された用語定義は JSON-LD 1.1 の新機能です。

4.2 値の記述

この節は情報提供的です。

値とは文字列、日付、時刻などのスカラー値に対応するグラフの葉ノードです(strings やその他の原子的な値を含みます)。

4.2.1 型付き値

この節は情報提供的です。

付随する型を持つ値(typed value とも呼ばれる)は、その値の型を示す IRI と値を関連付けることで示されます。JSON-LD では型付き値を次の3通りの方法で表現できます:

  1. @context セクション内で @type keyword を用いて term を定義する方法。
  2. value object を利用する方法。
  3. numbertruefalse のようなネイティブ JSON 型を使う方法。

最初の例では、@type キーワードを使って @context 内の特定の term に型を関連付けています:

上の例では、modified キーの値は @context に指定された情報により自動的に dateTime 値として解釈されます。例のタブは JSON-LD プロセッサがどのようにデータを解釈するかを示しています。

2番目の例は、JSON-LD ドキュメント本体で型情報を設定する展開形の使用例です:

上の両例は型 http://www.w3.org/2001/XMLSchema#dateTime を伴う値 2010-05-29T14:17:39+02:00 を生成します。型の値を表現するために termcompact IRI を用いることも可能です。

注記

@type キーワードはノードに対して型を関連付けるためにも使われます。ノード の型(node type)と値の型(value type)は区別されます。ノードへの型付与の詳細は § 3.5 Specifying the Type を参照してください。

注記

展開時、用語定義内で定義された @type は文字列値に関連付けられて展開済みの value object を生成することができます(詳細は § 4.2.3 Type Coercion を参照)。型強制は文字列値に対してのみ行われ、展開済み形式のマップ(ノードオブジェクトや value object)には適用されません。

ノード型(node type) は、人物、場所、イベント、ウェブページのように記述される対象の種類を指定します。値の型(value type) は整数、浮動小数点数、日付のような特定の値のデータ型を指定します。

Example 61: @type のコンテキスト感受性の例
{
  ...
  "@id": "http://example.org/posts#TripToWestVirginia",
  "@type": "http://schema.org/BlogPosting",  ← これはノード型です
  "http://purl.org/dc/terms/modified": {
    "@value": "2010-05-29T14:17:39+02:00",
    "@type": "http://www.w3.org/2001/XMLSchema#dateTime"  ← これは値の型です
  }
  ...
}

上の最初の @type の使用は ノード型http://schema.org/BlogPosting)をノードに関連付けます。これは @id キーワードを用いて表現されます。2つ目の @type の使用は 値の型http://www.w3.org/2001/XMLSchema#dateTime)を @value で表現された値に関連付けます。一般に、同一のマップ内で @value@type が使われている場合、@type値の型 を示します。そうでない場合、@typeノード型 を示します。上の例は次のデータを表現します:

4.2.2 JSON リテラル

この節は情報提供的です。

時として、JSON-LD の中に JSON 自体を含めたい場合があり、その JSON が JSON-LD として解釈されないことが望まれます。一般に JSON-LD プロセッサは IRI にマップされないプロパティを無視しますが、これによりアルゴリズム変換の過程でそれらが除外されることがあります。記述するデータ自体が JSON の場合、変換を通じてデータが保持されることが重要です。

警告

JSON-LD は context を利用してネイティブ JSON を解釈可能にすることを意図しています。JSON リテラル の使用は解釈不能なデータの塊(blob)を作り出します。これは JSON を JSON-LD として表現できない稀なケースでのみ使用すべきです。

用語が @type@json を指定して定義されると、JSON-LD プロセッサはその値をさらに JSON-LD として解釈せず、JSON リテラル として扱います。展開済みドキュメント形式では、そのような JSON は "@type": "@json" を持つ value object@value の値になります。

RDF に変換される際、JSON リテラルは特定の JSON シリアライゼーションに基づく字句表現(lexical form)を持ちます。これは JSON-LD11-API の Compaction algorithm や JSON データ型 に記載された方法に従います。

以下の例はプロパティの値として格納された JSON リテラルの例です。RDF 結果は相互運用性を保証するために JSON の正規化された形式を使用する点に注意してください(JSON の正規化は JSON-LD11-API の Data Round Tripping に説明されています)。

注記

一般に JSON-LD プロセッサが null に遭遇した場合、関連するエントリや値は削除されます。しかし null は有効な JSON トークンであり、JSON リテラル の値として使われる場合は保存されます。

4.2.3 型の強制(Type Coercion)

この節は情報提供的です。

JSON-LD は文字列(string)値を特定のデータ型に強制することをサポートします。型強制(coercion) により、JSON-LD を導入する側は文字列のプロパティ値を使いつつ、それらの値を展開済みの value object 表現で型付き値として解釈させることができます。型強制を使えば、各データ片に対してデータ型を明示的に指定する必要なく文字列表現を利用できます。

型強制は 展開済み用語定義 内で @type キーを使って指定します。このキーの値は IRI に展開されます。あるいは @id または @vocab を値にして、ドキュメント中の文字列値が @id または @vocab に強制されることを示すこともできます。@vocab@id の違いは、値を IRI に展開する際の振る舞いです。@vocab はまずその値を用語として展開し、マッチする用語が無ければコロンが含まれている場合に IRI/compact IRI として展開し、そうでなければアクティブコンテキストの語彙マッピングで展開します。@id に強制された値はコロンが含まれていれば IRI または compact IRI として展開され、そうでなければ相対 IRI 参照として解釈されます。

注記

用語定義による値の強制はノードオブジェクトに型を設定することとは異なります。前者はグラフに新しいデータを追加しませんが、後者はノード型を追加の関係としてグラフに管理します。

用語 または compact IRI@type の値として使う場合、それらは同一のコンテキスト内で定義できます。例えば xsd のような用語を指定しておき、同一コンテキスト内で xsd:integer を使うことができます。

次の例は、JSON-LD の作成者がどのように値を型付き値や IRI に強制できるかを示します。

用語はキーやマップエントリの値のような語彙相対位置での展開にのみ使われる点に注意してください。@id の値はドキュメント相対として扱われ、用語定義による展開は行われません。例えば次の例を考えてください:

予期しない結果として、"barney" は出現箇所によって http://example1.com/barneyhttp://example2.com/barney の両方に展開されます。用語定義により IRI として解釈される文字列値は通常ドキュメント相対と見なされますが、語彙相対("@type": "@vocab" のように)で解釈するよう指定するとこのような予期せぬ結果を招くことがあります。

前の例では "barney" が @id の値として一度、そして "fred" の値として一度現れます。前者は常にドキュメント相対 IRI として解釈され、後者は語彙相対として定義されているため異なる展開値になります。

詳細は § 4.1.2 デフォルト語彙 を参照してください。

前の例の変形で "@type": "@id" を使用すると、"barney" をドキュメント相対として解釈する振る舞いが示されます:

注記

トリプル ex1:fred ex2:knows ex1:barney . は二回出力されますが、出力データセット内では重複トリプルとして1回だけ存在します。

用語はまた IRI や compact IRI を使って定義することもでき、これにより単純な用語形式ではないキーにも強制ルールを適用できます。例えば:

この場合、用語定義中の @id 定義は省略可能です。存在する場合、用語を表す IRI または compact IRI は、プレフィックスの有無にかかわらず常に @id キーで定義された IRI に展開されます。

型強制は常にキーの未展開値に対して行われます。上の例では、型強制はアクティブコンテキスト内で foaf:age を探すことで行われ、対応する展開済み IRI http://xmlns.com/foaf/0.1/age を探すわけではありません。

注記

コンテキスト内のキーは展開および値の強制の目的で用語として扱われます。これにより同じ展開済み IRI に対して複数の表現が生じることがあります。例えば dogcat が共に http://example.com/vocab#animal に展開されるよう指定できます。これにより異なる型強制や言語指定ルールを確立するのに役立ちます。

4.2.4 文字列の国際化(String Internationalization)

この節は情報提供的です。

文字列に言語を付与する必要がある場合があります。JSON-LD ではいくつかの方法でこれが可能です。まず、コンテキストの @language キーを設定して JSON-LD ドキュメントの デフォルト言語 を定義できます:

上の例は2つの文字列 花澄科学者ja の言語タグを関連付けます。言語タグは BCP47 に準拠します。デフォルト言語は型強制された値には適用されません。

サブツリーのデフォルト言語をクリアするには、介在するコンテキスト(例えばスコープ付きコンテキスト)で @languagenull に設定します:

Example 69: デフォルト言語をクリアする
{
  "@context": {
    ...
    "@version": 1.1,
    "@vocab": "http://example.com/",
    "@language": "ja",
    "details": {
      "@context": {
        "@language": null
      }
    }
  },
  "name": "花澄",
  "details": {"occupation": "Ninja"}
}

次に、特定の用語に言語を関連付けることも可能です(展開済み用語定義を使用):

Example 70: 言語を伴う展開済み用語定義
{
  "@context": {
    ...
    "ex": "http://example.com/vocab/",
    "@language": "ja",
    "name": { "@id": "ex:name", "@language": null },
    "occupation": { "@id": "ex:occupation" },
    "occupation_en": { "@id": "ex:occupation", "@language": "en" },
    "occupation_cs": { "@id": "ex:occupation", "@language": "cs" }
  },
  "name": "Yagyū Muneyoshi",
  "occupation": "忍者",
  "occupation_en": "Ninja",
  "occupation_cs": "Nindža",
  ...
}

上の例では 忍者 にデフォルト言語タグ ja が、NinjaenNindžacs がそれぞれ関連付けられます。name の値は @language が用語定義内で null にリセットされているため言語タグが付きません。

注記

言語の関連付けは平文の 文字列 にのみ適用されます。型付き値や型強制の対象となる値には言語タグは付与されません。

また、複数言語でプロパティの値を表現する必要がある場合、プログラムから言語別のデータにアクセスしやすくするために 言語マップ を使用することがあります。

Example 71: 3言語でプロパティを表現する言語マップ
{
  "@context": {
    ...
    "occupation": { "@id": "ex:occupation", "@container": "@language" }
  },
  "name": "Yagyū Muneyoshi",
  "occupation": {
    "ja": "忍者",
    "en": "Ninja",
    "cs": "Nindža"
  }
  ...
}

上の例は前の例と同じ情報を表現しますが、すべての値を単一のプロパティに集約しています。言語別にアクセスする際は obj.occupation.en のようにドット表記で簡単に取得できます(言語が一次サブタグに限定される場合など)。

第三に、value object を使ってデフォルト言語をオーバーライドすることもできます:

Example 72: 展開済み値を使ってデフォルト言語を上書きする
{
  "@context": {
    ...
    "@language": "ja"
  },
  "name": "花澄",
  "occupation": {
    "@value": "Scientist",
    "@language": "en"
  }
}

これは value object を使って @language を省略するか null に設定することで平文の文字列を指定することも可能にします:

Example 73: 展開済み値を使って言語情報を除去する
{
  "@context": {
    ...
    "@language": "ja"
  },
  "name": {
    "@value": "Frank"
  },
  "occupation": {
    "@value": "Ninja",
    "@language": "en"
  },
  "speciality": "手裏剣"
}

言語マップの使用法については § 9.8 Language Maps を参照してください。

4.2.4.1 基底方向(Base Direction)

この節は情報提供的です。

文字列や言語タグ付き文字列に基底方向(base direction)を注記することも可能です。言語と同様にコンテキストの @direction キーでドキュメントのデフォルト基底方向を定義できます:

上の例は2つの文字列に対して ar-EG の言語タグと rtl の基底方向を関連付けます。デフォルト基底方向は型強制されていないすべての文字列値に適用されます。

サブツリーのデフォルト基底方向をクリアするには、介在するコンテキストで @directionnull に設定します:

Example 75: デフォルト基底方向をクリアする
{
  "@context": {
    ...
    "@version": 1.1,
    "@vocab": "http://example.com/",
    "@language": "ar-EG",
    "@direction": "rtl",
    "details": {
      "@context": {
        "@direction": null
      }
    }
  },
  "title": "HTML و CSS: تصميم و إنشاء مواقع الويب",
  "details": {"genre": "Technical Publication"}
}

次に、特定の用語に基底方向を関連付けることも可能です(展開済み用語定義を使用):

Example 76: 言語と方向を伴う展開済み用語定義
{
  "@context": {
    ...
    "@version": 1.1,
    "@language": "ar-EG",
    "@direction": "rtl",
    "ex": "http://example.com/vocab/",
    "publisher": { "@id": "ex:publisher", "@direction": null },
    "title": { "@id": "ex:title" },
    "title_en": { "@id": "ex:title", "@language": "en", "@direction": "ltr" }
  },
  "publisher": "مكتبة",
  "title": "HTML و CSS: تصميم و إنشاء مواقع الويب",
  "title_en": "HTML and CSS: Design and Build Websites",
  ...
}

上の例は3つのプロパティを生成します:

主語 プロパティ 言語 方向
_:b0 http://example.com/vocab/publisher مكتبة ar-EG
_:b0 http://example.com/vocab/title HTML و CSS: تصميم و إنشاء مواقع الويب ar-EG rtl
_:b0 http://example.com/vocab/title HTML and CSS: Design and Build Websites en ltr
注記

基底方向の関連付けは平文の文字列および言語タグ付き文字列にのみ適用されます。型付き値や型強制の対象となる値には基底方向は付与されません。

第三に、value object を使ってデフォルト言語とデフォルト基底方向の両方をオーバーライドすることも可能です:

Example 77: 展開済み値でデフォルト言語とデフォルト基底方向を上書きする
{
  "@context": {
    ...
    "@language": "ar-EG",
    "@direction": "rtl"
  },
  "title": "HTML و CSS: تصميم و إنشاء مواقع الويب",
  "author": {
    "@value": "Jon Duckett",
    "@language": "en",
    "@direction": null
  }
}

基底方向の詳細については Strings on the Web: Language and Direction Metadata を参照してください。

4.3 値の順序付け

この節は情報提供的です。

JSON-LD の作成者は、配列を使って複数の値を簡潔に表現できます。グラフはノード間のリンクの順序を記述しないため、JSON-LD の配列はデフォルトで含まれる要素の順序を意味しません。これは、通常の JSON 配列(デフォルトで順序がある)の振る舞いとは正反対です。例えば次の簡単なドキュメントを考えてみてください:

複数の値は展開形式を使って表現することもできます:

注記

上の例はステートメントを生成しますが、再び固有の順序はありません。

プロパティの複数値は通常同じ型ですが、JSON-LD はこれを制限しないため、異なる型の値を持つこともできます:

注記

ステートメントとして見た場合、これらの値には固有の順序はありません。

4.3.1 リスト

この節は情報提供的です。

順序付きコレクションの概念はデータモデリングで重要であるため、特定の言語サポートが有用です。JSON-LD では、@list キーワードを使ってリストを次のように表現できます:

これは配列を順序付きとして扱うことを表し、ドキュメント処理時に順序が維持されます。あるマルチバリュープロパティのすべての使用がリストである場合、コンテキストで @container@list に設定することで省略できます:

RDF におけるリストの実装は、匿名ノードを rdf:firstrdf:rest で連結し、リストの終端を rdf:nil として定義します(「ステートメント」タブに示されているように)。これにより、順序をステートメントの集合の中に表現できます。

JSON-LD と Turtle の両方は、順序付きリストを表現するショートカットを提供します。

JSON-LD 1.1 では、リストの値が別の リストオブジェクト であるような入れ子のリスト(リストのリスト)も完全にサポートされています。

"@container": "@list" の定義は再帰的に配列値をリストとして扱うことを記述します。例えば GeoJSON のように、coordinates が複数の数値を要する順序付きの positions のリストである場合などに使えます:

Example 83: GeoJSON で表現された座標
{
  "type": "Feature",
  "bbox": [-10.0, -10.0, 10.0, 10.0],
  "geometry": {
    "type": "Polygon",
    "coordinates": [
        [
            [-10.0, -10.0],
            [10.0, -10.0],
            [10.0, 10.0],
            [-10.0, -10.0]
        ]
    ]
  }
  //...
}

これらの例では bboxcoordinates 内の値が順序を保持することが重要であり、埋め込みリスト構造の使用が必要です。JSON-LD 1.1 では、適切なコンテキスト定義を追加することで再帰的なリストを使ってこれを表現できます:

coordinates が3階層のリストを含んでいることに注意してください。

@list コンテナに関連付けられた用語の値は、たとえ単一値または値が存在しない場合でも常に配列の形式で表現されます。

4.3.2 集合(Sets)

この節は情報提供的です。

@list が順序付きリストを記述するために使われる一方で、@set キーワードは順序なしの集合を記述するために使われます。JSON-LD ドキュメント本文での @set の使用は処理時に最適化されて除去されます(単なる構文糖です)。しかし、ドキュメントのコンテキスト内で使うと有用です。@set コンテナに関連付けられた用語の値は、たとえ単一値であって縮約形式で非配列に最適化される場合でも、常に配列として表現されます(これにより後処理が容易になります)。

これは配列を順序なしとして扱うことを表し、ドキュメント処理時に順序が変わる可能性があることを示します。デフォルトでは配列値は順序なしですが、コンテキストで @container@set に設定して明示できます:

JSON-LD 1.1 以降、@set キーワードは展開済み用語定義内の他のコンテナ仕様と組み合わせて使用でき、縮約時にインデックスの値が一貫して配列で表現されるようにすることができます。詳細は § 4.6 インデックス化された値 を参照してください。

4.3.3 @set@type の併用

この節は情報提供的です。

processing modejson-ld-1.0 に設定されていない限り、@type@container@set に設定された 展開済み用語定義 と共に使うことができます;そのような展開済み用語定義内では他の エントリは設定できません。これは Compaction algorithm@type(またはそのエイリアス)の値を常に配列として表現することを保証するために使用します。

Example 87: @type に対して @container: @set を設定する例
{
  "@context": {
    "@version": 1.1,
    "@type": {"@container": "@set"}
  },
  "@type": ["http:/example.org/type"]
}

4.4 入れ子のプロパティ

この節は情報提供的です。

多くの JSON API はプロパティをエンティティから中間オブジェクトで分離します。JSON-LD ではこれらを 入れ子のプロパティ と呼びます。 例えば、一連のラベルを共通のプロパティの下にまとめることができます:

labelsキーワード @nest を使って定義すると、 JSON-LD プロセッサlabels プロパティで作られた入れ子を無視し、その中身を親オブジェクト内に直接宣言されたかのように処理します。この場合、labels プロパティ自体は意味的に無意味になります。これを @nest と等価に定義すると、展開時に無視され、以下の例と同等になります:

同様に、用語定義@nest にエイリアスされた用語を参照するプロパティを含めることができ、縮約時にそのエイリアスされた用語の下へプロパティが入れ子になるようにすることができます。以下の例では、main_labelother_label の両方に "@nest": "labels" が定義されており、縮約するとそれらは labels の下にシリアライズされます。

Example 90: プロパティ入れ子の定義 - 展開済み入力
[{
  "@id": "http://example.org/myresource",
  "http://xmlns.com/foaf/0.1/homepage": [
    {"@id": "http://example.org"}
  ],
  "http://www.w3.org/2004/02/skos/core#prefLabel": [
    {"@value": "This is the main label for my resource"}
  ],
  "http://www.w3.org/2004/02/skos/core#altLabel": [
    {"@value": "This is the other label"}
  ]
}]
Example 91: プロパティ入れ子の定義 - コンテキスト
{
  "@context": {
    "@version": 1.1,
    "skos": "http://www.w3.org/2004/02/skos/core#",
    "labels": "@nest",
    "main_label": {"@id": "skos:prefLabel", "@nest": "labels"},
    "other_label": {"@id": "skos:altLabel", "@nest": "labels"},
    "homepage": {"@id": "http://xmlns.com/foaf/0.1/homepage", "@type": "@id"}
  }
}
注記

入れ子のプロパティ は JSON-LD 1.1 の新機能です。

4.5 埋め込み

この節は情報提供的です。

埋め込み は、作者が ノードオブジェクト を プロパティ値として使用できる JSON-LD の機能です。これは2つのノード間に親子関係を作るために一般的に用いられます。

埋め込みを使用しない場合、ノードオブジェクト は別のノードオブジェクトの識別子を参照することでリンクされます。例えば次のようになります:

前の例は Manu と Gregg の2つの ノードオブジェクト を記述しており、knows プロパティは文字列値を識別子として扱うよう定義されています。埋め込み を使うと、Gregg のノードオブジェクトを knows プロパティの値として 埋め込む ことができます:

上記のようなノードオブジェクトは、JSON-LD ドキュメント本文内の任意の値位置で使用できます。

グラフ内のノードに識別子を付与することは推奨されますが、実用上それが難しい場合もあります。データモデルでは明示的な識別子を持たないノードを ブランクノード と呼び、JSON-LD のようなシリアライゼーションでは ブランクノード識別子 を使って表現できます。前の例では、Manu のトップレベルノードは識別子を持たず、データモデル内で記述するために識別子を持つ必要はありません。しかし Gregg から Manu への knows 関係を記述したい場合は、ブランクノード識別子(ここでは _:b0)を導入する必要があります。

ブランクノード識別子flattening のようなアルゴリズムによって自動導入されることがありますが、作者がそのような関係を直接記述するためにも有用です。

4.5.1 ブランクノードの識別

この節は情報提供的です。

時として、ノードを一意に識別することなしに情報を表現する必要が生じます。この種のノードは ブランクノード と呼ばれます。JSON-LD はすべてのノードに @id を要求しません。ただし、ループを含むグラフのトポロジーは埋め込みのみではシリアライズできず、ノードを接続するために @id が必要です。このような場合に、スキームとしてアンダースコア(_)を使うことで IRI のように見える ブランクノード識別子 を使用できます。これによりドキュメント内でローカルにノードを参照できますが、外部ドキュメントから参照することはできません。ブランクノード識別子はそれが使用されるドキュメントにスコープされます。

上の例は IRI で識別できない2人の秘密エージェントに関する情報を含みます。agent 1agent 2 を知っていることはブランクノード識別子なしでも表現可能ですが、agent 2 から agent 1 を参照するためには agent 1 に識別子を割り当てる必要があります。

ブランクノード識別子は処理中にラベルが置き換えられることがある点に注意してください。開発者が同じブランクノードを複数回参照する場合、そのノードにデリファレンス可能な IRI を割り当てて他のドキュメントからも参照できるようにすることを検討すべきです。

4.6 インデックス化された値

この節は情報提供的です。

複数のプロパティ値に対して、配列を走査するよりも直接的にアクセスする必要がある場合があります。JSON-LD は、中間の マップ を用いて特定のインデックスと関連する値を関連付けるインデックス機構を提供します。

データ インデクシング
§ 4.6.1 Data Indexing で説明されているように、データインデクシングは任意のキーでノードや値を参照できるようにします。
言語インデクシング
§ 4.6.2 Language Indexing で説明されているように、言語インデクシングは言語を文字列に関連付け、その文字列に紐づく言語として解釈されるようにします。
ノード識別子インデクシング
§ 4.6.3 Node Identifier Indexing で説明されているように、ノード識別子インデクシングはIRIノードを参照し、そのノードの識別子として解釈されるようにします。
ノード型インデクシング
§ 4.6.4 Node Type Indexing で説明されているように、ノード型インデクシングはIRIノードを参照し、そのノードの型として解釈されるようにします。

JSON-LD におけるその他のインデクシングの使用法については § 4.9 Named Graphs を参照してください。

4.6.1 データインデクシング

この節は情報提供的です。

データベースは通常、データへのアクセス効率を向上させるために使われます。開発者はこのような機能をアプリケーションデータに拡張して同様の性能向上を実現することがよくあります。この種のデータは Linked Data 的な観点から意味を持たないことがありますが、アプリケーションにとっては有用です。

JSON-LD はデータをより効率的にアクセスできる形に構築するために使用できる インデックスマップ の概念を導入します。データインデクシング機能により、キーが IRI にマップされない単純なキー・値マップを使ってデータを構造化できます。これにより特定の項目を探すために配列を走査する代わりに直接データへアクセスできます。JSON-LD では、このようなデータをコンテキスト内で @indexkeyword@container 宣言と関連付けることで指定できます:

上の例では、athletestermインデックスマップ としてマークされています。catcherpitcher のキーは意味論的には無視されますが、構文上は JSON-LD プロセッサによって保持されます。JavaScript で使用する場合、開発者は次のコードスニペットで特定の選手にアクセスできます: obj.athletes.pitcher

データの解釈はステートメント表に示されています。インデックスキーはステートメントには現れないことに注意してください。ただし、ドキュメントがコンパクト化または展開された場合でも(§ 5.2 Compacted Document Form および § 5.1 Expanded Document Form を参照)、JSON-LD プロセッサによって構文的に保存され続けます。

警告

データインデックスは RDF へのラウンドトリップ時に保持されないため、この機能は慎重に使用するべきです。しばしば、保持される他のインデックス機構の方が適切です。

@container の値は @index@set の両方を含む配列にすることもできます。縮約時にこれを使うと、JSON-LD Processor がインデックスのすべての値に対して配列形式を使用することを保証します。

processing modejson-ld-1.0 に設定されていない限り、関連するインデックスを持たないデータをインデックス化するために特殊なインデックス @none が使用され、正規化された表現を維持するのに役立ちます。

4.6.1.1 プロパティベースのデータインデクシング

この節は情報提供的です。

最も単純な形(上の例のように)では、データインデクシングはインデックスマップのキーに意味論を割り当てません。しかし、場合によっては、オブジェクトをインデックスするために使われるキーがそれらのオブジェクトと意味論的にリンクしており、構文的にだけでなく意味論的にも保持されるべきです。

processing modejson-ld-1.0 に設定されていない限り、用語記述内の "@container": "@index""@index" キーを伴うことができます。そのキーの値は IRI に展開される必要があり、各オブジェクトをキーに結びつける意味的なプロパティを識別します。

注記

プロパティベースのデータインデクシングを使用する場合、インデックスマップノードオブジェクト のみに使用でき、値オブジェクトグラフオブジェクト には使用できません。値オブジェクトは特定のキーのみを持つよう制限されており、任意のプロパティをサポートしません。

4.6.2 言語インデクシング

この節は情報提供的です。

複数言語の文字列値を含む JSON は、言語マップ を使って表現でき、プロパティ値を言語タグで簡単にインデックス化できます。これにより特定の項目を探すために配列を走査する代わりに言語値へ直接アクセスできます。JSON-LD では、このようなデータをコンテキスト内で @languagekeyword@container 宣言と関連付けることで指定できます:

上の例では、labelterm言語マップ としてマークされています。ende のキーは JSON-LD Processor によってそれぞれの値に暗黙的に関連付けられます。これにより開発者は obj.label.de のようにドイツ語版の label にアクセスできますが、これは言語が一次サブタグに限定され、例えば "de-at" のような追加サブタグに依存しない場合にのみ適切です。

@container の値は @language@set の両方を含む配列にすることもできます。縮約時にこれを使うと、JSON-LD Processor が言語タグのすべての値に対して配列形式を使用することを保証します。

processing modejson-ld-1.0 に設定されていない限り、言語を持たない文字列をインデックス化する場合に特殊インデックス @none が使用され、データ型を持たない文字列値に対して正規化された表現を維持するのに役立ちます。

4.6.3 ノード識別子インデクシング

この節は情報提供的です。

インデックスマップに加えて、JSON-LD はデータを構造化するための id マップ の概念を導入します。id インデクシング機能により、キーが IRI にマップされる単純なキー・値マップを使用してデータを構造化できます。これにより、特定の項目を探すために配列を走査する代わりに関連する ノードオブジェクト へ直接アクセスできます。JSON-LD では、このようなデータをコンテキスト内で @idkeyword@container 宣言と関連付けることで指定できます:

上の例では、posttermid マップ としてマークされています。http://example.com/posts/1/en および http://example.com/posts/1/de のキーは、ノードオブジェクト値の @id プロパティとして解釈されます。

上のデータの解釈は、§ 4.6.1 Data Indexing における JSON-LD プロセッサを用いた解釈とまったく同じです。

@container の値は @id@set の両方を含む配列にすることもできます。縮約時にこれを使うと、JSON-LD プロセッサがノード識別子のすべての値に対して配列形式を使用することを保証します。

識別子を持たないノードオブジェクトをインデックス化する場合、特殊インデックス @none が正規化された表現を維持するのに使用されます。@none インデックスは、例にある用語 none のように @none に展開される用語であってもかまいません。

注記

Id マップ は JSON-LD 1.1 の新機能です。

4.6.4 ノード型インデクシング

この節は情報提供的です。

id マップやインデックスマップに加えて、JSON-LD はデータを構造化するための タイプマップ の概念を導入します。タイプインデクシング機能により、キーが IRI にマップされる単純なキー・値マップを使用して、特定のノードオブジェクトの @type に基づいてデータを構造化できます。JSON-LD では、このようなデータをコンテキスト内で @typekeyword@container 宣言と関連付けることで指定できます:

上の例では、affiliationtermタイプマップ としてマークされています。schema:Corporationschema:ProfessionalService のキーは、ノードオブジェクト値の @type プロパティとして解釈されます。

@container の値は @type@set の両方を含む配列にすることもできます。縮約時にこれを使うと、JSON-LD プロセッサが型のすべての値に対して配列形式を使用することを保証します。

特殊インデックス @none@type を持たない ノードオブジェクト をインデックス化するために使用され、正規化された表現を維持するのに役立ちます。@none インデックスは、例にあるように none のような @none に展開される用語でもあり得ます。

id マップ と同様に、@type と共に使用する場合、コンテナは @set を含めてキー値が常に配列に格納されるようにすることができます。

注記

Type マップ は JSON-LD 1.1 の新機能です。

4.7 含められたノード

この節は情報提供的です。

時には、あるノードオブジェクトの一部として別のノードオブジェクトを列挙することが有用です。例えば、あるリソースが他のリソースで使用する一連のリソースを表現する場合などです。含められたブロックは、プライマリなノードオブジェクトから参照されうる二次的なノードオブジェクトを収集するためにも使用できます。例として、いくつかの共通要素を共有する複数のアイテムを含むノードオブジェクトを考えてみます:

Example 109: 含められたブロック
{
  "@context": {
    "@version": 1.1,
    "@vocab": "http://example.org/",
    "classification": {"@type": "@vocab"}
  },
  "@id": "http://example.org/org-1",
  "members": [{
    "@id":"http://example.org/person-1",
    "name": "Manu Sporny",
    "classification": "employee"
  }, {
    "@id":"http://example.org/person-2",
    "name": "Dave Longley",
    "classification": "employee"
  }, {
    "@id": "http://example.org/person-3",
    "name": "Gregg Kellogg",
    "classification": "contractor"
  }],
  "@included": [{
    "@id": "http://example.org/employee",
    "label": "An Employee"
  }, {
    "@id": "http://example.org/contractor",
    "label": "A Contractor"
  }]
}

フラット化(flattened)すると、 これは含められたブロック中の employeecontractor の要素を外側の配列へ移動します。

含められたリソースは、あるプライマリリソースに関連するリソースを含める手段として、JSON APIInclusion of Related Resources に記述されています([JSON.API])。JSON-LD の @included は同様の可能性を提供します。

@includedノードオブジェクト 内で使用する副産物として、あるマップ@included のみを含むことができ、これは切断されたノードを記述するために @graph が使われるのと類似した機能を提供します(§ 4.1 高度なコンテキストの使用参照)。

ただし、@graph と対照的に、@included は同じマップ内に含まれる他のプロパティと相互作用しません。この点は後述の § 4.9 Named Graphs でさらに論じられます。

4.8 逆プロパティ

この節は情報提供的です。

JSON-LD は有向のグラフをシリアライズします。つまり、すべてのプロパティはあるノードから別のノードへ向かって指されます。しかし場合によっては、逆方向にシリアライズすることが望ましいことがあります。例えば、人とその子供を文書内で記述したいが、使用している語彙にchildren プロパティがなく、代わりに parent プロパティしかないとします。その場合、子を表す各ノードが親へ向かうプロパティを持つように表現する必要があります。次の例を参照してください。

このようなデータは、JSON-LD の @reverse キーワード を使うとずっと簡潔に表現できます:

@reverseキーワードは、 次の例のように、展開済み用語定義内でも使用して逆プロパティを作成できます:

4.9 名前付きグラフ

このセクションは非規範的です。

時には、単一のグラフ自体について、 あるいは単に個々のノードだけでなく記述する必要がある場合があります。これは、@graph キーワードを用いて一連のノードをグループ化することで行えます。開発者はまた、@graph キーワードに対して@id キーワードを組み合わせることにより、@graphで表現されたデータに名前を付けることもできます。以下の例を参照してください:

上の例は、名前付きグラフIRI http://example.org/foaf-graphで識別していることを示します。そのグラフは Manu と Gregg に関する記述から構成されます。グラフ自体のメタデータはgeneratedAtプロパティによって表現され、グラフが生成された時刻を指定します。

JSON-LD 文書の最上位構造が、マップであり、 @graph と(省略可能な)@context以外のキーを含まない場合(IRI や キーワード にマッピングされないプロパティは無視されます)、 @graph は暗黙の デフォルトグラフを表していると見なされます。この仕組みは、文書のトップレベルに複数のノードが存在し、同じコンテキストを共有する場合(例えば文書がフラット化されている場合)に便利です。@graph キーワードはそのようなノードを配列に集め、共有コンテキストの使用を可能にします。

この場合、グラフには無関係なノードが含まれるため、埋め込みは使用できません。 これは、複数のノードオブジェクトを配列で用意し、各ノードオブジェクト内で@contextを定義するのと同等です:

4.9.1 グラフコンテナ

このセクションは規範的ではありません。

場合によっては、JSON 表現の中で明示せずにデータを論理的に別々のグラフに分割することが有用です。たとえば、JSON ドキュメントが他のメタデータが主張される対象となるデータを含み、そのデータをデータモデル内で名前付きグラフの概念を用いて分離することが、@graph キーワードに伴う構文的なオーバーヘッドなしに有用な場合があります。

展開済みの用語定義は、@container の値として @graph を使用できます。これは、この用語の値が 名前付きグラフ と見なされるべきことを示します。ここでのグラフ名は、自動的に割り当てられるブランクノード識別子であり、それにより 暗黙に名前付けされたグラフ が作成されます。展開されると、これらは 単純なグラフオブジェクト になります。

別の例では、匿名の名前付きグラフを次のように使用します:

上の例は、匿名の名前付きグラフを用いて記述を行っていることを表します。デフォルトグラフには、その主語がその記述を書いたという記述を含んでいます。これは、記述を名前付きグラフに分離し、その名前付きグラフに含まれる記述についてさらに主張を行う例です。

厳密に言うと、そのような用語の値は名前付きグラフそのものではなく、データセット内に別個に存在するその名前付きグラフに関連付けられたグラフ名です。

Graph Containers は JSON-LD 1.1 の新機能です。

4.9.2 名前付きグラフデータインデックス

このセクションは規範的ではありません。

ノードオブジェクトをインデックスで索引付けすることに加えて、グラフオブジェクトもインデックスで索引付けできる場合があります。§ 4.9.1 Graph Containersで導入された @graph コンテナ型と @index を組み合わせて使用すると、そのプロパティのオブジェクト値は、キーが IRI にマップされるのではなく、対応する名前付きグラフの値として関連付けられた @index プロパティから取られるキーと値のマップとして扱われます。展開されると、これらは 単純なグラフオブジェクト でなければなりません。

次の例は、デフォルトグラフが、インデックスマップを用いて複数の名前付きグラフを参照する様子を示します。

インデックスマップ と同様に、@graph と共に使用する場合、コンテナはキー値が常に配列に含まれるようにするために @set を含めることもできます。

特殊なインデックス @none は、@index キーを持たないグラフをインデックスするために使用されます。これは正規化された表現を維持するのに有用です。ただし、複数の未識別の名前付きグラフが @none インデックスを用いてコンパクト化されるドキュメントをコンパクト化すると、それらのグラフの内容がマージされることに注意してください。これを防ぐには、各グラフに異なる @index キーを与えてください。

Named Graph Data Indexing は JSON-LD 1.1 の新機能です。

4.9.3 名前付きグラフインデックス

このセクションは規範的ではありません。

識別子によるノードオブジェクトの索引付けに加えて、グラフオブジェクトはそのグラフ名で索引付けすることもできます。§ 4.9.1 Graph Containersで導入された @graph コンテナ型と @id を組み合わせて使用すると、そのプロパティのオブジェクト値は、キーが名前付きグラフの識別子を表すキーと値のマップとして扱われます。

次の例は、デフォルトグラフが、id マップを用いて複数の名前付きグラフを参照する様子を示します。

id マップ と同様に、@graph と一緒に使用する場合、コンテナはキー値が常に配列に含まれるようにするために @set を含めることもできます。

id マップ と同様に、特別なインデックス @none@id を持たない名前付きグラフをインデックスするために使用され、正規化された表現を維持するのに役立ちます。@none インデックスは @none に展開される用語であってもよいです。ただし、複数のグラフが @id なしで表現されると、展開時にそれらはマージされます。これを防ぐには、@none を慎重に使用し、グラフに固有の識別子を付与することを検討してください。

Graph Containers は JSON-LD 1.1 の新機能です。

4.10 文書のロード

このセクションは規範的ではありません。

JSON-LD 1.1 Processing Algorithms and API specification [JSON-LD11-API] は JSON-LD プロセッサ へのインターフェースを定義しており、さまざまな形式の JSON-LD を操作するための複数のメソッドを含んでいます(§ 5. Forms of JSON-LD を参照)。これには、参照された JSON-LD ドキュメントやリモートコンテキストの読み込み、さらには [HTML] のような他の形式から埋め込まれた JSON-LD を抽出するための一般的なメカニズムが含まれます。これについては [JSON-LD11-API] の「Remote Document and Context Retrieval」でより詳細に説明されています。

documentLoaderは、リモートドキュメントの読み込みが問題になる多くの状況で有用です:

5. JSON-LD の形式

このセクションは規範的ではありません。

多くのデータ形式と同様に、JSON-LD でデータを記述する正しい唯一の方法は存在しません。 しかし、JSON-LD はグラフを記述するために使われるため、意味(Linked Data としての意味)を変えずにデータの形状を変更するための特定の変換が使用できます。

展開ドキュメント形式
Expansion は、 JSON-LD ドキュメントに context を適用し、 @context が不要になるようにする処理です。 この処理はさらに § 5.1 展開ドキュメント形式 で説明します。
圧縮ドキュメント形式
Compaction は、 与えられた context を既存の JSON-LD ドキュメントに適用する処理です。 この処理はさらに § 5.2 圧縮ドキュメント形式 で説明します。
フラット化ドキュメント形式
Flattening は、 埋め込まれたノードを JSON ツリーの最上位に抽出し、埋め込まれていたノードを参照に置き換え、必要に応じてブランクノード識別子を作成するプロセスです。 この処理はさらに § 5.3 フラット化ドキュメント形式 で説明します。
フレームドドキュメント形式
Framing は、 JSON-LD ドキュメント内のデータの形状を、例示的な frame ドキュメントを用いて整形するために使用されます。 その frame は flattened データにマッチさせるために使われ、結果として得られるデータの形の例を示します。 この処理はさらに § 5.4 フレームドドキュメント形式 で説明します。

5.1 展開ドキュメント形式

このセクションは規範的ではありません。

JSON-LD 1.1 Processing Algorithms and API specification [JSON-LD11-API] は JSON-LD ドキュメントを 展開 するための方法を定義します。 Expansion は、 JSON-LD ドキュメントに context を適用し、 すべての IRI、型、および値が展開されて @context が不要になるようにするプロセスです。

たとえば、次の JSON-LD 入力ドキュメントを考えます:

123: 展開されるサンプル JSON-LD ドキュメント
{
   "@context": {
      "name": "http://xmlns.com/foaf/0.1/name",
      "homepage": {
        "@id": "http://xmlns.com/foaf/0.1/homepage",
        "@type": "@id"
      }
   },
   "name": "Manu Sporny",
   "homepage": "http://manu.sporny.org/"
}

上の JSON-LD 入力ドキュメントに対して JSON-LD の Expansion algorithm を実行すると、次のような出力が得られます:

JSON-LD のメディアタイプ は、 profile パラメータを定義しており、それによって 展開ドキュメント形式 を示したり要求したりできます。展開ドキュメント形式を示すプロファイル URI は http://www.w3.org/ns/json-ld#expanded です。

5.2 圧縮ドキュメント形式

このセクションは規範的ではありません。

JSON-LD 1.1 Processing Algorithms and API specification [JSON-LD11-API] は、 JSON-LD ドキュメントを 圧縮 するための方法を定義します。Compaction は、 開発者が提供する context を適用して、IRI を用語や コンパクト IRI に短縮し、展開形式で表現された JSON-LD の値を 文字列や数値などの単純な値に戻すプロセスです。 これにより、ドキュメントがアプリケーション固有の用語で表現され、扱いやすくなることがよくあります。圧縮されたドキュメントは人間にとっても読みやすくなります。

たとえば、次の JSON-LD 入力ドキュメントを考えます:

125: サンプルの展開済み JSON-LD ドキュメント
[
  {
    "http://xmlns.com/foaf/0.1/name": [ "Manu Sporny" ],
    "http://xmlns.com/foaf/0.1/homepage": [
      {
       "@id": "http://manu.sporny.org/"
      }
    ]
  }
]

さらに、次のような開発者提供の JSON-LD コンテキストを考えます:

126: サンプルコンテキスト
{
  "@context": {
    "name": "http://xmlns.com/foaf/0.1/name",
    "homepage": {
      "@id": "http://xmlns.com/foaf/0.1/homepage",
      "@type": "@id"
    }
  }
}

上の context を用いて、 前述の入力ドキュメントに対して JSON-LD の Compaction algorithm を実行すると、次のような出力が得られます:

JSON-LD のメディアタイプ は、 profile パラメータを定義しており、それによって 圧縮ドキュメント形式 を示したり要求したりできます。圧縮ドキュメント形式を示すプロファイル URI は http://www.w3.org/ns/json-ld#compacted です。

Compaction の詳細は [JSON-LD11-API] の Compaction algorithm に記載されています。 この節は、コンテキストを作成する著者向けのガイドとしてアルゴリズムがどのように動作するかの短い説明を提供します。

圧縮の目的は、term definitions語彙マッピングデフォルト言語、および base IRI を既存の JSON-LD ドキュメントに適用し、 JSON として直接使用するのに適した形式に表現することです。 これには可能な場合に値を 文字列 として表現したり、 リストオブジェクト を単純な配列に短縮したり、 ノード間の関係の向きを反転させたり、配列で表現する代わりにデータマップを使用して複数の値に索引付けすることが含まれます。

5.2.1 IRI の短縮

このセクションは規範的ではありません。

展開された JSON-LD ドキュメントでは、IRI は常に絶対的な IRI として表現されます。 多くの場合、より短い形式(相対 IRI 参照、コンパクト IRI、または 用語)を使用する方が望ましいです。コンパクションはコンテキストの要素の組み合わせを使ってこれらの IRI の短縮形を作成します。詳細は § 4.1.2 デフォルト語彙§ 4.1.3 Base IRI、 および § 4.1.5 コンパクト IRI を参照してください。

語彙マッピング は、 語彙相対(vocabulary relative)である可能性のある IRI を短縮するために使われ、 語彙マッピングと一致する IRI プレフィックスを削除します。 これは、IRI が語彙相対であると判断された場合、つまりプロパティとして使われる場合や @type の値として使われる場合、または "@type": "@vocab" として記述された用語の値として使われる場合に行われます。

5.2.2 値を文字列として表現すること

このセクションは規範的ではありません。

曖昧さを排除するために、展開ドキュメント形式 は常に ノード と値を ノードオブジェクト値オブジェクト を用いて表現します。 さらに、プロパティの値は単一の値でも常に配列内に格納されます。これは均一なアクセスを維持するために有用な場合がありますが、ほとんどの JSON データは可能な限り単純な表現を用いるため、プロパティは単一の値を持ち、それは 文字列 または ノードオブジェクト のような構造化された値として表現されます。 デフォルトでは、compaction は、単純な文字列である値を文字列として表現しますが、値が IRI、日付、またはその他の型付き値であって単純な文字列表現では情報が失われる場合もあります。 その場合は term definition 内で指定することにより、 文字列値の意味をその用語の定義から推測できるようにします。詳細は § 4.2 値の記述 を参照してください。

5.2.3 リストを配列として表現すること

このセクションは規範的ではありません。

§ 4.3.1 リスト で説明されているように、 JSON-LD は順序付けられた値を表現するための展開構文として @list キーワードを持ちます。 表現を簡潔にするために、用語定義で "@container": "@list" を設定すると、その用語を使うプロパティのすべての値が順序付きとして扱われます。

5.2.4 ノード関係の反転

このセクションは規範的ではありません。

場合によっては、二つのノードを関連付けるプロパティはノードの方向を反転させて表現した方が適切なことがあります。 例えば、二人の人物と共通の親を記述する場合などです。 詳細は § 4.8 逆プロパティ を参照してください。

逆プロパティは、framing と組み合わせるとさらに有用で、 フレーミングによりドキュメントのトップレベルで定義された ノードオブジェクト を埋め込みノードに変換できます。 JSON-LD は、そのような値を索引付けする手段を提供しており、適切な @container 定義を用語定義内に定義することで実現します。

5.2.5 値の索引付け

このセクションは規範的ではありません。

複数の値を持つプロパティは通常、順序付けされていない 配列 を使って表現されます。 これは、内部表現を扱うアプリケーションが配列の値を反復して、例えば言語タグ en を持つ言語タグ付き文字列のような特定のパターンに一致する値を見つける必要があることを意味します。

データは @id、@type、@language、@index など、さまざまなキーで索引付けできます。 詳細は § 4.6 Indexed Values および § 4.9 名前付きグラフ を参照してください。

5.2.6 値をオブジェクトとして正規化すること

このセクションは規範的ではありません。

ドキュメントを圧縮したいが、それでもノードオブジェクトや値オブジェクトの表現を保ちたい場合があります。 そのためには、用語定義で "@type": "@none" を設定できます。 これにより Value Compaction アルゴリズムは常に値のオブジェクト形式を使用しますが、その値の構成要素は圧縮されることがあります。

5.2.7 単一値を配列として表現すること

このセクションは規範的ではありません。

一般に、圧縮時には単一の値を持つプロパティは文字列や マップ として表現され、複数の値を持つプロパティは文字列やマップの配列として表現されます。 これは、そのようなプロパティにアクセスするアプリケーションがどちらの表現も受け入れられるよう準備する必要があることを意味します。すべての値を配列で表現することを強制するには、用語定義で "@container": "@set" を設定できます。 さらに、@set は他のコンテナ設定と組み合わせて使用することもできます。例えば、前述の言語マップの例(§ 5.2.5 値の索引付け)を見てみましょう:

5.2.8 用語選択

このセクションは規範的ではありません。

圧縮時、Compaction algorithm は、プロパティの値がその用語定義の @container@type、および @language の仕様に一致する場合にのみ、そのプロパティに対して用語を使って圧縮します。 これは同じ IRI を持つ異なるプロパティ間で値が分割されることを実際に引き起こす場合があります。マッチする用語定義がない場合、コンパクションアルゴリズムはプロパティの絶対 IRI を使って圧縮します。

5.3 フラット化ドキュメント形式

このセクションは規範的ではありません。

JSON-LD 1.1 Processing Algorithms and API specification [JSON-LD11-API] は、 JSON-LD ドキュメントを フラット化 する方法を定義します。 Flattening は、 ノードのすべてのプロパティを単一の マップ に集め、 すべてのブランクノードにブランクノード識別子を付与します。 これによりデータの形状が保証され、特定のアプリケーションで JSON-LD を処理するために必要なコードを大幅に簡素化することがあります。

たとえば、次の JSON-LD 入力ドキュメントを考えます:

137: フラット化されるサンプル 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": [
    {
      "@id": "http://manu.sporny.org/about#manu",
      "name": "Manu Sporny"
    }, {
      "name": "Dave Longley"
    }
  ]
}

上の入力ドキュメントに対して JSON-LD の Flattening algorithm を同じコンテキストで実行すると、次のような出力が得られます:

JSON-LD のメディアタイプ は、 profile パラメータを定義しており、それによって フラット化ドキュメント形式 を示したり要求したりできます。フラット化ドキュメント形式を示すプロファイル URI は http://www.w3.org/ns/json-ld#flattened です。 これは 展開ドキュメント形式圧縮ドキュメント形式 と組み合わせることができます。

5.4 フレームドドキュメント形式

このセクションは規範的ではありません。

JSON-LD 1.1 Framing specification [JSON-LD11-FRAMING] は、 JSON-LD ドキュメントを フレーミング する方法を定義します。Framing は、例示的な frame ドキュメントを用いてドキュメント内のデータを整形するために使用されます。 その frame は flattened データにマッチさせるために使われ、結果として得られるデータの形の例を示します。

たとえば、次の JSON-LD frame を考えます:

139: サンプルライブラリフレーム
{
  "@context": {
    "@version": 1.1,
    "@vocab": "http://example.org/"
  },
  "@type": "Library",
  "contains": {
    "@type": "Book",
    "contains": {
      "@type": "Chapter"
    }
  }
}

この frame ドキュメントは、 型が Library のオブジェクトをトップレベルに配置し、Library オブジェクトに対して contains プロパティでリンクされた型が Book のオブジェクトをそのプロパティ値として埋め込み、 さらに型が Chapter のオブジェクトを該当の Book オブジェクト内に埋め込む構造を記述します。

フレームのコンポーネントにマッチするフラット化されたオブジェクト群を使用する場合:

140: フラット化されたライブラリオブジェクト
{
  "@context": {
    "@vocab": "http://example.org/",
    "contains": {"@type": "@id"}
  },
  "@graph": [{
    "@id": "http://example.org/library",
    "@type": "Library",
    "contains": "http://example.org/library/the-republic"
  }, {
    "@id": "http://example.org/library/the-republic",
    "@type": "Book",
    "creator": "Plato",
    "title": "The Republic",
    "contains": "http://example.org/library/the-republic#introduction"
  }, {
    "@id": "http://example.org/library/the-republic#introduction",
    "@type": "Chapter",
    "description": "An introductory chapter on The Republic.",
    "title": "The Introduction"
  }]
}

Frame Algorithm はフレームの構造に従った新しいドキュメントを作成できます:

JSON-LD のメディアタイプ は、 profile パラメータを定義しており、それによって フレームドドキュメント形式 を示したり要求したりできます。フレームドドキュメント形式を示すプロファイル URI は http://www.w3.org/ns/json-ld#framed です。

JSON-LD のメディアタイプ はまた、 HTML ドキュメント内でフレームを含むスクリプト要素を識別するための profile パラメータも定義しています。 HTML ドキュメント内で最初に現れるタイプ application/ld+json;profile=http://www.w3.org/ns/json-ld#framescript element はフレームを見つけるために使用されます。

7. HTML ドキュメントへの JSON-LD の埋め込み

この節は、HTML スクリプト抽出をサポートする documentLoader を想定した機能について説明しています。 詳しくは Remote Document and Context Retrieval を参照してください。

JSON-LD コンテンツは、HTML 内に簡単に埋め込むことができ、type 属性を application/ld+json に設定した script 要素 に置くことでデータブロックが作られます。

そのようなデータがどのように使用されるかの定義は本仕様の範囲外です。埋め込まれた JSON-LD ドキュメントはそのまま抽出される場合もあれば、例えば RDF として解釈される場合もあります。

JSON-LD コンテンツが RDF として抽出される場合、RDF11-CONCEPTS に従い、 MUST 展開して RDF Dataset にする必要があります。これは Deserialize JSON-LD to RDF Algorithm に従います。特定のスクリプトがターゲットされていない限り(参照: § 7.3 特定の JSON-LD スクリプト要素の検索)、script 要素 のうち type="application/ld+json" を持つすべてを処理し、単一の dataset にマージしなければなりません(MUST)。別々の script 要素に含まれるブランクノード識別子は、まるで同一ドキュメント内にあるかのように共有されます。

7.1 HTML の base 要素からのベース IRI の継承

JSON-LD の script 要素 を処理する際、包含する HTML ドキュメントの Document Base URL(HTML 仕様で定義される)は、埋め込まれた JSON-LD コンテンツのデフォルトの base IRI を確立するために使用されます。

HTML は ベース URL の動的変更 を許容します。 本仕様は特定の振る舞いを要求していませんが、すべてのシステムが base IRI を同等に処理するようにするため、作成者は SHOULD いずれかの方法で IRI を使用するか、または § 4.1.3 Base IRI に明示的に従ってください。特に DOM ネイティブで動作する実装は動的なベース URL の変更を考慮することが MAY あります。

7.2 JSON-LD の script 要素の内容に対する制限

このセクションは規範的ではありません。

HTML の script 要素の内容に関する制限 のため、script 要素内に含まれる JSON-LD データには追加のエンコーディング制限が適用されます。

作成者は、HTML に埋め込まれたスクリプト内で comment-openscript-opencomment-close、または script-close と誤認される可能性のある文字列の使用を避けるべきです。

そのような内容は下記のようにエスケープされるべきですが、JSON-LD API を通して処理した後もエスケープされたままである点に注意してください([JSON-LD11-API])。
  • & → & (アンパサンド, U+0026)
  • &lt; → < (小なり記号, U+003C)
  • &gt; → > (大なり記号, U+003E)
  • &quot; → " (引用符, U+0022)
  • &apos; → ' (アポストロフィ, U+0027)

7.3 特定の JSON-LD スクリプト要素の検索

HTML ドキュメント内の特定の script 要素 は、その HTML ドキュメント内での 一意識別子(フラグメント識別子)を使って特定できます(参照: [DOM])。JSON-LD プロセッサは、指定されたデータブロックの内容のみを抽出し、それを独立した JSON-LD ドキュメント として解析し、他のマークアップと結果をマージしてはならない(MUST NOT)ことが要求されます。

例えば、http://example.com/document にある HTML ドキュメントに対して、識別子 "dave" の script 要素をターゲットにするには URL http://example.com/document#dave を使います。

8. データモデル

JSON-LD は JSON をベースにした Linked Data のシリアライゼーション形式です。 したがって、構文([RFC8259] の JSON により定義される)と、データモデル(これは RDF データモデル の拡張)[RDF11-CONCEPTS] を区別することが重要です。 JSON-LD と RDF データモデルの関係についての詳細は § 10. RDF との関係 を参照してください。

RDF モデルに不慣れな開発者に分かりやすくするため、以下に要約を示します:

JSON-LD ドキュメントは、 上で定義した データモデル では表現できないデータを含んでもよい(MAY)。特に指定がない限り、そのようなデータは JSON-LD ドキュメントの処理時に無視されます。このルールの結果の一つとして、IRI、ブランクノード、またはキーワードにマップされないプロパティは無視されます。

さらに、JSON のシリアライゼーション形式は内部的に JSON-LD 内部表現 を用いて表現され、リスト、マップ、文字列、数値、ブール値、null といった一般的概念を使って JSON ドキュメントで表現されるデータを記述します。

この図は、デフォルトグラフと 2 つの名前付きグラフを持つリンクドデータデータセットを示しています。

Figure 1 リンクドデータデータセットの図解
付録にこの図の説明があります。画像は SVG および PNG 形式で利用可能です。

この図で示されたデータセットは次のように表現できます:

外側のレベルで @graph を使って 3 つのトップレベルリソース(そのうち 2 つが名前付きグラフ)を記述している点に注意してください。名前付きグラフは各グラフの名前を提供するために @id に加えて @graph を利用しています。

9. JSON-LD 文法

この節では、前節で説明した構文上の規約をより形式的に再記述します。

JSON-LD ドキュメント は、[RFC8259] に記載されているように、有効な JSON テキスト であることが MUST です。 または、有効な JSON テキスト と同等であり、 JSON-LD 内部表現 で表現できる形式であることが要求されます。

JSON-LD ドキュメント は、単一の ノードオブジェクトmap@context および/または @graphエントリ のみで構成されるもの)、または 0 個以上の ノードオブジェクト配列 であることが MUST です。

JSON と異なり、JSON-LD ではオブジェクト内のキーは MUST 一意でなければなりません。

この文法で キーワード が議論される場合、その記述は当該キーワードのエイリアスにも適用されます。

JSON-LD では キーワード をエイリアス化できます(詳細は § 4.1.6 キーワードのエイリアス化 を参照)。例えば、アクティブコンテキストが用語 id@id のエイリアスとして定義している場合、そのエイリアスは正当に @id の代わりに使用できます。なお、キーワードのエイリアスはコンテキスト処理中に展開されない点に注意してください。

9.1 用語(Terms)

用語(term) は短縮表現となる 文字列 であり、IRIブランクノード識別子、または キーワード に展開されます。

用語 は、JSON-LD のキーワード と等しくあってはなりません(MUST NOT)。ただし @type は例外です。

Compact IRI の プレフィックス として用いる場合、プレフィックスが IRI スキームと混同される可能性を避けるため、用語は IANA に登録された URI スキームのリストから来ないことが SHOULD NOT 推奨されます(詳細は [IANA-URI-SCHEMES] を参照)。同様に、用語にコロン(:)を含めないことが SHOULD NOT 推奨され、用語は RFC3987 に定義された isegment-nz-nc の形式に制限されることが SHOULD 推奨されます。

将来の互換性の問題を避けるため、用語は @ に続いて一つ以上の英字(ALPHA)のみで構成される形で始まるべきではありません(SHOULD NOT)。将来の JSON-LD のバージョンで追加されるキーワードと混同されるのを避けるためです。さらに、用語は空文字列("")であってはなりません(MUST NOT)、なぜなら全てのプログラミング言語が空の JSON キーを扱えるわけではないためです。

用語を IRIs にマップする方法については、§ 3.1 コンテキスト および § 3.2 IRI を参照してください。

9.2 ノードオブジェクト(Node Objects)

ノードオブジェクト は、ノード の 0 個以上のプロパティを表し、JSON-LD ドキュメントによって直列化される グラフ 内のノードの性質を示します。mapノードオブジェクト であるための条件は次のとおりです(その map が JSON-LD の context の外に存在する場合に限る):

グラフ中のノードのプロパティはドキュメント内の異なるノードオブジェクトに分散していることがあります。その場合、それら異なるノードオブジェクトのキーをマージして、最終的なノードのプロパティを作成する必要があります。

ノードオブジェクトMUST map でなければなりません。アクティブコンテキストで有効な IRIコンパクト IRI用語、あるいは次のいずれかの キーワード(またはそのエイリアス)に該当しないすべてのキーは、処理時に無視されることが MUST です:

もしノードオブジェクトが @context キーを含む場合、その値は MUST nullIRI 参照コンテキスト定義、またはこれらのいずれかからなる 配列 でなければなりません。

もしノードオブジェクトが @id キーを含む場合、その値は MUST IRI 参照、または コンパクト IRI(ブランクノード識別子を含む)でなければなりません。詳細は § 3.3 ノード識別子§ 4.1.5 コンパクト IRI、および § 4.5.1 ブランクノードの識別 を参照してください。

もしノードオブジェクトが @graph キーを含む場合、その値は MUST ノードオブジェクトまたは 0 個以上のノードオブジェクトから成る配列でなければなりません。ノードオブジェクトが @id も含む場合、その値は名前付きグラフの グラフ名 として使用されます。@graph の値に関する詳細は § 4.9 名前付きグラフ を参照してください。特別な場合として、ある map がルートであり、そのキーが @graph@context のみである場合、その map はノードオブジェクトとして扱われません。これは複数のノードオブジェクト間で共有されるコンテキストを定義する手段として用いられます。

もしノードオブジェクトが @type キーを含む場合、その値は MUST IRI 参照コンパクト IRI、アクティブコンテキスト内で IRI に展開される 用語、またはこれらのいずれかから成る配列でなければなりません。@type の値については § 3.5 タイプの指定 を参照してください。

もしノードオブジェクトが @reverse キーを含む場合、その値は MUST 逆プロパティを表すエントリを含む map でなければなりません。その逆プロパティの各値は MUST IRI 参照コンパクト IRI、ブランクノード識別子、ノードオブジェクト、またはこれらの組み合わせを含む配列でなければなりません。

もしノードオブジェクトが @included キーを含む場合、その値は MUST included block でなければなりません。§ 9.13 Included Blocks を参照してください。

もしノードオブジェクトが @index キーを含む場合、その値は MUST 文字列でなければなりません。§ 4.6.1 データのインデックス化 を参照してください。

もしノードオブジェクトが @nest キーを含む場合、その値は MUST map または map の配列でなければならず、かつその中に 値オブジェクト を含んではならない(MUST NOT)ことに注意してください。§ 9.14 プロパティのネスト を参照してください。

ノードオブジェクト内のキーで キーワード でないものは、アクティブコンテキストを使って IRI に展開されることが MAY あります。IRI に展開されるキーに関連付けられた値は、次のいずれかであることが MUST です:

9.3 フレームオブジェクト(Frame Objects)

フレーミング を行う場合、フレームオブジェクト はノードオブジェクトを拡張して、フレーミング専用に用いられるエントリを許可します。

フレームオブジェクトの使用方法については [JSON-LD11-FRAMING] を参照してください。

9.4 グラフオブジェクト(Graph Objects)

グラフオブジェクト は名前付きグラフを表し、明示的なグラフ名を含むことが MAY あります。map がグラフオブジェクトである条件は、コンテキスト外に存在し、@graph エントリ(またはそのエイリアス)を含み、JSON-LD ドキュメントの最上位の map ではなく、かつそのエントリが @graph@index@id@context(またはそれらのエイリアス)のみで構成されていることです。

もしグラフオブジェクトが @context を含む場合、その値は MUST null、IRI 参照、コンテキスト定義、またはこれらのいずれかから成る配列でなければなりません。

もしグラフオブジェクトが @id を含む場合、その値は名前付きグラフの識別子(グラフ名)として使用され、MUST IRI 参照またはコンパクト IRI(ブランクノード識別子を含む)でなければなりません。詳細は該当節を参照してください。

@id エントリを持たないグラフオブジェクトは 単純グラフオブジェクト と見なされ、明示的な識別子を持たない名前付きグラフを表しますが、データモデル上は暗黙に割り当てられたブランクノード識別子をグラフ名として持ちます。

@graph キーの値は MUST ノードオブジェクト、または 0 個以上のノードオブジェクトから成る配列でなければなりません。§ 4.9 名前付きグラフ を参照してください。

9.5 値オブジェクト(Value Objects)

値オブジェクト は、値に対して型や言語を明示的に関連付けるために用いられ、型付き値言語タグ付き文字列 を生成します。また、必要に応じて基底方向(base direction)を関連付けることもできます。

値オブジェクトは MUST map であり、@value キーを含まなければなりません。さらに @type@language@direction@index、または @context キーを持つことが MAY できますが、@type@language または @direction を同時に含んではなりません(MUST NOT)。また、値オブジェクトは IRI またはキーワードに展開される他のキーを含んではなりません(MUST NOT)。

@value に関連付けられる値は MUST 文字列、数値、true/false、または null のいずれかでなければなりません。もし @type の値が @json の場合、@value は配列またはオブジェクトであってよい(MAY)です。

@type に関連付けられる値は MUST 用語、IRI、コンパクト IRI、語彙マッピングを用いて IRI に変換できる文字列、@json、または null のいずれかでなければなりません。

@language に関連付けられる値は BCP47 の語彙上の表記(lexical form)に従う文字列であるか、null でなければなりません(MUST)。

@direction に関連付けられる値は MUST "ltr" または "rtl"、あるいは null のいずれかでなければなりません。

@index に関連付けられる値は MUST 文字列でなければなりません。

§ 4.2.1 Typed Values および § 4.2.4 String Internationalization を参照してください。

9.6 値パターン(Value Patterns)

フレーミング時、値パターン は値オブジェクトを拡張して、フレーミング専用のエントリを許可します。

9.7 リストとセット(Lists and Sets)

リスト は順序付きの値集合を表し、セットは順序に関係ない値集合を表します。特段の指定がない限り、JSON-LD では 配列 は順序付けられていません。したがって、ドキュメント本体で使用される @set キーワードは、処理時に最適化されて取り除かれる単なる構文糖であり、コンテキスト内で用いると有用です。@set または @list コンテナに関連付けられた用語の値は、ドキュメント処理時に常に配列形式で表現されます(単一の値であっても)。これにより後処理が簡素化され、データは決定論的な形になります。

リストオブジェクト は、MUST map であり、@list@index 以外の IRI またはキーワードに展開されるキーを含んではなりません。

セットオブジェクト は、MUST map であり、@set@index 以外の IRI またはキーワードに展開されるキーを含んではなりません。なお、@index キーは処理時に無視されることがあります。

いずれの場合も、@list および @set に関連付けられる値は次の型のいずれかであることが MUST です:

セットとリストの詳細は § 4.3 値の順序付け を参照してください。

9.8 言語マップ(Language Maps)

言語マップ は、言語と値を関連付けてプログラム的にアクセスしやすくするために用いられます。言語マップは、用語が @container として @language(または @language@set を含む配列)に定義されている場合、ノードオブジェクト内の用語の値として使用できます。言語マップのキーは BCP47 の言語タグを表す文字列、キーワード @none、または @none に展開される用語でなければならず(MUST)、値は次のいずれかでなければなりません:

言語マップの詳細は § 4.2.4 文字列の国際化 を参照してください。

9.9 インデックスマップ(Index Maps)

インデックスマップ は意味を持たないが保持すべきキーを扱うために用いられます。インデックスマップは、用語が @container@index(または @index@set を含む配列)として定義されている場合、ノードオブジェクト内の用語の値として使用できます。インデックスマップのエントリの値は次の型のいずれかでなければなりません(MUST):

このトピックの詳細は § 4.6.1 データのインデックス化 を参照してください。

インデックスマップは、用語が @container@graph@index(任意で @set を含む)を含む配列として定義されている場合、インデックスを対応する名前付きグラフにマップするためにも使用できます。その値は、参照キーでインデックスされる名前付きグラフ内に含まれるノードオブジェクトで構成され、もし値に @id が含まれないなら単純グラフオブジェクトとして表現できますし、@id を含む場合は名前付きグラフとして表現されます。

9.10 プロパティベースのインデックスマップ

プロパティベースの インデックスマップ は、 インデックスをグラフ内のプロパティ値として意味的に保持する点で 標準の インデックスマップ の変種です。 プロパティベースの インデックスマップ は、 用語が @container@index に設定している場合、 または @index@set の両方を含む配列として定義され、 かつ @indexstring に設定されているときに、 ノードオブジェクト 内の用語値として使用できます。 プロパティベースの インデックスマップ の値は、 MUST ノードオブジェクト または strings(ノードオブジェクトに展開されるもの)でなければなりません。

展開時に、アクティブコンテキストが @index の値に対する 用語定義 を含む場合、 その用語定義が インデックスマップ のキーの展開に使用されます。 そうでない場合、キーは単純な 値オブジェクト として展開されます。 インデックスマップの展開後の値に含まれる各 ノードオブジェクト には、追加のプロパティ値が付加されます。 そのプロパティは @index の展開値であり、値は展開された参照キーです。

このトピックの詳細は § 4.6.1.1 プロパティベースのデータ索引化 を参照してください。

9.11 ID マップ

id map は、IRI を扱いやすいプログラム的アクセス可能な値に対応付けるために使用されます。 id map は、用語が @container@id に設定している場合、または @id@set の両方を含む配列として定義されている場合に、 ノードオブジェクト 内の用語値として使用できます。 id map のキーは MUST IRIIRI 参照 または コンパクト IRI(ブランクノード識別子を含む))、 キーワード @none、または @none に展開される用語でなければならず、 値は MUST ノードオブジェクト でなければなりません。

値が @id に展開されるプロパティを含む場合、その値は参照キーと等価でなければなりません(MUST)。そうでない場合、展開時に値からのプロパティがノードオブジェクト値の @id として使用されます。

Id Maps は、用語が @container@graph@id(任意で @set を含む)を含む配列として定義されている場合に、 グラフ名をその名前付きグラフにマップするためにも使用できます。値は、参照キーによって名前付けされる名前付きグラフ内に含まれる ノードオブジェクト で構成されます。

9.12 タイプマップ

type map は、IRI を扱いやすいプログラム的アクセス可能な値に対応付けるために使用されます。 type map は、用語が @container@type に設定している場合、または @type@set の両方を含む配列として定義されている場合に、 ノードオブジェクト 内の用語値として使用できます。 type map のキーは MUST IRIs(IRI 参照または コンパクト IRI(ブランクノード識別子を含む))、 用語、あるいはキーワード @none でなければならず、値は MUST ノードオブジェクト またはノードオブジェクトに展開される strings でなければなりません。

値が @type に展開されるプロパティを含み、参照キーと値の両方を適切に展開した結果に参照キーが含まれている場合、そのノードオブジェクトは既に型を含んでいます。そうでない場合、展開時に値からのプロパティがノードオブジェクト値の @type として追加されます。

9.13 インクルードブロック

included block は、 ノードオブジェクト の集合を提供するために使用されます。 included block は、 ノードオブジェクトのメンバーの値として @included またはそのエイリアスのキーで現れることが MAY あります。 included block はノードオブジェクト、 またはノードオブジェクトの配列です。

展開(expanding)の際、 複数の included blocks は 単一の included block に合流されます。

9.14 プロパティのネスト

ネストされたプロパティ は、 プロパティ を 別個の map、または map の配列 に集めるために使用されます。 これらの map は 値オブジェクト ではありません。 ネストは意味的に透明であり、展開 の過程で除去されます。プロパティのネストは再帰的であり、 ネストされたプロパティの集合はさらにネストを含むことがあります。

意味論的には、ネストはプロパティと値が包含する ノードオブジェクト に直接宣言されたかのように扱われます。

9.15 コンテキスト定義

コンテキスト定義 は、 ノードオブジェクト 内で ローカルコンテキスト を定義します。

コンテキスト定義 は、 MUST map であり、そのキーは MUST 用語、コンパクト IRI、IRI、またはキーワードのいずれかでなければなりません。 キーワードには @base@import@language@propagate@protected@type@version、または @vocab が含まれます。

コンテキスト定義が @base キーを持つ場合、その値は MUST IRI 参照 または null でなければなりません。

コンテキスト定義が @direction キーを持つ場合、その値は MUST "ltr" または "rtl"、あるいは null でなければなりません。

コンテキスト定義が @import キーワードを含む場合、その値は MUST IRI 参照 でなければなりません。 @import で参照されるコンテキスト定義は、さらに @import キーを含んではなりません(MUST NOT)。

コンテキスト定義が @language キーを持つ場合、その値は BCP47 の語彙表記に従う文字列、または null でなければなりません(MUST)。

コンテキスト定義が @propagate キーを持つ場合、その値は MUST true または false でなければなりません。

コンテキスト定義が @protected キーを持つ場合、その値は MUST true または false でなければなりません。

コンテキスト定義が @type キーを持つ場合、その値は MUST map であり、entry @container@set に設定され、 任意で @protected のエントリを持つことができます。

コンテキスト定義が @version キーを持つ場合、その値は MUST 数値であり値は 1.1 でなければなりません。

コンテキスト定義が @vocab キーを持つ場合、その値は MUST IRI 参照、コンパクト IRI、ブランクノード識別子、 用語、または null のいずれかでなければなりません。

キーワードでないキーの値は MUST いずれかでなければなりません: IRI、コンパクト IRI、用語、ブランクノード識別子、キーワード、null、または展開済み用語定義(expanded term definition)。

9.15.1 展開済み用語定義(Expanded term definition)

展開済み用語定義 は、 用語とその展開先識別子との対応、およびノードオブジェクトのキーとして用語が使用される際の値に関する他の特性を記述するために使用されます。

展開済み用語定義MUST map であり、次のいずれかのキーを 0 個以上含みます: @id@reverse@type@language@container@context@prefix@propagate、または @protected。 展開済み用語定義は原則としてこれ以外のキーを含むべきではありません(SHOULD NOT)。

関連する用語が @type の場合、展開済み用語定義は @container@protected 以外のキーを含んではならず(MUST NOT)、 @container の値は単一の値 @set に限定されます。

定義対象の用語が IRI またはコンパクト IRI でなく、かつアクティブコンテキストが @vocab マッピングを持たない場合、展開済み用語定義は MUST @id キーを含む必要があります。

キーが IRI またはコンパクト IRI の形式である用語定義は、そのキー自体の展開以外の IRI に展開してはならない(MUST NOT)ことに注意してください。

展開済み用語定義が @id キーワードを含む場合、その値は MUST null、IRI、ブランクノード識別子、コンパクト IRI、用語、またはキーワードでなければなりません。

展開済み用語定義が @reverse エントリを持つ場合、それは同時に @id または @nest を持ってはならず(MUST NOT)、その値は MUST IRI、ブランクノード識別子、コンパクト IRI、または用語でなければなりません。もし @container エントリが存在する場合、その値は MUST null、@set、または @index のいずれかでなければなりません。

展開済み用語定義が @type キーワードを含む場合、その値は MUST IRI、コンパクト IRI、用語、null、またはキーワードのいずれかでなければならず、@json@none@vocab のいずれかを含むことができます。

展開済み用語定義が @language キーワードを含む場合、その値は BCP47 に従った語彙上の表記か null でなければなりません(MUST)。

展開済み用語定義に @index キーワードが含まれる場合、その値は MUST IRI、コンパクト IRI、または用語でなければなりません。

展開済み用語定義に @container キーワードが含まれる場合、その値は MUST 次のいずれかでなければなりません: @list@set@language@index@id@graph@type、または null。 さらに、値はちょうど一つのキーワードを含む配列、あるいは @set と組み合わせた @index@id@graph@type@language の組合せを含む配列でもよい、等の拡張が許されます。 また、@graph と共に @id または @index を含み、任意で @set を含む配列も許されます。 値が @language の場合、用語が @context の外で使用されるとき、その関連値は MUST 言語マップでなければなりません。値が @index の場合、用語が @context の外で使用されるとき、その関連値は MUST インデックスマップでなければなりません。

展開済み用語定義に @context エントリがある場合、それは有効なコンテキスト定義でなければなりません(MUST)。

展開済み用語定義に @nest キーワードが含まれる場合、その値は MUST @nest か、または @nest に展開される用語でなければなりません。

展開済み用語定義に @prefix キーワードが含まれる場合、その値は MUST true または false でなければなりません。

展開済み用語定義に @propagate キーワードが含まれる場合、その値は MUST true または false でなければなりません。

展開済み用語定義に @protected キーワードが含まれる場合、その値は MUST true または false でなければなりません。

用語 は循環的に使用してはなりません(MUST NOT)。つまり、ある用語の定義が別の用語の定義に依存していて、その別の用語の定義が最初の用語に依存するような依存関係は許されません。

コンテキストに関するさらなる議論は § 3.1 The Context を参照してください。

9.16 キーワード

JSON-LD の キーワード の説明は § 1.7 Syntax Tokens and Keywords にありますが、 この節では各キーワードが JSON-LD のさまざまな構造内のどこで現れるかを説明します。

ノードオブジェクト値オブジェクトグラフオブジェクトリストオブジェクトセットオブジェクト、 および ネストされたプロパティ の内部では、 キーワードのエイリアスは対応するキーワードの代わりに使用してもよい(MAY)が、 @context を除きます。@context キーワードはエイリアス化してはなりません(MUST NOT)。 ローカルコンテキストや展開済み用語定義の中ではキーワードのエイリアスは使用できません(MAY NOT)。

@base
エイリアスされていない @base キーワードは MAY コンテキスト定義のキーとして使用できます。 その値は MUST IRI 参照、または null でなければなりません。
@container
エイリアスされていない @container キーワードは展開済み用語定義のキーとして MAY 使用できます。 その値は MUST 次のいずれかでなければなりません: @list@set@language@index@id@graph@type、または null、 あるいは上記のキーワードのいずれかを正確に含む配列、または @set と任意の組み合わせ(@index@id@graph@type@language)を含む配列、さらに @graph と共に @id または @index を含む配列(任意で @set)などが許されます。
@context
@context キーワードはエイリアス化できず(MUST NOT)、次のオブジェクトでキーとして使用されることが MAY あります: @context の値は MUST null、IRI 参照、コンテキスト定義、またはこれらの配列でなければなりません。
@direction
@direction キーワードはエイリアス化でき MAY 値オブジェクトのキーとして使用できます。値は MUST "ltr" または "rtl"、あるいは null でなければなりません。

エイリアスされていない @direction はコンテキスト定義のキーとして使用できます。

詳細は § 4.2.4.1 Base Direction を参照してください。

@graph
@graph キーワードはエイリアス化でき、ノードオブジェクトやグラフオブジェクトのキーとして使用可能で、値は値オブジェクト、ノードオブジェクト、またはそれらの配列でなければなりません。

未エイリアスの @graph は展開済み用語定義の @container キーの値として使用できます。

名前付きグラフについては § 4.9 Named Graphs を参照してください。

@id
@id キーワードはエイリアス化でき、ノードオブジェクトやグラフオブジェクトのキーとして使用可能です。また、展開済み用語定義のキーや @container の値としても使用できます。値は MUST IRI 参照またはコンパクト IRI(ブランクノード識別子を含む)でなければなりません。
@import
@import はコンテキスト定義で使用でき、その値は IRI 参照(MUST)でなければなりません。詳細は § 4.1.10 Imported Contexts を参照してください。
@included
@included キーワードはエイリアス化でき、その値は MUST included block でなければなりません。詳細は § 4.7 および § 9.13 を参照してください。
@index
@index キーワードはエイリアス化でき、ノードオブジェクト、値オブジェクト、グラフオブジェクト、セットオブジェクト、リストオブジェクトのキーとして使用できます。値は MUST 文字列でなければなりません。

未エイリアスの @index は展開済み用語定義内の @container の値やエントリとして使用できます(値は IRI、コンパクト IRI、または用語)。

詳細は § 9.9 Index Maps および § 4.6.1.1 Property-based data indexing を参照してください。

@json
@json はエイリアス化でき、値オブジェクトの @type の値や展開済み用語定義の値として使用できます。詳細は § 4.2.2 JSON Literals を参照してください。
@language
@language はエイリアス化でき、値オブジェクトのキーとして使用できます。値は BCP47 の語彙表記か null でなければなりません。コンテキスト定義や展開済み用語定義における使用も許されます。詳細は文字列の国際化および言語マップの節を参照してください。
@list
@list はエイリアス化でき、リストオブジェクトのキーとして MUST 使用されます。その値は文字列、数値、真偽、null、ノードオブジェクト、値オブジェクト、またはそれらの配列のいずれかでなければなりません。
@nest
@nest はエイリアス化でき、ノードオブジェクトのキーとして使用可能で、その値は map でなければなりません。未エイリアスの @nest は単純用語定義や展開済み用語定義内で使用でき、その場合値は @nest に展開される文字列である必要があります。詳細は § 9.14 を参照してください。
@none
@none はエイリアス化でき、インデックスマップ、id マップ、言語マップ、タイプマップのキーとして使用できます。詳細は索引化に関する各節を参照してください。
@prefix
@prefix は展開済み用語定義のキーとして使用でき、その値は MUST true または false でなければなりません。詳細は § 4.1.5 と § 9.15 を参照してください。
@propagate
@propagate はコンテキスト定義で使用でき、その値は MUST true または false です。詳細は § 4.1.9 を参照してください。
@protected
@protected はコンテキスト定義または展開済み用語定義で使用でき、その値は MUST true または false です。詳細は保護された用語定義の節を参照してください。
@reverse
@reverse はエイリアス化でき、ノードオブジェクトのキーとして使用可能です。未エイリアスの @reverse は展開済み用語定義内でも使用できます。値は MUST IRI 参照またはコンパクト IRI でなければなりません。詳細は逆プロパティとコンテキスト定義の節を参照してください。
@set
@set はエイリアス化でき、セットオブジェクトのキーとして MUST 使用されます。値は文字列、数値、真偽、null、ノードオブジェクト、値オブジェクト、またはそれらの配列でなければなりません。詳細は値の順序付けの節を参照してください。
@type
@type はエイリアス化でき、ノードオブジェクトや値オブジェクトのキーとして使用可能で、その値は用語、IRI 参照、またはコンパクト IRI でなければなりません。未エイリアスの @type は展開済み用語定義のキーとしても使用でき、値は @id@vocab を含む場合があります。詳細はタイプ指定と型付き値の節を参照してください。
@value
@value はエイリアス化でき、値オブジェクト内で必須のキーです。値は文字列、数値、真偽、または null でなければなりません。詳細は § 9.5 を参照してください。
@version
@version はコンテキスト定義のキーとして使用でき、その値は数値で値は 1.1 でなければなりません。
@vocab
@vocab はコンテキスト定義のキーや展開済み用語定義内の @type 値として使用でき、その値は IRI、コンパクト IRI、ブランクノード識別子、用語、または null でなければなりません。詳細は § 9.15 および § 4.1.2 を参照してください。

10. RDF との関係

JSON-LD は [RDF11-CONCEPTS] に記載されているように、具体的な RDF 構文 です。したがって、JSON-LD ドキュメントは RDF ドキュメントでありかつ JSON ドキュメントであり、対応して RDF データモデル のインスタンスを表します。しかし、JSON-LD はまた RDF データモデルを拡張して、オプションとして JSON-LD が 一般化された RDF データセット をシリアライズできるようにしています。JSON-LD による RDF データモデルへの拡張は次のとおりです:

プロパティのラベルに ブランクノード識別子 を使用することは廃止予定であり、将来の JSON-LD のバージョンで削除される可能性があります。同様に 一般化された RDF データセット のサポートも削減される可能性があります。

まとめると、これらの差異は JSON-LD が任意の RDF の グラフデータセット をシリアライズできることを意味します。ほとんどの(しかしすべてではない) JSON-LD ドキュメントは RDF11-CONCEPTS に記述された通りに直接 RDF として解釈可能です。

作成者はプロパティに ブランクノード識別子 を付けることを強く避けるべきです。代わりに次のいずれかの手段を検討してください:

JSON-LD を RDF として解釈するため、また RDF を JSON-LD としてシリアライズするための規範的なアルゴリズムは JSON-LD 1.1 Processing Algorithms and API 仕様 [JSON-LD11-API] に規定されています。

JSON-LD は RDF データセット をシリアライズしますが、同時に graph source としても使用できます。その場合、消費者は デフォルトグラフ のみを使用し、すべての 名前付きグラフ を無視しなければなりません(MUST)。これによりサーバは Turtle や JSON-LD のような言語でデータを HTTP コンテンツネゴシエーションを使って公開できます。

データセットとグラフの両方の構文をサポートする公開者は、主たるデータが デフォルトグラフ に格納されていることを保証する必要があります。これはデータセットをサポートしない消費者が情報を処理できるようにするためです。

10.1 RDF のシリアライズ/デシリアライズ

この節は規範的ではありません。

RDF を JSON-LD としてシリアライズし、JSON-LD を RDF にデシリアライズする処理は、JSON-LD 1.1 Processing Algorithms and API 仕様に定義された RDF Serialization-Deserialization Algorithms を実行することに依存します。これらのアルゴリズムの詳細をさらに述べることは本書の範囲を超えますが、処理の手順を示すための要約を提供します。

JSON-LD ドキュメントを RDF にデシリアライズする手順は次のステップを含みます:

  1. JSON-LD ドキュメントを展開し、コンテキストを除去します。これによりプロパティ、型、および値が IRI や展開された値として完全な表現を持つようになります。Expansion§ 5.1 展開ドキュメント形式 でさらに説明されています。
  2. ドキュメントをフラット化し、ドキュメントをノードオブジェクトの配列に変換します。Flattening は § 5.3 フラット化ドキュメント形式 でさらに説明されています。
  3. 各ノードオブジェクトを一連の トリプル に変換します。

例えば、次のようなコンパクト形式の JSON-LD ドキュメントを考えます:

Example 151: サンプル 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": [
    {
      "@id": "http://manu.sporny.org/about#manu",
      "name": "Manu Sporny"
    }, {
      "name": "Dave Longley"
    }
  ]
}

上記の JSON-LD 入力ドキュメントに対して JSON-LD の Expansion および Flattening アルゴリズムを実行すると、次のような出力が得られます:

Example 152: 前の例のフラット化および展開形式
[
  {
    "@id": "_:b0",
    "http://xmlns.com/foaf/0.1/name": "Dave Longley"
  }, {
    "@id": "http://manu.sporny.org/about#manu",
    "http://xmlns.com/foaf/0.1/name": "Manu Sporny"
  }, {
    "@id": "http://me.markus-lanthaler.com/",
    "http://xmlns.com/foaf/0.1/name": "Markus Lanthaler",
    "http://xmlns.com/foaf/0.1/knows": [
      { "@id": "http://manu.sporny.org/about#manu" },
      { "@id": "_:b0" }
    ]
  }
]

これを RDF にデシリアライズする作業は、各ノードオブジェクトを一つ以上の トリプル に変換する単純な手続きです。Turtle で表すと次のようになります:

Example 153: 展開/フラット化ドキュメントの Turtle 表現
@prefix foaf: <http://xmlns.com/foaf/0.1/> .

_:b0 foaf:name "Dave Longley" .

<http://manu.sporny.org/about#manu> foaf:name "Manu Sporny" .

<http://me.markus-lanthaler.com/> foaf:name "Markus Lanthaler" ;
    foaf:knows <http://manu.sporny.org/about#manu>, _:b0 .

RDF を JSON-LD としてシリアライズする処理はこの最後のステップの逆と考えることができ、RDF のトリプルからほぼ対応する展開済み JSON-LD ドキュメントを作成します。同一主語を持つトリプル群については単一のノードオブジェクトを、同一述語を持つトリプル群については単一のプロパティを用います。得られた結果は、必要に応じて Framing Algorithm を用いてフレーム化し、望ましいオブジェクトの埋め込みを作成できます。

10.2 rdf:JSON データ型

RDF はリテラル値として JSON コンテンツを扱うことができます。これはリテラル値内にマークアップを含めることを可能にします。そのようなコンテンツはデータグラフ内でデータ型が rdf:JSON に設定された リテラル を用いて示されます。

rdf:JSON データ型は次のように定義されます:

このデータ型を指す IRI
http://www.w3.org/1999/02/22-rdf-syntax-ns#JSON です。
字句領域(lexical space)
JSON 文法 に準拠する UNICODE 文字列の集合です([UNICODE] を参照)。詳細は RFC8259 の Section 2 JSON Grammar を参照してください。
値空間(value space)
JSON 文法 に従う UNICODE 文字列の集合であり、さらに次の制約を満たすものです:
  • 不必要な空白を含んではならない(MUST NOT)、
  • オブジェクト内のキーは辞書順(辞書式順序)であること(MUST)、
  • ネイティブの数値は ECMASCRIPT の規定 に従ってシリアライズされること(MUST)、
  • 文字列は U+0000 から U+001F までのコードポイントを小文字の 16 進 Unicode 表記(\uhhhh)でシリアライズすることが要求されますが、事前定義された制御文字(U+0008, U+0009, U+000A, U+000C, U+000D)はそれぞれ \b, \t, \n, \f, \r としてシリアライズされることが推奨されます(SHOULD)。その他の Unicode 文字は原則としてそのままシリアライズされることが推奨されますが、U+005C(\)と U+0022(")はそれぞれ \\\" としてシリアライズすることが推奨されます(SHOULD)。
Issue
JSON Canonicalization Scheme (JCS) [RFC8785] は JSON 正規化の新興標準です。本仕様は将来的にこのような正規表現を必要とするよう更新される可能性があります。そのため、JSON リテラルの字句表現を RDF リテラルとして直接依存することは注意が必要です。
文字列の集合として定義されているにもかかわらず、この値空間は既存仕様との副作用を避けるために xsd:string の値空間とは区別されます。
字句から値への写像(lexical-to-value mapping)
は字句領域の各要素を次の結果に写像します:
  1. それを ECMA スタイルの内部表現へパースし(JSON.parse による表現を用いる等)、
  2. その後、上で述べた値空間の制約に従って JSON 形式でシリアライズする、という手順の結果。
正規写像(canonical mapping)
は値空間の任意の要素を字句領域の同一文字列へ写像します。

10.3 i18n 名前空間

この節は規範的ではありません。

i18n 名前空間は、言語タグ基底方向 の組合せを RDF リテラルで記述するために使用されます。これは通常 xsd:stringrdf:langString データ型で表す言語タグや基底方向を代替的に記述する仕組みです。

この名前空間に基づくデータ型は、基底方向を使用する JSON-LD ドキュメントのラウンドトリップを可能にしますが、このメカニズム自体が標準化されているわけではありません。

Deserialize JSON-LD to RDF Algorithm は、rdfDirection オプションを i18n-datatype に設定して、値オブジェクトに含まれる @direction(と任意の @language)から、https://www.w3.org/ns/i18n# に続けて言語、アンダースコア、方向を連結した IRI を生成することで RDF リテラルを生成できます(言語は小文字正規化されます)。

相互運用性向上のため、データ型 IRI を生成する際に言語タグは小文字に正規化されます。

次の例は i18n:ar-EG_rtl というデータ型を持つ 2 つのステートメントを示します。これは言語タグ ar-EG と基底方向 rtl をエンコードしています。

@prefix ex: <http://example.org/> .
@prefix i18n: <https://www.w3.org/ns/i18n#> .

# Note that this version preserves the base direction using a non-standard datatype.
[
  ex:title "HTML و CSS: تصميم و إنشاء مواقع الويب"^^i18n:ar-eg_rtl;
  ex:publisher "مكتبة"^^i18n:ar-eg_rtl
] .

文字列の基底方向の使用方法については § 4.2.4.1 Base Direction を参照してください。

10.4 rdf:CompoundLiteral クラスと rdf:language および rdf:direction プロパティ

この節は規範的ではありません。

本仕様は rdf:CompoundLiteral クラスを定義しており、これは同一の主語上の rdf:value に対する文字列値と共に基底方向および任意の言語タグを記述するために用いられる rdf:language および rdf:direction のドメインとなります。

rdf:CompoundLiteral
複合リテラルを表すクラス。
rdf:language
RDF の プロパティ。このプロパティのレンジは rdfs:Literal であり、その値は [BCP47] に従った適切な言語タグでなければなりません(MUST)。プロパティのドメインは rdf:CompoundLiteral です。
rdf:direction
RDF の プロパティ。このプロパティのレンジは rdfs:Literal であり、その値は "ltr" または "rtl" のいずれかでなければなりません(MUST)。プロパティのドメインは rdf:CompoundLiteral です。

Deserialize JSON-LD to RDF Algorithm は、rdfDirection オプションを compound-literal に設定して、値オブジェクトに含まれる @direction(および任意の @language)から、これらのプロパティを用いて RDF リテラルを生成することができます(言語は小文字に正規化されます)。

相互運用性向上のため、データ型 IRI を生成する際に言語タグは小文字に正規化されます。

次の例は基底方向と言語タグ ar-EG、方向 rtl を持つ複合リテラルを表す 2 件のステートメントを示します。

@prefix ex: <http://example.org/> .

# Note that this version preserves the base direction using a bnode structure.
[
  ex:title [
    rdf:value "HTML و CSS: تصميم و إنشاء مواقع الويب",
    rdf:language "ar-eg",
    rdf:direction "rtl"
  ];
  ex:publisher [
    rdf:value "مكتبة",
    rdf:language "ar-eg",
    rdf:direction "rtl"
  ]
] .

文字列の基底方向の使用方法については § 4.2.4.1 Base Direction を参照してください。

11. セキュリティ考慮事項

詳細は Security Considerations§ C. IANA Considerations にて参照してください。

将来の本仕様のバージョンでは、キャッシュされた取得コンテンツがリモートサーバから取得したデータと一致することを保証する手段として Subresource Integrity(SRI) [SRI] を組み込む可能性があります。関連議論は issue 86 を参照してください。

12. プライバシー考慮事項

外部コンテキストの取得は JSON-LD プロセッサの操作を露出させる可能性があり、中継ノードが取得したリソースの検査を通じてクライアントアプリケーションをフィンガープリントすることを許し([fingerprinting-guidance] を参照)、中間者攻撃の機会を提供する可能性があります。これを防ぐため、公開者はリモートコンテキストを今後の利用のためにキャッシュすること、あるいは documentLoader を用いてそのようなコンテキストのローカル版を保持することを検討すべきです。

13. 国際化に関する考慮事項

JSON-LD は RDF データモデルを使用するため、左右方向の指示子を持つ文字列としての JSON-LD 値(文字列)の正確な記録には設計上制約があります。JSON-LD と RDF の両者は文字列に関連する言語を指定するメカニズム(言語タグ付き文字列)を提供しますが、文字列の 基底方向 を示す手段は提供していません。

Unicode は文字列内で方向を示す仕組みを提供します(Unicode Bidirectional Algorithm [UAX9] を参照)が、文字列の先頭から基底方向を決定できない場合には外部の指示子が必要です。例えば HTML の dir 属性 のようなもので、現時点では RDF リテラルに対する対応はありません。

RDF における文字列の基底方向を適切に表現する問題は本作業部会が扱える範囲を超えており、将来の RDF 作業部会がこの問題を検討し、言語タグ付き文字列の基底方向を指定できるようにすることが期待されています。

より包括的な解決が本仕様の将来バージョンで扱われるまで、公開者は文字列の基底方向が文字列の内容から正しく推測できない場合にこの問題を考慮するべきです。文字列の言語および基底方向の識別に関するベストプラクティスについては [string-meta] を参照してください。

A. 画像 記述

この節は規範的ではありません。

A.1 Linked Dataデータセット

この節は規範的ではありません。

この節では、Linked Data Dataset figure§ 8. Data Model にある図について説明します。

図は破線の箱が三つあり、それぞれ異なるlinked data graph を表しています。各箱は有向矢印で結ばれた図形で構成され、リンクドデータの関係を表しています。

最初の箱のタイトルは "default graph: <no name>" で、次の 2 つのリソースを表します: http://example.com/people/alicehttp://example.com/people/bob(それぞれ "Alice" と "Bob" を示す)。両者は schema:knows というラベルの付いた矢印で接続されており、二つのリソース間の knows 関係を示しています。さらに "Alice" リソースは三つの異なるリテラルと関連しています:

Alice
データ型や言語が指定されていない RDF リテラル。
weiblich | de
値が "weiblich" で言語タグが "de" の言語タグ付き文字列。
female | en
値が "female" で言語タグが "en" の言語タグ付き文字列。

二番目と三番目の箱は二つのnamed graphs を示しており、グラフ名はそれぞれ "http://example.com/graphs/1" と "http://example.com/graphs/1" です。

二番目の箱は二つのリソース、http://example.com/people/alicehttp://example.com/people/bob から構成され、これらは schema:parent 関係で結ばれており、http://example.com/people/bob を "Bob" と名付けています。

三番目の箱は二つのリソースからなり、一方は http://example.com/people/bob と名付けられ、もう一方は名前がありません。これら二つのリソースは schema:sibling 関係で結ばれており、もう一方のリソースは "Mary" と名付けられています。

B. 他のLinked Dataフォーマットとの関係

この節は規範的ではありません。

以下の JSON-LD の例は、Turtle、RDFa、Microdata といった他の Linked Data 形式でマークアップされた意味的データを JSON-LD でどのように表現できるかを示しています。これらの節は、JSON-LD が異なる Linked Data のアプローチ全体で表現可能な柔軟性を持つことを示すために提供されています。

B.1 Turtle

この節は規範的ではありません。

以下は [Turtle] で表現された RDF を JSON-LD に変換する例です。

B.1.1 プレフィックス定義

JSON-LD のコンテキストは Turtle の @prefix 宣言と直接対応します:

Example 154: A set of statements serialized in Turtle
@prefix foaf: <http://xmlns.com/foaf/0.1/> .

<http://manu.sporny.org/about#manu> a foaf:Person;
  foaf:name "Manu Sporny";
  foaf:homepage <http://manu.sporny.org/> .
Example 155: The same set of statements serialized in JSON-LD
{
  "@context": {
    "foaf": "http://xmlns.com/foaf/0.1/"
  },
  "@id": "http://manu.sporny.org/about#manu",
  "@type": "foaf:Person",
  "foaf:name": "Manu Sporny",
  "foaf:homepage": { "@id": "http://manu.sporny.org/" }
}

B.1.2 埋め込み

Turtle と JSON-LD の両方は埋め込みを許容しますが、Turtle は blank nodes の埋め込みのみを許可します。

Example 156: Embedding in Turtle
@prefix foaf: <http://xmlns.com/foaf/0.1/> .

<http://manu.sporny.org/about#manu>
  a foaf:Person;
  foaf:name "Manu Sporny";
  foaf:knows [ a foaf:Person; foaf:name "Gregg Kellogg" ] .
Example 157: Same embedding example in JSON-LD
{
  "@context": {
    "foaf": "http://xmlns.com/foaf/0.1/"
  },
  "@id": "http://manu.sporny.org/about#manu",
  "@type": "foaf:Person",
  "foaf:name": "Manu Sporny",
  "foaf:knows": {
    "@type": "foaf:Person",
    "foaf:name": "Gregg Kellogg"
  }
}

B.1.3 ネイティブデータタイプの変換

JSON-LD では数値やブール値はネイティブなデータ型です。Turtle にはそのような値を表現する略記構文がありますが、RDF の抽象構文は数値やブール値を型付きリテラルとして表現することを要求します。したがって完全なラウンドトリップを可能にするために、JSON-LD 1.1 Processing Algorithms and API 仕様は JSON-LD のネイティブデータ型と RDF の対応する型との間の変換規則を定義しています。小数部を持たない数は xsd:integer 型リテラルに、小数部を持つ数は xsd:double 型リテラルに、真偽の値 truefalsexsd:boolean 型リテラルに変換されます。すべての型付きリテラルは正規化された字句形式になります。

Example 158: JSON-LD using native data types for numbers and boolean values
{
  "@context": {
    "ex": "http://example.com/vocab#"
  },
  "@id": "http://example.com/",
  "ex:numbers": [ 14, 2.78 ],
  "ex:booleans": [ true, false ]
}
Example 159: Same example in Turtle using typed literals
@prefix ex: <http://example.com/vocab#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

<http://example.com/>
  ex:numbers "14"^^xsd:integer, "2.78E0"^^xsd:double ;
  ex:booleans "true"^^xsd:boolean, "false"^^xsd:boolean .
Note
この解釈は [Turtle] の解釈と異なり、Turtle ではリテラル 2.78xsd:decimal に変換されます。理由は多くの JSON ツールが小数を浮動小数点数として解析するためであり、RDF に戻す際には xsd:double が最も適切なデータ型だからです。

B.1.4 リスト

JSON-LD と [Turtle] の両方が値の順序付きリストを表現できます。

Example 160: A list of values in Turtle
@prefix foaf: <http://xmlns.com/foaf/0.1/> .

<http://example.org/people#joebob> a foaf:Person;
  foaf:name "Joe Bob";
  foaf:nick ( "joe" "bob" "jaybee" ) .
Example 161: Same example with a list of values in JSON-LD
{
  "@context": {
    "foaf": "http://xmlns.com/foaf/0.1/"
  },
  "@id": "http://example.org/people#joebob",
  "@type": "foaf:Person",
  "foaf:name": "Joe Bob",
  "foaf:nick": {
    "@list": [ "joe", "bob", "jaybee" ]
  }
}

B.2 RDFa

この節は規範的ではありません。

次の例は RDFa [RDFA-CORE] で三名の人々とそれぞれの名前やホームページを記述した例です。

Example 162: RDFa fragment that describes three people
<div prefix="foaf: http://xmlns.com/foaf/0.1/">
   <ul>
      <li typeof="foaf:Person">
        <a property="foaf:homepage" href="http://example.com/bob/">
          <span property="foaf:name">Bob</span>
        </a>
      </li>
      <li typeof="foaf:Person">
        <a property="foaf:homepage" href="http://example.com/eve/">
         <span property="foaf:name">Eve</span>
        </a>
      </li>
      <li typeof="foaf:Person">
        <a property="foaf:homepage" href="http://example.com/manu/">
          <span property="foaf:name">Manu</span>
        </a>
      </li>
   </ul>
</div>

以下は、単一のコンテキストを共有する JSON-LD による実装例です。

Example 163: Same description in JSON-LD (context shared among node objects)
{
  "@context": {
    "foaf": "http://xmlns.com/foaf/0.1/",
    "foaf:homepage": {"@type": "@id"}
  },
  "@graph": [
    {
      "@type": "foaf:Person",
      "foaf:homepage": "http://example.com/bob/",
      "foaf:name": "Bob"
    }, {
      "@type": "foaf:Person",
      "foaf:homepage": "http://example.com/eve/",
      "foaf:name": "Eve"
    }, {
      "@type": "foaf:Person",
      "foaf:homepage": "http://example.com/manu/",
      "foaf:name": "Manu"
    }
  ]
}

B.3 Microdata

この節は規範的ではありません。

以下の HTML Microdata の例は、本に関する情報を Microdata の Work アイテムとして表現したものです([MICRODATA])。

Example 164: HTML that describes a book using microdata
<dl itemscope
    itemtype="http://purl.org/vocab/frbr/core#Work"
    itemid="http://purl.oreilly.com/works/45U8QJGZSQKDH8N">
 <dt>Title</dt>
 <dd><cite itemprop="http://purl.org/dc/elements/1.1/title">Just a Geek</cite></dd>
 <dt>By</dt>
 <dd><span itemprop="http://purl.org/dc/elements/1.1/creator">Wil Wheaton</span></dd>
 <dt>Format</dt>
 <dd itemprop="http://purl.org/vocab/frbr/core#realization"
     itemscope
     itemtype="http://purl.org/vocab/frbr/core#Expression"
     itemid="http://purl.oreilly.com/products/9780596007683.BOOK">
  <link itemprop="http://purl.org/dc/elements/1.1/type" href="http://purl.oreilly.com/product-types/BOOK">
  Print
 </dd>
 <dd itemprop="http://purl.org/vocab/frbr/core#realization"
     itemscope
     itemtype="http://purl.org/vocab/frbr/core#Expression"
     itemid="http://purl.oreilly.com/products/9780596802189.EBOOK">
  <link itemprop="http://purl.org/dc/elements/1.1/type" href="http://purl.oreilly.com/product-types/EBOOK">
  Ebook
 </dd>
</dl>

JSON-LD による Microdata 情報の表現は、Microdata コミュニティがコンテキストを避け、代わりに項目を完全な IRI で参照するという方針に忠実である点に留意してください。

Example 165: Same book description in JSON-LD (avoiding contexts)
[
  {
    "@id": "http://purl.oreilly.com/works/45U8QJGZSQKDH8N",
    "@type": "http://purl.org/vocab/frbr/core#Work",
    "http://purl.org/dc/elements/1.1/title": "Just a Geek",
    "http://purl.org/dc/elements/1.1/creator": "Wil Wheaton",
    "http://purl.org/vocab/frbr/core#realization":
    [
      {"@id": "http://purl.oreilly.com/products/9780596007683.BOOK"},
      {"@id": "http://purl.oreilly.com/products/9780596802189.EBOOK"}
    ]
  }, {
    "@id": "http://purl.oreilly.com/products/9780596007683.BOOK",
    "@type": "http://purl.org/vocab/frbr/core#Expression",
    "http://purl.org/dc/elements/1.1/type": {"@id": "http://purl.oreilly.com/product-types/BOOK"}
  }, {
    "@id": "http://purl.oreilly.com/products/9780596802189.EBOOK",
    "@type": "http://purl.org/vocab/frbr/core#Expression",
    "http://purl.org/dc/elements/1.1/type": {"@id": "http://purl.oreilly.com/product-types/EBOOK"}
  }
]

C. IANA 考慮事項

この節は Internet Engineering Steering Group (IESG) に提出され、レビュー、承認、IANA 登録のために送られています。

application/ld+json

Type name:
application
Subtype name:
ld+json
Required parameters:
N/A
Optional parameters:
profile

空でない空白区切りの URI のリストで、JSON-LD ドキュメントに適用される特定の制約や慣習を識別します([RFC6906])。プロファイルは、プロファイルの知識がないクライアントで処理してもリソース表現の意味論を変えないため、プロファイルの有無に関わらず同じ表現を安全に使用できます。profile パラメータはクライアントがコンテンツネゴシエーションで好みを表現するために MAY 使用できます。サーバがプロファイルパラメータを受け取った場合、サーバは認識するプロファイルを尊重したドキュメントを返すべきで(SHOULD)、認識しないプロファイルは無視しなければなりません(MUST)。プロファイル URI は dereferenceable であり、その URI 上で有用なドキュメントを提供することが推奨されます。詳細は [RFC6906] を参照してください。

本仕様は profile パラメータのために 6 種類の値を定義します。

http://www.w3.org/ns/json-ld#expanded
展開済みの expanded JSON-LD document form を要求または指定するため。
http://www.w3.org/ns/json-ld#compacted
コンパクト化された compacted JSON-LD document form を要求または指定するため。
http://www.w3.org/ns/json-ld#context
JSON-LD の context document を要求または指定するため。
http://www.w3.org/ns/json-ld#flattened
フラット化された flattened JSON-LD document form を要求または指定するため。
http://www.w3.org/ns/json-ld#frame
フレームドキュメント(JSON-LD frame document)を要求または指定するため。
http://www.w3.org/ns/json-ld#framed
フレーム化されたドキュメント形式(framed JSON-LD document form)を要求または指定するため。

http://www.w3.org/ns/json-ld で始まるその他の URI は将来の JSON-LD 仕様のために予約されています。

他の仕様は独自の意味を持つ追加の profile パラメータ URI を公開することができます。これにはファイル拡張子を profile パラメータに関連付ける能力も含まれます。

メディアタイプパラメータとして使用される場合(RFC4288 に従う)、profile パラメータの値は空白などの特殊文字を含む場合には引用符で囲む必要があります。複数のプロファイル URI を組み合わせるときに必要です。

“profile” メディアタイプパラメータの値は一つ以上の URI を含むことに注意してください。場合によっては IRI と URI の間の変換が必要になることがあります(RFC3987 の該当節を参照)。

Encoding considerations:
RFC 8259 セクション 11 を参照。
Security considerations:
RFC 8259 セクション 12 を参照 [RFC8259]

JSON-LD は有向グラフの純粋なデータ交換形式を意図しているため、シリアライゼーションを JavaScript の eval() のようなコード実行機構に渡して解析するべきではありません(SHOULD NOT)。不正なドキュメントには実行時に副作用を引き起こす可能性のあるコードが含まれることがあります。

JSON-LD ドキュメントを処理する際、リモートコンテキストやフレームへのリンクが自動的に辿られることが多く、ファイル転送がユーザの明示的な要求なしに発生します。リモートコンテキストが第三者によって提供される場合、利用パターンの収集などに利用され、プライバシー上の懸念が生じる可能性があります。JSON-LD11-API のような特定の実装はこの挙動を細かく制御する手段を提供することがあります。

Web 上の非安全な接続(HTTP など)でロードされるリモートコンテキストは、攻撃者によって改変される危険があり、active context を変更してセキュリティを損なう可能性があります。ミッションクリティカルな用途でリモートコンテキストに依存するアプリケーションは、そのコンテキストを検証しキャッシュしてから使用することが推奨されます。

JSON-LD は長大な IRI を短い用語に置き換えることを許すため、処理時に展開されるとドキュメントが大幅に膨張し、最悪の場合受信側のリソースを枯渇させる可能性があります。アプリケーションは受け取るデータを慎重に扱うべきです。

JSON-LD は使用できる IRI スキームに制限を設けず、語彙相対 IRI は IRI 解決ではなく文字列結合を用いるため、デリファレンスした際に悪用され得る IRI を構築することが可能です。

Interoperability considerations:
該当なし
Published specification:
http://www.w3.org/TR/json-ld
Applications that use this media type:
有向グラフの交換を必要とする任意のプログラミング環境。JSON-LD の実装は JavaScript、Python、Ruby、PHP、C++ 向けに存在します。
Additional information:
Magic number(s):
該当なし
File extension(s):
.jsonld
Macintosh file type code(s):
TEXT
Person & email address to contact for further information:
Ivan Herman <ivan@w3.org>
Intended usage:
Common
Restrictions on usage:
N/A
Author(s):
Manu Sporny, Dave Longley, Gregg Kellogg, Markus Lanthaler, Niklas Lindström
Change controller:
W3C

application/ld+json で使用されるフラグメント識別子は、RDF 構文での扱いと同様に処理されます(RDF11-CONCEPTS を参照)。

この登録は [JSON-LD10] にある application/ld+json の元の定義に対する更新です。

C.1

この節は規範的ではありません。

以下の例は、プロファイルパラメータが異なる許容されるレスポンスを記述するためにどのように使用されうるかを示します。

Example 166: HTTP Request with profile requesting an expanded document
GET /ordinary-json-document.json HTTP/1.1
Host: example.com
Accept: application/ld+json;profile=http://www.w3.org/ns/json-ld#expanded

サーバに対してリクエストされたリソースを展開済み(expanded document form)の JSON-LD として返すよう要求します。

Example 167: HTTP Request with profile requesting a compacted document
GET /ordinary-json-document.json HTTP/1.1
Host: example.com
Accept: application/ld+json;profile=http://www.w3.org/ns/json-ld#compacted

サーバに対してリクエストされたリソースをコンパクト化された JSON-LD(compacted document form)で返すよう要求します。明示的なコンテキストリソースが指定されていないため、サーバはアプリケーション固有のデフォルトコンテキストを使ってコンパクト化を行います。

Example 168: HTTP Request with profile requesting a compacted document with a reference to a compaction context
GET /ordinary-json-document.json HTTP/1.1
Host: example.com
Accept: application/ld+json;profile="http://www.w3.org/ns/json-ld#flattened http://www.w3.org/ns/json-ld#compacted"

サーバに対してリクエストされたリソースをコンパクト化ドキュメント形式とフラット化ドキュメント形式の両方で返すよう要求します。二つの URI を区切るために空白が使われているので、二つの URI は二重引用符で囲まれています。

D. 未解決の問題

この節は規範的ではありません。

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

Issue 108: メタデータを伴う参照によるコンテキストの検討 defer-future-versionprivacy-trackersecurity-tracker

メタデータを伴う参照によるコンテキスト検討。

Issue 191: 非自明なプレフィックス用語定義に対する Compact IRI 展開サポート defer-future-versionspec:enhancement

非自明なプレフィックス用語定義に対する Compact IRI 展開サポート。

Issue 280: language-maps は別個の基底方向を許可しない defer-future-version

Language-maps は基底方向を別個に指定できない。

Issue 328: JSON-LD コア構文の @context 内の @default defer-future-version

@context 内の @default に関する検討。

Issue 329: @prefix に関する提案 defer-future-version

@prefix に関する提案。

Issue 335: 型強制 / ノード変換:@coerce キーワードまたは類似の提案 defer-future-version

型強制 / ノード変換:@coerce キーワードまたは同様の提案。

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

この節は規範的ではありません。

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

F. JSON-LD Community Group 最終報告以降の変更点

この節は規範的ではありません。

G. 2019年12月12日の候補公開以降の変更点

この節は規範的ではありません。

H. 2020年5月7日の提案勧告以降の変更点

この節は規範的ではありません。

I. 謝辞

この節は規範的ではありません。

編集者は、本仕様の作成および編集に大きく貢献した以下の個人に特に感謝します。

また、公開時点で作業部会のメンバーであった以下の方々にも感謝します:

また、技術的な議論を行い多くの問題を解決してきた 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., Victor Charpenay。

J. 参考文献

J.1 規範的参照文献

[BCP47]
Tags for Identifying Languages. A. Phillips; M. Davis. IETF. September 2009. 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/
[IANA-URI-SCHEMES]
Uniform Resource Identifier (URI) Schemes. IANA. URL: https://www.iana.org/assignments/uri-schemes/uri-schemes.xhtml
[JSON]
The application/json Media Type for JavaScript Object Notation (JSON). D. Crockford. IETF. July 2006. Informational. URL: https://tools.ietf.org/html/rfc4627
[JSON-LD10]
JSON-LD 1.0. Manu Sporny; Gregg Kellogg; Marcus Langhaler. W3C. 16 January 2014. W3C Recommendation. URL: https://www.w3.org/TR/2014/REC-json-ld-20140116/
[JSON-LD11-API]
JSON-LD 1.1 Processing Algorithms and API. Gregg Kellogg; Dave Longley; Pierre-Antoine Champin. W3C. 7 May 2020. W3C Proposed Recommendation. URL: https://www.w3.org/TR/json-ld11-api/
[JSON-LD11-FRAMING]
JSON-LD 1.1 Framing. Dave Longley; Gregg Kellogg; Pierre-Antoine Champin. W3C. 7 May 2020. W3C Proposed Recommendation. URL: https://www.w3.org/TR/json-ld11-framing/
[RDF-SCHEMA]
RDF Schema 1.1. Dan Brickley; Ramanathan Guha. W3C. 25 February 2014. 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. 25 February 2014. W3C Recommendation. URL: https://www.w3.org/TR/rdf11-concepts/
[RDF11-MT]
RDF 1.1 Semantics. Patrick Hayes; Peter Patel-Schneider. W3C. 25 February 2014. W3C Recommendation. URL: https://www.w3.org/TR/rdf11-mt/
[RFC2119]
Key words for use in RFCs to Indicate Requirement Levels. S. Bradner. IETF. March 1997. 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. January 2005. Internet Standard. URL: https://tools.ietf.org/html/rfc3986
[RFC3987]
Internationalized Resource Identifiers (IRIs). M. Duerst; M. Suignard. IETF. January 2005. Proposed Standard. URL: https://tools.ietf.org/html/rfc3987
[RFC4288]
Media Type Specifications and Registration Procedures. N. Freed; J. Klensin. IETF. December 2005. Best Current Practice. URL: https://tools.ietf.org/html/rfc4288
[RFC5234]
Augmented BNF for Syntax Specifications: ABNF. D. Crocker, Ed.; P. Overell. IETF. January 2008. Internet Standard. URL: https://tools.ietf.org/html/rfc5234
[RFC6839]
Additional Media Type Structured Syntax Suffixes. T. Hansen; A. Melnikov. IETF. January 2013. Informational. URL: https://tools.ietf.org/html/rfc6839
[RFC6906]
The 'profile' Link Relation Type. E. Wilde. IETF. March 2013. Informational. URL: https://tools.ietf.org/html/rfc6906
[RFC7231]
Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content. R. Fielding, Ed.; J. Reschke, Ed. June 2014. Proposed Standard. URL: https://tools.ietf.org/html/rfc7231
[RFC8174]
Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words. B. Leiba. IETF. May 2017. Best Current Practice. URL: https://tools.ietf.org/html/rfc8174
[RFC8259]
The JavaScript Object Notation (JSON) Data Interchange Format. T. Bray, Ed.. IETF. December 2017. Internet Standard. URL: https://tools.ietf.org/html/rfc8259
[RFC8288]
Web Linking. M. Nottingham. October 2017. Proposed Standard. URL: https://tools.ietf.org/html/rfc8288
[UAX9]
Unicode Bidirectional Algorithm. Mark Davis; Aharon Lanin; Andrew Glass. Unicode Consortium. 12 February 2020. Unicode Standard Annex #9. URL: https://www.unicode.org/reports/tr9/tr9-42.html
[UNICODE]
The Unicode Standard. Unicode Consortium. URL: https://www.unicode.org/versions/latest/

J.2 参考資料(非規範)

[fingerprinting-guidance]
Mitigating Browser Fingerprinting in Web Specifications. Nick Doty. W3C. 28 March 2019. W3C Note. URL: https://www.w3.org/TR/fingerprinting-guidance/
[INFRA]
Infra Standard. Anne van Kesteren; Domenic Denicola. WHATWG. Living Standard. URL: https://infra.spec.whatwg.org/
[JSON.API]
JSON API. Steve Klabnik; Yehuda Katz; Dan Gebhardt; Tyler Kellen; Ethan Resnick. 29 May 2015. unofficial. URL: https://jsonapi.org/format/
[ld-glossary]
Linked Data Glossary. Bernadette Hyland; Ghislain Auguste Atemezing; Michael Pendleton; Biplav Srivastava. W3C. 27 June 2013. W3C Note. URL: https://www.w3.org/TR/ld-glossary/
[LINKED-DATA]
Linked Data Design Issues. Tim Berners-Lee. W3C. 27 July 2006. W3C-Internal Document. URL: https://www.w3.org/DesignIssues/LinkedData.html
[MICRODATA]
HTML Microdata. Charles 'chaals' (McCathie) Nevile; Dan Brickley; Ian Hickson. W3C. 26 April 2018. W3C Working Draft. URL: https://www.w3.org/TR/microdata/
[RDFA-CORE]
RDFa Core 1.1 - Third Edition. Ben Adida; Mark Birbeck; Shane McCarron; Ivan Herman et al. W3C. 17 March 2015. W3C Recommendation. URL: https://www.w3.org/TR/rdfa-core/
[rfc4122]
A Universally Unique IDentifier (UUID) URN Namespace. P. Leach; M. Mealling; R. Salz. IETF. July 2005. Proposed Standard. URL: https://tools.ietf.org/html/rfc4122
[RFC7049]
Concise Binary Object Representation (CBOR). C. Bormann; P. Hoffman. IETF. October 2013. Proposed Standard. URL: https://tools.ietf.org/html/rfc7049
[RFC7946]
The GeoJSON Format. H. Butler; M. Daly; A. Doyle; S. Gillies; S. Hagen; T. Schaub. IETF. August 2016. Proposed Standard. URL: https://tools.ietf.org/html/rfc7946
[RFC8785]
JSON Canonicalization Scheme (JCS). A. Rundgren; B. Jordan; S. Erdtman. Network Working Group. June 2020. Informational. URL: https://www.rfc-editor.org/rfc/rfc8785
[SPARQL11-OVERVIEW]
SPARQL 1.1 Overview. The W3C SPARQL Working Group. W3C. 21 March 2013. W3C Recommendation. URL: https://www.w3.org/TR/sparql11-overview/
[SRI]
Subresource Integrity. Devdatta Akhawe; Frederik Braun; Francois Marier; Joel Weinberger. W3C. 23 June 2016. W3C Recommendation. URL: https://www.w3.org/TR/SRI/
[string-meta]
Strings on the Web: Language and Direction Metadata. Addison Phillips; Richard Ishida. W3C. 11 June 2019. W3C Working Draft. URL: https://www.w3.org/TR/string-meta/
[TriG]
RDF 1.1 TriG. Gavin Carothers; Andy Seaborne. W3C. 25 February 2014. W3C Recommendation. URL: https://www.w3.org/TR/trig/
[Turtle]
RDF 1.1 Turtle. Eric Prud'hommeaux; Gavin Carothers. W3C. 25 February 2014. W3C Recommendation. URL: https://www.w3.org/TR/turtle/
[URN]
URN Syntax. R. Moats. IETF. May 1997. Proposed Standard. URL: https://tools.ietf.org/html/rfc2141
[WEBIDL]
Web IDL. Boris Zbarsky. W3C. 15 December 2016. W3C Editor's Draft. URL: https://heycam.github.io/webidl/
[YAML]
YAML Ain’t Markup Language (YAML™) Version 1.2. Oren Ben-Kiki; Clark Evans; Ingy döt Net. 1 October 2009. URL: http://yaml.org/spec/1.2/spec.html