JSON-LD 1.1 처리 알고리즘 및 API

W3C 권고안

이 버전:
https://www.w3.org/TR/2020/REC-json-ld11-api-20200716/
최신 공개 버전:
https://www.w3.org/TR/json-ld11-api/
최신 편집자 초안:
https://w3c.github.io/json-ld-api/
테스트 스위트:
https://w3c.github.io/json-ld-api/tests/
구현 보고서:
https://w3c.github.io/json-ld-api/reports/
이전 버전:
https://www.w3.org/TR/2020/PR-json-ld11-api-20200507/
이전 권고안:
https://www.w3.org/TR/2014/REC-json-ld-api-20140116/
편집자:
Gregg Kellogg (v1.0 및 v1.1)
Dave Longley (Digital Bazaar) (v1.1)
Pierre-Antoine Champin (LIRIS - Université de Lyon) (v1.1)
이전 편집자:
Markus Lanthaler (Google) (v1.0)
Manu Sporny (Digital Bazaar) (v1.0)
저자:
Dave Longley (Digital Bazaar) (v1.0 및 v1.1)
Gregg Kellogg (v1.0 및 v1.1)
Markus Lanthaler (Google) (v1.0)
Manu Sporny (Digital Bazaar) (v1.0)
Niklas Lindström (v1.0)
참여:
GitHub w3c/json-ld-api
버그 신고
커밋 이력
풀 리퀘스트

게시 이후 보고된 오류나 문제는 정오표를 확인하십시오.

다음도 참고하십시오: 번역.

이 문서는 다음 비규범 형식으로도 제공됩니다: EPUB


초록

이 명세는 JSON-LD 문서의 프로그래밍 방식 변환을 위한 알고리즘 집합을 정의합니다. 정의된 변환에 따라 데이터를 재구성하면 그 사용이 극적으로 단순해지는 경우가 많습니다. 또한 이 문서는 지정된 알고리즘을 구현하는 개발자를 위한 애플리케이션 프로그래밍 인터페이스(API)를 제안합니다.

이 명세는 JSON-LD 1.0 처리 알고리즘 및 API [JSON-LD10-API]에 정의된 기능의 상위 집합을 설명하며, 별도로 명시된 경우를 제외하고, 이 명세에서 설명하는 알고리즘은 JSON-LD 1.0 [JSON-LD10]을 사용하여 작성된 문서와 완전히 호환됩니다.

이 문서의 상태

이 절은 발행 당시 이 문서의 상태를 설명합니다. 다른 문서가 이 문서를 대체할 수 있습니다. 현재 W3C 발행물 목록과 이 기술 보고서의 최신 개정판은 https://www.w3.org/TR/의 W3C 기술 보고서 색인에서 확인할 수 있습니다.

이 문서는 JSON-LD 워킹 그룹이 개발했으며, JSON-LD 커뮤니티 그룹최종 보고서에서 파생되었습니다.

이 문서에서 설명하는 기능을 시연할 수 있는 라이브 JSON-LD 플레이그라운드가 있습니다.

이 명세는 JSON-LD 1.0 처리 알고리즘 및 API [JSON-LD10-API] 명세를 대체하도록 의도되었습니다.

이 문서는 JSON-LD 워킹 그룹에 의해 권고안으로 발행되었습니다.

이 명세에 대한 논의에는 GitHub Issues가 선호됩니다. 또는 메일링 리스트로 의견을 보낼 수 있습니다. 다음 주소로 보내 주십시오: public-json-ld-wg@w3.org (아카이브).

워킹 그룹의 구현 보고서를 참조하십시오.

이 문서는 W3C 회원, 소프트웨어 개발자, 그리고 다른 W3C 그룹과 관심 있는 당사자들의 검토를 거쳤으며, Director에 의해 W3C 권고안으로 승인되었습니다. 이는 안정적인 문서이며 다른 문서에서 참조 자료로 사용하거나 인용할 수 있습니다. 권고안을 만드는 데 있어 W3C의 역할은 이 명세에 주의를 환기하고 그 광범위한 배포를 촉진하는 것입니다. 이는 웹의 기능성과 상호 운용성을 향상시킵니다.

이 문서는 W3C 특허 정책에 따라 운영되는 그룹에 의해 작성되었습니다. W3C는 해당 그룹의 산출물과 관련하여 이루어진 모든 특허 공개의 공개 목록을 유지합니다. 그 페이지에는 특허 공개 지침도 포함되어 있습니다. 자신이 믿기에 필수 청구항을 포함하는 특허에 대해 실제 지식을 가진 개인은 W3C 특허 정책 제6절에 따라 그 정보를 공개해야 합니다.

이 문서는 2019년 3월 1일 W3C 프로세스 문서의 적용을 받습니다.

문서 집합

이 문서는 JSON-LD 워킹 그룹이 만든 세 개의 JSON-LD 1.1 권고안 중 하나입니다:

1. 소개

이 절은 비규범입니다.

이 문서는 JSON-LD 처리 알고리즘의 상세 명세입니다. 이 문서는 주로 다음 독자를 대상으로 합니다:

이 명세의 기본을 이해하려면 먼저 JSON에 익숙해야 하며, 이는 [RFC8259]에 자세히 설명되어 있습니다. 또한 모든 알고리즘이 사용하는 기본 구문인 JSON-LD 1.1 구문 명세 [JSON-LD11]에 정의된 JSON-LD 구문도 이해해야 합니다. API와 그것이 프로그래밍 환경에서 어떻게 동작하도록 의도되었는지 이해하려면 JavaScript 프로그래밍 언어 [ECMASCRIPT]와 WebIDL [WEBIDL]에 대한 실무 지식이 있으면 유용합니다. JSON-LD가 RDF에 어떻게 매핑되는지 이해하려면 기본 RDF 개념 [RDF11-CONCEPTS]에 익숙하면 도움이 됩니다.

1.1 이 문서를 읽는 방법

이 절은 비규범입니다.

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

동반 문서인 JSON-LD 1.1 명세 [JSON-LD11]는 JSON-LD 문서의 문법을 명세합니다.

이 명세의 기본을 이해하려면 먼저 JSON에 익숙해야 하며, 이는 [RFC8259]에 자세히 설명되어 있습니다.

이 문서는 JSON-LD 1.0 버전 이후의 변경 사항을 강조 표시할 수 있습니다. 변경 사항을 보려면 를 선택하십시오.

1.2 기여

이 절은 비규범입니다.

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

1.3 타이포그래피 규약

이 절은 비규범입니다.

이 명세에서는 다음 타이포그래피 규약을 사용합니다:

markup
마크업(요소, 속성, 프로퍼티), 기계가 처리할 수 있는 값(문자열, 문자, 미디어 타입), 프로퍼티 이름, 또는 파일 이름은 붉은 주황색 고정폭 글꼴로 표시됩니다.
variable
의사 코드 또는 알고리즘 설명의 변수는 이탤릭체로 표시됩니다.
정의
이 명세 또는 다른 명세에서 사용할 용어의 정의는 굵은 이탤릭체로 표시됩니다.
정의 참조
이 문서 안의 정의에 대한 참조는 밑줄로 표시되며 정의 자체로 이동하는 활성 링크이기도 합니다.
마크업 정의 참조
이 문서 안의 정의에 대한 참조가 그 자체로 마크업인 경우에는 밑줄, 붉은 주황색 고정폭 글꼴로 표시되며 정의 자체로 이동하는 활성 링크이기도 합니다.
외부 정의 참조
다른 문서의 정의에 대한 참조는 밑줄과 이탤릭체로 표시되며 정의 자체로 이동하는 활성 링크이기도 합니다.
마크업 외부 정의 참조
다른 문서의 정의에 대한 참조가 그 자체로 마크업인 경우에는 밑줄, 이탤릭체 붉은 주황색 고정폭 글꼴로 표시되며 정의 자체로 이동하는 활성 링크이기도 합니다.
하이퍼링크
하이퍼링크는 밑줄과 파란색으로 표시됩니다.
[참고 문헌]
문서 참고 문헌(규범 또는 참고 정보)은 대괄호로 묶이며 참고 문헌 절로 링크됩니다.
권고안 이후 변경 사항
이전 권고안에서 변경된 절이나 구문은 § 1.1 이 문서를 읽는 방법의 컨트롤을 사용하여 강조 표시될 수 있습니다.
참고

참고는 연한 초록색 상자에 초록색 왼쪽 테두리와 초록색의 "참고" 머리말로 표시됩니다. 참고는 항상 참고 정보입니다.

예제는 연한 카키색 상자에 카키색 왼쪽 테두리와
번호가 붙은 카키색 "예제" 머리말로 표시됩니다.
예제는 항상 참고 정보입니다. 예제의 내용은 고정폭 글꼴로 표시되며 구문 색상이 적용될 수 있습니다.

예제에는 탭 탐색 버튼이 있을 수 있으며
예제를 다른 표현으로 변환한 결과를 보여줄 수 있습니다.

1.4 용어

이 문서는 외부 명세에 정의된 다음 용어를 사용하며, JSON-LD에 특화된 용어를 정의합니다.

다른 명세에서 가져온 용어

ECMAScript 언어 명세 [ECMASCRIPT], JavaScript Object Notation (JSON) 데이터 교환 형식 [RFC8259], Infra Standard [INFRA], 및 Web IDL [WEBIDL]에서 가져온 용어

배열
JSON 직렬화에서 배열 구조는 0개 이상의 값을 둘러싸는 대괄호로 표현됩니다. 값은 쉼표로 구분됩니다. 내부 표현에서, 목록(배열이라고도 함)은 0개 이상의 값으로 이루어진 순서 있는 컬렉션입니다. JSON-LD는 JSON과 동일한 배열 표현을 사용하지만, 컬렉션은 기본적으로 순서가 없습니다. 일반 JSON 배열에서는 순서가 보존되지만, JSON-LD 배열에서는 특별히 정의되지 않는 한 보존되지 않습니다 (JSON-LD 1.1의 집합과 목록 절 참조.
불리언
두 가지 가능한 상태 중 하나를 표현하는 데 사용되는 truefalse 값.
JSON 객체
JSON 직렬화에서 객체 구조는 0개 이상의 이름/값 쌍(또는 멤버)을 둘러싸는 중괄호 쌍으로 표현됩니다. 이름은 문자열입니다. 각 이름 뒤에는 콜론 하나가 오며, 이름과 값을 구분합니다. 쉼표 하나가 값과 그 다음 이름을 구분합니다. JSON-LD에서 객체 안의 이름은 고유해야 합니다.

내부 표현에서 JSON 객체는 키/값 쌍이 있는 엔트리로 구성된 ( [INFRA] 참조)으로 설명됩니다.

애플리케이션 프로그래밍 인터페이스에서, 은 [WEBIDL] record를 사용하여 설명됩니다.

null
JSON-LD 안에서 null 값을 사용하는 것은 값을 무시하거나 재설정하는 데 사용됩니다. @context 안의 맵 엔트리에서 값, 또는 값의 @idnull이면, 용어와 IRI의 연결을 명시적으로 분리합니다. JSON-LD 문서 본문의 맵 엔트리 중 값이 null인 것은 그 맵 엔트리가 정의되지 않은 것과 같은 의미를 가집니다. 확장된 형식에서 @value, @list, 또는 @setnull로 설정되면, 전체 JSON 객체가 무시됩니다.
숫자
JSON 직렬화에서 숫자는 대부분의 프로그래밍 언어에서 사용하는 것과 유사하지만, 8진수와 16진수 형식은 사용되지 않으며 선행 0은 허용되지 않습니다. 내부 표현에서, 숫자는 소수부가 0이 아닌지 여부에 따라 long 또는 double과 동등합니다 ([WEBIDL] 참조).
스칼라
스칼라는 문자열, 숫자, true, 또는 false입니다.
문자열
문자열은 0개 이상의 유니코드(UTF-8) 문자 시퀀스로, 큰따옴표로 감싸며, 필요한 경우 백슬래시 이스케이프를 사용합니다. 문자는 하나의 문자 문자열로 표현됩니다.

국제화 자원 식별자(IRI) [RFC3987]에서 가져온 용어

IRI
schemepath, 그리고 선택적인 queryfragment 세그먼트를 포함하는 IRI의 절대 형식입니다.
IRI 참조
국제화 자원 식별자의 일반적인 사용을 나타냅니다. IRI 참조는 절대적일 수도 있고 상대적일 수도 있습니다. 그러나 그러한 참조에서 결과로 나오는 "IRI"는 절대 IRI만 포함합니다. 모든 상대 IRI 참조는 절대 형식으로 해석됩니다.
상대 IRI 참조
상대 IRI 참조는 다른 어떤 IRI, 일반적으로 문서의 기준 IRI에 상대적인 IRI 참조입니다. 프로퍼티, @type의 값, 그리고 어휘 상대적으로 정의된 용어의 값은 기준 IRI가 아니라 어휘 매핑에 상대적으로 해석된다는 점에 유의하십시오.

RDF 1.1 개념과 추상 구문 [RDF11-CONCEPTS], RDF Schema 1.1 [RDF-SCHEMA], 및 Linked Data 설계 이슈 [LINKED-DATA]에서 가져온 용어

기준 IRI
기준 IRI컨텍스트에서 설정된 IRI이거나, JSON-LD 문서 위치를 기반으로 합니다. 기준 IRI상대 IRI 참조IRI로 바꾸는 데 사용됩니다.
빈 노드
그래프 안의 노드로, IRI도 아니고 리터럴도 아닌 것입니다. 빈 노드는 역참조 가능한 식별자를 포함하지 않습니다. 이는 그 성격이 일시적이거나 linked data 그래프 외부에서 링크할 필요가 있는 정보를 포함하지 않기 때문입니다. JSON-LD에서 빈 노드에는 접두사 _:로 시작하는 식별자가 할당됩니다.
빈 노드 식별자
빈 노드 식별자는 JSON-LD 문서의 범위 안에서 빈 노드의 식별자로 사용할 수 있는 문자열입니다. 빈 노드 식별자는 _:로 시작합니다.
데이터셋
정확히 하나의 기본 그래프와 0개 이상의 명명된 그래프를 포함하는 RDF 그래프의 컬렉션을 나타내는 데이터셋.
데이터타입 IRI
데이터타입 IRI는 어휘 형식이 리터럴 값에 어떻게 매핑되는지를 결정하는 데이터타입을 식별하는 IRI입니다.
기본 그래프
데이터셋기본 그래프이름이 없는 RDF 그래프이며, 비어 있을 수 있습니다.
그래프 이름
명명된 그래프를 식별하는 IRI 또는 빈 노드.
언어 태그가 붙은 문자열
언어 태그가 붙은 문자열은 [BCP47]에 정의된 문자열과 비어 있지 않은 언어 태그로 구성됩니다. 언어 태그는 [BCP47]의 2.2.9절 적합성 클래스에 따라 올바른 형식이어야 합니다. 프로세서는 언어 태그를 소문자로 정규화할 수 있습니다.
Linked Data
각각 linked data 그래프 또는 데이터셋의 표현을 포함하는 문서 집합.
목록
목록IRI, 빈 노드, 그리고 리터럴의 순서 있는 시퀀스입니다.
리터럴
문자열 또는 숫자 같은 값으로 표현되는 객체. 암시적으로 또는 명시적으로 데이터타입 IRI를 포함하며, 데이터타입이 rdf:langString인 경우 선택적인 언어 태그를 포함합니다.
명명된 그래프
명명된 그래프IRI 또는 빈 노드로 식별되는 linked data 그래프입니다.
노드
RDF 그래프 안의 노드로, 적어도 하나의 트리플주어목적어 중 하나입니다. 하나의 노드는 같은 트리플 안에서도 주어목적어 역할을 모두 수행할 수 있음에 유의하십시오.
객체
객체는 하나 이상의 들어오는 간선을 가진 linked data 그래프 안의 노드입니다.
프로퍼티
linked data 그래프 안의 방향 있는 호의 이름입니다. 모든 프로퍼티는 방향성을 가지며 IRI 또는 빈 노드 식별자로 레이블이 붙습니다. 가능할 때마다 프로퍼티IRI로 레이블이 붙어야 합니다.
참고
빈 노드 식별자를 사용해 프로퍼티에 레이블을 붙이는 방식은 더 이상 권장되지 않으며, 향후 JSON-LD 버전에서 제거될 수 있습니다.
또한 [RDF11-CONCEPTS]의 술어도 참조하십시오.
RDF 그래프
레이블이 붙은 방향성 그래프, 즉 방향 있는 호로 연결된 노드의 집합입니다. linked data 그래프라고도 합니다.
자원
세상 속의 어떤 것("담론의 우주")을 나타내는 자원으로, IRI, 빈 노드, 또는 리터럴로 표시됩니다.
주어
주어linked data 그래프 안의 노드로, 하나 이상의 나가는 간선을 가지며, 프로퍼티를 통해 객체 노드와 관련됩니다.
트리플
주어, 술어, 그리고 객체를 포함하는 RDF 그래프의 구성 요소로, RDF 그래프의 노드-호-노드 세그먼트를 나타냅니다.

JSON-LD 특화 용어 정의

활성 컨텍스트
처리 알고리즘이 실행되는 동안 용어를 해석하는 데 사용되는 컨텍스트.
기준 방향
기준 방향은 문자열에 직접 연결된 방향이 없을 때 사용되는 방향입니다. 컨텍스트에서 @direction 키를 사용하여 설정할 수 있으며, 그 값은 문자열 "ltr", "rtl", 또는 null 중 하나여야 합니다. 규범적 설명은 JSON-LD 1.1의 컨텍스트 정의 절을 참조하십시오.
축약 IRI
축약 IRIprefix:suffix 형식을 가지며, IRI를 표현하는 방식으로 사용됩니다. 이는 prefix로 식별되는 공통 어휘 안에 포함된 각 IRI마다 별도의 용어 정의를 만들 필요가 없게 합니다.
컨텍스트
JSON-LD 1.1의 The Context 절에 설명되어 있고, JSON-LD 1.1의 컨텍스트 정의 절에서 규범적으로 명세된 방식으로 JSON-LD 문서를 해석하기 위한 규칙 집합입니다.
기본 언어
기본 언어는 문자열에 직접 연결된 언어가 없을 때 사용되는 언어입니다. 컨텍스트에서 @language 키를 사용하여 설정할 수 있으며, 그 값은 [BCP47] 언어 코드를 나타내는 문자열 또는 null이어야 합니다. 규범적 설명은 JSON-LD 1.1의 컨텍스트 정의 절을 참조하십시오.
기본 객체
기본 객체@default 키를 가진 입니다.
확장된 용어 정의
확장된 용어 정의는 값이 관련 IRI, 이것이 역방향 프로퍼티인지 여부, 문자열 값과 관련된 타입, 그리고 컨테이너 매핑을 정의하기 위한 하나 이상의 키워드 키를 포함하는 용어 정의입니다. 규범적 설명은 JSON-LD 1.1의 확장된 용어 정의 절을 참조하십시오.
프레임
다른 JSON-LD 문서를 매칭 및 임베딩 규칙을 사용하여 변환하기 위한 형식을 설명하는 JSON-LD 문서입니다. 프레임 문서는 매칭 및 변환 과정을 설명하기 위해 추가 키워드와 특정 맵 엔트리를 허용합니다.
그래프 객체
그래프 객체노드 객체 안의 맵 엔트리 값으로서 명명된 그래프를 나타냅니다. 확장될 때, 그래프 객체는 @graph 엔트리를 가져야 하며, @id@index 엔트리도 가질 수 있습니다. 단순 그래프 객체@id 엔트리를 갖지 않는 그래프 객체입니다. 노드 객체@graph 엔트리를 가질 수 있지만, 다른 엔트리를 포함하는 경우 그래프 객체로 간주되지 않음에 유의하십시오. @graph로만 구성된 최상위 객체도 그래프 객체가 아닙니다. 노드 객체는 다른 프로퍼티를 포함하는 경우 명명된 그래프를 나타낼 수도 있음에 유의하십시오. 규범적 설명은 JSON-LD 1.1의 그래프 객체 절을 참조하십시오.
id 맵
id 맵@container@id로 설정된 용어 값입니다. id 맵의 값은 노드 객체여야 하며, 그 키는 관련 노드 객체@id를 나타내는 IRI로 해석됩니다. id 맵 안의 값이 @id로 확장되는 키를 포함하는 경우, 그 값은 id 맵 안의 참조 키와 동등해야 합니다. 규범적 설명은 JSON-LD 1.1의 Id Maps 절을 참조하십시오.
포함 블록
포함 블록노드 객체 안의 엔트리로, 키가 @included 또는 @included의 별칭이고 값이 하나 이상의 노드 객체인 것입니다. 규범적 설명은 JSON-LD 1.1의 포함 블록 절을 참조하십시오.
인덱스 맵
인덱스 맵@container@index로 설정된 용어 값이며, 그 값은 다음 타입 중 하나여야 합니다: 문자열, 숫자, true, false, null, 노드 객체, 값 객체, 목록 객체, 집합 객체, 또는 위 가능성 중 0개 이상으로 이루어진 배열. 공식 설명은 JSON-LD 1.1의 Index Maps 절을 참조하십시오.
JSON 리터럴
JSON 리터럴은 관련 데이터타입 IRIrdf:JSON리터럴입니다. 값 객체 표현에서 @type의 값은 @json입니다. JSON 리터럴은 유효한 JSON [RFC8259]인 값을 나타냅니다. 규범적 설명은 JSON-LD 1.1의 rdf:JSON 데이터타입 절을 참조하십시오.
JSON-LD 문서
JSON-LD 문서RDF 데이터셋의 직렬화입니다. 공식 설명은 JSON-LD 1.1의 JSON-LD Grammar 절을 참조하십시오.
JSON-LD 내부 표현
JSON-LD 내부 표현은 JSON 구문 구조를 직접 처리하기에 적합한 핵심 데이터 구조인 배열, , 문자열, 숫자, 불리언, 그리고 null로 변환한 결과입니다.
JSON-LD 프로세서
JSON-LD 프로세서는 JSON-LD 1.1 처리 알고리즘 및 API에 정의된 알고리즘을 수행할 수 있는 시스템입니다. 공식 설명은 JSON-LD 1.1 API의 적합성 절을 참조하십시오.
JSON-LD 값
JSON-LD 값문자열, 숫자, true 또는 false, 타입이 지정된 값, 또는 언어 태그가 붙은 문자열입니다. 이는 RDF 리터럴을 나타냅니다.
키워드
JSON-LD에 특화된 문자열로, JSON-LD 1.1의 구문 토큰과 키워드 절에 설명되어 있고, JSON-LD 1.1의 키워드 절에서 규범적으로 명세됩니다,
언어 맵
언어 맵@container@language로 설정된 용어 값이며, 그 키는 [BCP47] 언어 코드를 나타내는 문자열이어야 하고 값은 다음 타입 중 하나여야 합니다: null, 문자열, 또는 위 가능성 중 0개 이상으로 이루어진 배열. 규범적 설명은 JSON-LD 1.1의 Language Maps 절을 참조하십시오.
목록 객체
목록 객체@list 키를 가진 입니다. @index 키도 가질 수 있지만, 다른 엔트리는 가질 수 없습니다. 규범적 설명은 JSON-LD 1.1의 목록과 집합 절을 참조하십시오.
로컬 컨텍스트
@context 키워드를 통해 지정되는 으로 명시된 컨텍스트.
노드 객체
노드 객체JSON-LD 문서에 의해 직렬화된 그래프 안의 노드의 0개 이상의 프로퍼티를 나타냅니다. 은 JSON-LD 컨텍스트 밖에 존재하고 다음 조건을 만족하는 경우 노드 객체입니다:
  • @value, @list, 또는 @set 키워드를 포함하지 않거나,
  • JSON-LD 문서에서 최상위 @graph@context 이외의 엔트리 없이 구성된 것이 아닌 경우.
키가 키워드가 아닌 노드 객체엔트리는 그 노드 객체프로퍼티라고도 합니다. 규범적 설명은 JSON-LD 1.1의 노드 객체 절을 참조하십시오.
접두사
접두사축약 IRI의 첫 번째 구성 요소로, 문자열에 매핑되는 용어에서 오며, 그 문자열을 축약 IRI의 접미사 앞에 붙이면 IRI가 됩니다.
처리 모드
처리 모드JSON-LD 문서가 어떻게 처리되는지를 정의합니다. 기본적으로 모든 문서는 이 명세에 적합한 것으로 가정됩니다. 컨텍스트 안의 @version 엔트리를 사용해 다른 버전을 정의함으로써, 게시자는 JSON-LD 1.0 [JSON-LD10]에 적합한 프로세서가 JSON-LD 1.1 문서를 우발적으로 처리하여 다른 출력을 만들 수 없도록 할 수 있습니다. API는 처리 모드json-ld-1.0으로 설정하는 옵션을 제공하며, 이는 JSON-LD 1.1 기능이 활성화되는 것을 방지하거나, 컨텍스트 안의 @version 엔트리가 명시적으로 1.1로 설정된 경우 오류가 발생하도록 합니다. 이 명세는 json-ld-1.1 처리 모드를 통해 JSON-LD 1.0을 확장합니다.
범위 지정 컨텍스트
범위 지정 컨텍스트@context 엔트리를 사용하는 확장된 용어 정의의 일부입니다. 이는 임베디드 컨텍스트와 같은 형식을 가집니다. 용어가 타입으로 사용되면 타입 범위 컨텍스트를 정의하고, 프로퍼티로 사용되면 프로퍼티 범위 컨텍스트를 정의합니다.
집합 객체
집합 객체@set 엔트리를 가진 입니다. @index 키도 가질 수 있지만, 다른 엔트리는 가질 수 없습니다. 규범적 설명은 JSON-LD 1.1의 목록과 집합 절을 참조하십시오.
용어
용어컨텍스트 안에 정의된 짧은 단어로, IRI로 확장될 수 있습니다. 규범적 설명은 JSON-LD 1.1의 용어 절을 참조하십시오.
용어 정의
용어 정의는 컨텍스트 안의 엔트리로, 키는 용어를 정의하며, 이 용어는 안에서 키, 타입, 또는 문자열이 어휘 항목으로 해석되는 다른 위치에 사용될 수 있습니다. 그 값은 문자열(단순 용어 정의)일 수 있으며, IRI로 확장되거나, 맵(확장된 용어 정의)일 수 있습니다.
타입 맵
타입 맵@container@type로 설정된 용어 값이며, 그 키는 관련 노드 객체@type을 나타내는 IRI로 해석됩니다. 값은 노드 객체 또는 노드 객체의 배열이어야 합니다. 값이 @type으로 확장되는 용어를 포함하는 경우, 확장할 때 그 값은 맵 값과 병합됩니다. 규범적 설명은 JSON-LD 1.1의 Type Maps 절을 참조하십시오.
타입이 지정된 값
타입이 지정된 값문자열인 값과, IRI인 타입으로 구성됩니다.
값 객체
값 객체@value 엔트리를 가진 입니다. 규범적 설명은 JSON-LD 1.1의 값 객체 절을 참조하십시오.
어휘 매핑
어휘 매핑은 컨텍스트에서 @vocab 키를 사용하여 설정되며, 그 값은 IRI, 축약 IRI, 용어, 또는 null이어야 합니다. 규범적 설명은 JSON-LD 1.1의 컨텍스트 정의 절을 참조하십시오.

1.4.1 알고리즘 용어

다음 용어는 특정 알고리즘 안에서 사용됩니다.

활성 그래프
프로세서가 처리할 때 사용해야 하는 현재 활성 그래프의 이름입니다.
활성 프로퍼티
프로세서가 처리할 때 사용해야 하는 현재 활성 프로퍼티 또는 키워드입니다. 활성 프로퍼티는 원래의 어휘 형식으로 표현되며, 이는 활성 컨텍스트에서 강제 변환 매핑을 찾는 데 사용됩니다.
값 추가
여러 알고리즘 안에서 매크로로 사용되며, 지정된 key를 사용하여 value (object)의 엔트리에 추가하는 방법입니다. 호출에는 기본값이 falseas array 플래그가 포함될 수 있습니다.
  1. as arraytrue이고 object 안의 key 값이 존재하지 않거나 배열이 아닌 경우, 원래 값을 포함하는 새 배열로 설정합니다.
  2. value배열인 경우, value 안의 각 요소 v에 대해, 값 추가를 재귀적으로 사용하여 ventry 안의 key에 추가합니다.
  3. 그렇지 않으면:
    1. keyobject 안의 엔트리가 아닌 경우, valueobject 안의 key 값으로 추가합니다.
    2. 그렇지 않으면
      1. object 안의 key 엔트리 값이 배열이 아닌 경우, 원래 값을 포함하는 새 배열로 설정합니다.
      2. valueobject 안의 key 엔트리 값에 추가합니다.
IRI 축약
여러 알고리즘 안에서 매크로로 사용되며, IRI 또는 키워드를 나타내는 문자열 varactive context를 사용하여 축약하는 과정을 설명하는 언어를 줄이기 위한 것입니다. 이 active context는 직접 지정되거나 이 용어를 사용하는 알고리즘 단계의 범위에서 올 수 있습니다. 선택적 value는 명시적으로 제공된 경우 사용됩니다. 별도로 지정되지 않으면 vocab 플래그의 기본값은 true이고, reverse 플래그의 기본값은 false입니다.
  1. IRI 축약 알고리즘을 사용한 결과를 반환합니다. active context, var, value(제공된 경우), vocab, 및 result를 전달합니다.
IRI 확장
여러 알고리즘 안에서 매크로로 사용되며, IRI 또는 키워드를 나타내는 문자열 valueactive context를 사용하여 확장하는 과정을 설명하는 언어를 줄이기 위한 것입니다. 이 active context는 직접 지정되거나 이 용어를 사용하는 알고리즘 단계의 범위에서 올 수 있습니다. 선택적 definedlocal context 인자는 명시적으로 제공된 경우 사용됩니다. 별도로 지정되지 않으면 document relative 플래그의 기본값은 false이고, vocab 플래그의 기본값은 true입니다.
  1. IRI 확장 알고리즘을 사용한 결과를 반환합니다. active context, value, local context(제공된 경우), defined(제공된 경우), document relative, 및 vocab를 전달합니다.
JSON-LD 입력
알고리즘에 입력으로 제공되는 JSON-LD 데이터 구조입니다.

1.4.2 구문 토큰과 키워드

JSON-LD 1.1 구문 명세 [JSON-LD11]에 정의된 키워드 외에도, 이 명세는 JSON-LD 1.1 Framing [JSON-LD11-FRAMING]을 지원하기 위해 추가 키워드 하나를 추가합니다:

@preserve
프레이밍 알고리즘의 결과로 생성된 확장 문서에서 사용되며, 그렇지 않으면 확장 알고리즘의 일부로 제거될 수 있는 값을 나타냅니다.

1.5 예제 규약

이 절은 비규범입니다.

이 문서에서 사용되는 예제의 출력은 필요상 JSON으로 직렬화된 형식으로 표시됩니다. 알고리즘은 JSON-LD 내부 표현에 대한 연산을 설명하지만, 예제로 표시될 때에는 JSON 직렬화가 사용됩니다. 특히, 내부 표현에서 사용하는 JSON 객체를 사용하여 표현됩니다.

예제 2: 샘플 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": [
    {
      "name": "Dave Longley"
    }
  ]
}

내부 표현에서 위 예제는 @context, @id, name, 그리고 knows 엔트리를 포함하는 이며, 값은 , 문자열, 또는 맵이나 문자열 값의 배열입니다. JSON 직렬화에서는 JSON 객체가 맵에 사용되며, 배열과 문자열은 많은 프로그래밍 언어에서 공통적으로 사용하는 규약을 사용해 직렬화됩니다.

2. 기능

이 절은 비규범입니다.

JSON-LD 1.1 구문 명세 [JSON-LD11]는 JSON으로 Linked Data를 표현하기 위한 구문을 정의합니다. 이 구문을 사용하여 Linked Data를 표현하는 방법은 둘 이상이므로, 특정 애플리케이션이 더 쉽게 소비할 수 있도록 JSON-LD 문서를 변환할 수 있는 것이 유용한 경우가 많습니다.

이러한 알고리즘을 JSON 이외의 구문에도 적용할 수 있도록, 알고리즘은 JSON-LD 내부 표현에서 동작합니다. 이는 JSON 문서가 나타내는 데이터를 설명하기 위해 배열, , 문자열, 숫자, 불리언, 그리고 null이라는 일반 개념을 사용합니다. 알고리즘은 이 내부 표현을 대상으로 동작하며, API 진입점은 구체 표현과 내부 표현 사이의 변환을 담당합니다.

JSON-LD는 컨텍스트를 사용하여 Linked Data를 특정 개인이나 애플리케이션에 특별히 맞춰진 방식으로 표현할 수 있게 합니다. 컨텍스트를 제공함으로써, JSON 데이터는 특정 개인이나 애플리케이션에 자연스럽게 맞는 방식으로 표현되는 동시에, 해당 데이터가 전역적 규모에서 어떻게 이해되어야 하는지도 표시할 수 있습니다. 자신과 다른 컨텍스트를 사용해 생성된 데이터를 사람이나 애플리케이션이 공유하려면, JSON-LD 프로세서는 문서를 한 컨텍스트에서 다른 컨텍스트로 변환할 수 있어야 합니다. JSON-LD 프로세서가 상상 가능한 모든 컨텍스트 전환 시나리오마다 특정 코드를 작성하도록 요구하는 대신, 임의의 컨텍스트를 제거할 수 있는 단일 알고리즘을 명세하는 것이 훨씬 쉽습니다. 마찬가지로, 이후에 임의의 컨텍스트를 적용하는 다른 알고리즘도 명세할 수 있습니다. 이 두 알고리즘은 JSON-LD 문서의 가장 기본적인 변환을 나타냅니다. 각각 확장축약이라고 합니다.

