CBOR-LD 1.0

Linked Data를 위한 CBOR 기반 직렬화

W3C 작업 초안

이 문서에 대한 자세한 정보
이 버전:
https://www.w3.org/TR/2026/WD-cbor-ld-10-20260708/
최신 공개 버전:
https://www.w3.org/TR/cbor-ld-10/
최신 편집자 초안:
https://w3c.github.io/cbor-ld/
이력:
https://www.w3.org/standards/history/cbor-ld-10/
커밋 이력
편집자:
Manu Sporny (Digital Bazaar)
Dave Longley (Digital Bazaar)
Wesley Smith (Digital Bazaar)
저자:
Manu Sporny (Digital Bazaar)
Dave Longley (Digital Bazaar)
피드백:
GitHub w3c/cbor-ld (풀 리퀘스트, 새 이슈, 열린 이슈)

개요

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 프로세스 문서의 적용을 받습니다.

1. 소개

이 절은 비규범적입니다.

CBOR는 간결한 이진 데이터 직렬화 및 메시징 형식입니다. 이 명세는 Linked Data를 직렬화하기 위한 CBOR 기반 형식인 CBOR-LD 1.0을 정의합니다. 이 인코딩은 오늘날 수억 개의 시스템에 배포된 기존 JSON-LD 생태계를 활용하도록 설계되어, Linked Data를 위한 효율적인 인코딩 방식을 찾는 이들에게 간결한 직렬화 형식을 제공합니다. 의미론적 압축 방식을 활용함으로써, 범용 압축 방식보다 60% 이상 더 나은 압축률을 달성할 수 있습니다. 이 형식은 주로 저장 공간과 대역폭이 제한된 프로그래밍 환경에서 Linked Data를 사용하고, 상호 운용 가능한 의미론적 와이어 수준 프로토콜을 구축하며, CBOR 기반 저장 엔진에 Linked Data를 효율적으로 저장하기 위한 방법으로 의도되었습니다.

1.1 이 문서를 읽는 방법

이 절은 비규범적입니다.

이 문서는 CBOR에서 Linked Data를 직렬화하기 위한 상세 명세입니다. 이 문서는 주로 다음 독자를 대상으로 합니다.

1.1.1 적합성

비규범적이라고 표시된 절뿐만 아니라, 이 명세의 모든 작성 지침, 다이어그램, 예제 및 주석은 비규범적입니다. 이 명세의 그 밖의 모든 내용은 규범적입니다.

이 문서의 핵심 단어 MUSTBCP 14 [RFC2119] [RFC8174]에 설명된 대로 해석되어야 하며, 여기에서 보이는 것처럼 모두 대문자로 나타날 때에만 그렇게 해석됩니다.

1.2 기여하기

이 절은 비규범적입니다.

이 명세의 개발에 참여할 수 있는 방법은 여러 가지가 있습니다.

1.3 설계 목표와 근거

이 절은 비규범적입니다.

CBOR-LD는 다음 설계 목표를 충족합니다.

단순성
구현은 기존 JSON-LD 구현을 바탕으로 간단히 구현할 수 있어야 합니다.
효율적인 저장
인코딩 과정은 매우 간결한 Linked Data 이진 형식을 생성해야 합니다.
일반화된 알고리즘
인코딩 알고리즘은 일반화되어야 합니다.
의미론적 압축
인코딩 형식은 Linked Data URL(용어 및 값)의 압축을 최대화해야 합니다. 여기에 집중함으로써 알고리즘이 범용 압축 알고리즘보다 더 나은 압축률을 달성할 수 있습니다.
원시 이진
Base 인코딩된 이진 값과 기타 압축 가능한 데이터 유형은, 가능하다면 일반성을 희생하지 않고 Base 인코딩 형식에서 원시 이진 형식으로 변환되어야 합니다.

마찬가지로, 다음은 목표가 아닙니다.

이 명세를 작업하는 동안 다음과 같은 지뢰밭이 확인되었습니다.

2. 기본 개념

이 절은 비규범적입니다.

높은 수준에서, CBOR-LD는 JSON-LD를 위한 간결한 이진 직렬화이며 추가 압축을 위해 다음 메커니즘을 허용합니다.

코덱은 유형 지정 값을 일반적인 방식으로 압축하기 위한 기본 원시 요소입니다. 의미론적 압축은 JSON-LD 용어를 압축하기 위한 것입니다. 레지스트리 사전은 특정 사용 사례에 맞춘 방식으로 유형 지정 값을 압축하기 위한 것입니다. 이들 각각은 선택 사항입니다 — CBOR-LD는 이러한 압축 전략 중 어느 것과도, 모두와도, 또는 전혀 없이도 사용할 수 있습니다. 함께 볼 때, 특정 사용 사례에 사용되는 이러한 전략들의 집합을 처리 모델이라고 합니다.

3. 의미론적 압축

이 절은 비규범적입니다.

의미론적 압축은 간결한 CBOR-LD 페이로드를 만들기 위한 강력한 도구입니다. 핵심 아이디어는 외부 JSON-LD 컨텍스트 객체의 정보 내용을 사용하여 JSON-LD 용어를 압축하는 것입니다. 이러한 외부 컨텍스트 객체는 페이로드의 생성자와 소비자 모두가 사용할 수 있으므로, 이는 역변환 가능한 방식으로 수행됩니다.

일반적인 의미론적 압축 과정은 JSON-LD Document를 가져와 다음을 수행하는 것입니다.

  1. JSON-LD를 압축할 수 있는지 확인합니다(JSON-LD 문서에서 URI를 통해 컨텍스트를 참조하는 @context 값을 찾습니다. 임베디드 컨텍스트 값은 압축할 수 없습니다).
  2. JSON-LD 컨텍스트를 처리하여 CBOR-LD term-codec map — 압축 가능한 모든 용어의 목록 — 을 만듭니다. 목록을 정렬합니다(Unicode 코드 포인트 순서로). 0부터 시작해 하나씩 증가시키며 각 용어에 바이트 값을 연결합니다.
  3. JSON-LD Document를 CBOR-LD로 인코딩합니다. 이는 모든 키를 term-codec map의 해당 용어에 연결된 바이트 값으로 바꾸는 것으로 이루어집니다.
  4. 원래 JSON-LD가 필요한 경우, CBOR-LD에서 JSON-LD로의 디코딩은 모든 CBOR 바이트 값을 term-codec map의 해당 키로 바꾸는 것으로 이루어집니다.

4. CBOR-LD용 CBOR 태그

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를 조회하는 데 사용됩니다.

4.1 CBOR-LD Registry

단일 CBOR 태그 값을 사용하면서도 소비 시 서로 다른 압축 테이블 자료가 필요한 CBOR-LD의 가능한 사용 사례를 무제한으로 확장할 수 있도록, 다음을 정의합니다.

