Copyright © 2020-2026 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
CBORは、コンパクトなバイナリデータのシリアライズおよびメッセージング形式です。この 仕様は、Linked DataをシリアライズするためのCBORベースの形式であるCBOR-LD 1.0を定義します。 このエンコーディングは、現在数億ものシステムにデプロイされている既存のJSON-LDエコシステムを 活用し、Linked Dataの効率的なエンコーディング方式を求める人々にコンパクトな シリアライズ形式を提供するよう設計されています。セマンティック圧縮方式を利用することで、 汎用的な圧縮方式よりも60%を超えて優れた圧縮率を実現できます。この形式は 主に、ストレージや帯域幅に制約のあるプログラミング環境でLinked Dataを使用する方法を提供し、 相互運用可能なセマンティックなワイヤレベルプロトコルを構築し、CBORベースのストレージエンジンで Linked Dataを効率的に保存することを目的としています。
この節は、公開時点におけるこの 文書のステータスを説明する。現在のW3C 公開文書およびこの技術報告の最新版の一覧は、 W3C標準および草案 インデックスにある。
この文書は実験的なものです。
この文書で説明されている機能を実証できる 参照実装があります。
この文書は、JSON-LD作業グループによって、 勧告 トラックを用いる 作業草案として公開されました。
作業草案としての公開は、 W3Cおよびそのメンバーによる 支持を意味するものではありません。
これは草案文書であり、いつでも他の文書によって更新、置換、または廃止される可能性があります。 進行中の作業以外のものとしてこの文書を引用することは適切ではありません。
この文書は、 W3C 特許 ポリシーの下で活動するグループによって作成されました。 W3Cは、 このグループの成果物に関連して行われた 特許開示の公開リストを 管理しています。そのページには、 特許を開示するための手順も含まれています。ある特許が 必須クレームを含むと 実際に知っている個人は、 W3C特許ポリシー第6節に従って その情報を開示しなければなりません。
この文書は、 2025年8月18日版W3Cプロセス文書に従います。
この節は非規範的です。
CBORは、コンパクトなバイナリデータのシリアライズおよびメッセージング形式です。この 仕様は、Linked DataをシリアライズするためのCBORベースの形式であるCBOR-LD 1.0を定義します。 このエンコーディングは、現在数億ものシステムにデプロイされている既存のJSON-LDエコシステムを 活用し、Linked Dataの効率的なエンコーディング方式を求める人々にコンパクトな シリアライズ形式を提供するよう設計されています。セマンティック圧縮方式を利用することで、 汎用的な圧縮方式よりも60%を超えて優れた圧縮率を実現できます。この形式は 主に、ストレージや帯域幅に制約のあるプログラミング環境でLinked Dataを使用する方法を提供し、 相互運用可能なセマンティックなワイヤレベルプロトコルを構築し、CBORベースのストレージエンジンで Linked Dataを効率的に保存することを目的としています。
この節は非規範的です。
この文書は、CBORにおけるLinked Dataのシリアライズに関する詳細な仕様です。この文書は主に、次の読者を対象としています:
非規範的と記された節に加えて、この仕様内のすべての作成ガイドライン、図、例、注記は 非規範的です。この仕様のそれ以外のすべては規範的です。
この文書におけるキーワードMUSTは、 BCP 14 [RFC2119] [RFC8174] に記述されているように、 ここに示すとおりすべて大文字で現れる場合に限り、解釈されます。
この節は非規範的です。
この仕様の開発に参加する方法はいくつかあります:
この節は非規範的です。
CBOR-LDは、次の設計目標を満たします:
同様に、次のものは非目標です。
この仕様に取り組む中で、次の落とし穴が特定されました:
この節は非規範的です。
大まかに言うと、CBOR-LDは、追加の圧縮のために 次の仕組みを利用できる、JSON-LD向けのコンパクトなバイナリシリアライズです:
コーデックは、型付き値を汎用的な方法で圧縮するための基本的なプリミティブです。セマンティック圧縮は JSON-LD用語を圧縮するためのものです。レジストリ辞書は、ユースケース固有の方法で型付き値を圧縮する ためのものです。これらはいずれも任意です — CBOR-LDは、 これらの圧縮戦略のいずれか、すべて、またはいずれも使用せずに利用できます。まとめると、特定のユースケースで 使用されるこれらの戦略の集合は、処理モデルとして知られます。
この節は非規範的です。
セマンティック圧縮は、コンパクトなCBOR-LDペイロードを作成するための強力なツールです。中核となる考え方は、 外部JSON-LDコンテキストオブジェクトの情報内容を用いてJSON-LD用語を圧縮することです。 これらの外部コンテキストオブジェクトは、ペイロードの作成者と消費者の双方が利用できるため、 これは可逆的な方法で行われます。
一般的なセマンティック圧縮処理では、JSON-LD Documentを取得し、 次を行います:
@context値を見つける。埋め込みコンテキスト値は圧縮できない)。
CBOR-LDペイロードは、バイナリレベルでCBOR-LDであると識別できる必要があります。CBORは本来、 これを「タグ」機能によってサポートしています — これは、グローバルレジストリを介して ペイロードの残りを記述する、バイナリデータ内のヘッダー値です。
CBORタグ0xCB1D(タグ値51997)は、CBOR-LDで使用するために
IANA
CBORタグレジストリに登録されています。このタグ値の直後に続くデータは、
圧縮ペイロードを作成するために使用されたレジストリエントリーを識別します。
CBOR-LDペイロードは、タグ0xCB1Dでタグ付けされた項目が
2要素の配列であり、最初の要素が
major type 0 integerで
MUSTあるように構造化されていなければなりません。
この整数はCBOR-LD Registry Entry IDです。バイナリ構造は
tag([registryEntryId, payload])です。
その後、CBOR-LD Registry Entry IDの値を使用して、CBOR-LD Registry内の CBOR-LD Registry Entryを検索します。
単一のCBORタグ値を使用しながら、消費に必要な異なる 圧縮テーブル素材を必要とするCBOR-LDの可能なユースケースを無制限に拡張できるように、 次を定義します。
CBOR-LD Registryは、CBOR-LDペイロードの消費者が展開に必要なterm-codec mapを再構築するために 必要な情報を提供するグローバルなリストです。CBOR-LD Registry Entryには、次が含まれます:
Registry Entry ID: 正の整数。
Use Case: このエントリーが使用されるCBOR-LDペイロードの種類。
typeTables: このレジストリエントリーで使用されるレジストリ辞書を含む配列。
processingModel: このレジストリエントリーで使用される処理モデル。処理
モデルは
次を指定します:
default処理モデルはセマンティック圧縮を使用し、この文書で
指定されているコーデックを含みます。
provisional: エントリーが暫定的かどうかを示すブール値。暫定エントリーは
変更または削除される場合があります。
文字列"callerProvidedTable"はtypeTablesに現れることがあり、このユース
ケースでは、グローバルに定義されていない
Type Tableが必要であることを示します。
現在のCBOR-LD Registryはこちらにあります。
エントリーを登録するには、READMEの手順に従ってください。このレジストリはW3C JSON-LD Community Groupが所有しています。
このアルゴリズムは、マップtypeTable、整数registryEntryId、および
JSON-LD
文書jsonldDocumentを入力として受け取り、16進文字列
cborldBytesを返します。
registryEntryIdを
5.6.1 CBOR
タグ構造取得アルゴリズムに渡した結果をprefixに設定する。
stateを空のマップに設定する。
registryEntryIdに関連付けられたレジストリエントリーがセマンティック
圧縮を必要とする場合:
state.strategyを"compression"に設定する。
state.typeTableをtypeTableに設定する。
state.registryEntryIdをregistryEntryIdに設定する。
stateを
5.2.1
変換アルゴリズムを初期化するに渡した結果に設定する。
stateと
jsonldDocumentを
inputDocumentとして5.2.2 文書変換アルゴリズムに渡した結果を
outputに設定する。
suffixをoutputのCBORエンコーディングに設定する。
suffixをjsonldDocumentのCBORエンコーディングに設定する。
prefixの前にsuffixを付加したものの16進エンコーディングを
cborldBytesに設定する。
cborldBytesを返す。
このアルゴリズムは、CBOR-LDペイロードcborldBytesを受け取り、JSON-LD文書
jsonldDocumentを返します。
state を空のマップに設定する。
cborldBytes を
5.6.2
レジストリエントリ
ID 取得アルゴリズムに渡した結果に result を設定する。
state.registryEntryId を
result.registryEntryId に設定し、suffix を
result.suffix に設定する。
state.registryEntryId に関連付けられたレジストリエントリが
セマンティック圧縮を使用する場合:
state.strategy を "decompression" に設定する。
registryEntryId に関連付けられた CBOR-LD Varint Registry Entry
内の typeTables 配列にある各エントリ
type: map について、そのエントリを
state.typeTable
に追加し、state.reverseTypeTable
内の type の値を inverseMap に設定する。ここで
inverseMap は、対応関係を反転した map である。
state を
5.2.1
変換初期化アルゴリズムに渡した結果に state を設定する。
suffix をバイト列からマップへ復号した結果に input を
設定する。
state と input を inputDocuments として
5.2.2
文書変換アルゴリズムに渡した結果に
jsonldDocument を設定する。
cborldBytes を解析した結果に jsonldDocument を設定する。
jsonldDocument を返す。
この節のアルゴリズムは、データ形式間で入力を抽象的に変換する「converter」の振る舞いを 説明します。この節で後述する"compression"および"decompression"戦略のような「strategy」と 組み合わせて使用すると、これらのアルゴリズムは具象データ形式間の変換としてインスタンス化できます。 "compression"戦略はJSON-LDからCBOR-LDへ変換し、"decompression" 戦略はCBOR-LDからJSON-LDへ変換します。
このアルゴリズムはマップstateを受け取り、返します。
stateを
5.4.1
コンテキストローダー初期化アルゴリズムに渡した結果に設定する。
termMapおよび
previousActiveContextを5.3.1 アクティブコンテキスト初期化アルゴリズムに
渡した結果をstate.initialActiveContextに設定する。
state.typesEncodedAsBytesを空の集合に設定する。
state.typesEncodedAsBytesに追加する。
stateを返す。
このアルゴリズムは、マップstateおよびマップまたは
マップの配列inputDocumentsを受け取り、マップstateとマップまたは
マップの配列outputMapsを含むマップを返します。
inputDocumentsが配列の場合、inputsを
inputDocumentsに設定する。そうでない場合、inputsを
[inputDocuments]に設定する。
outputMapsを空の配列に設定する。
inputs内のinputごとに:
outputを空のマップに設定する。
state、input、
output、および
state.initialActiveContextをactiveContextとして
5.2.3
汎用変換アルゴリズムに渡した結果をresultに設定する。
result.outputをoutputMapsに追加する。
stateをresult.stateに設定する。
inputDocumentsが配列の場合、outputMapsを返す。そうでない場合、
outputMapsの最初の要素を返す。
このアルゴリズムは、マップinput、output、state、および
activeContext
を入力として受け取り、マップstateおよびoutputを含むマップを返します。
state.strategyが"compression"に設定されている場合:
state、activeContext、input、および
outputを渡して
5.2.5.1 圧縮用コンテキスト変換アルゴリズム
を実行した結果をcontextConversionResultに設定する。
activeContextをcontextConversionResult.activeContextに、
output
をcontextConversionResult.outputに、stateを
contextConversionResult.stateに設定する。
state、
activeContext、input、およびoutputを渡して
5.2.6.1 展開用コンテキスト変換アルゴリズムを実行した結果である
resultの
result.activeContextをactiveContextに、result.stateを
stateに設定する。
state.strategyが"compression"に設定されている場合、
state、activeContext、input、および
outputを渡して
5.2.5.4
圧縮用オブジェクト型取得アルゴリズムを実行した結果である
resultについて、stateを
result.stateに、objectTypesをresult.objectTypesに設定する。
state、activeContext、input、および
outputを渡して5.2.6.4 展開用オブジェクト型取得
アルゴリズムを実行した結果であるresultについて、stateを
result.stateに、objectTypesを
result.objectTypesに設定する。
activeContextと
objectTypesを
5.3.4
型スコープ付きコンテキスト適用アルゴリズムに渡した結果を
activeContextに設定する。
state.strategyが"compression"に設定されている場合、
state、
input、およびactiveContextを渡して
5.2.5.3 圧縮用入力エントリー取得アルゴリズムを実行した結果である
resultについて、stateをresult.stateに、
termEntriesをresult.termEntriesに設定する。
state、input、output、および
activeContextを渡して
5.2.6.3 展開用入力エントリー取得アルゴリズムを
実行した結果であるresultについて、stateをresult.stateに、
outputを
result.outputに、termEntriesをresult.termEntriesに設定する。
termEntries内の[termInfo, value]ごとに:
termをtermInfo.termに設定する。
activeContextと
termを
5.3.3 プロパティスコープ付きコンテキスト適用アルゴリズムに
渡した結果をvalueActiveContextに設定する。
pluralをtermInfo.pluralの値に設定し、
termTypeを
termInfo.def内の@typeの値に設定する。
pluralがtrueに設定されている場合、valuesを
valueの値に設定する。そうでない場合、valuesを
valueの値を単一要素として含む配列に設定する。
outputsを空の配列に設定する。
values内のunconvertedValueごとに:
state、termType、unconvertedValue
をvalueとして、valueActiveContext
をactiveContextとして渡し、5.2.4 値変換アルゴリズムを
実行した結果をresultに設定する。
stateをresult.stateに設定し、
result.outputをoutputsに追加する。
pluralがtrueに設定されている場合、
outputValuesを
outputsに設定する。そうでない場合、outputValuesを
outputsの最初の要素に設定する。
state.strategyが"compression"に設定されている場合、
termInfo.termIdの値が
output内でoutputValuesにマップされるよう設定する。
そうでない場合、termInfo.termの値がoutput内で
outputValuesにマップされるよう設定する。
resultを空のマップに設定する。
result.stateをstateに、result.outputを
outputに設定する。
resultを返す。
このアルゴリズムは、マップstate、activeContext、termInfo、および
値valueとtermTypeを受け取ります。
これは、マップstateおよびoutputを含むresultオブジェクトを返します。
valueがnullの場合、nullを返す。
state.strategyが"compression"に設定されている場合、state、
termType、
termInfo、およびvalueを5.2.5.2
圧縮用値変換アルゴリズムに渡した結果をoutputに設定する。
state、
termType、
termInfo、およびvalueを5.2.6.2
展開用値変換アルゴリズムに渡した結果をoutputに設定する。
outputが定義されている場合、stateとoutputを含む
マップであるresultを返す。
valueが配列の場合:
outputsを空の配列に設定する。
valueの各elementについて:
activeContext、state、
termInfo、termType、およびelementを
valueとして渡し、5.2.4 値変換アルゴリズムを
実行した結果をresultとする。stateを
result.stateに設定し、
result.outputを
outputsに追加する。
resultを空のマップに設定する。result.state
をstateに、result.outputを
outputsに設定する。
resultを返す。
outputを空のマップに設定する。
state、
activeContext、valueをinputとして、およびoutputを渡し、
5.2.3
汎用変換アルゴリズムを実行した結果を
resultに設定する。
resultを返す。
この節のアルゴリズムは、前に定義した「conversion」アルゴリズムとともに使用して JSON-LDをCBOR-LDへ変換するための"compression"戦略を定義します。
このアルゴリズムは、マップstate、activeContext、input、
およびoutputを受け取り、
マップoutput、state、およびactiveContextを含む
マップresultを返します。
state、activeContext、およびinputを渡して
5.3.2
埋め込みコンテキスト適用アルゴリズムを実行した結果を
applyEmbeddedResultに設定する。
activeContextをapplyEmbeddedResult.activeContextに、
stateを
applyEmbeddedResult.stateに設定する。
inputに"@context"のエントリーがない場合:
resultを空のマップに設定する。
result.stateをstateに、
result.activeContextをactiveContextに設定する。
resultを返す。
contextをinput内の"@context"の値に設定する。
encodedContextsを空の配列に設定する。
contextが配列の場合、isArrayをtrueに、
contextsをcontextに設定する。
そうでない場合、isArrayをfalseに、contextsを
[context]に設定する。
contexts内のcontextValueごとに:
state.typeTableとcontextValueを渡して
5.5.1.1
コンテキストエンコーダー作成
を実行した結果をencoderDataに設定する。
encoderDataが空のマップの場合、contextValueを
encodedContextsに追加する。
encoderDataの値を
encodedContextsに追加する。
isArrayがtrueの場合、idをstate.keywordsMap内の
"@context"の値に1を加えた値に設定し、
output内のidの値をencodedContextsに設定する。
idをstate.keywordsMap内の"@context"の値に設定し、
output内の
idの値をencodedContextsの最初の要素に設定する。
result.outputをoutputに、result.stateを
stateに、result.activeContext
をactiveContextに設定する。
resultを返す。
このアルゴリズムは、マップstateおよびtermInfo、ならびに値
valueToEncodeおよびtermTypeを受け取り、
マップencoderDataを返します。
valueToEncodeがオブジェクトの場合、返る。
state、termInfo、valueToToEncode、および
termTypeを渡して5.5.2.1 値エンコーダー作成を
実行した結果をresultに設定する。
resultを返す。
このアルゴリズムは、マップstate、activeContext、および
inputを受け取り、マップstateおよび配列entriesを返します。
entriesを空の配列として初期化する。
keysを、辞書順にソートされたinputのキーに設定する。
keys内のkeyごとに:
keyが"@context"の場合、続行する。
valueをinput内のkeyの値に設定する。
valueが配列の場合、pluralをtrueに設定する。
そうでない場合、pluralをfalseに設定する。
keyに
state.termToId内のエントリーがない場合、
termIdを
keyに設定する。
pluralがtrueの場合、
termIdを
state.termToId内のkeyの値に1を加えた値に設定する。
termIdを
state.termToId内のkeyの値に設定する。
activeContext.termMapに
keyのエントリーがある場合、definitionを
activeContext.termMap内のkeyの値に設定する。
そうでない場合、
definitionを空のマップに設定する。
entryTermを新しいマップに設定する。
entryTerm内の"term"の値を
keyの値に設定する。termId、plural、および
definition
をentryTermに追加する。
entryTermおよび
valueを持つ配列entryを作成する。
entryをentriesに追加する。
entriesおよびstateを含むマップresultを返す。
このアルゴリズムは、マップactiveContextおよびinputを受け取り、集合
objectTypesを返します。
objectTypesを空の集合に設定する。
activeContext.typeTerms内のtermごとに:
termにinput内のエントリーがある場合:
typesを
input内のtermの値に設定する。
types内の各値をobjectTypesに追加する。
objectTypesを返す。
この節のアルゴリズムは、前に定義した「conversion」アルゴリズムとともに使用して CBOR-LDをJSON-LDへ変換するための"decompression"戦略を定義します。
このアルゴリズムは、マップstate、activeContext、input、
およびoutputを受け取り、
マップoutput、state、および
activeContextを含むマップ
resultを返します。
state.reverseTypeTableを渡して
5.5.1.3
コンテキストデコーダー作成を
実行した結果をdecoderDataに設定する。
contextTermIdを
state.keywordsMap内の"@context"の値に設定する。
contextTermIdにinput内のエントリーがある場合、
decoderDataと
input内のcontextTermIdの値をvalueとして
5.5.1.4
コンテキストをデコードするに
渡した結果をoutput内の"@context"の値に設定する。
contextTermIdPluralをcontextTermIdの値に1を加えた値に設定する。
contextTermIdPluralにinput内のエントリーがある場合:
contextTermIdにもinput内のエントリーがあった場合、
ERR_INVALID_ENCODED_CONTEXTエラーを投げる。
encodedContextsをinput内のcontextTermIdPlural
の値に設定する。encodedContextsが
配列でない場合、ERR_INVALID_ENCODED_CONTEXTエラーを投げる。
contextsを空の配列に設定する。
encodedContexts内の各valueToDecodeについて、
decoderDataとvalueToDecode
をvalueとして5.5.1.4 コンテキストをデコードするに渡した結果を
contextsに追加する。
output内の"@context"の値をcontextsに設定する。
activeContext、outputをinputとして、および
stateを渡し、
5.3.2
埋め込みコンテキスト適用アルゴリズムを実行した結果を
embeddedContextResultに設定する。
resultを空のマップに設定する。
result.stateを
embeddedContextResult.stateに、result.activeContext
を
embeddedContextResult.activeContextに設定する。
resultを返す。
このアルゴリズムは、マップstateおよびtermInfo、ならびに値
termTypeとvalueToDecodeを受け取り、値
decodedValueを返します。
valueがマップの場合、返る。
valueToDecode、
state、termInfo、およびtermTypeを渡して
5.5.2.3
値デコーダー作成を実行した結果を
decoderDataに設定する。
decoderDataを渡して5.5.2.4 値をデコードするを実行した結果を
decodedValueに設定する。
decodedValueを返す。
このアルゴリズムは、マップstate、activeContext、および
inputを受け取り、マップstateおよび配列
entriesを返します。
entriesを空の配列に初期化する。
input内のキー値ペアkeyおよびvalueごとに:
keyが
state.keywordsMap内の"@context"の値、またはその値に1を加えた値である場合、
続行する。
keyが文字列の場合、pluralをfalseに、
termをkeyに設定する。
keyが奇数の場合、pluralをtrueに設定する。そうでない場合、
pluralをfalseに設定する。
pluralがtrueの場合、termを
state.idToTerm内の
idから1を引いた値に設定する。
その値にエントリーがない場合、エラー
ERR_UNKNOWN_CBORLD_TERM_IDを投げる。
termを
state.idToTerm内のidの値に設定する。
その値にエントリーがない場合、エラーERR_UNKNOWN_CBORLD_TERM_IDを投げる。
definitionを
activeContext.termMap内のtermの値に設定する。
entryTermを新しいマップに設定する。
entryTerm内の"termId"の値を
keyの値に設定する。term、plural、および
definition
をentryTermに追加する。
entryTermおよび
valueを持つ配列entryを作成する。
entryをentriesに追加する。
entries内の各要素のtermの値でentriesをソートする。
entriesおよびstateを含むマップresultを返す。
このアルゴリズムは、マップstate、activeContext、inputを
入力として受け取り、
マップstateおよび集合objectTypesを返します。
objectTypesを空の集合に設定する。
activeContext.typeTerms内のtermごとに:
termに
state.termToId内のエントリーがない場合、
termIdを
termに設定する。
termIdを
state.termToId内のtermの値に設定する。
termIdもtermIdに1を加えた値も
input内に存在しない場合、続行する。
termIdがinput内に存在する場合、
valueをinput内のtermIdの値に設定する。
valueをinput内のtermIdに1を加えた値の値に設定する。
keyが文字列の場合、pluralをfalseに、
termをkeyに設定する。
keyが奇数の場合、pluralをtrueに設定する。そうでない場合、
pluralをfalseに設定する。
pluralがtrueの場合、termを
state.idToTerm内の
idから1を引いた値に設定する。
その値にエントリーがない場合、エラー
ERR_UNKNOWN_CBORLD_TERM_IDを投げる。
termを
state.idToTerm内のidの値に設定する。
その値にエントリーがない場合、エラーERR_UNKNOWN_CBORLD_TERM_IDを投げる。
definitionを
activeContext.termMap内のtermの値に設定する。
termInfoを新しいマップに設定する。
term、termId、plural、および
definitionをtermInfoに追加する。
valueが配列でない場合、valuesをvalueを
単一要素として含む配列に設定する。
そうでない場合、valuesをvalueの値に設定する。
values内の各valueについて:
value、
termInfo、state、および"@vocab"を
termTypeとして渡して
5.5.2.3
値デコーダー作成を実行した結果をdecoderDataに設定する。
decoderDataが存在する場合、decoderDataを渡して
5.5.2.4
値をデコードするを実行した結果を
`objectTypesに追加する。
valueをobjectTypesに追加する。
objectTypesを返す。
この節のアルゴリズムは、圧縮または展開の任意の時点で、JSON-LD 文書に関連付けられたコンテキスト文書のどの構成要素が使用されているかを 判断する方法を説明します。これらのアルゴリズムには、CBOR-LDで埋め込みコンテキスト、 型スコープ付きコンテキスト、およびプロパティスコープ付きコンテキストを適用する方法が含まれます。 これは、この仕様で後に定義されるContext Loadingアルゴリズムとは対照的です。Context Loadingアルゴリズムは、CBOR-LD 圧縮技法の中核である、用語から整数へのマッピングを構築する方法を説明します。 Active Context ProcessingアルゴリズムとContext Loadingアルゴリズムを合わせることで、CBOR-LDとの間で変換する際に JSON-LDコンテキスト文書をどのように処理すべきかを規定します。
このアルゴリズムは、マップpreviousActiveContextおよびtermMapを受け取り、
マップactiveContextを返します。これは使用中のアクティブコンテキストを更新し、
'@type'のすべてのエイリアスを見つけます。
activeContextを新しいマップに設定する。
activeContext.previousActiveContextをpreviousActiveContextに設定する。
activeContext.termMapをtermMapに設定する。
activeContext.typeTermsを配列['@type']に設定する。
termMap内の[term, def]ごとに:
def内の"@id"の値が"@type"である場合、termを
activeContext.typeTermsに追加する。
activeContextを返す。
このアルゴリズムは、マップstate、activeContext、およびinputを
入力として受け取り、
マップstateおよびactiveContextを含むマップresultを返します。
state、
activeContext.termMapを
activeTermMapとして、またinput内の'@context'の値を
contextsとして
5.3.5 用語
マップ更新アルゴリズムに渡した結果をtermMapUpdateResultに設定する。
stateをtermMapUpdateResult.stateに設定する。
termMapをtermMapUpdateResult.activeTermMapに設定する。
termMapとactiveContextを
previousActiveContextとして渡し、
5.3.1
アクティブコンテキスト初期化アルゴリズムを実行した結果を
newActiveContextに設定する。
resultを新しいマップに設定し、result.activeContextを
newActiveContextに、
result.stateをstateに設定する。
resultを返す。
このアルゴリズムは、マップstate、activeContext、および文字列
termを入力として受け取り、
マップstateおよびactiveContextを含むマップresultを返します。
activeContextを渡して5.3.6 用語マップ復元アルゴリズムを
実行した結果をrevertedTermMapに設定する。
termDefを
activeContext.termMap内のtermの値に設定する。contextsを
termDef内の"@context"の値に設定する。
state、
revertedTermMapを
activeTermMapとして、trueをpropertyScopeとして、および
contextsを
5.3.5 用語
マップ更新アルゴリズムに渡した結果をtermMapUpdateResultに設定する。
stateをtermMapUpdateResult.stateに設定する。
termMapをtermMapUpdateResult.activeTermMapに設定する。
termMapとactiveContextを
previousActiveContextとして渡し、
5.3.1
アクティブコンテキスト初期化アルゴリズムを実行した結果を
newActiveContextに設定する。
resultを新しいマップに設定し、result.activeContextを
newActiveContextに、
result.stateをstateに設定する。
resultを返す。
このアルゴリズムは、マップstate、activeContext、および集合
objectTypesを入力として受け取り、
マップstateおよびactiveContextを含むマップresultを返します。
objectTypesSortedを空の配列に設定する。
objectTypesの要素を辞書順にソートし、その要素を順に
objectTypesSortedに追加する。
newTermMapをactiveContext.termMapに設定する。
objectTypesSorted内のtypeごとに:
typeDefをnewTermMap内のtypeの値に設定する。
contextsを
typeDef内の"@context"の値に設定する。
state、
newTermMapを
activeTermMapとして、contexts、およびtrueを
typeScopeとして
5.3.5
用語マップ更新アルゴリズムに渡した結果をtermMapUpdateResultに設定する。
stateをtermMapUpdateResult.stateに設定し、
newTermMapを
termMapUpdateResult.activeTermMapに設定する。
newTermMapをtermMapとして、activeContextを
previousActiveContextとして渡し、
5.3.1
アクティブコンテキスト初期化アルゴリズムを実行した結果を
newActiveContextに設定する。
resultを新しいマップに設定し、result.activeContextを
newActiveContextに、
result.stateをstateに設定する。
resultを返す。
このアルゴリズムは、マップstate、activeTermMap、およびマップまたは配列
contexts、ならびにブール値typeScope
とpropertyScopeを入力として受け取ります。これらはいずれも、指定されない場合は
falseを既定値とします。これはマップstate
およびactiveTermMapを返します。
contextsが配列でない場合、contextsを、以前のcontextsの値を
唯一の要素として持つ配列に設定する。
allowProtectedOverrideをpropertyScopeの値に設定する。
propagateDefaultをtypeScopeの値の否定に設定する。
contexts内のcontextIdentifierごとに:
stateおよび
contextIdentifierを渡して5.4.2 コンテキスト読み込みアルゴリズムを
実行した結果をloadResultに設定する。
entryをloadResult.entryに、
contextをentry.contextに、state
をloadResult.stateに設定する。
@propagateがcontext内に現れる場合、propagate
をcontext内の@propagateの値に設定する。
そうでない場合、propagateをpropagateDefaultの値に設定する。
newTermMapを空のマップに設定する。entry.termMap内の
[key,
value]ごとに:
valueの内容を新しいマップ
newValueに浅くコピーし、propagate
をnewValueに追加する。
newTermMap内のkeyの値を
newValueに設定する。
activeTermMap内の[term, activeDef]ごとに:
defを
newTermMap内のtermの値とする。
defが定義されている場合:
activeDef内のprotectedの値が
trueである場合:
allowProtectedOverrideが
falseに設定され、かつdefが
activeDefと同一でない場合、
エラーERR_PROTECTED_TERM_REDEFINITIONを投げる。
newTermMap内のtermの値を、
activeDefからの値と、
def.propagateの値に設定された
propagateを含むマップに設定する。
termがcontext内に現れる場合、
newTermMap内のtermの値を
activeDefからのすべての値を含むマップに設定する。
activeTermMapの値をnewTermMapの値に設定する。
resultを空のマップに設定する。
result.stateをstateに、
result.activeTermMapをactiveTermMapに設定する。
resultを返す。
このアルゴリズムは、マップactiveContextを入力として受け取り、マップ
newTermMapを返します。
newTermMapを空のマップに設定する。
nonPropagatingTermsを空の配列に設定する。
activeContext内の[term, def]ごとに:
def.propagateがfalseに設定されている場合、
termを
nonPropagatingTermsに追加し、このループの次の反復に進む。
newTermMap内のtermの値を
defに設定する。
nonPropagatingTerms内のtermごとに:
currentContextをactiveContext.previousActiveContextに設定する。
defを
currentContext.termMap内のtermの値に設定する。
defがundefinedでなく、def.propagateが
falseに設定されている間:
currentContextを
activeContext.previousActiveContextに設定する。
defを
currentContext.termMap内のtermの値に設定する。
defがundefinedでない場合、newTermMap内のtermの値を
defに設定する。
newTermMapを返す。
この節のアルゴリズムは、CBOR-LD圧縮技法の中核として使用される、 用語と整数の間のマッピングを構築する方法を定義します。
このアルゴリズムはマップstateを受け取り、返します。
state.contextMapを新しいマップに設定する。
state.nextTermIdを100に設定する。
state.keywordsMapを、JSON-LDキーワードから関連付けられた
整数値への次のマップに設定する:
{
'@context' => 0,
'@type' => 2,
'@id' => 4,
'@value' => 6,
'@direction' => 8,
'@graph' => 10,
'@included' => 12,
'@index' => 14,
'@json' => 16,
'@language' => 18,
'@list' => 20,
'@nest' => 22,
'@reverse' => 24,
'@base' => 26,
'@container' => 28,
'@default' => 30,
'@embed' => 32,
'@explicit' => 34,
'@none' => 36,
'@omitDefault' => 38,
'@prefix' => 40,
'@preserve' => 42,
'@protected' => 44,
'@requireAll' => 46,
'@set' => 48,
'@version' => 50,
'@vocab' => 52,
'@propagate' => 54
}
state.keywordsMap内の各エントリーをstate.termToIdに追加する。
state.strategyが"decompression"に設定されている場合、
state.idToTermを
state.termToIdの逆マップ(すなわち、整数からJSON-LDキーワードへのマップ)に設定する。
stateを返す。
このアルゴリズムは、マップstateとコンテキストマップまたはURL
contextIdentifierを受け取り、
マップstateおよびentryを含むマップである
resultを返します。
state.contextMapにcontextIdentifierのエントリーがある場合:
resultを空のマップに初期化する。
result.stateをstateに設定する。
result.entryを
state.contextMap内のcontextIdentifierの値に設定する。
resultを返す。
contextが文字列の場合:
contextを
そのオブジェクト内の"@context"の値に設定する。
contextUrlをcontextIdentifierの値に設定する。
contextをcontextIdentifierに設定する。
state、context、および設定されている場合はcontextUrlを渡して
5.4.3
コンテキスト追加アルゴリズムを実行した結果を
resultに設定する。
resultを返す。
このアルゴリズムは、マップstate、コンテキストオブジェクトcontext、およびコンテキスト
URLcontextUrlを受け取り、
マップstateおよびentryを含むマップであるresultを返します。
contextに"@import"エントリーがある場合:
importUrlを`context内の"@import"の値に設定する。
state.contextMapにimportUrlのエントリーがない場合:
importUrlに関連付けられたコンテキストオブジェクトを取得し、
importContextをそのオブジェクト内の
"@context"の値に設定する。
state、importContextをcontextとして、
およびimportUrlをcontextUrlとして渡して
5.4.3
コンテキスト追加アルゴリズムを実行した結果を
importedContextAdditionResultに設定する。
stateをimportedContextAdditionResult.stateに、
importEntryを
importedContextAdditionResult.entryに設定する。
importEntryを
state.contextMap内のimportUrlの値に設定する。
contextを、contextからのすべてのエントリーと
importEntry.contextを含むマップに設定する。
termMapを空のマップに設定する。
entryを、contextおよびtermMapを含むオブジェクトに設定する。
sortedTermsを、context内のキーを辞書順にソートした結果に設定する。
context内のエントリーがある場合、isProtectedを
trueに、そうでない場合はfalseに設定する。
sortedTerms内のtermごとに:
termにstate.keywordsMap内のエントリーがある場合、このループの
次の反復に進む。
definitionをcontext内のtermの値に設定する。
definitionがnullの場合、この
ループの次の反復に進む。
definitionが文字列の場合:
newDefinitionを空のマップに設定する。
newDefinition内の"@id"の値をdefinitionに設定する。
definitionの値をnewDefinitionに設定する。
definition内のprotectedの値を
isProtectedに設定する。
termMap内のtermの値をdefinitionに設定する。
termにstate.termToId内のエントリーがない場合:
termIdをstate.nextTermIdに設定する。
state.nextTermIdを2増やす。
state.termToId内のtermの値を
termIdに設定する。
state.idToTerm内のtermIdの値を
termに設定する。
contextUrlが定義されている場合、
state.contextMap内のcontextUrlの値をentryに設定する。
state.contextMap内のcontextの値
をentryに設定する。
resultを空のマップに設定する。
result.stateをstateに、result.entryを
entryに設定する。
resultを返す。
この節のコーデックは、JSON-LD内の個々の値をCBORへ、またその逆へどのように変換すべきかを 正確に規定します。これらは前節のアルゴリズムで使用され、CBOR-LDがプリミティブ型と 非プリミティブ型の両方をCBORとして効率的に エンコードできるようにします。
このアルゴリズムは、マップtypeTableおよび値contextValueを受け取り、
マップencoderDataを返します。
encoderDataを空のマップに初期化する。
contextValueが文字列でない場合、返る。
contextTableを
typeTable内の"context"の値に設定する。
encoderData.contextをcontextValueに、
encoderData.contextTableを
contextTableに設定する。
encoderDataを返す。
このアルゴリズムはマップencoderDataを受け取り、CBORバイナリデータを返します。
encoderData.contextに
encoderData.contextTable内のエントリーがある場合、
encoderData内のencoderData.contextの値を
Major Type 0(符号なし整数)オブジェクトとしてCBORエンコードしたものを返す。
encoderData.contextの値をMajor Type 3
(テキスト文字列)オブジェクトとしてCBORエンコードしたものを返す。
このアルゴリズムはマップreverseTypeTableを受け取り、
マップencoderDataを返します。
reverseContextTableを
reverseTypeTable内の"context"の値に設定する。
decoderDataを空のマップに初期化する。
decoderData.reverseContextTableを
reverseContextTableの値に設定し、
decoderDataを返す。
このアルゴリズムは、マップdecoderDataおよび値valueを受け取り、
値を返します。
valueが数値でない場合、valueを返す。
decoderData.reverseContextTableに
valueのエントリーがある場合、
そのエントリーの値を返す。
このアルゴリズムは、マップstateおよびtermInfo、ならびに値
termTypeおよびvalueToEncodeを受け取り、マップencoderData
またはvalueToEncodeを返します。
isUrlをfalseに設定する。
termInfo.termが"@id"または"@type"の場合、isUrlを
trueに設定する。
termInfo.def内の"@id"の値が"@id"または"@type"である場合、
isUrlをtrueに設定する。
termTypeが"@id"または"@vocab"である場合、isUrlをtrueに設定する。
isUrlがtrueである場合、tableTypeを"url"に設定する。
termTypeが定義されている場合、tableTypeを
termTypeに設定する。
tableTypeを"none"に設定する。
state.typeTableにtableTypeのエントリーがある場合:
subTableを
state.typeTable内のtableTypeの値に設定する。
subTableにvalueToEncodeのエントリーがある場合:
intValueを
subTable内のvalueToEncodeの値に設定する。
includeSignをfalseに設定する。
state.typesEncodedAsBytesに
tableTypeのエントリーがある場合、convertToBytesを
trueに設定する。
そうでない場合、convertToBytesをfalseに設定する。
tableTypeが"none"でなく、valueToEncodeが
整数である場合:
intValueをvalueToEncodeの値に設定する。
convertToBytesおよびincludeSignを
trueに設定する。
intValueが定義されている場合:
encoderDataを空のマップに初期化する。
encoderData.intValueを
intValueの値に、encoderData.convertToBytes
を
convertToBytesの値に、
encoderData.includeSignを
includeSignの値に設定する。
encoderDataを返す。
tableTypeにstate.processingModeTypeEncoders内のエントリーがある場合、
encoderDataを、そのエントリーのコーデックに関連付けられた
Create Encoderアルゴリズムを呼び出した結果に設定する。
encoderDataが定義されている場合、encoderDataを返す。
valueToEncodeを返す。
このアルゴリズムはマップencoderDataを受け取り、CBORバイナリデータを返します。
encoderData.convertToBytesがtrueである場合:
intValueをバイトに変換した結果をbytesに設定する。
このとき、includeSignの値を使用して、
整数のバイナリ表現が符号付きか符号なしかを判断する。
bytesをMajor Type 2(バイト文字列)オブジェクトとしてCBORエンコードしたものを返す。
intValueをMajor Type 0(符号なし
整数)オブジェクトとしてCBORエンコードしたものを返す。
このアルゴリズムは、マップstateおよびtermInfo、ならびに値
termTypeおよびvalueToDecodeを受け取り、マップ
decoderDataを返します。
isUrlをfalseに設定する。
termInfo.termが"@id"または"@type"の場合、isUrlを
trueに設定する。
termInfo.def内の"@id"の値が"@id"または"@type"である場合、
isUrlをtrueに設定する。
termTypeが"@id"または"@vocab"である場合、isUrlをtrueに設定する。
isUrlがtrueである場合、tableTypeを"url"に設定する。
termTypeが定義されている場合、tableTypeを
termTypeに設定する。
tableTypeを"none"に設定する。
state.reverseTypeTableにtableTypeのエントリーがある場合:
subTableを
state.reverseTypeTable内のtableTypeの値に設定する。
useTableをfalseに設定する。
valueToDecodeがバイト配列であり、
state.typesEncodedAsBytesに
tableTypeのエントリーがある場合:
useTableをtrueに設定する。
intValueを、
valueToDecodeバイトの符号なし整数変換に設定する。
valueToDecodeが整数であり、
state.typesEncodedAsBytesに
tableTypeのエントリーがない場合:
useTableをtrueに設定する。
intValueをvalueToDecodeに設定する。
useTableがtrueである場合:
intValueがsubTable内にない場合、エラー
ERR_UNKNOWN_COMPRESSED_VALUEを投げる。
decodedを
subTable内のintValueの値に設定する。
valueToDecodeがバイト配列であり、tableType
が"none"でない場合、
decodedをvalueToDecodeの整数変換に設定する。
decodedが定義されている場合、decoderDataを空の
マップに初期化し、decoderData.decodedを
decodedの値に設定し、decoderDataを返す。
tableTypeにstate.processingModeTypeDecoders内のエントリーがある場合、
DecoderDataを、そのエントリーのコーデックに関連付けられた
Create Decoderアルゴリズムを呼び出した結果に設定する。
decoderDataが定義されている場合、decoderDataを返す。
valueToDecodeが配列でない場合、
decoderDataを空のマップに初期化し、
decoderData.decodedをvalueToDecodeに設定し、
decoderDataを返す。
このアルゴリズムはマップdecoderDataを受け取り、値を返します。
decoderData.decodedを返す。
registryEntryIdを入力として受け取り、バイト文字列
prefixを返します。
registryEntryBytesをregistryEntryIDのCBORエンコーディングに設定する。
prefixを、registryEntryBytesをバイト文字列
0xD9CB1D82の末尾に追加した結果に設定する。
prefixを返す。
このアルゴリズムは、エンコードされたCBOR-LDペイロードcborldBytesを入力として受け取り、
デコードされる主データであるsuffix、およびsuffixを展開するために使用すべき
registryEntryId値を返します。
cborldbytes上のCBORタグが0xCB1D(タグ値51997)でない場合、
ERR_NON_CBOR_LD_TAGエラーを投げる。
ERR_INVALID_PAYLOAD_STRUCTUREエラーを投げる。
registryEntryIdの値を、タグ付き配列のインデックス0にある整数の値に設定する。
suffixの値を、配列の2番目の要素の値に設定する。
resultを空のマップに設定する。
result.suffixをsuffixの値に、
result.registryEntryIdを
registryEntryIdの値に設定する。
resultを返す。
この節は非規範的です。
この節は非規範的です。
この節は非規範的です。
この仕様は、消費者がCBOR-LDペイロードを識別できるようにするためのCBORタグを登録します。 以下は暫定的なものであり、まだIANAによって批准されていません。
タグ: 51997
レジストリ: https://www.iana.org/assignments/cbor-tags/cbor-tags.xhtml
データ項目: 配列
セマンティクス: タグ値51997は、ペイロードがCBOR-LDであることを示します。
セマンティクスの説明: https://w3c.github.io/cbor-ld/#cbor-tags-for-cbor-ld
連絡先: Wesley Smith (wsmith@digitalbazaar.com)