JSON-LD 1.1은 JSON-LD 1.0 [JSON-LD10]과 호환되는 새 기능을 도입하지만, JSON-LD 1.0 프로세서가 처리하면 다른 결과가 생성될 수 있습니다. 프로세서는 processingMode API 옵션이 명시적으로 json-ld-1.0으로 설정되지 않는 한 기본값으로 json-ld-1.1을 사용합니다. 게시자는 JSON-LD 1.0 프로세서가 JSON-LD 1.1 기능을 잘못 해석하지 않도록, 컨텍스트 안의 @version 맵 엔트리1.1로 설정하여 사용할 것을 권장합니다.

이 문서에서 논의하는 변환에는 네 가지 주요 유형이 있습니다: 확장, 축약, 평탄화, 그리고 RDF 직렬화/역직렬화입니다.

2.1 확장

이 절은 비규범입니다.

컨텍스트를 제거하는 알고리즘은 확장이라고 합니다. JSON-LD 문서에 다른 변환을 수행하기 전에, 그 문서에서 임의의 컨텍스트를 제거하고 데이터 구조를 더 규칙적으로 만드는 것이 가장 쉽습니다.

컨텍스트와 데이터 구조화가 동일한 데이터에 어떻게 영향을 주는지 이해하기 위해, 다음은 용어만 사용하며 상당히 축약된 JSON-LD 예제입니다:

다음 입력 예제는 하나의 IRI를 사용하여 프로퍼티를 표현하고, 을 사용하여 값을 캡슐화하지만, 나머지 정보는 그대로 둡니다.

두 입력 모두 유효한 JSON-LD이며, 둘 다 동일한 정보를 나타낸다는 점에 유의하십시오. 차이는 컨텍스트 정보와 사용된 데이터 구조에 있습니다. JSON-LD 프로세서는 컨텍스트를 제거하고 확장을 사용하여 데이터를 더 규칙적으로 만들 수 있습니다.

확장에는 두 가지 중요한 목표가 있습니다: 문서에서 모든 컨텍스트 정보를 제거하는 것과, 모든 값을 규칙적인 형식으로 표현되게 하는 것입니다. 이러한 목표는 모든 엔트리 키를 IRI로 확장하고, 모든 값을 확장 형식배열로 표현함으로써 달성됩니다. 확장 형식은 JSON-LD에서 값을 표현하는 가장 장황하고 규칙적인 방식입니다. 문서의 모든 컨텍스트 정보는 대신 각 값에 로컬로 저장됩니다. 위 예제에 대해 확장 알고리즘 (expand()) 작업을 실행하면 다음 출력이 생성됩니다:

예제 5: IRI를 사용하는 확장된 JSON-LD 문서
[
  {
    "@id": "http://me.markus-lanthaler.com/",
    "http://xmlns.com/foaf/0.1/name": [
      { "@value": "Markus Lanthaler" }
    ],
    "http://xmlns.com/foaf/0.1/homepage": [
      { "@id": "http://www.markus-lanthaler.com/" }
    ]
  }
]

위 예제는 확장 알고리즘 출력의 JSON-LD 직렬화이며, 여기서 알고리즘이 사용하는 JSON 객체로 대체됩니다.

위 출력에서는 모든 컨텍스트 정의가 제거되었고, 모든 용어축약 IRI가 절대 IRI로 확장되었으며, 모든 JSON-LD 값확장 형식배열로 표현되어 있음에 유의하십시오. 출력은 더 장황하고 사람이 읽기 어렵지만, 매우 규칙적인 구조 덕분에 JSON-LD 처리를 더 쉽게 해 주는 기준선을 확립합니다.

2.2 축약

이 절은 비규범입니다.

확장이 주어진 입력에서 컨텍스트를 제거하는 반면, 축약의 주요 기능은 반대 작업을 수행하는 것입니다. 즉, 주어진 입력을 특정 컨텍스트에 따라 표현하는 것입니다. 축약은 정보가 특정 개인이나 애플리케이션에 맞게 표현되는 방식을 특별히 조정하는 컨텍스트를 적용합니다. 이는 데이터를 애플리케이션별 용어로 표현함으로써 JSON 또는 JSON-LD를 소비하는 애플리케이션을 단순화하고, 사람이 데이터를 더 쉽게 읽을 수 있게 합니다.

축약은 개발자가 제공한 컨텍스트를 사용하여 IRI용어 또는 축약 IRI로 줄이고, 확장 형식으로 표현된 JSON-LD 값문자열이나 숫자 같은 단순한 값으로 만듭니다.

예를 들어, 다음과 같은 확장된 JSON-LD 입력 문서가 있다고 가정합니다:

예제 6: 확장된 샘플 문서
[
  {
    "@id": "http://me.markus-lanthaler.com/",
    "http://xmlns.com/foaf/0.1/name": [
      { "@value": "Markus Lanthaler" }
    ],
    "http://xmlns.com/foaf/0.1/homepage": [
      { "@id": "http://www.markus-lanthaler.com/" }
    ]
  }
]

또한, 개발자가 제공한 다음 JSON-LD 컨텍스트가 있다고 가정합니다:

예제 7: JSON-LD 컨텍스트
{
  "@context": {
    "name": "http://xmlns.com/foaf/0.1/name",
    "homepage": {
      "@id": "http://xmlns.com/foaf/0.1/homepage",
      "@type": "@id"
    }
  }
}

위에 제공된 컨텍스트를 사용하여 위에 제공된 JSON-LD 입력 문서에 대해 축약 알고리즘 (compact()) 작업을 실행하면 다음 출력이 생성됩니다:

위 예제는 축약 알고리즘 출력의 JSON-LD 직렬화이며, 여기서 알고리즘이 사용하는 JSON 객체로 대체됩니다.

모든 IRI컨텍스트에 지정된 대로 용어로 축약되었으며, 그 컨텍스트가 출력에 삽입되었음에 유의하십시오. 축약된 출력은 사람에게 유용할 뿐 아니라, 프로그래밍하기 쉬운 구조를 생성하는 데에도 사용됩니다. 축약은 개발자가 임의의 확장 문서를 애플리케이션별 축약 문서로 매핑할 수 있게 합니다. 위에 제공된 컨텍스트는 http://xmlns.com/foaf/0.1/namename으로 매핑했지만, 개발자가 제공하는 다른 임의의 용어로도 매핑할 수 있었습니다.

2.3 평탄화

이 절은 비규범입니다.

확장은 문서가 균일한 구조를 갖도록 보장하지만, 평탄화는 한 단계 더 나아가 데이터의 형태가 결정적이 되도록 보장합니다. 확장된 문서에서는 단일 노드프로퍼티가 여러 다른 노드 객체에 걸쳐 흩어져 있을 수 있습니다. 문서를 평탄화하면, 노드의 모든 프로퍼티가 하나의 노드 객체에 수집되고, 모든 빈 노드에는 빈 노드 식별자가 붙습니다. 이는 특정 애플리케이션에서 JSON-LD 데이터를 처리하는 데 필요한 코드를 크게 단순화할 수 있습니다.

예를 들어, 다음 JSON-LD 입력 문서가 있다고 가정합니다:

예제 9: 축약 형식의 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": [
    {"name": "Dave Longley"}
  ]
}

축약을 방지하기 위해 컨텍스트를 null로 설정하고 평탄화 알고리즘 (flatten()) 작업을 실행하면 다음 문서가 반환됩니다:

위 예제는 평탄화 알고리즘 출력의 JSON-LD 직렬화이며, 여기서 알고리즘이 사용하는 JSON 객체로 대체됩니다.

위 출력에서 노드의 모든 프로퍼티가 하나의 노드 객체에 수집되고, "Dave Longley"를 나타내는 빈 노드빈 노드 식별자 _:b0가 할당된 방식을 유의하십시오.

사람이 더 쉽게 읽거나 특정 애플리케이션이 더 쉽게 처리할 수 있도록, 평탄화된 문서는 컨텍스트를 전달하여 축약할 수 있습니다. 입력 문서와 동일한 컨텍스트를 사용하면, 평탄화되고 축약된 문서는 다음과 같습니다:

문서를 평탄화하고 축약한 결과는 항상 이며, (직렬화될 때는 JSON 객체로 표현됨), 기본 그래프를 나타내는 @graph 엔트리를 포함한다는 점에 유의하십시오.

2.4 RDF 직렬화/역직렬화

이 절은 비규범입니다.

JSON-LD는 [RDF11-CONCEPTS]에 설명된 대로 RDF 데이터를 직렬화하는 데 사용할 수 있습니다. 이는 데이터가 충실도의 손실 없이 임의의 RDF 구문으로 왕복 변환될 수 있음을 보장합니다.

예를 들어, Turtle [TURTLE]로 직렬화된 다음 RDF 입력이 있다고 가정합니다:

예제 12: 샘플 Turtle 문서
@prefix foaf: <http://xmlns.com/foaf/0.1/> .

<http://me.markus-lanthaler.com/>
  foaf:name "Markus Lanthaler" ;
  foaf:homepage <http://www.markus-lanthaler.com/> .

RDF를 JSON-LD로 직렬화하는 알고리즘을 사용하면 개발자는 이 문서를 확장된 JSON-LD로 변환할 수 있습니다:

예제 13: JSON-LD로 변환된 샘플 Turtle 문서
[
  {
    "@id": "http://me.markus-lanthaler.com/",
    "http://xmlns.com/foaf/0.1/name": [
      { "@value": "Markus Lanthaler" }
    ],
    "http://xmlns.com/foaf/0.1/homepage": [
      { "@id": "http://www.markus-lanthaler.com/" }
    ]
  }
]

위 예제는 RDF를 JSON-LD로 직렬화하는 알고리즘 출력의 JSON-LD 직렬화이며, 여기서 알고리즘이 사용하는 JSON 객체로 대체됩니다.

위 출력은 이전 절에서 설명한 기법을 사용하여 쉽게 축약할 수 있음에 유의하십시오. JSON-LD 문서를 JSON-LD를 RDF로 역직렬화하는 알고리즘을 사용하여 다시 RDF로 역직렬화하는 것도 가능합니다.

3. 적합성

비규범으로 표시된 절뿐만 아니라, 이 명세의 모든 작성 지침, 다이어그램, 예제 및 참고는 비규범입니다. 이 명세의 그 밖의 모든 것은 규범입니다.

이 문서에서 핵심 단어 MAY, MUST, MUST NOT, 및 SHOULD는 여기에 표시된 것처럼 모두 대문자로 나타나는 경우에만 BCP 14 [RFC2119] [RFC8174]에 설명된 대로 해석되어야 합니다.

이 명세에 대한 적합성을 주장할 수 있는 제품에는 두 가지 클래스가 있습니다: JSON-LD 프로세서RDF 직렬화기/역직렬화기입니다.

적합한 JSON-LD 프로세서는 이 명세에 정의된 알고리즘과 일관된 방식으로 확장, 축약, 및 평탄화 작업을 수행할 수 있는 시스템입니다.

JSON-LD 프로세서MUST NOT 잘못된 형식의 IRI 또는 언어 태그를 수정하려고 시도해서는 안 됩니다. 그러나 유효성 검사 경고를 발생시키는 것은 SHOULD입니다. IRI는 상대 IRI와 절대 IRI 사이의 변환 외에는 수정되지 않습니다.

적합한 RDF 직렬화기/역직렬화기는 이 명세에 정의된 대로 JSON-LD를 RDF로 역직렬화하고 RDF를 JSON-LD로 직렬화할 수 있는 시스템입니다.

processingMode API 옵션을 사용하여 지정하지 않는 한, 처리 모드는 로컬 컨텍스트 안의 @version 엔트리를 사용하여 설정되며, 확장축약을 포함한 알고리즘의 동작에 영향을 줍니다. 한 번 설정되면 다른 처리 모드로 변경하려는 시도는 오류이며, 프로세서는 MUST processing mode conflict 오류를 생성하고 추가 처리를 중단해야 합니다.

이 명세의 알고리즘은 일반적으로 효율성보다 명확성에 더 중점을 두고 작성되었습니다. 따라서 JSON-LD 프로세서는 이 명세에 제시된 알고리즘을 원하는 방식으로 구현할 수 있습니다. 단, 최종 결과가 이 명세의 알고리즘으로 얻을 수 있는 결과와 구별될 수 없어야 합니다.

키워드에 대한 작업을 설명하는 알고리즘 단계에서, 해당 단계는 키워드 별칭에도 적용됩니다.

참고

구현자는 JSON-LD 테스트 스위트의 테스트 케이스를 성공적으로 통과함으로써 이 명세에 대한 자신의 적합성 수준을 부분적으로 확인할 수 있습니다. 그러나 테스트 스위트의 모든 테스트를 통과한다고 해서 이 명세에 완전히 적합함을 의미하지는 않습니다. 이는 구현이 테스트 스위트에서 테스트한 측면에 적합함을 의미할 뿐입니다.

이 명세는 다음 네임스페이스 접두사를 사용합니다:

접두사 IRI
rdf http://www.w3.org/1999/02/22-rdf-syntax-ns#
xsd http://www.w3.org/2001/XMLSchema#

4. 컨텍스트 처리 알고리즘

다음 절에서는 JSON-LD 컨텍스트를 처리하기 위한 알고리즘을 설명합니다.

4.1 컨텍스트 처리 알고리즘

JSON-LD 데이터 구조를 처리할 때, 각 처리 규칙은 활성 컨텍스트가 제공하는 정보를 사용하여 적용됩니다. 이 절에서는 활성 컨텍스트를 생성하는 방법을 설명합니다.

활성 컨텍스트는 다음으로 구성됩니다:

용어 정의는 다음으로 구성됩니다:

용어 정의용어IRI에 매핑하는 데만 사용할 수 있는 것이 아니라, 용어키워드에 매핑하는 데도 사용할 수 있으며, 이 경우 이를 키워드 별칭이라고 합니다.

처리할 때, active contextnull 역 컨텍스트를 사용하여 초기화되며, 용어 정의, 어휘 매핑, 기본 기준 방향, 또는 기본 언어 없이 초기화됩니다. 처리 중 로컬 컨텍스트를 만나면, 기존 active context를 복제하여 새로운 active context가 생성됩니다. 그런 다음 로컬 컨텍스트의 정보가 새로운 active context에 병합됩니다. 로컬 컨텍스트는 원격 컨텍스트에 대한 참조를 포함할 수 있으므로, 여기에는 그 검색도 포함됩니다.

4.1.1 개요

이 절은 비규범입니다.

먼저 현재 활성 컨텍스트를 복제하여 새로운 활성 컨텍스트 result를 준비합니다. 그런 다음 원래 로컬 컨텍스트의 형식을 배열로 정규화합니다. 로컬 컨텍스트, 문자열, 또는 이 둘의 조합을 포함하는 배열 형태일 수 있습니다. 마지막으로 로컬 컨텍스트 배열에 포함된 각 컨텍스트를 다음과 같이 처리합니다.

컨텍스트문자열인 경우, 이는 원격 컨텍스트에 대한 참조를 나타냅니다. 원격 컨텍스트를 역참조하고, 가져온 JSON-LD 문서의 최상위 객체에 있는 @context 엔트리의 값으로 컨텍스트를 대체합니다. 그러한 엔트리가 없으면, invalid remote context가 감지된 것입니다. 그렇지 않으면 순환 참조가 없도록 보장하면서 이 알고리즘을 재귀적으로 사용하여 컨텍스트를 처리합니다.

컨텍스트인 경우, 이는 컨텍스트 정의입니다. 먼저 여섯 가지 특정 키워드 @base, @direction, @language, @propagate, @version, 및 @vocab을 처리하여 기준 IRI, 기본 기준 방향, 기본 언어, 컨텍스트 전파, 처리 모드, 그리고 어휘 매핑을 갱신합니다. 이들은 로컬 컨텍스트 안의 다른 엔트리가 처리되는 방식에 영향을 주므로, 다른 모든 엔트리보다 먼저 처리됩니다. 컨텍스트@import를 포함하는 경우, 이를 가져와 포함하는 컨텍스트에 역병합하여 JSON-LD 1.0 컨텍스트를 JSON-LD 1.1로 업그레이드할 수 있게 합니다. 원격 컨텍스트를 처리할 때는 @base가 무시된다는 점에 유의하십시오.

컨텍스트가 전파되지 않아야 하는 경우, 새로운 노드 객체에 들어갈 때 롤백할 수 있도록 이전 컨텍스트에 대한 참조가 유지됩니다. 기본적으로 타입 범위 컨텍스트를 제외한 모든 컨텍스트는 전파됩니다.

활성 컨텍스트가 초기화될 때, 원래 기준 URL의 값은 사용 가능한 경우 초기 컨텍스트를 포함하는 문서의 원래 documentUrl에서 초기화되고, 그렇지 않으면 base API 옵션에서 초기화됩니다. 이는 활성 컨텍스트null로 설정하여 재설정할 때 원래의 기본 기준 IRI를 유지하는 데 필요합니다.

초기화될 때, 또는 활성 컨텍스트의 엔트리가 변경될 때, 또는 관련 용어 정의가 추가, 변경 또는 제거될 때, 활성 컨텍스트 안의 역 컨텍스트 필드는 null로 설정됩니다.

그런 다음 로컬 컨텍스트 안의 다른 모든 엔트리에 대해, result 안의 용어 정의를 갱신합니다. 로컬 컨텍스트 안의 용어 정의 자체가 용어 또는 축약 IRI를 포함할 수 있으므로, 재귀가 필요할 수 있습니다. 그렇게 할 때 순환 의존성이 없음을 보장해야 하며, 이는 오류입니다. 용어 정의 의존성을 처리한 후, 현재 용어 정의를 갱신하며, 이는 키워드 별칭일 수 있습니다.

마지막으로, result를 새로운 활성 컨텍스트로 반환합니다.

4.1.2 알고리즘

이 알고리즘은 새로운 활성 컨텍스트로컬 컨텍스트로 어떻게 갱신되는지를 지정합니다. 알고리즘은 세 개의 필수 및 네 개의 선택적 입력 변수를 받습니다. 필수 입력은 active context, local context, 그리고 상대 컨텍스트 URL을 해석할 때 사용되는 base URL입니다. 선택적 입력은 배열 remote contexts로, 기본값은 새 빈 배열이며, 순환 컨텍스트 포함을 감지하는 데 사용됩니다. override protected는 기본값이 false이고, 보호된 용어의 변경을 허용하는 데 사용되며, propagate는 기본값이 true이고, 전파되지 않는 컨텍스트와 관련된 용어 정의를 표시하는 데 사용되며, validate scoped context는 기본값이 true이고, 재귀적일 수 있는 범위 지정 컨텍스트를 검증할 때 재귀를 제한하는 데 사용됩니다.

  1. resultactive context를 복제한 결과로 초기화하되, 역 컨텍스트null로 설정합니다.
  2. local context@propagate 멤버를 포함하는 객체인 경우, 그 값은 불리언 true 또는 false여야 MUST 하며, propagate를 그 값으로 설정합니다.
    참고
    오류 처리는 5.11단계에서 수행됩니다.
  3. propagatefalse이고 result이전 컨텍스트가 없는 경우, result 안의 이전 컨텍스트active context로 설정합니다.
  4. local context배열이 아닌 경우, local contextlocal context만 포함하는 배열로 설정합니다.
  5. local context 안의 각 항목 context에 대해:
    1. contextnull인 경우:
      1. override protectedfalse이고 active context보호된 용어 정의를 포함하는 경우, invalid context nullification이 감지되었으며 처리가 중단됩니다.
      2. result를 새로 초기화된 활성 컨텍스트로 초기화하되, 기준 IRI원래 기준 URL을 모두 active context 안의 원래 기준 URL 값으로 설정합니다. 그리고 propagatefalse인 경우, result 안의 이전 컨텍스트result의 이전 값으로 설정합니다.
      3. 다음 context로 계속합니다.
    2. context문자열인 경우,
      1. contextbase URL에 대해 context를 해석한 결과로 초기화합니다. base URL이 유효한 IRI가 아닌 경우, context는 유효한 IRI여야 MUST 하며, 그렇지 않으면 loading document failed 오류가 감지되어 처리가 중단됩니다.
        참고
        base URL은 종종 baseactive context기준 IRI와 같지 않습니다.
      2. validate scoped contextfalse이고, remote contexts가 이미 context를 포함하는 경우, context를 더 이상 처리하지 않고 local context 안의 다음 context로 계속합니다.
      3. remote contexts 배열의 엔트리 수가 프로세서가 정의한 제한을 초과하는 경우, context overflow 오류가 감지되어 처리가 중단됩니다. 그렇지 않으면 contextremote contexts에 추가합니다.
      4. context가 이전에 역참조된 경우, 프로세서는 추가 역참조를 수행해서는 MUST NOT 안 되며, 컨텍스트는 이전에 설정된 내부 표현으로 설정됩니다: context document를 이전에 역참조된 문서로 설정하고, loaded contextcontext document 안의 문서에서 @context 엔트리의 값으로 설정합니다.
        참고
        @context 엔트리만 유지하면 됩니다.
      5. 그렇지 않으면, context documentLoadDocumentCallback을 사용해 context를 역참조하여 얻은 RemoteDocument로 설정합니다. 이때 url에는 context를 전달하고, profilerequestProfile에는 http://www.w3.org/ns/json-ld#context를 전달합니다.
        1. context를 역참조할 수 없거나, context documentdocument내부 표현으로 변환할 수 없는 경우 , loading remote context failed 오류가 감지되어 처리가 중단됩니다.
        2. document@context 엔트리가 있는 최상위 이 없는 경우, invalid remote context가 감지되었으며 처리가 중단됩니다.
        3. loaded context를 그 엔트리의 값으로 설정합니다.
      6. 이 알고리즘을 재귀적으로 호출한 결과로 result를 설정합니다. active context에는 result를, local context에는 loaded context를, base URL에는 context documentdocumentUrl을, remote contexts복사본을, 그리고 validate scoped context 전달합니다.
        참고
        context가 이전에 역참조된 경우, 프로세서는 이 단계에서 처리 중 마주칠 수 있는 상대 컨텍스트 URL을 해석할 수 있도록, 해당 컨텍스트base URL을 유지하기 위한 조치를 취해야 MUST 합니다.
      7. 다음 context로 계속합니다.
    3. context이 아닌 경우, invalid local context 오류가 감지되어 처리가 중단됩니다.
    4. 그렇지 않으면, context컨텍스트 정의입니다.
    5. context@version 엔트리를 가진 경우:
      1. 관련 값이 1.1이 아닌 경우, invalid @version value가 감지되었으며 처리가 중단됩니다.
        참고
        @version의 값으로 1.1을 사용하는 것은 JSON-LD 1.0 프로세서가 처리를 중단하게 하려는 의도입니다. 이것이 JSON-LD 1.1과 관련되어 있음은 분명하지만, 그 밖에는 Semantic Versioning의 요구 사항을 준수하지 않습니다. 소수부가 0이 아닌 특별한 고려숫자의 값을 비교할 때 구현에 필요할 수 있습니다.
      2. 처리 모드json-ld-1.0으로 설정된 경우, processing mode conflict 오류가 감지되어 처리가 중단됩니다.
    6. context@import 엔트리를 가진 경우:
      1. 처리 모드json-ld-1.0인 경우, invalid context entry 오류가 감지되어 처리가 중단됩니다.
      2. 그렇지 않고 @import의 값이 문자열이 아닌 경우, invalid @import value 오류가 감지되어 처리가 중단됩니다.
      3. @import의 값을 base URL에 대해 해석한 결과로 import를 초기화합니다.
      4. LoadDocumentCallback을 사용하여 import를 역참조합니다. 이때 url에는 import를 전달하고, profilerequestProfile에는 http://www.w3.org/ns/json-ld#context를 전달합니다.
      5. import를 역참조할 수 없거나, 내부 표현으로 변환할 수 없는 경우, loading remote context failed 오류가 감지되어 처리가 중단됩니다.
      6. 역참조된 문서에 @context 엔트리가 있는 최상위 이 없거나, @context의 값이 컨텍스트 정의가 아닌 경우 (즉, 이 아닌 경우), invalid remote context가 감지되어 처리가 중단됩니다. 그렇지 않으면, import context를 그 엔트리의 값으로 설정합니다.
      7. import context@import 엔트리를 가진 경우, invalid context entry 오류가 감지되어 처리가 중단됩니다.
      8. contextcontextimport context에 병합한 결과로 설정하되, 공통 엔트리는 context의 엔트리로 대체합니다.
    7. context@base 엔트리를 가지고 있고 remote contexts가 비어 있는 경우, 즉 현재 처리 중인 컨텍스트가 원격 컨텍스트가 아닌 경우:
      1. value@base 엔트리와 관련된 값으로 초기화합니다.
      2. valuenull인 경우, result기준 IRI를 제거합니다.
      3. 그렇지 않고 valueIRI인 경우, result기준 IRIvalue로 설정합니다.
      4. 그렇지 않고 value상대 IRI 참조이고 result기준 IRInull이 아닌 경우, result기준 IRIresult의 현재 기준 IRI에 대해 value를 해석한 결과로 설정합니다.
      5. 그렇지 않으면, invalid base IRI 오류가 감지되어 처리가 중단됩니다.
    8. context@vocab 엔트리를 가진 경우:
      1. value@vocab 엔트리와 관련된 값으로 초기화합니다.
      2. valuenull인 경우, result에서 모든 어휘 매핑을 제거합니다.
      3. 그렇지 않고 valueIRI 또는 빈 노드 식별자인 경우, result어휘 매핑 document relativetrue를 사용하여 value에 대해 IRI 확장을 수행한 결과로 설정합니다. 그것이 IRI 또는 빈 노드 식별자가 아닌 경우, invalid vocab mapping 오류가 감지되어 처리가 중단됩니다.
        참고
        @vocab의 값으로 빈 노드 식별자를 사용하는 것은 더 이상 권장되지 않으며, 향후 JSON-LD 버전에서 제거될 수 있습니다.
    9. context@language 엔트리를 가진 경우:
      1. value@language 엔트리와 관련된 값으로 초기화합니다.
      2. valuenull인 경우, result에서 모든 기본 언어를 제거합니다.
      3. 그렇지 않고 value문자열인 경우, result기본 언어value로 설정합니다. 그것이 문자열이 아닌 경우, invalid default language 오류가 감지되어 처리가 중단됩니다. value가 [BCP47]의 2.2.9절에 따라 올바른 형식이 아닌 경우, 프로세서는 경고를 발생시키는 것이 SHOULD입니다.
        참고
        프로세서는 언어 태그를 소문자로 정규화할 MAY 있습니다.
    10. context@direction 엔트리를 가진 경우:
      1. 처리 모드json-ld-1.0인 경우, invalid context entry 오류가 감지되어 처리가 중단됩니다.
      2. value@direction 엔트리와 관련된 값으로 초기화합니다.
      3. valuenull인 경우, result에서 모든 기준 방향을 제거합니다.
      4. 그렇지 않고 value문자열인 경우, result기준 방향value로 설정합니다. 그것이 null, "ltr", 또는 "rtl"이 아닌 경우, invalid base direction 오류가 감지되어 처리가 중단됩니다.
    11. context@propagate 엔트리를 가진 경우:
      1. 처리 모드json-ld-1.0인 경우, invalid context entry 오류가 감지되어 처리가 중단됩니다.
      2. 그렇지 않고 @propagate의 값이 불리언 true 또는 false가 아닌 경우, invalid @propagate value 오류가 감지되어 처리가 중단됩니다.
        참고
        이전 컨텍스트는 실제로 이 알고리즘의 더 이른 단계에서 설정됩니다. 앞의 두 단계는 오류 확인만을 위해 존재합니다.
    12. defined를 생성하여 용어가 이미 정의되었는지 또는 재귀 중 현재 정의되고 있는지를 추적합니다.
    13. context 안의 각 key-value 쌍 중 key@base, @direction, @import, @language, @propagate, @protected, @version, 또는 @vocab이 아닌 것마다, 용어 정의 생성 알고리즘을 호출합니다. 이때 active context에는 result를, local context에는 context를, 그리고 key, defined, base URL, 있는 경우 context@protected 엔트리 값을 protected에, override protected, 그리고 remote contexts의 복사본을 전달합니다.
  6. result를 반환합니다.

4.2 용어 정의 생성

이 알고리즘은 컨텍스트 처리 알고리즘에서 호출되며, 로컬 컨텍스트에서 처리 중인 용어에 대해 활성 컨텍스트 안에 용어 정의를 생성합니다.

4.2.1 개요

이 절은 비규범입니다.

용어 정의는 주어진 용어에 대해 주어진 로컬 컨텍스트의 정보를 파싱하여 생성됩니다. 주어진 용어축약 IRI인 경우, 자체 용어 정의를 가진 접두사에 의존하여 IRI 매핑을 생략할 수 있습니다. 접두사로컬 컨텍스트 안의 엔트리인 경우, 계속하기 전에 재귀를 통해 그 용어 정의가 먼저 생성되어야 합니다. 용어 정의는 다른 용어 정의에 의존할 수 있으므로, 순환 의존성을 감지하기 위한 메커니즘을 사용해야 합니다. 여기서 사용하는 해법은 용어가 이미 정의되었는지 또는 현재 정의되는 과정에 있는지를 추적하는 맵 defined를 사용하는 것입니다. 이 맵은 재귀를 시도하기 전에 확인됩니다.

용어에 대한 모든 의존성이 정의된 후, 주어진 용어에 대한 로컬 컨텍스트 안의 나머지 정보를 고려하여, 해당 IRI 매핑, 컨테이너 매핑, 그리고 타입 매핑, 언어 매핑, 또는 방향 매핑을 그 용어에 대해 생성합니다.

4.2.2 알고리즘