CBOR-LD Registry는 CBOR-LD 페이로드의 소비자에게 압축 해제에 필요한 term-codec map을 재구성하는 데 필요한 정보를 제공하는 전역 목록입니다. CBOR-LD Registry Entry는 다음을 포함합니다.

문자열 "callerProvidedTable"은 typeTables에 나타날 수 있으며, 이 사용 사례에서는 전역적으로 정의되지 않은 Type Table이 필요함을 나타냅니다.

4.1.1 레지스트리

현재 CBOR-LD Registry는 여기에서 찾을 수 있습니다.

항목을 등록하려면 README의 지침을 따르십시오. 레지스트리는 W3C JSON-LD Community Group이 소유합니다.

5. 알고리즘

이 절에서는 JSON-LD를 CBOR-LD로 변환하고 그 반대로 변환하는 데 필요한 알고리즘을 명시합니다. 이 절에 있는 알고리즘의 대부분은 의미론적 압축 기능과 관련되어 있으며, CBOR-LD 페이로드가 의미론적 압축을 사용하지 않는 경우 CBOR-LD와 JSON-LD 간 변환에는 사용되지 않습니다.

5.1 인코딩 및 디코딩

5.1.1 JSON-LD에서 CBOR-LD로의 인코딩 알고리즘

이 알고리즘은 map typeTable, 정수 registryEntryId, 그리고 JSON-LD 문서 jsonldDocument를 입력으로 받아, 16진수 문자열 cborldBytes를 반환합니다.

  1. registryEntryId5.6.1 CBOR 태그 구조 가져오기 알고리즘에 전달한 결과로 prefix를 설정합니다.
  2. state를 빈 map으로 설정합니다.
  3. registryEntryId와 연결된 레지스트리 항목이 의미론적 압축을 요구하는 경우:
    1. state.strategy를 "compression"으로 설정합니다.
    2. state.typeTabletypeTable로 설정합니다.
    3. state.registryEntryIdregistryEntryId로 설정합니다.
    4. state5.2.1 변환 알고리즘 초기화에 전달한 결과로 설정합니다.
    5. statejsonldDocumentinputDocument5.2.2 문서 변환 알고리즘에 전달한 결과로 output을 설정합니다.
    6. suffixoutput의 CBOR 인코딩으로 설정합니다.
  4. 그렇지 않으면, suffixjsonldDocument의 CBOR 인코딩으로 설정합니다.
  5. cborldBytesprefix를 앞에 붙인 suffix의 16진수 인코딩으로 설정합니다.
  6. cborldBytes를 반환합니다.

5.1.2 CBOR-LD에서 JSON-LD로의 디코딩 알고리즘

이 알고리즘은 CBOR-LD 페이로드 cborldBytes를 입력으로 받아, JSON-LD 문서 jsonldDocument를 반환합니다.

  1. state를 빈 맵으로 설정한다.
  2. cborldBytes5.6.2 레지스트리 항목 ID 알고리즘 가져오기에 전달한 결과로 result를 설정한다.
  3. state.registryEntryIdresult.registryEntryId로 설정하고, suffixresult.suffix로 설정한다.
  4. state.registryEntryId와 연결된 레지스트리 항목이 의미론적 압축을 사용하는 경우:
    1. state.strategy를 "decompression"으로 설정한다.
    2. registryEntryId와 연결된 CBOR-LD Varint 레지스트리 항목의 typeTables 배열에 있는 각 항목 type: map에 대해, 해당 항목을 state.typeTable에 추가하고, state.reverseTypeTable에서 type의 값을 inverseMap으로 설정한다. 여기서 inverseMap은 매핑이 반전된 map이다.
    3. state5.2.1 변환 알고리즘 초기화state를 전달한 결과로 설정한다.
    4. suffix를 바이트에서 맵으로 디코딩한 결과로 input을 설정한다.
    5. stateinputinputDocuments5.2.2 문서 변환 알고리즘에 전달한 결과로 jsonldDocument를 설정한다.
  5. 그렇지 않으면, cborldBytes를 파싱한 결과로 jsonldDocument를 설정한다.
  6. jsonldDocument를 반환한다.

5.2 변환 알고리즘

이 절의 알고리즘은 데이터 형식 간 입력을 추상적으로 변환하기 위한 "converter"의 동작을 설명합니다. 이 절의 뒤에서 정의되는 "compression" 및 "decompression" 전략과 같은 "strategy"와 함께 사용될 때, 이러한 알고리즘은 구체적인 데이터 형식 간 변환을 위해 인스턴스화될 수 있습니다. "compression" 전략은 JSON-LD에서 CBOR-LD로 변환하며, "decompression" 전략은 CBOR-LD에서 JSON-LD로 변환합니다.

5.2.1 변환 알고리즘 초기화

이 알고리즘은 map state를 받고 반환합니다.

  1. state5.4.1 컨텍스트 로더 알고리즘 초기화에 전달한 결과로 설정합니다.
  2. 빈 map termMappreviousActiveContext5.3.1 활성 컨텍스트 알고리즘 초기화에 전달한 결과로 state.initialActiveContext를 설정합니다.
  3. state.typesEncodedAsBytes를 빈 set으로 설정합니다.
  4. "none", "http://www.w3.org/2001/XMLSchema#date", "http://www.w3.org/2001/XMLSchema#dateTime", 및 "url"을 state.typesEncodedAsBytes에 추가합니다.
  5. state를 반환합니다.

5.2.2 문서 변환 알고리즘

이 알고리즘은 map state와 map 또는 map 배열 inputDocuments를 입력으로 받아, map state와 map 또는 map 배열 outputMaps를 포함하는 map을 반환합니다.

  1. inputDocuments가 배열이면, inputsinputDocuments로 설정합니다. 그렇지 않으면, inputs[inputDocuments]로 설정합니다.
  2. outputMaps를 빈 배열로 설정합니다.
  3. inputs 안의 input마다:
    1. output을 빈 map으로 설정합니다.
    2. state, input, output, 그리고 state.initialActiveContextactiveContext5.2.3 일반 변환 알고리즘에 전달한 결과로 result를 설정합니다.
    3. result.outputoutputMaps에 추가합니다.
    4. stateresult.state로 설정합니다.
  4. inputDocuments가 배열이면 outputMaps를 반환합니다. 그렇지 않으면, outputMaps의 첫 번째 요소를 반환합니다.

5.2.3 일반 변환 알고리즘

