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는 기본적으로 "tag" 기능을 통해 이를 지원합니다 — 이진 데이터의 나머지 부분을 전역 레지스트리를 통해 설명하는 헤더 값입니다.
CBOR 태그 0xCB1D(태그 값 51997)는 CBOR-LD에 사용되도록
IANA
CBOR 태그 레지스트리에 등록되었습니다. 이 태그 값 바로 뒤에 오는 데이터는
압축된 페이로드를 만드는 데 사용된 레지스트리 항목을 식별합니다.
CBOR-LD 페이로드는 태그 0xCB1D가 붙은 항목이
두 요소 배열이 되도록 구조화되어야 MUST 하며,
첫 번째 요소는
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이 소유합니다.
이 알고리즘은 map typeTable, 정수 registryEntryId, 그리고
JSON-LD
문서 jsonldDocument를 입력으로 받아, 16진수 문자열
cborldBytes를 반환합니다.
registryEntryId를
5.6.1 CBOR
태그 구조 가져오기 알고리즘에 전달한 결과로 prefix를 설정합니다.
state를 빈 map으로 설정합니다.
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 인코딩으로 설정합니다.
cborldBytes를 prefix를 앞에 붙인
suffix의 16진수 인코딩으로 설정합니다.
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 레지스트리 항목의
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로 변환합니다.
이 알고리즘은 map state를 받고 반환합니다.
state를
5.4.1
컨텍스트 로더 알고리즘 초기화에 전달한 결과로 설정합니다.
termMap과
previousActiveContext를 5.3.1 활성 컨텍스트 알고리즘 초기화에 전달한 결과로
state.initialActiveContext를 설정합니다.
state.typesEncodedAsBytes를 빈 set으로 설정합니다.
state.typesEncodedAsBytes에 추가합니다.
state를 반환합니다.
이 알고리즘은 map state와 map 또는
map 배열 inputDocuments를 입력으로 받아, map state와 map 또는
map 배열 outputMaps를 포함하는 map을 반환합니다.
inputDocuments가 배열이면, inputs를
inputDocuments로 설정합니다. 그렇지 않으면, inputs를
[inputDocuments]로 설정합니다.
outputMaps를 빈 배열로 설정합니다.
inputs 안의 input마다:
output을 빈 map으로 설정합니다.
state, input,
output, 그리고
state.initialActiveContext를 activeContext로
5.2.3
일반 변환 알고리즘에 전달한 결과로 result를 설정합니다.
result.output을 outputMaps에 추가합니다.
state를 result.state로 설정합니다.
inputDocuments가 배열이면 outputMaps를 반환합니다. 그렇지 않으면,
outputMaps의 첫 번째 요소를 반환합니다.
이 알고리즘은 map input, output, state, 그리고
activeContext를
입력으로 받아, map state와 output을 포함하는 map을 반환합니다.
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를 result.state로, objectTypes를
result.objectTypes로 설정합니다.
여기서 result는 state, activeContext,
input, 그리고
output을 전달하여 5.2.6.4 압축 해제를 위한 객체 유형 가져오기
알고리즘에서 나온 결과입니다.
activeContext와
objectTypes를
5.3.4
유형 범위 컨텍스트 적용 알고리즘에 전달한 결과로 activeContext를 설정합니다.
state.strategy가 "compression"으로 설정되어 있으면,
state,
input, 그리고 activeContext를 전달하여
5.2.5.3 압축을 위한 입력 항목 가져오기 알고리즘에서 나온
result에 대해 state를 result.state로,
termEntries를 result.termEntries로 설정합니다.
state를 result.state로, output을
result.output으로,
그리고 termEntries를 result.termEntries로 설정합니다.
여기서 result는
state, input, output, 그리고 activeContext를 전달하여
5.2.6.3 압축 해제를 위한 입력 항목 가져오기 알고리즘에서 나온
결과입니다.
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의 값을 outputValues로
output에서 매핑하도록 설정합니다.
result를 빈 map으로 설정합니다.
result.state를 state로, result.output을
output으로 설정합니다.
result를 반환합니다.
이 알고리즘은 map state, activeContext, termInfo와
값 value 및 termType을 받습니다.
map 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을 포함하는 map인 result를 반환합니다.
value가 배열이면:
outputs를 빈 배열로 설정합니다.
value의 각 element마다:
activeContext, state,
termInfo, termType, 그리고 element를
value로 전달하여 5.2.4 값 변환 알고리즘의
결과를 result라 합니다. state를
result.state로 설정하고
result.output을
outputs에 추가합니다.
result를 빈 map으로 설정합니다. result.state를
state로, result.output을
outputs로 설정합니다.
result를 반환합니다.
output을 빈 map으로 설정합니다.
state,
activeContext, value를 input으로, 그리고 output을
전달하여
5.2.3 일반 변환
알고리즘의 결과로
result를 설정합니다.
result를 반환합니다.
이 절의 알고리즘은 앞서 정의한 "conversion" 알고리즘과 함께 사용되어 JSON-LD를 CBOR-LD로 변환하는 "compression" 전략을 정의합니다.
이 알고리즘은 map state, activeContext, input,
그리고 output을
입력으로 받아, map output, state, 그리고
activeContext를 포함하는 map result를 반환합니다.
state, activeContext, 그리고 input을 전달하여
5.3.2
임베디드 컨텍스트 적용 알고리즘의 결과로 applyEmbeddedResult를 설정합니다.
activeContext를 applyEmbeddedResult.activeContext로,
state를
applyEmbeddedResult.state로 설정합니다.
input에 항목을 가지고 있지 않으면:
result를 빈 map으로 설정합니다.
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가 빈 map이면, 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를 반환합니다.
이 알고리즘은 map state 및 termInfo, 그리고 값
valueToEncode 및 termType을
입력으로 받아 map encoderData를 반환합니다.
valueToEncode가 객체이면, 반환합니다.
state, termInfo,
valueToToEncode, 그리고
termType을 전달하여 5.5.2.1 값 인코더 생성의 결과로
result를 설정합니다.
result를 반환합니다.
이 알고리즘은 map state, activeContext, 그리고
input을 입력으로 받아 map state와 배열 entries를 반환합니다.
entries를 빈 배열로 초기화합니다.
input의 키들을 사전순으로 정렬한 배열 keys를 설정합니다.
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을 빈 map으로 설정합니다.
entryTerm을 새 map으로 설정합니다.
entryTerm 안의 "term" 값을
key의 값으로 설정합니다. termId, plural, 그리고
definition을
entryTerm에 추가합니다.
entryTerm과
value라는 두 요소를 가진 배열 entry를 생성합니다.
entry를 entries에 추가합니다.
entries와 state를 포함하는 map result를 반환합니다.
이 알고리즘은 map activeContext와 input을 입력으로 받아 set
objectTypes를 반환합니다.
objectTypes를 빈 set으로 설정합니다.
activeContext.typeTerms 안의 term마다:
term이 input에 항목을 가지고 있으면:
types를
input 안의 term 값으로 설정합니다.
types의 각 값을 objectTypes에 추가합니다.
objectTypes를 반환합니다.
이 절의 알고리즘은 앞서 정의한 "conversion" 알고리즘과 함께 사용되어 CBOR-LD를 JSON-LD로 변환하는 "decompression" 전략을 정의합니다.
이 알고리즘은 map state, activeContext, input,
그리고 output을 입력으로 받아,
map output, state, 그리고
activeContext를 포함하는 map
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를 빈 map으로 설정합니다.
result.state를
embeddedContextResult.state로, result.activeContext를
embeddedContextResult.activeContext로 설정합니다.
result를 반환합니다.
이 알고리즘은 map state 및 termInfo, 그리고 값
termType 및 valueToDecode를 입력으로 받아 값
decodedValue를 반환합니다.
value가 map이면, 반환합니다.
valueToDecode,
state, termInfo, 그리고 termType을 전달하여
5.5.2.3 값 디코더
생성의 결과로
decoderData를 설정합니다.
decoderData를 전달하여 5.5.2.4 값 디코딩의 결과로 decodedValue를 설정합니다.
decodedValue를 반환합니다.
이 알고리즘은 map state, activeContext, 그리고
input을 입력으로 받아 map 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을 새 map으로 설정합니다.
entryTerm 안의 "termId" 값을
key의 값으로 설정합니다. term, plural, 그리고
definition을
entryTerm에 추가합니다.
entryTerm과
value라는 두 요소를 가진 배열 entry를 생성합니다.
entry를 entries에 추가합니다.
entries의 각 요소 안의 term 값을 기준으로
entries를 정렬합니다.
entries와 state를 포함하는 map result를 반환합니다.
이 알고리즘은 map state, activeContext, input을
입력으로 받아
map state와 set objectTypes를 반환합니다.
objectTypes를 빈 set으로 설정합니다.
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를 새 map으로 설정합니다.
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에서 임베디드, 유형 범위, 그리고 속성 범위 컨텍스트를 적용하는 방법이 포함됩니다. 이는 이 명세의 뒤에서 정의되는 컨텍스트 로딩 알고리즘과 대비되며, 해당 알고리즘은 CBOR-LD 압축 기법의 핵심인 용어에서 정수로의 매핑을 구성하는 방법을 설명합니다. 함께 볼 때, 활성 컨텍스트 처리와 컨텍스트 로딩 알고리즘은 CBOR-LD로 변환하거나 CBOR-LD에서 변환할 때 JSON-LD 컨텍스트 문서를 어떻게 처리해야 하는지 명시합니다.
이 알고리즘은 map previousActiveContext와 termMap을
입력으로 받아, map activeContext를 반환합니다. 이는 사용 중인 활성 컨텍스트를
갱신하고 '@type'의 모든 별칭을 찾습니다.
activeContext를 새 map으로 설정합니다.
activeContext.previousActiveContext를 previousActiveContext로 설정합니다.
activeContext.termMap을 termMap으로 설정합니다.
activeContext.typeTerms를 배열 ['@type']로 설정합니다.
termMap 안의 [term, def]마다:
def 안의 "@id" 값이 "@type"이면, term을
activeContext.typeTerms에 추가합니다.
activeContext를 반환합니다.
이 알고리즘은 map state, activeContext, 그리고 input을
입력으로 받아,
map state와 activeContext를 포함하는 map 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를 새 map으로 설정하고, result.activeContext를
newActiveContext로,
result.state를 state로 설정합니다.
result를 반환합니다.
이 알고리즘은 map state, activeContext, 그리고 문자열
term을 입력으로 받아,
map state와 activeContext를 포함하는 map 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를 새 map으로 설정하고, result.activeContext를
newActiveContext로,
result.state를 state로 설정합니다.
result를 반환합니다.
이 알고리즘은 map state, activeContext ,그리고 set
objectTypes를 입력으로 받아,
map state와 activeContext를 포함하는 map 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를 새 map으로 설정하고, result.activeContext를
newActiveContext로,
result.state를 state로 설정합니다.
result를 반환합니다.
이 알고리즘은 map state, activeTermMap, 그리고 map 또는 배열
contexts와 함께 불리언 typeScope 및
propertyScope를 입력으로 받습니다. 둘 다 제공되지 않은 경우 기본값은
false입니다. 이는 map 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을 빈 map으로 설정합니다. entry.termMap 안의
[key,
value]마다:
value의 내용을 얕게 복사하여 새 map
newValue에 넣고, propagate를
newValue에 추가합니다.
newTermMap 안의 key 값을
newValue로 설정합니다.
activeTermMap 안의 [term, activeDef]마다:
newTermMap 안의 term 값을 def라 합니다.
def가 정의되어 있으면:
activeDef 안의 protected 값이
true이면:
allowProtectedOverride가
false로 설정되어 있고 def가
activeDef와 동일하지 않으면,
오류 ERR_PROTECTED_TERM_REDEFINITION을 던집니다.
newTermMap 안의 term 값을
activeDef의 값과
def.propagate 값으로 설정된
propagate를 포함하는 map으로 설정합니다.
term이 context에 나타나면,
newTermMap 안의 term 값을
activeDef의 모든 값을 포함하는 map으로 설정합니다.
activeTermMap의 값을 newTermMap의 값으로 설정합니다.
result를 빈 map으로 설정합니다.
result.state를 state로,
result.activeTermMap을 activeTermMap으로 설정합니다.
result를 반환합니다.
이 알고리즘은 map activeContext를 입력으로 받아, map
newTermMap을 반환합니다.
newTermMap을 빈 map으로 설정합니다.
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 압축 기법의 핵심으로 사용되는 용어와 정수 사이의 매핑을 구성하는 방법을 정의합니다.
이 알고리즘은 map state를 받고 반환합니다.
state.contextMap을 새 map으로 설정합니다.
state.nextTermId를 100으로 설정합니다.
state.keywordsMap을 JSON-LD 키워드에서 해당 정수 값으로의
다음 map으로 설정합니다.
{
'@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의 역방향 map
(즉, 정수에서 JSON-LD 키워드로의 map)으로 설정합니다.
state를 반환합니다.
이 알고리즘은 map state와 context map 또는 URL
contextIdentifier를 받아,
map state와 entry를 포함하는 map인
result를 반환합니다.
state.contextMap이 contextIdentifier에 대한 항목을 가지고 있으면:
result를 빈 map으로 초기화합니다.
result.state를 state로 설정합니다.
result.entry를
state.contextMap 안의 contextIdentifier 값으로 설정합니다.
result를 반환합니다.
context가 문자열이면:
context를 그 객체 안의
"@context" 값으로 설정합니다.
contextUrl을 contextIdentifier의 값으로 설정합니다.
context를 contextIdentifier로 설정합니다.
state, context, 그리고 설정되어 있다면 contextUrl을
5.4.3 컨텍스트 추가
알고리즘에 전달한 결과로
result를 설정합니다.
result를 반환합니다.
이 알고리즘은 map state, 컨텍스트 객체 context, 그리고 컨텍스트
URL contextUrl을 받아,
map state와 entry를 포함하는 map인 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를 포함하는 map으로 설정합니다.
termMap을 빈 map으로 설정합니다.
entry를 context와 termMap을 포함하는 객체로 설정합니다.
sortedTerms를 context 안의 키들을
사전순으로 정렬한 결과로 설정합니다.
context에 항목을 가지고 있으면 isProtected를
true로, 그렇지 않으면 false로 설정합니다.
sortedTerms 안의 term마다:
term이 state.keywordsMap에 항목을 가지고 있으면,
이 반복문의 다음 반복으로 진행합니다.
definition을 context 안의 term 값으로 설정합니다.
definition이 null이면, 이 반복문의 다음 반복으로 진행합니다.
definition이 문자열이면:
newDefinition을 빈 map으로 설정합니다.
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를 빈 map으로 설정합니다.
result.state를 state로, result.entry를
entry로 설정합니다.
result를 반환합니다.
이 절의 코덱은 JSON-LD의 개별 값이 CBOR로, 그리고 그 반대로 어떻게 변환되어야 하는지 정확히 명시합니다. 이들은 이전 절의 알고리즘에서 사용되며, CBOR-LD가 원시 타입과 비원시 타입을 모두 CBOR로 효율적으로 인코딩할 수 있게 합니다.
이 알고리즘은 map typeTable과 값 contextValue를 입력으로 받아
map encoderData를 반환합니다.
encoderData를 빈 map으로 초기화합니다.
contextValue가 문자열이 아니면, 반환합니다.
contextTable을
typeTable 안의 "context" 값으로 설정합니다.
encoderData.context를 contextValue로, 그리고
encoderData.contextTable을
contextTable로 설정합니다.
encoderData를 반환합니다.
이 알고리즘은 map encoderData를 받아, CBOR 이진 데이터를 반환합니다.
encoderData.context가
encoderData.contextTable에 항목을 가지고 있으면,
encoderData 안의 encoderData.context 값을
Major Type 0(부호 없는 정수) 객체로 CBOR 인코딩하여 반환합니다.
encoderData.context 값을 Major Type 3
(텍스트 문자열) 객체로 CBOR 인코딩하여 반환합니다.
이 알고리즘은 map reverseTypeTable을 받아
map encoderData를 반환합니다.
reverseContextTable을
reverseTypeTable 안의 "context" 값으로 설정합니다.
decoderData를 빈 map으로 초기화합니다.
decoderData.reverseContextTable을
reverseContextTable의 값으로 설정하고
decoderData를 반환합니다.
이 알고리즘은 map decoderData와 값 value를 입력으로 받아
값을 반환합니다.
value가 숫자가 아니면, value를 반환합니다.
decoderData.reverseContextTable이
value에 대한 항목을 가지고 있으면,
그 항목의 값을 반환합니다.
이 알고리즘은 map state와 termInfo, 그리고 값
termType 및 valueToEncode를 입력으로 받아 map 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를 빈 map으로 초기화합니다.
encoderData.intValue를
intValue의 값으로,
encoderData.convertToBytes를
convertToBytes의 값으로, 그리고
encoderData.includeSign을
includeSign의 값으로 설정합니다.
encoderData를 반환합니다.
tableType이 state.processingModeTypeEncoders에 항목을 가지고 있으면,
해당 항목의 코덱과 연결된 Create Encoder 알고리즘을
호출한 결과로 encoderData를 설정합니다.
encoderData가 정의되어 있으면, encoderData를 반환합니다.
valueToEncode를 반환합니다.
이 알고리즘은 map encoderData를 받아, CBOR 이진 데이터를 반환합니다.
encoderData.convertToBytes가 true이면:
includeSign 값을 사용하여 정수의 이진 표현이 부호 있는지
부호 없는지를 결정하면서, intValue를 바이트로 변환한 결과로
bytes를 설정합니다.
bytes를 Major Type 2(바이트 문자열) 객체로 CBOR 인코딩하여 반환합니다.
intValue를 Major Type 0(부호 없는
정수) 객체로 CBOR 인코딩하여 반환합니다.
이 알고리즘은 map state와 termInfo, 그리고 값
termType 및 valueToDecode를 입력으로 받아 map
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를 빈
map으로 초기화하고, decoderData.decoded를
decoded의 값으로 설정한 뒤 decoderData를 반환합니다.
tableType이 state.processingModeTypeDecoders에 항목을 가지고 있으면,
해당 항목의 코덱과 연결된 Create Decoder 알고리즘을
호출한 결과로 DecoderData를 설정합니다.
decoderData가 정의되어 있으면, decoderData를 반환합니다.
valueToDecode가 배열이 아니면,
decoderData를 빈 map으로 초기화하고,
decoderData.decoded를 valueToDecode로 설정한 뒤
decoderData를 반환합니다.
이 알고리즘은 map decoderData를 받아 값을 반환합니다.
decoderData.decoded를 반환합니다.
registryEntryId를 입력으로 받아 바이트 문자열
prefix를 반환합니다.
registryEntryBytes를 registryEntryID의 CBOR 인코딩으로 설정합니다.
prefix를 바이트 문자열 0xD9CB1D82의 끝에
registryEntryBytes를 덧붙인 결과로 설정합니다.
prefix를 반환합니다.
이 알고리즘은 인코딩된 CBOR-LD 페이로드 cborldBytes를 입력으로 받아,
디코딩할 주 데이터인
suffix와, suffix를 압축 해제하는 데 사용해야 하는
registryEntryId 값을 반환합니다.
cborldbytes의 CBOR 태그가 0xCB1D(태그 값 51997)가 아니면,
ERR_NON_CBOR_LD_TAG 오류를 던집니다.
ERR_INVALID_PAYLOAD_STRUCTURE 오류를 던집니다.
registryEntryId의 값을 태그가 붙은
배열의 인덱스 0에 있는 정수 값으로 설정합니다.
suffix의 값을 배열의 두 번째 요소 값으로 설정합니다.
result를 빈 map으로 설정합니다.
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)