이 알고리즘에는 네 개의 필수 및 다섯 개의 선택적 입력이 있습니다. 필수 입력은 active context, local context, term, 그리고 맵 defined입니다. 선택적 입력은 기본값이 nullbase URL, 기본값이 falseprotected, 보호된 용어의 변경을 허용하는 데 사용되며 기본값이 falseoverride protected, 순환 컨텍스트 포함을 감지하는 데 사용되며 기본값이 새 빈 배열배열 remote contexts, 그리고 재귀적일 수 있는 범위 지정 컨텍스트를 검증할 때 재귀를 제한하는 데 사용되며 기본값이 truevalidate scoped context입니다.

  1. definedterm 엔트리를 포함하고 관련 값이 true인 경우(이는 용어 정의가 이미 생성되었음을 나타냄), 반환합니다. 그렇지 않고 그 값이 false인 경우, cyclic IRI mapping 오류가 감지되었으며 처리가 중단됩니다.
  2. term이 빈 문자열("")인 경우, invalid term definition 오류가 감지되었으며 처리가 중단됩니다. 그렇지 않으면, definedterm 엔트리와 관련된 값을 false로 설정합니다. 이는 용어 정의가 이제 생성 중이지만 아직 완료되지 않았음을 나타냅니다.
  3. local context 안의 term 엔트리와 관련된 값의 복사본으로 value를 초기화합니다.
  4. term@type이고 처리 모드json-ld-1.0인 경우, keyword redefinition 오류가 감지되었으며 처리가 중단됩니다. 이 시점에서 value는 다음 엔트리 중 하나 또는 둘 모두만을 가진 이어야 MUST 합니다:
    • 값이 @set@container 엔트리.
    • @protected 엔트리.
    다른 값은 keyword redefinition 오류가 감지되었으며 처리가 중단됨을 의미합니다.
  5. 그렇지 않으면, 키워드는 재정의할 수 없으므로, term키워드여서는 MUST NOT 안 되며, keyword redefinition 오류가 감지되었으며 처리가 중단됩니다. term이 키워드의 형식을 가지는 경우 (즉, [RFC5234]의 ABNF 규칙 "@"1*ALPHA와 일치하는 경우), 반환합니다. 프로세서는 경고를 생성하는 것이 SHOULD입니다.
  6. active context 안의 term에 대한 기존 용어 정의가 있으면 이를 previous definition으로 초기화하고, 그 용어 정의active context에서 제거합니다.
  7. valuenull인 경우, 이를 키가 @id이고 값이 null인 단일 엔트리로 구성된 으로 변환합니다.
  8. 그렇지 않고 value문자열인 경우, 이를 키가 @id이고 값이 value인 단일 엔트리로 구성된 으로 변환합니다. simple termtrue로 설정합니다.
  9. 그렇지 않으면, value이어야 MUST 하며, 그렇지 않으면 invalid term definition 오류가 감지되었으며 처리가 중단됩니다. simple termfalse로 설정합니다.
  10. 용어 정의 definition을 생성하고, 접두사 플래그false로, 보호됨protected로, 그리고 역방향 프로퍼티false로 초기화합니다.
  11. value@protected 엔트리를 가진 경우, definition 안의 보호됨 플래그를 이 엔트리의 값으로 설정합니다. @protected의 값이 불리언이 아닌 경우, invalid @protected value 오류가 감지되었으며 처리가 중단됩니다. 처리 모드json-ld-1.0인 경우, invalid term definition이 감지되었으며 처리가 중단됩니다.
  12. value@type 엔트리를 포함하는 경우:
    1. @type 엔트리와 관련된 값으로 type을 초기화합니다. 이 값은 문자열이어야 MUST 합니다. 그렇지 않으면 invalid type mapping 오류가 감지되었으며 처리가 중단됩니다.
    2. local contextdefined를 사용하여 typeIRI 확장을 수행한 결과로 type을 설정합니다.
    3. 확장된 type@json 또는 @none이고, 처리 모드json-ld-1.0인 경우, invalid type mapping 오류가 감지되었으며 처리가 중단됩니다.
    4. 그렇지 않고 확장된 type@id, @json, @none, @vocab, 또는 IRI 중 어느 것도 아닌 경우, invalid type mapping 오류가 감지되었으며 처리가 중단됩니다.
    5. definition타입 매핑type으로 설정합니다.
  13. value@reverse 엔트리를 포함하는 경우:
    1. value@id 또는 @nest 엔트리를 포함하는 경우, invalid reverse property 오류가 감지되었으며 처리가 중단됩니다.
    2. @reverse 엔트리와 관련된 값이 문자열이 아닌 경우, invalid IRI mapping 오류가 감지되었으며 처리가 중단됩니다.
    3. @reverse 엔트리와 관련된 값이 키워드의 형식을 가지는 문자열인 경우 (즉, [RFC5234]의 ABNF 규칙 "@"1*ALPHA와 일치하는 경우), 반환합니다. 프로세서는 경고를 생성하는 것이 SHOULD입니다.
    4. 그렇지 않으면, local contextdefined를 사용하여 @reverse 엔트리와 관련된 값에 IRI 확장을 수행한 결과로 definitionIRI 매핑을 설정합니다. 그 결과가 형식IRI 또는 빈 노드 식별자가 아닌 경우, invalid IRI mapping 오류가 감지되었으며 처리가 중단됩니다.
    5. value@container 엔트리를 포함하는 경우, definition컨테이너 매핑을 그 값을 포함하는 배열로 설정합니다. 그 값이 @set, @index, 또는 null 중 어느 것도 아닌 경우, invalid reverse property 오류가 감지되었으며(역방향 프로퍼티는 set 및 index 컨테이너만 지원함) 처리가 중단됩니다.
    6. definition역방향 프로퍼티 플래그를 true로 설정합니다.
    7. active context 안의 term용어 정의definition으로 설정하고, definedterm 엔트리와 관련된 값을 true로 설정한 뒤 반환합니다.
  14. value@id 엔트리를 포함하고 그 값이 term과 같지 않은 경우:
    1. value@id 엔트리null인 경우, 이 용어는 IRI 확장에 사용되지 않지만, 향후 이 용어의 재정의를 감지할 수 있도록 유지됩니다.
    2. 그렇지 않으면:
      1. @id 엔트리와 관련된 값이 문자열이 아닌 경우, invalid IRI mapping 오류가 감지되었으며 처리가 중단됩니다.
      2. @id 엔트리와 관련된 값이 키워드가 아니지만, 키워드의 형식을 가지는 경우 (즉, [RFC5234]의 ABNF 규칙 "@"1*ALPHA와 일치하는 경우), 반환합니다. 프로세서는 경고를 생성하는 것이 SHOULD입니다.
      3. 그렇지 않으면, local contextdefined를 사용하여 @id 엔트리와 관련된 값에 IRI 확장을 수행한 결과로 definitionIRI 매핑을 설정합니다. 결과로 나온 IRI 매핑키워드, IRI, 또는 빈 노드 식별자 중 어느 것도 아닌 경우, invalid IRI mapping 오류가 감지되었으며 처리가 중단됩니다. 그것이 @context와 같으면, invalid keyword alias 오류가 감지되었으며 처리가 중단됩니다.
      4. term이 콜론 (:)을 첫 번째 또는 마지막 문자가 아닌 위치에 포함하거나, 슬래시(/)를 어디든 포함하는 경우:
        1. definedterm 엔트리와 관련된 값을 true로 설정합니다.
        2. local contextdefined를 사용하여 termIRI 확장을 수행한 결과가 definitionIRI 매핑과 같지 않은 경우, invalid IRI mapping 오류가 감지되었으며 처리가 중단됩니다.
      5. term이 콜론(:)도 슬래시(/)도 포함하지 않고, simple termtrue이며, definitionIRI 매핑gen-delim 문자로 끝나는 IRI이거나, 빈 노드 식별자인 경우, definition 안의 접두사 플래그true로 설정합니다.
  15. 그렇지 않고 term첫 번째 문자 뒤의 어디든 콜론(:)을 포함하는 경우:
    1. termlocal context 안의 엔트리접두사를 가진 축약 IRI인 경우, 의존성이 발견된 것입니다. 이 알고리즘을 재귀적으로 사용하되, active context, local context, term으로서의 접두사, 그리고 defined를 전달합니다.
    2. term접두사active context 안에 용어 정의를 가지고 있다면, definitionIRI 매핑접두사IRI 매핑termsuffix를 연결한 결과로 설정합니다.
    3. 그렇지 않으면, termIRI 또는 빈 노드 식별자입니다. definitionIRI 매핑term으로 설정합니다.
  16. 그렇지 않고 term이 슬래시(/)를 포함하는 경우:
    1. Term상대 IRI 참조입니다.
    2. definitionIRI 매핑termIRI 확장을 수행한 결과로 설정합니다. 결과로 나온 IRI 매핑IRI가 아닌 경우, invalid IRI mapping 오류가 감지되었으며 처리가 중단됩니다.
  17. 그렇지 않고 term이 @type인 경우, definitionIRI 매핑@type으로 설정합니다.
  18. 그렇지 않고 active context어휘 매핑을 가지고 있다면, definitionIRI 매핑어휘 매핑과 관련된 값과 term을 연결한 결과로 설정합니다. 어휘 매핑이 없는 경우, invalid IRI mapping 오류가 감지되었으며 처리가 중단됩니다.
  19. value@container 엔트리를 포함하는 경우:
    1. @container 엔트리와 관련된 값으로 container를 초기화합니다. 이 값은 @graph, @id, @index, @language, @list, @set, @type, 또는 정확히 이 키워드 중 하나를 포함하는 배열, @graph@id 또는 @index 중 하나를 포함하고 선택적으로 @set을 포함하는 배열, 또는 임의의 순서로 @set@index, @graph, @id, @type, @language 중 임의의 조합을 포함하는 배열 이어야 MUST 합니다. 그렇지 않으면 invalid container mapping이 감지되었으며 처리가 중단됩니다.
    2. 컨테이너 값이 @graph, @id, 또는 @type이거나, 그 밖에 문자열이 아닌 경우, 처리 모드json-ld-1.0이면 invalid container mapping 오류를 생성하고 처리를 중단합니다.
    3. definition컨테이너 매핑container로 설정하되, 필요한 경우 배열로 강제 변환합니다.
    4. definition컨테이너 매핑@type을 포함하는 경우:
      1. definition 안의 type mapping이 정의되지 않은 경우, 이를 @id로 설정합니다.
      2. definition 안의 type mapping@id@vocab도 아닌 경우, invalid type mapping 오류가 감지되었으며 처리가 중단됩니다.
  20. value@index 엔트리를 포함하는 경우:
    1. 처리 모드json-ld-1.0이거나 컨테이너 매핑@index를 포함하지 않는 경우, invalid term definition이 감지되었으며 처리가 중단됩니다.
    2. @index 엔트리와 관련된 값으로 index를 초기화합니다. 그 값에 IRI 확장을 수행한 결과가 IRI가 아닌 경우, invalid term definition이 감지되었으며 처리가 중단됩니다.
    3. definition인덱스 매핑index로 설정합니다
  21. value@context 엔트리를 포함하는 경우:
    1. 처리 모드json-ld-1.0인 경우, invalid term definition이 감지되었으며 처리가 중단됩니다.
    2. @context 엔트리와 관련된 값으로 context를 초기화합니다. 이는 로컬 컨텍스트로 취급됩니다.
    3. active context, local context로서의 context, base URL, override protected에는 true, remote contexts복사본, 그리고 validate scoped context에는 false를 사용하여 컨텍스트 처리 알고리즘을 호출합니다. 오류가 감지되면, invalid scoped context 오류가 감지되었으며 처리가 중단됩니다.
      참고

      컨텍스트 처리 알고리즘의 결과는 폐기됩니다. 이는 정의 시점의 오류를 감지하기 위해 호출됩니다. 사용되는 경우, 그 컨텍스트는 활성 컨텍스트에 대해 확장 또는 축약의 일부로 다시 처리되어 적용됩니다.

    4. definition로컬 컨텍스트context로 설정하고, base URLbase URL로 설정합니다.
  22. value@language 엔트리를 포함하고 @type 엔트리를 포함하지 않는 경우:
    1. @language 엔트리와 관련된 값으로 language를 초기화합니다. 이는 null 또는 문자열이어야 MUST 합니다. language가 [BCP47]의 2.2.9절에 따라 올바른 형식이 아닌 경우, 프로세서는 경고를 발생시키는 것이 SHOULD입니다. 그렇지 않으면, invalid language mapping 오류가 감지되었으며 처리가 중단됩니다.
    2. definition언어 매핑language로 설정합니다.
      참고
      프로세서는 언어 태그를 소문자로 정규화할 MAY 있습니다.
  23. value@direction 엔트리를 포함하고 @type 엔트리를 포함하지 않는 경우:
    1. @direction 엔트리와 관련된 값으로 direction을 초기화합니다. 이는 null, "ltr", 또는 "rtl"이어야 MUST 합니다. 그렇지 않으면 invalid base direction 오류가 감지되었으며 처리가 중단됩니다.
    2. definition방향 매핑direction으로 설정합니다.
  24. value@nest 엔트리를 포함하는 경우:
    1. 처리 모드json-ld-1.0인 경우, invalid term definition이 감지되었으며 처리가 중단됩니다.
    2. definition 안의 nest 값@nest 엔트리와 관련된 값으로 초기화합니다. 이는 문자열이어야 MUST 하며, @nest가 아닌 키워드여서는 MUST NOT 안 됩니다. 그렇지 않으면 invalid @nest value 오류가 감지되었으며 처리가 중단됩니다.
  25. value@prefix 엔트리를 포함하는 경우:
    1. 처리 모드json-ld-1.0이거나, term이 콜론(:) 또는 슬래시(/)를 포함하는 경우, invalid term definition이 감지되었으며 처리가 중단됩니다.
    2. 접두사 플래그@prefix 엔트리와 관련된 값으로 설정합니다. 이는 불리언이어야 MUST 합니다. 그렇지 않으면 invalid @prefix value 오류가 감지되었으며 처리가 중단됩니다.
    3. definition접두사 플래그true로 설정되어 있고, 그 IRI 매핑키워드인 경우, invalid term definition이 감지되었으며 처리가 중단됩니다.
  26. value@id, @reverse, @container, @context, @direction, @index, @language, @nest, @prefix, @protected, 또는 @type 이외의 엔트리를 포함하는 경우, invalid term definition 오류가 감지되었으며 처리가 중단됩니다.
  27. override protectedfalse이고 previous definition이 존재하며 보호되어 있는 경우;
    1. definitionprevious definition과 같지 않은 경우 (보호됨의 값을 제외하고), protected term redefinition 오류가 감지되었으며, 처리가 중단됩니다.
    2. 보호됨의 값을 유지하기 위해 definitionprevious definition으로 설정합니다.
  28. active context 안의 term용어 정의definition으로 설정하고, definedterm 엔트리와 관련된 값을 true로 설정합니다.

4.3 역 컨텍스트 생성

용어가 둘 이상 있어서 IRI를 축약하는 데 선택될 수 있는 경우, 용어 선택이 결정적이면서도 알고리즘 복잡도를 고려한 가장 컨텍스트에 적합한 선택을 나타내도록 보장해야 합니다.

용어 선택을 수행하기 위해, 역 컨텍스트의 개념이 도입됩니다. 역 컨텍스트는 본질적으로 주어진 활성 컨텍스트에 대해 컨테이너 매핑, 타입 매핑, 그리고 언어 매핑을 단순한 용어에 매핑하는 역방향 조회 테이블입니다. 역 컨텍스트축약에 사용되는 경우에만 활성 컨텍스트에 대해 생성될 필요가 있습니다.

역 컨텍스트를 사용하기 위해, 특정 IRI와 관련된 값에 대해 선호되는 컨테이너 매핑 목록과 타입 매핑 또는 언어 매핑이 수집됩니다. 그런 다음 이러한 매개변수가 용어 선택 알고리즘에 전달되며, 이 알고리즘은 값의 매핑과 가장 적절하게 일치하는 용어를 찾습니다.

4.3.1 개요

이 절은 비규범입니다.

주어진 활성 컨텍스트에 대한 역 컨텍스트를 생성하려면, 활성 컨텍스트 안의 각 용어를 길이순으로, 가장 짧은 것부터 방문합니다(동률은 사전순으로 가장 작은 용어를 선택하여 해결합니다). 각 용어에 대해, 그 역 컨텍스트에 합법적으로 해당 용어와 일치할 수 있는 컨테이너 매핑타입 매핑 또는 언어 매핑의 가능한 각 조합에 대한 엔트리가 추가됩니다. 불법적인 일치에는 값의 타입 매핑 또는 언어 매핑과 그 용어의 매핑 사이의 차이가 포함됩니다. 용어컨테이너 매핑, 타입 매핑, 또는 언어 매핑이 없거나 (또는 이들의 일부 조합이 없는 경우), 그 용어는 특수 키 @none을 사용하여 역 컨텍스트 안에 엔트리를 갖습니다. 이를 통해 용어 선택 알고리즘은 특정 IRI와 값 조합에 대해 더 구체적으로 일치하는 용어를 사용할 수 없을 때, 더 일반적인 용어를 선택하도록 대체할 수 있습니다.

언어 태그를 정규화하는 것은 선택 사항이지만, 역 컨텍스트는 정규화된 언어 태그를 기반으로 엔트리를 생성하므로, 표현 방식과 관계없이 적절한 용어를 선택할 수 있습니다.

4.3.2 알고리즘

이 알고리즘은 하나의 필수 입력을 받습니다: 해당 역 컨텍스트가 생성되는 대상인 active context입니다.

  1. result를 빈 으로 초기화합니다.
  2. default language@none으로 초기화합니다. active context기본 언어가 있으면, default language활성 컨텍스트기본 언어로 설정하되 소문자로 정규화합니다.
  3. active context 안의 각 키 term와 값 term definition에 대해, 가장 짧은 용어가 먼저 오도록 정렬합니다(동률은 사전순으로 가장 작은 용어를 선택하여 해결합니다):
    1. 용어 정의null이면, 용어축약 중에 선택될 수 없으므로, 다음 용어로 계속합니다.
    2. container@none으로 초기화합니다. 컨테이너 매핑이 비어 있지 않으면, container컨테이너 매핑의 모든 값을 사전순으로 연결한 값으로 설정합니다 .
    3. var를 해당 용어 정의IRI 매핑 값으로 초기화합니다.
    4. varresult엔트리가 아닌 경우, 키가 var이고 값이 빈 엔트리result에 추가합니다.
    5. result 안의 var 엔트리와 관련된 값을 container map 변수로 참조합니다.
    6. container mapcontainer 엔트리가 없는 경우, 이를 생성하고 그 값을 세 개의 엔트리를 가진 새 으로 설정합니다. 첫 번째 엔트리@language이고 그 값은 새 빈 이며, 두 번째 엔트리@type이고 그 값은 새 빈 입니다. 그리고 세 번째 엔트리@any이고 그 값은 처리 중인 용어로 설정된 @none 엔트리를 가진 새 입니다.
    7. container map 안의 container 엔트리와 관련된 값을 type/language map 변수로 참조합니다.
    8. type/language map 안의 @type 엔트리와 관련된 값을 type map 변수로 참조합니다.
    9. type/language map 안의 @language 엔트리와 관련된 값을 language map 변수로 참조합니다.
    10. 용어 정의용어역방향 프로퍼티를 나타낸다고 표시하는 경우:
      1. type map@reverse 엔트리가 없으면, 이를 생성하고 그 값을 처리 중인 용어로 설정합니다.
    11. 그렇지 않고 용어 정의@none타입 매핑을 가진 경우:
      1. language map@any 엔트리가 없으면, 이를 생성하고 그 값을 처리 중인 용어로 설정합니다.
      2. type map@any 엔트리가 없으면, 이를 생성하고 그 값을 처리 중인 용어로 설정합니다.
    12. 그렇지 않고 용어 정의타입 매핑을 가진 경우:
      1. type map용어 정의 안의 타입 매핑에 해당하는 엔트리가 없으면, 이를 생성하고 그 값을 처리 중인 용어로 설정합니다.
    13. 그렇지 않고 용어 정의언어 매핑방향 매핑을 둘 다 가진 경우:
      1. 새 변수 lang dir를 생성합니다.
      2. 언어 매핑방향 매핑 둘 다 null이 아닌 경우, lang dir언어 매핑방향 매핑을 밑줄("_")로 구분하여 연결한 값으로 설정하고 소문자로 정규화합니다.
      3. 그렇지 않고 언어 매핑null이 아닌 경우, lang dir를 소문자로 정규화한 언어 매핑으로 설정합니다.
      4. 그렇지 않고 방향 매핑null이 아닌 경우, lang dir를 밑줄("_")이 앞에 붙은 방향 매핑으로 설정합니다.
      5. 그렇지 않으면 lang dir@null로 설정합니다.
      6. language maplang dir 엔트리가 없으면, 이를 생성하고 그 값을 처리 중인 용어로 설정합니다.
    14. 그렇지 않고 용어 정의언어 매핑을 가진 경우(null일 수 있음):
      1. 언어 매핑null과 같으면 language@null로 설정합니다. 그렇지 않으면 소문자로 정규화한 언어 매핑으로 설정합니다.
      2. language maplanguage 엔트리가 없으면, 이를 생성하고 그 값을 처리 중인 용어로 설정합니다.
    15. 그렇지 않고 용어 정의방향 매핑을 가진 경우(null일 수 있음):
      1. 방향 매핑null과 같으면 direction@none으로 설정합니다. 그렇지 않으면 밑줄("_")이 앞에 붙은 방향 매핑으로 설정합니다.
      2. language mapdirection 엔트리가 없으면, 이를 생성하고 그 값을 처리 중인 용어로 설정합니다.
    16. 그렇지 않고 active context기본 기준 방향을 가진 경우:
      1. 기본 언어기본 기준 방향을 밑줄("_")로 구분하여 연결하고 소문자로 정규화한 값으로 변수 lang dir를 초기화합니다.
      2. language maplang dir 엔트리가 없으면, 이를 생성하고 그 값을 처리 중인 용어로 설정합니다.
      3. language map@none 엔트리가 없으면, 이를 생성하고 그 값을 처리 중인 용어로 설정합니다.
      4. type map@none 엔트리가 없으면, 이를 생성하고 그 값을 처리 중인 용어로 설정합니다.
    17. 그렇지 않으면:
      1. language mapdefault language 엔트리가 없으면 (소문자로 정규화한 후), 이를 생성하고 그 값을 처리 중인 용어로 설정합니다.
      2. language map@none 엔트리가 없으면, 이를 생성하고 그 값을 처리 중인 용어로 설정합니다.
      3. type map@none 엔트리가 없으면, 이를 생성하고 그 값을 처리 중인 용어로 설정합니다.
  4. result를 반환합니다.

4.4 용어 선택

이 알고리즘은 IRI 축약 알고리즘을 통해 호출되며, 활성 컨텍스트역 컨텍스트를 사용하여 용어IRI축약하는 데 가장 적합하게 사용되는 것을 찾습니다. IRI와 관련된 값에 대한 다른 정보도 제공되며, 여기에는 그 값을 표현하는 데 가장 잘 사용될 컨테이너 매핑타입 매핑 또는 언어 매핑이 포함됩니다.

4.4.1 개요

이 절은 비규범입니다.

역 컨텍스트IRI에 대한 엔트리는 먼저 선호되는 컨테이너 매핑에 따라, 주어진 순서대로 검색됩니다. 일치하는 컨테이너 매핑을 가진 용어 중에서는, 일치하는 타입 매핑 또는 언어 매핑을 가진 것들이, 타입 매핑 또는 언어 매핑이 없는 것보다 선호됩니다. 일치하는 컨테이너 매핑을 가진 용어가 없으면, 주어진 타입 매핑 또는 언어 매핑과 일치하는, 컨테이너 매핑이 없는 용어가 선택됩니다. 그래도 선택된 용어가 없으면, 가능한 경우 타입 매핑 또는 언어 매핑이 없는 용어가 선택됩니다. 충돌하는 타입 매핑 또는 언어 매핑을 가진 용어는 선택되지 않습니다. 동일한 매핑을 가진 용어 간의 동률은 먼저 가장 짧은 용어를 선택하고, 그다음 사전순으로 가장 작은 용어를 선택하여 해결됩니다. 이러한 동률은 역 컨텍스트 생성 알고리즘역 컨텍스트를 만들 때 이미 해결되었기 때문에 자동으로 해결된다는 점에 유의하십시오.

4.4.2 알고리즘

이 알고리즘에는 다섯 개의 필수 입력이 있습니다. 그것들은: active context, 키워드 또는 IRI var, 선호되는 컨테이너 매핑의 순서 있는 목록을 나타내는 배열 containers, 일치하는 타입 매핑 또는 언어 매핑을 가진 용어를 찾을지 여부를 나타내는 문자열 type/language, 그리고 찾을 타입 매핑 또는 언어 매핑에 대한 preferred values의 순서 있는 목록을 나타내는 배열입니다.

  1. active contextnull 역 컨텍스트를 가진 경우, active context 안의 역 컨텍스트active context를 사용하여 역 컨텍스트 생성 알고리즘을 호출한 결과로 설정합니다.
  2. inverse contextactive context 안의 역 컨텍스트 값으로 초기화합니다.
  3. container mapinverse context 안의 var와 관련된 값으로 초기화합니다.
  4. containers 안의 각 항목 container에 대해:
    1. containercontainer map엔트리가 아닌 경우, 그에 대해 일치하는 컨테이너 매핑을 가진 용어가 없으므로, 다음 container로 계속합니다.
    2. type/language mapcontainer map 안의 container 엔트리와 관련된 값으로 초기화합니다.
    3. value maptype/language map 안의 type/language 엔트리와 관련된 값으로 초기화합니다.
    4. preferred values 안의 각 item에 대해:
      1. itemvalue map엔트리가 아닌 경우, 일치하는 타입 매핑 또는 언어 매핑을 가진 용어가 없으므로, 다음 item으로 계속합니다.
      2. 그렇지 않으면, 일치하는 용어가 발견된 것이므로, value map 안의 item 엔트리와 관련된 값을 반환합니다.
  5. 일치하는 용어를 찾지 못했습니다. null을 반환합니다.

4.4.3 예제

이 절은 비규범입니다.

다음 예제는 다양한 용어 정의와 값에 대해 용어 선택 알고리즘이 어떻게 동작하는지 설명하기 위한 것입니다. 포괄적이지는 않지만, 알고리즘의 여러 부분을 설명하기 위한 것입니다.

언어 맵 용어

용어 정의가 "@container": "@language"를 가지는 경우, 이는 @type이 없는 값 객체에만 일치합니다.

데이터타입이 지정된 용어

용어 정의가 데이터타입을 가지는 경우, 이는 일치하는 데이터타입을 가진 값 객체에만 일치합니다.

5. 확장 알고리즘

다음 절에서는 JSON-LD 문서, IRI 및 값을 확장하기 위한 알고리즘을 설명합니다.

5.1 확장 알고리즘

이 알고리즘은 JSON-LD 문서를 확장하여, 모든 컨텍스트 정의가 제거되고, 모든 용어축약 IRIIRI, 빈 노드 식별자, 또는 키워드로 확장되며, 모든 JSON-LD 값배열 안의 확장 형식으로 표현되게 합니다.

5.1.1 개요

이 절은 비규범입니다.

루트 element에서 시작하여, 완전히 확장된 result가 생길 때까지 JSON-LD 문서를 재귀적으로 처리할 수 있습니다. element확장할 때에는, 문제를 나누기 위해 그 타입에 따라 각각 다르게 처리할 수 있습니다:

  1. elementnull이면, 확장할 것이 없습니다.
  2. 그렇지 않고 element스칼라이면, 값 확장 알고리즘에 따라 이를 확장합니다.
  3. 그렇지 않고 element배열이면, 각 항목을 재귀적으로 확장하고 새 배열로 반환합니다.
  4. 그렇지 않으면, element입니다. 각 엔트리를 확장하여 result에 추가한 다음, 각 엔트리의 각 값을 재귀적으로 확장합니다. 일부 엔트리 키는 용어 또는 축약 IRI이고, 다른 키는 키워드이거나, 컨텍스트에 정의가 없기 때문에 단순히 무시됩니다. 모든 IRIIRI 확장 알고리즘을 사용하여 확장됩니다.

마지막으로, result배열 안에 있음을 보장한 후, result를 반환합니다.

참고

[RDF11-CONCEPTS]에 기반한 데이터 모델은 순서 없는 여러 프로퍼티 값을 지원하지 않지만, 이 알고리즘은 순서 없는 배열 안에서 확장 중 발견될 수 있는 중복을 제거하지 않습니다. § 6.1 축약 알고리즘§ 7.1 평탄화 알고리즘 같은 다른 알고리즘은 순서 없는 배열에서 중복 값을 제거합니다. 이 명세의 향후 버전은 배열 값이 집합을 형성할 때 중복 배열 값을 제거하도록 갱신될 수 있습니다.

5.1.2 알고리즘

이 알고리즘은 네 개의 필수 및 세 개의 선택적 입력 변수를 받습니다. 필수 입력은 active context, active property, 확장할 element, 그리고 확장할 원본 문서의 documentUrl와 관련된 base URL입니다. 선택적 입력은 frameExpansion 플래그로, 프레임 확장에 사용되는 특수한 입력 형식을 허용하며, ordered 플래그로, 명시된 곳에서 맵 엔트리 키를 사전순으로 정렬하는 데 사용되고, from map 플래그로, 전파되지 않는 컨텍스트와 관련된 활성 컨텍스트 안의 이전 용어 정의를 되돌리는 것을 제어하는 데 사용됩니다. 전달되지 않으면, 선택적 플래그는 false로 설정됩니다.

이 알고리즘은 JSON-LD 프레임을 확장하기 위한 처리 단계도 수행합니다. 프레임에서는 @id@type 엔트리IRI의 배열이나 빈 을 허용할 수 있습니다. 값 객체엔트리문자열배열이나 빈 을 허용할 수 있습니다. 프레이밍은 확장 중 보존되는 추가 키워드 엔트리도 사용합니다: (@explicit, @default, @embed, @explicit, @omitDefault, 또는 @requireAll). JSON-LD 프레임을 위한 특수 처리는 frameExpansion 플래그가 true로 설정될 때 호출됩니다.

참고

용어 [JSON-LD11]에서 언급했듯이, 향후 호환성 문제를 피하기 위해 용어@ 문자로 시작하지 않는 것이 좋습니다. JSON-LD의 향후 버전이 추가 키워드를 도입할 수 있기 때문입니다. 이 알고리즘은 그러한 용어를 다른 용어와 동일하게 처리합니다. 즉, IRI에 매핑되지 않는 한 무시됩니다. 이 알고리즘의 구현은 이러한 용어가 발견될 때 경고를 표시하기 위한 런타임 플래그 제공을 고려할 수 있습니다.

참고

용어("")의 사용은 허용되지 않습니다. 모든 프로그래밍 언어가 빈 JSON 키를 처리할 수 있는 것은 아니기 때문입니다. 이 알고리즘의 구현은 이러한 용어가 발견될 때 경고를 표시하기 위한 런타임 플래그 제공을 고려할 수 있습니다.

참고