이 알고리즘은 map input, output, state, 그리고 activeContext를 입력으로 받아, map stateoutput을 포함하는 map을 반환합니다.

  1. state.strategy가 "compression"으로 설정되어 있으면:
    1. state, activeContext, input, 그리고 output을 전달하여 5.2.5.1 압축을 위한 컨텍스트 변환 알고리즘의 결과로 contextConversionResult를 설정합니다.
    2. activeContextcontextConversionResult.activeContext로, outputcontextConversionResult.output으로, 그리고 statecontextConversionResult.state로 설정합니다.
  2. 그렇지 않으면, state, activeContext, input, 그리고 output을 전달하여 5.2.6.1 압축 해제를 위한 컨텍스트 변환 알고리즘에서 나온 resultresult.activeContextactiveContext를, result.statestate를 설정합니다.
  3. state.strategy가 "compression"으로 설정되어 있으면, state, activeContext, input, 그리고 output을 전달하여 5.2.5.4 압축을 위한 객체 유형 가져오기 알고리즘에서 나온 result에 대해 stateresult.state로, objectTypesresult.objectTypes로 설정합니다.
  4. 그렇지 않으면, stateresult.state로, objectTypesresult.objectTypes로 설정합니다. 여기서 resultstate, activeContext, input, 그리고 output을 전달하여 5.2.6.4 압축 해제를 위한 객체 유형 가져오기 알고리즘에서 나온 결과입니다.
  5. activeContextobjectTypes5.3.4 유형 범위 컨텍스트 적용 알고리즘에 전달한 결과로 activeContext를 설정합니다.
  6. state.strategy가 "compression"으로 설정되어 있으면, state, input, 그리고 activeContext를 전달하여 5.2.5.3 압축을 위한 입력 항목 가져오기 알고리즘에서 나온 result에 대해 stateresult.state로, termEntriesresult.termEntries로 설정합니다.
  7. 그렇지 않으면, stateresult.state로, outputresult.output으로, 그리고 termEntriesresult.termEntries로 설정합니다. 여기서 resultstate, input, output, 그리고 activeContext를 전달하여 5.2.6.3 압축 해제를 위한 입력 항목 가져오기 알고리즘에서 나온 결과입니다.
  8. termEntries 안의 [termInfo, value]마다:
    1. termtermInfo.term으로 설정합니다.
    2. activeContextterm5.3.3 속성 범위 컨텍스트 적용 알고리즘에 전달한 결과로 valueActiveContext를 설정합니다.
    3. pluraltermInfo.plural의 값으로, termTypetermInfo.def 안의 @type 값으로 설정합니다.
    4. pluraltrue로 설정되어 있으면, valuesvalue의 값으로 설정합니다. 그렇지 않으면, valuesvalue의 값을 단일 요소로 포함하는 배열로 설정합니다.
    5. outputs를 빈 배열로 설정합니다.
    6. values 안의 unconvertedValue마다:
      1. state, termType, unconvertedValuevalue로, 그리고 valueActiveContextactiveContext로 전달하여 5.2.4 값 변환 알고리즘의 결과로 result를 설정합니다.
      2. stateresult.state로 설정하고, result.outputoutputs에 추가합니다.
    7. pluraltrue로 설정되어 있으면, outputValuesoutputs로 설정합니다. 그렇지 않으면, outputValuesoutputs의 첫 번째 요소로 설정합니다.
    8. state.strategy가 "compression"으로 설정되어 있으면, termInfo.termId의 값을 output에서 outputValues로 매핑하도록 설정합니다. 그렇지 않으면, termInfo.term의 값을 outputValuesoutput에서 매핑하도록 설정합니다.
  9. result를 빈 map으로 설정합니다.
  10. result.statestate로, result.outputoutput으로 설정합니다.
  11. result를 반환합니다.

5.2.4 값 변환 알고리즘

이 알고리즘은 map state, activeContext, termInfo와 값 valuetermType을 받습니다. map stateoutput을 포함하는 result 객체를 반환합니다.

  1. valuenull이면, null을 반환합니다.
  2. state.strategy가 "compression"으로 설정되어 있으면, state, termType, termInfo, 그리고 value5.2.5.2 압축을 위한 값 변환 알고리즘에 전달한 결과로 output을 설정합니다.
  3. 그렇지 않으면, state, termType, termInfo, 그리고 value5.2.6.2 압축 해제를 위한 값 변환 알고리즘에 전달한 결과로 output을 설정합니다.
  4. output이 정의되어 있으면, stateoutput을 포함하는 map인 result를 반환합니다.
  5. value가 배열이면:
    1. outputs를 빈 배열로 설정합니다.
    2. value의 각 element마다:
      1. activeContext, state, termInfo, termType, 그리고 elementvalue로 전달하여 5.2.4 값 변환 알고리즘의 결과를 result라 합니다. stateresult.state로 설정하고 result.outputoutputs에 추가합니다.
    3. result를 빈 map으로 설정합니다. result.statestate로, result.outputoutputs로 설정합니다.
    4. result를 반환합니다.
  6. output을 빈 map으로 설정합니다.
  7. state, activeContext, valueinput으로, 그리고 output을 전달하여 5.2.3 일반 변환 알고리즘의 결과로 result를 설정합니다.
  8. result를 반환합니다.

5.2.5 압축 전략 알고리즘

이 절의 알고리즘은 앞서 정의한 "conversion" 알고리즘과 함께 사용되어 JSON-LD를 CBOR-LD로 변환하는 "compression" 전략을 정의합니다.

5.2.5.1 압축을 위한 컨텍스트 변환 알고리즘

이 알고리즘은 map state, activeContext, input, 그리고 output을 입력으로 받아, map output, state, 그리고 activeContext를 포함하는 map result를 반환합니다.

  1. state, activeContext, 그리고 input을 전달하여 5.3.2 임베디드 컨텍스트 적용 알고리즘의 결과로 applyEmbeddedResult를 설정합니다.
  2. activeContextapplyEmbeddedResult.activeContext로, stateapplyEmbeddedResult.state로 설정합니다.
  3. "@context"가 input에 항목을 가지고 있지 않으면:
    1. result를 빈 map으로 설정합니다.
    2. result.statestate로, result.activeContextactiveContext로 설정합니다.
    3. result를 반환합니다.
  4. contextinput의 "@context" 값으로 설정합니다.
  5. encodedContexts를 빈 배열로 설정합니다.
  6. context가 배열이면 isArraytrue로 설정하고 contextscontext로 설정합니다. 그렇지 않으면, isArrayfalse로 설정하고 contexts[context]로 설정합니다.
  7. contexts 안의 contextValue마다:
    1. state.typeTablecontextValue를 전달하여 5.5.1.1 컨텍스트 인코더 생성의 결과로 encoderData를 설정합니다.
    2. encoderData가 빈 map이면, contextValueencodedContexts에 추가합니다.
    3. 그렇지 않으면, encoderData의 값을 encodedContexts에 추가합니다.
  8. isArraytrue이면, idstate.keywordsMap의 "@context" 값에 1을 더한 값으로 설정하고, outputid 값을 encodedContexts로 설정합니다.
  9. 그렇지 않으면, idstate.keywordsMap의 "@context" 값으로 설정하고, outputid 값을 encodedContexts의 첫 번째 요소로 설정합니다.
  10. result.outputoutput으로, result.statestate로, 그리고 result.activeContextactiveContext로 설정합니다.
  11. result를 반환합니다.
