公開以降に報告されたエラーや問題については、 正誤表を確認してください。
また、 翻訳も参照してください。
この文書は、この非規範的なフォーマットでも利用可能です: EPUB
Copyright © 2010-2020 W3C® (MIT, ERCIM, Keio, Beihang). W3C liability, trademark and permissive document license rules apply.
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つです:
このセクションは規範的ではありません。
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は文書を決定論的な構造に変形するメカニズムを備え、処理を簡素化します。
このセクションは規範的ではありません。
この文書は、JSONでのLinked Dataのシリアライズに関する詳細な仕様です。本書は主に次の読者を想定しています:
補助文書である JSON-LD 1.1 Processing Algorithms and API 仕様 [JSON-LD11-API] は、一般的なJSON-LD操作のための標準ライブラリインターフェースを提供することで、JSON-LD をより高いレベルで扱う方法を規定しています。
この仕様の基本を理解するには、まず JSON に精通している必要があります。これは [RFC8259] に詳述されています。
ハイパーリンクに関しては、この文書ではほぼ例外なく略語の IRI(Internationalized Resource Indicator)という用語を使用します。多くのWeb開発者は URL(Uniform Resource Locator)という用語に馴染みがあります。本書では稀にURI(Uniform Resource Indicator)という用語も使用します。これらの用語は技術コミュニティ間で混用されることが多いですが、それぞれには重要な区別があり、本仕様は常に適切な用語を使用するよう努めています。
この文書は、JSON-LD 1.0 版からの変更を強調表示できます。 変更を表示するには を選択してください。
このセクションは規範的ではありません。
この仕様の開発に参加する方法はいくつかあります:
このセクションは規範的ではありません。
本仕様で使用される組版規則は以下のとおりです:
markupmarkup definition reference markup external definition reference注記は薄い緑色のボックスで、左の境界線は緑色、ヘッダーに "Note" が表示されます。注記は常に情報提供的です。
例は薄いカーキ色のボックス内に表示され、左の境界線はカーキ色で、番号付きの "Example" ヘッダーがカーキ色で表示されます。 例は常に情報提供的です。例の内容はモノスペースフォントで表示され、構文色分けされる場合があります。 例にはタブ式のナビゲーションボタンがあり、 例を他の表現に変換した結果を表示できます。
このセクションは規範的ではありません。
この文書では外部仕様で定義された用語を使用するとともに、JSON-LD 固有の用語を定義します。
以下からインポートされた用語を含みます:ECMAScript Language Specification [ECMASCRIPT]、 The JavaScript Object Notation (JSON) Data Interchange Format [RFC8259]、 Infra Standard [INFRA]、および Web IDL [WEBIDL]
true と false の値。内部表現では、JSON object は map(ordered map)として記述され、キー/値のエントリで構成されます(INFRA を参照)。
アプリケーションプログラミングインターフェイスでは、map は [WEBIDL] の record として記述されます。
@context 内で値またはその値の @id が null の場合、用語の IRI
との関連付けが明示的に切り離されます。文書本文の map entry の値が null の場合、その map entry
が定義されていない場合と同じ意味になります。拡張形式で @value、@list、または @set が
null に設定されている場合、該当する JSON オブジェクト全体は無視されます。
true、または
false のいずれかです。
Internationalized Resource Identifiers (IRIs) [RFC3987] からの用語
@type の値、およびボキャブラリ相対(vocabulary
relative)として定義された用語の値は、base IRI ではなく vocabulary mapping に対して相対的に解決される点に注意してください。RDF 1.1 Concepts and Abstract Syntax、RDF Schema 1.1、および Linked Data Design Issues からの用語
_:
で始まる識別子が割り当てられます。_:
で始まります。rdf:langString
の場合はオプションで言語タグを含みます。@direction キーを使って context 内で設定でき、その値は
"ltr"、"rtl"、または null のいずれかになります。詳細は Context
Definitions セクションを参照してください。
@language キーで context 内に設定でき、その値は BCP47 言語コードを表す文字列または
null でなければなりません。
@default キーを持つ map(デフォルトオブジェクト)です。
@context エントリとして現れる context で、node object、value object、graph object、list
object、set object、nested properties の値、または expanded term definition の値として現れるものです。その値は
context definition の map、IRI、またはそれらの配列のいずれかになります。
@graph エントリを持ち、必要に応じて
@id や @index を持つことがあります。simple graph object は @id
エントリを持たない graph object を指します。
@container が @id に設定された term の map 値で、キーは関連する node object の
@id を表す IRI として解釈されます。値は node objects でなければなりません。
@container が @graph に設定された expanded term definition の値から作成される
named graph。
@included またはそのエイリアスであり、値が1個以上の node objects であるもの。
@container が @index に設定された term の map
値で、その値は文字列、数値、true、false、null、node object、value object、list object、set
object、またはそれらの配列のいずれかになります。
rdf:JSON である literal であり、value object 表現では @type
の値が @json になります。JSON literal は有効な JSON 値を表します。@container が @language に設定された term の map 値で、キーは BCP47
言語コードを表す文字列、値は null、string、またはそれらの配列のいずれかです。
@list キーを持つ map で、@index キーを持つ場合もありますが、他のエントリは持ちません。
@context キーワードを使って map として指定される context です。
@value、@list、@set を含まず、またトップレベルの map が
@graph と @context のみで構成されていない場合、それは node object と見なされます。
@id キーのみを持ち、他の場所にある node object を参照するために使われる node object。
@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
を拡張します。
@set エントリを持つ map で、@index を持つことはできますが、他のエントリは持ちません。
@container が @type に設定された term の map 値で、キーは関連する node object の
@type を表す IRI として解釈され、値は node object か node object の配列でなければなりません。
@value エントリを持つ map です。
@vocab キーを使って設定され、その値は IRI、compact IRI、term、または null
です。このセクションは規範的ではありません。
JSON-LD は次の設計目標を満たします:
@context プロパティを含めて無視するだけで JSON-LD の基本機能を利用できます。このセクションは規範的ではありません。
一般に、JSON-LD document によって記述されるデータモデルは、ラベル付きの有向 graph です。グラフは nodes を含み、それらは有向弧で接続されます。ノードはプロパティを持つ resource であるか、またはそれらのプロパティのデータ値(strings、numbers、typed 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 以外であっても、同等のコアデータ構造にマップする場合に同じアルゴリズムで操作できることを可能にします。
本仕様で議論されていませんが、YAML や CBOR のような並行作業やバイナリ表現は内部表現にマップでき、JSON-LD 1.1 API がソースを JSON ドキュメントであるかのように操作できるようにする可能性があります。
このセクションは規範的ではありません。
JSON-LD は言語の中核をなす多数の構文トークンと keywords を定めています。キーワードの規範的な記述は § 9.16 Keywords にあります。
:@base@container@context@direction@graph@id@id のみを含む node object で、文書内の他の場所にある node
object を参照する可能性があります。@import@included@index@json@type 値として使用されます。詳細は § 4.2.2 JSON
Literals を参照してください。@language@list@nest@none@prefixtrue の場合、その term をコンパクト化時に compact IRI
を構築するために使用できます。false の場合は compact IRI の構築に使用されません。compact IRIs を展開する際にその term
を考慮するかどうかも決定します。@propagatetrue
で、context が node objects 間で伝播することを意味します。false に設定すると、新しい node object に入るときにその context
内で作成された term definitions が削除されます。@protected@reverse@set@type@type を node objects と value objects
両方の型を定義するために使用することは、リテラル値や複雑なリソースの両方に型付けする基本的なニーズに対応します。専門家は @type
の多用途性を懸念するかもしれませんが、Web 開発者による長年の利用はそれによる誤用を招いていないことに注意してください。@value@versionjson-ld-1.0 に設定されている場合は利用できません。
@version は特定の値 1.1 を取ります(文字列の
"json-ld-1.1" ではありません)。JSON-LD 1.0 プロセッサは文字列値を受け入れる可能性がありますが、数値値を拒否するためです。
@version の値として 1.1 を使用することは JSON-LD 1.1
に関連していることを意図していますが、Semantic Versioning の要件に従っているわけではありません。@vocab@type 内のプロパティや値を展開するために使用されます。詳細は Default Vocabulary セクションを参照してください。
JSON-LD におけるすべてのキー、keywords、および値は大文字小文字を区別します。
非規範として表示されている節に加えて、本仕様書の著者向けガイドライン、図、例、および注記はすべて情報提供的です。本仕様書のその他すべての部分は規範的です。
本文書におけるキーワード 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:title は http://purl.org/dc/terms/title を表すために使用されます。
この節は情報提供的です。
JSON [RFC8259] は軽量で言語に依存しないデータ交換フォーマットです。解析と生成が容易ですが、異なるソースからの JSON を統合するのは困難なことがあります。なぜならデータに他のソースと衝突するキーが含まれている場合があるためです。さらに、JSON にはウェブの基本要素であるハイパーリンクの組み込みサポートがありません。まず、この節で今後使用する例を見てみましょう:
{
"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 全体では、曖昧さのない識別に IRIs(Internationalized Resource
Identifiers)を使用します(詳細は [RFC3987])。考え方は、開発者間で有用となるデータに曖昧さのない識別子を割り当てるために
IRIs を使うというものです。terms(例えば name や
homepage)が IRIs
に展開されると、開発者は互いの用語を誤って衝突させることを避けられます。さらに、開発者や機械はこの IRI
を(例えばウェブブラウザを使って)参照し、用語の定義を得ることができます。このプロセスは IRI のデリファレンス(dereferencing)として知られています。
広く使われている schema.org ボキャブラリ を利用すると、上の例は次のように曖昧なく表現できます:
上の例では、すべてのプロパティが IRI によって一意に識別され、IRIs を表すすべての値は
@id キーワードによって明示的に示されています。これはデータについて非常に明確な有効な JSON-LD
ドキュメントですが、人間の開発者にとっては冗長で扱いにくい場合があります。この問題に対処するため、JSON-LD は次節で説明する context の概念を導入します。
この節では JSON-LD の最も基本的な機能のみを扱います。より高度な機能(typed values、indexed values、および named graphs など)は、§ 4. Advanced Concepts にあります。
この節は情報提供的です。
人と人がコミュニケーションする際、会話は通常共有された環境(「会話のコンテキスト」)の中で行われます。この共有コンテキストにより、共通の友人のファーストネームのようなショートカット用語を使っても正確さを失わずに素早くやり取りできます。JSON-LD のコンテキストも同様に機能します。コンテキストにより、2 つのアプリケーションがショートカット用語を使って効率的に通信しつつ、正確さを保てるようになります。
簡単に言えば、context は terms を IRIs にマッピングするために使われます。Terms は大文字小文字を区別し、予約された JSON-LD の keywords でない限り、ほとんどの有効な strings を term
として使用できます。例外は空文字列 "" と、キーワードの形式(つまり先頭が "@" で続く 1 つ以上の
ALPHA 文字からなる文字列)を持つ文字列であり、これらは term として使用してはなりません。また ":" を含むなど IRI の形式を持つ文字列も term
として使用すべきではありません。
前節のサンプルドキュメントでは、context は次のようになります:
{
"@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 object や value object の中に現れることがあります。
もし entry が term をキーとして map 値を持つ場合、その map は expanded term
definition と呼ばれます。上の例では、image と homepage の値が文字列であれば 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 にマップされるかを指定するだけでなく、homepage と
image に関連する文字列値が IRI として解釈可能であること("@type": "@id"、詳細は § 3.2 IRIs
を参照)を指定します。これにより、開発者はサイトごとにデータの相互運用性について合意することなく互いのデータを再利用できます。外部の JSON-LD コンテキストドキュメントは
@context キーの外にある用語に関するドキュメントなどの追加情報を含む場合がありますが、外部コンテキストドキュメントとして使用される場合、その
@context の外側にある情報は無視されます。
リモートコンテキストは相対 URL を使って参照することもでき、その解決は参照を含むドキュメントの位置に対して行われます。例えばドキュメントが
http://example.org/document.jsonld にあり、相対参照として context.jsonld
を含む場合、参照されるコンテキストドキュメントは http://example.org/context.jsonld に存在します。
{
"@context": "context.jsonld",
"name": "Manu Sporny",
"homepage": "http://manu.sporny.org/",
"image": "http://manu.sporny.org/images/manu.png"
}
コンテキスト URL の相対参照の解決は、リモートコンテキストドキュメント自体が他のコンテキストへの参照を含む場合にも適用されます。
JSON ドキュメントは、context を HTTP 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 で扱われます。
この節は情報提供的です。
IRIs(Internationalized Resource Identifiers) は Linked Data にとって基本的であり、ほとんどの nodes や properties がこれによって識別されます。JSON-LD では、IRIs は IRI reference として表現されることがあります。IRIs は [RFC3987] において、scheme、path、およびオプションの query と fragment セグメントを含むものとして定義されています。相対 IRI 参照 は別の IRI に対して相対的な IRI 参照です。JSON-LD では以下に述べる例外を除き、すべての相対 IRI 参照は base IRI を基準に解決されます。
「この文書の読み方」節で注意されたように、IRIs はしばしば URL と混同されます。主な相違点は、URL がリソースをウェブ上で 位置付ける(locate)
のに対し、IRI はリソースを 識別する(identify) という点です。識別子がデリファレンス可能であることは良い実践ですが、常に実用的であるとは限りません。特に、UUID
のような URN スキームの例に注意してください。例: urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6。
Properties、@type
の値、および用語定義で語彙マッピング(vocabulary mapping)に対して相対的であると定義されたプロパティの値は、相対 IRI 参照の形式を取ることがありますが、これらは vocabulary mapping
を使って解決され、base
IRI を基準にはしません。
string は、キーが
@id の map entry
の値である場合に IRI として解釈されます:
{
...
"homepage": { "@id": "http://example.com/" }
...
}
IRI として解釈される値は、相対 IRI
参照 としても表現できます。例えば、次のドキュメントが http://example.com/about/ にある場合、相対参照 ../ は
http://example.com/ に展開されます(相対 IRI 参照がどこで使えるかの詳細については § 9. JSON-LD Grammar を参照してください)。
{
...
"homepage": { "@id": "../" }
...
}
IRIs はキーの位置に直接書くこともできます。例えば:
{
...
"http://schema.org/name": "Manu Sporny",
...
}
上の例では、キー http://schema.org/name は IRI として解釈されます。
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 内でさまざまな方法で表現できます:
@id または @type を使って指定された文字列値については IRI が生成されます。@type キーが @id または @vocab を値に持つような型の強制ルール(coercion)があるキーの文字列値についても IRI
が生成されます。この節では JSON-LD における IRI に関する最も基本的な機能のみを扱いました。IRI に関連する高度な機能は § 4. Advanced Concepts で扱われます。
この節は情報提供的です。
RDF グラフ内のノードを外部から参照できるようにするためには、ノードに識別子があることが重要です。IRIs は Linked Data の基本概念であり、ノードが真にリンクされるためには識別子をデリファレンスするとそのノードの表現が得られるべきです。これによりアプリケーションはそのノードに関する追加情報を取得できます。
JSON-LD では、ノードは @id キーワードを使って識別されます:
上の例には、node object が
http://me.markus-lanthaler.com/ という IRI によって識別されています。
この節では JSON-LD におけるノード識別子に関する最も基本的な機能のみを扱います。ノード識別子に関連する高度な機能は § 4. Advanced Concepts で扱われます。
この節は情報提供的です。
構文としての JSON は限られた構文要素のみを持っています:
true と false(論理値)
null(値の欠如を表す)JSON-LD のデータモデルは RDF データモデルに基づいてより豊かな資源の集合を許容します。データモデルの詳細は § 8. Data Model に記述されています。JSON-LD は JSON オブジェクトを使ってさまざまな資源とそれらの間の関係を記述します:
@list
キーの下にラップすることで順序付き値を表現します。Set
Objects は一貫性のために存在し、@set キーの配列値と同等です。詳細は § 4.3.1 Lists および § 4.3.2 Sets を参照してください。
@index によってインデックス化することを可能にします。詳細は § 4.6.1
Data Indexing および § 9.9 Index Maps を参照してください。
@id によってインデックス化することを可能にします。詳細は § 4.6.3 Node Identifier Indexing および § 9.11 Id
Maps を参照してください。
@type によってインデックス化することを可能にします。詳細は § 4.6.4 Node Type Indexing および § 9.12 Type Maps を参照してください。
この節は情報提供的です。
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 で詳述されています。
この節は規範的ではありません。
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 を参照してください。
JSON の別の一般的な慣用は、中間オブジェクトを使用してプロパティ値を索引化することです。JSON-LD は、§ 4.6 Indexed Values に詳細があるように、いくつかの異なる方法でデータを索引化できます。
JSON-LD は有向な グラフ をシリアライズします。つまり、すべての プロパティ は ノード から別の ノード または 値 を指します。しかし、場合によっては逆方向でシリアライズすることが望ましい場合があり、その詳細は § 4.8 Reverse Properties に記載されています。
以下の節では、このような高度な機能についてさらに詳しく説明します。
この節は規範的ではありません。
セクション § 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 構造内で name の term が上書きされており、その構造は自身の embedded context を使用しています。これは通常は良い作成手法ではなく、既存の(レガシーな)アプリケーションが特定の map
構造に依存している場合に典型的に使用されます。もしコンテキスト内で term
が再定義されると、その以前の定義に関連するすべてのルールは削除されます。もし term が null に再定義された場合、その用語は有効な active context に定義された terms のリストから実質的に除外されます。
複数のコンテキストは array
を使って結合でき、配列は順番に処理されます。特定の map 内で定義されたコンテキストの集合は local contexts と呼ばれます。active context
はドキュメント内部の特定の位置で有効な local
contexts の蓄積を指します。local
context を null に設定すると、active context を以前のコンテキストで定義されていた term definitions、default 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 キーを扱えるわけではないため許されていません。
この節は規範的ではありません。
JSON-LD 1.1 で定義された新機能は、processing mode が json-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 ドキュメントを誤って処理することを防止します。
{
"@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
ドキュメントを誤って処理して異なる結果を生じさせるのを防ぐために 推奨されます。
この節は規範的ではありません。
すべてのプロパティや型が同じ語彙から来る場合があります。JSON-LD の @vocab キーワードは、著者が共通のプレフィックスを設定することを可能にし、これは vocabulary mapping
として使用され、term に一致せず、かつ IRI や compact
IRI(つまりコロンを含まない)でもないすべてのプロパティと型に対して使用されます。
@vocab が使用されているが、ある map 内の特定のキーを語彙に基づいて展開したくない場合、コンテキスト内でその term を明示的に null に設定できます。例えば下の例では、databaseId
エントリは IRI に展開されず、展開時にそのプロパティは破棄されます。
JSON-LD 1.1 以降では、local context の vocabulary mapping を 相対 IRI 参照 に設定でき、これは有効な場合にアクティブなコンテキスト内の既存の語彙マッピングに連結されます(アクティブコンテキストに語彙マッピングがない場合の適用方法については § 4.1.4 Using the Document Base for the Default Vocabulary を参照してください)。
次の例は、前の語彙に対して相対的なデフォルト語彙を使ってプロパティを展開した影響を示しており、展開結果は下の Expanded タブに表示されます。
@vocab の文法は § 9.15 Context Definitions
で定義されており、値として term や compact IRI
を許可します。@vocab の値に使われる用語は、コンテキストが導入される時点でスコープ内にある必要があり、さもなければ @vocab
と同じコンテキストで定義された他の用語との間で循環依存が発生します。
この節は規範的ではありません。
JSON-LD では IRI
を相対形式で指定でき、これはドキュメント基準(document base)に対して RFC3986 §5.1 に従って解決されます。context の @base
キーワードを使って、base
IRI を明示的に設定できます。
例えば、JSON-LD ドキュメントが http://example.com/document.jsonld から取得された場合、相対 IRI 参照 はその IRI を基準に解決されます。
{
"@context": {
"label": "http://www.w3.org/2000/01/rdf-schema#label"
},
"@id": "",
"label": "Just a simple document"
}
このドキュメントは空の @id を使用しており、これはドキュメント基準に解決されます。ただし、ドキュメントが別の場所に移動すると IRI
が変わる可能性があります。これを防ぐために、context 内で
@base マッピングを定義して、ドキュメントの base IRI を上書きできます。
@base を null
に設定すると、相対 IRI 参照
が IRI に展開されるのを防げます。
外部コンテキスト内で使用された場合、@base は無視される点に注意してください。
この節は規範的ではありません。
場合によっては、語彙の用語が外部の語彙ではなくドキュメント内に直接定義されることがあります。JSON-LD 1.1 以降では、local context 内の vocabulary mapping を 相対 IRI 参照 に設定でき、これはスコープ内に語彙マッピングがない場合に base IRI に対して解決されます。これにより、語彙に対して相対的に展開される用語(node objects のキーなど)が、base IRI を基準にして IRI を作成するようになります。
{
"@context": {
"@version": 1.1,
"@base": "http://example/document",
"@vocab": "#"
},
"@id": "http://example.org/places#BrewEats",
"@type": "Restaurant",
"name": "Brew Eats"
...
}
このドキュメントが http://example/document にある場合、次のように展開されます:
この節は情報提供的です。
コンパクト IRI は、IRI
を接頭辞(prefix)と接尾辞(suffix)をコロン(:)で区切って表現する方法です。prefix は term で、active context から取られ、JSON-LD ドキュメント内の特定の IRI を識別する短い文字列です。例えば、接頭辞
foaf は Friend-of-a-Friend ボキャブラリ(IRI
http://xmlns.com/foaf/0.1/)の短縮表記として使われます。開発者は FOAF ボキャブラリの用語を接頭辞の末尾に付け加えて、その語彙用語の IRI の短縮形を指定できます。例えば
foaf:name は IRI
http://xmlns.com/foaf/0.1/name に展開されます。
上の例では、foaf:name が IRI
http://xmlns.com/foaf/0.1/name に展開され、foaf:Person は
http://xmlns.com/foaf/0.1/Person に展開されます。
Prefixes は、値の形式が
compact IRI の prefix:suffix
組み合わせであり、かつ prefix が active context 内で定義された term と一致し、suffix が二つのスラッシュ(//)で始まらない場合に展開されます。compact IRI
は、prefix にマップされた IRI に(可能性として空の)suffix
を連結することで展開されます。もし prefix が active 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 を用いてドキュメントを縮約する際にわずかな違いを生じさせる場合があります。
縮約時の振る舞いは、次のような展開済みの入力ドキュメントを考えることで説明できます:
[{
"http://example.com/vocab/property": [{"@value": "property"}],
"http://example.com/vocab/propertyOne": [{"@value": "propertyOne"}]
}]
以下のコンテキストを 1.0 の processing mode で使うと、関連する用語選択アルゴリズムは property よりも vocab を選びます。これは property に関連付けられた IRI の方が元の IRI をより多く含んでいるにもかかわらずです。
{
"@context": {
"vocab": "http://example.com/vocab/",
"property": "http://example.com/vocab/property"
}
}
上の展開済みの入力ドキュメントを前述のコンテキストで縮約すると、次のような縮約結果になります:
元の [JSON-LD10] では、用語選択アルゴリズムは property を選択して Compact IRI
として property:One を生成していました。この元の振る舞いは @prefix を用いることで明示できます:
{
"@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
のプレフィックス部分として使えるようになります。
この節は情報提供的です。
JSON-LD の各 キーワード(@context を除く)は、
アプリケーション固有のキーワードへエイリアス化できます。この機能により、既存のレガシー JSON コンテンツに含まれるキーを再利用して JSON-LD として扱うことが可能になります。
また、開発者が JSON-LD の context
のみを使ってドメイン固有の実装を設計することも可能になります。
上の例では、 @id と @type の キーワード に対して、
それぞれ url と a というエイリアスが与えられています。
@type を除き、エラーになるのは、用語が キーワード であるような 展開された用語定義
のプロパティです。
ただし processing mode が json-ld-1.0
に設定されていない場合、@type に対する例外もあります。詳細や使用例は § 4.3.3 @set と
@type の併用 を参照してください。
processing
mode が json-ld-1.0 に設定されていない限り、キーワードのエイリアスは
単純な用語定義(値がキーワードであるもの)か、
@id エントリを持ち任意で @protected エントリを持つような
展開された用語定義
のいずれかでなければなりません;その他のエントリは許可されません。
上記のとおり @type に対するエイリアスには例外があります。
@protected の使用に関する詳細は § 4.1.11 保護された用語定義 を参照してください。
キーワードは再定義できないため、他のキーワードへのエイリアスも不可能です。
エイリアス化されたキーワードは、その context 自身の内部で使用することはできません。
すべてのキーワードの規範的定義については § 9.16 Keywords を参照してください。
この節は情報提供的です。
一般に、IRI が期待される場所では通常の IRI
展開ルールが適用されます(参照:§ 3.2
IRIs)。context
定義内では、用語が相互に循環依存しない限り、そのコンテキスト内で定義された用語をコンテキスト内で使用することもできます。例えば、型付き値を定義する際に xsd
名前空間を使うことは一般的です:
{
"@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 を定義する際にも使用できます:
{
"@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 は、用語定義の左辺でも使用できます。
{
"@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 アルゴリズムから変更されたものです。
{
"@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"
}
},
...
}
{
"@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:homepage は
http://xmlns.com/foaf/0.1/homepage
と同一ではないからです。つまり、用語は接頭辞検索の前にまず文字列の直接比較によってコンテキスト内で検索されます。
IRI 参照やコンパクト IRI が、他の無関係な IRI に展開されることは許されません。これは以前の 1.0 アルゴリズムで許容されていたが推奨されていなかった振る舞いからの変更です。
コンテキスト内で用語を使う際の唯一の他の例外は、循環定義が許されないことです。つまり、term1 の定義が term2 に依存し、かつ term2 も term1 に依存するような定義は不正です。例えば次のような context 定義は違法です:
{
"@context": {
"term1": "term2:foo",
"term2": "term1:bar"
},
...
}
この節は情報提供的です。
展開された用語定義 (expanded
term definition) は @context プロパティを含めることができ、これによりその用語で定義されたプロパティ値のための コンテキスト(スコープ付きコンテキスト)を定義できます。プロパティに対して使われる場合、これを プロパティスコープ付きコンテキスト と呼びます。
これにより、値側でその値自身に指定されているかのように、別のノードオブジェクトとは異なる用語定義、ベース IRI、語彙マッピング、デフォルト言語などを値が使えるようになります。
この場合、ソーシャルプロファイルは schema.org 語彙を使って定義されていますが、interest は FOAF からインポートされ、そのプロパティは FOAF 語彙に由来するノードを定義するために使われています。
このドキュメントを展開すると、外側のコンテキストで定義された用語と、その用語専用に定義された プロパティスコープ付きコンテキスト の用語を組み合わせて使用します。
スコーピングは @type の値として使われる用語を使っても行えます:
@type
に対するスコーピングは、共通のプロパティが異なる型のものを関連付ける場合に有用です。エンティティによって用いられる語彙が異なるため、コンテキストのスコーピングが異なることがあります。たとえば
hasPart/partOf は共通して使われる用語ですが、文脈によって意味が異なる場合があります。
型スコープ付きコンテキスト
は、その型が使用されているノードオブジェクトに対してのみ有効です;別のノードオブジェクトに移る際には以前に有効だったコンテキストが再び有効になります。
§ 4.1.9
Context Propagation で詳述するように、これは @propagate キーワードで制御できます。
ノードオブジェクト内で導入された プロパティスコープ付き またはローカルな コンテキスト は、別のノードオブジェクトへ移動しても引き続き有効であることに注意してください。
展開時、@type の各値は(辞書順に並べられて)検討され、その値がアクティブコンテキスト内の用語でかつ独自の 型スコープ付きコンテキスト
を持つ場合、そのスコープ付きコンテキストがアクティブコンテキストに適用されます。
@type の値は順序付けられていないため、複数の型が列挙されている場合、適用される 型スコープ付きコンテキスト
の順序は辞書順に基づきます。
例えば、次の意味論的に同等な例を考えてみてください。最初の例は、プロパティと型がそれぞれ自身のスコープ付きコンテキストを定義し、それが展開時に取り込まれる方法を示しています。
{
"@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"
}
}
コンテキストは定義方法に応じて処理されます。プロパティスコープ付きコンテキスト が最初に処理され、その後に埋め込みコンテキスト、最後に適切な順序で 型スコープ付きコンテキスト が処理されます。前の例は次のように論理的に同等です:
{
"@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 の新機能です。
この節は規範的ではありません。
一度導入された context は、その後に別の
context が @context
を null に設定して除去するか、用語を再定義するまで有効なままです。ただし、効果を次の node object に入るまでに限定する type-scoped
contexts の例外があります。
この挙動は @propagate キーワードによって変更できます。
次の例は、@propagate が false に設定されたコンテキスト内で定義された用語が、
新しい node object
に降りるときに実質的に除去されることを示しています。
配列内に含まれるコンテキストは、JSON-LD 1.1
Processing Algorithms and
API におけるロールバックの定義方法のため、すべて同じ @propagate の値である必要があります。
この節は規範的ではありません。
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 をロードし、@propagate を true
に設定することで、type-scoped context を表現する方法を示しています。
仮に URL https://json-ld.org/contexts/remote-context.jsonld で参照可能な
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 を使ってそれをソースし、修正できます:
{
"@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 にコピーされたかのようになります:
{
"@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 の用語定義の処理方法に影響する他のコンテキスト全体のキーワードを設定したりできます:
{
"@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 にコピーされたかのようになります:
{
"@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 や 配列 ではあってはなりません。
さらに、インポートされたコンテキストは @import の entry を含むことはできません。
この節は規範的ではありません。
JSON-LD は多くの仕様で指定されたデータ形式として使われていますが、 一方で一部の JSON-LD コンテンツを JSON-LD のアルゴリズムを使わずにプレーンな JSON として処理したいという要望もあります。 JSON-LD は非常に柔軟なため、元の形式のいくつかの用語は 埋め込みコンテキスト を使ってローカルに上書きされ、JSON-LD ベースの実装では異なる意味を持つことがあります。 一方で「プレーンな JSON」実装はこれらの 埋め込みコンテキスト を解釈できない可能性があり、その結果これらの用語は元の意味で解釈され続けます。 解釈の分岐を防ぐために、JSON-LD 1.1 では用語定義を 保護(protected) できるようにしています。
保護された用語定義 とは、entry
@protected が true に設定された用語定義のことです。
これにより、通常は同名の新しい定義や "@context": null によるコンテキストのクリアによってこの用語定義を上書きすることができなくなります。
そのような試みはエラーを発生させ、処理を中止します(ただし下記 例外 に示す特定の状況を除きます)。
{
"@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
@protected を true に設定できます。
これは各用語定義を個別に保護するのと同じ効果を持ちます。
いくつかの用語定義で @protected を false に設定することで例外を設けることもできます。
保護された用語は一般に上書きできませんが、これには 2 つの例外があります。
第一の例外は、新しい定義が保護された用語定義と同一である場合、そのコンテキストは保護された用語定義を再定義できます(@protected フラグの差を除く)。
理由は、新しい定義が保護を侵害せず、保護された用語の意味を変更しないからです。
これは、@type を type にエイリアスするような広く使われる用語定義に便利で、複数のコンテキストで(保護された形であれ)発生し得ます。
第二の例外は、property-scoped context
は保護の影響を受けず、したがって保護された用語を新しい用語定義で上書きしたり、"@context": null でコンテキストをクリアしたりできることです。
その理由は、「プレーンな JSON」実装は特定の仕様に従ったプロパティのみをたどるためです。仕様に属するプロパティに関連する スコープ付きコンテキスト は仕様の一部であり、「プレーンな JSON」実装はこれらが意味に与える変更を認識していると期待されます。他のプロパティに属する スコープ付きコンテキスト は、「プレーンな JSON」実装が無視するドキュメントの部分に適用されます。いずれの場合も、JSON-LD 対応実装と「プレーンな JSON」実装の間で解釈の分岐が生じるリスクはないため、上書きが許可されます。
用語の上書きを防ぐことで、用語の適応(例えば、より正確なデータ型の定義、用語のリスト使用への制限など)も防がれます。この種の適応は汎用のコンテキストで頻繁に行われるため、保護は可用性を損なうことがあります。その結果、コンテキスト発行者はこの機能を慎重に使うべきです。
保護された用語定義は JSON-LD 1.1 の新機能です。
この節は情報提供的です。
値とは文字列、日付、時刻などのスカラー値に対応するグラフの葉ノードです(strings やその他の原子的な値を含みます)。
この節は情報提供的です。
付随する型を持つ値(typed value とも呼ばれる)は、その値の型を示す IRI と値を関連付けることで示されます。JSON-LD では型付き値を次の3通りの方法で表現できます:
@context セクション内で @type keyword を用いて term を定義する方法。
true、false
のようなネイティブ 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 を生成します。型の値を表現するために term や compact 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) は整数、浮動小数点数、日付のような特定の値のデータ型を指定します。
{
...
"@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 は ノード型 を示します。上の例は次のデータを表現します:
この節は情報提供的です。
時として、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
リテラル の値として使われる場合は保存されます。
この節は情報提供的です。
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/barney と
http://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 に対して複数の表現が生じることがあります。例えば
dog と cat が共に http://example.com/vocab#animal
に展開されるよう指定できます。これにより異なる型強制や言語指定ルールを確立するのに役立ちます。
この節は情報提供的です。
文字列に言語を付与する必要がある場合があります。JSON-LD ではいくつかの方法でこれが可能です。まず、コンテキストの @language キーを設定して JSON-LD
ドキュメントの デフォルト言語
を定義できます:
上の例は2つの文字列 花澄 と 科学者 に ja の言語タグを関連付けます。言語タグは BCP47
に準拠します。デフォルト言語は型強制された値には適用されません。
サブツリーのデフォルト言語をクリアするには、介在するコンテキスト(例えばスコープ付きコンテキスト)で @language を null に設定します:
{
"@context": {
...
"@version": 1.1,
"@vocab": "http://example.com/",
"@language": "ja",
"details": {
"@context": {
"@language": null
}
}
},
"name": "花澄",
"details": {"occupation": "Ninja"}
}
次に、特定の用語に言語を関連付けることも可能です(展開済み用語定義を使用):
{
"@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 が、Ninja に
en、Nindža に cs がそれぞれ関連付けられます。name の値は
@language が用語定義内で null にリセットされているため言語タグが付きません。
言語の関連付けは平文の 文字列 にのみ適用されます。型付き値や型強制の対象となる値には言語タグは付与されません。
また、複数言語でプロパティの値を表現する必要がある場合、プログラムから言語別のデータにアクセスしやすくするために 言語マップ を使用することがあります。
{
"@context": {
...
"occupation": { "@id": "ex:occupation", "@container": "@language" }
},
"name": "Yagyū Muneyoshi",
"occupation": {
"ja": "忍者",
"en": "Ninja",
"cs": "Nindža"
}
...
}
上の例は前の例と同じ情報を表現しますが、すべての値を単一のプロパティに集約しています。言語別にアクセスする際は obj.occupation.en
のようにドット表記で簡単に取得できます(言語が一次サブタグに限定される場合など)。
第三に、value object を使ってデフォルト言語をオーバーライドすることもできます:
{
"@context": {
...
"@language": "ja"
},
"name": "花澄",
"occupation": {
"@value": "Scientist",
"@language": "en"
}
}
これは value object を使って @language を省略するか null に設定することで平文の文字列を指定することも可能にします:
{
"@context": {
...
"@language": "ja"
},
"name": {
"@value": "Frank"
},
"occupation": {
"@value": "Ninja",
"@language": "en"
},
"speciality": "手裏剣"
}
言語マップの使用法については § 9.8 Language Maps を参照してください。
この節は情報提供的です。
文字列や言語タグ付き文字列に基底方向(base
direction)を注記することも可能です。言語と同様にコンテキストの @direction キーでドキュメントのデフォルト基底方向を定義できます:
上の例は2つの文字列に対して ar-EG の言語タグと rtl
の基底方向を関連付けます。デフォルト基底方向は型強制されていないすべての文字列値に適用されます。
サブツリーのデフォルト基底方向をクリアするには、介在するコンテキストで @direction を null に設定します:
{
"@context": {
...
"@version": 1.1,
"@vocab": "http://example.com/",
"@language": "ar-EG",
"@direction": "rtl",
"details": {
"@context": {
"@direction": null
}
}
},
"title": "HTML و CSS: تصميم و إنشاء مواقع الويب",
"details": {"genre": "Technical Publication"}
}
次に、特定の用語に基底方向を関連付けることも可能です(展開済み用語定義を使用):
{
"@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 を使ってデフォルト言語とデフォルト基底方向の両方をオーバーライドすることも可能です:
{
"@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 を参照してください。
この節は情報提供的です。
JSON-LD の作成者は、配列を使って複数の値を簡潔に表現できます。グラフはノード間のリンクの順序を記述しないため、JSON-LD の配列はデフォルトで含まれる要素の順序を意味しません。これは、通常の JSON 配列(デフォルトで順序がある)の振る舞いとは正反対です。例えば次の簡単なドキュメントを考えてみてください:
複数の値は展開形式を使って表現することもできます:
上の例はステートメントを生成しますが、再び固有の順序はありません。
プロパティの複数値は通常同じ型ですが、JSON-LD はこれを制限しないため、異なる型の値を持つこともできます:
ステートメントとして見た場合、これらの値には固有の順序はありません。
この節は情報提供的です。
順序付きコレクションの概念はデータモデリングで重要であるため、特定の言語サポートが有用です。JSON-LD では、@list キーワードを使ってリストを次のように表現できます:
これは配列を順序付きとして扱うことを表し、ドキュメント処理時に順序が維持されます。あるマルチバリュープロパティのすべての使用がリストである場合、コンテキストで
@container を @list に設定することで省略できます:
RDF におけるリストの実装は、匿名ノードを
rdf:first と rdf:rest で連結し、リストの終端を rdf:nil
として定義します(「ステートメント」タブに示されているように)。これにより、順序をステートメントの集合の中に表現できます。
JSON-LD と Turtle の両方は、順序付きリストを表現するショートカットを提供します。
JSON-LD 1.1 では、リストの値が別の リストオブジェクト であるような入れ子のリスト(リストのリスト)も完全にサポートされています。
"@container": "@list" の定義は再帰的に配列値をリストとして扱うことを記述します。例えば GeoJSON
のように、coordinates が複数の数値を要する順序付きの positions のリストである場合などに使えます:
{
"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]
]
]
}
//...
}
これらの例では bbox や coordinates 内の値が順序を保持することが重要であり、埋め込みリスト構造の使用が必要です。JSON-LD 1.1 では、適切なコンテキスト定義を追加することで再帰的なリストを使ってこれを表現できます:
coordinates が3階層のリストを含んでいることに注意してください。
@list コンテナに関連付けられた用語の値は、たとえ単一値または値が存在しない場合でも常に配列の形式で表現されます。
この節は情報提供的です。
@list が順序付きリストを記述するために使われる一方で、@set キーワードは順序なしの集合を記述するために使われます。JSON-LD
ドキュメント本文での @set
の使用は処理時に最適化されて除去されます(単なる構文糖です)。しかし、ドキュメントのコンテキスト内で使うと有用です。@set
コンテナに関連付けられた用語の値は、たとえ単一値であって縮約形式で非配列に最適化される場合でも、常に配列として表現されます(これにより後処理が容易になります)。
これは配列を順序なしとして扱うことを表し、ドキュメント処理時に順序が変わる可能性があることを示します。デフォルトでは配列値は順序なしですが、コンテキストで @container
を @set に設定して明示できます:
JSON-LD 1.1 以降、@set
キーワードは展開済み用語定義内の他のコンテナ仕様と組み合わせて使用でき、縮約時にインデックスの値が一貫して配列で表現されるようにすることができます。詳細は § 4.6
インデックス化された値 を参照してください。
@set と
@type の併用
この節は情報提供的です。
processing
mode が json-ld-1.0 に設定されていない限り、@type は @container が
@set に設定された 展開済み用語定義 と共に使うことができます;そのような展開済み用語定義内では他の エントリは設定できません。これは Compaction algorithm が
@type(またはそのエイリアス)の値を常に配列として表現することを保証するために使用します。
{
"@context": {
"@version": 1.1,
"@type": {"@container": "@set"}
},
"@type": ["http:/example.org/type"]
}
この節は情報提供的です。
多くの JSON API はプロパティをエンティティから中間オブジェクトで分離します。JSON-LD ではこれらを 入れ子のプロパティ と呼びます。 例えば、一連のラベルを共通のプロパティの下にまとめることができます:
labels を キーワード
@nest を使って定義すると、
JSON-LD
プロセッサ は labels プロパティで作られた入れ子を無視し、その中身を親オブジェクト内に直接宣言されたかのように処理します。この場合、labels
プロパティ自体は意味的に無意味になります。これを @nest と等価に定義すると、展開時に無視され、以下の例と同等になります:
同様に、用語定義 に @nest
にエイリアスされた用語を参照するプロパティを含めることができ、縮約時にそのエイリアスされた用語の下へプロパティが入れ子になるようにすることができます。以下の例では、main_label
と other_label の両方に "@nest": "labels" が定義されており、縮約するとそれらは labels
の下にシリアライズされます。
[{
"@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"}
]
}]
{
"@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 の新機能です。
この節は情報提供的です。
埋め込み は、作者が ノードオブジェクト を プロパティ値として使用できる JSON-LD の機能です。これは2つのノード間に親子関係を作るために一般的に用いられます。
埋め込みを使用しない場合、ノードオブジェクト は別のノードオブジェクトの識別子を参照することでリンクされます。例えば次のようになります:
前の例は Manu と Gregg の2つの ノードオブジェクト
を記述しており、knows プロパティは文字列値を識別子として扱うよう定義されています。埋め込み を使うと、Gregg のノードオブジェクトを knows プロパティの値として 埋め込む
ことができます:
上記のようなノードオブジェクトは、JSON-LD ドキュメント本文内の任意の値位置で使用できます。
グラフ内のノードに識別子を付与することは推奨されますが、実用上それが難しい場合もあります。データモデルでは明示的な識別子を持たないノードを ブランクノード と呼び、JSON-LD のようなシリアライゼーションでは
ブランクノード識別子
を使って表現できます。前の例では、Manu のトップレベルノードは識別子を持たず、データモデル内で記述するために識別子を持つ必要はありません。しかし Gregg から Manu への
knows 関係を記述したい場合は、ブランクノード識別子(ここでは _:b0)を導入する必要があります。
ブランクノード識別子 は flattening のようなアルゴリズムによって自動導入されることがありますが、作者がそのような関係を直接記述するためにも有用です。
この節は情報提供的です。
時として、ノードを一意に識別することなしに情報を表現する必要が生じます。この種のノードは ブランクノード と呼ばれます。JSON-LD はすべてのノードに
@id を要求しません。ただし、ループを含むグラフのトポロジーは埋め込みのみではシリアライズできず、ノードを接続するために @id
が必要です。このような場合に、スキームとしてアンダースコア(_)を使うことで IRI のように見える ブランクノード識別子
を使用できます。これによりドキュメント内でローカルにノードを参照できますが、外部ドキュメントから参照することはできません。ブランクノード識別子はそれが使用されるドキュメントにスコープされます。
上の例は IRI で識別できない2人の秘密エージェントに関する情報を含みます。agent 1 が agent 2 を知っていることはブランクノード識別子なしでも表現可能ですが、agent 2 から agent 1 を参照するためには agent 1 に識別子を割り当てる必要があります。
ブランクノード識別子は処理中にラベルが置き換えられることがある点に注意してください。開発者が同じブランクノードを複数回参照する場合、そのノードにデリファレンス可能な IRI を割り当てて他のドキュメントからも参照できるようにすることを検討すべきです。
この節は情報提供的です。
複数のプロパティ値に対して、配列を走査するよりも直接的にアクセスする必要がある場合があります。JSON-LD は、中間の マップ を用いて特定のインデックスと関連する値を関連付けるインデックス機構を提供します。
JSON-LD におけるその他のインデクシングの使用法については § 4.9 Named Graphs を参照してください。
この節は情報提供的です。
データベースは通常、データへのアクセス効率を向上させるために使われます。開発者はこのような機能をアプリケーションデータに拡張して同様の性能向上を実現することがよくあります。この種のデータは Linked Data 的な観点から意味を持たないことがありますが、アプリケーションにとっては有用です。
JSON-LD はデータをより効率的にアクセスできる形に構築するために使用できる インデックスマップ の概念を導入します。データインデクシング機能により、キーが IRI
にマップされない単純なキー・値マップを使ってデータを構造化できます。これにより特定の項目を探すために配列を走査する代わりに直接データへアクセスできます。JSON-LD
では、このようなデータをコンテキスト内で @index の keyword を @container 宣言と関連付けることで指定できます:
上の例では、athletes の term が インデックスマップ としてマークされています。catcher と
pitcher のキーは意味論的には無視されますが、構文上は 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
mode が json-ld-1.0 に設定されていない限り、関連するインデックスを持たないデータをインデックス化するために特殊なインデックス
@none が使用され、正規化された表現を維持するのに役立ちます。
この節は情報提供的です。
最も単純な形(上の例のように)では、データインデクシングはインデックスマップのキーに意味論を割り当てません。しかし、場合によっては、オブジェクトをインデックスするために使われるキーがそれらのオブジェクトと意味論的にリンクしており、構文的にだけでなく意味論的にも保持されるべきです。
processing mode が
json-ld-1.0 に設定されていない限り、用語記述内の "@container": "@index" は
"@index" キーを伴うことができます。そのキーの値は IRI
に展開される必要があり、各オブジェクトをキーに結びつける意味的なプロパティを識別します。
この節は情報提供的です。
複数言語の文字列値を含む JSON は、言語マップ
を使って表現でき、プロパティ値を言語タグで簡単にインデックス化できます。これにより特定の項目を探すために配列を走査する代わりに言語値へ直接アクセスできます。JSON-LD
では、このようなデータをコンテキスト内で @language の keyword を @container 宣言と関連付けることで指定できます:
上の例では、label の term
が 言語マップ
としてマークされています。en と de のキーは JSON-LD Processor
によってそれぞれの値に暗黙的に関連付けられます。これにより開発者は obj.label.de のようにドイツ語版の label
にアクセスできますが、これは言語が一次サブタグに限定され、例えば "de-at" のような追加サブタグに依存しない場合にのみ適切です。
@container の値は @language と @set
の両方を含む配列にすることもできます。縮約時にこれを使うと、JSON-LD Processor が言語タグのすべての値に対して配列形式を使用することを保証します。
processing
mode が json-ld-1.0 に設定されていない限り、言語を持たない文字列をインデックス化する場合に特殊インデックス
@none が使用され、データ型を持たない文字列値に対して正規化された表現を維持するのに役立ちます。
この節は情報提供的です。
インデックスマップに加えて、JSON-LD はデータを構造化するための id
マップ の概念を導入します。id インデクシング機能により、キーが IRI
にマップされる単純なキー・値マップを使用してデータを構造化できます。これにより、特定の項目を探すために配列を走査する代わりに関連する ノードオブジェクト へ直接アクセスできます。JSON-LD では、このようなデータをコンテキスト内で
@id の keyword を
@container 宣言と関連付けることで指定できます:
上の例では、post の term が id マップ
としてマークされています。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 の新機能です。
この節は情報提供的です。
id マップやインデックスマップに加えて、JSON-LD はデータを構造化するための タイプマップ の概念を導入します。タイプインデクシング機能により、キーが IRI
にマップされる単純なキー・値マップを使用して、特定のノードオブジェクトの @type に基づいてデータを構造化できます。JSON-LD
では、このようなデータをコンテキスト内で @type の keyword を @container 宣言と関連付けることで指定できます:
上の例では、affiliation の term が タイプマップ としてマークされています。schema:Corporation と
schema:ProfessionalService のキーは、ノードオブジェクト値の @type プロパティとして解釈されます。
@container の値は @type と @set
の両方を含む配列にすることもできます。縮約時にこれを使うと、JSON-LD プロセッサが型のすべての値に対して配列形式を使用することを保証します。
特殊インデックス @none は @type を持たない ノードオブジェクト をインデックス化するために使用され、正規化された表現を維持するのに役立ちます。@none
インデックスは、例にあるように none のような @none に展開される用語でもあり得ます。
id マップ と同様に、@type
と共に使用する場合、コンテナは @set を含めてキー値が常に配列に格納されるようにすることができます。
Type マップ は JSON-LD 1.1 の新機能です。
この節は情報提供的です。
時には、あるノードオブジェクトの一部として別のノードオブジェクトを列挙することが有用です。例えば、あるリソースが他のリソースで使用する一連のリソースを表現する場合などです。含められたブロックは、プライマリなノードオブジェクトから参照されうる二次的なノードオブジェクトを収集するためにも使用できます。例として、いくつかの共通要素を共有する複数のアイテムを含むノードオブジェクトを考えてみます:
{
"@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)すると、
これは含められたブロック中の
employee と contractor の要素を外側の配列へ移動します。
含められたリソースは、あるプライマリリソースに関連するリソースを含める手段として、JSON API
の Inclusion of Related Resources
に記述されています([JSON.API])。JSON-LD の @included は同様の可能性を提供します。
@included を ノードオブジェクト 内で使用する副産物として、あるマップが @included
のみを含むことができ、これは切断されたノードを記述するために @graph が使われるのと類似した機能を提供します(§ 4.1 高度なコンテキストの使用参照)。
ただし、@graph と対照的に、@included は同じマップ内に含まれる他のプロパティと相互作用しません。この点は後述の § 4.9 Named Graphs
でさらに論じられます。
この節は情報提供的です。
JSON-LD は有向のグラフをシリアライズします。つまり、すべてのプロパティはあるノードから別のノードや値へ向かって指されます。しかし場合によっては、逆方向にシリアライズすることが望ましいことがあります。例えば、人とその子供を文書内で記述したいが、使用している語彙にchildren プロパティがなく、代わりに parent プロパティしかないとします。その場合、子を表す各ノードが親へ向かうプロパティを持つように表現する必要があります。次の例を参照してください。
このようなデータは、JSON-LD の @reverse キーワード を使うとずっと簡潔に表現できます:
このセクションは非規範的です。
時には、単一のグラフ自体について、
あるいは単に個々のノードだけでなく記述する必要がある場合があります。これは、@graph
キーワードを用いて一連のノードをグループ化することで行えます。開発者はまた、@graph
キーワードに対して@id
キーワードを組み合わせることにより、@graphで表現されたデータに名前を付けることもできます。以下の例を参照してください:
上の例は、名前付きグラフを
IRI
http://example.org/foaf-graphで識別していることを示します。そのグラフは Manu と Gregg
に関する記述から構成されます。グラフ自体のメタデータはgeneratedAtプロパティによって表現され、グラフが生成された時刻を指定します。
JSON-LD 文書の最上位構造が、マップであり、
@graph と(省略可能な)@context以外のキーを含まない場合(IRI や キーワード にマッピングされないプロパティは無視されます)、
@graph は暗黙の デフォルトグラフを表していると見なされます。この仕組みは、文書のトップレベルに複数のノードが存在し、同じコンテキストを共有する場合(例えば文書がフラット化されている場合)に便利です。@graph
キーワードはそのようなノードを配列に集め、共有コンテキストの使用を可能にします。
この場合、グラフには無関係なノードが含まれるため、埋め込みは使用できません。
これは、複数のノードオブジェクトを配列で用意し、各ノードオブジェクト内で@contextを定義するのと同等です:
このセクションは規範的ではありません。
場合によっては、JSON 表現の中で明示せずにデータを論理的に別々のグラフに分割することが有用です。たとえば、JSON
ドキュメントが他のメタデータが主張される対象となるデータを含み、そのデータをデータモデル内で名前付きグラフの概念を用いて分離することが、@graph
キーワードに伴う構文的なオーバーヘッドなしに有用な場合があります。
展開済みの用語定義は、@container の値として @graph
を使用できます。これは、この用語の値が 名前付きグラフ
と見なされるべきことを示します。ここでのグラフ名は、自動的に割り当てられるブランクノード識別子であり、それにより
暗黙に名前付けされたグラフ
が作成されます。展開されると、これらは 単純なグラフオブジェクト になります。
別の例では、匿名の名前付きグラフを次のように使用します:
上の例は、匿名の名前付きグラフを用いて記述を行っていることを表します。デフォルトグラフには、その主語がその記述を書いたという記述を含んでいます。これは、記述を名前付きグラフに分離し、その名前付きグラフに含まれる記述についてさらに主張を行う例です。
Graph Containers は JSON-LD 1.1 の新機能です。
このセクションは規範的ではありません。
ノードオブジェクトをインデックスで索引付けすることに加えて、グラフオブジェクトもインデックスで索引付けできる場合があります。§ 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.1 Graph Containersで導入された
@graph コンテナ型と @id
を組み合わせて使用すると、そのプロパティのオブジェクト値は、キーが名前付きグラフの識別子を表すキーと値のマップとして扱われます。
次の例は、デフォルトグラフが、id マップを用いて複数の名前付きグラフを参照する様子を示します。
id マップ と同様に、@graph
と一緒に使用する場合、コンテナはキー値が常に配列に含まれるようにするために @set を含めることもできます。
id マップ と同様に、特別なインデックス
@none は @id
を持たない名前付きグラフをインデックスするために使用され、正規化された表現を維持するのに役立ちます。@none インデックスは @none
に展開される用語であってもよいです。ただし、複数のグラフが @id
なしで表現されると、展開時にそれらはマージされます。これを防ぐには、@none を慎重に使用し、グラフに固有の識別子を付与することを検討してください。
Graph Containers は JSON-LD 1.1 の新機能です。
このセクションは規範的ではありません。
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は、リモートドキュメントの読み込みが問題になる多くの状況で有用です:
このセクションは規範的ではありません。
多くのデータ形式と同様に、JSON-LD でデータを記述する正しい唯一の方法は存在しません。 しかし、JSON-LD はグラフを記述するために使われるため、意味(Linked Data としての意味)を変えずにデータの形状を変更するための特定の変換が使用できます。
@context が不要になるようにする処理です。
この処理はさらに § 5.1
展開ドキュメント形式 で説明します。
このセクションは規範的ではありません。
JSON-LD 1.1 Processing Algorithms and API specification [JSON-LD11-API]
は JSON-LD ドキュメントを 展開 するための方法を定義します。
Expansion は、
JSON-LD ドキュメントに context を適用し、
すべての IRI、型、および値が展開されて @context が不要になるようにするプロセスです。
たとえば、次の 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 です。
このセクションは規範的ではありません。
JSON-LD 1.1 Processing Algorithms and API specification [JSON-LD11-API] は、 JSON-LD ドキュメントを 圧縮 するための方法を定義します。Compaction は、 開発者が提供する context を適用して、IRI を用語や コンパクト IRI に短縮し、展開形式で表現された JSON-LD の値を 文字列や数値などの単純な値に戻すプロセスです。 これにより、ドキュメントがアプリケーション固有の用語で表現され、扱いやすくなることがよくあります。圧縮されたドキュメントは人間にとっても読みやすくなります。
たとえば、次の 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 コンテキストを考えます:
{
"@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 として直接使用するのに適した形式に表現することです。 これには可能な場合に値を 文字列 として表現したり、 リストオブジェクト を単純な配列に短縮したり、 ノード間の関係の向きを反転させたり、配列で表現する代わりにデータマップを使用して複数の値に索引付けすることが含まれます。
このセクションは規範的ではありません。
展開された 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" として記述された用語の値として使われる場合に行われます。
このセクションは規範的ではありません。
曖昧さを排除するために、展開ドキュメント形式 は常に ノード と値を ノードオブジェクト と 値オブジェクト を用いて表現します。 さらに、プロパティの値は単一の値でも常に配列内に格納されます。これは均一なアクセスを維持するために有用な場合がありますが、ほとんどの JSON データは可能な限り単純な表現を用いるため、プロパティは単一の値を持ち、それは 文字列 または ノードオブジェクト のような構造化された値として表現されます。 デフォルトでは、compaction は、単純な文字列である値を文字列として表現しますが、値が IRI、日付、またはその他の型付き値であって単純な文字列表現では情報が失われる場合もあります。 その場合は term definition 内で指定することにより、 文字列値の意味をその用語の定義から推測できるようにします。詳細は § 4.2 値の記述 を参照してください。
このセクションは規範的ではありません。
§ 4.3.1
リスト で説明されているように、
JSON-LD は順序付けられた値を表現するための展開構文として @list キーワードを持ちます。
表現を簡潔にするために、用語定義で "@container": "@list" を設定すると、その用語を使うプロパティのすべての値が順序付きとして扱われます。
このセクションは規範的ではありません。
場合によっては、二つのノードを関連付けるプロパティはノードの方向を反転させて表現した方が適切なことがあります。 例えば、二人の人物と共通の親を記述する場合などです。 詳細は § 4.8 逆プロパティ を参照してください。
逆プロパティは、framing と組み合わせるとさらに有用で、 フレーミングによりドキュメントのトップレベルで定義された ノードオブジェクト を埋め込みノードに変換できます。 JSON-LD は、そのような値を索引付けする手段を提供しており、適切な @container 定義を用語定義内に定義することで実現します。
このセクションは規範的ではありません。
複数の値を持つプロパティは通常、順序付けされていない 配列
を使って表現されます。
これは、内部表現を扱うアプリケーションが配列の値を反復して、例えば言語タグ en
を持つ言語タグ付き文字列のような特定のパターンに一致する値を見つける必要があることを意味します。
データは @id、@type、@language、@index など、さまざまなキーで索引付けできます。 詳細は § 4.6 Indexed Values および § 4.9 名前付きグラフ を参照してください。
このセクションは規範的ではありません。
ドキュメントを圧縮したいが、それでもノードオブジェクトや値オブジェクトの表現を保ちたい場合があります。
そのためには、用語定義で "@type": "@none" を設定できます。
これにより Value Compaction
アルゴリズムは常に値のオブジェクト形式を使用しますが、その値の構成要素は圧縮されることがあります。
このセクションは規範的ではありません。
一般に、圧縮時には単一の値を持つプロパティは文字列や マップ
として表現され、複数の値を持つプロパティは文字列やマップの配列として表現されます。
これは、そのようなプロパティにアクセスするアプリケーションがどちらの表現も受け入れられるよう準備する必要があることを意味します。すべての値を配列で表現することを強制するには、用語定義で
"@container": "@set" を設定できます。
さらに、@set は他のコンテナ設定と組み合わせて使用することもできます。例えば、前述の言語マップの例(§ 5.2.5 値の索引付け)を見てみましょう:
このセクションは規範的ではありません。
圧縮時、Compaction
algorithm は、プロパティの値がその用語定義の @container、@type、および
@language の仕様に一致する場合にのみ、そのプロパティに対して用語を使って圧縮します。
これは同じ IRI を持つ異なるプロパティ間で値が分割されることを実際に引き起こす場合があります。マッチする用語定義がない場合、コンパクションアルゴリズムはプロパティの絶対 IRI
を使って圧縮します。
このセクションは規範的ではありません。
JSON-LD 1.1 Processing Algorithms and API specification [JSON-LD11-API] は、 JSON-LD ドキュメントを フラット化 する方法を定義します。 Flattening は、 ノードのすべてのプロパティを単一の マップ に集め、 すべてのブランクノードにブランクノード識別子を付与します。 これによりデータの形状が保証され、特定のアプリケーションで JSON-LD を処理するために必要なコードを大幅に簡素化することがあります。
たとえば、次の JSON-LD 入力ドキュメントを考えます:
{
"@context": {
"name": "http://xmlns.com/foaf/0.1/name",
"knows": "http://xmlns.com/foaf/0.1/knows"
},
"@id": "http://me.markus-lanthaler.com/",
"name": "Markus Lanthaler",
"knows": [
{
"@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 です。
これは 展開ドキュメント形式 や
圧縮ドキュメント形式
と組み合わせることができます。
このセクションは規範的ではありません。
JSON-LD 1.1 Framing specification [JSON-LD11-FRAMING] は、 JSON-LD ドキュメントを フレーミング する方法を定義します。Framing は、例示的な frame ドキュメントを用いてドキュメント内のデータを整形するために使用されます。 その frame は flattened データにマッチさせるために使われ、結果として得られるデータの形の例を示します。
たとえば、次の JSON-LD frame を考えます:
{
"@context": {
"@version": 1.1,
"@vocab": "http://example.org/"
},
"@type": "Library",
"contains": {
"@type": "Book",
"contains": {
"@type": "Chapter"
}
}
}
この frame ドキュメントは、 型が Library のオブジェクトをトップレベルに配置し、Library オブジェクトに対して contains プロパティでリンクされた型が Book のオブジェクトをそのプロパティ値として埋め込み、 さらに型が Chapter のオブジェクトを該当の Book オブジェクト内に埋め込む構造を記述します。
フレームのコンポーネントにマッチするフラット化されたオブジェクト群を使用する場合:
{
"@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#frame の script element
はフレームを見つけるために使用されます。
JSON-LD の処理の特定の側面は、HTTP Link Headers [RFC8288] を使って変更できます。これらは対象が JSON-LD そのものではないが、 Link Relation の情報を用いて JSON-LD として解釈できるリソースを取得する際に利用できます。
通常の JSON ドキュメントを処理する際、リンク関係はリモートドキュメントを取得した際に返される HTTP Link Header を使って指定できます。 これは § 6.1 JSON を JSON-LD として解釈する に説明されています。
別の場合、あるリソースは JSON-LD として容易に解釈できない表現で返されることがあります。通常はクライアントが他の表現よりも JSON-LD を優先することを指定するために HTTP 的なコンテンツネゴシエーション が使用されますが、特定の状況ではサーバがそのような要求に適切に応答することができない場合もあります。 このような場合、HTTP Link Header を用いて元の要求リソースの代わりに使用されるドキュメントの代替位置を提供することができます。これは § 6.2 代替ドキュメント位置 に記載されています。
通常の JSON ドキュメントは、明示的な JSON-LD の context ドキュメントを提供することで JSON-LD として解釈できます。その一つの方法は、JSON-LD の
context ドキュメントを HTTP Link Header
で参照することです。
そうすることで、開発者がドキュメントを大幅に変更することなく JSON を機械的に明確に解釈可能にし、既存のクライアントが application/json
メディアタイプや +json サフィックスを持つメディアタイプに依存している場合でも既存インフラを壊すことなく導入経路を提供します([RFC6839])。
通常の JSON ドキュメントに外部コンテキストを使用するため、HTTP 経由で通常の JSON ドキュメントを取得する際、プロセッサは MUST 次の条件を満たす JSON-LD ドキュメント を Link Header が参照している場合に取得を試みる必要があります:
rel="http://www.w3.org/ns/json-ld#context"、およびtype="application/ld+json"。参照されたドキュメントは、トップレベルが JSON
オブジェクト である必要があります(これは MUST)。そのオブジェクト内の
@context の エントリ
は、参照元ドキュメントのトップレベルの
JSON オブジェクト
に追加されます。もし参照元ドキュメントのトップレベルが 配列
で、その要素が JSON オブジェクト
である場合、参照されたドキュメントの @context サブツリーはすべての配列要素に追加されます。参照されたドキュメントの @context
サブツリー外にあるすべての余分な情報は破棄される必要があります(この破棄は MUST)。実質的に、アクティブコンテキストは参照された外部 context で初期化されます。レスポンスは http://www.w3.org/ns/json-ld#context
のリンク関係を使う HTTP Link
Header を複数含んではならない(MUST NOT)ことに注意してください。
他の URI スキーム向けに JSON-LD Context を提供する他のメカニズムが記述されることは MAY です。
JSON-LD 1.1 Processing Algorithms and API 仕様書は、プログラム的に JSON ドキュメントを展開する際に使用するコンテキストを指定するための expandContext オプションを提供します。
次の例は、通常の JSON ドキュメントと共に外部コンテキストを HTTP 経由で使用する例を示します:
GET /ordinary-json-document.json HTTP/1.1 Host: example.com Accept: application/ld+json,application/json,*/*;q=0.1 ==================================== HTTP/1.1 200 OK ... Content-Type: application/json Link: <https://json-ld.org/contexts/person.jsonld>; rel="http://www.w3.org/ns/json-ld#context"; type="application/ld+json" { "name": "Markus Lanthaler", "homepage": "http://www.markus-lanthaler.com/", "image": "http://twitter.com/account/profile_image/markuslanthaler" }
注意:JSON-LD ドキュメント が
application/ld+json
メディアタイプで配信される場合、そのドキュメントはすべてのコンテキスト情報(外部コンテキストへの参照を含む)を本文内に含めている必要があります(これは MUST です)。そのようなドキュメントに対しては、http://www.w3.org/ns/json-ld#context
によってリンクされたコンテキストは無視される MUST であることに注意してください。
直接 JSON-LD として解釈できないドキュメントは、JSON-LD を含む代替位置を提供できます。その一つの方法は、HTTP Link Header で JSON-LD ドキュメントを参照することです。例えば、名前空間に関連付けられた URL に HTML ドキュメントが自然に含まれるが、その URL に関連する JSON-LD コンテキストは別の場所にある場合などに有用です。
代替位置を指定するために、非 JSON リソース(つまり application/json またはその派生でないメディアタイプを使うもの)は、
次の属性を持つ Link Header を返して代替位置を示すことができます:
rel="alternate"、およびtype="application/ld+json"。レスポンスは、type="application/ld+json" を持つ alternate リンク関係を使う
HTTP Link Header
を複数含んではならない(MUST NOT)ことに注意してください。
他の URI スキーム向けに代替位置を提供する他のメカニズムが記述されることは MAY です。
次の例は、通常の HTTP ドキュメントで代替位置を使用する例を示します:
GET /index.html HTTP/1.1 Host: example.com Accept: application/ld+json,application/json,*/*;q=0.1 ==================================== HTTP/1.1 200 OK ... Content-Type: text/html Link: <alternate.jsonld>; rel="alternate"; type="application/ld+json" <html> <head> <title>Primary Entrypoint</title> </head> <body> <p>This is the primary entrypoint for a vocabulary</p> </body> </html>
プロセッサが非 JSON の結果を検出した場合、リンクヘッダの存在を確認してその代替ドキュメントをロードします。
この節は、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 要素に含まれるブランクノード識別子は、まるで同一ドキュメント内にあるかのように共有されます。
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 あります。
script 要素の内容に対する制限
このセクションは規範的ではありません。
HTML の script 要素の内容に関する制限 のため、script 要素内に含まれる JSON-LD データには追加のエンコーディング制限が適用されます。
作成者は、HTML に埋め込まれたスクリプト内で comment-open、script-open、comment-close、または script-close と誤認される可能性のある文字列の使用を避けるべきです。
& → & (アンパサンド, U+0026)< → < (小なり記号, U+003C)> → > (大なり記号, U+003E)" → " (引用符, U+0022)' → ' (アポストロフィ, U+0027)HTML ドキュメント内の特定の script 要素 は、その HTML ドキュメント内での 一意識別子(フラグメント識別子)を使って特定できます(参照: [DOM])。JSON-LD プロセッサは、指定されたデータブロックの内容のみを抽出し、それを独立した JSON-LD ドキュメント として解析し、他のマークアップと結果をマージしてはならない(MUST NOT)ことが要求されます。
例えば、http://example.com/document にある HTML ドキュメントに対して、識別子 "dave" の script 要素をターゲットにするには URL
http://example.com/document#dave を使います。
JSON-LD は JSON をベースにした Linked Data のシリアライゼーション形式です。 したがって、構文([RFC8259] の JSON により定義される)と、データモデル(これは RDF データモデル の拡張)[RDF11-CONCEPTS] を区別することが重要です。 JSON-LD と RDF データモデルの関係についての詳細は § 10. RDF との関係 を参照してください。
RDF モデルに不慣れな開発者に分かりやすくするため、以下に要約を示します:
#)の使用を検討してください。
{
"@id": "http://example.org/1"
}
@id のみを含むネストされていないノードオブジェクトは禁止されます。ドキュメントは、1
つ以上のプロパティが定義されているか、他のノードオブジェクトから参照されている限り、関連のないノードを持つことができます。
_: で始まります。
xsd:string
の型付き値として解釈される)、数値(小数部が非ゼロの数、あるいは整数として表現できないほど大きい数
— 詳細は Data Round Tripping を参照 — は
xsd:double と解釈され、その他の数値は xsd:integer と解釈されます)、true /
false(xsd:boolean として解釈)、
または言語タグ付き文字列で構成されます。
JSON-LD ドキュメントは、 上で定義した データモデル では表現できないデータを含んでもよい(MAY)。特に指定がない限り、そのようなデータは JSON-LD ドキュメントの処理時に無視されます。このルールの結果の一つとして、IRI、ブランクノード、またはキーワードにマップされないプロパティは無視されます。
さらに、JSON のシリアライゼーション形式は内部的に JSON-LD 内部表現 を用いて表現され、リスト、マップ、文字列、数値、ブール値、null といった一般的概念を使って JSON ドキュメントで表現されるデータを記述します。
この図で示されたデータセットは次のように表現できます:
外側のレベルで @graph を使って 3 つのトップレベルリソース(そのうち 2 つが名前付きグラフ)を記述している点に注意してください。名前付きグラフは各グラフの名前を提供するために
@id に加えて @graph を利用しています。
この節では、前節で説明した構文上の規約をより形式的に再記述します。
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 の代わりに使用できます。なお、キーワードのエイリアスはコンテキスト処理中に展開されない点に注意してください。
用語(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 を参照してください。
ノードオブジェクト は、ノード の 0 個以上のプロパティを表し、JSON-LD ドキュメントによって直列化される グラフ 内のノードの性質を示します。map が ノードオブジェクト であるための条件は次のとおりです(その map が JSON-LD の context の外に存在する場合に限る):
@graph と
@context 以外の エントリ を持たないものではない、
@value、@list、または @set キーワードを含まない、グラフ中のノードのプロパティはドキュメント内の異なるノードオブジェクトに分散していることがあります。その場合、それら異なるノードオブジェクトのキーをマージして、最終的なノードのプロパティを作成する必要があります。
ノードオブジェクト は MUST map でなければなりません。アクティブコンテキストで有効な IRI、コンパクト IRI、用語、あるいは次のいずれかの キーワード(またはそのエイリアス)に該当しないすべてのキーは、処理時に無視されることが MUST です:
@context,@id,@included,@graph,@nest,@type,@reverse, または@indexもしノードオブジェクトが @context キーを含む場合、その値は MUST null、IRI 参照、コンテキスト定義、またはこれらのいずれかからなる
配列 でなければなりません。
もしノードオブジェクトが @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 です:
true、false、フレーミング を行う場合、フレームオブジェクト はノードオブジェクトを拡張して、フレーミング専用に用いられるエントリを許可します。
@default の値は @null、または @null のみを含む配列のほかに、IRI
に展開されるエントリキーの文法で許される値を含めることができます。@id および @type の値は、ワイルドカード(空の map)、空の map のみを含む配列、空の配列(マッチなし)、あるいは IRI
の配列などを追加で許すことが MAY あります。@embed キーを持ち、その値として
@always、@once、@never のいずれかを取ることが MAY あります。
@explicit、@omitDefault、または @requireAll
を含めることが MAY あります。フレームオブジェクトの使用方法については [JSON-LD11-FRAMING] を参照してください。
グラフオブジェクト
は名前付きグラフを表し、明示的なグラフ名を含むことが MAY あります。map
がグラフオブジェクトである条件は、コンテキスト外に存在し、@graph エントリ(またはそのエイリアス)を含み、JSON-LD ドキュメントの最上位の map
ではなく、かつそのエントリが
@graph、@index、@id、@context(またはそれらのエイリアス)のみで構成されていることです。
もしグラフオブジェクトが @context を含む場合、その値は MUST null、IRI
参照、コンテキスト定義、またはこれらのいずれかから成る配列でなければなりません。
もしグラフオブジェクトが @id を含む場合、その値は名前付きグラフの識別子(グラフ名)として使用され、MUST IRI 参照またはコンパクト IRI(ブランクノード識別子を含む)でなければなりません。詳細は該当節を参照してください。
@id エントリを持たないグラフオブジェクトは 単純グラフオブジェクト
と見なされ、明示的な識別子を持たない名前付きグラフを表しますが、データモデル上は暗黙に割り当てられたブランクノード識別子をグラフ名として持ちます。
@graph キーの値は MUST ノードオブジェクト、または 0
個以上のノードオブジェクトから成る配列でなければなりません。§ 4.9 名前付きグラフ を参照してください。
値オブジェクト は、値に対して型や言語を明示的に関連付けるために用いられ、型付き値 や 言語タグ付き文字列 を生成します。また、必要に応じて基底方向(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 を参照してください。
フレーミング時、値パターン は値オブジェクトを拡張して、フレーミング専用のエントリを許可します。
@value、@language、@direction、および
@type の値は、追加で空の map(ワイルドカード)、空の map
のみを含む配列、空の配列(マッチなし)、または文字列の配列であってもよい(MAY)です。
リスト
は順序付きの値集合を表し、セットは順序に関係ない値集合を表します。特段の指定がない限り、JSON-LD では 配列 は順序付けられていません。したがって、ドキュメント本体で使用される
@set キーワードは、処理時に最適化されて取り除かれる単なる構文糖であり、コンテキスト内で用いると有用です。@set または
@list コンテナに関連付けられた用語の値は、ドキュメント処理時に常に配列形式で表現されます(単一の値であっても)。これにより後処理が簡素化され、データは決定論的な形になります。
リストオブジェクト は、MUST map であり、@list と
@index 以外の IRI またはキーワードに展開されるキーを含んではなりません。
セットオブジェクト は、MUST map であり、@set と
@index 以外の IRI またはキーワードに展開されるキーを含んではなりません。なお、@index キーは処理時に無視されることがあります。
いずれの場合も、@list および @set に関連付けられる値は次の型のいずれかであることが MUST です:
true、false、セットとリストの詳細は § 4.3 値の順序付け を参照してください。
言語マップ
は、言語と値を関連付けてプログラム的にアクセスしやすくするために用いられます。言語マップは、用語が @container として @language(または
@language と @set を含む配列)に定義されている場合、ノードオブジェクト内の用語の値として使用できます。言語マップのキーは BCP47
の言語タグを表す文字列、キーワード @none、または @none に展開される用語でなければならず(MUST)、値は次のいずれかでなければなりません:
言語マップの詳細は § 4.2.4 文字列の国際化 を参照してください。
インデックスマップ
は意味を持たないが保持すべきキーを扱うために用いられます。インデックスマップは、用語が @container に @index(または
@index と @set
を含む配列)として定義されている場合、ノードオブジェクト内の用語の値として使用できます。インデックスマップのエントリの値は次の型のいずれかでなければなりません(MUST):
true、false、このトピックの詳細は § 4.6.1 データのインデックス化 を参照してください。
インデックスマップは、用語が @container に @graph と @index(任意で
@set
を含む)を含む配列として定義されている場合、インデックスを対応する名前付きグラフにマップするためにも使用できます。その値は、参照キーでインデックスされる名前付きグラフ内に含まれるノードオブジェクトで構成され、もし値に
@id が含まれないなら単純グラフオブジェクトとして表現できますし、@id を含む場合は名前付きグラフとして表現されます。
プロパティベースの インデックスマップ は、
インデックスをグラフ内のプロパティ値として意味的に保持する点で
標準の インデックスマップ の変種です。
プロパティベースの インデックスマップ は、
用語が @container を @index に設定している場合、
または @index と @set の両方を含む配列として定義され、
かつ @index が string に設定されているときに、
ノードオブジェクト 内の用語値として使用できます。
プロパティベースの インデックスマップ の値は、
MUST ノードオブジェクト または
strings(ノードオブジェクトに展開されるもの)でなければなりません。
展開時に、アクティブコンテキストが @index の値に対する
用語定義 を含む場合、
その用語定義が インデックスマップ のキーの展開に使用されます。
そうでない場合、キーは単純な 値オブジェクト
として展開されます。
インデックスマップの展開後の値に含まれる各 ノードオブジェクト
には、追加のプロパティ値が付加されます。
そのプロパティは @index の展開値であり、値は展開された参照キーです。
このトピックの詳細は § 4.6.1.1 プロパティベースのデータ索引化 を参照してください。
id map は、IRI
を扱いやすいプログラム的アクセス可能な値に対応付けるために使用されます。
id map は、用語が @container
を
@id に設定している場合、または @id と @set の両方を含む配列として定義されている場合に、
ノードオブジェクト 内の用語値として使用できます。
id map のキーは MUST IRI(IRI 参照 または コンパクト IRI(ブランクノード識別子を含む))、
キーワード @none、または @none に展開される用語でなければならず、
値は MUST ノードオブジェクト でなければなりません。
値が @id に展開されるプロパティを含む場合、その値は参照キーと等価でなければなりません(MUST)。そうでない場合、展開時に値からのプロパティがノードオブジェクト値の @id として使用されます。
Id Maps は、用語が @container
を
@graph と @id(任意で @set を含む)を含む配列として定義されている場合に、
グラフ名をその名前付きグラフにマップするためにも使用できます。値は、参照キーによって名前付けされる名前付きグラフ内に含まれる
ノードオブジェクト で構成されます。
type map は、IRI
を扱いやすいプログラム的アクセス可能な値に対応付けるために使用されます。
type map は、用語が
@container を
@type に設定している場合、または @type と @set の両方を含む配列として定義されている場合に、
ノードオブジェクト 内の用語値として使用できます。
type map のキーは MUST IRIs(IRI 参照または コンパクト IRI(ブランクノード識別子を含む))、
用語、あるいはキーワード @none でなければならず、値は MUST ノードオブジェクト
またはノードオブジェクトに展開される strings でなければなりません。
値が @type
に展開されるプロパティを含み、参照キーと値の両方を適切に展開した結果に参照キーが含まれている場合、そのノードオブジェクトは既に型を含んでいます。そうでない場合、展開時に値からのプロパティがノードオブジェクト値の
@type として追加されます。
included block は、
ノードオブジェクト の集合を提供するために使用されます。
included block は、
ノードオブジェクトのメンバーの値として @included またはそのエイリアスのキーで現れることが MAY
あります。
included block はノードオブジェクト、
またはノードオブジェクトの配列です。
展開(expanding)の際、 複数の included blocks は 単一の included block に合流されます。
ネストされたプロパティ は、 プロパティ を 別個の map、または map の配列 に集めるために使用されます。 これらの map は 値オブジェクト ではありません。 ネストは意味的に透明であり、展開 の過程で除去されます。プロパティのネストは再帰的であり、 ネストされたプロパティの集合はさらにネストを含むことがあります。
意味論的には、ネストはプロパティと値が包含する ノードオブジェクト に直接宣言されたかのように扱われます。
コンテキスト定義 は、 ノードオブジェクト 内で ローカルコンテキスト を定義します。
コンテキスト定義 は、
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)。
展開済み用語定義 は、 用語とその展開先識別子との対応、およびノードオブジェクトのキーとして用語が使用される際の値に関する他の特性を記述するために使用されます。
展開済み用語定義 は
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 を参照してください。
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 を参照してください。
JSON-LD は [RDF11-CONCEPTS] に記載されているように、具体的な RDF 構文 です。したがって、JSON-LD ドキュメントは RDF ドキュメントでありかつ JSON ドキュメントであり、対応して RDF データモデル のインスタンスを表します。しかし、JSON-LD はまた RDF データモデルを拡張して、オプションとして JSON-LD が 一般化された RDF データセット をシリアライズできるようにしています。JSON-LD による RDF データモデルへの拡張は次のとおりです:
true / false もサポートします。JSON-LD 1.1 Processing Algorithms and API 仕様 [JSON-LD11-API]
は、ラウンドトリッピングを可能にするために JSON のネイティブなデータ型と RDF の対応型との間の 変換規則 を定義します。
プロパティのラベルに ブランクノード識別子 を使用することは廃止予定であり、将来の JSON-LD のバージョンで削除される可能性があります。同様に 一般化された RDF データセット のサポートも削減される可能性があります。
まとめると、これらの差異は JSON-LD が任意の RDF の グラフ や データセット をシリアライズできることを意味します。ほとんどの(しかしすべてではない) JSON-LD ドキュメントは RDF11-CONCEPTS に記述された通りに直接 RDF として解釈可能です。
作成者はプロパティに ブランクノード識別子 を付けることを強く避けるべきです。代わりに次のいずれかの手段を検討してください:
urn:example:1 のような URN([URN] を参照)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 コンテンツネゴシエーションを使って公開できます。
データセットとグラフの両方の構文をサポートする公開者は、主たるデータが デフォルトグラフ に格納されていることを保証する必要があります。これはデータセットをサポートしない消費者が情報を処理できるようにするためです。
この節は規範的ではありません。
RDF を JSON-LD としてシリアライズし、JSON-LD を RDF にデシリアライズする処理は、JSON-LD 1.1 Processing Algorithms and API 仕様に定義された RDF Serialization-Deserialization Algorithms を実行することに依存します。これらのアルゴリズムの詳細をさらに述べることは本書の範囲を超えますが、処理の手順を示すための要約を提供します。
JSON-LD ドキュメントを RDF にデシリアライズする手順は次のステップを含みます:
例えば、次のようなコンパクト形式の 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 アルゴリズムを実行すると、次のような出力が得られます:
[
{
"@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 で表すと次のようになります:
@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 を用いてフレーム化し、望ましいオブジェクトの埋め込みを作成できます。
rdf:JSON データ型RDF はリテラル値として JSON コンテンツを扱うことができます。これはリテラル値内にマークアップを含めることを可能にします。そのようなコンテンツはデータグラフ内でデータ型が
rdf:JSON に設定された リテラル を用いて示されます。
rdf:JSON データ型は次のように定義されます:
http://www.w3.org/1999/02/22-rdf-syntax-ns#JSON です。\uhhhh)でシリアライズすることが要求されますが、事前定義された制御文字(U+0008, U+0009, U+000A, U+000C,
U+000D)はそれぞれ \b, \t, \n, \f,
\r としてシリアライズされることが推奨されます(SHOULD)。その他の
Unicode 文字は原則としてそのままシリアライズされることが推奨されますが、U+005C(\)と U+0022(")はそれぞれ \\ と
\" としてシリアライズすることが推奨されます(SHOULD)。
xsd:string の値空間とは区別されます。
JSON.parse による表現を用いる等)、i18n 名前空間この節は規範的ではありません。
i18n 名前空間は、言語タグ と 基底方向 の組合せを RDF
リテラルで記述するために使用されます。これは通常 xsd:string や rdf: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 を参照してください。
rdf:CompoundLiteral クラスと rdf:language および
rdf:direction プロパティ
この節は規範的ではありません。
本仕様は rdf:CompoundLiteral クラスを定義しており、これは同一の主語上の rdf:value
に対する文字列値と共に基底方向および任意の言語タグを記述するために用いられる rdf:language および rdf:direction
のドメインとなります。
rdf:CompoundLiteralrdf:languagerdfs:Literal であり、その値は [BCP47]
に従った適切な言語タグでなければなりません(MUST)。プロパティのドメインは
rdf:CompoundLiteral です。
rdf:directionrdfs: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 を参照してください。
詳細は Security Considerations を § C. IANA Considerations にて参照してください。
外部コンテキストの取得は JSON-LD プロセッサの操作を露出させる可能性があり、中継ノードが取得したリソースの検査を通じてクライアントアプリケーションをフィンガープリントすることを許し([fingerprinting-guidance] を参照)、中間者攻撃の機会を提供する可能性があります。これを防ぐため、公開者はリモートコンテキストを今後の利用のためにキャッシュすること、あるいは documentLoader を用いてそのようなコンテキストのローカル版を保持することを検討すべきです。
JSON-LD は RDF データモデルを使用するため、左右方向の指示子を持つ文字列としての JSON-LD 値(文字列)の正確な記録には設計上制約があります。JSON-LD と RDF の両者は文字列に関連する言語を指定するメカニズム(言語タグ付き文字列)を提供しますが、文字列の 基底方向 を示す手段は提供していません。
Unicode は文字列内で方向を示す仕組みを提供します(Unicode Bidirectional Algorithm [UAX9] を参照)が、文字列の先頭から基底方向を決定できない場合には外部の指示子が必要です。例えば HTML の dir 属性 のようなもので、現時点では RDF リテラルに対する対応はありません。
RDF における文字列の基底方向を適切に表現する問題は本作業部会が扱える範囲を超えており、将来の RDF 作業部会がこの問題を検討し、言語タグ付き文字列の基底方向を指定できるようにすることが期待されています。
より包括的な解決が本仕様の将来バージョンで扱われるまで、公開者は文字列の基底方向が文字列の内容から正しく推測できない場合にこの問題を考慮するべきです。文字列の言語および基底方向の識別に関するベストプラクティスについては [string-meta] を参照してください。
この節は規範的ではありません。
この節は規範的ではありません。
この節では、Linked Data Dataset figure を § 8. Data Model にある図について説明します。
図は破線の箱が三つあり、それぞれ異なるlinked data graph を表しています。各箱は有向矢印で結ばれた図形で構成され、リンクドデータの関係を表しています。
最初の箱のタイトルは "default graph: <no name>" で、次の 2 つのリソースを表します:
http://example.com/people/alice と http://example.com/people/bob(それぞれ "Alice" と
"Bob" を示す)。両者は schema:knows というラベルの付いた矢印で接続されており、二つのリソース間の knows 関係を示しています。さらに "Alice"
リソースは三つの異なるリテラルと関連しています:
二番目と三番目の箱は二つのnamed graphs を示しており、グラフ名はそれぞれ "http://example.com/graphs/1" と "http://example.com/graphs/1" です。
二番目の箱は二つのリソース、http://example.com/people/alice と http://example.com/people/bob
から構成され、これらは schema:parent 関係で結ばれており、http://example.com/people/bob を "Bob"
と名付けています。
三番目の箱は二つのリソースからなり、一方は http://example.com/people/bob と名付けられ、もう一方は名前がありません。これら二つのリソースは
schema:sibling 関係で結ばれており、もう一方のリソースは "Mary" と名付けられています。
この節は規範的ではありません。
以下の JSON-LD の例は、Turtle、RDFa、Microdata といった他の Linked Data 形式でマークアップされた意味的データを JSON-LD でどのように表現できるかを示しています。これらの節は、JSON-LD が異なる Linked Data のアプローチ全体で表現可能な柔軟性を持つことを示すために提供されています。
この節は規範的ではありません。
以下は [Turtle] で表現された RDF を JSON-LD に変換する例です。
JSON-LD のコンテキストは Turtle の @prefix 宣言と直接対応します:
@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/> .
{
"@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/" }
}
Turtle と JSON-LD の両方は埋め込みを許容しますが、Turtle は blank nodes の埋め込みのみを許可します。
@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" ] .
{
"@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"
}
}
JSON-LD では数値やブール値はネイティブなデータ型です。Turtle にはそのような値を表現する略記構文がありますが、RDF
の抽象構文は数値やブール値を型付きリテラルとして表現することを要求します。したがって完全なラウンドトリップを可能にするために、JSON-LD 1.1 Processing Algorithms and
API 仕様は JSON-LD のネイティブデータ型と RDF の対応する型との間の変換規則を定義しています。小数部を持たない数は xsd:integer
型リテラルに、小数部を持つ数は xsd:double 型リテラルに、真偽の値 true と false は
xsd:boolean 型リテラルに変換されます。すべての型付きリテラルは正規化された字句形式になります。
{
"@context": {
"ex": "http://example.com/vocab#"
},
"@id": "http://example.com/",
"ex:numbers": [ 14, 2.78 ],
"ex:booleans": [ true, false ]
}
@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 .
2.78 が
xsd:decimal に変換されます。理由は多くの JSON ツールが小数を浮動小数点数として解析するためであり、RDF に戻す際には
xsd:double が最も適切なデータ型だからです。
JSON-LD と [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" ) .
{
"@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" ]
}
}
この節は規範的ではありません。
次の例は RDFa [RDFA-CORE] で三名の人々とそれぞれの名前やホームページを記述した例です。
<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 による実装例です。
この節は規範的ではありません。
以下の HTML Microdata の例は、本に関する情報を Microdata の Work アイテムとして表現したものです([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 で参照するという方針に忠実である点に留意してください。
[
{
"@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"}
}
]
この節は Internet Engineering Steering Group (IESG) に提出され、レビュー、承認、IANA 登録のために送られています。
profile空でない空白区切りの URI のリストで、JSON-LD ドキュメントに適用される特定の制約や慣習を識別します([RFC6906])。プロファイルは、プロファイルの知識がないクライアントで処理してもリソース表現の意味論を変えないため、プロファイルの有無に関わらず同じ表現を安全に使用できます。profile
パラメータはクライアントがコンテンツネゴシエーションで好みを表現するために MAY
使用できます。サーバがプロファイルパラメータを受け取った場合、サーバは認識するプロファイルを尊重したドキュメントを返すべきで(SHOULD)、認識しないプロファイルは無視しなければなりません(MUST)。プロファイル URI は dereferenceable であり、その URI
上で有用なドキュメントを提供することが推奨されます。詳細は [RFC6906]
を参照してください。
本仕様は profile パラメータのために 6 種類の値を定義します。
http://www.w3.org/ns/json-ld#expandedhttp://www.w3.org/ns/json-ld#compactedhttp://www.w3.org/ns/json-ld#contexthttp://www.w3.org/ns/json-ld#flattenedhttp://www.w3.org/ns/json-ld#framehttp://www.w3.org/ns/json-ld#framedhttp://www.w3.org/ns/json-ld で始まるその他の URI は将来の JSON-LD 仕様のために予約されています。
他の仕様は独自の意味を持つ追加の profile パラメータ URI を公開することができます。これにはファイル拡張子を
profile パラメータに関連付ける能力も含まれます。
メディアタイプパラメータとして使用される場合(RFC4288 に従う)、profile
パラメータの値は空白などの特殊文字を含む場合には引用符で囲む必要があります。複数のプロファイル URI を組み合わせるときに必要です。
“profile” メディアタイプパラメータの値は一つ以上の URI を含むことに注意してください。場合によっては IRI と URI の間の変換が必要になることがあります(RFC3987 の該当節を参照)。
JSON-LD は有向グラフの純粋なデータ交換形式を意図しているため、シリアライゼーションを JavaScript の eval()
のようなコード実行機構に渡して解析するべきではありません(SHOULD
NOT)。不正なドキュメントには実行時に副作用を引き起こす可能性のあるコードが含まれることがあります。
JSON-LD ドキュメントを処理する際、リモートコンテキストやフレームへのリンクが自動的に辿られることが多く、ファイル転送がユーザの明示的な要求なしに発生します。リモートコンテキストが第三者によって提供される場合、利用パターンの収集などに利用され、プライバシー上の懸念が生じる可能性があります。JSON-LD11-API のような特定の実装はこの挙動を細かく制御する手段を提供することがあります。
Web 上の非安全な接続(HTTP など)でロードされるリモートコンテキストは、攻撃者によって改変される危険があり、active context を変更してセキュリティを損なう可能性があります。ミッションクリティカルな用途でリモートコンテキストに依存するアプリケーションは、そのコンテキストを検証しキャッシュしてから使用することが推奨されます。
JSON-LD は長大な IRI を短い用語に置き換えることを許すため、処理時に展開されるとドキュメントが大幅に膨張し、最悪の場合受信側のリソースを枯渇させる可能性があります。アプリケーションは受け取るデータを慎重に扱うべきです。
JSON-LD は使用できる IRI スキームに制限を設けず、語彙相対 IRI は IRI 解決ではなく文字列結合を用いるため、デリファレンスした際に悪用され得る IRI を構築することが可能です。
application/ld+json で使用されるフラグメント識別子は、RDF 構文での扱いと同様に処理されます(RDF11-CONCEPTS を参照)。
この登録は [JSON-LD10] にある application/ld+json の元の定義に対する更新です。
この節は規範的ではありません。
以下の例は、プロファイルパラメータが異なる許容されるレスポンスを記述するためにどのように使用されうるかを示します。
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 として返すよう要求します。
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)で返すよう要求します。明示的なコンテキストリソースが指定されていないため、サーバはアプリケーション固有のデフォルトコンテキストを使ってコンパクト化を行います。
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 は二重引用符で囲まれています。
この節は規範的ではありません。
以下は公開時点で未解決の問題の一覧です。
メタデータを伴う参照によるコンテキスト検討。
非自明なプレフィックス用語定義に対する Compact IRI 展開サポート。
Language-maps は基底方向を別個に指定できない。
@context
内の @default defer-future-version
@context 内の @default に関する検討。
@prefix に関する提案 defer-future-version
@prefix に関する提案。
@coerce
キーワードまたは類似の提案 defer-future-version
型強制 / ノード変換:@coerce キーワードまたは同様の提案。
この節は規範的ではありません。
@version エントリ を含むことができ、これは 処理モード の設定に使用されます。@context プロパティを持てるようになり、これはその用語で識別されるプロパティの値に使用されるコンテキストを定義します。@container の値は、@id、@graph、および @type
を含めることができるようになり、これは id maps および type maps に対応します。@nest プロパティを持てるようになり、これは同じ @nest
マッピングを使用するプロパティを含むために使用されます。展開時、@nest に展開されるプロパティの値は、包含するノードオブジェクト内に直接含まれているかのように扱われます。
@none キーを持てるようになりました。JSON-LD 1.0 は文字列キーのみを許可していましたが、これを更新して
@none キーを許可しています。
@container の値は、適切なコンテナキーワードのいずれかを単一で含む配列、または @set
と組み合わせた配列にもできるようになりました(@list を除く)。これにより、プロパティ値が常に配列形式で表現されることを保証できます。@prefix エントリがあり値が true の場合に限定されます。1.0
のアルゴリズムは、値が URI の gen-delim 文字で終わる用語のみを考慮するように更新されています。@container が @graph に設定された用語定義に関連付けられたプロパティの値は、暗黙的に名前付きグラフ(implicitly named
graphs)として解釈され、関連するグラフ名は新しいブランクノード識別子から割り当てられます。他の組み合わせには
["@container", "@id"]、["@container", "@index"] があり、いずれも "@set"
を含めることができ、これらはグラフ識別子やインデックス値からのマップを作成し、インデックスマップや id マップに類似した構造を生み出します。
さらに、§ F. JSON-LD Community Group Final Report 以降の変更点も参照してください。
この節は規範的ではありません。
@type(または @type のエイリアス)の値は @container を @set
に設定できるようになり、@type のエントリが常に配列として表現されることを保証できます。これにより、用語を @type 用に定義でき、その値は
@container を @set に設定した map でなければなりません。
"@type": "@none" のサポートを用語定義に追加し、値の圧縮を防止するようにしました。rdf:JSON データ型を定義しました。application/ld+json;profile=http://www.w3.org/ns/json-ld#frame
で識別できるようになりました。@type の値にも使用でき、これは関連する型を含むノードオブジェクトに使用されるコンテキストを定義します。@propagate
エントリで制御できます。@import エントリを含めて、コンテキスト内からリモートコンテキストを参照できるようになり、JSON-LD 1.0 用に作成されたコンテキストに JSON-LD
1.1 の機能を追加できます。@direction をサポートし、文字列の基底方向を設定できるようになりました。json-ld-1.0 に設定されない限り暗黙的に json-ld-1.1 になりました。"@"1*ALPHA の形式の用語に対する将来の互換性問題について警告します。i18n データ型や rdf:CompoundLiteral を生成する際に言語タグは小文字に正規化され、実装間の相互運用性が向上します。この節は規範的ではありません。
"@prefix": false の振る舞いを説明しました。これはコンパクト IRI の展開と、IRI をコンパクト IRI
に圧縮する動作の両方に影響します。@index キーワードの規範的な定義を追加しました(§ 9.15.1 Expanded
term definition)。rdf:JSON Datatype における
rdf:JSON データ型の規範的定義を、正規化(canonicalization)を記述するように変更しました。
i18n
Namespace および § 10.4 The rdf:CompoundLiteral class)。この節は規範的ではありません。
@embed
キーワードの規範的記述と一致するようにしました(Issue 358 に対応)。この節は規範的ではありません。
編集者は、本仕様の作成および編集に大きく貢献した以下の個人に特に感謝します。
また、公開時点で作業部会のメンバーであった以下の方々にも感謝します:
また、技術的な議論を行い多くの問題を解決してきた 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。