프로퍼티에 레이블을 붙이기 위해 빈 노드 식별자를 사용하는 것은 더 이상 사용되지 않으며, JSON-LD의 향후 버전에서 제거될 수 있습니다. 이 알고리즘의 구현은 이러한 용어가 발견될 때 경고를 표시하기 위한 런타임 플래그 제공을 고려할 수 있습니다.

  1. elementnull이면, null을 반환합니다.
  2. active property@default이면, frameExpansion 플래그를 false로 초기화합니다.
  3. active propertyactive context 안에 로컬 컨텍스트가 있는 용어 정의를 가지면, property-scoped context를 해당 로컬 컨텍스트로 초기화합니다.
  4. element스칼라인 경우,
    1. active propertynull 또는 @graph이면, 자유롭게 떠 있는 스칼라null을 반환하여 버립니다.
    2. property-scoped context가 정의되어 있으면, active context컨텍스트 처리 알고리즘의 결과로 설정하며, active context, local context로서의 property-scoped context, 그리고 active property에 대한 active context 안의 용어 정의에서 온 base URL을 전달합니다.
    3. active context, active property, 그리고 value로서의 element를 전달하여 값 확장 알고리즘의 결과를 반환합니다.
  5. element배열인 경우,
    1. 빈 배열 result를 초기화합니다.
    2. element 안의 각 item에 대해:
      1. 이 알고리즘을 재귀적으로 사용한 결과로 expanded item을 초기화합니다. 이때 active context, active property, element로서의 item, base URL, frameExpansionordered, 그리고 from map 플래그를 전달합니다.
      2. active property컨테이너 매핑@list를 포함하고, expanded item배열이면, expanded item을 원래 expanded item을 값으로 하는 @list 엔트리를 포함하는 새 으로 설정합니다.
      3. expanded item배열이면, 그 각 항목을 result에 추가합니다. 그렇지 않고 expanded item이 null이 아니면, 이를 result에 추가합니다.
    3. result를 반환합니다.
  6. 그렇지 않으면 element입니다.
  7. active context이전 컨텍스트를 가지면, active context는 전파되지 않습니다. from map이 정의되지 않았거나 false이고, element@value로 확장되는 엔트리를 포함하지 않으며, element@id로 확장되는 단일 엔트리로만 구성되지 않는 경우 (엔트리IRI 확장), 새 노드 객체를 처리할 때는 용어 범위 컨텍스트의 범위가 적용되지 않으므로, active contextactive context이전 컨텍스트로 설정합니다.
  8. property-scoped context가 정의되어 있으면, active context컨텍스트 처리 알고리즘의 결과로 설정하며, active context, local context로서의 property-scoped context, active property에 대한 active context 안의 용어 정의에서 온 base URL, 그리고 override protectedtrue를 전달합니다.
  9. element@context 엔트리를 포함하는 경우, active context컨텍스트 처리 알고리즘의 결과로 설정하며, active context, @context 엔트리의 값을 local context그리고 base URL을 전달합니다.
  10. type-scoped contextactive context로 초기화합니다. 이는 이전의 어떤 타입 범위 컨텍스트와 관련될 수 있는 값을 확장하는 데 사용됩니다.
  11. element 안의 각 keyvalue 중에서, key@type으로 IRI 확장되는 것들을 key 기준 사전순으로 처리합니다:
    1. 필요하면 value배열로 변환합니다.
    2. 사전순으로 정렬된 value의 값인 각 term에 대해, term문자열이고, type-scoped context 안의 term용어 정의로컬 컨텍스트를 가지면, active context컨텍스트 처리 알고리즘의 결과로 설정합니다. 이때 active context, term로컬 컨텍스트 값을 local context로, active context 안의 value에 대한 용어 정의에서 온 base URL, 그리고 propagatefalse를 전달합니다.
  12. 두 개의 빈 , result nests를 초기화합니다. input typeelement 안에서 @type으로 확장되는 첫 번째 엔트리의 마지막 값을 확장한 결과로 초기화합니다(있는 경우). 이때 엔트리는 키 기준 사전순으로 정렬합니다. 일치한 엔트리의 키와 값은 모두 IRI 확장됩니다.
  13. element 안의 각 keyvalue에 대해, orderedtrue이면 key 기준 사전순으로 처리합니다:
    1. key@context이면, 다음 key로 계속합니다.
    2. keyIRI 확장한 결과로 expanded property를 초기화합니다.
    3. expanded propertynull이거나, 콜론(:)을 포함하지도 않고 키워드도 아닌 경우, 다음 key로 계속하여 key를 버립니다.
    4. expanded property키워드인 경우:
      1. active property@reverse와 같으면, invalid reverse property map 오류가 감지되었으며 처리가 중단됩니다.
      2. result에 이미 expanded property 엔트리가 있는 경우, @included 또는 @type 이외 (처리 모드json-ld-1.0인 경우는 제외), colliding keywords 오류가 감지되었으며 처리가 중단됩니다.
      3. expanded property@id인 경우:
        1. value문자열이 아니면, invalid @id value 오류가 감지되었으며 처리가 중단됩니다. frameExpansion 플래그가 설정된 경우, value는 빈 이거나, 하나 이상의 문자열로 이루어진 배열MAY 있습니다.
        2. 그렇지 않으면, truedocument relative로, falsevocab로 사용하여 valueIRI 확장한 결과로 expanded value를 설정합니다. frameExpansion 플래그가 설정된 경우, expanded value는 하나 이상의 값으로 이루어진 배열이며, 문자열 값은 위와 같이 IRI 확장 알고리즘을 사용하여 확장됩니다.
      4. expanded property@type인 경우:
        1. value문자열도 아니고 문자열배열도 아니면, invalid type value 오류가 감지되었으며 처리가 중단됩니다. frameExpansion 플래그가 설정된 경우, value는 빈 또는 @default 값이 IRI로 제한된 기본 객체MAY 있습니다. 그 밖의 모든 값은 invalid type value 오류가 감지되었고 처리가 중단됨을 의미합니다.
        2. value가 빈 이면, expanded valuevalue로 설정합니다.
        3. 그렇지 않고 value기본 객체이면, expanded value@default의 값이 active contexttype-scoped context를 사용하고, document relativetrue를 사용하여 valueIRI 확장한 결과로 설정된 새 기본 객체로 설정합니다.
        4. 그렇지 않으면, 각 값을 active contexttype-scoped context를 사용하고, document relativetrue를 사용하여 IRI 확장한 결과로 expanded value를 설정합니다.
        5. result에 이미 @type 엔트리가 있으면, result 안의 @type 값을 expanded value 앞에 추가하고, 필요한 경우 이를 배열로 변환합니다.
          참고
          문자열 value에서 배열 expanded value로의 변환이 암시되는 것은 아니며, value의 형식은 expanded value에서 보존되어야 합니다.
      5. expanded property@graph이면, 이 알고리즘을 재귀적으로 사용한 결과로 expanded value를 설정합니다. 이때 active context, active property@graph, elementvalue, base URL, 그리고 frameExpansionordered 플래그를 전달하고, expanded value가 하나 이상의 으로 이루어진 배열임을 보장합니다.
      6. expanded property@included인 경우:
        1. 처리 모드json-ld-1.0이면, element의 다음 key로 계속합니다.
        2. 이 알고리즘을 재귀적으로 사용한 결과로 expanded value를 설정합니다. 이때 active context, active propertynull, elementvalue, base URL, 그리고 frameExpansionordered 플래그를 전달하며, 결과가 배열임을 보장합니다.
        3. expanded value의 어떤 요소라도 노드 객체가 아니면, invalid @included value 오류가 감지되었으며 처리가 중단됩니다.
        4. result에 이미 @included 엔트리가 있으면, result 안의 @included 값을 expanded value 앞에 추가합니다.
      7. expanded property@value인 경우:
        1. input type@json이면, expanded valuevalue로 설정합니다. 처리 모드json-ld-1.0이면, invalid value object value 오류가 감지되었으며 처리가 중단됩니다.
        2. 그렇지 않고 value스칼라 또는 null이 아니면, invalid value object value 오류가 감지되었으며 처리가 중단됩니다. frameExpansion 플래그가 설정된 경우, value는 빈 또는 스칼라 값의 배열일 MAY 있습니다.
        3. 그렇지 않으면, expanded valuevalue로 설정합니다. frameExpansion 플래그가 설정된 경우, expanded value는 하나 이상의 문자열 값으로 이루어진 배열이거나, 빈 을 포함하는 배열입니다.
        4. expanded valuenull이면, result@value 엔트리null로 설정하고 element의 다음 key로 계속합니다. 이 경우 null 값은 보존되어야 합니다. @type 엔트리의 의미가 @value 엔트리의 존재에 의존하기 때문입니다.
      8. expanded property@language인 경우:
        1. value문자열이 아니면, invalid language-tagged string 오류가 감지되었으며 처리가 중단됩니다. frameExpansion 플래그가 설정된 경우, value는 빈 또는 0개 이상의 문자열로 이루어진 배열일 MAY 있습니다.
        2. 그렇지 않으면, expanded valuevalue로 설정합니다. value가 [BCP47]의 2.2.9절에 따라 올바른 형식이 아니면, 프로세서는 경고를 발생시키는 것이 SHOULD입니다. frameExpansion 플래그가 설정된 경우, expanded value는 하나 이상의 문자열 값으로 이루어진 배열이거나, 빈 을 포함하는 배열입니다.
          참고
          프로세서는 언어 태그를 소문자로 정규화할 MAY 있습니다.
      9. expanded property@direction인 경우:
        1. 처리 모드json-ld-1.0이면, element의 다음 key로 계속합니다.
        2. value"ltr"도 아니고 "rtl"도 아니면, invalid base direction 오류가 감지되었으며 처리가 중단됩니다. frameExpansion 플래그가 설정된 경우, value는 빈 또는 0개 이상의 문자열로 이루어진 배열일 MAY 있습니다.
        3. 그렇지 않으면, expanded valuevalue로 설정합니다. frameExpansion 플래그가 설정된 경우, expanded value는 하나 이상의 문자열 값으로 이루어진 배열이거나, 빈 을 포함하는 배열입니다.
      10. expanded property@index인 경우:
        1. value문자열이 아니면, invalid @index value 오류가 감지되었으며 처리가 중단됩니다.
        2. 그렇지 않으면, expanded valuevalue로 설정합니다.
      11. expanded property@list인 경우:
        1. active propertynull 또는 @graph이면, 자유롭게 떠 있는 목록을 제거하기 위해 element의 다음 key로 계속합니다.
        2. 그렇지 않으면, 이 알고리즘을 재귀적으로 사용한 결과로 expanded value를 초기화합니다. 이때 active context, active property, element로서의 value, base URL, 그리고 frameExpansionordered 플래그를 전달하며, 결과가 배열임을 보장합니다..
      12. expanded property@set이면, 이 알고리즘을 재귀적으로 사용한 결과로 expanded value를 설정합니다. 이때 active context, active property, element로서의 value, base URL, 그리고 frameExpansionordered 플래그를 전달합니다.
      13. expanded property@reverse인 경우:
        1. value이 아니면, invalid @reverse value 오류가 감지되었으며 처리가 중단됩니다.
        2. 그렇지 않으면 이 알고리즘을 재귀적으로 사용한 결과로 expanded value를 초기화합니다. 이때 active context, active property@reverse, elementvalue, base URL, 그리고 frameExpansionordered 플래그를 전달합니다.
        3. expanded value@reverse 엔트리를 포함하면, 즉 두 번 역전된 프로퍼티인 경우, 그 안의 각 propertyitem에 대해 다음 단계를 실행합니다:
          1. 값 추가를 사용하여 itemresult 안의 property 엔트리에 추가하되, as arraytrue를 사용합니다.
        4. expanded value@reverse 이외의 엔트리를 포함하면:
          1. reverse mapresult 안의 @reverse 엔트리의 값으로 설정하며, 필요한 경우 빈 으로 초기화합니다.
          2. expanded value 안의 @reverse 이외의 각 propertyitems에 대해:
            1. items 안의 각 item에 대해:
              1. item값 객체 또는 목록 객체이면, invalid reverse property value 오류가 감지되었으며 처리가 중단됩니다.
              2. 값 추가를 사용하여 itemreverse map 안의 property 엔트리에 추가하되, as arraytrue를 사용합니다.
        5. element의 다음 key로 계속합니다.
      14. expanded property@nest이면, keynests에 추가하며, 필요한 경우 빈 배열로 초기화합니다. element의 다음 key로 계속합니다.
      15. frameExpansion 플래그가 설정되어 있고, expanded property가 다른 프레이밍 키워드 (@default, @embed, @explicit, @omitDefault, 또는 @requireAll)인 경우, 확장 알고리즘을 재귀적으로 수행한 결과로 expanded value를 설정합니다. 이때 active context, active property, element로서의 value, base URL, 그리고 frameExpansionordered 플래그를 전달합니다.
      16. expanded valuenull이 아니고, expanded property@value이며, input type@json이 아닌 경우를 제외하고, resultexpanded property 엔트리expanded value로 설정합니다.
      17. element의 다음 key로 계속합니다.
    5. container mappingactive context 안의 key컨테이너 매핑으로 초기화합니다.
    6. active context 안의 key용어 정의@json타입 매핑을 가지는 경우, expanded value를 새 으로 설정하고, @value 엔트리value로 설정하며, @type 엔트리를 @json으로 설정합니다.
    7. 그렇지 않고 container mapping@language포함하고 value이면, value는 다음과 같이 언어 맵에서 확장됩니다:
      1. expanded value를 빈 배열로 초기화합니다.
      2. directionactive context기본 기준 방향으로 초기화합니다.
      3. active context 안의 key용어 정의방향 매핑을 가지면, direction을 그 값으로 갱신합니다.
      4. value 안의 각 키-값 쌍 language-language value에 대해, orderedtrue이면 language 기준 사전순으로 처리합니다:
        1. language value배열이 아니면, language value만 포함하는 배열로 설정합니다.
        2. language value 안의 각 item에 대해:
          1. itemnull이면, language value 안의 다음 엔트리로 계속합니다.
          2. item문자열이어야 하며, 그렇지 않으면 invalid language map value 오류가 감지되었으며 처리가 중단됩니다.
          3. 두 개의 키-값 쌍 (@value-item) 및 (@language-language)로 구성된 새 v를 초기화합니다. item@none도 아니고 [BCP47]의 2.2.9절에 따라 올바른 형식도 아니면, 프로세서는 경고를 발생시키는 것이 SHOULD입니다.
            참고
            프로세서는 MAY 언어 태그를 소문자로 정규화할 수 있습니다.
          4. language@none이거나, @none으로 확장되면, v에서 @language를 제거합니다.
          5. directionnull이 아니면, @direction에 대한 엔트리v에 추가하고 값을 direction으로 설정합니다.
          6. vexpanded value에 추가합니다.
    8. 그렇지 않고 container mapping@index, @type 또는 @id포함하고, value이면, value는 맵에서 다음과 같이 확장됩니다:
      1. expanded value를 빈 배열로 초기화합니다.
      2. index keyactive context 안의 key인덱스 매핑으로 초기화하고, 존재하지 않으면 @index로 초기화합니다.
      3. value 안의 각 키-값 쌍 index-index value에 대해, orderedtrue이면 index 기준 사전순으로 처리합니다:
        1. container mapping@id 또는 @type을 포함하면, 존재하는 경우 active context이전 컨텍스트map context를 초기화하고, 그렇지 않으면 map contextactive context로 설정합니다.
        2. container mapping@type을 포함하고, map context 안의 index용어 정의로컬 컨텍스트를 가지면, map context컨텍스트 처리 알고리즘의 결과로 갱신합니다. 이때 map contextactive context로, index로컬 컨텍스트 값을 local context로, 그리고 map context 안의 index에 대한 용어 정의에서 온 base URL을 전달합니다.
        3. 그렇지 않으면, map contextactive context로 설정합니다.
        4. indexIRI 확장한 결과로 expanded index를 초기화합니다.
        5. index value배열이 아니면, index value만 포함하는 배열로 설정합니다.
        6. 이 알고리즘을 재귀적으로 사용한 결과로 index value를 초기화합니다. 이때 map contextactive context로, keyactive property로, index valueelement로, base URL, from maptrue, 그리고 frameExpansionordered 플래그를 전달합니다.
        7. index value 안의 각 item에 대해:
          1. container mapping@graph를 포함하고, item그래프 객체가 아니면, @graph-item 키-값 쌍을 포함하는 새 으로 item을 설정하되, 값이 배열을 사용해 표현되도록 보장합니다.
          2. container mapping@index를 포함하고, index key@index가 아니며, expanded index@none이 아닌 경우:
            1. 값 확장 알고리즘을 호출한 결과로 re-expanded index를 초기화합니다. 이때 active context, active property로서의 index key, 그리고 value로서의 index를 전달합니다.
            2. index keyIRI 확장한 결과로 expanded index key를 초기화합니다.
            3. index property valuesre-expanded index에 이어 item 안의 expanded index key의 연결 값이 있으면 그 기존 값들을 포함하는 배열로 초기화합니다.
            4. 키-값 쌍(expanded index key-index property values)을 item에 추가합니다.
            5. item이 값 객체이면, 추가 프로퍼티를 포함해서는 MUST NOT 안 됩니다. invalid value object 오류가 감지되었으며 처리가 중단됩니다.
          3. 그렇지 않고 container mapping@index를 포함하고, item@index 엔트리를 가지지 않으며, expanded index@none이 아니면, 키-값 쌍(@index-index)을 item에 추가합니다.
          4. 그렇지 않고 container mapping@id를 포함하고 item@id 엔트리를 가지지 않으며, expanded index@none이 아니면, 키-값 쌍(@id-expanded index)을 item에 추가합니다. 여기서 expanded indexdocument relativetrue를 사용하고 vocabfalse를 사용하여 indexIRI 확장한 결과로 설정됩니다.
          5. 그렇지 않고 container mapping@type을 포함하고 expanded index@none이 아니면, expanded index에 이어 item 안의 @type 기존 값들이 있으면 그 값들로 구성된 새 배열types를 초기화합니다. 키-값 쌍(@type-types)을 item에 추가합니다.
          6. itemexpanded value에 추가합니다.
    9. 그렇지 않으면, 이 알고리즘을 재귀적으로 사용한 결과로 expanded value를 초기화합니다. 이때 active context, active propertykey, elementvalue, base URL, 그리고 frameExpansionordered 플래그를 전달합니다.
    10. expanded valuenull이면, element의 다음 key로 계속하여 key를 무시합니다.
    11. container mapping@list포함하고 expanded value가 이미 목록 객체가 아니면, expanded value목록 객체로 변환합니다. 먼저 이미 배열이 아니면 expanded value만 포함하는 배열로 설정한 다음, @list-expanded value 키-값 쌍을 포함하는 으로 설정합니다.
    12. container mapping@graph포함하고, @id@index도 포함하지 않는 경우, 필요하면 expanded value배열로 변환한 다음, expanded value 안의 각 값 ev그래프 객체로 변환합니다:
      1. ev@graph-ev 키-값 쌍을 포함하는 을 생성하여 그래프 객체로 변환합니다. 여기서 ev배열로 표현됩니다.
        참고
        이는 ev가 이미 그래프 객체 형식이었다면, 다른 그래프 객체를 포함하는 그래프 객체로 이어질 수 있습니다.
    13. key와 관련된 용어 정의가 그것이 역방향 프로퍼티임을 나타내는 경우
      1. result@reverse 엔트리가 없으면, 이를 생성하고 값을 빈 으로 초기화합니다.
      2. result 안의 @reverse 엔트리 값을 reverse map 변수로 참조합니다.
      3. expanded value배열이 아니면, expanded value를 포함하는 배열로 설정합니다.
      4. expanded value 안의 각 item에 대해
        1. item값 객체 또는 목록 객체이면, invalid reverse property value 오류가 감지되었으며 처리가 중단됩니다.
        2. reverse mapexpanded property 엔트리가 없으면, 이를 생성하고 값을 빈 배열로 초기화합니다.
        3. 값 추가를 사용하여 itemreverse map 안의 expanded property 엔트리에 추가하되, as arraytrue를 사용합니다.
    14. 그렇지 않으면, key역방향 프로퍼티가 아니며, 값 추가를 사용하여 expanded valueresult 안의 expanded property 엔트리에 추가하되 as arraytrue를 사용합니다.
  14. nests 안의 각 키 nesting-key에 대해, orderedtrue이면 사전순으로 처리합니다:
    1. nested valueselement 안의 nesting-key 값으로 초기화하되, 그것이 배열임을 보장합니다.
    2. nested values 안의 각 nested value에 대해:
      1. nested value이 아니거나, nested value 안의 어떤 키가 @value로 확장되면, invalid @nest value 오류가 감지되었으며 처리가 중단됩니다.
      2. elementnested value를 사용하여 13단계와 14단계를 재귀적으로 반복합니다.
        참고
        nested value에 대해 13단계와 14단계를 호출함으로써, 임의 수준의 중첩을 펼칠 수 있으며, 결과는 result로 병합됩니다. 13단계는 nested value 안의 각 엔트리를 반복하며 확장하고, 각 수준에서 발견된 새로운 nested values를 수집하여 모든 중첩이 추출될 때까지 계속합니다.
  15. result@value 엔트리를 포함하는 경우:
    1. result@direction, @index, @language, @type, 및 @value 이외의 엔트리를 포함해서는 안 됩니다. 또한 @language 또는 @direction 엔트리를 포함하는 경우 @type 엔트리를 포함해서는 안 됩니다. 그렇지 않으면, invalid value object 오류가 감지되었으며 처리가 중단됩니다.
    2. result@type 엔트리@json이면, @value 엔트리는 어떤 값이든 포함할 수 있으며, JSON 리터럴로 취급됩니다.
    3. 그렇지 않고 result@value 엔트리 값이 null이거나 빈 배열이면, null을 반환합니다.
    4. 그렇지 않고 result@value 엔트리 값이 문자열이 아니며 result@language 엔트리를 포함하는 경우, invalid language-tagged value 오류가 감지되었으며(언어 태그는 문자열에만 붙일 수 있음) 처리가 중단됩니다.
    5. 그렇지 않고 result@type 엔트리를 가지며 그 값이 IRI가 아닌 경우, invalid typed value 오류가 감지되었으며 처리가 중단됩니다.
  16. 그렇지 않고 result@type 엔트리를 포함하고 그 관련 값이 배열이 아니면, 관련 값만 포함하는 배열로 설정합니다.
  17. 그렇지 않고 result@set 또는 @list 엔트리를 포함하는 경우:
    1. result는 많아야 하나의 다른 엔트리를 포함해야 하며, 이는 @index여야 합니다. 그렇지 않으면, invalid set or list object 오류가 감지되었으며 처리가 중단됩니다.
    2. result@set 엔트리를 포함하면, result를 그 엔트리의 관련 값으로 설정합니다.
  18. result@language 엔트리만 포함하는 이면, 반환합니다 null.
  19. active propertynull 또는 @graph이면, 자유롭게 떠 있는 값을 다음과 같이 버립니다:
    1. result가 비어 있거나, @value 또는 @list 엔트리만 포함하는 이면, resultnull로 설정합니다.
    2. 그렇지 않고 result가 유일한 엔트리@id만 가진 이면, resultnull로 설정합니다. frameExpansion 플래그가 설정된 경우, @id 엔트리만 포함하는 은 유지됩니다.
  20. result를 반환합니다.

5.2 IRI 확장

JSON-LD 문서에서 일부 키와 값은 IRI를 나타낼 수 있습니다. 이 절은 문자열이 나타내는 IRI를 절대 IRI 또는 빈 노드 식별자로 변환하는 알고리즘을 정의합니다. 또한 키워드 별칭키워드로 변환하는 것도 다룹니다.

IRI 확장은 컨텍스트 처리 중 또는 다른 JSON-LD 알고리즘 중에 발생할 수 있습니다. IRI 확장이 컨텍스트 처리 중에 발생하면, 로컬 컨텍스트컨텍스트 처리 알고리즘의 관련 defined 맵이 이 알고리즘에 전달됩니다. 이를 통해 용어 정의 의존성을 용어 정의 생성 알고리즘을 통해 처리할 수 있습니다.

5.2.1 개요

이 절은 비규범입니다.

valueIRI로 확장하려면, 먼저 그것이 null인지, 용어인지, 키워드 별칭인지, 또는 어떤 형태의 IRI인지 판단해야 합니다. 발견한 것에 따라 특정 종류의 확장을 처리합니다. 예를 들어, 키워드 별칭키워드로 확장하고, 용어활성 컨텍스트 안의 IRI 매핑에 따라 IRI로 확장합니다. value를 검사하는 동안, 컨텍스트 처리 중 이 알고리즘을 실행하고 있기 때문에 용어 정의 의존성을 생성해야 함을 발견할 수도 있습니다. 컨텍스트 처리 중 실행 중인지 여부는 로컬 컨텍스트null과 비교하여 알 수 있습니다. value로컬 컨텍스트 안의 엔트리이고 defined 맵이 관련 값이 truevalue에 대한 엔트리를 가지고 있지 않으면, 활성 컨텍스트 안에 용어 정의를 생성해야 함을 알 수 있습니다. defined 맵은 컨텍스트 처리 중에 어떤 용어가 이미 정의되었거나 정의 중인지 추적하는 데 사용됩니다. 우리는 용어 정의 생성 알고리즘을 사용하여 용어 정의를 생성합니다.

참고

키워드의 형식을 가지지만 키워드는 아닌 값 (즉, "@"로 시작하는 값)은 향후 사용을 위해 예약되어 있으므로 어떤 값에도 매핑되지 않습니다. 알고리즘은 null을 반환하므로, 이러한 값은 발견될 때 무시됩니다.

5.2.2 알고리즘