5.2.5.2 압축을 위한 값 변환 알고리즘

이 알고리즘은 map statetermInfo, 그리고 값 valueToEncodetermType을 입력으로 받아 map encoderData를 반환합니다.

  1. valueToEncode가 객체이면, 반환합니다.
  2. 그렇지 않으면, state, termInfo, valueToToEncode, 그리고 termType을 전달하여 5.5.2.1 값 인코더 생성의 결과로 result를 설정합니다.
  3. result를 반환합니다.
5.2.5.3 압축을 위한 입력 항목 가져오기 알고리즘

이 알고리즘은 map state, activeContext, 그리고 input을 입력으로 받아 map state와 배열 entries를 반환합니다.

  1. entries를 빈 배열로 초기화합니다.
  2. input의 키들을 사전순으로 정렬한 배열 keys를 설정합니다.
  3. keys 안의 key마다:
    1. key가 "@context"이면, 계속합니다.
    2. valueinput 안의 key 값으로 설정합니다.
    3. value가 배열이면, pluraltrue로 설정합니다. 그렇지 않으면, pluralfalse로 설정합니다.
    4. keystate.termToId에 항목을 가지고 있지 않으면, termIdkey로 설정합니다.
    5. 그렇지 않고 pluraltrue이면, termIdstate.termToId 안의 key 값에 1을 더한 값으로 설정합니다.
    6. 그렇지 않으면, termIdstate.termToId 안의 key 값으로 설정합니다.
    7. activeContext.termMapkey에 대한 항목을 가지고 있으면, definitionactiveContext.termMap 안의 key 값으로 설정합니다. 그렇지 않으면, definition을 빈 map으로 설정합니다.
    8. entryTerm을 새 map으로 설정합니다.
    9. entryTerm 안의 "term" 값을 key의 값으로 설정합니다. termId, plural, 그리고 definitionentryTerm에 추가합니다.
    10. entryTermvalue라는 두 요소를 가진 배열 entry를 생성합니다.
    11. entryentries에 추가합니다.
  4. entriesstate를 포함하는 map result를 반환합니다.
5.2.5.4 압축을 위한 객체 유형 가져오기 알고리즘

이 알고리즘은 map activeContextinput을 입력으로 받아 set objectTypes를 반환합니다.

  1. objectTypes를 빈 set으로 설정합니다.
  2. activeContext.typeTerms 안의 term마다:
    1. terminput에 항목을 가지고 있으면:
      1. typesinput 안의 term 값으로 설정합니다.
      2. types의 각 값을 objectTypes에 추가합니다.
  3. objectTypes를 반환합니다.

5.2.6 압축 해제 전략 알고리즘

이 절의 알고리즘은 앞서 정의한 "conversion" 알고리즘과 함께 사용되어 CBOR-LD를 JSON-LD로 변환하는 "decompression" 전략을 정의합니다.

5.2.6.1 압축 해제를 위한 컨텍스트 변환 알고리즘

이 알고리즘은 map state, activeContext, input, 그리고 output을 입력으로 받아, map output, state, 그리고 activeContext를 포함하는 map result를 반환합니다.

  1. state.reverseTypeTable을 전달하여 5.5.1.3 컨텍스트 디코더 생성의 결과로 decoderData를 설정합니다.
  2. contextTermIdstate.keywordsMap 안의 "@context" 값으로 설정합니다.
  3. contextTermIdinput에 항목을 가지고 있으면, decoderDatainput 안의 contextTermId 값을 value로 전달하여 5.5.1.4 컨텍스트 디코딩의 결과로 output 안의 "@context" 값을 설정합니다.
  4. contextTermIdPluralcontextTermId 값에 1을 더한 값으로 설정합니다.
  5. contextTermIdPluralinput에 항목을 가지고 있으면:
    1. 이전 확인 중에 contextTermIdinput에 항목을 가지고 있었다면, ERR_INVALID_ENCODED_CONTEXT 오류를 던집니다.
    2. encodedContextsinput 안의 contextTermIdPlural 값으로 설정합니다. encodedContexts가 배열이 아니면, ERR_INVALID_ENCODED_CONTEXT 오류를 던집니다.
    3. contexts를 빈 배열로 설정합니다.
    4. encodedContexts 안의 각 valueToDecode에 대해, decoderDatavalueToDecodevalue5.5.1.4 컨텍스트 디코딩에 전달한 결과를 contexts에 추가합니다.
    5. output 안의 "@context" 값을 contexts로 설정합니다.
  6. activeContext, outputinput으로, 그리고 state를 전달하여 5.3.2 임베디드 컨텍스트 적용 알고리즘의 결과로 embeddedContextResult를 설정합니다.
  7. result를 빈 map으로 설정합니다.
  8. result.stateembeddedContextResult.state로, result.activeContextembeddedContextResult.activeContext로 설정합니다.
  9. result를 반환합니다.
5.2.6.2 압축 해제를 위한 값 변환 알고리즘

이 알고리즘은 map statetermInfo, 그리고 값 termTypevalueToDecode를 입력으로 받아 값 decodedValue를 반환합니다.

  1. value가 map이면, 반환합니다.
  2. valueToDecode, state, termInfo, 그리고 termType을 전달하여 5.5.2.3 값 디코더 생성의 결과로 decoderData를 설정합니다.
  3. decoderData를 전달하여 5.5.2.4 값 디코딩의 결과로 decodedValue를 설정합니다.
  4. decodedValue를 반환합니다.
5.2.6.3 압축 해제를 위한 입력 항목 가져오기 알고리즘

이 알고리즘은 map state, activeContext, 그리고 input을 입력으로 받아 map state와 배열 entries를 반환합니다.

  1. entries를 빈 배열로 초기화합니다.
  2. input 안의 키-값 쌍 keyvalue마다:
    1. keystate.keywordsMap 안의 "@context" 값이거나 그 값에 1을 더한 값이면, 계속합니다.
    2. 그렇지 않고 key가 문자열이면, plural을 false로 설정하고 termkey로 설정합니다.
    3. 그렇지 않으면:
      1. key가 홀수이면, plural을 true로 설정합니다. 그렇지 않으면, plural을 false로 설정합니다.
      2. pluraltrue이면, termstate.idToTerm 안의 id에서 1을 뺀 값으로 설정합니다. 그 값에 항목이 없으면, 오류 ERR_UNKNOWN_CBORLD_TERM_ID를 던집니다.
      3. 그렇지 않으면, termstate.idToTerm 안의 id 값으로 설정합니다. 그 값에 항목이 없으면, 오류 ERR_UNKNOWN_CBORLD_TERM_ID를 던집니다.
    4. definitionactiveContext.termMap 안의 term 값으로 설정합니다.
    5. entryTerm을 새 map으로 설정합니다.
    6. entryTerm 안의 "termId" 값을 key의 값으로 설정합니다. term, plural, 그리고 definitionentryTerm에 추가합니다.
    7. entryTermvalue라는 두 요소를 가진 배열 entry를 생성합니다.
    8. entryentries에 추가합니다.
  3. entries의 각 요소 안의 term 값을 기준으로 entries를 정렬합니다.
  4. entriesstate를 포함하는 map result를 반환합니다.
5.2.6.4 압축 해제를 위한 객체 유형 가져오기 알고리즘

이 알고리즘은 map state, activeContext, input을 입력으로 받아 map state와 set objectTypes를 반환합니다.

  1. objectTypes를 빈 set으로 설정합니다.
  2. activeContext.typeTerms 안의 term마다:
    1. termstate.termToId에 항목을 가지고 있지 않으면, termIdterm으로 설정합니다.
    2. 그렇지 않으면, termIdstate.termToId 안의 term 값으로 설정합니다.
    3. termIdtermId에 1을 더한 값이 모두 input에 없으면, 계속합니다.
    4. 그렇지 않고 termIdinput에 있으면, valueinput 안의 termId 값으로 설정합니다.
    5. 그렇지 않으면, valueinput 안의 termId에 1을 더한 값으로 설정합니다.
    6. key가 문자열이면, plural을 false로 설정하고 termkey로 설정합니다.
    7. 그렇지 않으면:
      1. key가 홀수이면, plural을 true로 설정합니다. 그렇지 않으면, plural을 false로 설정합니다.
      2. pluraltrue이면, termstate.idToTerm 안의 id에서 1을 뺀 값으로 설정합니다. 그 값에 항목이 없으면, 오류 ERR_UNKNOWN_CBORLD_TERM_ID를 던집니다.
      3. 그렇지 않으면, termstate.idToTerm 안의 id 값으로 설정합니다. 그 값에 항목이 없으면, 오류 ERR_UNKNOWN_CBORLD_TERM_ID를 던집니다.
    8. definitionactiveContext.termMap 안의 term 값으로 설정합니다.
    9. termInfo를 새 map으로 설정합니다.
    10. term, termId, plural, 그리고 definitiontermInfo에 추가합니다.
    11. value가 배열이 아니면, valuesvalue를 단일 요소로 포함하는 배열로 설정합니다. 그렇지 않으면, valuesvalue의 값으로 설정합니다.
    12. values 안의 각 value마다:
      1. value, termInfo, state, 그리고 "@vocab"을 termType으로 전달하여 5.5.2.3 값 디코더 생성의 결과로 decoderData를 설정합니다.
      2. decoderData가 존재하면, decoderData를 전달하여 5.5.2.4 값 디코딩한 결과를 `objectTypes에 추가합니다.
      3. 그렇지 않으면, valueobjectTypes에 추가합니다.
  3. objectTypes를 반환합니다.

5.3 활성 컨텍스트 처리

이 절의 알고리즘은 JSON-LD 문서와 연결된 컨텍스트 문서의 어떤 구성 요소가 압축 또는 압축 해제 중 어느 시점에 사용되는지 결정하는 방법을 설명합니다. 이러한 알고리즘에는 CBOR-LD에서 임베디드, 유형 범위, 그리고 속성 범위 컨텍스트를 적용하는 방법이 포함됩니다. 이는 이 명세의 뒤에서 정의되는 컨텍스트 로딩 알고리즘과 대비되며, 해당 알고리즘은 CBOR-LD 압축 기법의 핵심인 용어에서 정수로의 매핑을 구성하는 방법을 설명합니다. 함께 볼 때, 활성 컨텍스트 처리와 컨텍스트 로딩 알고리즘은 CBOR-LD로 변환하거나 CBOR-LD에서 변환할 때 JSON-LD 컨텍스트 문서를 어떻게 처리해야 하는지 명시합니다.

5.3.1 활성 컨텍스트 알고리즘 초기화

이 알고리즘은 map previousActiveContexttermMap을 입력으로 받아, map activeContext를 반환합니다. 이는 사용 중인 활성 컨텍스트를 갱신하고 '@type'의 모든 별칭을 찾습니다.

  1. activeContext를 새 map으로 설정합니다.
  2. activeContext.previousActiveContextpreviousActiveContext로 설정합니다.
  3. activeContext.termMaptermMap으로 설정합니다.
  4. activeContext.typeTerms를 배열 ['@type']로 설정합니다.
  5. termMap 안의 [term, def]마다:
    1. def 안의 "@id" 값이 "@type"이면, termactiveContext.typeTerms에 추가합니다.
  6. activeContext를 반환합니다.

5.3.2 임베디드 컨텍스트 적용 알고리즘

이 알고리즘은 map state, activeContext, 그리고 input을 입력으로 받아, map stateactiveContext를 포함하는 map result를 반환합니다.

  1. state, activeContext.termMapactiveTermMap으로, 그리고 input 안의 '@context' 값을 contexts로 전달하여 5.3.5 용어 맵 갱신 알고리즘의 결과로 termMapUpdateResult를 설정합니다.
  2. statetermMapUpdateResult.state로 설정합니다.
  3. termMaptermMapUpdateResult.activeTermMap으로 설정합니다.
  4. termMapactiveContextpreviousActiveContext로 전달하여 5.3.1 활성 컨텍스트 알고리즘 초기화의 결과로 newActiveContext를 설정합니다.
  5. result를 새 map으로 설정하고, result.activeContextnewActiveContext로, result.statestate로 설정합니다.
  6. result를 반환합니다.

5.3.3 속성 범위 컨텍스트 적용 알고리즘

이 알고리즘은 map state, activeContext, 그리고 문자열 term을 입력으로 받아, map stateactiveContext를 포함하는 map result를 반환합니다.

  1. activeContext를 전달하여 5.3.6 용어 맵 되돌리기 알고리즘의 결과로 revertedTermMap을 설정합니다.
  2. termDefactiveContext.termMap 안의 term 값으로 설정합니다. contextstermDef 안의 "@context" 값으로 설정합니다.
  3. state, revertedTermMapactiveTermMap으로, truepropertyScope로, 그리고 contexts를 전달하여 5.3.5 용어 맵 갱신 알고리즘의 결과로 termMapUpdateResult를 설정합니다.
  4. statetermMapUpdateResult.state로 설정합니다.
  5. termMaptermMapUpdateResult.activeTermMap으로 설정합니다.
  6. termMapactiveContextpreviousActiveContext로 전달하여 5.3.1 활성 컨텍스트 알고리즘 초기화의 결과로 newActiveContext를 설정합니다.
  7. result를 새 map으로 설정하고, result.activeContextnewActiveContext로, result.statestate로 설정합니다.
  8. result를 반환합니다.

5.3.4 유형 범위 컨텍스트 적용 알고리즘

이 알고리즘은 map state, activeContext ,그리고 set objectTypes를 입력으로 받아, map stateactiveContext를 포함하는 map result를 반환합니다.

  1. objectTypesSorted를 빈 배열로 설정합니다.
  2. objectTypes의 요소들을 사전순으로 정렬하고, 그 요소들을 순서대로 objectTypesSorted에 추가합니다.
  3. newTermMapactiveContext.termMap으로 설정합니다.
  4. objectTypesSorted 안의 type마다:
    1. typeDefnewTermMap 안의 type 값으로 설정합니다. contextstypeDef 안의 "@context" 값으로 설정합니다.
    2. state, newTermMapactiveTermMap으로, contexts, 그리고 truetypeScope로 전달하여 5.3.5 용어 맵 갱신 알고리즘의 결과로 termMapUpdateResult를 설정합니다.
    3. statetermMapUpdateResult.state로, newTermMaptermMapUpdateResult.activeTermMap으로 설정합니다.
  5. newTermMaptermMap으로, 그리고 activeContextpreviousActiveContext로 전달하여 5.3.1 활성 컨텍스트 알고리즘 초기화의 결과로 newActiveContext를 설정합니다.
  6. result를 새 map으로 설정하고, result.activeContextnewActiveContext로, result.statestate로 설정합니다.
  7. result를 반환합니다.

5.3.5 용어 맵 갱신 알고리즘

이 알고리즘은 map state, activeTermMap, 그리고 map 또는 배열 contexts와 함께 불리언 typeScopepropertyScope를 입력으로 받습니다. 둘 다 제공되지 않은 경우 기본값은 false입니다. 이는 map stateactiveTermMap을 반환합니다.

  1. contexts가 배열이 아니면, contextscontexts의 이전 값을 유일한 요소로 포함하는 배열로 설정합니다.
  2. allowProtectedOverridepropertyScope의 값으로 설정합니다.
  3. propagateDefaulttypeScope 값의 부정으로 설정합니다.
  4. contexts 안의 contextIdentifier마다:
    1. statecontextIdentifier를 전달하여 5.4.2 컨텍스트 로드 알고리즘의 결과로 loadResult를 설정합니다.
    2. entryloadResult.entry로, contextentry.context로, 그리고 stateloadResult.state로 설정합니다.
    3. @propagatecontext에 나타나면, propagatecontext 안의 @propagate 값으로 설정합니다. 그렇지 않으면, propagatepropagateDefault의 값으로 설정합니다.
    4. newTermMap을 빈 map으로 설정합니다. entry.termMap 안의 [key, value]마다:
      1. value의 내용을 얕게 복사하여 새 map newValue에 넣고, propagatenewValue에 추가합니다.
      2. newTermMap 안의 key 값을 newValue로 설정합니다.
    5. activeTermMap 안의 [term, activeDef]마다:
      1. newTermMap 안의 term 값을 def라 합니다.
      2. def가 정의되어 있으면:
        1. activeDef 안의 protected 값이 true이면:
          1. allowProtectedOverridefalse로 설정되어 있고 defactiveDef와 동일하지 않으면, 오류 ERR_PROTECTED_TERM_REDEFINITION을 던집니다.
          2. 그렇지 않으면, newTermMap 안의 term 값을 activeDef의 값과 def.propagate 값으로 설정된 propagate를 포함하는 map으로 설정합니다.
      3. 그렇지 않고 termcontext에 나타나면, newTermMap 안의 term 값을 activeDef의 모든 값을 포함하는 map으로 설정합니다.
    6. activeTermMap의 값을 newTermMap의 값으로 설정합니다.
  5. result를 빈 map으로 설정합니다.
  6. result.statestate로, result.activeTermMapactiveTermMap으로 설정합니다.
  7. result를 반환합니다.

5.3.6 용어 맵 되돌리기 알고리즘

이 알고리즘은 map activeContext를 입력으로 받아, map newTermMap을 반환합니다.

  1. newTermMap을 빈 map으로 설정합니다.
  2. nonPropagatingTerms를 빈 배열로 설정합니다.
  3. activeContext 안의 [term, def]마다:
    1. def.propagatefalse로 설정되어 있으면, termnonPropagatingTerms에 추가하고 이 반복문의 다음 반복으로 진행합니다.
    2. 그렇지 않으면, newTermMap 안의 term 값을 def로 설정합니다.
  4. nonPropagatingTerms 안의 term마다:
    1. currentContextactiveContext.previousActiveContext로 설정합니다.
    2. defcurrentContext.termMap 안의 term 값으로 설정합니다.
    3. def가 undefined가 아니고 def.propagatefalse로 설정되어 있는 동안:
      1. currentContextactiveContext.previousActiveContext로 설정합니다.
      2. defcurrentContext.termMap 안의 term 값으로 설정합니다.
    4. def가 undefined가 아니면, newTermMap 안의 term 값을 def로 설정합니다.
  5. newTermMap을 반환합니다.

5.4 컨텍스트 로딩

이 절의 알고리즘은 CBOR-LD 압축 기법의 핵심으로 사용되는 용어와 정수 사이의 매핑을 구성하는 방법을 정의합니다.

5.4.1 컨텍스트 로더 알고리즘 초기화

이 알고리즘은 map state를 받고 반환합니다.

  1. state.contextMap을 새 map으로 설정합니다.
  2. state.nextTermId를 100으로 설정합니다.
  3. 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
    }
  4. state.keywordsMap의 각 항목을 state.termToId에 추가합니다.
  5. state.strategy가 "decompression"으로 설정되어 있으면, state.idToTermstate.termToId의 역방향 map (즉, 정수에서 JSON-LD 키워드로의 map)으로 설정합니다.
  6. state를 반환합니다.

5.4.2 컨텍스트 로드 알고리즘

이 알고리즘은 map state와 context map 또는 URL contextIdentifier를 받아, map stateentry를 포함하는 map인 result를 반환합니다.

  1. state.contextMapcontextIdentifier에 대한 항목을 가지고 있으면:
    1. result를 빈 map으로 초기화합니다.
    2. result.statestate로 설정합니다.
    3. result.entrystate.contextMap 안의 contextIdentifier 값으로 설정합니다.
    4. result를 반환합니다.
  2. context가 문자열이면:
    1. 연결된 컨텍스트 객체를 가져오고, context를 그 객체 안의 "@context" 값으로 설정합니다.
    2. contextUrlcontextIdentifier의 값으로 설정합니다.
  3. 그렇지 않으면, contextcontextIdentifier로 설정합니다.
  4. state, context, 그리고 설정되어 있다면 contextUrl5.4.3 컨텍스트 추가 알고리즘에 전달한 결과로 result를 설정합니다.
  5. result를 반환합니다.

5.4.3 컨텍스트 추가 알고리즘

이 알고리즘은 map state, 컨텍스트 객체 context, 그리고 컨텍스트 URL contextUrl을 받아, map stateentry를 포함하는 map인 result를 반환합니다.

  1. context가 "@import" 항목을 가지고 있으면:
    1. importUrl을 `context 안의 "@import" 값으로 설정합니다.
    2. state.contextMapimportUrl에 대한 항목을 가지고 있지 않으면:
      1. importUrl과 연결된 컨텍스트 객체를 가져오고, importContext를 그 객체 안의 "@context" 값으로 설정합니다.
      2. state, importContextcontext로, 그리고 importUrlcontextUrl로 전달하여 5.4.3 컨텍스트 추가 알고리즘의 결과로 importedContextAdditionResult를 설정합니다.
      3. stateimportedContextAdditionResult.state로, importEntryimportedContextAdditionResult.entry로 설정합니다.
    3. 그렇지 않으면, importEntrystate.contextMap 안의 importUrl 값으로 설정합니다.
    4. contextcontext의 모든 항목과 importEntry.context를 포함하는 map으로 설정합니다.
  2. termMap을 빈 map으로 설정합니다.
  3. entrycontexttermMap을 포함하는 객체로 설정합니다.
  4. sortedTermscontext 안의 키들을 사전순으로 정렬한 결과로 설정합니다.
  5. "@protected"가 context에 항목을 가지고 있으면 isProtectedtrue로, 그렇지 않으면 false로 설정합니다.
  6. sortedTerms 안의 term마다:
    1. termstate.keywordsMap에 항목을 가지고 있으면, 이 반복문의 다음 반복으로 진행합니다.
    2. definitioncontext 안의 term 값으로 설정합니다.
    3. definitionnull이면, 이 반복문의 다음 반복으로 진행합니다.
    4. definition이 문자열이면:
      1. newDefinition을 빈 map으로 설정합니다.
      2. newDefinition 안의 "@id" 값을 definition으로 설정합니다.
      3. definition의 값을 newDefinition으로 설정합니다.
    5. definition 안의 protected 값을 isProtected로 설정합니다.
    6. termMap 안의 term 값을 definition으로 설정합니다.
    7. termstate.termToId에 항목을 가지고 있지 않으면:
      1. termIdstate.nextTermId로 설정합니다.
      2. state.nextTermId를 2만큼 증가시킵니다.
      3. state.termToId 안의 term 값을 termId로 설정합니다.
      4. state.idToTerm 안의 termId 값을 term으로 설정합니다.
  7. contextUrl이 정의되어 있으면, state.contextMap 안의 contextUrl 값을 entry로 설정합니다.
  8. 그렇지 않으면, state.contextMap 안의 context 값을 entry로 설정합니다.
  9. result를 빈 map으로 설정합니다.
  10. result.statestate로, result.entryentry로 설정합니다.
  11. result를 반환합니다.