이 알고리즘은 두 개의 필수 입력 변수와 네 개의 선택적 입력 변수를 받습니다. 필수 입력은 active context와 확장할 value입니다. 선택적 입력은 두 개의 플래그, document relativevocab로, value가 문서의 기준 IRI 또는 활성 컨텍스트어휘 매핑에 대해 각각 상대 IRI 참조로 해석될 수 있는지 지정합니다. 또한 이 알고리즘이 컨텍스트 처리 중에 사용될 때 사용할 local context와 맵 defined가 있습니다. 전달되지 않으면, 두 플래그는 false로 설정되고 local contextdefinednull로 초기화됩니다.

  1. value키워드 또는 null이면, value를 그대로 반환합니다.
  2. value가 키워드의 형식을 가지는 경우 (즉, [RFC5234]의 ABNF 규칙 "@"1*ALPHA와 일치하는 경우), 프로세서는 경고를 생성하는 것이 SHOULD이며, null을 반환합니다.
  3. local contextnull이 아니고, value와 같은 키를 가진 엔트리를 포함하며, defined 안의 value에 대한 엔트리 값이 true가 아니면, 용어 정의 생성 알고리즘을 호출합니다. 이때 active context, local context, term으로서의 value, 그리고 defined를 전달합니다. 이는 컨텍스트 처리active context 안에 value에 대한 용어 정의가 생성되도록 보장합니다.
  4. active contextvalue에 대한 용어 정의를 가지고 있고, 관련 IRI 매핑키워드이면, 그 키워드를 반환합니다.
  5. vocabtrue이고 active contextvalue에 대한 용어 정의를 가지고 있으면, 관련 IRI 매핑을 반환합니다.
  6. value첫 번째 문자 뒤의 어디든 콜론(:)을 포함하는 경우, 이는 IRI, 축약 IRI, 또는 빈 노드 식별자입니다:
    1. value를 콜론(:)이 처음 나타나는 위치에서 prefixsuffix로 나눕니다.
    2. prefix가 밑줄(_)이거나 suffix가 이중 슬래시 (//)로 시작하면, value는 이미 IRI 또는 빈 노드 식별자이므로 그대로 반환합니다.
    3. local contextnull이 아니고, prefix 엔트리를 포함하며, defined 안의 prefix 엔트리 값이 true가 아니면, 용어 정의 생성 알고리즘을 호출합니다. 이때 active context, local context, term으로서의 prefix, 그리고 defined를 전달합니다. 이는 컨텍스트 처리 중에 active context 안에 prefix에 대한 용어 정의가 생성되도록 보장합니다.
    4. active contextprefix에 대한 용어 정의를 포함하고, 그것이 null이 아닌 IRI 매핑을 가지며, 그 용어 정의접두사 플래그true이면, prefix와 관련된 IRI 매핑suffix를 연결한 결과를 반환합니다.
    5. value형식IRI이면, value를 반환합니다.
  7. vocabtrue이고 active context어휘 매핑을 가지고 있으면, 어휘 매핑value를 연결한 결과를 반환합니다.
  8. 그렇지 않고 document relativetrue이면, valueactive context기준 IRI에 대해 해석한 결과로 설정합니다. [RFC3986]의 5.2절에 있는 기본 알고리즘만 사용됩니다. 구문 기반 정규화스킴 기반 정규화도 수행되지 않습니다. IRI 참조에서 추가로 허용되는 문자는 [RFC3987]의 6.5절에 따라 URI 참조의 비예약 문자와 같은 방식으로 처리됩니다.
  9. value를 그대로 반환합니다.

5.3 값 확장

JSON-LD의 일부 값은 축약 형식으로 표현될 수 있습니다. 이러한 값은 JSON-LD 문서를 처리할 때 확장되어야 하는 경우가 있습니다. 이 알고리즘을 적용한 후 값은 확장 형식이라고 합니다.

5.3.1 개요

이 절은 비규범입니다.

active property활성 컨텍스트 안에서 @id 또는 @vocab으로 설정된 타입 매핑을 가지고, 값이 문자열이면, IRI 확장 알고리즘value에 사용한 결과를 값으로 갖는 단일 @id 엔트리를 가진 이 반환됩니다.

그렇지 않으면, 결과는 전달된 value가 값으로 설정된 @value 엔트리를 포함하는 이 됩니다. 또한 active property와 관련된 타입 매핑이 있으면 @type 엔트리가 포함되고, value문자열이며 active property와 관련된 언어 매핑이 있으면 @language 엔트리가 포함됩니다.

IRI로 해석되는 값은 두 범주에 속한다는 점에 유의하십시오: document relative인 값과 어휘 상대적인 값입니다. 프로퍼티@type의 값, 그리고 "@type": "@vocab"로 표시된 용어는 어휘 상대적입니다. 이는 이러한 값이 정의된 용어, 접두사용어축약 IRI, 또는 어휘 매핑을 사용하여 IRI로 바뀌는 문자열이어야 함을 의미합니다.

5.3.2 알고리즘

이 알고리즘은 세 개의 필수 입력을 받습니다: active context, active property, 그리고 확장할 value입니다.

  1. active propertyactive context 안에서 @id타입 매핑을 가지고, value문자열이면, 키가 @id이고 값이 document relativetrue, vocabfalse를 사용하여 valueIRI 확장한 결과인 단일 엔트리를 포함하는 새 을 반환합니다.
  2. active propertyactive context 안에서 @vocab타입 매핑을 가지고, value문자열이면, 키가 @id이고 값이 document relativetrue를 사용하여 valueIRI 확장한 결과인 단일 엔트리를 포함하는 새 을 반환합니다.
  3. 그렇지 않으면, result를 값이 value로 설정된 @value 엔트리를 가진 으로 초기화합니다.
  4. active propertyactive context 안에서 @id, @vocab, 또는 @none 이외의 타입 매핑을 가지고 있으면, @typeresult에 추가하고 그 값을 타입 매핑과 관련된 값으로 설정합니다.
  5. 그렇지 않고 value문자열인 경우:
    1. languageactive context 안의 active property에 대한 언어 매핑으로 초기화하고, 없으면 active context기본 언어로 초기화합니다.
    2. directionactive context 안의 active property에 대한 방향 매핑으로 초기화하고, 없으면 active context기본 기준 방향으로 초기화합니다.
    3. languagenull이 아니면, result에 값이 language@language를 추가합니다.
    4. directionnull이 아니면, result에 값이 direction@direction을 추가합니다.
  6. result를 반환합니다.

6. 축약 알고리즘

다음 절에서는 JSON-LD 문서, IRI 및 값을 축약하기 위한 알고리즘을 설명합니다.

6.1 축약 알고리즘

이 알고리즘은 주어진 컨텍스트가 적용되도록 JSON-LD 문서를 축약합니다. 그 결과 적용 가능한 모든 IRI용어 또는 축약 IRI로 단축되어야 하며, 적용 가능한 모든 키워드키워드 별칭으로, 그리고 확장 형식으로 표현된 적용 가능한 모든 JSON-LD 값문자열 또는 숫자 같은 단순 값으로 축약되어야 합니다.

6.1.1 개요

이 절은 비규범입니다.

루트 element에서 시작하여, 완전히 축약된 result가 생길 때까지 JSON-LD 문서를 재귀적으로 처리할 수 있습니다. element축약할 때에는, 문제를 나누기 위해 그 타입에 따라 각각 다르게 처리할 수 있습니다:

  1. element스칼라이면, 이미 축약 형식이므로 그대로 반환합니다.
  2. element배열이면, 각 항목을 재귀적으로 축약하고 새 배열로 반환합니다.
  3. 그렇지 않으면 element입니다. element 안의 각 엔트리 값은 재귀적으로 축약됩니다. 일부 엔트리 키는 IRI 축약 알고리즘을 사용하여 용어 또는 축약 IRI로 축약되고, 다른 키는 키워드에서 키워드 별칭으로 축약되거나, 컨텍스트에 정의가 없기 때문에 단순히 변경되지 않은 채 남습니다. 값은 값 축약 알고리즘을 통해 축약 형식으로 변환됩니다. 일부 데이터는 컨텍스트에 지정된 @index 또는 @language 맵 같은 컨테이너 매핑을 기반으로 재구성됩니다.

6.1.2 알고리즘

이 알고리즘은 세 개의 필수 및 두 개의 선택적 입력 변수를 받습니다. 필수 입력은 active context, active property, 그리고 축약할 element입니다. 선택적 입력은 compactArrays 플래그와 ordered 플래그이며, 명시된 곳에서 맵 엔트리 키를 사전순으로 정렬하는 데 사용됩니다. 전달되지 않으면, 두 플래그는 모두 false로 설정됩니다.

  1. type-scoped contextactive context로 초기화합니다. 이는 이전의 어떤 타입 범위 컨텍스트와 관련될 수 있는 값을 축약하는 데 사용됩니다.
  2. element스칼라이면, 이미 가장 축약된 형식이므로 단순히 element를 반환합니다.
  3. element배열인 경우:
    1. result를 빈 배열로 초기화합니다.
    2. element 안의 각 item에 대해:
      1. 이 알고리즘을 재귀적으로 사용한 결과로 compacted item을 초기화합니다. 이때 active context, active property, element로서의 item, 그리고 compactArraysordered 플래그를 전달합니다.
      2. compacted itemnull이 아니면, 이를 result에 추가합니다.
    3. result가 비어 있거나 둘 이상의 값을 포함하거나, compactArraysfalse이거나, active property@graph 또는 @set 중 하나이거나, active context 안의 active property에 대한 컨테이너 매핑@list 또는 @set 중 하나를 포함하는 경우, result를 반환합니다.
    4. 그렇지 않으면, result 안의 값을 반환합니다.
  4. 그렇지 않으면 element입니다.
  5. active context이전 컨텍스트를 가지면, active context는 전파되지 않습니다. element@value 엔트리를 포함하지 않고, element가 단일 @id 엔트리로만 구성되지 않는 경우, 새 노드 객체를 처리할 때는 용어 범위 컨텍스트의 범위가 적용되지 않으므로, active contextactive context이전 컨텍스트로 설정합니다.
  6. active context 안의 active property에 대한 용어 정의로컬 컨텍스트를 가지는 경우:
    1. active context컨텍스트 처리 알고리즘의 결과로 설정합니다. 이때 active context, active property로컬 컨텍스트 값을 local context로, active context 안의 active property에 대한 용어 정의에서 온 base URL, 그리고 override protectedtrue를 전달합니다.
  7. element@value 또는 @id 엔트리를 가지고, active context, active property, 그리고 value로서의 element를 전달하여 값 축약 알고리즘을 사용한 결과가 스칼라이거나, active property에 대한 용어 정의@json타입 매핑을 가지는 경우, 그 결과를 반환합니다.
  8. element목록 객체이고, active context 안의 active property에 대한 컨테이너 매핑@list포함하는 경우, 이 알고리즘을 재귀적으로 사용한 결과를 반환합니다. 이때 active context, active property, element로서의 element 안의 @list 값, 그리고 compactArraysordered 플래그를 전달합니다.
  9. active property@reverse와 같으면 inside reversetrue로 초기화하고, 그렇지 않으면 false로 초기화합니다.
  10. result를 빈 으로 초기화합니다.
  11. element@type 엔트리를 가지면, 그 엔트리의 각 expanded typeexpanded typeIRI 축약하여 그 축약 형식으로 변환해 초기화한 새 배열 compacted types를 생성합니다. 그런 다음 사전순으로 정렬된 compacted types 안의 각 term에 대해:
    1. type-scoped context 안의 term에 대한 용어 정의로컬 컨텍스트를 가지면, active context컨텍스트 처리 알고리즘의 결과로 설정합니다. 이때 active contexttype-scoped context 안의 term로컬 컨텍스트 값을 local context로 전달하고, type-scoped context 안의 term에 대한 용어 정의에서 온 base URL, 그리고 propagatefalse를 전달합니다.
  12. element 안의 각 키 expanded property와 값 expanded value에 대해, orderedtrue이면 expanded property 기준 사전순으로 처리합니다:
    1. expanded property@id인 경우:
      1. expanded value문자열이면, vocabfalse로 설정하고 expanded valueIRI 축약하여 compacted value를 초기화합니다.
      2. expanded propertyIRI 축약하여 alias를 초기화합니다.
      3. alias 엔트리result에 추가하고, 그 값을 compacted value로 설정한 뒤 다음 expanded property로 계속합니다.
    2. expanded property@type인 경우:
      1. expanded value문자열이면, active contexttype-scoped context를 사용하여 expanded valueIRI 축약하여 compacted value를 초기화합니다.
      2. 그렇지 않으면, expanded value@type 배열이어야 합니다:
        1. compacted value를 빈 배열로 초기화합니다.
        2. expanded value 안의 각 항목 expanded type에 대해:
          1. active contexttype-scoped context를 사용하여 expanded typeIRI 축약한 결과로 term을 설정합니다.
          2. termcompacted value에 추가합니다.
      3. expanded propertyIRI 축약하여 alias를 초기화합니다.
      4. 처리 모드json-ld-1.1이고 active context 안의 alias에 대한 컨테이너 매핑@set을 포함하면 as arraytrue로 초기화하고, 그렇지 않으면 compactArrays의 부정으로 초기화합니다.
      5. 값 추가를 사용하여 compacted valueresult 안의 alias 엔트리에 추가하되, as array를 사용합니다.
      6. 다음 expanded property로 계속합니다.
    3. expanded property@reverse인 경우:
      1. 이 알고리즘을 재귀적으로 사용한 결과로 compacted value를 초기화합니다. 이때 active context, active property@reverse, elementexpanded value, 그리고 compactArraysordered 플래그를 전달합니다.
      2. compacted value 안의 각 propertyvalue에 대해:
        1. active context 안의 property에 대한 용어 정의property역방향 프로퍼티임을 나타내는 경우
          1. active context 안의 property에 대한 컨테이너 매핑@set을 포함하면 as arraytrue로 초기화하고, 그렇지 않으면 compactArrays의 부정으로 초기화합니다.
          2. 값 추가를 사용하여 valueresult 안의 property 엔트리에 추가하되 as array를 사용합니다.
          3. compacted value에서 property 엔트리를 제거합니다.
      3. compacted value에 남은 맵 엔트리가 있으면, 즉 빈 이 아니면:
        1. @reverseIRI 축약하여 alias를 초기화합니다.
        2. resultalias 엔트리 값을 compacted value로 설정합니다.
      4. element의 다음 expanded property로 계속합니다.
    4. expanded property@preserve이면:
      1. 이 알고리즘을 재귀적으로 사용한 결과로 compacted value를 초기화합니다. 이때 active context, active property, element로서의 expanded value, 그리고 compactArraysordered 플래그를 전달합니다.
      2. expanded value가 빈 배열이 아닌 경우, compacted valueresult 안의 @preserve 값으로 추가합니다.
    5. expanded property@index이고 active context 안의 active property@index포함하는 컨테이너 매핑을 가지면, 축약된 결과는 @index 컨테이너 안에 있게 되므로, 다음 expanded property로 계속하여 @index 엔트리를 버립니다.
    6. 그렇지 않고 expanded property@direction, @index, @language, 또는 @value인 경우:
      1. expanded propertyIRI 축약하여 alias를 초기화합니다.
      2. alias 엔트리result에 추가하고, 그 값을 expanded value로 설정한 뒤 다음 expanded property로 계속합니다.
    7. expanded value가 빈 배열인 경우:
      1. valueexpanded value를, reverseinside reverse를 사용하여 expanded propertyIRI 축약한 결과로 item active property를 초기화합니다.
      2. active context 안의 item active property에 대한 용어 정의nest 값 엔트리(nest term)를 가지는 경우:
        1. nest term@nest가 아니거나, active context 안에서 @nest로 확장되는 용어가 아니면, invalid @nest value 오류가 감지되었으며, 처리가 중단됩니다.
        2. resultnest term 엔트리가 없으면, 빈 으로 초기화합니다.
        3. nest resultresult 안의 nest term 값으로 초기화합니다.
      3. 그렇지 않으면, nest resultresult로 초기화합니다.
      4. 값 추가를 사용하여 빈 배열nest result 안의 item active property 엔트리에 추가하되, as arraytrue를 사용합니다.
    8. 이 시점에서 expanded value확장 알고리즘 때문에 배열이어야 합니다. expanded value 안의 각 항목 expanded item에 대해:
      1. valueexpanded item을, reverseinside reverse를 사용하여 expanded propertyIRI 축약한 결과로 item active property를 초기화합니다.
      2. active context 안의 item active property에 대한 용어 정의nest 값 엔트리(nest term)를 가지는 경우:
        1. nest term@nest가 아니거나, active context 안에서 @nest로 확장되는 용어가 아니면, invalid @nest value 오류가 감지되었으며, 처리가 중단됩니다.
        2. resultnest term 엔트리가 없으면, 빈 으로 초기화합니다.
        3. nest resultresult 안의 nest term 값으로 초기화합니다.
      3. 그렇지 않으면, nest resultresult로 초기화합니다.
      4. containeractive context 안의 item active property에 대한 컨테이너 매핑으로 초기화하고, 그러한 컨테이너 매핑이 없으면 새 빈 배열로 초기화합니다.
      5. container@set을 포함하거나, item active property@graph 또는 @list이면 as arraytrue로 초기화하고, 그렇지 않으면 compactArrays의 부정으로 초기화합니다.
      6. 이 알고리즘을 재귀적으로 사용한 결과로 compacted item을 초기화합니다. 이때 active context, active property로서의 item active property, element로서의 expanded item, 그리고 compactArraysordered 플래그를 전달합니다. expanded item목록 객체 또는 그래프 객체이면, expanded item 대신 각각 @list 또는 @graph 엔트리의 값을 element로 사용합니다.
      7. expanded item목록 객체인 경우:
        1. compacted item배열이 아니면, compacted item만 포함하는 배열로 설정합니다.
        2. container@list를 포함하지 않는 경우:
          1. compacted item목록 객체로 변환합니다. 이때 키가 @listIRI 축약한 결과이고 값이 원래 compacted item엔트리를 포함하는 으로 설정합니다.
          2. expanded item@index-value 엔트리를 포함하면, 키가 @indexIRI 축약한 결과이고 값이 value엔트리compacted item에 추가합니다.
          3. 값 추가를 사용하여 compacted itemnest result 안의 item active property 엔트리에 추가하되 as array를 사용합니다.
        3. 그렇지 않으면, nest result 안의 item active property 엔트리 값을 compacted item으로 설정합니다.
      8. expanded item그래프 객체인 경우:
        1. container@graph@id를 포함하는 경우:
          1. map objectnest result 안의 item active property 값으로 초기화하되, 필요한 경우 새 빈 으로 초기화합니다.
          2. expanded item@id 엔트리가 있으면 vocabfalse로 설정하고 expanded item 안의 @id 값을 IRI 축약하여, 그러한 값이 없으면 @none으로, map key를 초기화합니다.
          3. 값 추가를 사용하여 compacted itemmap object 안의 map key 엔트리에 추가하되 as array를 사용합니다.
        2. 그렇지 않고 container@graph@index를 포함하고 expanded item단순 그래프 객체인 경우:
          1. map objectnest result 안의 item active property 값으로 초기화하되, 필요한 경우 새 빈 으로 초기화합니다.
          2. map keyexpanded item 안의 @index 값으로 초기화하거나, 그러한 값이 없으면 @none으로 초기화합니다.
          3. 값 추가를 사용하여 compacted itemmap object 안의 map key 엔트리에 추가하되 as array를 사용합니다.
        3. 그렇지 않고 container@graph를 포함하고 expanded item단순 그래프 객체이면, 값은 맵 객체로 표현될 수 없습니다.
          1. compacted item이 둘 이상의 값을 가진 배열이면, 여러 객체가 서로 다른 명명된 그래프로 해석될 수 있으므로 직접 표현할 수 없습니다. compacted item을 새 으로 설정하되, @includedIRI 축약한 결과 를 키로 하고, 원래 compacted item을 값으로 포함합니다.
          2. 값 추가를 사용하여 compacted itemnest result 안의 item active property 엔트리에 추가하되 as array를 사용합니다.
        4. 그렇지 않으면, container@graph를 포함하지 않거나 앞선 경우 중 어느 것에도 일치하지 않습니다.
          1. compacted item을 새 맵으로 설정하되, @graphIRI 축약한 결과 를 키로 하고, 원래 compacted item을 값으로 사용합니다.
          2. expanded item이 @id 엔트리를 포함하면, @idIRI 축약한 결과 를 키로 사용하고, expanded item 안의 @id 값을 vocabfalse를 사용하여 IRI 축약한 값을 값으로 사용하여 compacted item에 엔트리를 추가합니다.
          3. expanded item이 @index 엔트리를 포함하면, @indexIRI 축약한 결과 를 키로 사용하고, expanded item 안의 @index 값을 값으로 하여 compacted item에 엔트리를 추가합니다.
          4. 값 추가를 사용하여 compacted itemnest result 안의 item active property 엔트리에 추가하되 as array를 사용합니다.
      9. 그렇지 않고, container@language, @index, @id, 또는 @type포함하며 container@graph를 포함하지 않는 경우:
        1. map objectnest result 안의 item active property 값으로 초기화하되, 필요한 경우 새 빈 으로 초기화합니다.
        2. container의 내용에 따라 @language, @index, @id, 또는 @type 중 하나를 IRI 축약하여 container key를 초기화합니다.
        3. index keyactive context 안의 item active property와 관련된 용어 정의 안의 인덱스 매핑 값으로 초기화하고, 그러한 값이 없으면 @index로 초기화합니다.
        4. container@language를 포함하고 expanded item@value 엔트리를 포함하면, compacted item을 그 @value 엔트리와 관련된 값으로 설정합니다. expanded item 안의 @language 값이 있으면 map key를 그 값으로 설정합니다.
        5. 그렇지 않고 container@index를 포함하고 index key@index이면, expanded item 안의 @index 값이 있으면 map key를 그 값으로 설정합니다.
        6. 그렇지 않고 container@index를 포함하고 index key@index가 아닌 경우:
          1. index keyIRI 축약하여 container key를 다시 초기화합니다.
          2. compacted item 안의 container key 첫 번째 값이 있으면 map key를 그 값으로 설정합니다.
          3. compacted item 안에 container key에 대한 나머지 값이 있으면, 값 추가를 사용하여 그 나머지 값을 compacted item 안의 container key에 추가합니다. 그렇지 않으면, compacted item에서 해당 엔트리를 제거합니다.
        7. 그렇지 않고 container@id를 포함하면, map keycompacted item 안의 container key 값으로 설정하고, compacted item에서 container key를 제거합니다.
        8. 그렇지 않고 container@type을 포함하는 경우:
          1. compacted item 안의 container key 첫 번째 값이 있으면 map key를 그 값으로 설정합니다.
          2. compacted item 안에 container key에 대한 나머지 값이 있으면, 값 추가를 사용하여 그 나머지 값을 compacted item 안의 container key에 추가합니다.
          3. 그렇지 않으면, compacted item에서 해당 엔트리를 제거합니다.
          4. compacted item@id로 확장되는 키를 가진 단일 엔트리를 포함하면, 이 알고리즘을 재귀적으로 사용한 결과로 compacted item을 설정합니다. 이때 active context, active property로서의 item active property, 그리고 element로서 expanded item에서 온 @id에 대한 단일 엔트리로 구성된 을 전달합니다.
        9. map keynull이면, @noneIRI 축약한 결과로 설정합니다.
        10. 값 추가를 사용하여 compacted itemmap object 안의 map key 엔트리에 추가하되 as array를 사용합니다.
      10. 그렇지 않으면 값 추가를 사용하여 compacted itemnest result 안의 item active property 엔트리에 추가하되 as array를 사용합니다.
  13. result를 반환합니다.

6.2 IRI 축약

이 알고리즘은 IRI용어 또는 축약 IRI로, 또는 키워드키워드 별칭으로 축약합니다. IRI와 관련된 값은 가장 컨텍스트에 적합한 용어를 선택하는 데 도움을 주기 위해 전달될 수 있습니다.

6.2.1 개요

이 절은 비규범입니다.

전달된 IRInull이면, 단순히 null을 반환합니다. 그렇지 않으면, 먼저 그 IRI 또는 키워드활성 컨텍스트어휘 매핑에 상대적인 경우 축약될 수 있는 용어를 찾으려고 합니다. 가장 적절한 용어를 선택하기 위해, 전달된 value에 대한 정보를 수집해야 할 수 있습니다. 이 정보에는 value를 표현하기 위한 선호 컨테이너 매핑, 타입 매핑 또는 언어 매핑을 결정하는 것이 포함됩니다. JSON-LD 목록의 경우, 타입 매핑 또는 언어 매핑은 목록의 모든 항목에 대해 작동하는 가장 구체적인 값을 기반으로 선택됩니다. 이 정보가 수집되면, 용어 선택 알고리즘에 전달되며, 이 알고리즘은 가장 적절한 용어를 반환합니다.

용어 중 해당 IRI를 축약하는 데 사용할 수 있는 것이 발견되지 않으면, 활성 컨텍스트어휘 매핑이 있는 경우 이를 사용하여 IRI를 축약하려고 시도합니다. IRI를 축약할 수 없으면, 축약 IRI를 찾으려고 시도합니다. 용어는 용어 정의가 값이 true접두사 플래그를 포함하는 경우에만 축약 IRI를 생성하는 데 사용됩니다. 적절한 축약 IRI가 없고, compactToRelative 옵션이 true이면, IRI는 문서의 기준 IRI를 사용하여 상대 IRI 참조로 변환됩니다. 마지막으로, IRI 또는 키워드가 여전히 축약될 수 없으면, 그대로 반환됩니다.

언어 매핑을 고려할 때, 방향 매핑언어 매핑과 함께 또는 없이 고려되며, 언어 매핑은 소문자로 정규화됩니다.

이 알고리즘이 입력 IRI를 그대로 반환하려는 경우에, 그 IRI활성 컨텍스트 안에서 축약 IRI로 오인될 수 있으면, 이 알고리즘은 오류를 발생시킵니다. 원래 IRI를 모호하지 않게 표현하여 반환할 방법이 없기 때문입니다.

6.2.2 알고리즘

이 알고리즘은 두 개의 필수 입력과 세 개의 선택적 입력을 받습니다. 필수 입력은 active context와 축약할 var입니다. 선택적 입력은 var와 관련된 value, 전달된 var활성 컨텍스트어휘 매핑을 사용하여 축약해야 하는지 지정하는 vocab 플래그, 그리고 역방향 프로퍼티가 축약 중인지 지정하는 reverse 플래그입니다. 전달되지 않으면, valuenull로 설정되고 vocabreverse는 모두 false로 설정됩니다.

  1. varnull이면, null을 반환합니다.
  2. active contextnull 역 컨텍스트를 가지면, active context 안의 역 컨텍스트active context를 사용하여 역 컨텍스트 생성 알고리즘을 호출한 결과로 설정합니다.
  3. inverse contextactive context 안의 역 컨텍스트 값으로 초기화합니다.
  4. vocabtrue이고 varinverse context엔트리인 경우:
    1. default language활성 컨텍스트기본 언어 (소문자로 정규화됨)와 기본 기준 방향을 기반으로 초기화합니다:
      1. 활성 컨텍스트기본 기준 방향null이 아니면, 활성 컨텍스트기본 언어기본 기준 방향을 밑줄("_")로 구분하여 연결하고 소문자로 정규화한 값으로 설정합니다.
      2. 그렇지 않으면, 활성 컨텍스트기본 언어를 가지는 경우 이를 소문자로 정규화한 값으로 설정하고, 그렇지 않으면 @none으로 설정합니다.
    2. value@preserve 엔트리를 포함하는 이면, @preserve 값의 첫 번째 요소를 value로 사용합니다.
    3. containers를 빈 배열로 초기화합니다. 이 배열value와 호환되는 것을 기반으로 용어에 대한 선호 컨테이너 매핑의 순서 있는 목록을 추적하는 데 사용됩니다.
      참고
      알고리즘 단계는 같은 값을 containers에 추가할 수 있지만, 가장 적절한 용어를 선택할 때에는 추가된 순서가 중요합니다.
    4. type/language@language로, type/language value@null로 초기화합니다. 이 두 변수는 value와 호환되는 것을 기반으로 용어에 대한 선호 타입 매핑 또는 언어 매핑을 추적합니다.
    5. value@index 엔트리를 포함하는 이고, value그래프 객체가 아니면, 값 @index@index@setcontainers에 추가합니다.
    6. reversetrue이면, type/language@type으로, type/language value@reverse로 설정하고, @setcontainers에 추가합니다.
    7. 그렇지 않고 value목록 객체이면, 다음과 같이 type/languagetype/language value를 목록의 모든 항목에 대해 작동하는 가장 구체적인 값으로 설정합니다:
      1. @indexvalue 안의 엔트리가 아니면, @listcontainers에 추가합니다.
      2. listvalue 안의 @list 엔트리와 관련된 배열로 초기화합니다.
      3. common typecommon languagenull로 초기화합니다. list가 비어 있으면, common languagedefault language로 설정합니다.
      4. list 안의 각 item에 대해:
        1. item language@none으로, item type@none으로 초기화합니다.
        2. item@value 엔트리를 포함하는 경우:
          1. item@direction 엔트리를 포함하면, item languageitem@language 엔트리(있는 경우)와 item@direction을 밑줄("_")로 구분하여 연결하고 소문자로 정규화한 값으로 설정합니다.
          2. 그렇지 않고 item@language 엔트리를 포함하면, item language를 그 관련 값으로 설정하고 소문자로 정규화합니다.
          3. 그렇지 않고 item@type 엔트리를 포함하면, item type을 그 관련 값으로 설정합니다.
          4. 그렇지 않으면, item language@null로 설정합니다.
        3. 그렇지 않으면, item type@id로 설정합니다.
        4. common languagenull이면, common languageitem language로 설정합니다.
        5. 그렇지 않고 item languagecommon language와 같지 않고 item@value 엔트리를 포함하면, 목록 항목의 언어가 충돌하므로 common language@none으로 설정합니다.
        6. common typenull이면, common typeitem type으로 설정합니다.
        7. 그렇지 않고 item typecommon type과 같지 않으면, 목록 항목의 타입이 충돌하므로 common type@none으로 설정합니다.
        8. common language@none이고 common type@none이면, 목록의 항목 사이에 공통 언어 또는 타입이 없다는 것이 감지되었으므로 목록의 항목 처리를 중지합니다.
      5. common languagenull이면, common language@none으로 설정합니다.
      6. common typenull이면, common type@none으로 설정합니다.
      7. common type@none이 아니면, type/language@type으로 설정하고 type/language valuecommon type으로 설정합니다.
      8. 그렇지 않으면, type/language valuecommon language로 설정합니다.
    8. 그렇지 않고 value그래프 객체이면, 특정 값에 가장 적절한 매핑을 선호합니다.
      1. value@index 엔트리를 포함하면, 값 @graph@index@graph@index@setcontainers에 추가합니다.
      2. value@id 엔트리를 포함하면, 값 @graph@id@graph@id@setcontainers에 추가합니다.
      3. @graph, @graph@set, 그리고 @setcontainers에 추가합니다.
      4. value@index 엔트리를 포함하지 않으면, 값 @graph@index@graph@index@setcontainers에 추가합니다.
      5. value@id 엔트리를 포함하지 않으면, 값 @graph@id@graph@id@setcontainers에 추가합니다.
      6. @index@index@setcontainers에 추가합니다.
      7. type/language@type으로 설정하고, type/language value@id로 설정합니다.
    9. 그렇지 않으면:
      1. value값 객체인 경우:
        1. value@direction 엔트리를 포함하고 @index 엔트리를 포함하지 않으면, type/language valuevalue@language 엔트리(있는 경우)와 value@direction 엔트리를 밑줄("_")로 구분하여 연결하고 소문자로 정규화한 값으로 설정합니다. @language@language@setcontainers에 추가합니다.
        2. 그렇지 않고 value@language 엔트리를 포함하고 @index 엔트리를 포함하지 않으면, type/language value@language 값을 소문자로 정규화한 값으로 설정하고, @language, 그리고 @language@setcontainers에 추가합니다.
        3. 그렇지 않고 value@type 엔트리를 포함하면, type/language value를 그 관련 값으로 설정하고 type/language@type으로 설정합니다.
      2. 그렇지 않으면, type/language@type으로 설정하고 type/language value@id로 설정하며, @id, @id@set, @type, 그리고 @set@typecontainers에 추가합니다.
      3. @setcontainers에 추가합니다.
    10. @nonecontainers에 추가합니다. 이는 컨테이너 매핑이 존재하지 않음을 나타내며, 가장 일반적이므로 마지막으로 확인될 컨테이너 매핑 값입니다.
    11. 처리 모드json-ld-1.0이 아니고 value이 아니거나 @index 엔트리를 포함하지 않으면, @index@index@setcontainers에 추가합니다.
    12. 처리 모드json-ld-1.0이 아니고 value@value 엔트리만 포함하는 이면, @language@language@setcontainers에 추가합니다.
    13. type/language valuenull이면, type/language value@null로 설정합니다. 이는 null 값이 inverse context entry에 저장되는 키입니다.
    14. preferred values를 빈 배열로 초기화합니다. 이 배열용어타입 매핑 또는 언어 매핑에 대한 선호 값을 순서대로 나타냅니다.
    15. type/language value@reverse이면, @reversepreferred values에 추가합니다.
    16. type/language value@id 또는 @reverse이고 value@id 엔트리를 포함하는 인 경우:
      1. value 안의 @id 엔트리 값을 IRI 축약한 결과가 active context 안에 value 안의 @id 엔트리 값과 같은 IRI 매핑을 가진 용어 정의를 가지면, @vocab, @id, 그리고 @none을 이 순서로 preferred values에 추가합니다.
      2. 그렇지 않으면, @id, @vocab, 그리고 @none을 이 순서로 preferred values에 추가합니다.
    17. 그렇지 않으면, type/language value@none을 이 순서로 preferred values에 추가합니다. value@list의 값으로 빈 array를 가진 목록 객체이면, type/language@any로 설정합니다.
    18. @anypreferred values에 추가합니다.
    19. preferred values가 밑줄("_")을 가진 엔트리를 포함하는 경우, 해당 엔트리에서 밑줄부터 문자열 끝까지의 부분 문자열을 preferred values에 추가합니다.
    20. var, containers, type/language, 그리고 preferred values를 전달하여 용어 선택 알고리즘을 호출한 결과로 term을 초기화합니다.
    21. termnull이 아니면, term을 반환합니다.
  5. 이 시점에서, var를 축약할 수 있는 단순 용어가 없습니다. vocabtrue이고 active context어휘 매핑을 가지는 경우:
    1. var어휘 매핑 값으로 시작하지만 더 길면, var에서 일치하지 않는 부분 문자열로 suffix를 초기화합니다. suffixactive context 안에 용어 정의를 가지고 있지 않으면, suffix를 반환합니다.
  6. var활성 컨텍스트어휘 매핑을 사용하여 축약될 수 없었습니다. compact IRInull로 초기화하여 축약 IRI 생성을 시도합니다. 이 변수는 생성된 축약 IRI가 있는 경우 이를 저장하는 데 사용됩니다.
  7. active context 안의 각 용어 정의 definition에 대해:
    1. definitionIRI 매핑null이거나, 그 IRI 매핑var와 같거나, 그 IRI 매핑var의 시작 부분 부분 문자열이 아니거나, 또는 definitiontrue접두사 플래그를 가지지 않으면, definition의 키는 접두사로 사용될 수 없습니다. 다음 definition으로 계속합니다.
    2. definition 키, 콜론(:), 그리고 definitionIRI 매핑 값 뒤에 오는 var의 부분 문자열을 연결하여 candidate를 초기화합니다.
    3. compact IRInull이거나, candidate가 더 짧거나 같은 길이이지만 compact IRI보다 사전순으로 작고 candidateactive context 안에 용어 정의를 가지지 않는 경우, 또는 그러한 용어 정의var와 같은 IRI 매핑을 가지고 valuenull인 경우, compact IRIcandidate로 설정합니다.
  8. compact IRInull이 아니면, compact IRI를 반환합니다.
  9. IRI var축약 IRI와 혼동되지 않도록 하기 위해, varIRI 스킴접두사 플래그true로 설정된 활성 컨텍스트 안의 어떤 용어와 일치하고, var에 이중 슬래시(//)가 앞에 오는 IRI authority가 없으면, IRI confused with prefix 오류가 감지되었으며, 처리가 중단됩니다.
  10. vocabfalse이면, active context기준 IRI가 있는 경우 이를 사용하여 var상대 IRI 참조로 변환합니다.
  11. 마지막으로, var를 그대로 반환합니다.

6.3 값 축약

확장은 JSON-LD의 모든 값을 확장 형식으로 변환합니다. 이 알고리즘은 반대 작업을 수행하여, 값을 축약 형식으로 변환합니다. 이 알고리즘은 주어진 활성 컨텍스트에서 값의 관련 active property와 연결된 용어 정의에 따라 값을 축약합니다.

6.3.1 개요

이 절은 비규범입니다.

축약할 value@id 또는 @value 엔트리를 가집니다.

전자에 해당하는 경우, active property타입 매핑@id 또는 @vocab으로 설정되어 있고, value@id 엔트리만으로 구성되며, 만약 active property컨테이너 매핑@index포함한다면, @index 엔트리도 포함하는 경우, value@id 엔트리와 관련된 값을 축약하기 위해 IRI 축약 알고리즘을 사용한 결과를 반환함으로써 문자열로 축약될 수 있습니다. 그렇지 않으면, value는 축약될 수 없으며 그대로 반환됩니다.

후자에 해당하는 경우, value@value 엔트리와 관련된 값만으로 축약할 수 있을 수도 있습니다. 이는 active property가 일치하는 타입 매핑 또는 언어 매핑을 가지고, @index 엔트리가 없거나 active property컨테이너 매핑@index포함하는 경우 수행될 수 있습니다. 또한 @valuevalue 안의 유일한 엔트리인 경우 (active property컨테이너 매핑@index포함하는 경우에는 @index 엔트리를 제외하고)이며, 그 관련 값이 문자열이 아니거나, 기본 언어가 없거나, active property에 대해 명시적 null 언어 매핑이 있는 경우에도 수행될 수 있습니다.

6.3.2 알고리즘

이 알고리즘은 세 개의 필수 입력을 가집니다: active context, active property, 그리고 축약할 value입니다.

  1. resultvalue의 복사본으로 초기화합니다.
  2. active contextnull 역 컨텍스트를 가지면, active context 안의 역 컨텍스트active context를 사용하여 역 컨텍스트 생성 알고리즘을 호출한 결과로 설정합니다.
  3. inverse contextactive context 안의 역 컨텍스트 값으로 초기화합니다.
  4. languageactive context 안의 active property에 대한 언어 매핑으로 초기화하고, 있지 않으면 active context기본 언어로 초기화합니다.
  5. directionactive context 안의 active property에 대한 방향 매핑으로 초기화하고, 있지 않으면 active context기본 기준 방향으로 초기화합니다.
  6. value@id 엔트리를 가지고 @index 이외의 다른 엔트리를 가지지 않는 경우:
    1. active property타입 매핑@id로 설정되어 있으면, @id 엔트리와 관련된 값을 vocabfalse를 사용하여 IRI 축약한 결과로 result를 설정합니다.
    2. 그렇지 않고 active property타입 매핑@vocab으로 설정되어 있으면, @id 엔트리와 관련된 값을 IRI 축약한 결과로 result를 설정합니다.
  7. 그렇지 않고 valueactive property타입 매핑과 일치하는 값을 가진 @type 엔트리를 가지면, resultvalue@value 엔트리와 관련된 값으로 설정합니다.
  8. 그렇지 않고 active property타입 매핑@none이거나, value@type 엔트리를 가지고, value 안의 @type 값이 active property타입 매핑과 일치하지 않는 경우, 값 축약은 비활성화되므로 value를 그대로 둡니다.
    1. result 안의 모든 @type 값을 @type 엔트리 값의 IRI 축약 결과로 교체합니다.
  9. 그렇지 않고 @value 엔트리의 값이 문자열이 아닌 경우:
    1. value@index 엔트리를 가지고, active property와 관련된 컨테이너 매핑@index를 포함하거나, 또는 value@index 엔트리를 가지지 않으면, result@value 엔트리와 관련된 값으로 설정합니다.
  10. 그렇지 않고 value@language 엔트리를 가지고 그 값이 language와 정확히 일치하며, languagenull이 아닌 경우에는 대소문자를 구분하지 않는 비교를 사용하고, languagenull인 경우에는 존재하지 않으며, 그리고 value@direction 엔트리를 가지고 그 값이 direction과 정확히 일치하되, directionnull이 아닌 경우이고, 또는 directionnull인 경우에는 존재하지 않으면:
    1. value@index 엔트리를 가지고, active property와 관련된 컨테이너 매핑@index를 포함하거나, 또는 value@index 엔트리를 가지지 않으면, result@value 엔트리와 관련된 값으로 설정합니다.
  11. resultmap이면, result 안의 각 키를 그 키를 IRI 축약한 결과로 교체합니다.
  12. result를 반환합니다.

7. 평탄화 알고리즘

다음 절에서는 JSON-LD 문서를 평탄화하고, 노드 맵을 생성하며, 빈 노드를 생성하기 위한 알고리즘을 설명합니다.

7.1 평탄화 알고리즘

이 알고리즘은 확장된 JSON-LD 문서를 평탄화합니다. 즉 노드의 모든 프로퍼티를 단일 에 수집하고, 모든 빈 노드빈 노드 식별자로 레이블을 붙입니다. 문서의 이렇게 만들어진 균일한 형태는 특정 애플리케이션에서 JSON-LD 데이터를 처리하는 데 필요한 코드를 크게 단순화할 수 있습니다.

7.1.1 개요

이 절은 비규범입니다.

먼저, 노드 맵 생성 알고리즘을 사용하여 node map을 생성합니다. 이 알고리즘은 노드의 모든 프로퍼티를 단일 에 수집합니다. 다음 단계에서 node map평탄화된 문서 형식의 JSON-LD 문서로 변환됩니다.

7.1.2 알고리즘

이 알고리즘은 하나의 필수 및 하나의 선택적 입력 변수를 받습니다. 필수 입력은 평탄화할 element입니다. 선택적 입력은 ordered 플래그로, 명시된 곳에서 맵 엔트리 키를 사전순으로 정렬하는 데 사용됩니다. 전달되지 않으면, ordered 플래그는 false로 설정됩니다.

이 알고리즘은 빈 노드 식별자 생성 알고리즘을 사용하여 새 빈 노드 식별자를 생성하고, 기존 빈 노드 식별자에 다시 레이블을 붙입니다. 빈 노드 식별자 생성 알고리즘identifier map을 유지하여 소스 문서의 빈 노드 식별자가 충돌을 피하면서 새 빈 노드 식별자로 일관되게 다시 매핑되도록 보장합니다. 따라서 이 알고리즘이 실행되기 전에 identifier map은 재설정됩니다.

  1. node map으로 초기화합니다. 이 맵은 키가 @default이고 값이 빈 인 단일 엔트리로 구성됩니다.
  2. elementnode map을 전달하여 노드 맵 생성 알고리즘을 수행합니다.
  3. default graphnode map@default 엔트리 값으로 초기화합니다. 이는 기본 그래프를 나타내는 입니다.
  4. node map 안의 각 키-값 쌍 graph name-graph에 대해, 여기서 graph name@default가 아니며, orderedtrue이면 graph name 기준 사전순으로 정렬하여, 다음 단계를 수행합니다:
    1. default graphgraph name 엔트리가 없으면, 이를 생성하고 그 값을 값이 graph name으로 설정된 @id 엔트리로 구성된 으로 초기화합니다.
    2. default graph 안의 graph name 엔트리와 관련된 값을 entry 변수로 참조합니다.
    3. entry@graph 엔트리를 추가하고 이를 빈 배열로 설정합니다.
    4. graph 안의 각 id-node 쌍에 대해, orderedtrue이면 id 기준 사전순으로 정렬하여, node의 유일한 엔트리@id인 경우를 제외하고 nodeentry@graph 엔트리에 추가합니다.
  5. 배열 flattened를 초기화합니다.
  6. default graph 안의 각 id-node 쌍에 대해, orderedtrue이면 id 기준 사전순으로 정렬하여, node의 유일한 엔트리@id인 경우를 제외하고 nodeflattened에 추가합니다.
  7. flattened를 반환합니다.

7.2 노드 맵 생성

이 알고리즘은 전달된 확장 문서 안에 표현된 그래프노드의 인덱스화된 표현을 담는 node map을 생성합니다. IRI로 고유하게 식별되지 않는 모든 노드에는 (새) 빈 노드 식별자가 할당됩니다. 결과 node map은 문서 안의 모든 그래프에 대해 맵 엔트리를 가지며, 그 값은 문서 안에 표현된 각 노드에 대한 엔트리를 가진 또 다른 객체입니다. 기본 그래프는 @default 엔트리 아래에 저장되고, 다른 모든 그래프는 그 그래프 이름 아래에 저장됩니다.

7.2.1 개요

이 절은 비규범입니다.

이 알고리즘은 확장된 JSON-LD 문서를 재귀적으로 순회하여 노드의 모든 엔트리를 단일 에 수집합니다. 이 알고리즘은 문서에서 사용되는 그래프 이름을 나타내는 키를 가진 node map을 갱신합니다 (기본 그래프@default 엔트리 아래에 저장됩니다). 그 관련 값들은 이며, 그래프 안의 노드를 인덱스화합니다. 어떤 엔트리의 값이 노드 객체이면, 이는 @id 엔트리만으로 구성된 노드 객체로 대체됩니다. 노드 객체@id 엔트리를 가지지 않거나 빈 노드 식별자로 식별되는 경우, 새 빈 노드 식별자가 생성됩니다. 이러한 빈 노드 식별자의 재레이블링은 프로퍼티@type의 값에 대해서도 수행됩니다.

7.2.2 알고리즘

이 알고리즘은 확장된 JSON-LD 문서 element node map에 대한 참조를 입력으로 받습니다. 또한 선택적 매개변수로 active graph(기본값은 @default), active subject, active property, 그리고 list에 대한 참조를 가집니다. 전달되지 않으면 active subject, active property, 그리고 listnull로 설정됩니다.

  1. element가 배열이면, element 안의 각 item을 다음과 같이 처리한 뒤 반환합니다:
    1. itemelement로, node map, active graph, active subject, active property, 그리고 list를 전달하여 이 알고리즘을 재귀적으로 실행합니다.
  2. 그렇지 않으면 element입니다. node mapactive graph 엔트리 값인 graph 변수로 참조합니다. active subjectnull이면 nodenull로 설정하고, 그렇지 않으면 graphactive subject 엔트리subject node 변수로 참조합니다.
  3. element@type 엔트리 안의 각 item에 대해(있는 경우), 또는 @type 값이 존재하고 배열이 아닌 경우 @type의 값에 대해:
    1. item빈 노드 식별자이면, identifieritem을 전달하여 새로 생성된 빈 노드 식별자로 이를 대체합니다.
  4. element@value 엔트리를 가지면, 다음 단계를 수행합니다:
    1. listnull인 경우:
      1. subject nodeactive property 엔트리가 없으면, 이를 생성하고 그 값을 element를 포함하는 배열로 초기화합니다.
      2. 그렇지 않으면, elementsubject nodeactive property 엔트리와 관련된 배열 안의 모든 항목과 비교합니다. element와 동등한 항목이 없으면, element를 그 배열에 추가합니다. 두 은 동등한 맵 엔트리를 가지면 같다고 간주됩니다.
    2. 그렇지 않으면, elementlist@list 엔트리에 추가합니다.
  5. 그렇지 않고 element@list 엔트리를 가지면, 다음 단계를 수행합니다:
    1. 값이 빈 배열로 초기화된 @list 엔트리 하나로 구성된 새 result를 초기화합니다.
    2. element@list 엔트리 값을 element로, node map, active graph, active subject, active property, 그리고 resultlist로 전달하여 이 알고리즘을 재귀적으로 호출합니다.
    3. listnull이면, resultsubject nodeactive property 엔트리 값에 추가합니다.
    4. 그렇지 않으면, resultlist@list 엔트리에 추가합니다.
  6. 그렇지 않으면 element노드 객체이며, 다음 단계를 수행합니다:
    1. element@id 엔트리를 가지면, id를 그 값으로 설정하고, 그 엔트리element에서 제거합니다. id빈 노드 식별자이면, identifierid를 전달하여 새로 생성된 빈 노드 식별자로 이를 대체합니다.
    2. 그렇지 않으면, identifiernull을 전달하여 빈 노드 식별자 생성 알고리즘의 결과로 id를 설정합니다.
    3. graphid 엔트리를 포함하지 않으면, 이를 생성하고 그 값을 @id 엔트리 하나로 구성된 으로 초기화하며, 그 값은 id입니다.
    4. graphid 엔트리 값을 node 변수로 참조합니다.
    5. active subject이면, 역방향 프로퍼티 관계가 처리되는 중입니다. 다음 단계를 수행합니다:
      1. nodeactive property 엔트리가 없으면, 이를 생성하고 그 값을 active subject를 포함하는 배열로 초기화합니다.
      2. 그렇지 않으면, active subjectnodeactive property 엔트리와 관련된 배열 안의 모든 항목과 비교합니다. active subject와 동등한 항목이 없으면, active subject를 그 배열에 추가합니다. 두 은 동등한 맵 엔트리를 가지면 같다고 간주됩니다.
    6. 그렇지 않고 active propertynull이 아니면, 다음 단계를 수행합니다:
      1. 값이 id@id 엔트리 하나로 구성된 새 reference를 생성합니다.
      2. listnull인 경우:
        1. subject nodeactive property 엔트리가 없으면, 이를 생성하고 그 값을 reference를 포함하는 배열로 초기화합니다.
        2. 그렇지 않으면, referencesubject nodeactive property 엔트리와 관련된 배열 안의 모든 항목과 비교합니다. reference와 동등한 항목이 없으면, reference를 그 배열에 추가합니다. 두 은 동등한 맵 엔트리를 가지면 같다고 간주됩니다.
      3. 그렇지 않으면, referencelist@list 엔트리에 추가합니다.
    7. element@type 엔트리를 가지면, 그 관련 배열의 각 항목을 이미 해당 배열에 있는 경우를 제외하고, node@type 엔트리와 관련된 배열에 추가합니다. 마지막으로 @type 엔트리element에서 제거합니다.
    8. element@index 엔트리를 가지면, node@index 엔트리를 그 값으로 설정합니다. node가 이미 다른 값을 가진 @index 엔트리를 가지면, conflicting indexes 오류가 감지되었으며 처리가 중단됩니다. 그렇지 않으면 @index 엔트리element에서 제거하여 계속합니다.
    9. element@reverse 엔트리를 가지면:
      1. 값이 id@id 엔트리 하나를 가진 referenced node를 생성합니다.
      2. reverse mapelement@reverse 엔트리 값으로 초기화합니다.
      3. reverse map 안의 각 키-값 쌍 property-values에 대해:
        1. values의 각 value에 대해:
          1. valueelement로, node map, active graph, referenced nodeactive subject로, 그리고 propertyactive property로 전달하여 이 알고리즘을 재귀적으로 호출합니다. active subject을 전달하는 것은 역방향 프로퍼티 관계가 처리 중임을 알고리즘에 나타냅니다.
      4. @reverse 엔트리element에서 제거합니다.
    10. element@graph 엔트리를 가지면, @graph 엔트리의 값을 element로, node map, 그리고 idactive graph로 전달하여 이 알고리즘을 재귀적으로 호출한 뒤, @graph 엔트리element에서 제거합니다.
    11. element@included 엔트리를 가지면, @included 엔트리의 값을 element로, node map, 그리고 active graph를 전달하여 이 알고리즘을 재귀적으로 호출한 뒤, @included 엔트리element에서 제거합니다.
    12. 마지막으로, element 안의 각 키-값 쌍 property-value에 대해 property 기준으로 정렬하여 다음 단계를 수행합니다:
      1. property빈 노드 식별자이면, identifierproperty를 전달하여 새로 생성된 빈 노드 식별자로 이를 대체합니다.
        참고
        빈 노드 식별자를 사용하여 프로퍼티에 레이블을 붙이는 것은 더 이상 사용되지 않으며, JSON-LD의 향후 버전에서 제거될 수 있습니다.
      2. nodeproperty 엔트리가 없으면, 이를 생성하고 그 값을 빈 배열로 초기화합니다.
      3. valueelement로, node map, active graph, idactive subject로, 그리고 propertyactive property로 전달하여 이 알고리즘을 재귀적으로 호출합니다.

7.3 노드 맵 병합

이 알고리즘은 노드 맵 생성 알고리즘을 사용하여 생성된 graph map 안에 포함된 모든 그래프를 사용해, 주어에서 노드로 가는 새 맵을 생성합니다. 이를 통해 node map에 포함된 각 그래프 안에서 주어진 주어에 대해 정의된 정보를 담는 병합된 노드 객체를 생성합니다.

  1. result를 빈 으로 생성합니다
  2. graph map 안의 각 graph namenode map에 대해, 그리고 node map 안의 각 idnode에 대해:
    1. merged noderesult 안의 id에 대한 값으로 초기화하되, 존재하지 않으면 값이 id@id 엔트리 하나로 구성된 새 으로 초기화합니다.
    2. node 안의 각 propertyvalues에 대해:
      1. property@type 이외의 키워드이면, property와 값을 merged node에 추가합니다.
      2. 그렇지 않으면, values의 각 요소를 merged node 안의 property에 대한 값에 병합하되, 필요한 경우 빈 배열로 초기화합니다.
  3. result를 반환합니다.

7.4 빈 노드 식별자 생성

이 알고리즘은 새 빈 노드 식별자를 생성하거나, 새 식별자의 도입으로 인한 충돌을 피하기 위해 기존 빈 노드 식별자에 다시 레이블을 붙이는 데 사용됩니다.

7.4.1 개요

이 절은 비규범입니다.

가장 단순한 경우는 전달된 identifier에 대해 identifier map 안에 이미 빈 노드 식별자가 존재하는 경우이며, 이 경우 그것이 그대로 반환됩니다. 그렇지 않으면 새 빈 노드 식별자가 생성됩니다. 전달된 identifiernull이 아니면, identifier빈 노드 식별자와 연결하는 엔트리가 identifier map 안에 생성됩니다.

7.4.2 알고리즘

이 알고리즘은 null일 수 있는 단일 입력 변수 identifier를 받습니다. 이 알고리즘은 기존 빈 노드 식별자를 새 빈 노드 식별자로 다시 레이블링하기 위해 identifier map을 유지하며, 이는 호출하는 알고리즘이 초기화될 때 재설정됩니다.

  1. identifiernull이 아니고 identifier map 안에 엔트리를 가지면, 매핑된 식별자를 반환합니다.
  2. 그렇지 않으면, 새 고유 빈 노드 식별자를 생성합니다.
  3. identifiernull이 아니면, identifier에 대한 새 엔트리를 identifier map 안에 생성하고 그 값을 새 빈 노드 식별자로 설정합니다.
  4. 빈 노드 식별자를 반환합니다.
참고

빈 노드 식별자를 생성하는 한 가지 방법은 카운터를 유지하고, 새 식별자를 생성할 때 이를 증가시킨 뒤 _:b 같은 문자열에 추가하는 것입니다.

8. RDF 직렬화/역직렬화 알고리즘

이 절에서는 JSON-LD 문서를 RDF 데이터셋으로 역직렬화하고 그 반대로 수행하는 알고리즘을 설명합니다. 이 알고리즘들은 요소에 무작위 접근이 가능한 메모리 내 구현을 위해 설계되었습니다.

8.1 JSON-LD를 RDF로 역직렬화하는 알고리즘

이 알고리즘은 JSON-LD 문서를 RDF 데이터셋으로 역직렬화합니다. RDF는 빈 노드프로퍼티로 사용되는 것을 허용하지 않지만, JSON-LD는 허용한다는 점에 유의하십시오. 따라서 기본적으로 빈 노드를 프로퍼티로 포함했을 트리플은 JSON-LD를 RDF로 해석할 때 버려집니다.

참고

빈 노드 식별자를 사용하여 프로퍼티에 레이블을 붙이는 것은 더 이상 사용되지 않으며, JSON-LD의 향후 버전에서 제거될 수 있습니다.

rdfDirection 옵션이 null이 아니면, i18n-datatype 또는 compound-literal 형식에서 변환하기 위해 특수 처리가 사용됩니다.

구현은 올바른 형식트리플그래프 이름만 생성해야 MUST 합니다:

8.1.1 개요

이 절은 비규범입니다.

JSON-LD 문서는 확장되고 노드 맵 생성 알고리즘을 사용하여 node map으로 변환됩니다. 이를 통해 문서 안에 표현된 각 그래프를 추출하고 평탄화할 수 있으므로, 각 노드 객체를 처리하기가 더 쉬워집니다. node map의 각 그래프는 트리플을 추출하기 위해 처리되며, 여기에 모든 (기본이 아닌) 그래프 이름이 적용되어 RDF 데이터셋이 생성됩니다. node map 안의 각 노드 객체주어에 해당하는 @id 엔트리를 가지며, 다른 엔트리들은 술어를 나타냅니다. 각 엔트리 값은 IRI 또는 빈 노드 식별자이거나, RDF 리터럴로 변환되어 트리플을 생성할 수 있습니다. 목록목록을 RDF로 변환하는 알고리즘을 사용하여 RDF 컬렉션으로 변환됩니다.

8.1.2 알고리즘

이 알고리즘은 노드 맵 생성 알고리즘의 결과인 node map과, 새 그래프트리플이 추가되는 RDF 데이터셋 dataset을 받습니다. 또한 두 개의 선택적 입력 변수 produceGeneralizedRdfrdfDirection도 받습니다. produceGeneralizedRdf 옵션이 true로 설정되어 있지 않으면, 빈 노드 술어를 포함하는 트리플은 출력에서 제외됩니다.

참고

빈 노드 식별자를 사용하여 프로퍼티에 레이블을 붙이는 것은 더 이상 사용되지 않으며, JSON-LD의 향후 버전에서 제거될 수 있습니다. 일반화된 RDF 데이터셋 지원도 마찬가지이므로, produceGeneralizedRdf 옵션도 제거될 수 있습니다.

  1. node map 안의 각 graph namegraph에 대해, graph name 기준으로 정렬하여:
    1. graph name올바른 형식이 아니면, 다음 graph name-graph 쌍으로 계속합니다.
    2. graph name@default이면, triplesdatasetdefaultGraph 속성 값으로 초기화합니다. 그렇지 않으면 triples를 빈 RdfGraph로 초기화하고, graphName에 대해 graph name과 함께 datasetadd 메서드를 사용하여 dataset에 추가합니다.
    3. graph 안의 각 subjectnode에 대해, subject 기준으로 정렬하여:
      1. subject올바른 형식이 아니면, 다음 subject-node 쌍으로 계속합니다.
      2. node 안의 각 propertyvalues에 대해, property 기준으로 정렬하여:
        1. property@type이면, values 안의 각 type에 대해, subject, predicate에 대한 rdf:type, 그리고 object에 대한 type으로 구성된 새 RdfTriple을 생성하고, type올바른 형식이 아닌 경우를 제외하고, triplesadd 메서드를 사용하여 triples에 추가합니다.
        2. 그렇지 않고 property키워드이면, 다음 property-values 쌍으로 계속합니다.
        3. 그렇지 않고 property빈 노드 식별자이고, produceGeneralizedRdf 옵션이 true가 아니면, 다음 property-values 쌍으로 계속합니다.
          참고
          빈 노드 식별자를 사용하여 프로퍼티에 레이블을 붙이는 것은 더 이상 사용되지 않으며, JSON-LD의 향후 버전에서 제거될 수 있습니다. 일반화된 RDF 데이터셋 지원도 마찬가지이므로 produceGeneralizedRdf 옵션도 제거될 수 있습니다.
        4. 그렇지 않고 property올바른 형식이 아니면, 다음 property-values 쌍으로 계속합니다.
        5. 그렇지 않으면, propertyIRI 또는 빈 노드 식별자입니다. values 안의 각 item에 대해:
          1. list triples를 빈 배열로 초기화합니다.
            참고
            item값 객체, 목록 객체, 또는 노드 객체입니다.
          2. subject, property, 그리고 itemlist triples를 전달하여 객체를 RDF로 변환하는 알고리즘을 사용한 결과로 구성된 트리플triplesadd 메서드를 사용하여 triples에 추가합니다. 다만 결과가 null인 경우는 제외하며, 이는 무시해야 하는 올바른 형식이 아닌 리소스를 나타냅니다.
          3. list triples의 모든 RdfTriple 인스턴스를 triplesadd 메서드를 사용하여 triples에 추가합니다.

8.2 객체를 RDF로 변환

이 알고리즘은 노드 객체, 목록 객체, 또는 값 객체를 받아, 이를 트리플객체로 사용될 리소스로 변환합니다. 상대 IRI 참조를 포함하는 노드 객체가 알고리즘에 전달되면 null이 반환되며, 그러면 결과 트리플이 무시됩니다. 입력이 목록 객체인 경우, 그 입력에서 생성된 트리플도 반환합니다.

8.2.1 개요

이 절은 비규범입니다.

값 객체§ 8.6 데이터 왕복 변환에 설명된 대로 RDF 리터럴로 변환되는 반면, 노드 객체IRI, 빈 노드 식별자, 또는 null로 변환됩니다.

8.2.2 알고리즘

이 알고리즘은 두 개의 인수를 받습니다. item값 객체, 목록 객체, 또는 노드 객체 중 하나여야 MUST 하며, list triples는 빈 배열입니다.

  1. item노드 객체이고 그 @id 엔트리의 값이 올바른 형식이 아니면, null을 반환합니다.
  2. item노드 객체이면, 그 @id 엔트리와 관련된 IRI 또는 빈 노드 식별자를 반환합니다.
  3. item목록 객체이면, item@list 엔트리와 관련된 값과 list triples를 전달하여 목록 변환 알고리즘의 결과를 반환합니다.
  4. 그렇지 않으면, item값 객체입니다. valueitem 안의 @value 엔트리와 관련된 값으로 초기화합니다.
  5. datatypeitem@type 엔트리와 관련된 값으로 초기화하거나, item에 그러한 엔트리가 없으면 null로 초기화합니다.
  6. datatypenull이 아니고 올바른 형식IRI도 아니며 @json도 아니면, null을 반환합니다.
  7. item@language 엔트리를 가지며 그것이 올바른 형식이 아니면, null을 반환합니다.
  8. datatype@json이면, value내부 표현을 JSON으로 변환한 결과를 사용하여 value정규 어휘 형식으로 변환하고, datatyperdf:JSON으로 설정합니다.
    이슈
    JSON Canonicalization Scheme (JCS) [RFC8785]는 JSON 정규화를 위한 새로운 표준입니다. 이 명세는 그러한 정규 표현을 요구하도록 갱신될 가능성이 높습니다. 사용자는 JSON 리터럴의 어휘 표현이 RDF 리터럴로 사용되는 것에 의존할 때 주의해야 합니다. 직렬화의 세부 사항이 이 문서의 향후 개정에서 변경될 수 있기 때문입니다.
  9. valuetrue 또는 false이면, value§ 8.6 데이터 왕복 변환에 설명된 정규 어휘 형식문자열 true 또는 false로 설정합니다. datatypenull이면, datatypexsd:boolean으로 설정합니다.
  10. 그렇지 않고 value가 0이 아닌 소수부(모듈로 1 연산의 결과)를 가진 숫자이거나 절댓값이 1021 이상인 경우, 또는 value숫자이고 datatypexsd:double이면, value를 [XMLSCHEMA11-2]에 정의되고 § 8.6 데이터 왕복 변환에 설명된 xsd:double정규 어휘 형식문자열로 변환합니다. datatypenull이면, datatypexsd:double으로 설정합니다.
  11. 그렇지 않고 value숫자이면, 이를 [XMLSCHEMA11-2]에 정의되고 § 8.6 데이터 왕복 변환에 설명된 xsd:integer정규 어휘 형식문자열로 변환합니다. datatypenull이면, datatypexsd:integer로 설정합니다.
    참고
    앞 단계로부터 value에는 0이 아닌 소수부가 없다는 것이 따릅니다.
  12. 그렇지 않고 datatypenull이면, item이 @language 엔트리를 가지는지에 따라 datatypexsd:string 또는 rdf:langString으로 설정합니다.
  13. item@direction 엔트리를 포함하고 rdfDirectionnull이 아니면, item은 특수 규칙을 사용하여 직렬화되는 값 객체입니다.
    1. languageitem 안의 @language 값으로 초기화하되 소문자로 정규화하거나, 그러한 엔트리가 없으면 빈 문자열("")로 초기화합니다.
      참고
      일반적으로 언어 태그는 정규화되지 않지만, i18n-datatype 또는 compound-literal 값을 만들 때에는 상호운용성 향상을 위해 값이 소문자로 정규화됩니다.
    2. rdfDirectioni18n-datatype이면, languageitem 안의 @direction 값을 밑줄("_")로 구분하여 https://www.w3.org/ns/i18n#에 추가한 결과로 datatype를 설정합니다. valuedatatype를 사용하여 literalRDF 리터럴로 초기화합니다.
      참고
      프로세서는 언어 태그를 소문자로 정규화할 MAY 있습니다.
      참고
      @direction@language 없이 사용될 수 있으므로, http://w3.org/ns/i18n#_ltr처럼 언어 태그를 인코딩하지 않는 데이터타입 IRI를 생성하는 것도 가능하고 유효합니다.
    3. 그렇지 않고 rdfDirectioncompound-literal이면:
      1. literal을 새 빈 노드로 초기화합니다.
      2. literal을 주어로, rdf:value를 술어로, item 안의 @value 값을 객체로 사용하여 새 트리플을 생성하고, 이를 list triples에 추가합니다.
      3. item@language에 대한 엔트리를 가지면, literal을 주어로, rdf:language를 술어로, language를 객체로 사용하여 새 트리플을 생성하고, 이를 list triples에 추가합니다.
      4. literal을 주어로, rdf:direction을 술어로, item 안의 @direction 값을 객체로 사용하여 새 트리플을 생성하고, 이를 list triples에 추가합니다.
  14. 그렇지 않으면, valuedatatype를 사용하여 literalRDF 리터럴로 초기화합니다. item@language 엔트리를 가지면, 그 @language 엔트리와 관련된 값을 literal언어 태그로 추가합니다.
  15. literal을 반환합니다.

8.3 목록을 RDF로 변환

목록 변환은 목록 객체를 받아, RDF Semantics [RDF11-MT]에 정의된 RDF 컬렉션으로 변환하는 과정입니다.

8.3.1 개요

이 절은 비규범입니다.

목록의 각 요소에 대해 새 빈 노드 식별자가 할당되며, 이는 rdf:firstrdf:rest를 생성하는 데 사용됩니다. 이 알고리즘은 목록의 머리를 반환하며, 이는 처음 할당된 빈 노드 식별자이거나, 목록이 비어 있으면 rdf:nil입니다. 목록 요소가 IRI를 나타내는 경우, 해당하는 rdf:first 트리플은 생략됩니다.

8.3.2 알고리즘

이 알고리즘은 두 개의 입력을 받습니다: 배열 list와, 생성된 트리플을 반환하는 데 사용되는 빈 배열 list triples입니다.

  1. list가 비어 있으면 rdf:nil을 반환합니다.
  2. 그렇지 않으면, list 안의 각 엔트리에 대해 새로 생성된 빈 노드 식별자로 구성된 배열 bnodes를 생성합니다.
  3. bnodessubjectlistitem으로 이루어진 각 쌍에 대해:
    1. embedded triples를 새 빈 배열로 초기화합니다.
    2. itemembedded tripleslist triples 전달하여 객체를 RDF로 변환하는 알고리즘을 사용한 결과로 object를 초기화합니다.
    3. objectnull인 경우를 제외하고, subject, rdf:first, 그리고 object로 구성된 트리플list triples에 추가합니다.
    4. restbnodes 안의 다음 엔트리로 초기화하거나, 그러한 엔트리가 없으면 rdf:nil로 초기화합니다. subject, rdf:rest, 그리고 rest로 구성된 트리플list triples에 추가합니다.
    5. embedded triples의 모든 값을 list triples에 추가합니다
  4. bnodes의 첫 번째 빈 노드를 반환하거나, bnodes가 비어 있으면 rdf:nil을 반환합니다.

8.4 RDF를 JSON-LD로 직렬화하는 알고리즘

이 알고리즘은 기본 그래프와 0개 이상의 명명된 그래프로 구성된 RDF 데이터셋을 JSON-LD 문서로 직렬화합니다.

RDF 추상 구문에서 RDF 리터럴은 [RDF11-CONCEPTS]에 정의된 것처럼 어휘 형식을 가집니다. 이러한 리터럴의 형식은 이 리터럴을 기반으로 JSON-LD 값을 만들 때 사용됩니다.

8.4.1 개요

이 절은 비규범입니다.

데이터셋 안의 각 그래프를 반복하여, 각 RDF 컬렉션목록으로 변환하고, 모든 RDF 리터럴, IRI빈 노드 식별자에 대해 확장 형식의 JSON-LD 문서를 생성합니다. useNativeTypes 플래그가 true로 설정되어 있으면, xsd:integer 또는 xsd:double과 같은 데이터타입 IRI를 가진 RDF 리터럴JSON 숫자로 변환되고, xsd:boolean과 같은 데이터타입 IRI를 가진 RDF 리터럴§ 8.6 데이터 왕복 변환에 설명된 것처럼 그 어휘 형식을 기반으로 true 또는 false로 변환됩니다. useRdfType 플래그가 true로 설정되어 있지 않으면, 연관된 객체가 IRI 또는 빈 노드 식별자인 한, rdf:type 술어는 @type으로 직렬화됩니다.

rdfDirection 옵션이 null이 아니면, i18n-datatype 또는 compound-literal 형식에서 변환하기 위해 특수 처리가 사용됩니다.

8.4.2 알고리즘

이 알고리즘은 하나의 필수 입력과 네 개의 선택적 입력을 받습니다: RDF 데이터셋 dataset이며, 네 개의 선택적 인수는 ordered 플래그입니다. 기본값은 false이고, 명시된 곳에서 맵 엔트리 키를 사전순으로 정렬하는 데 사용됩니다, rdfDirection는 기본값이 null, useNativeTypes 플래그는 기본값이 false, 그리고 useRdfType 플래그는 기본값이 false입니다.

datasetiterable이며, RdfDataset 안에 포함된 그래프그래프 이름을 반복할 수 있습니다. 각 그래프 역시 iterable로, RdfGraph 안에 포함된 트리플을 반복할 수 있습니다.

  1. default graph를 빈 으로 초기화합니다.
  2. graph map으로 초기화합니다. 이 맵은 default graph를 참조하는 값을 가진 @default 엔트리 하나로 구성됩니다.
  3. referenced once를 빈 으로 초기화합니다.
  4. compound literal subjects를 빈 으로 초기화합니다.
  5. dataset 안의 각 graph에 대해:
    1. graph기본 그래프이면 name@default로 초기화하고, 그렇지 않으면 graph와 관련된 그래프 이름으로 초기화합니다.
    2. graph mapname 엔트리가 없으면, 이를 생성하고 그 값을 빈 으로 설정합니다.
    3. compound literal subjectsname 엔트리가 없으면, 이를 생성하고 그 값을 빈 으로 설정합니다.
    4. graph기본 그래프가 아니고 default graphname 엔트리를 가지지 않으면, 그러한 엔트리를 생성하고 그 값을 값이 name@id 엔트리 하나를 가진 새 으로 초기화합니다.
    5. graph map 안의 name 엔트리 값을 node map 변수로 참조합니다.
    6. compound literal subjects 안의 name 엔트리 값을 compound map 변수로 참조합니다.
    7. graph 안의 각 트리플에 대해, 이는 subject, predicate, 그리고 object로 구성됩니다:
      1. node mapsubject 엔트리가 없으면, 이를 생성하고 그 값을 값이 subject로 설정된 @id 엔트리 하나로 구성된 새 으로 초기화합니다.
      2. node map 안의 subject 엔트리 값을 node 변수로 참조합니다.
      3. rdfDirection 옵션이 compound-literal이고 predicaterdf:direction이면, compound map 안에 subject에 대한 엔트리를 추가하고 그 값을 true로 설정합니다.
      4. objectIRI 또는 빈 노드 식별자이고, node mapobject 엔트리가 없으면, 이를 생성하고 그 값을 값이 object로 설정된 @id 엔트리 하나로 구성된 새 으로 초기화합니다.
      5. predicaterdf:type과 같고, useRdfType 플래그가 true가 아니며, objectIRI 또는 빈 노드 식별자이면, objectnode@type 엔트리 값에 추가합니다. 단, 그러한 항목이 이미 존재하는 경우는 제외합니다. 그러한 엔트리가 없으면 이를 생성하고 유일한 항목이 object배열로 초기화합니다. 마지막으로 다음 트리플로 계속합니다.
      6. object, rdfDirection, 그리고 useNativeTypes를 전달하여 RDF를 객체로 변환하는 알고리즘을 사용한 결과로 value를 초기화합니다.
      7. nodepredicate 엔트리가 없으면, 이를 생성하고 그 값을 빈 배열로 초기화합니다.
      8. nodepredicate 엔트리와 관련된 배열 안에 value와 동등한 항목이 없으면, value에 대한 참조를 그 배열에 추가합니다. 두 은 동등한 맵 엔트리를 가지면 같다고 간주됩니다.
      9. objectrdf:nil이면, 이는 RDF 컬렉션의 종료를 나타냅니다:
        1. node mapobject 엔트리usages 엔트리usages 변수로 참조합니다.
        2. node, property, 그리고 value라는 세 개의 엔트리로 구성된 새 usages 배열에 추가합니다. node 엔트리node에 대한 참조로, propertypredicate로, valuevalue에 대한 참조로 설정됩니다.
      10. 그렇지 않고 referenced onceobject에 대한 엔트리를 가지면, referenced onceobject 엔트리false로 설정합니다.
      11. 그렇지 않고 object빈 노드 식별자이면, 이는 목록 노드를 나타낼 수 있습니다:
        1. referenced onceobject 엔트리node, property, 그리고 value라는 세 개의 엔트리로 구성된 새 으로 설정합니다. node 엔트리node에 대한 참조로, propertypredicate로, valuevalue에 대한 참조로 설정됩니다.
  6. graph map 안의 각 namegraph object에 대해:
    1. compound literal subjectsname에 대한 엔트리를 가지면, 그 엔트리 안의 키인 각 cl에 대해:
      1. cl entryreferenced once 안의 cl 값으로 초기화하되, cl entry이 아니면 다음 cl로 계속합니다.
      2. nodecl entry 안의 node 값으로 초기화합니다.
      3. propertycl entry 안의 property 값으로 초기화합니다.
      4. valuecl entry 안의 value 값으로 초기화합니다.
      5. cl nodegraph object 안의 cl 값으로 초기화하고, 그 엔트리graph object에서 제거하되, cl node이 아니면 다음 cl로 계속합니다.
      6. node 안의 property 값에 있는 각 cl reference 중에서 cl reference 안의 @id 값이 cl인 것에 대해:
        1. cl reference 안의 @id 엔트리를 삭제합니다.
        2. cl reference@value에 대한 엔트리를 추가하고, 그 값은 cl node 안의 rdf:value 엔트리에서 가져옵니다.
        3. cl reference@language에 대한 엔트리를 추가하고, 있다면 그 값은 cl node 안의 rdf:language 엔트리에서 가져옵니다. 그 값이 [BCP47]의 2.2.9절에 따라 올바른 형식이 아니면, invalid language-tagged string 오류가 감지되었으며 처리가 중단됩니다.
        4. cl reference@direction에 대한 엔트리를 추가하고, 있다면 그 값은 cl node 안의 rdf:direction 엔트리에서 가져옵니다. 그 값이 "ltr"도 아니고 "rtl"도 아니면, invalid base direction 오류가 감지되었으며 처리가 중단됩니다.
    2. graph objectrdf:nil 엔트리가 없으면, 해당 그래프에는 변환할 필요가 있는 목록이 없으므로 다음 name-graph object 쌍으로 계속합니다.
    3. nilgraph objectrdf:nil 엔트리 값으로 초기화합니다.
    4. nilusages 엔트리 안의 각 항목 usage에 대해, 다음 단계를 수행합니다:
      1. nodeusagenode 엔트리 값의 값으로, propertyusageproperty 엔트리 값으로, 그리고 headusagevalue 엔트리 값으로 초기화합니다.
      2. 두 개의 빈 배열 listlist nodes를 초기화합니다.
      3. propertyrdf:rest와 같고, node@id 엔트리 값이 빈 노드 식별자이며, referenced oncenode@id 엔트리와 관련된 엔트리 값이 이고, noderdf:firstrdf:rest 엔트리를 가지며, 둘 다 값으로 단일 요소로 구성된 배열을 가지고, node가 선택적 @type 엔트리 이외의 다른 엔트리를 가지지 않으며, 그 값이 rdf:List와 같은 단일 항목을 가진 배열인 동안, node올바른 형식의 목록 노드를 나타냅니다. 목록을 그 머리 방향으로 역방향 순회하기 위해 다음 단계를 수행합니다:
        1. noderdf:first 엔트리의 유일한 항목을 list 배열에 추가합니다.
        2. node@id 엔트리 값을 list nodes 배열에 추가합니다.
        3. node usagenode@id 엔트리와 관련된 referenced once엔트리 값으로 초기화합니다.
        4. nodenode usagenode 엔트리 값으로, propertynode usageproperty 엔트리 값으로, 그리고 headnode usagevalue 엔트리 값으로 설정합니다.
        5. node@id 엔트리빈 노드 식별자가 아니라 IRI이면, while 루프를 종료합니다.
      4. head에서 @id 엔트리를 제거합니다.
      5. list 배열의 순서를 뒤집습니다.
      6. head@list 엔트리를 추가하고 그 값을 list 배열로 초기화합니다.
      7. list nodes 안의 각 항목 node id에 대해, graph object에서 node id 엔트리를 제거합니다.
  7. 배열 result를 초기화합니다.
  8. default graph 안의 각 subjectnode에 대해 subject 기준 사전순으로 정렬하여 orderedtrue이면:
    1. graph mapsubject 엔트리를 가지면:
      1. node@graph 엔트리를 추가하고 그 값을 빈 배열로 초기화합니다.
      2. graph mapsubject 엔트리 안의 각 키-값 쌍 s-n에 대해, s 기준 사전순으로 정렬하여 orderedtrue이면, n에서 usages 엔트리를 제거한 뒤, n의 남은 유일한 엔트리@id인 경우를 제외하고 nnode@graph 엔트리에 추가합니다.
    2. node에서 usages 엔트리를 제거한 뒤, node의 남은 유일한 엔트리@id인 경우를 제외하고 noderesult에 추가합니다.
  9. result를 반환합니다.

8.5 RDF를 객체로 변환

이 알고리즘은 RDF 리터럴을 JSON-LD 값 객체로 변환하고, RDF 빈 노드 또는 IRI를 JSON-LD 노드 객체로 변환합니다.

8.5.1 개요

이 절은 비규범입니다.

RDF 리터럴값 객체로 변환되는 반면, IRI빈 노드 식별자노드 객체로 변환됩니다.

rdf:JSON 데이터타입을 가진 리터럴은 [JSON-LD11]의 JSON datatype에 정의된 어휘-값 매핑을 기반으로 하는 내부 표현과 @json@type을 사용하여 값 객체로 변환됩니다.

rdfDirection 옵션이 i18n-datatype으로 설정된 경우, https://www.w3.org/ns/i18n#로 시작하는 데이터타입을 가진 리터럴은 데이터타입에서 언어 태그기본 방향을 디코딩하여 값 객체로 변환됩니다.

rdfDirection 옵션이 compound-literal로 설정된 경우, rdf:direction을 사용하는 빈 노드 객체는 rdf:value, rdf:language, 그리고 rdf:direction 프로퍼티를 디코딩하여 값 객체로 변환됩니다.

useNativeTypes 플래그가 true로 설정되어 있으면, xsd:integer 또는 xsd:double과 같은 데이터타입 IRI를 가진 RDF 리터럴JSON 숫자로 변환되고, xsd:boolean과 같은 데이터타입 IRI를 가진 RDF 리터럴§ 8.6 데이터 왕복 변환에 설명된 것처럼 그 어휘 형식을 기반으로 true 또는 false로 변환됩니다.

8.5.2 알고리즘

이 알고리즘은 세 개의 필수 입력을 받습니다: 으로 변환될 value, rdfDirection, 그리고 useNativeTypes 플래그입니다.

  1. valueIRI 또는 빈 노드 식별자이면, 값이 value로 설정된 @id 엔트리 하나로 구성된 새 을 반환합니다.
  2. 그렇지 않으면 valueRDF 리터럴입니다:
    1. 새 빈 result를 초기화합니다.
    2. converted valuevalue로 초기화합니다.
    3. typenull로 초기화합니다
    4. useNativeTypestrue이면
      1. value데이터타입 IRIxsd:string과 같으면, converted valuevalue어휘 형식으로 설정합니다.
      2. 그렇지 않고 value데이터타입 IRIxsd:boolean과 같으면, value어휘 형식true와 일치하면 converted valuetrue로 설정하고, false와 일치하면 false로 설정합니다. 둘 중 어느 것과도 일치하지 않으면 typexsd:boolean으로 설정합니다.
      3. 그렇지 않고 value데이터타입 IRIxsd:integer 또는 xsd:double과 같고 그 어휘 형식이 [XMLSCHEMA11-2]에 따라 유효한 xsd:integer 또는 xsd:double이면, converted value어휘 형식을 JSON 숫자로 변환한 결과로 설정합니다.
    5. 그렇지 않고 처리 모드json-ld-1.0이 아니며, valueJSON 리터럴이면, converted valuevalue의 어휘 값을 JSON-LD 내부 표현으로 바꾼 결과로 설정하고, type@json으로 설정합니다. value의 어휘 값이 [RFC8259]의 JSON 문법에 따라 유효한 JSON이 아니면, invalid JSON literal 오류가 감지되었으며 처리가 중단됩니다.
    6. 그렇지 않고 value데이터타입 IRIhttps://www.w3.org/ns/i18n#로 시작하고, rdfDirectioni18n-datatype이면:
      1. converted valuevalue어휘 형식으로 설정합니다.
      2. 프래그먼트 식별자에서 밑줄("_")까지의 문자열 접두사가 비어 있지 않으면, result@language 엔트리를 추가하고 그 값을 해당 접두사로 설정합니다.
        참고
        @direction@language 없이 사용될 수 있으므로, http://w3.org/ns/i18n#_ltr처럼 언어 태그를 인코딩하지 않는 데이터타입 IRI를 생성하는 것도 가능하고 유효합니다.
      3. result@direction 엔트리를 추가하고 그 값을 밑줄("_") 뒤에 오는 프래그먼트 식별자의 부분 문자열로 설정합니다.
    7. 그렇지 않고 value언어 태그가 붙은 문자열이면, result@language 엔트리를 추가하고 그 값을 value언어 태그로 설정합니다.
    8. 그렇지 않으면, typevalue데이터타입 IRI로 설정하되, xsd:string과 같으면 무시합니다.
    9. result에 값이 converted value로 설정된 @value 엔트리를 추가합니다.
    10. typenull이 아니면, result에 값이 type으로 설정된 @type 엔트리를 추가합니다.
    11. result를 반환합니다.

8.6 데이터 왕복 변환

JSON-LD를 RDF로 역직렬화할 때, JSON 네이티브 숫자는 0이 아닌 소수부가 있는지 여부(모듈로 1 연산의 결과)에 따라 xsd:integer 또는 xsd:double로 자동 타입 강제 변환되고, 불리언 값 truefalsexsd:boolean으로 강제 변환되며, 문자열xsd:string으로 강제 변환됩니다. JSON, 숫자, 또는 불리언 값 자체는 정규 어휘 형식, 즉 [XMLSCHEMA11-2]에 정의된 결정적 문자열 표현으로 변환됩니다.

정수정규 어휘 형식, 즉 0이 아닌 소수부가 없는 숫자 이고 절댓값이 1021보다 작은 경우, 또는 xsd:integer로 강제 변환된 숫자는 선택적 선행 마이너스 부호가 붙은 유한 길이의 십진 숫자(0-9) 시퀀스입니다. 선행 0은 금지됩니다. JavaScript에서 구현자는 정수를 정규 어휘 형식으로 변환하기 위해 다음 코드 조각을 사용할 수 있습니다:

예제 20: JavaScript의 샘플 정수 직렬화 구현
(value).toFixed(0).toString()

double정규 어휘 형식, 즉 0이 아닌 소수부를 가지거나 절댓값이 1021 이상인 숫자, 또는 xsd:double로 강제 변환된 숫자는 가수 뒤에 문자 E가 오고, 그 뒤에 지수가 오는 형식으로 구성됩니다. 가수는 십진수이고 지수는 정수입니다. 지수에서 선행 0과 선행 플러스 부호(+)는 금지됩니다. 지수가 0이면 E0으로 표시됩니다. 가수에서는 앞의 선택적 플러스 부호가 금지되고 소수점이 필요합니다. 선행 및 후행 0은 다음 조건에 따라 금지됩니다: 숫자 표현은 소수점 왼쪽에 0이 아닌 단일 숫자가 있고, 표현되는 값이 0이 아닌 한 소수점 오른쪽에 적어도 하나의 숫자가 있도록 정규화되어야 합니다. 0의 정규 표현은 0.0E0입니다. xsd:double의 값 공간은 IEEE double-precision 64-bit floating point type [IEEE-754-2008]에 의해 정의되는 반면, JSON 숫자의 값 공간은 지정되어 있지 않습니다. JSON-LD를 RDF로 역직렬화할 때 가수는 소수점 뒤 15 자리로 반올림됩니다. JavaScript에서 구현자는 double을 정규 어휘 형식으로 변환하기 위해 다음 코드 조각을 사용할 수 있습니다:

예제 21: JavaScript의 샘플 부동소수점 숫자 직렬화 구현
(value).toExponential(15).replace(/(\d)0*e\+?/,'$1E')

불리언 값 truefalse정규 어휘 형식은 문자열 truefalse입니다.

JSON 리터럴정규 어휘 형식은 [RFC8259]의 JSON 형식으로 내부 표현을 직렬화한 결과이며, [JSON-LD11]의 The rdf:JSON Datatype 안의 값 공간 설명 제약을 준수합니다.

JSON 네이티브 숫자가 RDF로 역직렬화될 때, 반올림 오류가 발생할 수 있으므로 손실 없는 데이터 왕복 변환은 보장될 수 없습니다. RDF를 JSON-LD로 직렬화할 때도 유사한 반올림 오류가 발생할 수 있습니다. 또한 데이터타입이나 어휘 표현이 손실될 수 있습니다. 예를 들어 값이 2.0xsd:double은 RDF에서 JSON-LD로 변환된 뒤 다시 RDF로 변환될 때, 정규 어휘 형식의 값 2를 가진 xsd:integer가 됩니다. 실제로는 xsd:integer의 값 공간이 제한되어 있지 않기 때문에 이를 숫자로 손실 없이 변환하는 것이 불가능할 수 있다는 점을 강조하는 것이 중요합니다. JSON 명세 [RFC8259]도 숫자의 값 공간을 제한하지 않지만, 구체적인 구현은 일반적으로 제한된 값 공간을 가집니다.

손실 없는 왕복 변환을 보장하기 위해 RDF를 JSON-LD로 직렬화하는 알고리즘xsd:integer, xsd:double, 또는 xsd:boolean과 같은 데이터타입 IRI를 가진 RDF 리터럴이 해당 JSON 네이티브 값으로 변환되는지 여부를 제어하는 useNativeTypes 플래그를 지정합니다. useNativeTypes 플래그가 false로 설정되어 있으면, 모든 리터럴은 원래 문자열 표현으로 유지됩니다.

일부 버전의 PHP 네이티브 구현 같은 일부 JSON 직렬화기는 슬래시 문자를 백슬래시로 이스케이프합니다. 예를 들어 값 http://example.com/http:\/\/example.com\/로 직렬화될 수 있습니다. 이는 다른 JSON 파서가 이러한 이스케이프 문자를 이해하지 못할 수 있으므로 문제가 됩니다. JSON-LD에서 슬래시를 백슬래시로 이스케이프할 필요는 없습니다. JSON-LD 프로세서 간의 상호운용성을 돕기 위해 슬래시는 백슬래시로 이스케이프되어서는 MUST NOT 안 됩니다.

9. 애플리케이션 프로그래밍 인터페이스

이 API는 개발자가 JSON-LD 데이터를 작업하기 더 쉬운 다양한 출력 형식으로 변환할 수 있게 해 주는 깔끔한 메커니즘을 제공합니다.

JSON-LD API는 여러 지연 작업의 결과를 나타내기 위해 Promises를 사용합니다. Promises는 [ECMASCRIPT]에 정의되어 있습니다. 명세 내 일반적인 사용은 [promises-guide]에서 확인할 수 있습니다. 구현은 일반적으로 동일한 메서드, 인수, 옵션을 사용하고 동일한 결과를 반환하는 한, 각자의 네이티브 환경에 적합한 방식으로 구현할 MAY 수 있습니다.

참고

인터페이스는 [Exposed=JsonLd]로 표시되며, 이는 전역 인터페이스를 생성합니다. JSON-LD에서 WebIDL을 사용하는 것은 브라우저 내 사용에 적합하지만, 그러한 사용으로 제한되지는 않습니다.

9.1 JsonLdProcessor 인터페이스

JsonLdProcessor 인터페이스는 개발자가 JSON-LD 변환 메서드에 접근하는 데 사용하는 고수준 프로그래밍 구조입니다.

구현이 입력 매개변수를 수정하지 않는다는 점을 강조하는 것이 중요합니다. 오류가 감지되면, Promise는 적절한 code를 가진 JsonLdError로 거부되고 처리가 중지됩니다.

documentLoader 옵션이 지정되면, 원격 문서와 컨텍스트를 역참조하는 데 사용됩니다. 반환된 RemoteDocument 안의 documentUrlbase IRI로 사용되고, contextUrl은 HTTP Link Header를 직접 확인하는 대신 사용됩니다. 단순화를 위해, 이 문서의 알고리즘에서는 이를 직접 언급하지 않습니다.

WebIDL/*
 * The JsonLd interface is created to expose the JsonLdProcessor interface.
 */
[Global=JsonLd, Exposed=JsonLd]
interface JsonLd {};

[Exposed=JsonLd]
interface JsonLdProcessor {
  constructor();
  static Promise<JsonLdRecord> compact(
    JsonLdInput input,
    optional JsonLdContext context = null,
    optional JsonLdOptions options = {});
  static Promise<sequence<JsonLdRecord>> expand(
    JsonLdInput input,
    optional JsonLdOptions options = {});
  static Promise<JsonLdRecord> flatten(
    JsonLdInput input,
    optional JsonLdContext context = null,
    optional JsonLdOptions options = {});
  static Promise<sequence<JsonLdRecord>> fromRdf(
    RdfDataset input,
    optional JsonLdOptions options = {});
  static Promise<RdfDataset> toRdf(
    JsonLdInput input,
    optional JsonLdOptions options = {});
};
compact()

축약축약 알고리즘의 단계에 따라, 주어진 inputcontext를 사용하여 처리합니다:

최종 출력은 compacted output에서 파생된 입니다. compacted output배열이면, 이는 compacted output 값을 가진 (별칭이 지정되었을 수 있는) @graph 엔트리에 포함됩니다. 그렇지 않으면 compacted output 결과로 사용됩니다. contextnull이 아니면, @context 엔트리가 결과에 추가됩니다.

  1. Promise promise를 생성하고 이를 반환합니다. 다음 단계는 지연됩니다.
  2. 제공된 inputRemoteDocument이면, remote documentinput으로 초기화합니다.
  3. 그렇지 않고, 제공된 input이 원격 문서의 IRI를 나타내는 문자열이면, inputurl로 전달하고, optionsextractAllScripts 옵션을 extractAllScripts로 전달하여, LoadDocumentCallback을 사용해 이를 remote document로 기다리고 역참조합니다.
  4. expanded inputexpand() 메서드를 사용한 결과로 설정합니다. 이때 remote document를 사용하거나, remote document가 없으면 input에 대해 input을 사용하고, options를 사용하며, orderedfalse로 설정하고, extractAllScripts의 기본값은 false입니다.
  5. context base를 사용할 수 있으면 remote documentdocumentUrl로, 그렇지 않으면 optionsbase 옵션으로 설정합니다.
  6. context@context 엔트리를 가진 이면, context를 그 엔트리의 값으로 설정하고, 그렇지 않으면 context로 설정합니다.
  7. active context를 새 빈 컨텍스트active context로, contextlocal context로, context basebase URL로 전달하여 컨텍스트 처리 알고리즘의 결과로 초기화합니다.
  8. active context 안의 base IRI를, 설정되어 있으면 optionsbase 옵션으로 설정합니다. 그렇지 않고 compactToRelative 옵션이 true이면, 사용 가능한 경우 현재 처리 중인 문서의 IRI로 설정합니다. 그렇지 않으면 null로 설정합니다.
  9. compacted output축약 알고리즘을 사용한 결과로 설정합니다. 이때 active context, active property에 대해 null, elementexpanded input, 그리고 optionscompactArrays ordered 플래그를 사용합니다.
    1. compacted output이 빈 배열이면, 이를 새 으로 대체합니다.
    2. 그렇지 않고 compacted output배열이면, 이를 단일 엔트리를 가진 새 으로 대체합니다. 그 키는 @graphIRI 축약한 결과이고, 값은 compacted output입니다.
    3. contextnull이 아니었으면, @context 엔트리compacted output에 추가하고 그 값을 제공된 context로 설정합니다.
  10. compacted output내부 표현에서 JSON 직렬화로 변환하여 promisecompacted output으로 해결합니다.
input
축약을 수행할 , 의 배열, 또는 축약할 JSON-LD 문서를 참조하는 IRI입니다.
context
input축약할 때 사용할 컨텍스트입니다. 이는 , IRI, 또는 IRI로 구성된 배열을 사용하여 지정할 수 있습니다.
options
알고리즘을 구성하기 위한 옵션 집합입니다. 예를 들어, 입력 문서의 base IRI를 설정할 수 있습니다. JsonLdOptions 타입은 기본 옵션 값을 정의합니다.
expand()

확장확장 알고리즘의 단계에 따라, 주어진 input을 처리합니다:

  1. Promise promise를 생성하고 이를 반환합니다. 다음 단계는 지연됩니다.
  2. 제공된 inputRemoteDocument이면, remote documentinput으로 초기화합니다.
  3. 그렇지 않고 제공된 input이 원격 문서의 IRI를 나타내는 문자열이면, inputurl로 전달하고, optionsextractAllScripts 옵션을 extractAllScripts로 전달하여, LoadDocumentCallback을 사용해 이를 remote document로 기다리고 역참조합니다.
  4. remote documentdocument문자열이면, 이를 내부 표현으로 변환합니다. document내부 표현으로 변환할 수 없으면, loading document failed 오류를 전달하여 promise를 거부합니다.
  5. 새 빈 active context를 초기화합니다. active contextbase IRIoriginal base URL은, 사용할 수 있으면 remote documentdocumentUrl로 설정됩니다. 그렇지 않으면 optionsbase 옵션으로 설정됩니다. 설정되어 있으면, optionsbase 옵션이 base IRI를 재정의합니다.
  6. options 안의 expandContext 옵션이 설정되어 있으면, expandContextlocal context로, active contextoriginal base URLbase URL로 전달하여 컨텍스트 처리 알고리즘을 사용해 active context를 갱신합니다. expandContext@context 엔트리를 가진 이면, 그 엔트리의 값을 local context로 대신 전달합니다.
  7. remote documentcontextUrl을 가지면, contextUrllocal context로, contextUrlbase URL로 전달하여 컨텍스트 처리 알고리즘을 사용해 active context를 갱신합니다.
  8. expanded output확장 알고리즘을 사용한 결과로 설정합니다. 이때 active context, remote documentdocument 또는 remote document가 없으면 elementinput, active propertynull, 사용할 수 있으면 base URLdocumentUrl, 그렇지 않으면 optionsbase 옵션, 그리고 optionsframeExpansionordered 플래그를 전달합니다.
    참고
    remote document가 없으면, inputJsonLdRecord 또는 JsonLdRecordssequence이며, 이는 암묵적으로 이미 내부 표현입니다.
    1. expanded output@graph 엔트리만 포함하는 이면, expanded output을 그 값으로 설정합니다.
    2. expanded outputnull이면, expanded output을 빈 배열로 설정합니다.
    3. expanded output배열이 아니면, expanded output만 포함하는 배열로 설정합니다.
  9. expanded output내부 표현에서 JSON 직렬화로 변환하여 promiseexpanded output으로 해결합니다.
input
확장을 수행할 , 또는 의 배열, 또는 확장할 JSON-LD 문서를 참조하는 IRI입니다.
options
사용되는 알고리즘을 구성하기 위한 옵션 집합입니다. 예를 들어, 입력 문서의 base IRI를 설정할 수 있습니다. JsonLdOptions 타입은 기본 옵션 값을 정의합니다.
flatten()

평탄화는 주어진 input을 평탄화하고, 제공된 context를 사용하여 선택적으로 축약하며, 평탄화 알고리즘의 단계에 따릅니다:

  1. Promise promise를 생성하고 이를 반환합니다. 다음 단계는 지연됩니다.
  2. 제공된 inputRemoteDocument이면, remote documentinput으로 초기화합니다.
  3. 그렇지 않고 제공된 input이 원격 문서의 IRI를 나타내는 문자열이면, inputurl로 전달하고, optionsextractAllScripts 옵션을 extractAllScripts로 전달하여 LoadDocumentCallback을 사용해 이를 remote document로 기다리고 역참조합니다.
  4. expanded inputexpand() 메서드를 사용한 결과로 설정합니다. 이때 remote document를 사용하거나, remote document가 없으면 input에 대해 input을 사용하고, options를 사용하며 orderedfalse로 설정합니다.
  5. identifier map을 초기화합니다.
  6. flattened output평탄화 알고리즘을 사용한 결과로 설정합니다. 이때 expanded inputelement로 전달하고, optionsordered 플래그를 전달합니다.
    1. contextnull이 아니면, flattened outputcompact() 메서드를 사용한 결과로 설정합니다. 이때 input에는 flattened output을, context, 그리고 options를 사용합니다. active context 안의 base IRI를, 설정되어 있으면 optionsbase 옵션으로 설정합니다. 그렇지 않고 compactToRelative 옵션이 true이면, 사용 가능한 경우 현재 처리 중인 문서의 IRI로 설정합니다. 그렇지 않으면 null로 설정합니다.
  7. flattened output내부 표현에서 JSON 직렬화로 변환하여, 필요한 경우 promiseflattened output으로 해결합니다.
input
평탄화할 , 또는 의 배열, 또는 JSON-LD 문서를 참조하는 IRI입니다.
context
평탄화된 expanded input축약할 때 사용할 컨텍스트입니다. 이는 , IRI, 또는 IRI로 구성된 배열을 사용하여 지정할 수 있습니다. null이면, 결과는 축약되지 않고 확장된 형식으로 유지됩니다.
options
사용되는 알고리즘을 구성하기 위한 옵션 집합입니다. 예를 들어, 입력 문서의 base IRI를 설정할 수 있습니다. JsonLdOptions 타입은 기본 옵션 값을 정의합니다.
fromRdf()

RDF를 JSON-LD로 직렬화하는 알고리즘의 단계에 따라, 주어진 input확장된 형식JSON-LD 문서로 변환합니다:

참고

이 인터페이스는 toRdf() 메서드 이외에, 임의의 입력에서 RdfDataset을 생성하는 수단을 정의하지 않습니다.

  1. Promise promise를 생성하고 이를 반환합니다. 다음 단계는 지연됩니다.
  2. expanded resultdatasetoptions를 사용하여 RDF를 JSON-LD로 직렬화하는 알고리즘 메서드를 호출한 결과로 설정합니다.
  3. expanded result내부 표현에서 JSON 직렬화로 변환하여 promiseexpanded result로 해결합니다.
input
평탄화할 , 또는 의 배열, 또는 JSON-LD 문서를 참조하는 IRI입니다.
options
사용되는 알고리즘을 구성하기 위한 옵션 집합입니다. 예를 들어, 입력 문서의 base IRI를 설정할 수 있습니다. JsonLdOptions 타입은 기본 옵션 값을 정의합니다.
toRdf()

JSON-LD를 RDF로 역직렬화하는 알고리즘의 단계에 따라, 주어진 inputRdfDataset으로 변환합니다:

  1. Promise promise를 생성하고 이를 반환합니다. 다음 단계는 지연됩니다.
  2. expanded inputinputoptions를 사용하여 expand() 메서드를 사용한 결과로 설정하고, orderedfalse로 설정합니다.
  3. RdfDataset dataset을 생성합니다.
  4. node map을 생성합니다.
  5. expanded inputelement로, node map을 전달하여 노드 맵 생성 알고리즘을 호출합니다.
  6. node map, dataset, 그리고 optionsproduceGeneralizedRdf 플래그를 전달하여 JSON-LD를 RDF로 역직렬화하는 알고리즘을 호출합니다.
    참고
    빈 노드 식별자를 사용하여 프로퍼티에 레이블을 붙이는 것은 더 이상 사용되지 않으며, JSON-LD의 향후 버전에서 제거될 수 있습니다. 일반화된 RDF 데이터셋 지원도 마찬가지이므로 produceGeneralizedRdf 옵션도 제거될 수 있습니다.
  7. promisedataset으로 해결합니다.
input
평탄화할 , 또는 의 배열, 또는 JSON-LD 문서를 참조하는 IRI입니다.
options
사용되는 알고리즘을 구성하기 위한 옵션 집합입니다. 예를 들어, 입력 문서의 base IRI를 설정할 수 있습니다. JsonLdOptions 타입은 기본 옵션 값을 정의합니다.
WebIDLtypedef record<USVString, any> JsonLdRecord;

JsonLdRecord의 정의이며, JSON Object를 파싱한 결과인 임의의 맵 엔트리를 담는 데 사용됩니다.

WebIDLtypedef (JsonLdRecord or sequence<JsonLdRecord> or USVString or RemoteDocument) JsonLdInput;

JsonLdInput 인터페이스는 JsonLdRecord, JsonLdRecordssequence, 역참조하여 유효한 JSON 문서를 가져올 수 있는 IRI를 나타내는 문자열, 또는 이미 역참조된 RemoteDocument일 수 있는 입력 값을 가리키는 데 사용됩니다.

값이 JsonLdRecord 또는 JsonLdRecords의 sequence인 경우, 그 값들은 동등한 내부 표현 값으로 취급됩니다. 여기서 JsonLdRecord과 동등하며, JsonLdRecords의 sequence는 배열과 동등합니다. 맵 엔트리는 [INFRA]에서의 동등한 값으로 변환됩니다.

WebIDLtypedef (JsonLdRecord or sequence<(JsonLdRecord or USVString)> or USVString) JsonLdContext;

JsonLdContext 인터페이스는 JsonLdRecord, JsonLdRecordssequence, 또는 역참조하여 유효한 JSON 문서를 가져올 수 있는 IRI를 나타내는 문자열일 수 있는 값을 가리키는 데 사용됩니다.

값이 JsonLdRecord 또는 JsonLdRecords의 sequence인 경우, 그 값들은 동등한 내부 표현 값으로 취급됩니다. 여기서 JsonLdRecord과 동등하며, JsonLdRecords의 sequence는 배열과 동등합니다. 맵 엔트리는 [INFRA]에서의 동등한 값으로 변환됩니다.

9.2 RDF 데이터셋 인터페이스

RdfDataset 인터페이스는 RDF 데이터셋에 대한 작업을 설명하며, JsonLdProcessor 인터페이스의 fromRdf()toRdf() 메서드에서 사용됩니다. 이 인터페이스는 새 RDF 데이터셋을 구성하는 데 사용될 수 있으며, 이는 defaultGraph 속성을 통해 접근할 수 있는 기본 그래프를 가집니다.

WebIDL[Exposed=JsonLd]
interface RdfDataset {
  constructor();
  readonly attribute RdfGraph defaultGraph;
  void add(USVString graphName, RdfGraph graph);
  iterable<USVString?, RdfGraph>;
};
add()

RdfDatasetRdfGraph와 그에 연결된 그래프 이름을 추가합니다. JSON-LD를 RDF로 역직렬화하는 알고리즘에서 사용됩니다.

graphName
graph와 연결된 그래프 이름입니다. graphName올바른 형식IRI 또는 빈 노드 식별자여야 MUST 합니다.
graph
RdfDataset에 추가할 RdfGraph입니다.
defaultGraph
RDF 데이터셋과 연결된 기본 그래프에 대한 접근을 제공합니다.
iterable
반복할 값 쌍graph name-graph 쌍의 목록이며, graph name은 (기본 그래프의 경우) null, IRI, 또는 빈 노드 식별자이고, graph는 RdfGraph 인스턴스입니다.

RdfGraph 인터페이스는 JsonLdProcessor 인터페이스의 fromRdf()toRdf() 메서드에서 사용되는 RDF 그래프에 대한 작업을 설명합니다. 이 인터페이스는 새 RDF 그래프를 구성하는 데 사용될 수 있으며, 이는 0개 이상의 RdfTriple 인스턴스로 구성됩니다.

WebIDL[Exposed=JsonLd]
interface RdfGraph {
  constructor();
  void add(RdfTriple triple);
  iterable<RdfTriple>;
};
add()

RdfGraphRdfTriple을 추가합니다. JSON-LD를 RDF로 역직렬화하는 알고리즘에서 사용됩니다.

triple
RdfGraph에 추가할 RdfTriple입니다.
iterable
그래프와 연결된 RdfTriple 인스턴스에 대한 값 반복자입니다. 주어진 RdfTriple 인스턴스는 특정 RdfDataset 인스턴스 안에서 둘 이상의 그래프에 나타날 수 있음에 유의하십시오.

RdfTriple 인터페이스는 트리플을 설명합니다.

WebIDL[Exposed=JsonLd]
interface RdfTriple {
  constructor();
  readonly attribute USVString subject;
  readonly attribute USVString predicate;
  readonly attribute (USVString or RdfLiteral) _object;
};
subject
트리플주어를 나타내는 절대 IRI 또는 빈 노드 식별자입니다.
predicate
트리플술어를 나타내는 절대 IRI입니다. 일반화된 RDF 데이터셋을 나타내는 데 사용되는 경우, 빈 노드 식별자일 수도 있습니다.
참고
빈 노드 식별자를 사용하여 프로퍼티에 레이블을 붙이는 것은 더 이상 사용되지 않으며, JSON-LD의 향후 버전에서 제거될 수 있습니다. 이는 일반화된 RDF 데이터셋 지원도 마찬가지입니다.
object
트리플객체를 나타내는 절대 IRI, 빈 노드 식별자, 또는 리터럴입니다.

RdfLiteral 인터페이스는 RDF 리터럴을 설명합니다.

WebIDL[Exposed=JsonLd]
interface RdfLiteral {
  constructor();
  readonly attribute USVString value;
  readonly attribute USVString datatype;
  readonly attribute USVString? language;
};
value
리터럴의 어휘 값입니다.
datatype
리터럴데이터타입 IRI를 나타내는 절대 IRI입니다. 값이 rdf:langString이면, language가 지정되어야 MUST 합니다.
language
[BCP47]에 정의된 선택적 언어 태그입니다. 이 값이 지정되면, datatyperdf:langString이어야 MUST 합니다.

9.3 JsonLdOptions 타입

JsonLdOptions 타입은 다양한 옵션을 JsonLdProcessor 메서드에 전달하는 데 사용됩니다.

WebIDLdictionary JsonLdOptions {
  USVString?             base = null;
  boolean                compactArrays = true;
  boolean                compactToRelative = true;
  LoadDocumentCallback?  documentLoader = null;
  (JsonLdRecord? or USVString) expandContext = null;
  boolean                extractAllScripts = false;
  boolean                frameExpansion = false;
  boolean                ordered = false;
  USVString              processingMode = "json-ld-1.1";
  boolean                produceGeneralizedRdf = true;
  USVString?             rdfDirection = null;
  boolean                useNativeTypes = false;
  boolean                useRdfType = false;
};
base
문서를 확장하거나 축약할 때 사용할 base IRI입니다. 설정된 경우, 이는 입력 문서의 IRI를 재정의합니다.
compactArrays
true로 설정되면, JSON-LD 프로세서는 축약 중에 요소가 하나뿐인 배열을 해당 요소로 대체합니다. false로 설정되면, 모든 배열은 요소가 하나뿐이어도 배열로 유지됩니다.
compactToRelative
축약할 때 IRI가 base 옵션 또는 문서 위치에 상대적으로 축약되는지 여부를 결정합니다.
documentLoader
원격 문서와 컨텍스트를 가져오는 데 사용할 로더의 콜백이며, LoadDocumentCallback을 구현합니다. 지정되면 원격 문서와 컨텍스트를 가져오는 데 사용됩니다. 지정되지 않으면 프로세서의 내장 로더가 사용됩니다.
expandContext
문서를 확장할 때 활성 컨텍스트를 초기화하는 데 사용되는 컨텍스트입니다.
extractAllScripts
true로 설정되면, HTML에서 JSON-LD script 요소를 추출할 때, 특정 프래그먼트 식별자가 대상이 아닌 한, 발견된 모든 JSON-LD script 요소를 필요한 경우 배열 형식으로 추출합니다.
frameExpansion
확장 알고리즘을 위한 특수 프레임 처리 규칙을 활성화합니다.
RDF를 JSON-LD로 직렬화하는 알고리즘이 가능한 경우 JSON-LD 네이티브 타입을 값으로 사용하도록 하는 특수 규칙을 활성화합니다.
ordered
true로 설정되면, 표시된 특정 알고리즘 처리 단계가 사전순으로 정렬됩니다. false이면 처리에서 순서가 고려되지 않습니다.
processingMode
처리 모드를 설정합니다. json-ld-1.0 또는 json-ld-1.1로 설정된 경우, 구현은 이 명세에 정의된 알고리즘과 정확히 동일한 결과를 생성해야 합니다. 다른 값으로 설정된 경우, JSON-LD 프로세서는 애플리케이션별 최적화를 가능하게 하기 위해 이 명세에 정의된 알고리즘을 확장하거나 수정할 수 있습니다. 그러한 최적화의 정의는 이 명세의 범위를 벗어나며 따라서 정의되지 않습니다. 결과적으로 서로 다른 구현은 서로 다른 최적화를 구현할 수 있습니다. 개발자는 json-ld로 시작하는 모드를 정의해서는 안 됩니다. 이는 이 명세의 향후 버전을 위해 예약되어 있기 때문입니다.
produceGeneralizedRdf
true로 설정되면, JSON-LD 프로세서는 트리플 술어에 대해 빈 노드를 내보낼 수 있으며, 그렇지 않으면 생략됩니다. 일반화된 RDF 데이터셋은 [RDF11-CONCEPTS]에 정의되어 있습니다.
참고
빈 노드 식별자를 사용하여 프로퍼티에 레이블을 붙이는 것은 더 이상 사용되지 않으며, JSON-LD의 향후 버전에서 제거될 수 있습니다. 일반화된 RDF 데이터셋 지원도 마찬가지이므로, produceGeneralizedRdf 옵션도 제거될 수 있습니다.
rdfDirection
기본 방향을 포함하는 값 객체가 RDF로 또는 RDF에서 변환되는 방식을 결정합니다.
  • i18n-datatype으로 설정되면, 언어 태그(있는 경우)와 기본 방향을 모두 인코딩한 https://www.w3.org/ns/i18n# 기반의 데이터타입 IRI를 사용하여 RDF 리터럴이 생성됩니다. RDF에서 변환할 때 이 데이터타입은 디코딩되어 @language(있는 경우) 및 @direction을 포함하는 값 객체를 만듭니다.
  • compound-literal로 설정되면, 리터럴 대신 빈 노드가 내보내지며, 여기서 빈 노드는 rdf:value, rdf:direction, 그리고 rdf:language(있는 경우) 프로퍼티의 주어입니다. RDF에서 변환할 때 이 객체는 디코딩되어 @language(있는 경우) 및 @direction을 포함하는 값 객체를 만듭니다.
useNativeTypes
RDF를 JSON-LD로 직렬화하는 알고리즘값 객체 안에서 네이티브 JSON 값을 사용하게 하여, 명시적인 @type의 필요성을 피합니다.
useRdfType
RDF를 JSON-LD로 직렬화하는 알고리즘을 위한 특수 규칙을 활성화하여, rdf:type 프로퍼티가 @type을 사용하는 대신 출력에서 IRI로 유지되게 합니다.

9.4 원격 문서 및 컨텍스트 검색

API 구현의 사용자는 원격 문서와 컨텍스트가 검색되는 방식을 제어하기 위해 콜백을 활용할 수 있습니다. 이 절에서는 해당 콜백의 매개변수와 검색된 컨텍스트를 반환하는 데 사용되는 데이터 구조를 자세히 설명합니다.

9.4.1 LoadDocumentCallback

LoadDocumentCallback은 원격 문서와 컨텍스트를 검색하는 데 사용되기 위해 사용자 지정 문서 로더가 구현해야 하는 콜백을 정의합니다. 이 콜백은 RemoteDocument로 해결되는 Promise를 반환합니다. 실패 시, Promise는 적절한 오류 code를 가진 JsonLdError로 거부됩니다.

WebIDLcallback LoadDocumentCallback = Promise<RemoteDocument> (
  USVString url,
  optional LoadDocumentOptions? options
);
url
로드할 원격 문서 또는 컨텍스트의 URL입니다.
options
콜백의 동작을 결정하기 위한 옵션 집합입니다. § 9.4.2 LoadDocumentOptions를 참조하십시오.

다음 알고리즘은 기본 콜백을 설명하고 콜백 구현에 요구 사항을 부여합니다.

  1. Promise promise를 생성하고 이를 반환합니다. 다음 단계는 지연됩니다.
  2. url로 식별되는 리소스에서 가져온 본문, 또는 url과 연결된 리소스를 다른 방식으로 찾아 얻은 본문으로 document를 설정합니다. 원격 문서를 요청할 때 요청은 Content-Type application/ld+json을 우선하고, 그 다음 application/json을 선호해야 MUST 합니다.

    requestProfile이 설정되어 있으면, 이는 application/ld+json의 profile로 추가되어야 MUST 합니다.

    프로세서는 [RFC6839]에 정의된 +json 접미사를 사용하는 다른 미디어 타입을 포함할 MAY 수 있습니다.

  3. 리디렉션을 고려하여 가져온 리소스의 위치로 documentUrl을 설정합니다 ([cooluris]에서 논의된 HTTP 상태 303 "See Other" 리디렉션은 제외).
  4. 가져온 리소스의 Content-Typeapplication/json도 아니고, [RFC6839]에 정의된 +json 접미사를 가진 어떤 미디어 타입도 아니며, 응답에 application/ld+json 타입과 함께 alternate 링크 관계를 사용하는 HTTP Link Header [RFC8288]가 있으면, 이전 url에 상대적인 관련 hrefurl을 설정하고 2단계부터 알고리즘을 다시 시작합니다.
  5. 가져온 리소스의 Content-Typeapplication/ld+json을 제외한 application/json이거나 [RFC6839]에 정의된 +json 접미사를 가진 미디어 타입이고, 응답에 http://www.w3.org/ns/json-ld#context 링크 관계를 사용하는 HTTP Link Header [RFC8288]가 있으면, 관련 hrefcontextUrl을 설정합니다.

    http://www.w3.org/ns/json-ld#context 링크 관계를 사용하는 여러 HTTP Link Header가 발견되면, promisecodemultiple context link headers로 설정된 JsonLdError로 거부되고, 처리가 종료됩니다.

    프로세서는 document내부 표현으로 변환할 MAY 수 있습니다.

    참고

    HTTP Link Header는 application/ld+json, text/html, 또는 application/xhtml+xml로 제공되는 문서에 대해 무시됩니다.

  6. 그렇지 않으면, 가져온 문서의 Content-Typeapplication/json, application/ld+json, 또는 [RFC6839]에 정의된 +json 접미사를 사용하는 다른 미디어 타입 중 어느 것도 아닙니다. loading document failed 오류를 전달하여 promise를 거부합니다.
  7. urldocumentUrl로, documentdocument로, 반환된 Content-Type(매개변수 제외)을 contentType으로, 반환된 profile 매개변수가 있으면 그것을, 없으면 nullprofile로, 그리고 contextUrl 또는 nullcontextUrl로 사용하여 새 RemoteDocument remote document를 생성합니다.
  8. promiseremote document로 해결합니다.
참고

documentLoader 옵션을 통해 설정된 사용자 지정 LoadDocumentCallback은 잘 알려진 컨텍스트 문서의 로컬 캐시를 유지하거나 애플리케이션별 URL 프로토콜을 구현하는 데 사용될 수 있습니다.

9.4.2 LoadDocumentOptions

LoadDocumentOptions 타입은 다양한 옵션을 LoadDocumentCallback에 전달하는 데 사용됩니다.

WebIDLdictionary LoadDocumentOptions {
  boolean  extractAllScripts = false;
  USVString profile = null;
  (USVString or sequence<USVString>) requestProfile = null;
};
extractAllScripts
true로 설정되면, HTML에서 JSON-LD script 요소를 추출할 때, 특정 프래그먼트 식별자가 대상이 아닌 한, 발견된 모든 JSON-LD script 요소를 필요한 경우 배열 형식으로 추출합니다.
profile
결과 contentTypetext/html 또는 application/xhtml+xml이면, 이 옵션은 JSON-LD script 요소를 선택하는 데 사용할 profile을 결정합니다.
requestProfile
요청에서 profile 매개변수로 사용할 하나 이상의 IRI입니다. ([JSON-LD11]의 IANA 고려사항을 참조하십시오.)

9.4.3 RemoteDocument

RemoteDocument 타입은 LoadDocumentCallback이 원격 문서 또는 컨텍스트에 대한 정보를 반환하는 데 사용됩니다.

WebIDL[Exposed=JsonLd]
interface RemoteDocument {
  constructor();
  readonly attribute USVString contentType;
  readonly attribute USVString contextUrl;
  attribute any document;
  readonly attribute USVString documentUrl;
  readonly attribute USVString profile;
};
contentType
로드된 문서의 Content-Type이며, 선택적 매개변수는 제외합니다.
contextUrl
사용 가능한 경우, 응답에서 http://www.w3.org/ns/json-ld#context 링크 관계를 사용하는 HTTP Link Header [RFC8288]의 값입니다. 응답의 Content-Typeapplication/ld+json이면, HTTP Link Header는 무시됩니다. http://www.w3.org/ns/json-ld#context 링크 관계를 사용하는 여러 HTTP Link Header가 발견되면, LoadDocumentCallbackPromisecodemultiple context link headers로 설정된 JsonLdError로 거부됩니다.
document
검색된 문서입니다. 이는 원시 페이로드이거나 이미 파싱된 문서일 수 있습니다.
documentUrl
로드된 문서의 최종 URL입니다. 이는 HTTP 리디렉션을 올바르게 처리하는 데 중요합니다.
profile
원래의 contentType의 일부로 검색된 모든 profile 매개변수의 값입니다.

9.5 HTML 콘텐츠 알고리즘

참고

이 절은 HTML script 추출을 지원하는 documentLoader에서 사용할 수 있는 선택적 기능을 설명합니다.

documentLoader의 구현은 HTML [HTML] 문서 안에 포함된 script 요소에서 JSON-LD 추출을 지원할 MAY 수 있습니다. 이 절은 그러한 프로세서의 규범적 동작을 설명합니다. 그러한 프로세서는 HTML script 추출을 지원합니다.

9.5.1 HTML 처리

이 절은 HTML에서 JSON-LD 추출을 지원하기 위해 LoadDocumentCallback에 지정된 알고리즘의 확장을 설명합니다.

2단계는 다음을 추가하도록 갱신됩니다: HTML script 추출을 지원하는 프로세서는 requestProfilehttp://www.w3.org/ns/json-ld#context인 경우를 제외하고, 어떤 선호 수준에서든 text/html을 포함해야 MUST 하며, 어떤 선호 수준에서든 application/xhtml+xml을 포함할 MAY 수 있습니다.

5단계 뒤에 다음 처리 단계를 추가합니다: 그렇지 않고, 검색된 리소스의 Content-Typetext/html 또는 application/xhtml+xml 중 하나이면:

  1. [HTML]에 정의된 대로, 기존 documentUrl을 문서의 URL로 사용하여 urlDocument Base URLdocumentUrl을 설정합니다.
  2. url 매개변수가 프래그먼트 식별자를 포함하면, 퍼센트 인코딩 시퀀스를 디코딩한 뒤, 그 프래그먼트 식별자와 일치하는 id 속성을 가진 document 안의 script 요소textContentsource를 설정합니다.

    그러한 요소를 찾을 수 없거나, 찾은 요소가 JSON-LD script 요소가 아니면, promisecodeloading document failed로 설정된 JsonLdError로 거부되고, 처리가 종료됩니다.

  3. 그렇지 않고, profile 옵션이 지정되어 있으면, 발견되는 경우 application/ld+jsontype 속성profile 옵션의 값을 함께 가진 document 안의 첫 번째 script 요소textContent를 변환한 결과로 source를 설정합니다.
  4. source가 아직 정의되지 않았고 extractAllScripts 옵션이 존재하지 않거나 false이면, document 안의 첫 번째 JSON-LD script 요소textContentsource를 설정합니다.

    그러한 요소를 찾을 수 없거나, 찾은 요소가 JSON-LD script 요소가 아니면, promisecodeloading document failed로 설정된 JsonLdError로 거부되고, 처리가 종료됩니다.

  5. source가 정의되어 있으면, source를 사용하여 Script 콘텐츠 추출 알고리즘의 결과로 document를 설정합니다. 오류가 감지되면 결과에서 설정한 code를 가진 JsonLdErrorpromise를 거부하고 처리를 종료합니다.
  6. 그렇지 않으면, source는 정의되지 않았습니다.
    1. extractAllScripts 옵션이 존재하지 않거나 false이면, promisecodeloading document failed로 설정된 JsonLdError로 거부되고, 처리가 종료됩니다.
    2. 그렇지 않으면, extractAllScripts 옵션은 true입니다. document를 새 빈 배열로 설정합니다. input 안의 각 JSON-LD script 요소에 대해:
      1. 그 요소의 textContentsource를 설정합니다.
      2. source를 사용하여 Script 콘텐츠 추출 알고리즘의 결과로 script content를 설정합니다. 오류가 감지되면 결과에서 설정한 code를 가진 JsonLdErrorpromise를 거부하고 처리를 종료합니다.
      3. script content배열이면, 이를 document의 끝에 병합합니다.
      4. 그렇지 않으면, script contentdocument에 추가합니다.

9.5.2 Script 콘텐츠 추출 알고리즘

이 알고리즘은 JSON-LD script 요소의 텍스트 콘텐츠를 또는 배열로 추출합니다. JSON-LD script 요소는 HTML [HTML] 문서 안의 script 요소로, type 속성application/ld+json으로 설정된 것입니다.

이 알고리즘은 단일 필수 입력 변수 source를 받습니다. 이는 HTML script 요소textContent입니다.

  1. source가 유효한 JSON 문서가 아니면, invalid script element가 감지되었으며, 처리가 중단됩니다.
  2. source내부 표현으로 변환한 결과를 반환합니다.

9.6 오류 처리

이 절은 오류 처리를 위해 JSON-LD API 안에서 사용되는 데이터타입 정의를 설명합니다.

9.6.1 JsonLdError

JsonLdError 타입은 처리 오류를 보고하는 데 사용됩니다.

WebIDLdictionary JsonLdError {
  JsonLdErrorCode code;
  USVString?      message = null;
};
code
이 문서의 다양한 알고리즘에서 설명되는 특정 오류 타입을 나타내는 문자열입니다.
message
추가 디버깅 정보를 포함하는 선택적 오류 메시지입니다. 오류 메시지의 구체적 내용은 이 명세의 범위를 벗어납니다.

9.6.2 JsonLdErrorCode

JsonLdErrorCode는 유효한 JSON-LD 오류 코드의 모음을 나타냅니다.

WebIDLenum JsonLdErrorCode {
    "colliding keywords",
    "conflicting indexes",
    "context overflow",
    "cyclic IRI mapping",
    "invalid @id value",
    "invalid @import value",
    "invalid @included value",
    "invalid @index value",
    "invalid @nest value",
    "invalid @prefix value",
    "invalid @propagate value",
    "invalid @protected value",
    "invalid @reverse value",
    "invalid @version value",
    "invalid base direction",
    "invalid base IRI",
    "invalid container mapping",
    "invalid context entry",
    "invalid context nullification",
    "invalid default language",
    "invalid IRI mapping",
    "invalid JSON literal",
    "invalid keyword alias",
    "invalid language map value",
    "invalid language mapping",
    "invalid language-tagged string",
    "invalid language-tagged value",
    "invalid local context",
    "invalid remote context",
    "invalid reverse property map",
    "invalid reverse property value",
    "invalid reverse property",
    "invalid scoped context",
    "invalid script element",
    "invalid set or list object",
    "invalid term definition",
    "invalid type mapping",
    "invalid type value",
    "invalid typed value",
    "invalid value object value",
    "invalid value object",
    "invalid vocab mapping",
    "IRI confused with prefix",
    "keyword redefinition",
    "loading document failed",
    "loading remote context failed",
    "multiple context link headers",
    "processing mode conflict",
    "protected term redefinition"
};
colliding keywords
동일한 키워드로 확장되는 두 프로퍼티가 감지되었습니다. 이는 키워드와 그 별칭이 동시에 사용되는 경우 발생할 수 있습니다.
conflicting indexes
동일한 노드에 대해 여러 충돌하는 인덱스가 발견되었습니다.
context overflow
@context URL의 최대 개수를 초과했습니다.
순환 IRI 매핑
IRI 매핑에서 순환이 감지되었습니다.
invalid @id value
값이 문자열이 아닌 @id 엔트리가 발견되었습니다.
invalid @import value
@import에 대한 잘못된 값이 발견되었습니다.
invalid @included value
포함 블록에 잘못된 값이 포함되어 있습니다.
invalid @index value
값이 문자열이 아닌 @index 엔트리가 발견되었습니다.
invalid @nest value
@nest에 대한 잘못된 값이 발견되었습니다.
invalid @prefix value
@prefix에 대한 잘못된 값이 발견되었습니다.
invalid @propagate value
@propagate에 대한 잘못된 값이 발견되었습니다.
invalid @protected value
@protected에 대한 잘못된 값이 발견되었습니다.
invalid @reverse value
@reverse 엔트리에 대한 잘못된 값이 감지되었습니다. 즉, 값이 이 아니었습니다.
invalid @version value
컨텍스트에서 @version 엔트리가 범위를 벗어난 값과 함께 사용되었습니다.
invalid base direction
@direction의 값이 "ltr", "rtl", 또는 null이 아니므로 잘못되었습니다.
invalid base IRI
잘못된 base IRI가 감지되었습니다. 즉, IRI도 아니고 null도 아닙니다.
invalid container mapping
값이 다음 문자열 중 하나가 아닌 @container 엔트리가 발견되었습니다: @list, @set, @language, @index, @id, @graph, 또는 @type.
invalid context entry
컨텍스트 안의 엔트리가 처리 모드 비호환성으로 인해 잘못되었습니다.
invalid context nullification
보호된 용어 정의를 포함하는 컨텍스트를 null로 만들려는 시도가 있었습니다.
invalid default language
기본 언어의 값이 문자열 또는 null이 아니므로 잘못되었습니다.
invalid IRI mapping
로컬 컨텍스트가 잘못되었거나 누락된 IRI 매핑을 가진 용어를 포함합니다.
invalid JSON literal
잘못된 JSON 리터럴이 감지되었습니다.
invalid keyword alias
잘못된 키워드 별칭 정의가 발견되었습니다.
invalid language map value
언어 맵 안의 잘못된 값이 감지되었습니다. 이는 문자열이거나 문자열배열이어야 MUST 합니다.
invalid language mapping
용어 정의 안의 @language 엔트리가 발견되었는데, 그 값이 문자열도 아니고 null도 아니므로 잘못되었습니다.
invalid language-tagged string
잘못된 언어 값을 가진 언어 태그가 붙은 문자열이 감지되었습니다.
invalid language-tagged value
연결된 언어 태그를 가진 숫자, true, 또는 false가 감지되었습니다.
invalid local context
잘못된 로컬 컨텍스트가 감지되었습니다.
invalid remote context
참조된 원격 컨텍스트에 대해 유효한 컨텍스트 문서를 찾을 수 없습니다.
invalid reverse property
잘못된 역방향 프로퍼티 정의가 감지되었습니다.
invalid reverse property map
잘못된 역방향 프로퍼티 맵이 감지되었습니다. 역방향 프로퍼티 맵에서는 @context를 제외한 키워드가 허용되지 않습니다.
invalid reverse property value
역방향 프로퍼티에 대한 잘못된 값이 감지되었습니다. 역방향 프로퍼티의 값은 노드 객체여야 합니다.
invalid scoped context
용어 정의 안에 정의된 로컬 컨텍스트가 잘못되었습니다.
invalid script element
프래그먼트 식별자의 대상인 HTML 입력 안의 script 요소가 적절한 type 속성을 가지지 않습니다.
invalid set or list object
허용되지 않는 엔트리를 가진 집합 객체 또는 목록 객체가 감지되었습니다.
invalid term definition
잘못된 용어 정의가 감지되었습니다.
invalid type mapping
용어 정의 안의 @type 엔트리가 발견되었는데, 그 값이 IRI로 확장될 수 없었습니다.
invalid type value
@type 엔트리에 대한 잘못된 값이 감지되었습니다. 즉, 값이 문자열도 아니고 문자열배열도 아니었습니다.
invalid typed value
잘못된 타입을 가진 타입이 지정된 값이 감지되었습니다.
invalid value object
허용되지 않는 엔트리를 가진 값 객체가 감지되었습니다.
invalid value object value
값 객체@value 엔트리에 대한 잘못된 값이 감지되었습니다. 즉, 스칼라도 아니고 null도 아닙니다.
invalid vocab mapping
잘못된 어휘 매핑이 감지되었습니다. 즉, IRI도 아니고 null도 아닙니다.
IRI confused with prefix
IRI를 축약하면 compact IRI와 혼동될 수 있는 IRI가 되는 경우입니다 (그 IRI 스킴용어 정의와 일치하고 IRI authority가 없기 때문입니다).
keyword redefinition
키워드 재정의가 감지되었습니다.
loading document failed
문서를 로드하거나 JSON으로 파싱할 수 없었습니다.
loading remote context failed
원격 컨텍스트를 로드하는 중 문제가 발생했습니다.
multiple context link headers
http://www.w3.org/ns/json-ld#context 링크 관계를 사용하는 여러 HTTP Link Header [RFC8288]가 감지되었습니다.
processing mode conflict
이전에 지정된 버전과 호환되지 않는 방식으로 처리 모드를 변경하려는 시도가 있었습니다.
protected term redefinition
보호된 용어를 재정의하려는 시도가 있었습니다.

10. 보안 고려사항

[JSON-LD11]의 보안 고려사항을 참조하십시오.

11. 개인정보 고려사항

[JSON-LD11]의 개인정보 고려사항을 참조하십시오.

12. 국제화 고려사항

[JSON-LD11]의 국제화 고려사항을 참조하십시오.

A. IDL 색인

이 절은 비규범입니다.

WebIDL/*
 * The JsonLd interface is created to expose the JsonLdProcessor interface.
 */
[Global=JsonLd, Exposed=JsonLd]
interface JsonLd {};

[Exposed=JsonLd]
interface JsonLdProcessor {
  constructor();
  static Promise<JsonLdRecord> compact(
    JsonLdInput input,
    optional JsonLdContext context = null,
    optional JsonLdOptions options = {});
  static Promise<sequence<JsonLdRecord>> expand(
    JsonLdInput input,
    optional JsonLdOptions options = {});
  static Promise<JsonLdRecord> flatten(
    JsonLdInput input,
    optional JsonLdContext context = null,
    optional JsonLdOptions options = {});
  static Promise<sequence<JsonLdRecord>> fromRdf(
    RdfDataset input,
    optional JsonLdOptions options = {});
  static Promise<RdfDataset> toRdf(
    JsonLdInput input,
    optional JsonLdOptions options = {});
};

typedef record<USVString, any> JsonLdRecord;

typedef (JsonLdRecord or sequence<JsonLdRecord> or USVString or RemoteDocument) JsonLdInput;

typedef (JsonLdRecord or sequence<(JsonLdRecord or USVString)> or USVString) JsonLdContext;

[Exposed=JsonLd]
interface RdfDataset {
  constructor();
  readonly attribute RdfGraph defaultGraph;
  void add(USVString graphName, RdfGraph graph);
  iterable<USVString?, RdfGraph>;
};

[Exposed=JsonLd]
interface RdfGraph {
  constructor();
  void add(RdfTriple triple);
  iterable<RdfTriple>;
};

[Exposed=JsonLd]
interface RdfTriple {
  constructor();
  readonly attribute USVString subject;
  readonly attribute USVString predicate;
  readonly attribute (USVString or RdfLiteral) _object;
};

[Exposed=JsonLd]
interface RdfLiteral {
  constructor();
  readonly attribute USVString value;
  readonly attribute USVString datatype;
  readonly attribute USVString? language;
};

dictionary JsonLdOptions {
  USVString?             base = null;
  boolean                compactArrays = true;
  boolean                compactToRelative = true;
  LoadDocumentCallback?  documentLoader = null;
  (JsonLdRecord? or USVString) expandContext = null;
  boolean                extractAllScripts = false;
  boolean                frameExpansion = false;
  boolean                ordered = false;
  USVString              processingMode = "json-ld-1.1";
  boolean                produceGeneralizedRdf = true;
  USVString?             rdfDirection = null;
  boolean                useNativeTypes = false;
  boolean                useRdfType = false;
};

callback LoadDocumentCallback = Promise<RemoteDocument> (
  USVString url,
  optional LoadDocumentOptions? options
);

dictionary LoadDocumentOptions {
  boolean  extractAllScripts = false;
  USVString profile = null;
  (USVString or sequence<USVString>) requestProfile = null;
};

[Exposed=JsonLd]
interface RemoteDocument {
  constructor();
  readonly attribute USVString contentType;
  readonly attribute USVString contextUrl;
  attribute any document;
  readonly attribute USVString documentUrl;
  readonly attribute USVString profile;
};

dictionary JsonLdError {
  JsonLdErrorCode code;
  USVString?      message = null;
};

enum JsonLdErrorCode {
    "colliding keywords",
    "conflicting indexes",
    "context overflow",
    "cyclic IRI mapping",
    "invalid @id value",
    "invalid @import value",
    "invalid @included value",
    "invalid @index value",
    "invalid @nest value",
    "invalid @prefix value",
    "invalid @propagate value",
    "invalid @protected value",
    "invalid @reverse value",
    "invalid @version value",
    "invalid base direction",
    "invalid base IRI",
    "invalid container mapping",
    "invalid context entry",
    "invalid context nullification",
    "invalid default language",
    "invalid IRI mapping",
    "invalid JSON literal",
    "invalid keyword alias",
    "invalid language map value",
    "invalid language mapping",
    "invalid language-tagged string",
    "invalid language-tagged value",
    "invalid local context",
    "invalid remote context",
    "invalid reverse property map",
    "invalid reverse property value",
    "invalid reverse property",
    "invalid scoped context",
    "invalid script element",
    "invalid set or list object",
    "invalid term definition",
    "invalid type mapping",
    "invalid type value",
    "invalid typed value",
    "invalid value object value",
    "invalid value object",
    "invalid vocab mapping",
    "IRI confused with prefix",
    "keyword redefinition",
    "loading document failed",
    "loading remote context failed",
    "multiple context link headers",
    "processing mode conflict",
    "protected term redefinition"
};

B. 열린 이슈

이 절은 비규범입니다.

다음은 발행 시점에 열려 있던 이슈 목록입니다.

Issue 76: 더 간결한 @prefix defer-future-version

더 간결한 @prefix.

Issue 94: 확장 개념인 "key's term definition"은 compact IRI 키에서 불명확함 defer-future-version

확장 개념인 "key's term definition"은 compact IRI 키에서 불명확합니다.

Issue 166: RDF/JS Dataset 인터페이스와의 관계 defer-future-version

RDF/JS Dataset 인터페이스와의 관계.

Issue 380: 확장은 중첩 프로퍼티의 property-scoped context를 고려하지 않음 defer-future-versionspec:editorialtest:needs testswr:spec-updated-partial

확장은 중첩 프로퍼티의 property-scoped context를 고려하지 않습니다.

Issue 391: 재귀적으로 중첩된 프로퍼티와 축약 defer-future-version

재귀적으로 중첩된 프로퍼티와 축약.

상대 IRI 축약.

C. 2014년 1월 16일 1.0 권고 이후 변경사항

이 절은 비규범입니다.

추가로, § D. JSON-LD Community Group 최종 보고서 이후 변경사항을 참조하십시오.

D. JSON-LD Community Group 최종 보고서 이후 변경사항

이 절은 비규범입니다.

E. 2019년 12월 12일 후보 릴리스 이후 변경사항

이 절은 비규범입니다.

참고

모든 변경사항은 편집상의 변경이며, API의 관찰 가능한 동작이나 예상 테스트 결과에 영향을 주지 않습니다.

F. 2020년 3월 5일 후보 릴리스 이후 변경사항

이 절은 비규범입니다.

참고

모든 변경사항은 편집상의 변경이며, API의 관찰 가능한 동작이나 예상 테스트 결과에 영향을 주지 않습니다.

G. 2020년 5월 7일 제안 권고 릴리스 이후 변경사항

이 절은 비규범입니다.

H. 감사의 말

이 절은 비규범입니다.

편집자들은 이 명세의 작성과 편집에 중요한 기여를 한 다음 개인들에게 특별히 감사드립니다:

또한 다음 사람들은 발행 당시 Working Group의 구성원이었습니다:

메일링 리스트와 주간 전화회의에서 많은 기술적 이슈를 함께 해결한 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., and Victor Charpenay.

I. 참고문헌

I.1 규범 참고문헌

[BCP47]
Tags for Identifying Languages. A. Phillips; M. Davis. IETF. September 2009. IETF Best Current Practice. URL: https://tools.ietf.org/html/bcp47
[DOM]
DOM Standard. Anne van Kesteren. WHATWG. Living Standard. URL: https://dom.spec.whatwg.org/
[ECMASCRIPT]
ECMAScript Language Specification. Ecma International. URL: https://tc39.es/ecma262/
[HTML]
HTML Standard. Anne van Kesteren; Domenic Denicola; Ian Hickson; Philip Jägenstedt; Simon Pieters. WHATWG. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[IEEE-754-2008]
IEEE 754-2008 Standard for Floating-Point Arithmetic. Institute of Electrical and Electronics Engineers. 2008. URL: http://standards.ieee.org/findstds/standard/754-2008.html
[INFRA]
Infra Standard. Anne van Kesteren; Domenic Denicola. WHATWG. Living Standard. URL: https://infra.spec.whatwg.org/
[JSON-LD10]
JSON-LD 1.0. Manu Sporny; Gregg Kellogg; Marcus Langhaler. W3C. 16 January 2014. W3C Recommendation. URL: https://www.w3.org/TR/2014/REC-json-ld-20140116/
[JSON-LD11]
JSON-LD 1.1. Gregg Kellogg; Pierre-Antoine Champin; Dave Longley. W3C. 7 May 2020. W3C Proposed Recommendation. URL: https://www.w3.org/TR/json-ld11/
[JSON-LD11-FRAMING]
JSON-LD 1.1 Framing. Dave Longley; Gregg Kellogg; Pierre-Antoine Champin. W3C. 7 May 2020. W3C Proposed Recommendation. URL: https://www.w3.org/TR/json-ld11-framing/
[LINKED-DATA]
Linked Data Design Issues. Tim Berners-Lee. W3C. 27 July 2006. W3C-Internal Document. URL: https://www.w3.org/DesignIssues/LinkedData.html
[promises-guide]
Writing Promise-Using Specifications. Domenic Denicola. W3C. 9 November 2018. TAG Finding. URL: https://www.w3.org/2001/tag/doc/promises-guide
[RDF-SCHEMA]
RDF Schema 1.1. Dan Brickley; Ramanathan Guha. W3C. 25 February 2014. W3C Recommendation. URL: https://www.w3.org/TR/rdf-schema/
[RDF11-CONCEPTS]
RDF 1.1 Concepts and Abstract Syntax. Richard Cyganiak; David Wood; Markus Lanthaler. W3C. 25 February 2014. W3C Recommendation. URL: https://www.w3.org/TR/rdf11-concepts/
[RDF11-MT]
RDF 1.1 Semantics. Patrick Hayes; Peter Patel-Schneider. W3C. 25 February 2014. W3C Recommendation. URL: https://www.w3.org/TR/rdf11-mt/
[RFC2045]
Multipurpose Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies. N. Freed; N. Borenstein. IETF. November 1996. Draft Standard. URL: https://tools.ietf.org/html/rfc2045
[RFC2119]
Key words for use in RFCs to Indicate Requirement Levels. S. Bradner. IETF. March 1997. Best Current Practice. URL: https://tools.ietf.org/html/rfc2119
[RFC3986]
Uniform Resource Identifier (URI): Generic Syntax. T. Berners-Lee; R. Fielding; L. Masinter. IETF. January 2005. Internet Standard. URL: https://tools.ietf.org/html/rfc3986
[RFC3987]
Internationalized Resource Identifiers (IRIs). M. Duerst; M. Suignard. IETF. January 2005. Proposed Standard. URL: https://tools.ietf.org/html/rfc3987
[RFC5234]
Augmented BNF for Syntax Specifications: ABNF. D. Crocker, Ed.; P. Overell. IETF. January 2008. Internet Standard. URL: https://tools.ietf.org/html/rfc5234
[RFC6839]
Additional Media Type Structured Syntax Suffixes. T. Hansen; A. Melnikov. IETF. January 2013. Informational. URL: https://tools.ietf.org/html/rfc6839
[RFC8174]
Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words. B. Leiba. IETF. May 2017. Best Current Practice. URL: https://tools.ietf.org/html/rfc8174
[RFC8259]
The JavaScript Object Notation (JSON) Data Interchange Format. T. Bray, Ed.. IETF. December 2017. Internet Standard. URL: https://tools.ietf.org/html/rfc8259
[RFC8288]
Web Linking. M. Nottingham. October 2017. Proposed Standard. URL: https://tools.ietf.org/html/rfc8288
[Turtle]
RDF 1.1 Turtle. Eric Prud'hommeaux; Gavin Carothers. W3C. 25 February 2014. W3C Recommendation. URL: https://www.w3.org/TR/turtle/
[WEBIDL]
Web IDL. Boris Zbarsky. W3C. 15 December 2016. W3C Editor's Draft. URL: https://heycam.github.io/webidl/
[XMLSCHEMA11-2]
W3C XML Schema Definition Language (XSD) 1.1 Part 2: Datatypes. David Peterson; Sandy Gao; Ashok Malhotra; Michael Sperberg-McQueen; Henry Thompson; Paul V. Biron et al. W3C. 5 April 2012. W3C Recommendation. URL: https://www.w3.org/TR/xmlschema11-2/

I.2 참고 정보문헌

[cooluris]
Cool URIs for the Semantic Web. Leo Sauermann; Richard Cyganiak. W3C. 3 December 2008. W3C Note. URL: https://www.w3.org/TR/cooluris/
[JSON-LD10-API]
JSON-LD 1.0 Processing Algorithms And API. Marcus Langhaler; Gregg Kellogg; Manu Sporny. W3C. 16 January 2014. W3C Recommendation. URL: https://www.w3.org/TR/2014/REC-json-ld-api-20140116/
[RFC8785]
JSON Canonicalization Scheme (JCS). A. Rundgren; B. Jordan; S. Erdtman. Network Working Group. June 2020. Informational. URL: https://www.rfc-editor.org/rfc/rfc8785