5.5 코덱

이 절의 코덱은 JSON-LD의 개별 값이 CBOR로, 그리고 그 반대로 어떻게 변환되어야 하는지 정확히 명시합니다. 이들은 이전 절의 알고리즘에서 사용되며, CBOR-LD가 원시 타입과 비원시 타입을 모두 CBOR로 효율적으로 인코딩할 수 있게 합니다.

5.5.1 컨텍스트 코덱

5.5.1.1 컨텍스트 인코더 생성

이 알고리즘은 map typeTable과 값 contextValue를 입력으로 받아 map encoderData를 반환합니다.

  1. encoderData를 빈 map으로 초기화합니다.
  2. contextValue가 문자열이 아니면, 반환합니다.
  3. 그렇지 않으면, contextTabletypeTable 안의 "context" 값으로 설정합니다.
  4. encoderData.contextcontextValue로, 그리고 encoderData.contextTablecontextTable로 설정합니다.
  5. encoderData를 반환합니다.
5.5.1.2 컨텍스트 인코딩

이 알고리즘은 map encoderData를 받아, CBOR 이진 데이터를 반환합니다.

  1. encoderData.contextencoderData.contextTable에 항목을 가지고 있으면, encoderData 안의 encoderData.context 값을 Major Type 0(부호 없는 정수) 객체로 CBOR 인코딩하여 반환합니다.
  2. 그렇지 않으면, encoderData.context 값을 Major Type 3 (텍스트 문자열) 객체로 CBOR 인코딩하여 반환합니다.
5.5.1.3 컨텍스트 디코더 생성

이 알고리즘은 map reverseTypeTable을 받아 map encoderData를 반환합니다.

  1. reverseContextTablereverseTypeTable 안의 "context" 값으로 설정합니다.
  2. decoderData를 빈 map으로 초기화합니다.
  3. decoderData.reverseContextTablereverseContextTable의 값으로 설정하고 decoderData를 반환합니다.
5.5.1.4 컨텍스트 디코딩

이 알고리즘은 map decoderData와 값 value를 입력으로 받아 값을 반환합니다.

  1. value가 숫자가 아니면, value를 반환합니다.
  2. 그렇지 않고 decoderData.reverseContextTablevalue에 대한 항목을 가지고 있으면, 그 항목의 값을 반환합니다.
  3. 그렇지 않으면, 오류 ERR_UNDEFINED_COMPRESSED_CONTEXT를 던집니다.

5.5.2 값 코덱

5.5.2.1 값 인코더 생성

이 알고리즘은 map statetermInfo, 그리고 값 termTypevalueToEncode를 입력으로 받아 map encoderData 또는 valueToEncode를 반환합니다.

  1. isUrlfalse로 설정합니다.
  2. termInfo.term이 "@id" 또는 "@type"이면, isUrltrue로 설정합니다.
  3. termInfo.def 안의 "@id" 값이 "@id" 또는 "@type"이면, isUrl을 true로 설정합니다.
  4. termType이 "@id" 또는 "@vocab"이면, isUrltrue로 설정합니다.
  5. isUrltrue이면, tableType을 "url"로 설정합니다.
  6. 그렇지 않고 termType이 정의되어 있으면, tableTypetermType으로 설정합니다.
  7. 그렇지 않으면, tableType을 "none"으로 설정합니다.
  8. state.typeTabletableType에 대한 항목을 가지고 있으면:
    1. subTablestate.typeTable 안의 tableType 값으로 설정합니다.
    2. subTablevalueToEncode에 대한 항목을 가지고 있으면:
      1. intValuesubTable 안의 valueToEncode 값으로 설정합니다. includeSignfalse로 설정합니다.
      2. state.typesEncodedAsBytestableType에 대한 항목을 가지고 있으면, convertToBytestrue로 설정합니다. 그렇지 않으면, convertToBytesfalse로 설정합니다.
    3. 그렇지 않고 tableType이 "none"이 아니며 valueToEncode가 정수이면:
      1. intValuevalueToEncode의 값으로 설정합니다.
      2. convertToBytesincludeSigntrue로 설정합니다.
    4. intValue가 정의되어 있으면:
      1. encoderData를 빈 map으로 초기화합니다.
      2. encoderData.intValueintValue의 값으로, encoderData.convertToBytesconvertToBytes의 값으로, 그리고 encoderData.includeSignincludeSign의 값으로 설정합니다.
      3. encoderData를 반환합니다.
  9. tableTypestate.processingModeTypeEncoders에 항목을 가지고 있으면, 해당 항목의 코덱과 연결된 Create Encoder 알고리즘을 호출한 결과로 encoderData를 설정합니다.
  10. encoderData가 정의되어 있으면, encoderData를 반환합니다.
  11. valueToEncode를 반환합니다.
5.5.2.2 값 인코딩

이 알고리즘은 map encoderData를 받아, CBOR 이진 데이터를 반환합니다.

  1. encoderData.convertToBytestrue이면:
    1. includeSign 값을 사용하여 정수의 이진 표현이 부호 있는지 부호 없는지를 결정하면서, intValue를 바이트로 변환한 결과로 bytes를 설정합니다.
    2. bytes를 Major Type 2(바이트 문자열) 객체로 CBOR 인코딩하여 반환합니다.
  2. 그렇지 않으면, intValue를 Major Type 0(부호 없는 정수) 객체로 CBOR 인코딩하여 반환합니다.
5.5.2.3 값 디코더 생성

이 알고리즘은 map statetermInfo, 그리고 값 termTypevalueToDecode를 입력으로 받아 map decoderData를 반환합니다.

  1. isUrlfalse로 설정합니다.
  2. termInfo.term이 "@id" 또는 "@type"이면, isUrltrue로 설정합니다.
  3. termInfo.def 안의 "@id" 값이 "@id" 또는 "@type"이면, isUrltrue로 설정합니다.
  4. termType이 "@id" 또는 "@vocab"이면, isUrltrue로 설정합니다.
  5. isUrltrue이면, tableType을 "url"로 설정합니다.
  6. 그렇지 않고 termType이 정의되어 있으면, tableTypetermType으로 설정합니다.
  7. 그렇지 않으면, tableType을 "none"으로 설정합니다.
  8. state.reverseTypeTabletableType에 대한 항목을 가지고 있으면:
    1. subTablestate.reverseTypeTable 안의 tableType 값으로 설정합니다.
    2. useTablefalse로 설정합니다.
    3. valueToDecode가 바이트 배열이고 state.typesEncodedAsBytestableType에 대한 항목을 가지고 있으면:
      1. useTabletrue로 설정합니다.
      2. intValuevalueToDecode 바이트의 부호 없는 정수 변환으로 설정합니다.
    4. 그렇지 않고 valueToDecode가 정수이고 state.typesEncodedAsBytestableType에 대한 항목을 가지고 있지 않으면:
      1. useTabletrue로 설정합니다.
      2. intValuevalueToDecode로 설정합니다.
    5. useTabletrue이면:
      1. intValuesubTable에 없으면, 오류 ERR_UNKNOWN_COMPRESSED_VALUE를 던집니다.
      2. 그렇지 않으면, decodedsubTable 안의 intValue 값으로 설정합니다.
    6. 그렇지 않고 valueToDecode가 바이트 배열이며 tableType이 "none"이 아니면, decodedvalueToDecode의 정수 변환으로 설정합니다.
    7. decoded가 정의되어 있으면, decoderData를 빈 map으로 초기화하고, decoderData.decodeddecoded의 값으로 설정한 뒤 decoderData를 반환합니다.
  9. tableTypestate.processingModeTypeDecoders에 항목을 가지고 있으면, 해당 항목의 코덱과 연결된 Create Decoder 알고리즘을 호출한 결과로 DecoderData를 설정합니다.
  10. decoderData가 정의되어 있으면, decoderData를 반환합니다.
  11. 그렇지 않고 valueToDecode가 배열이 아니면, decoderData를 빈 map으로 초기화하고, decoderData.decodedvalueToDecode로 설정한 뒤 decoderData를 반환합니다.
5.5.2.4 값 디코딩

이 알고리즘은 map decoderData를 받아 값을 반환합니다.

  1. decoderData.decoded를 반환합니다.

5.6 CBOR 태그 처리

5.6.1 CBOR 태그 구조 가져오기 알고리즘

이 알고리즘은 정수 registryEntryId를 입력으로 받아 바이트 문자열 prefix를 반환합니다.
  1. registryEntryBytesregistryEntryID의 CBOR 인코딩으로 설정합니다.
  2. prefix를 바이트 문자열 0xD9CB1D82의 끝에 registryEntryBytes를 덧붙인 결과로 설정합니다.
  3. prefix를 반환합니다.

5.6.2 레지스트리 항목 ID 가져오기 알고리즘

이 알고리즘은 인코딩된 CBOR-LD 페이로드 cborldBytes를 입력으로 받아, 디코딩할 주 데이터인 suffix와, suffix를 압축 해제하는 데 사용해야 하는 registryEntryId 값을 반환합니다.

  1. cborldbytes의 CBOR 태그가 0xCB1D(태그 값 51997)가 아니면, ERR_NON_CBOR_LD_TAG 오류를 던집니다.
  2. 태그가 붙은 항목이 첫 번째 요소가 CBOR 정수인 두 요소 배열이 아니면, ERR_INVALID_PAYLOAD_STRUCTURE 오류를 던집니다.
  3. registryEntryId의 값을 태그가 붙은 배열의 인덱스 0에 있는 정수 값으로 설정합니다.
  4. suffix의 값을 배열의 두 번째 요소 값으로 설정합니다.
  5. result를 빈 map으로 설정합니다.
  6. result.suffixsuffix의 값으로, 그리고 result.registryEntryIdregistryEntryId의 값으로 설정합니다.
  7. result를 반환합니다.

6. 보안 고려사항

이 절은 비규범적입니다.

7. 개인정보 보호 고려사항

이 절은 비규범적입니다.

8. IANA 고려사항

이 절은 비규범적입니다.

8.1 CBOR 태그

이 명세는 소비자가 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)

A. 참고문헌

A.1 규범적 참고문헌

[RFC2119]
RFC에서 요구 수준을 나타내는 데 사용하는 핵심 단어. S. Bradner. IETF. 1997년 3월. 현행 최선 관행. URL: https://www.rfc-editor.org/info/rfc2119/
[RFC8174]
RFC 2119 핵심 단어에서 대문자와 소문자의 모호성. B. Leiba. IETF. 2017년 5월. 현행 최선 관행. URL: https://www.rfc-editor.org/info/rfc8174/