JSON-LD 1.1

연결된 데이터를 위한 JSON 기반 직렬화

W3C 권고안

이 버전:
https://www.w3.org/TR/2020/REC-json-ld11-20200716/
최신 공개 버전:
https://www.w3.org/TR/json-ld11/
최신 편집자 초안:
https://w3c.github.io/json-ld-syntax/
테스트 스위트:
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-20200507/
이전 권고안:
https://www.w3.org/TR/2014/REC-json-ld-20140116/
편집자:
Gregg Kellogg (v1.0 and v1.1)
Pierre-Antoine Champin (LIRIS - Université de Lyon) (v1.1)
Dave Longley (Digital Bazaar) (v1.1)
이전 편집자:
Manu Sporny (Digital Bazaar) (v1.0)
Markus Lanthaler (Google) (v1.0)
저자:
Manu Sporny (Digital Bazaar) (v1.0)
Dave Longley (Digital Bazaar) (v1.0 and v1.1)
Gregg Kellogg (v1.0 and v1.1)
Markus Lanthaler (Google) (v1.0)
Pierre-Antoine Champin (LIRIS - Université de Lyon) (v1.1)
Niklas Lindström (v1.0)
참여:
GitHub w3c/json-ld-syntax
버그 신고
커밋 기록
풀 리퀘스트

출판 이후 보고된 오류나 문제를 확인하려면 정오표를 확인하십시오.

또한 번역본을 참조하십시오.

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


요약

JSON은 유용한 데이터 직렬화 및 메시징 형식입니다. 이 사양은 JSON-LD 1.1을 정의하며, 이는 Linked Data를 직렬화하기 위한 JSON 기반 형식입니다. 구문은 이미 JSON을 사용하는 배포된 시스템에 쉽게 통합되도록 설계되었으며, JSON에서 JSON-LD로의 원활한 업그레이드 경로를 제공합니다. 이는 주로 웹 기반 프로그래밍 환경에서 Linked Data를 사용하는 방법, 상호 운용 가능한 웹 서비스를 구축하고, JSON 기반 저장 엔진에 Linked Data를 저장하기 위한 것입니다.

이 사양은 JSON-LD 1.0 [JSON-LD10] 에 정의된 기능의 상위 집합을 설명하며, 명시된 경우를 제외하고, 이 사양의 1.0 버전을 사용하여 생성된 문서는 JSON-LD 1.1과 호환됩니다.

이 문서의 상태

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

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

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

이 사양은 JSON-LD 1.0 [JSON-LD10] 사양을 대체하기 위한 것입니다.

이 문서는 JSON-LD 작업 그룹 에서 권고안으로 출판되었습니다.

GitHub 이슈가 이 사양에 대한 논의에 선호됩니다. 또는 메일링 리스트로 댓글을 보낼 수 있습니다. 다음으로 보내주세요 public-json-ld-wg@w3.org (보관).

작업 그룹의 구현 보고서를 확인하십시오.

이 문서는 W3C 회원, 소프트웨어 개발자, 다른 W3C 그룹 및 관심 있는 당사자에 의해 검토되었으며, 감독자에 의해 W3C 권고안으로 승인되었습니다. 이는 안정된 문서이며, 참조 자료로 사용되거나 다른 문서에서 인용될 수 있습니다. W3C의 역할은 사양에 주의를 기울이고, 웹의 기능성과 상호 운용성을 향상시키기 위해 광범위한 배포를 촉진하는 것입니다.

이 문서는 W3C 특허 정책에 따라 운영되는 그룹에 의해 생산되었습니다. W3C그룹의 결과물과 관련된 특허 공개 목록 을 유지합니다; 그 페이지에는 또한 특허 공개 지침이 포함됩니다. 실제 지식이 있는 개인 필수 청구항을 포함한다고 믿는 특허의 경우, 개인은 W3C 특허 정책의 섹션 6에 따라 정보를 공개해야 합니다.

이 문서는 2019년 3월 1일 W3C 프로세스 문서에 따라 관리됩니다.

문서 집합

이 문서는 JSON-LD 작업 그룹에서 생산된 세 개의 JSON-LD 1.1 권고안 중 하나입니다:

1. 소개

이 섹션은 비규범적입니다.

Linked Data [LINKED-DATA]는 서로 다른 문서와 웹사이트에 걸쳐 표준 기반으로 기계가 해석할 수 있는 데이터의 네트워크를 만드는 방법입니다. 애플리케이션은 하나의 Linked Data 항목에서 시작하여 포함된 링크를 따라 웹의 다른 사이트에 호스팅된 다른 Linked Data 항목으로 이동할 수 있습니다.

JSON-LD는 JSON [RFC8259]에서 Linked Data를 직렬화하기 위한 경량 문법입니다. 설계상 기존의 JSON을 최소한의 변경으로 Linked Data로 해석할 수 있도록 합니다. JSON-LD는 주로 웹 기반 프로그래밍 환경에서 Linked Data를 사용하고 상호운용 가능한 웹 서비스를 구축하며 JSON 기반 스토리지 엔진에 Linked Data를 저장하는 방법으로 의도되었습니다. JSON-LD는 JSON과 100% 호환되므로, 현재 널리 사용되는 많은 JSON 파서와 라이브러리를 재사용할 수 있습니다. JSON이 제공하는 모든 기능에 더해 JSON-LD는 다음을 도입합니다:

JSON-LD는 RDF [RDF11-CONCEPTS]에 대한 지식 없이도 JSON으로 직접 사용할 수 있도록 설계되었습니다. 또한 SPARQL [SPARQL11-OVERVIEW] 같은 다른 Linked Data 기술과 함께 RDF로 사용되도록 설계되었습니다. 위에 나열된 기능들 중 어느 하나가 필요하거나 RDF 그래프 또는 Dataset을 JSON 기반 구문으로 직렬화해야 하는 개발자에게 JSON-LD는 유용합니다. JSON-LD를 RDF 도구와 함께 사용하려는 사람들은 Turtle 및 TriG과 같이 JSON-LD를 또 다른 RDF 구문으로 사용할 수 있음을 알게 될 것입니다. JSON-LD가 RDF와 어떻게 관련되는지에 대한 전체 세부 사항은 § 10. RDF와의 관계에 있습니다.

이 문법은 이미 배포된 JSON 기반 시스템을 방해하지 않도록 설계되었으며 JSON에서 JSON-LD로의 부드러운 업그레이드 경로를 제공합니다. 이러한 데이터의 형태는 매우 다양하므로 JSON-LD는 문서를 결정론적 구조로 재구성하여 처리를 단순화하는 메커니즘을 제공합니다.

1.1 문서 읽는 방법

이 섹션은 비규범적입니다.

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

동반 문서인 JSON-LD 1.1 Processing Algorithms and API 명세서 [JSON-LD11-API]는 일반적인 JSON-LD 작업을 위한 표준 라이브러리 인터페이스를 제공하여 상위 수준에서 JSON-LD를 다루는 방법을 규정합니다.

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

이 문서는 하이퍼링크을 논의할 때 주로 IRI (Internationalized Resource Indicator) 용어를 사용합니다. 많은 웹 개발자는 URL 용어에 더 익숙합니다. 이 문서는 드물게 URI 용어도 사용합니다. 이러한 용어들은 기술 커뮤니티에서 종종 혼용되지만 서로 중요한 차이가 있으므로 명세서는 가능한 한 올바른 용어를 사용하려 노력합니다.

이 문서는 JSON-LD 1.0 이후의 변경사항을 강조할 수 있습니다. 변경사항을 보려면 을 선택하세요.

1.2 기여하기

이 섹션은 비규범적입니다.

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

1.3 타이포그래피 규약

이 섹션은 비규범적입니다.

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

markup
마크업(요소, 속성, 프로퍼티), 기계 처리 가능한 값(문자열, 문자, 미디어 타입), 속성 이름 또는 파일 이름은 빨간-오렌지 단일폭 글꼴로 표시됩니다.
variable
의사코드나 알고리즘 설명에서의 변수는 이탤릭체로 표시됩니다.
definition
이 또는 다른 명세서에서 사용될 용어의 정의는 굵은 이탤릭체로 표시됩니다.
definition reference
이 문서 내의 정의에 대한 참조는 밑줄이 그어지고 정의 자체로 연결되는 활성 링크입니다.
markup definition reference
이 문서 내의 정의에 대한 참조이며, 참조 자체가 마크업일 경우 밑줄이 그어지고 빨간-오렌지 단일폭 글꼴로 표시되며 정의 자체로 연결되는 활성 링크입니다.
external definition reference
다른 문서에 있는 정의에 대한 참조는 밑줄이 그어지고 이탤릭체이며 정의 자체로 연결되는 활성 링크입니다.
markup external definition reference
다른 문서에 있는 정의에 대한 참조이며, 참조 자체가 마크업일 경우 밑줄이 그어지고 이탤릭체 빨간-오렌지 단일폭 글꼴로 표시되며 정의 자체로 연결되는 활성 링크입니다.
하이퍼링크
하이퍼링크는 밑줄이 그어지고 파란색입니다.
[reference]
문서 참조(규범적 또는 정보적)는 대괄호로 감싸져 참조 섹션으로 링크됩니다.
Recommendation으로부터의 변경사항
이전 Recommendation에서 변경된 섹션이나 문구는 강조될 수 있으며, 이를 위해 § 1.1 문서 읽는 방법의 컨트롤을 사용합니다.
참고

노트는 연한 녹색 박스에 왼쪽에 녹색 테두리와 "Note" 헤더(녹색)로 표시됩니다. 노트는 항상 정보 제공용입니다.

Examples are in light khaki boxes, with khaki left border,
and with a numbered "Example" header in khaki.
Examples are always informative. The content of the example is in monospace font and may be syntax colored.

Examples may have tabbed navigation buttons
to show the results of transforming an example into other representations.

1.4 용어 정의

이 섹션은 비규범적입니다.

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

다른 명세에서 가져온 용어들

다음에서 가져온 용어들: ECMAScript Language Specification [ECMASCRIPT], The JavaScript Object Notation (JSON) Data Interchange Format [RFC8259], Infra Standard [INFRA], 및 Web IDL [WEBIDL]

array
JSON 직렬화에서는 array 구조가 0개 이상의 값들을 둘러싼 대괄호로 표시됩니다. 값들은 쉼표로 구분됩니다. 내부 표현에서는 list (또는 array)가 0개 이상의 값을 갖는 순서 있는 컬렉션입니다. JSON-LD는 JSON과 동일한 배열 표현을 사용하지만, 컬렉션은 기본적으로 순서가 없는 것으로 간주됩니다. 일반 JSON 배열에서는 순서가 보존되지만, 특별히 정의되지 않는 한 일반 JSON-LD 배열에서는 보존되지 않습니다 (JSON-LD 1.1의 Sets and Lists 섹션 참조).
boolean
가능한 두 상태 중 하나를 표현하는 값인 truefalse.
JSON object
JSON 직렬화에서, object 구조는 0개 이상의 이름/값 쌍(또는 멤버)을 둘러싼 중괄호로 표현됩니다. 이름은 문자열입니다. 각 이름 뒤에는 값과 구분하는 단일 콜론이 옵니다. 값과 다음 이름은 단일 쉼표로 구분됩니다. JSON-LD에서는 객체의 이름은 고유해야 합니다.

내부 표현에서는 JSON objectmap로 설명됩니다(참조: INFRA). 이는 키/값 쌍으로 구성된 entries로 구성됩니다.

Application Programming Interface에서, map은 [WEBIDL] record로 기술됩니다.

null
JSON-LD에서 null 값의 사용은 값을 무시하거나 재설정하는 데 사용됩니다. @context의 map entry에서 값 또는 값의 @idnull이면 해당 항목은 용어의 IRI와의 연계를 명시적으로 분리합니다. JSON-LD 문서 본문에서 값이 null인 map entry는 해당 항목이 정의되지 않은 것과 동일한 의미를 가집니다. expanded 형태에서 @value, @list, 또는 @setnull로 설정되면 전체 JSON 객체가 무시됩니다.
number
JSON 직렬화에서, number는 대부분의 프로그래밍 언어에서 사용되는 것과 유사하지만, 8진수 및 16진수 형식은 사용되지 않으며 선행 0은 허용되지 않습니다. 내부 표현에서는 number가 정수일 때는 long, 소수 부분이 있을 때는 double에 해당합니다 (참조: WEBIDL).
scalar
스칼라는 문자열, 숫자, true, 또는 false 중 하나입니다.
string
문자열은 0개 이상의 유니코드(UTF-8) 문자로 이루어진 시퀀스이며, 큰따옴표로 감싸지고 필요 시 백슬래시 이스케이프를 사용합니다. 한 문자는 단일 문자 문자열로 표현됩니다.

다음은 Internationalized Resource Identifiers (IRIs)에서 가져온 용어들입니다.

IRI
scheme, path 및 선택적 query와 fragment 세그먼트를 포함하는 절대 형태의 IRI입니다.
IRI reference
일반적인 IRI 사용을 나타냅니다. IRI reference는 절대이거나 상대적일 수 있습니다. 그러나 이러한 참조로부터 결과로 얻어지는 "IRI"는 절대 IRI만을 포함하며 상대 IRI 참조는 절대 형태로 해결됩니다.
relative IRI reference
상대 IRI 참조는 문서의 base IRI 등에 상대적인 IRI 참조입니다. 프로퍼티, @type의 값, 그리고 vocabulary relative로 정의된 용어들은 문서의 base IRI가 아니라 vocabulary mapping에 상대적으로 해석됩니다.

다음은 RDF 관련 명세들에서 가져온 용어들입니다: RDF 1.1 Concepts and Abstract Syntax, RDF Schema 1.1, 그리고 Linked Data Design Issues.

base IRI
base IRIcontext에 설정되거나 JSON-LD 문서의 위치에 기반합니다. base IRI는 상대 IRI 참조를 절대 IRI로 변환하는 데 사용됩니다.
blank node
그래프의 노드로서 IRI도 아니고 리터럴도 아닌 것입니다. blank node는 외부에서 참조 가능한 식별자를 가지지 않으며, JSON-LD에서는 prefix _:로 시작하는 식별자가 할당됩니다.
blank node identifier
JSON-LD 문서 범위 내에서 blank node를 식별하는 데 사용할 수 있는 문자열입니다. blank node identifiers는 _:로 시작합니다.
dataset
기본 그래프 하나와 0개 이상의 명명 그래프를 포함하는 RDF 그래프들의 컬렉션을 나타내는 dataset입니다.
datatype IRI
문자의 형식이 리터럴 값으로 매핑되는 방법을 결정하는 데이터 타입을 식별하는 IRI입니다.
default graph
dataset의 default graph는 이름이 없는 RDF 그래프이며 비어 있을 수 있습니다.
graph name
명명 그래프를 식별하는 IRI 또는 blank node입니다.
language-tagged string
문자열과 비어 있지 않은 언어 태그로 구성되며, BCP47에 따른 언어 코드입니다. 프로세서는 언어 태그를 소문자로 정규화할 수 있습니다.
Linked Data
각 문서가 linked data graph 또는 dataset의 표현을 포함하는 문서 집합입니다.
list
IRI, blank node, 리터럴의 순서 있는 시퀀스입니다.
literal
문자열이나 숫자와 같은 값으로 표현된 객체로서, 암묵적 또는 명시적으로 데이터타입 IRI를 포함하고, 데이터타입이 rdf:langString인 경우 선택적 언어 태그를 가질 수 있습니다.
named graph
IRI 또는 blank node로 식별되는 linked data graph입니다.
node
RDF 그래프의 노드로서, 적어도 하나의 트리플의 주어 또는 목적어 역할을 합니다.
object
incoming edge를 하나 이상 가지는 그래프의 노드입니다.
property
그래프에서 방향성 있는 arc의 이름입니다. 모든 property는 방향성을 가지며 IRI 또는 blank node identifier로 레이블됩니다. 가능한 경우 property는 IRI로 레이블되어야 합니다.
참고
property에 blank node identifiers를 사용하는 것은 구식이며, 향후 JSON-LD 버전에서 제거될 수 있습니다.
또한 predicate 용어도 참조하십시오.
RDF graph
라벨이 붙은 방향성 있는 그래프, 즉 노드들이 방향성 있는 호로 연결된 집합입니다.
resource
IRI, blank node, 또는 리터럴로 표시되는 세계의 어떤 것을 나타내는 resource입니다.
subject
그래프에서 적어도 하나의 outgoing edge를 가지는 노드로서, property를 통해 object 노드와 관련됩니다.
triple
주어, 술어, 목적어를 포함하는 RDF 그래프의 구성 요소로서 그래프의 노드-호-노드 부분을 나타냅니다.

JSON-LD 특화 용어 정의

active context
처리 알고리즘이 실행되는 동안 용어를 해석하는 데 사용되는 context입니다.
base direction
문자열에 직접 방향이 지정되지 않았을 때 사용하는 기본 방향입니다. @direction 키를 사용하여 context에서 설정할 수 있으며, 값은 "ltr", "rtl" 또는 null 중 하나여야 합니다. 자세한 규범적 설명은 Context Definitions 섹션을 참조하십시오.
compact IRI
compact IRI는 prefix:suffix 형태를 가지며, 공통 어휘를 식별하는 prefix를 사용하여 각 IRI를 개별 term 정의로 만들 필요 없이 IRI를 표현하는 방법입니다.
context
JSON-LD 문서를 해석하기 위한 규칙 집합으로, JSON-LD 1.1의 The Context 섹션과 Context Definitions 섹션에 규범적으로 명세되어 있습니다.
default language
문자열에 직접 언어가 지정되지 않았을 때 사용하는 언어입니다. @language 키를 사용하여 context에서 설정할 수 있으며, 값은 BCP47 언어 코드 문자열 또는 null이어야 합니다. 자세한 규범적 설명은 Context Definitions 섹션을 참조하십시오.
default object
@default 키를 가진 map입니다.
embedded context
embedded context는 @context가 node object, value object, graph object, list object, set object, nested properties의 값 또는 expanded term definition의 값으로 나타나는 context입니다. 값은 context 정의를 위한 map, IRI, 또는 위의 것들을 결합한 배열이 될 수 있습니다.
expanded term definition
expanded term definition은 term definition의 값이 하나 이상의 keyword 키를 포함하는 map인 경우를 말하며, 관련 IRI, 역속성(property) 여부, 문자열 값에 대한 타입, 그리고 컨테이너 매핑 등을 정의합니다. 자세한 규범적 설명은 Expanded Term Definition 섹션을 참조하십시오.
frame
다른 JSON-LD 문서를 변환하기 위한 매칭 및 임베딩 규칙을 설명하는 JSON-LD 문서입니다. 프레임 문서는 추가 키워드와 특정 map entries를 허용하여 매칭과 변환 과정을 설명합니다.
frame object
frame object는 프레임 내의 map 요소로서 입력의 node object 또는 value object와 매칭되는 특정 부분을 나타냅니다. Frame Objects 섹션을 참조하십시오.
graph object
graph object는 node object 내의 map entry 값으로 명명 그래프를 나타냅니다. expanded 될 때 graph object는 @graph entry를 가져야 하며, 선택적으로 @id@index entry를 가질 수 있습니다. simple graph object는 @id entry가 없는 graph object입니다. node objects는 @graph entry를 가질 수 있지만 다른 entries가 함께 있으면 graph object로 간주되지 않습니다. 자세한 규범적 설명은 Graph Objects 섹션을 참조하십시오.
id map
id map는 @container@id로 설정된 term의 map 값입니다. id map의 값은 node objects여야 하며 키는 관련 node object의 @id를 나타내는 IRIs로 해석됩니다. 값에 @id로 확장되는 키를 포함하면 그 값은 id map의 참조 키와 동일해야 합니다. Id Maps 섹션을 참조하십시오.
implicitly named graph
@container@graph로 설정된 expanded term definition의 값에서 생성된 named graph입니다.
included block
included block은 node object의 entry로서 키가 @included이거나 그 별칭이며 값이 하나 이상의 node objects인 항목입니다. Included Blocks 섹션을 참조하십시오.
index map
index map은 @container@index로 설정된 term의 map 값이며, 값은 문자열, 숫자, true, false, null, node object, value object, list object, set object 또는 위의 타입들의 배열 중 하나여야 합니다. Index Maps 섹션을 참조하십시오.
JSON literal
JSON literal은 관련 데이터타입 IRI가 rdf:JSON인 literal입니다. value object 표현에서 @type의 값은 @json입니다. JSON literal은 유효한 JSON 값을 나타냅니다. The rdf:JSON Datatype 섹션을 참조하십시오.
JSON-LD document
JSON-LD 문서는 RDF dataset의 직렬화입니다. JSON-LD Grammar 섹션을 참조하십시오.
JSON-LD internal representation
JSON-LD 내부 표현은 JSON 구문 구조를 직접 처리하기에 적합한 핵심 데이터 구조(배열, 맵, 문자열, 숫자, 불리언, null)로 변환한 결과입니다.
JSON-LD Processor
JSON-LD Processor는 JSON-LD 1.1 Processing Algorithms and API에 정의된 알고리즘을 수행할 수 있는 시스템입니다. API의 Conformance 섹션을 참조하십시오.
JSON-LD value
JSON-LD 값은 문자열, 숫자, true 또는 false, typed value, 또는 language-tagged string이며 RDF literal을 나타냅니다.
keyword
JSON-LD에 특정한 문자열로서 Syntax Tokens and Keywords 섹션 및 Keywords 섹션에서 규범적으로 기술됩니다.
language map
language map은 @container@language로 설정된 term의 map 값이며, 키는 BCP47 언어 코드를 나타내는 문자열이어야 하고 값은 null, 문자열 또는 위의 것들의 배열이어야 합니다. Language Maps 섹션을 참조하십시오.
list object
list object는 @list 키를 가진 map이며 선택적으로 @index 키를 가질 수 있지만 다른 entries는 가질 수 없습니다. Lists and Sets 섹션을 참조하십시오.
local context
@context 키로 지정된 map으로 명시된 context입니다.
nested property
nested property는 node object의 키로서 값이 map인 항목이며, 그 map의 entries는 node object의 값처럼 처리됩니다. nested property 자체는 의미론적으로 무의미하며 node object 내에서 하위 구조를 생성하는 데만 사용됩니다. Property Nesting 섹션을 참조하십시오.
node object
node object는 JSON-LD 문서가 직렬화하는 그래프의 노드의 속성들을 나타내는 map입니다. node object는 문서의 context 밖에 존재하며 @value, @list, 또는 @set 키를 포함하지 않고, 최상위 map이 @graph@context 외에 다른 entries를 포함하지 않는 경우가 아닌 경우 node object로 간주됩니다. Node Objects 섹션을 참조하십시오.
node reference
@id 키만을 가지는 node object로 노드를 참조하는 데 사용됩니다.
prefix
prefix는 compact IRI의 첫 구성요소로서, term이 접두사로 매핑되는 문자열의 첫 부분입니다.
processing mode
processing mode는 JSON-LD 문서가 어떻게 처리되는지를 정의합니다. 기본적으로 모든 문서는 이 명세에 적합한 것으로 간주됩니다. @version entry를 사용하여 다른 버전을 정의하면 json-ld-1.0 프로세서가 JSON-LD 1.1 문서를 실수로 처리하지 않도록 할 수 있습니다. API는 processing mode를 json-ld-1.0으로 설정하는 옵션을 제공하여 JSON-LD 1.1 기능의 활성화를 방지하거나 @version이 명시적으로 1.1로 설정되어 있을 때 오류를 발생시킬 수 있습니다. 이 명세서는 json-ld-1.1 처리 모드를 통해 JSON-LD 1.0을 확장합니다.
scoped context
scoped context는 expanded term definition의 일부로 사용되는 context로 embedded context와 동일한 형태를 가집니다. 타입으로 사용될 때는 type-scoped context를, 프로퍼티로 사용될 때는 property-scoped context를 정의합니다.
set object
set object는 @set entry를 가진 map이며 선택적으로 @index를 가질 수 있으나 다른 entries는 가질 수 없습니다. Lists and Sets 섹션을 참조하십시오.
term
term은 context에 정의된 짧은 단어로서 IRI로 확장될 수 있습니다. Terms 섹션을 참조하십시오.
term definition
term definition은 context의 항목으로서, 키는 문서 내에서 키, 타입 또는 어휘 항목으로 해석될 수 있는 term을 정의합니다. 값은 문자열(simple term definition) 또는 map(expanded term definition)이 될 수 있습니다.
type map
type map은 @container@type로 설정된 term의 map 값으로, 키는 해당 node object의 @type을 나타내는 IRIs로 해석되며 값은 node object 또는 node object의 배열이어야 합니다. Type Maps 섹션을 참조하십시오.
typed value
typed value는 값(문자열)과 타입(IRI)으로 구성됩니다.
value object
value object는 @value entry를 가진 map입니다. Value Objects 섹션을 참조하십시오.
vocabulary mapping
vocabulary mapping은 context에서 @vocab 키를 사용하여 설정되며, 값은 IRI, compact IRI, term 또는 null이 될 수 있습니다. Context Definitions 섹션을 참조하십시오.

1.5 설계 목표 및 근거

이 섹션은 비규범적입니다.

JSON-LD는 다음과 같은 설계 목표를 만족합니다:

단순성
기본 형태로 JSON-LD를 사용하기 위해 추가적인 프로세서나 소프트웨어 라이브러리가 필요하지 않습니다. 언어는 개발자에게 매우 쉬운 학습 곡선을 제공합니다. Linked Data에 관심이 없는 개발자는 JSON을 이해하고 @context 속성을 포함하되 무시하면 JSON-LD의 기본 기능을 사용할 수 있습니다.
호환성
JSON-LD 문서는 항상 유효한 JSON 문서입니다. 이는 표준 JSON 라이브러리들이 JSON-LD 문서와 원활하게 작동함을 보장합니다.
표현력
이 문법은 라벨이 붙은 방향성 그래프를 직렬화합니다. 이는 거의 모든 현실 세계의 데이터 모델을 표현할 수 있음을 보장합니다.
간결성
JSON-LD 문법은 매우 간결하고 사람이 읽기 쉬우며 개발자의 노력을 최소화합니다.
대부분의 경우 편집 불필요
JSON-LD는 기존 JSON 기반 시스템에서 부드럽고 단순한 전환을 보장합니다. 많은 경우 JSON 문서에 대한 편집 없이 HTTP 응답에 한 줄을 추가하는 것만으로 충분합니다 (참조: § 6.1 Interpreting JSON as JSON-LD). 이는 이미 널리 배포된 JSON 기반 인프라를 보유한 조직이 현재 서비스에 큰 지장을 주지 않고 JSON-LD의 기능을 사용할 수 있게 합니다. 그러나 JSON을 그래프 표현으로 매핑하는 작업이 복잡할 수 있는 경우도 있습니다. 이러한 경우에는 언어의 복잡성을 크게 늘리지 않기 위해 일부 사용 사례를 지원하지 않기로 했습니다. Zero Edits는 설계 목표이지만 항상 가능하지는 않으며 언어의 단순성을 우선시합니다.
RDF로서의 사용 가능성
JSON-LD는 개발자가 RDF를 이해하지 않고도 관습적인 JSON으로 사용할 수 있습니다. 또한 RDF로서도 사용 가능하므로 RDF 도구와 함께 JSON-LD를 사용하려는 사람들은 다른 RDF 구문처럼 사용할 수 있음을 알게 될 것입니다. JSON-LD가 RDF와 어떻게 관련되는지에 대한 전체 세부 사항은 § 10. RDF와의 관계에 있습니다.

1.6 데이터 모델 개요

이 섹션은 비규범적입니다.

일반적으로 JSON-LD 문서가 설명하는 데이터 모델은 라벨이 붙은 방향성 있는 그래프입니다. 그래프는 방향성 있는 호로 연결된 노드를 포함합니다. 노드는 resource로서 속성을 가지거나, 해당 속성들의 데이터 값들(문자열, 숫자, typed values(예: 날짜 및 시간), IRIs 등)일 수 있습니다.

방향성 그래프 내에서 노드는 resource이며 이름이 없을 수 있습니다(즉 IRI로 식별되지 않음). 이를 blank nodes라 하며 blank node identifier로 식별될 수 있습니다. 이러한 식별자는 JSON과 같은 트리 구조를 사용하여 완전히 연결된 그래프를 표현하는 데 필요할 수 있지만 본질적 의미는 없습니다. 문자열과 숫자 같은 리터럴 값도 resource로 간주되며, JSON-LD는 서로 다른 종류의 resource를 구분하기 위해 node objects와 value objects를 구별합니다.

이 단순한 데이터 모델은 매우 유연하고 강력하여 거의 모든 종류의 데이터를 모델링할 수 있습니다. 데이터 모델에 대한 자세한 설명은 § 8. Data Model을 참조하십시오.

Linked Data 기술에 익숙한 개발자라면 이 데이터 모델이 RDF 데이터 모델임을 알 것입니다. JSON-LD와 RDF의 관계를 더 깊이 이해하려면 § 10. RDF와의 관계를 참조하십시오.

표면적으로 JSON-LD 문서는 단순히 JSON입니다(자세한 내용은 RFC8259 참조). 핵심 데이터 구조를 설명하기 위해 이는 배열, 맵(파싱된 JSON 객체의 버전), 문자열, 숫자, 불리언, null로 제한됩니다. 이들은 JSON-LD 내부 표현이라 불리며, 표면 구문이 JSON 이외의 형식일 경우에도 동일한 알고리즘으로 조작할 수 있게 합니다..

참고

이 명세서에서는 다루고 있지 않지만, YAML 1.2 및 CBOR과 같은 이진 표현을 내부 표현으로 매핑하여 JSON-LD 1.1 API가 소스가 JSON 문서인 것처럼 동작하게 할 수 있습니다.

1.7 구문 토큰 및 키워드

이 섹션은 비규범적입니다.

JSON-LD는 언어의 핵심 부분인 여러 구문 토큰과 키워드를 규정합니다. 키워드에 대한 규범적 설명은 § 9.16 Keywords에 있습니다.

:
compact IRIs를 사용하는 JSON 키와 값의 구분자입니다.
@base
상대 IRI 참조를 문서에 대해 해석할 때 기준이 되는 base IRI를 설정하는 데 사용됩니다. 이 키워드는 Base IRI 섹션에서 설명됩니다.
@container
@container는 term의 기본 컨테이너 유형을 설정하는 데 사용됩니다. 이 키워드는 다음 섹션들에서 설명됩니다:
@context
문서 전체에서 사용되는 약식 이름(term)을 정의하는 데 사용됩니다. @context 키워드는 The Context 섹션에서 자세히 설명됩니다.
@direction
@direction은 문자열에 직접 방향이 지정되지 않았을 때의 기본 방향을 설정하는 데 사용됩니다. 이 키워드는 String Internationalization 섹션에서 설명됩니다.
@graph
그래프를 표현하는 데 사용됩니다. 이 키워드는 Named Graphs 섹션에서 설명됩니다.
@id
문서에서 기술되는 node objects를 IRI 또는 blank node identifiers로 고유하게 식별하는 데 사용됩니다. 이 키워드는 Node Identifiers 섹션에서 설명됩니다. node reference는 @id 속성만 포함하는 node object입니다.
@import
context 정의에서 외부 context를 로드하여 해당 context 정의가 병합되도록 하는 데 사용됩니다. 이는 JSON-LD 1.0 context에 JSON-LD 1.1 기능을 추가할 때 유용할 수 있습니다.
@included
최상위 node object에서 포함 블록(included block)을 정의하는 데 사용되며, 다른 node objects를 포함하는 데 사용됩니다.
@index
컨테이너가 정보를 색인화하는 데 사용되며 처리가 JSON 데이터 구조 내부로 더 깊게 계속되어야 함을 지정합니다. 이 키워드는 Data Indexing 섹션에서 설명됩니다.
@json
JSON literal의 @type 값으로 사용됩니다. JSON Literals 섹션을 참조하십시오.
@language
특정 문자열 값의 언어 또는 JSON-LD 문서의 기본 언어를 지정하는 데 사용됩니다. String Internationalization 섹션을 참조하십시오.
@list
순서 있는 데이터 집합을 표현하는 데 사용됩니다. Lists 섹션을 참조하십시오.
@nest
node object의 프로퍼티를 그룹화하지만 그래프의 엣드는 아닌 프로퍼티를 정의하는 데 사용됩니다.
@none
index map, id map, language map, type map 등에서 색인 값으로 사용되며, 색인된 노드가 색인 대상 특성을 가지고 있지 않을 때 사용됩니다.
@prefix
값이 true인 경우, 이 term은 compact IRI를 구성하는 데 사용할 수 있습니다. 값이 false이면 term이 compact IRI 구성에 사용되는 것을 방지합니다. 또한 compact IRI를 확장할 때 term이 고려될지 여부를 결정합니다.
@propagate
context 정의에서 해당 context의 범위를 변경하는 데 사용됩니다. 기본값은 true로, context는 node objects를 가로질러 전파됩니다(타입-스코프 컨텍스트는 기본적으로 false). 이를 false로 설정하면 새로운 node object로 들어갈 때 해당 context 내에서 생성된 term 정의가 제거됩니다.
@protected
context의 term definitions가 다른 context에 의해 재정의되는 것을 방지하는 데 사용됩니다. Protected Term Definitions 섹션을 참조하십시오.
@reverse
역방향 프로퍼티를 표현하는 데 사용됩니다. Reverse Properties 섹션을 참조하십시오.
@set
값을 항상 배열로 표현하고 순서가 없는 집합을 표현하는 데 사용됩니다. Sets 섹션을 참조하십시오.
@type
노드의 타입이나 typed value의 데이터타입을 설정하는 데 사용됩니다. Specifying the Type 및 Typed Values 섹션을 참조하십시오.
참고
@type를 node objects와 value objects 모두의 타입을 정의하는 데 사용하는 것은 데이터의 타입 지정을 위한 기본 필요를 충족합니다. 전문가들은 @type의 중첩 사용에 대해 우려할 수 있지만, 웹 개발자들이 이 기능을 수년간 사용해 온 결과 typed literal 값을 표현하는 데 @type가 남용된 사례는 드뭅니다.
@value
그래프에서 특정 프로퍼티와 연관된 데이터를 지정하는 데 사용됩니다. String Internationalization 및 Typed Values 섹션을 참조하십시오.
@version
context 정의에서 processing mode를 설정하는 데 사용됩니다. 이 명세서에 설명된 JSON-LD 1.1의 새로운 기능들은 @versionjson-ld-1.0으로 설정되었을 때 사용 불가능합니다.
참고
context 정의 내에서 @version은 숫자 값 1.1을 사용합니다(문자열 값이 아닌 숫자 값을 사용). JSON-LD 1.0 프로세서는 문자열 값을 허용할 수 있지만 숫자 값을 거부할 수 있습니다.
참고
@version 값으로 1.1을 사용하는 것은 JSON-LD 1.0 프로세서가 처리를 중단하게 만들기 위한 의도입니다. 비록 JSON-LD 1.1과 관련이 있음이 분명하지만, 이것은 Semantic Versioning 요구사항을 따르지는 않습니다.
@vocab
공통 접두사를 사용하여 @type의 속성과 값을 확장하는 데 사용됩니다. Default Vocabulary 섹션을 참조하십시오.

JSON-LD의 모든 키, 키워드 및 값은 대소문자를 구분합니다.

2. 준수

비규범적이라고 표시된 절들뿐만 아니라 이 명세서의 모든 저작 지침, 다이어그램, 예제 및 주석은 비규범적입니다. 이 명세서의 나머지 모든 부분은 규범적입니다.

본 문서에서 키워드 MAY, MUST, MUST NOT, RECOMMENDED, SHOULD, 그리고 SHOULD NOT은 모두 대문자로 표시된 경우에 한해 BCP 14 [RFC2119] 및 [RFC8174]에 설명된 대로 해석되어야 합니다.

JSON-LD 문서는 부록 § 9. JSON-LD Grammar의 규범적 명세를 따르는 경우 이 명세를 만족합니다. JSON 문서는 § 6.1 Interpreting JSON as JSON-LD의 규범적 명세를 따르면 JSON-LD로 해석될 수 있습니다. 편의를 위해 문서에 대한 규범적 진술은 종종 문서의 속성에 대한 진술로 표현됩니다.

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

Prefix IRI
dc11 http://purl.org/dc/elements/1.1/
dcterms http://purl.org/dc/terms/
cred https://w3id.org/credentials#
foaf http://xmlns.com/foaf/0.1/
geojson https://purl.org/geojson/vocab#
prov http://www.w3.org/ns/prov#
i18n https://www.w3.org/ns/i18n#
rdf http://www.w3.org/1999/02/22-rdf-syntax-ns#
schema http://schema.org/
skos http://www.w3.org/2004/02/skos/core#
xsd http://www.w3.org/2001/XMLSchema#

이들은 문서 내에서 compact IRI의 약칭으로 사용되며, 예를 들어 dcterms:titlehttp://purl.org/dc/terms/title를 나타내는 약식 표기입니다.

3. 기본 개념

이 절은 비규범적입니다.

JSON [RFC8259]는 경량의 언어 독립적 데이터 교환 형식입니다. 파싱과 생성이 용이합니다. 그러나 서로 다른 출처의 JSON을 통합하는 것은 어렵습니다 — 키가 다른 데이터 출처와 충돌할 수 있기 때문입니다. 또한 JSON에는 웹의 기본 구성 요소인 하이퍼링크를 위한 내장 지원이 없습니다. 이 절 전체에서 사용할 예제를 먼저 살펴보겠습니다:

예제 2: 샘플 JSON 문서
{
  "name": "Manu Sporny",
  "homepage": "http://manu.sporny.org/",
  "image": "http://manu.sporny.org/images/manu.png"
}

사람에게는 이 데이터가 name이 "Manu Sporny"인 사람에 관한 것이고, homepage 속성에는 그 사람의 홈페이지 URL이 들어 있음을 쉽게 알 수 있습니다. 기계는 이런 직관적 이해를 갖고 있지 않으며 때로는 사람에게도 모호함을 해결하기 어려울 수 있습니다. 이 문제는 "name", "homepage" 같은 토큰 대신 서로 다른 개념을 표시하는 모호하지 않은 식별자를 사용하는 것으로 해결할 수 있습니다.

Linked Data와 웹 전반에서는 모호함 없는 식별을 위해 IRI를 사용합니다. 아이디어는 다른 개발자에게 유용할 수 있는 데이터에 대해 모호함 없는 식별자를 할당하기 위해 IRI를 사용하는 것입니다. 예를 들어 namehomepage 같은 용어IRI로 확장되면 개발자들이 서로의 용어를 실수로 덮어쓰지 않게 해 줍니다. 또한 개발자나 기계는 이 IRI(예: 웹 브라우저를 사용하여)를 통해 해당 용어로 이동하여 그 용어가 의미하는 바를 정의로 얻을 수 있습니다. 이 과정을 IRI dereferencing이라고 합니다.

널리 쓰이는 schema.org 어휘를 활용하면 위의 예제를 명확하게 다음과 같이 표현할 수 있습니다:

위 예제에서는 모든 속성이 IRI로 명확히 식별되며, IRI를 나타내는 값들은 @id 키워드로 명시되어 있습니다. 이는 데이터에 대해 매우 구체적인 유효한 JSON-LD 문서이지만 사람에게는 지나치게 장황하여 다루기 어렵습니다. 이 문제를 해결하기 위해 JSON-LD는 다음 절에서 설명되는 context 개념을 도입합니다.

이 절은 JSON-LD의 가장 기본적인 기능만 다룹니다. typed values, indexed values, 및 named graphs 같은 고급 기능은 § 4. Advanced Concepts에서 찾을 수 있습니다.

3.1 컨텍스트

이 절은 비규범적입니다.

두 사람이 서로 소통할 때 대화는 일반적으로 공유된 환경, 즉 "대화의 컨텍스트"에서 이루어집니다. 이 공유된 컨텍스트는 상호 친구의 이름과 같은 약식 용어를 사용하여 더 빠르게 소통하되 정확성을 잃지 않도록 합니다. JSON-LD의 컨텍스트도 같은 방식으로 작동합니다. 컨텍스트는 두 애플리케이션이 약식 용어를 사용하여 서로 효율적으로 소통하되 정확성을 잃지 않도록 해 줍니다.

간단히 말해, 컨텍스트용어IRI로 매핑하는 데 사용됩니다. 용어는 대소문자를 구분하며, 예약된 JSON-LD 키워드가 아닌 대부분의 유효한 문자열은 용어로 사용할 수 있습니다. 예외는 빈 문자열 ""와 키워드 형태(즉 "@"로 시작하고 하나 이상의 문자로만 이루어진 문자열)를 가지는 문자열이며, 이러한 문자열은 용어로 사용할 수 없습니다. 또한 ":"를 포함하는 등 IRI 형태의 문자열은 용어로 사용해서는 안 됩니다.

앞 절의 샘플 문서에 대한 컨텍스트는 대략 다음과 같습니다:

예제 4: 이전 절의 샘플 문서를 위한 컨텍스트
{
  "@context": {
    "name": "http://schema.org/name",
    ↑ 이는 'name'이 'http://schema.org/name'의 약식 표기임을 의미합니다
    "image": {
      "@id": "http://schema.org/image",
      ↑ 이는 'image'가 'http://schema.org/image'의 약식 표기임을 의미합니다
      "@type": "@id"
      ↑ 이는 'image'와 연관된 문자열 값이 IRI 식별자로 해석되어야 함을 의미합니다
    },
    "homepage": {
      "@id": "http://schema.org/url",
      ↑ 이는 'homepage'가 'http://schema.org/url'의 약식 표기임을 의미합니다
      "@type": "@id"
      ↑ 이는 'homepage'와 연관된 문자열 값이 IRI 식별자로 해석되어야 함을 의미합니다 
    }
  }
}

위의 컨텍스트가 보여주듯, 용어 정의의 값은 단순한 문자열로서 용어를 IRI로 매핑할 수도 있고, map일 수도 있습니다.

컨텍스트@context 키를 가진 entry로 도입되며, node objectvalue object 내에 나타날 수 있습니다.

만약 용어 키를 가진 entry의 값이 map이라면, 그 map은 expanded term definition이라 불립니다. 위 예제는 imagehomepage의 값이 문자열일 경우 이를 IRI로 해석해야 함을 지정합니다. Expanded term definitions는 용어를 index maps에 사용하거나 배열 값을 sets 또는 lists로 해석할지 지정할 수 있게 합니다. 확장된 용어 정의는 키로 IRI 또는 compact IRI를 사용할 수 있으며, 이는 타입 또는 언어 정보를 IRI나 compact IRI에 연관짓는 데 주로 사용됩니다.

컨텍스트는 문서 내에 직접 포함된 형태(임베디드 컨텍스트)로 나타나거나 URL을 통해 참조될 수 있습니다. 이전 예제의 컨텍스트 문서가 https://json-ld.org/contexts/person.jsonld에서 가져올 수 있다고 가정하면, 단 한 줄을 추가하여 JSON-LD 문서를 훨씬 간결하게 표현할 수 있습니다:

참조된 컨텍스트는 용어들이 Schema.org 어휘 내에서 어떻게 IRI로 매핑되는지뿐만 아니라 homepageimage에 연관된 문자열 값들이 "@type": "@id"로 IRI로 해석될 수 있음을 지정합니다(자세한 내용은 § 3.2 IRIs 참조). 이 정보는 개발자들이 사이트별로 데이터 상호운용 방식을 합의하지 않아도 서로의 데이터를 재사용할 수 있게 해 줍니다. 외부 JSON-LD 컨텍스트 문서는 @context 키 밖에 문서화나 용어에 관한 추가 정보를 포함할 수 있습니다. @context 값 밖에 포함된 정보는 외부 JSON-LD 컨텍스트 문서로 사용될 때 무시됩니다.

원격 컨텍스트는 상대 URL로도 참조될 수 있으며, 이는 참조를 포함한 문서의 위치를 기준으로 해석됩니다. 예를 들어 문서가 http://example.org/document.jsonld에 있고 context.jsonld로 상대 참조가 있다면 참조된 컨텍스트 문서는 http://example.org/context.jsonld에 위치합니다.

예제 6: 상대 컨텍스트 로딩
{
  "@context": "context.jsonld",
  "name": "Manu Sporny",
  "homepage": "http://manu.sporny.org/",
  "image": "http://manu.sporny.org/images/manu.png"
}
참고

컨텍스트 URL에 대한 상대 참조의 해석은 원격 컨텍스트 문서에도 적용됩니다. 원격 컨텍스트 문서 자체도 다른 컨텍스트에 대한 참조를 포함할 수 있기 때문입니다.

JSON 문서는 컨텍스트를 HTTP Link Header로 참조함으로써 수정 없이 JSON-LD로 해석될 수 있습니다(자세한 내용은 § 6.1 Interpreting JSON as JSON-LD 참조). 또한 JSON-LD 1.1 API를 사용하여 사용자 정의 컨텍스트를 적용할 수도 있습니다 [JSON-LD11-API].

JSON-LD 문서에서는 컨텍스트를 인라인으로 지정할 수도 있습니다. 이렇게 하면 웹 연결이 없어도 문서를 처리할 수 있다는 장점이 있습니다. 궁극적으로 이는 모델링 결정이며 사용 사례에 따라 다른 처리가 필요할 수 있습니다. 원격 컨텍스트 사용에 관한 논의는 보안 고려사항§ C. IANA Considerations에서 확인하십시오.

이 절은 JSON-LD 컨텍스트의 가장 기본적인 기능만 다룹니다. 컨텍스트는 indexed values, 정렬된 값, 및 중첩된 속성과 같은 더 복잡한 JSON 데이터 구조를 해석하는 데에도 사용할 수 있습니다. 컨텍스트와 관련된 고급 기능은 § 4. Advanced Concepts에서 다룹니다.

3.2 IRI

이 절은 비규범적입니다.

IRIs는 Linked Data에서 근본적입니다. 대부분의 노드속성을 식별하는 방식이기 때문입니다. JSON-LD에서는 IRI가 IRI 참조로 표현될 수 있습니다. IRI는 [RFC3987]에 따라 스킴경로, 선택적 쿼리프래그먼트 세그먼트를 포함하는 것으로 정의됩니다. 상대 IRI 참조는 다른 IRI에 상대적인 참조입니다. JSON-LD에서는 아래에 명시된 예외를 제외하고 모든 상대 IRI 참조는 base IRI를 기준으로 해석됩니다.

참고

문서 § 1.1 How to Read this Document에서 언급했듯, IRI는 종종 URL과 혼동될 수 있습니다. 주요 차이는 URL이 웹에서 자원을 찾아내는(locates) 반면, IRI는 자원을 식별(identifies)한다는 점입니다. 자원 식별자가 dereferenceable이면 좋지만 항상 실용적이지 않을 수 있습니다. 예를 들어 UUID와 같은 URN 체계(예: urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6)를 생각할 수 있습니다.

참고

속성들, @type의 값들, 그리고 속성의 값들 중에서 용어 정의에 의해 vocabulary mapping에 상대적인 것으로 정의된 것들은 상대 IRI 참조의 형태일 수 있지만, 이는 vocabulary mapping을 사용하여 해석되며 base IRI를 사용하지 않습니다.

문자열IRI로 해석될 수 있으며, 특히 키가 @idmap entry의 값일 때 그렇습니다:

예제 8: @id 값은 IRI로 해석됩니다
{
  ...
  "homepage": { "@id": "http://example.com/" }
  ...
}

IRI로 해석되는 값들은 상대 IRI 참조로도 표현될 수 있습니다. 예를 들어 다음 문서가 http://example.com/about/에 위치한다고 가정하면 상대 참조 ../http://example.com/로 확장됩니다(상대 IRI 참조를 어디에 사용할 수 있는지에 대한 자세한 내용은 § 9. JSON-LD Grammar를 참조하십시오).

예제 9: IRI는 상대적으로 표현될 수 있습니다
{
  ...
  "homepage": { "@id": "../" }
  ...
}

IRI는 키 위치에 직접 표현될 수도 있습니다:

예제 10: 키로서의 IRI
{
  ...
  "http://schema.org/name": "Manu Sporny",
  ...
}

위 예제에서 키 http://schema.org/nameIRI로 해석됩니다.

용어가 active context 내에 정의된 용어와 일치하면 용어→IRI 확장이 발생합니다:

위 예제에서처럼 JSON 키가 IRI로 확장되지 않으면(예: 위의 status) Linked Data가 아니므로 처리 시 무시됩니다.

만약 특정 용어 또는 속성 IRI에 대해 형 변환(coercion) 규칙이 @context에 지정되어 있다면, 문자열 값으로부터 IRI가 생성됩니다:

위 예제에서 값 http://manu.sporny.org/는 JSON 문자열로 표현되어 있으므로, 형 변환 규칙에 따라 처리 시 IRI로 변환됩니다. 이 기능에 대한 자세한 내용은 § 4.2.3 Type Coercion를 참조하십시오.

요약하면, JSON-LD에서 IRI는 여러 가지 방식으로 표현될 수 있습니다:

  1. Map entries의 키가 용어와 매치되어 active context에 정의된 경우 해당 키는 IRI로 확장됩니다(이는 context definition 밖에서만 적용됩니다).
  2. @id 또는 @type을 사용하여 지정된 문자열 값에 대해 IRI가 생성됩니다.
  3. @type@id 또는 @vocab 값으로 설정된 형 변환 규칙을 포함하는 경우, 해당 키의 문자열 값에 대해 IRI가 생성됩니다.

이 절은 JSON-LD에서 IRI와 관련된 가장 기본적인 기능만 다룹니다. IRI와 관련된 고급 기능은 § 4. Advanced Concepts에서 다룹니다.

3.3 노드 식별자

이 절은 비규범적입니다.

RDF 그래프에서 노드를 외부에서 참조하려면 노드에 식별자가 있어야 합니다. IRI는 Linked Data의 근본 개념이며, 노드를 진정으로 연결하려면 식별자를 dereference했을 때 그 노드의 표현을 반환해야 합니다. 이를 통해 애플리케이션은 해당 노드에 대한 추가 정보를 검색할 수 있습니다.

JSON-LD에서 노드는 @id 키워드를 사용하여 식별됩니다:

위 예제는 node objecthttp://me.markus-lanthaler.com/라는 IRI로 식별되는 것을 보여줍니다.

이 절은 JSON-LD에서 노드 식별자와 관련된 가장 기본적인 기능만 다룹니다. 노드 식별자와 관련된 고급 기능은 § 4. Advanced Concepts에서 다룹니다.

3.4 JSON 객체의 용도

이 절은 비규범적입니다.

문법으로서 JSON은 제한된 수의 구문 요소만을 가집니다:

JSON-LD 데이터 모델은 RDF 데이터 모델을 기반으로 보다 풍부한 자원 집합을 허용합니다. 데이터 모델은 § 8. Data Model에서 더 자세히 설명됩니다. JSON-LD는 JSON 객체를 사용하여 다양한 자원과 이들 간의 관계를 기술합니다:

Node objects
Node objects는 들어오는 엣지와 나가는 엣지를 모두 가질 수 있는 linked data graph의 노드를 정의하는 데 사용됩니다. Node objects는 속성을 가진 자원을 정의하기 위한 주요 구조입니다. 규범적 정의는 § 9.2 Node Objects를 참조하십시오.
Value objects
Value objects는 들어오는 엣지만 가질 수 있는 리터럴 노드를 설명하는 데 사용됩니다. JSON에서는 일부 리터럴 노드가 JSON 객체 없이도 설명될 수 있지만(예: 숫자, 문자열, 불리언 값), expanded 형태에서는 모든 리터럴 노드가 value objects로 기술됩니다. 자세한 정보는 § 4.2 Describing Values 및 규범적 정의는 § 9.5 Value Objects를 참조하십시오.
List Objects and Set objects
List Objects는 maps의 특수한 형태로, node objectsvalue objects와 구별됩니다. 이는 @list 키 아래에 배열을 감싸 정렬된 값을 표현하는 데 사용됩니다. Set Objects는 일관성을 위해 존재하며 @set 키의 배열 값과 동등합니다. 자세한 내용은 § 4.3.1 Lists§ 4.3.2 Sets를 참조하십시오.
Map Objects
JSON-LD는 속성의 값을 더 쉽게 접근하기 위해 다양한 형태의 maps를 사용합니다.
Language Maps
서로 다른 언어와 연관된 여러 값을 언어 태그로 인덱싱할 수 있게 합니다. 자세한 내용은 § 4.6.2 Language Indexing 및 규범적 정의는 § 9.8 Language Maps를 참조하십시오.
Index Maps
여러 값을 @index로 인덱싱할 수 있게 합니다. 자세한 내용은 § 4.6.1 Data Indexing 및 규범적 정의는 § 9.9 Index Maps를 참조하십시오.
Id Maps
여러 node objects를 @id로 인덱싱할 수 있게 합니다. 자세한 내용은 § 4.6.3 Node Identifier Indexing 및 규범적 정의는 § 9.11 Id Maps를 참조하십시오.
Type Maps
여러 node objects를 @type으로 인덱싱할 수 있게 합니다. 자세한 내용은 § 4.6.4 Node Type Indexing 및 규범적 정의는 § 9.12 Type Maps를 참조하십시오.
Named Graph Indexing
여러 명명 그래프를 그래프 이름으로 인덱싱할 수 있게 합니다. 자세한 내용은 § 4.9.3 Named Graph Indexing를 참조하십시오.
Graph objects
Graph object는 node object와 유사하지만 명명된 그래프를 정의한다는 점에서 차이가 있습니다. 자세한 내용은 § 4.9 Named Graphs 및 규범적 정의는 § 9.4 Graph Objects를 참조하십시오. node object는 다른 속성들 외에도 명명된 그래프를 기술할 수 있지만, graph object는 오직 명명된 그래프만을 기술합니다.
Context Definitions
Context Definition은 JSON 객체 형식을 사용하지만 그 자체가 linked data graph의 데이터는 아닙니다. Context Definition은 확장된 용어 정의를 포함할 수 있으며, 이 또한 JSON 객체를 사용하여 표현됩니다. 자세한 내용은 § 3.1 The Context, § 4.1 Advanced Context Usage 및 규범적 정의는 § 9.15 Context Definitions를 참조하십시오.

3.5 타입 지정

이 절은 비규범적입니다.

Linked Data에서는 그래프 노드의 타입을 지정하는 것이 일반적이며, 많은 경우 특정 node object 내에서 사용되는 속성들 또는 노드가 값인 속성에 근거해 타입을 추론할 수 있습니다. 예를 들어 schema.org 어휘에서 givenName 속성은 Person과 연관되어 있으므로 node object에 givenName 속성이 있다면 그 노드의 타입은 Person일 것이라고 추론할 수 있습니다. @type으로 이를 명시하면 연관성을 분명히 할 수 있습니다.

특정 노드의 타입은 @type 키워드를 사용하여 지정할 수 있습니다. Linked Data에서 타입은 IRI로 고유하게 식별됩니다.

배열을 사용하여 노드에 여러 타입을 할당할 수 있습니다:

@type 키의 값은 active context에 정의된 용어일 수도 있습니다:

노드의 타입을 설정하는 것 외에도, @type은 값의 타입을 설정하여 타입된 값(typed value)을 만들기 위해 사용할 수 있습니다. 이 용도의 @type은 node object의 타입을 정의할 때와 유사하지만, value objects는 단일 타입만 가질 수 있도록 제한됩니다. typed values에 대한 자세한 논의는 § 4.2.1 Typed Values를 참조하십시오.

타입된 값은 확장된 용어 정의에서 @type을 지정하여 암묵적으로 정의될 수도 있습니다. 이 내용은 § 4.2.3 Type Coercion에서 더 자세히 다룹니다.

4. 고급 개념

이 절은 비규범적입니다.

JSON-LD에는 위에서 설명한 핵심 기능을 넘어서는 여러 기능이 있습니다. JSON은 이러한 구조를 사용하여 데이터를 표현할 수 있으며, 이 절에서 설명하는 기능들은 다양한 JSON 구조를 Linked Data로 해석하는 데 사용될 수 있습니다. JSON-LD 프로세서는 제공되거나 문서에 포함된 컨텍스트를 사용하여 속성 값을 여러 관용적인 방식으로 해석합니다.

값 설명

JSON에서 한 패턴은 속성의 값이 문자열인 경우입니다. 종종 이 문자열은 실제로 다른 타입의 값을 나타내며, 예를 들어 IRI, 날짜, 특정 언어의 문자열 등이 될 수 있습니다. 이러한 값의 타입을 설명하는 방법은 § 4.2 값 설명을 참조하십시오.

값 순서

JSON에서 배열 값을 가진 속성은 암묵적인 순서를 의미합니다. JSON-LD의 배열은 기본적으로 포함된 요소들의 순서를 전달하지 않습니다. 단, 임베디드 구조나 컨텍스트 정의를 통해 명시적으로 정의한 경우는 예외입니다. 자세한 내용은 § 4.3 값 정렬을 참조하세요.

속성 중첩

API에서 자주 보이는 다른 JSON 관용구는 관련된 속성들을 그룹화하기 위해 중간 객체를 사용하는 것입니다. JSON-LD에서는 이를 중첩 속성이라고 하며, § 4.4 중첩 속성에서 설명합니다.

객체 참조

Linked Data는 서로 다른 자원 간의 관계를 설명하는 것입니다. 때로는 이러한 관계가 웹에 기술된 서로 다른 문서에서 정의된 자원들 사이에 있고, 때로는 같은 문서 내에서 자원들이 기술됩니다.

이 경우 http://manu.sporny.org/about에 위치한 문서가 위 예제를 포함하고, https://greggkellogg.net/foaf에 있는 다른 문서를 참조할 수 있으며, 해당 문서에는 유사한 표현이 포함될 수 있습니다.

JSON 사용에서 흔한 관용구 중 하나는 객체가 다른 객체의 값으로 지정되는 것입니다. JSON-LD에서는 이를 임베딩이라고 하며, 예를 들어 친구를 Person의 객체 값으로 지정하는 경우가 있습니다:

이러한 관계의 세부사항은 § 4.5 임베딩을 참조하십시오.

인덱싱된 값

JSON에서 또 다른 흔한 관용구는 중간 객체를 사용하여 속성 값을 인덱싱 방식으로 표현하는 것입니다. JSON-LD는 데이터를 여러 방식으로 인덱싱할 수 있도록 허용하며, 이에 대한 자세한 내용은 § 4.6 인덱싱된 값을 참조하십시오.

역방향 속성

JSON-LD는 방향성 있는 그래프를 직렬화합니다. 이는 모든 속성이 한 노드에서 다른 노드 또는 로 향함을 의미합니다. 그러나 경우에 따라 역방향 방향으로 직렬화하는 것이 바람직할 수 있으며, 이에 대한 자세한 내용은 § 4.8 역방향 속성을 참조하십시오.

다음 절들에서는 이러한 고급 기능들을 더 상세히 설명합니다.

4.1 고급 컨텍스트 사용

이 절은 비규범적입니다.

섹션 § 3.1 The Context에서는 JSON-LD가 작동하는 기본 사항을 소개했습니다. 이 절에서는 컨텍스트의 기본 원칙을 확장하고 JSON-LD를 사용하여 보다 고급 사용 사례를 달성하는 방법을 보여줍니다.

일반적으로 컨텍스트는 map이 정의되는 모든 곳에서 사용할 수 있습니다. 직접 다른 컨텍스트 정의의 자식으로(확장된 용어 정의의 일부로 나타나는 경우를 제외하고) 컨텍스트를 표현할 수 없는 경우만 예외입니다. 예를 들어, JSON-LD 문서는 하나 이상의 배열 형태일 수 있으며, 각 최상위 노드 객체에서 컨텍스트 정의를 사용할 수 있습니다:

외부 배열은 확장된 문서 형태플래튼된 문서 형태에서 문서의 표준이며, 노드들이 서로 참조하지 않는 연결 끊긴 그래프를 기술할 때 필요할 수 있습니다. 이러한 경우, 최상위 map@graph 속성을 사용하는 것이 @context의 반복을 줄이는 데 유용할 수 있습니다. 자세한 내용은 § 4.5 임베딩을 참조하십시오.

중복된 컨텍스트 용어는 가장 최근에 정의된 항목이 우선하는 방식으로 재정의됩니다.

위 예제에서 details 구조 안에 있는 더 깊게 중첩된 임베디드 컨텍스트name 용어를 재정의합니다. 이는 대부분의 경우 좋은 작성 관행은 아니며, 대개 이전 컨텍스트의 특정 map 구조에 의존하는 레거시 애플리케이션을 다룰 때 사용됩니다. 용어가 컨텍스트 내에서 재정의되면 이전 정의와 관련된 모든 규칙이 제거됩니다. 용어가 null로 재정의되면, 해당 용어는 활성 컨텍스트에 정의된 용어 목록에서 효과적으로 제거됩니다.

여러 컨텍스트는 배열을 사용해 결합할 수 있으며, 이는 순서대로 처리됩니다. 특정 map 내에 정의된 컨텍스트 집합을 로컬 컨텍스트(local contexts)라고 합니다. 활성 컨텍스트는 문서 내 특정 지점에서 유효한 로컬 컨텍스트들의 누적을 나타냅니다. 로컬 컨텍스트를 null로 설정하면, 이전 컨텍스트에 정의된 용어 정의, 기본 언어 등 없이 활성 컨텍스트를 빈 컨텍스트로 효과적으로 재설정합니다. 다음 예제는 외부 컨텍스트를 지정한 다음 그 위에 임베디드 컨텍스트를 겹쳐서 사용하는 예입니다:

JSON-LD 1.1에는 스코프된 컨텍스트와 임포트된 컨텍스트를 포함하여 컨텍스트를 도입하는 다른 메커니즘과 용어 정의를 보호하는 새로운 방법들이 있습니다. 따라서 마지막으로 정의된 인라인 컨텍스트가 반드시 용어의 범위를 결정하는 것은 아닐 수 있습니다. 자세한 내용은 § 4.1.8 스코프된 컨텍스트, § 4.1.9 컨텍스트 전파, § 4.1.10 임포트된 컨텍스트, 및 § 4.1.11 보호된 용어 정의를 참조하십시오.

참고

가능한 경우, 컨텍스트 정의는 JSON-LD 문서의 최상단에 두는 것이 좋습니다. 이렇게 하면 문서를 읽기 쉬워지고 스트리밍 파서가 더 효율적일 수 있습니다. 문서에 컨텍스트가 최상단에 없더라도 여전히 적합한 JSON-LD입니다.

참고

향후 호환성 문제를 피하기 위해, 용어@ 문자로 시작하고 오직 하나 이상의 ALPHA 문자로만 이어지는 경우(ABNF 규칙 참조)를 피하는 것이 좋습니다. 이러한 형식은 추후 JSON-LD의 키워드로 사용될 수 있습니다. @로 시작하되 JSON-LD 1.1 키워드가 아닌 용어는 다른 용어와 동일하게 처리되며, IRI에 매핑되지 않으면 무시됩니다. 또한 빈 용어("")의 사용은 모든 프로그래밍 언어가 빈 JSON 키를 처리할 수 있는 것은 아니므로 허용되지 않습니다.

4.1.1 JSON-LD 1.1 처리 모드

이 절은 비규범적입니다.

JSON-LD 1.1에서 정의된 새로운 기능들은 processing modejson-ld-1.0으로 설정되지 않은 한 사용 가능합니다. 이는 API 옵션을 통해 설정될 수 있습니다. processing mode@version entry가 포함된 context에서 숫자 1.1로 설정하거나 API 옵션을 통해 명시적으로 json-ld-1.1로 설정할 수 있습니다. processing mode를 명시적으로 json-ld-1.1로 설정하면 JSON-LD 1.0 프로세서가 JSON-LD 1.1 문서를 잘못 처리하는 것을 방지할 수 있습니다.

Example 23: 컨텍스트에서 @version 설정
{
  "@context": {
    "@version": 1.1,
    ...
  },
  ...
}

문서를 처리할 때 처음으로 만나게 되는 context@version이 포함되어 있으면(단, API 옵션으로 명시적으로 정의되지 않은 경우) 해당 값이 processing mode를 결정합니다. 즉, @version이 없는 컨텍스트를 처리한 후에 "@version": 1.1이 발견되면, 그 문서는 마치 해당 컨텍스트 내부에 "@version": 1.1가 정의되어 있었던 것처럼 해석됩니다.

참고

processing mode를 명시적으로 json-ld-1.1로 설정하는 것은 권장됩니다. 이는 JSON-LD 1.0 프로세서가 JSON-LD 1.1 문서를 잘못 처리하여 다른 결과를 생성하는 것을 방지합니다.

4.1.2 기본 어휘

이 절은 비규범적입니다.

때로는 모든 속성과 타입이 같은 어휘에서 올 수 있습니다. JSON-LD의 @vocab 키워드는 작성자가 공통 접두사를 설정하게 해 주며, 이는 vocabulary mapping으로 사용되어 term과 일치하지 않고 콜론을 포함하지 않는(즉 IRI도 compact IRI도 아닌) 모든 속성과 타입에 적용됩니다.

만약 @vocab를 사용하지만 어떤 map의 특정 키들을 해당 어휘로 확장하지 않으려면, 해당 termnullcontext에 명시적으로 설정할 수 있습니다. 예를 들어 아래 예제에서 databaseId 항목은 IRI로 확장되지 않아 확장 시 해당 속성이 삭제됩니다.

JSON-LD 1.1부터는 local contextvocabulary mapping상대 IRI 참조로 설정할 수 있으며, 이는 활성 컨텍스트의 기존 vocabulary mapping에 이어 붙여집니다(활성 컨텍스트에 vocabulary mapping이 없을 때의 적용 방식은 § 4.1.4 문서 기반을 기본 어휘로 사용하기 참조).

다음 예제는 상대 IRI 참조를 사용하여 속성을 확장했을 때의 효과를 보여주며, 확장 결과는 아래의 Expanded(결과) 탭에 표시되어 있습니다.

참고

@vocab의 문법은 § 9.15 Context Definitions에 정의된 대로, 값으로 term이나 compact IRI를 허용합니다. @vocab 값에 사용된 용어는 컨텍스트가 도입될 때 유효 범위에 있어야 하며, 그렇지 않으면 동일한 컨텍스트 내에서 @vocab와 다른 용어들 간에 순환 종속성이 발생할 수 있습니다.

4.1.3 Base IRI

이 절은 비규범적입니다.

JSON-LD는 IRI를 상대 형태로 명시할 수 있으며, 이는 문서의 기본(base)을 기준으로 RFC3986 섹션 5.1에 따라 해석됩니다. context에서 @base 키워드를 사용하여 base IRI를 명시적으로 설정할 수 있습니다.

예를 들어 JSON-LD 문서가 http://example.com/document.jsonld에서 가져와졌다면, 상대 IRI 참조는 해당 IRI를 기준으로 해석됩니다:

Example 27: 상대 IRI 참조를 노드 식별자로 사용하기
{
  "@context": {
    "label": "http://www.w3.org/2000/01/rdf-schema#label"
  },
  "@id": "",
  "label": "Just a simple document"
}

이 문서는 빈 @id를 사용하여 문서 기본을 가리킵니다. 그러나 문서가 다른 위치로 이동하면 해당 IRI도 변경됩니다. 이를 방지하기 위해 문서의 context에서 @base 매핑을 정의하여 문서의 base IRI를 덮어쓸 수 있습니다.

@basenull로 설정하면 상대 IRI 참조가 IRI로 확장되는 것을 방지합니다.

참고로 외부 컨텍스트에서는 @base가 무시된다는 점에 유의하십시오.

4.1.4 문서 기반을 기본 어휘로 사용하기

이 절은 비규범적입니다.

어떤 경우에는 어휘 용어들이 외부 어휘가 아니라 문서 자체 내에 직접 정의되기도 합니다. JSON-LD 1.1부터는 local contextvocabulary mapping상대 IRI 참조로 설정할 수 있으며, 이는 범위에 vocabulary mapping이 없을 경우 base IRI를 기준으로 해석됩니다. 이로 인해 어휘를 기준으로 확장되는 용어들(예: node object의 키들)은 base IRI를 바탕으로 IRI를 생성하게 됩니다.

Example 29: "#"을 어휘 매핑으로 사용하기
{
  "@context": {
    "@version": 1.1,
    "@base": "http://example/document",
    "@vocab": "#"
  },
  "@id": "http://example.org/places#BrewEats",
  "@type": "Restaurant",
  "name": "Brew Eats"
  ...
}

이 문서가 http://example/document에 위치한다면 다음과 같이 확장됩니다:

4.1.5 Compact IRIs

이 절은 비규범적입니다.

compact IRIprefixsuffix를 콜론(:)으로 구분하여 IRI를 표현하는 방법입니다. prefixterm으로서 active context에서 가져오며, JSON-LD 문서에서 특정한 IRI를 식별하는 짧은 문자열입니다. 예를 들어 foaf 접두사는 Friend-of-a-Friend 어휘의 약어로 사용될 수 있으며, 이 어휘는 IRI http://xmlns.com/foaf/0.1/로 식별됩니다. 개발자는 접두사 끝에 FOAF 어휘의 용어를 덧붙여 해당 어휘 용어의 짧은 형태 IRI를 나타낼 수 있습니다. 예를 들어 foaf:namehttp://xmlns.com/foaf/0.1/name으로 확장됩니다.

위 예제에서 foaf:nameIRI http://xmlns.com/foaf/0.1/name으로, foaf:Personhttp://xmlns.com/foaf/0.1/Person으로 확장됩니다.

Prefixes는 값의 형태가 prefix:suffix 조합으로 표현된 compact IRI일 때, 그 prefixterm로 active context에 정의되어 있고 suffix가 두 개의 슬래시(//)로 시작하지 않을 경우 확장됩니다. compact IRIprefix에 매핑된 IRI와 (비어있을 수도 있는) suffix를 연결하여 확장됩니다. 만약 prefix가 active context에 정의되어 있지 않거나 suffix가 두 개의 슬래시로 시작하면(예: http://example.com과 같이), 해당 값은 대신 IRI로 해석됩니다. 접두사가 밑줄(_)인 경우에는 blank node identifier로 해석됩니다.

컨텍스트 내에서도 compact IRI를 사용할 수 있습니다. 다음 예제를 보십시오:

JSON-LD 1.0 호환성용 processing mode을 명시적으로 사용하면, 용어들은 compacting 시에 간단한 term 정의(simple term definition)의 값이 URI의 gen-delim 문자(예: /, # 등)로 끝나는 경우에만 compact IRI 접두사로 선택될 수 있습니다.

JSON-LD 1.1에서는, 값이 URI gen-delim 문자로 끝나는 simple term definition이거나 해당 expanded term definition이 @prefix 항목을 가지고 값이 true로 설정되어 있는 경우에만 용어가 compact IRI 접두사로 선택될 수 있습니다. 만약 simple term definition이 gen-delim 문자로 끝나지 않거나 expanded term definition에서 @prefixfalse로 설정되어 있으면, 그 용어는 compact IRI 확장이나 IRI를 compact IRI로 축약하는 데 사용되지 않습니다.

참고

1.0 프로세서의 용어 선택 동작은 JSON-LD 1.0에 대한 정정(errata)으로 인해 변경되었습니다. 이는 기존 JSON-LD 문서를 처리하는 동작에는 영향을 주지 않지만 Compact IRI를 사용해 문서를 compact할 때 약간의 차이를 만듭니다.

compacting 동작은 다음의 expanded 형태 입력 문서를 고려하여 설명할 수 있습니다:

Example 33: compact IRI 생성 예시로 사용되는 확장 문서
[{
  "http://example.com/vocab/property": [{"@value": "property"}],
  "http://example.com/vocab/propertyOne": [{"@value": "propertyOne"}]
}]

다음 컨텍스트를 1.0 processing mode에서 사용하면, 원래보다 vocab 용어가 선택되어 property보다 우선하게 됩니다(비록 property에 연결된 IRI가 원래 IRI를 더 많이 포착하더라도).

Example 34: Compact IRI 생성 컨텍스트 (1.0)
{
  "@context": {
    "vocab": "http://example.com/vocab/",
    "property": "http://example.com/vocab/property"
  }
}

위의 expanded 입력 문서를 이전 컨텍스트로 compact하면 다음과 같은 compacted 결과가 생성됩니다:

원래의 [JSON-LD10]에서는 용어 선택 알고리즘이 property를 선택하여 Compact IRI property:One을 생성했었습니다. 원래 동작은 @prefix를 사용하여 명시적으로 지정할 수 있습니다:

Example 36: Compact IRI 생성 컨텍스트 (1.1)
{
  "@context": {
    "@version": 1.1,
    "vocab": "http://example.com/vocab/",
    "property": {
      "@id": "http://example.com/vocab/property",
      "@prefix": true
    }
  }
}

이 경우, property 용어는 expanded term definition으로 정의되어 있고 그 @id가 gen-delim 문자로 끝나지 않으므로 보통 접두사로 사용될 수 없습니다. 그러나 "@prefix": true를 추가하면 property:One과 같은 compact IRI의 접두사 부분으로 사용할 수 있게 됩니다.

4.1.6 키워드 별칭

이 절은 비규범적입니다.

JSON-LD의 각 키워드@context를 제외하고 애플리케이션별 키워드로 별칭(alias)을 지정할 수 있습니다. 이 기능을 통해 기존 레거시 JSON 문서에 이미 존재하는 JSON 키를 재사용하여 JSON-LD로 활용할 수 있습니다. 또한 개발자가 JSON-LD의 context만으로 도메인별 구현을 설계할 수 있게 합니다.

위 예제에서 @id@type 키워드는 각각 urla라는 별칭이 지정되었습니다.

@type의 경우를 제외하고, 용어가 키워드인 확장된 용어 정의의 속성들은 오류를 초래합니다. 처리 모드(processing mode)가 json-ld-1.0으로 설정되지 않은 경우에는 @type에 대한 예외도 있습니다; 자세한 내용과 사용 예시는 § 4.3.3 @type@set 사용를 참조하십시오.

처리 모드가 json-ld-1.0으로 설정되지 않은 한, 키워드의 별칭은 simple term definition으로서 값이 키워드인 경우이거나, expanded term definition으로서 @id 항목과 선택적으로 @protected 항목만을 가질 수 있습니다; 다른 항목은 허용되지 않습니다. 위에서 언급한 바와 같이 @type 별칭에 대해서는 예외가 있습니다. @protected 사용에 대한 자세한 내용은 § 4.1.11 보호된 용어 정의를 참조하십시오.

키워드는 재정의될 수 없으므로 다른 키워드로 별칭을 지정할 수도 없습니다.

참고

별칭이 지정된 키워드는 그 context 내에서 사용될 수 없습니다.

모든 키워드의 규범적 정의는 § 9.16 키워드를 참조하십시오.

4.1.7 IRI의 컨텍스트 내 확장

이 절은 비규범적입니다.

일반적으로 IRI 확장 규칙은 IRI가 기대되는 모든 위치에 적용됩니다(자세한 내용은 § 3.2 IRIs 참조). context 정의 내에서는, 컨텍스트 내에 정의된 용어들이 순환 의존성이 없을 경우 해당 컨텍스트 내에서 사용할 수 있습니다. 예를 들어, 타입화된 값을 정의할 때 xsd 네임스페이스를 사용하는 것이 일반적입니다:

예제 39: 컨텍스트 내에서의 IRI 확장
{
  "@context": {
    "xsd": "http://www.w3.org/2001/XMLSchema#",
    "name": "http://xmlns.com/foaf/0.1/name",
    "age": {
      "@id": "http://xmlns.com/foaf/0.1/age",
      "@type": "xsd:integer"
    },
    "homepage": {
      "@id": "http://xmlns.com/foaf/0.1/homepage",
      "@type": "@id"
    }
  },
  ...
}

이 예에서 xsd 용어는 정의되어 있으며 age 속성의 @type 강제 변환(coercion)에서 접두사로 사용됩니다.

용어는 다른 용어의 IRI를 정의할 때에도 사용될 수 있습니다:

예제 40: 컨텍스트 내에서 다른 용어의 IRI를 정의하기 위해 용어 사용
{
  "@context": {
    "foaf": "http://xmlns.com/foaf/0.1/",
    "xsd": "http://www.w3.org/2001/XMLSchema#",
    "name": "foaf:name",
    "age": {
      "@id": "foaf:age",
      "@type": "xsd:integer"
    },
    "homepage": {
      "@id": "foaf:homepage",
      "@type": "@id"
    }
  },
  ...
}

Compact IRI와 일반 IRI는 용어 정의의 좌측(키) 위치에서도 사용될 수 있습니다.

예제 41: 용어로서의 compact IRI 사용
{
  "@context": {
    "foaf": "http://xmlns.com/foaf/0.1/",
    "xsd": "http://www.w3.org/2001/XMLSchema#",
    "name": "foaf:name",
    "foaf:age": {
      "@id": "http://xmlns.com/foaf/0.1/age",
      "@type": "xsd:integer"
    },
    "foaf:homepage": {
      "@type": "@id"
    }
  },
  ...
}

이 예제에서 compact IRI 형태는 두 가지 다른 방식으로 사용됩니다. 첫 번째 방식에서는 foaf:age가 용어의 IRI(짧은 형태)와 해당 용어에 연관된 @type을 모두 선언합니다. 두 번째 방식에서는 용어에 연관된 @type만 지정합니다. foaf:homepage의 전체 IRI는 컨텍스트에서 foaf 접두사를 찾아 결정됩니다.

경고

만약 compact IRI가 용어로 사용된다면, 그것은 해당 compact IRI가 단독으로 확장되었을 때의 값과 동일하게 확장되어야 합니다. 이는 원래 1.0 알고리즘과의 변경사항으로, 용어가 서로 다른 IRI로 확장되는 것을 방지하여 원치 않는 결과를 초래하지 않도록 합니다.

예제 42: compact IRI를 다른 IRI에 불법적으로 별칭 지정한 예
{
  "@context": {
    "foaf": "http://xmlns.com/foaf/0.1/",
    "xsd": "http://www.w3.org/2001/XMLSchema#",
    "name": "foaf:name",
    "foaf:age": {
      "@id": "http://xmlns.com/foaf/0.1/age",
      "@type": "xsd:integer"
    },
    "foaf:homepage": {
     "@id": "http://schema.org/url",
     "@type": "@id"
    }
  },
  ...
}

IRI는 컨텍스트의 키 위치에서도 사용할 수 있습니다:

예제 43: IRI에 컨텍스트 정의 연결하기
{
  "@context": {
    "foaf": "http://xmlns.com/foaf/0.1/",
    "xsd": "http://www.w3.org/2001/XMLSchema#",
    "name": "foaf:name",
    "foaf:age": {
      "@id": "http://xmlns.com/foaf/0.1/age",
      "@type": "xsd:integer"
    },
    "http://xmlns.com/foaf/0.1/homepage": {
      "@type": "@id"
    }
  },
  ...
}

위와 일치하려면 해당 IRI가 JSON-LD 문서 내에서 사용되어야 합니다. 또한 foaf:homepage{ "@type": "@id" } 선언을 사용하지 않는데, 그 이유는 foaf:homepagehttp://xmlns.com/foaf/0.1/homepage와 동일하지 않기 때문입니다. 즉, 용어는 컨텍스트에서 접두사 조회 메커니즘이 적용되기 전 직접 문자열 비교로 먼저 조회됩니다.

경고

IRI 참조나 compact IRI가 임의의 다른 관련 없는 IRI로 확장되는 것은 허용되지 않습니다. 이는 1.0 알고리즘에서 허용되었지만 권장되지 않았던 동작을 변경한 것입니다.

컨텍스트에서 용어를 사용하는 데 있어 유일한 다른 예외는 순환 정의가 허용되지 않는다는 것입니다. 즉, term1의 정의가 term2에 의존하고 term2term1에 의존하는 경우는 허용되지 않습니다. 예를 들어 다음과 같은 컨텍스트 정의는 불법입니다:

예제 44: 컨텍스트 내 용어의 불법적 순환 정의
{
  "@context": {
    "term1": "term2:foo",
    "term2": "term1:bar"
  },
  ...
}

4.1.8 스코프된 컨텍스트

이 절은 비규범적입니다.

확장된 용어 정의(expanded term definition)는 @context 속성을 포함할 수 있으며, 이는 해당 용어로 정의된 속성의 값들에 대한 컨텍스트(이를 스코프된 컨텍스트라고 함)를 정의합니다. 속성에 대해 사용될 때 이를 property-scoped context라고 합니다. 이를 통해 값들이 해당 노드 객체가 포함된 컨텍스트와는 다른 용어 정의, base IRI, vocabulary 매핑 또는 기본 언어를 사용할 수 있게 하며, 이는 값 자체에 컨텍스트가 지정된 것처럼 동작합니다.

이 경우 소셜 프로필은 schema.org 어휘를 사용하여 정의되지만, interest는 FOAF에서 가져와 Manu의 관심사 중 하나를 설명하는 노드를 정의하는 데 사용됩니다. 해당 노드의 속성들은 이제 FOAF 어휘에서 옵니다.

이 문서를 확장할 때 외부 컨텍스트에서 정의된 용어들과 해당 용어에 대해 특별히 정의된 property-scoped context에 정의된 용어들을 조합하여 사용합니다.

스코핑은 @type의 값으로 사용된 용어를 이용하여 수행될 수도 있습니다:

@type에 대한 스코핑은 서로 다른 타입의 항목들을 연결하는 공통 속성들이 사용될 때 유용합니다. 예를 들어 hasPart/partOf는 문서 내에서 일반적으로 사용되는 용어일 수 있지만, 컨텍스트에 따라 의미가 달라질 수 있습니다. type-scoped context는 해당 타입이 사용된 노드 객체에만 적용되며, 다른 노드 객체로 이동할 때는 이전의 인-스코프 컨텍스트들이 다시 적용됩니다. 이 동작은 § 4.1.9 컨텍스트 전파에서 설명된 바와 같이 @propagate 키워드로 제어할 수 있습니다.

참고

노드 객체 내에서 도입된 모든 property-scoped 또는 로컬 컨텍스트는 다른 노드 객체로 이동할 때에도 여전히 유효합니다.

확장 시 @type의 각 값은 (사전순으로 정렬되어) 고려되며, 해당 값이 활성 컨텍스트의 용어이고 자체적인 type-scoped context를 가지고 있다면 그 스코프된 컨텍스트가 활성 컨텍스트에 적용됩니다.

참고

@type의 값들은 순서가 없으므로, 여러 타입이 나열된 경우 적용되는 type-scoped context들의 순서는 사전 순(lexicographical ordering)에 따라 결정됩니다.

예를 들어 다음의 의미적으로 동등한 예제를 고려하십시오. 첫 번째 예제는 속성과 타입이 자체적인 스코프된 컨텍스트를 정의하여 확장 시 포함되는 방법을 보여줍니다.

예제 47: 임베디드 및 스코프된 컨텍스트를 사용한 확장
{
  "@context": {
    "@version": 1.1,
    "@vocab": "http://example.com/vocab/",
    "property": {
      "@id": "http://example.com/vocab/property",
      "@context": {
        "term1": "http://example.com/vocab/term1"
         ↑ "property"에 대한 스코프된 컨텍스트가 term1을 정의합니다
      }
    },
    "Type1": {
      "@id": "http://example.com/vocab/Type1",
      "@context": {
        "term3": "http://example.com/vocab/term3"
         ↑ "Type1"에 대한 스코프된 컨텍스트가 term3을 정의합니다
      }
    },
    "Type2": {
      "@id": "http://example.com/vocab/Type2",
      "@context": {
        "term4": "http://example.com/vocab/term4"
         ↑ "Type2"에 대한 스코프된 컨텍스트가 term4를 정의합니다
      }
    }
  },
  "property": {
    "@context": {
      "term2": "http://example.com/vocab/term2"
         ↑ 임베디드 컨텍스트가 term2를 정의합니다
    },
    "@type": ["Type2", "Type1"],
    "term1": "a",
    "term2": "b",
    "term3": "c",
    "term4": "d"
  }
}

컨텍스트는 정의된 방식에 따라 처리됩니다. property-scoped context가 먼저 처리되고, 그 다음에 임베디드 컨텍스트가 처리되며, 마지막으로 적절한 순서로 type-scoped context들이 처리됩니다. 이전 예제는 다음과 논리적으로 동등합니다:

예제 48: 임베디드 및 스코프된 컨텍스트를 사용한 확장 (임베딩 동등)
{
  "@context": {
    "@vocab": "http://example.com/vocab/",
    "property": "http://example.com/vocab/property",
    "Type1": "http://example.com/vocab/Type1",
    "Type2": "http://example.com/vocab/Type2"
  },
  "property": {
    "@context": [{
        "term1": "http://example.com/vocab/term1"
         ↑ 이전에 "property"에 대해 스코프된 컨텍스트가 term1을 정의했습니다
      }, {
        "term2": "http://example.com/vocab/term2"
         ↑ 임베디드 컨텍스트가 term2를 정의합니다
      }, {
        "term3": "http://example.com/vocab/term3"
         ↑ 이전에 "Type1"에 대해 스코프된 컨텍스트가 term3을 정의했습니다
      }, {
      "term4": "http://example.com/vocab/term4"
         ↑ 이전에 "Type2"에 대해 스코프된 컨텍스트가 term4를 정의했습니다
    }],
    "@type": ["Type2", "Type1"],
    "term1": "a",
    "term2": "b",
    "term3": "c",
    "term4": "d"
  }
}
참고

만약 어떤 용어가 스코프된 컨텍스트를 정의하고, 그 용어가 나중에 재정의되면, 이전 확장된 용어 정의에서 정의된 컨텍스트와의 연관은 해당 재정의의 범위 내에서 사라집니다. 이는 앞서 설명한 대로 더 얕은 중첩 정의에서의 용어 정의가 이전 정의를 덮어쓰는 동작과 일치합니다(자세한 내용은 § 4.1 고급 컨텍스트 사용 참조).

참고

스코프된 컨텍스트는 JSON-LD 1.1의 새로운 기능입니다.

4.1.9 컨텍스트 전파

이 절은 비규범적입니다.

한 번 도입된 컨텍스트는 이후의 컨텍스트@contextnull로 설정하거나 용어를 재정의하여 제거하지 않는 한 계속 유효합니다. 다만, 해당 컨텍스트의 영향을 해당 노드 객체가 진입될 때까지만으로 제한하는 타입-스코프 컨텍스트의 예외가 있습니다. 이 동작은 @propagate 키워드를 사용하여 변경할 수 있습니다.

다음 예제는 @propagatefalse로 설정된 컨텍스트에서 정의된 용어들이 새로운 노드 객체로 내려갈 때 실질적으로 제거되는 방법을 보여줍니다.

참고

배열로 포함된 컨텍스트들은 롤백(rollback)이 정의되는 방식 때문에 @propagate에 대해 모두 동일한 값을 가져야 합니다. (참조: JSON-LD 1.1 Processing Algorithms and API)

4.1.10 가져온 컨텍스트

이 절은 비규범적입니다.

JSON-LD 1.0에는 적용 중인 컨텍스트를 수정하는 메커니즘이 포함되어 있었습니다. 이는 원격 컨텍스트를 로드하여 처리한 뒤, 새 컨텍스트를 통해 추가 변경을 적용하는 기능을 포함했습니다.

그러나 JSON-LD 1.1의 도입으로 기존의 JSON-LD 1.0 컨텍스트를 로드하여 처리 전에 JSON-LD 1.1 기능을 적용할 수 있기를 원합니다.

@import 키워드를 컨텍스트에 사용하면, 다른 원격 컨텍스트(가져온 컨텍스트)를 로드하여 처리 전에 수정할 수 있습니다. 이러한 수정을 포함하는 컨텍스트는 래핑(wrapping) 컨텍스트라고 합니다. 가져온 컨텍스트가 로드되면 래핑 컨텍스트의 내용이 처리 전에 병합됩니다. 병합 작업은 래핑 컨텍스트의 각 키-값 쌍을 로드된 가져온 컨텍스트에 추가하며, 래핑 컨텍스트의 키-값 쌍이 우선권을 가집니다.

가져온 컨텍스트를 재사용하고 처리 전에 인라인으로 편집할 수 있게 하면, 컨텍스트 전체의 키워드를 적용하여 가져온 컨텍스트의 모든 용어 정의를 조정할 수 있습니다. 마찬가지로 용어 정의를 처리 전에 대체하여, 예를 들어 보호된 용어와 일치하도록 하거나 추가적인 타입 강제 정보를 포함하도록 조정할 수 있습니다.

다음 예제들은 @import를 사용해 가져온 컨텍스트를 로드하고 @propagatetrue로 설정하는 방식으로 타입-스코프 컨텍스트를 표현하는 방법을 보여줍니다.

예를 들어 URL https://json-ld.org/contexts/remote-context.jsonld로 원격에서 참조할 수 있는 컨텍스트가 있다고 가정합시다:

Example 50: 타입-스코프 컨텍스트에서 가져올 원격 컨텍스트
{
  "@context": {
    "Type1": "http://example.com/vocab/Type1",
    "Type2": "http://example.com/vocab/Type2",
    "term1": "http://example.com/vocab#term1",
    "term2": "http://example.com/vocab#term2",
    ...
  }
}

래핑 컨텍스트는 이를 소스로 삼아 수정하는 데 사용할 수 있습니다:

Example 51: 타입-스코프 컨텍스트에서 컨텍스트 소싱 및 전파 설정
{
  "@context": {
    "@version": 1.1,
    "MyType": {
      "@id": "http://example.com/vocab#MyType",
      "@context": {
        "@version": 1.1,
        "@import": "https://json-ld.org/contexts/remote-context.jsonld",
        "@propagate": true
      }
    }
  }
}

그 효과는 가져온 전체 컨텍스트타입-스코프 컨텍스트에 복사된 것과 같습니다:

Example 52: 타입-스코프 컨텍스트에서 컨텍스트 소싱 후 전파로 설정한 결과
{
  "@context": {
    "@version": 1.1,
    "MyType": {
      "@id": "http://example.com/vocab#MyType",
      "@context": {
        "@version": 1.1,
        "Type1": "http://example.com/vocab/Type1",
        "Type2": "http://example.com/vocab/Type2",
        "term1": "http://example.com/vocab#term1",
        "term2": "http://example.com/vocab#term2",
        ...
        "@propagate": true
      }
    }
  }
}

마찬가지로 래핑 컨텍스트는 용어 정의를 대체하거나 가져온 컨텍스트의 용어 정의가 처리되는 방식을 변경할 수 있는 다른 컨텍스트-전역 키워드를 설정할 수 있습니다:

Example 53: @vocab와 용어 정의를 수정하기 위해 컨텍스트 소싱하기
{
  "@context": {
    "@version": 1.1,
    "@import": "https://json-ld.org/contexts/remote-context.jsonld",
    "@vocab": "http://example.org/vocab#",
     ↑ 이는 처리 전에 이전의 @vocab 정의를 대체합니다
    "term1": {
      "@id": "http://example.org/vocab#term1",
      "@type": "http://www.w3.org/2001/XMLSchema#integer"
    }
     ↑ 이는 처리 전에 이전 term1 정의를 대체합니다
  }
}

다시 말해, 이는 전체 가져온 컨텍스트가 해당 컨텍스트에 복사된 것과 동일한 효과를 냅니다:

Example 54: @vocab와 용어 정의를 수정하기 위한 컨텍스트 소싱의 결과
{
  "@context": {
    "@version": 1.1,
    "Type1": "http://example.com/vocab/Type1",
    "Type2": "http://example.com/vocab/Type2",
    "term1": {
      "@id": "http://example.org/vocab#term1",
      "@type": "http://www.w3.org/2001/XMLSchema#integer"
    },
     ↑ 주의: term1이 처리 전에 대체되었습니다
    "term2": "http://example.com/vocab#term2",
    ...,
    "@vocab": "http://example.org/vocab#"
  }
}

가져온 컨텍스트를 로드한 결과는 컨텍스트 정의여야 하며, IRI나 배열이 되어서는 안 됩니다. 또한 가져온 컨텍스트는 @import 항목을 포함할 수 없습니다.

4.1.11 보호된 용어 정의

이 절은 비규범적입니다.

JSON-LD는 많은 명세에서 지정된 데이터 형식으로 사용됩니다. 그러나 일부 JSON-LD 내용을 아무런 JSON-LD 알고리즘을 사용하지 않고 일반 JSON으로 처리하도록 허용하려는 요구도 있습니다. JSON-LD는 매우 유연하기 때문에, 일부 원래 형식의 용어들은 임베디드 컨텍스트를 통해 지역적으로 재정의되어 JSON-LD 기반 구현에서 다른 의미를 가질 수 있습니다. 반면에 "일반 JSON" 구현은 이러한 임베디드 컨텍스트를 해석할 수 없을 수 있어, 해당 용어들을 원래 의미로 계속 해석할 수 있습니다. 이러한 해석의 분기를 방지하기 위해 JSON-LD 1.1은 용어 정의를 보호(protected)할 수 있도록 허용합니다.

보호된 용어 정의항목 @protectedtrue로 설정된 용어 정의입니다. 이는 일반적으로 해당 용어 정의가 이후의 컨텍스트들에 의해 덮어써지는 것을 방지합니다. 동일한 용어의 새 정의나 "@context": null으로 컨텍스트를 제거하려는 시도는 오류를 발생시키고 처리를 중단합니다 (다만 아래 특정 상황에서 예외가 있습니다).

Example 55: 보호된 용어 정의는 일반적으로 재정의할 수 없습니다
{
  "@context": [
    {
      "@version": 1.1,
      "Person": "http://xmlns.com/foaf/0.1/Person",
      "knows": "http://xmlns.com/foaf/0.1/knows",
      "name": {
        "@id": "http://xmlns.com/foaf/0.1/name",
        "@protected": true
      }
    },
    {
      – 이 시도는 오류를 일으키며 실패할 것입니다
      "name": "http://schema.org/name"
    }
  ],
  "@type": "Person",
  "name": "Manu Sporny",
  "knows": {
    "@context": [
      – 이 시도도 오류로 실패할 것입니다
      null,
      "http://schema.org/"
    ],
    "name": "Gregg Kellogg"
  }
}

컨텍스트의 거의 모든 용어 정의를 보호해야 하는 경우, 컨텍스트 자체에 항목 @protectedtrue로 추가할 수 있습니다. 이는 각 용어 정의를 개별적으로 보호하는 것과 동일한 효과를 가집니다. 일부 용어 정의에서 @protectedfalse로 설정하여 예외를 둘 수도 있습니다.

보호된 용어는 일반적으로 재정의할 수 없지만, 이 규칙에는 두 가지 예외가 있습니다. 첫 번째 예외는 새 정의가 보호된 용어 정의와 동일한 경우입니다 (@protected 플래그를 제외하고). 이 경우 새 정의는 보호를 위반하지 않으므로 허용됩니다. 이는 여러 컨텍스트에서 (보호된 형태를 포함해) 발생할 수 있는 @typetype으로 별칭하는 것과 같은 널리 쓰이는 용어 정의에 유용합니다.

두 번째 예외는 속성-스코프 컨텍스트가 보호의 영향을 받지 않으므로, 보호된 용어를 새 용어 정의로 재정의하거나 "@context": null으로 컨텍스트를 지워 재정의할 수 있다는 점입니다.

그 이유는 "일반 JSON" 구현은 주어진 명세에 따라 정의된 속성만을 순회하기 때문에, 명세에 속한 속성에 대한 스코프된 컨텍스트는 명세의 일부로 간주되어 "일반 JSON" 구현도 그 의미 변경을 인지할 것으로 기대되기 때문입니다. 다른 속성에 속한 스코프된 컨텍스트는 "일반 JSON" 구현이 무시할 문서 부분에 적용되므로, JSON-LD 인지 구현과 "일반 JSON" 구현 간의 해석 분기가 발생하지 않습니다. 따라서 재정의가 허용됩니다.

참고

용어의 재정의를 금지함으로써 보호는 또한 해당 용어의 적응(예: 더 정확한 데이터 타입 정의, 용어의 리스트 사용 제한 등)을 방해합니다. 이러한 적응은 일부 범용 컨텍스트에서 빈번하게 발생하므로, 보호 기능은 그 사용성을 저해할 수 있습니다. 따라서 컨텍스트 발행자는 이 기능을 신중히 사용해야 합니다.

참고

보호된 용어 정의는 JSON-LD 1.1의 새로운 기능입니다.

4.2 값 설명

이 절은 비규범적입니다.

값은 문자열, 날짜, 시간 등과 같은 스칼라 값과 연관된 그래프의 리프 노드입니다. (strings, 날짜, 시간 등)

4.2.1 타입화된 값

이 절은 비규범적입니다.

값에 연관된 타입(즉 typed value)은 값의 타입을 나타내는 IRI와 값을 연관시켜 표시합니다. JSON-LD에서 타입화된 값은 세 가지 방식으로 표현될 수 있습니다:

  1. @context 섹션에서 @type 키워드를 사용하여 term에 타입을 지정하는 방법.
  2. 값 객체(value object)를 사용하는 방법.
  3. 원시 JSON 타입(예: number, true, false)을 사용하는 방법.

첫 번째 예제는 @context에서 특정 term과 타입을 연관시키기 위해 @type 키워드를 사용하는 예입니다:

위의 modified 키 값은 @context에 지정된 정보 때문에 자동으로 dateTime 값으로 해석됩니다. 예제 탭은 JSON-LD 프로세서가 데이터를 어떻게 해석하는지를 보여줍니다.

두 번째 예제는 문서 본문에서 타입 정보를 설정하는 확장된 형식을 사용한 예입니다:

위 두 예제는 모두 값 2010-05-29T14:17:39+02:00에 대해 타입 http://www.w3.org/2001/XMLSchema#dateTime을 생성합니다. 또한 타입 값으로 term이나 compact IRI를 사용하는 것도 가능하다는 점에 유의하십시오.

참고

@type 키워드는 또한 노드에 타입을 연결하는 데 사용됩니다. 노드 타입값 타입의 개념은 구별됩니다. 노드에 타입을 추가하는 방법에 대해서는 § 3.5 타입 지정을 참조하십시오.

참고

확장 시, 용어 정의 내에 정의된 @type문자열 값을 연관시켜 확장된 값 객체를 생성할 수 있습니다(자세한 내용은 § 4.2.3 타입 강제 참조). 타입 강제는 문자열 값에 대해서만 적용되며, 확장된 형태의 맵(예: 노드 객체나 값 객체)에는 적용되지 않습니다.

노드 타입은 사람, 장소, 이벤트, 웹 페이지 등 설명되는 대상의 종류를 지정합니다. 값 타입은 특정 값의 데이터 타입(예: 정수, 부동소수점, 날짜 등)을 지정합니다.

Example 61: @type의 컨텍스트 민감성 예시
{
  ...
  "@id": "http://example.org/posts#TripToWestVirginia",
  "@type": "http://schema.org/BlogPosting",  ← 이것은 노드 타입입니다
  "http://purl.org/dc/terms/modified": {
    "@value": "2010-05-29T14:17:39+02:00",
    "@type": "http://www.w3.org/2001/XMLSchema#dateTime"  ← 이것은 값 타입입니다
  }
  ...
}

첫 번째 @type의 사용은 노드 타입 (http://schema.org/BlogPosting)을 노드에 연결합니다(이는 @id 키워드로 표현됨). 두 번째 @type의 사용은 값 타입 (http://www.w3.org/2001/XMLSchema#dateTime)을 @value 키워드로 표현된 값에 연결합니다. 일반 규칙으로, @value@type이 동일한 맵에 사용되면, 그 @type값 타입을 나타냅니다. 그렇지 않으면 @type노드 타입을 나타냅니다. 위 예제는 다음 데이터를 표현합니다:

4.2.2 JSON 리터럴

이 절은 비규범적입니다.

때때로 JSON-LD 안에 JSON 그 자체이지만 JSON-LD로 해석되지 않아야 하는 데이터를 포함시키는 것이 유용할 수 있습니다. 일반적으로 JSON-LD 프로세서는 IRI로 매핑되지 않는 속성들을 무시하지만, 이는 알고리즘적 변환을 수행할 때 해당 데이터가 제외되는 결과를 낳습니다. 그러나 기술되는 데이터 자체가 JSON일 경우, 알고리즘적 변환 후에도 데이터가 유지되는 것이 중요합니다.

경고

JSON-LD는 context를 사용하여 네이티브 JSON을 해석하도록 허용하는 것을 목표로 합니다. JSON 리터럴의 사용은 해석할 수 없는 데이터 블롭을 생성합니다. 이는 JSON을 JSON-LD로 표현할 수 없는 드문 경우에만 사용되어야 합니다.

용어가 @type@json으로 정의하면, JSON-LD 프로세서는 해당 값을 더 이상 JSON-LD로 해석하지 않고 JSON 리터럴로 취급합니다. 확장된 문서 형식에서는 이러한 JSON이 "@type": "@json"을 가진 값 객체@value가 됩니다.

RDF로 변환할 때, JSON 리터럴은 JSON의 특정 직렬화에 기반한 렉시컬 형태를 가지며, 이는 JSON-LD11-API의 Compaction 알고리즘과 JSON 데이터타입에 설명되어 있습니다.

다음 예제는 속성의 값으로 포함된 JSON 리터럴의 예를 보여줍니다. RDF 결과는 상호운용성을 위해 JSON의 정규화된 형태를 사용한다는 점에 유의하십시오. JSON 정규화는 JSON-LD11-API의 Data Round Tripping에 설명되어 있습니다.

참고

일반적으로 JSON-LD 프로세서는 null을 만나면 관련 항목이나 값을 제거합니다. 그러나 null은 유효한 JSON 토큰이며, JSON 리터럴의 값으로 사용될 경우 보존됩니다.

4.2.3 타입 강제(Type Coercion)

이 절은 비규범적입니다.

JSON-LD는 문자열 값을 특정 데이터 타입으로 강제(coerce)하는 것을 지원합니다. 타입 강제를 사용하면 JSON-LD를 배포하는 사람이 문자열 속성 값을 사용하고, 확장된 값 객체 표현에서 값과 연관된 IRI를 통해 그 값이 타입화된 값으로 해석되게 할 수 있습니다. 타입 강제를 사용하면 데이터 타입을 각 데이터 항목마다 명시적으로 지정하지 않고도 문자열 표현을 사용할 수 있습니다.

타입 강제는 확장된 용어 정의 내에서 @type 키로 지정됩니다. 이 키의 값은 IRI로 확장됩니다. 또는 값으로 @id@vocab 키워드를 사용하여 문서 본문 내에서 문자열 값이 @id 또는 @vocab으로 강제될 때 이를 IRI로 해석하도록 할 수 있습니다. @id@vocab의 차이는 값이 IRI로 확장되는 방식입니다. @vocab는 먼저 값을 용어로 확장하려 시도하고, 활성 컨텍스트에 해당 용어가 없으면 콜론이 있으면 IRI/compact IRI로 확장합니다; 그렇지 않으면 활성 컨텍스트의 vocabulary 매핑을 사용해 확장합니다. 반면 @id로 강제된 값은 콜론이 있으면 IRI 또는 compact IRI로 확장되고, 그렇지 않으면 문서 상대(relative) IRI 참조로 해석됩니다.

참고

용어 정의로 값을 강제하는 기능은 노드 객체에 타입을 설정하는 것과는 구별됩니다. 전자는 그래프에 새로운 데이터를 추가하지 않지만, 후자는 노드 타입을 추가적인 관계로 관리합니다.

용어compact IRI@type의 값으로 사용할 때, 해당 용어들은 동일한 컨텍스트 내에 정의될 수 있습니다. 따라서 xsd 같은 용어를 지정한 다음 같은 컨텍스트에서 xsd:integer를 사용할 수 있습니다.

다음 예제는 JSON-LD 작성자가 값을 타입화된 값이나 IRI로 강제하는 방법을 보여줍니다.

용어는 확장 시 키와 같은 어휘 상대 위치(vocabulary-relative positions)에서만 사용된다는 점이 중요합니다. @id의 값은 문서 상대(document-relative)로 간주되며, 확장에서 용어 정의를 사용하지 않습니다. 예를 들어 다음을 고려하십시오:

예상치 못한 결과는 "barney"가 만나는 위치에 따라 http://example1.com/barneyhttp://example2.com/barney로 각각 확장된다는 점입니다. 용어 정의 때문에 문자열 값이 IRI로 해석되는 경우, 대개 문서 상대(document-relative)로 간주됩니다. 어떤 경우에는 "@type": "@vocab"로 지정된 어휘 상대(vocabulary-relative)로 해석하는 것이 타당할 수 있으며, 이로 인해 위와 같은 예상치 못한 결과가 발생할 수 있습니다.

위 예제에서 "barney"는 한 번은 항상 문서 상대로 해석되는 @id의 값으로, 다른 한 번은 어휘 상대로 정의된 "fred"의 값으로 나타납니다. 따라서 확장된 값이 달라집니다.

자세한 내용은 § 4.1.2 기본 어휘를 참조하십시오.

이전 예제의 변형으로 "@type": "@id"를 사용하면 "barney"를 문서 상대로 해석하는 동작을 보여줍니다:

참고

삼중 ex1:fred ex2:knows ex1:barney .는 두 번 방출되지만 출력 데이터셋에서는 중복 삼중으로서 한 번만 존재합니다.

용어는 IRIs나 compact IRI로 정의될 수도 있습니다. 이는 단순 용어로 표현되지 않은 키들에도 강제 규칙을 적용할 수 있게 합니다. 예를 들어:

이 경우 용어 정의에 있는 @id 정의는 선택 사항입니다. 만약 존재한다면, 용어를 표현하는 IRI 또는 compact IRI는 접두사가 정의되어 있든 없든 관계없이 항상 @id 키로 정의된 IRI로 확장됩니다.

타입 강제는 항상 키의 비확장(unexpanded) 값을 사용하여 수행됩니다. 따라서 위 예제에서는 타입 강제가 활성 컨텍스트에서 foaf:age를 찾는 방식으로 수행되며, 확장된 IRI http://xmlns.com/foaf/0.1/age를 찾는 것은 아닙니다.

참고

컨텍스트의 키들은 확장 및 값 강제 목적을 위해 용어로 취급됩니다. 때때로 이는 동일한 확장된 IRI에 대해 여러 표현을 초래할 수 있습니다. 예를 들어 dogcat을 모두 http://example.com/vocab#animal로 확장하도록 지정할 수 있습니다. 이는 서로 다른 타입 강제나 언어 규칙을 설정하는 데 유용할 수 있습니다.

4.2.4 문자열 국제화

이 절은 비규범적입니다.

때로는 문자열에 언어를 주석으로 달아야 할 필요가 있습니다. JSON-LD에서는 여러 방법으로 이를 수행할 수 있습니다. 첫째로, 문서의 기본 언어context에서 @language 키로 설정하여 지정할 수 있습니다:

위 예제는 두 문자열 花澄科学者ja 언어 태그를 연관시킵니다. 언어 태그는 BCP47에 정의되어 있습니다. 기본 언어는 타입 강제되지 않은 모든 문자열 값에 적용됩니다.

하위 트리의 기본 언어를 해제하려면, 중간 컨텍스트(예: 스코프된 컨텍스트)에서 @languagenull로 설정할 수 있습니다:

Example 69: 기본 언어 해제
{
  "@context": {
    ...
    "@version": 1.1,
    "@vocab": "http://example.com/",
    "@language": "ja",
    "details": {
      "@context": {
        "@language": null
      }
    }
  },
  "name": "花澄",
  "details": {"occupation": "Ninja"}
}

둘째, 특정 term에 언어를 연관시키려면 확장된 용어 정의를 사용할 수 있습니다:

Example 70: 언어가 있는 확장된 용어 정의
{
  "@context": {
    ...
    "ex": "http://example.com/vocab/",
    "@language": "ja",
    "name": { "@id": "ex:name", "@language": null },
    "occupation": { "@id": "ex:occupation" },
    "occupation_en": { "@id": "ex:occupation", "@language": "en" },
    "occupation_cs": { "@id": "ex:occupation", "@language": "cs" }
  },
  "name": "Yagyū Muneyoshi",
  "occupation": "忍者",
  "occupation_en": "Ninja",
  "occupation_cs": "Nindža",
  ...
}

위 예제는 忍者에 기본 언어 태그 ja를, Ninjaen을, Nindžacs를 각각 연관시킵니다. name의 값 Yagyū Muneyoshi@languagenull로 재설정되었으므로 어떤 언어 태그도 갖지 않습니다.

참고

언어 연관은 일반 문자열에만 적용됩니다. 타입화된 값이나 타입 강제 대상 값은 언어 태그가 붙지 않습니다.

시스템은 일반적으로 여러 언어로 속성의 값을 표현할 필요가 있습니다. 이 경우 개발자가 언어별 데이터 구조를 쉽게 탐색할 수 있도록 언어 맵(language maps)을 활용할 수 있습니다.

Example 71: 세 언어로 속성 표현하는 언어 맵
{
  "@context": {
    ...
    "occupation": { "@id": "ex:occupation", "@container": "@language" }
  },
  "name": "Yagyū Muneyoshi",
  "occupation": {
    "ja": "忍者",
    "en": "Ninja",
    "cs": "Nindža"
  }
  ...
}

위 예제는 이전 예제와 정확히 동일한 정보를 표현하지만 모든 값을 하나의 속성으로 통합합니다. 프로그래밍 언어에서 점 표기법(dot-notation)을 지원하면 property.language 패턴(예: obj.occupation.en)으로 특정 언어의 값을 접근할 수 있습니다(언어가 주 언어 서브태그로 제한되는 경우).

셋째로, 값 객체를 사용하여 기본 언어를 오버라이드할 수 있습니다:

Example 72: 확장된 값을 사용해 기본 언어 오버라이드
{
  "@context": {
    ...
    "@language": "ja"
  },
  "name": "花澄",
  "occupation": {
    "@value": "Scientist",
    "@language": "en"
  }
}

값 객체를 사용하여 @language를 생략하거나 null로 설정하면 일반 문자열로 지정할 수 있습니다:

Example 73: 확장된 값을 사용해 언어 정보 제거
{
  "@context": {
    ...
    "@language": "ja"
  },
  "name": {
    "@value": "Frank"
  },
  "occupation": {
    "@value": "Ninja",
    "@language": "en"
  },
  "speciality": "手裏剣"
}

맵된 값의 언어 설정에 관한 설명은 § 9.8 언어 맵을 참조하십시오.

4.2.4.1 기본 방향(Base Direction)

이 절은 비규범적입니다.

문자열 또는 언어 태그된 문자열에 대해 기본 방향을 주석으로 달 수 있습니다. 언어와 마찬가지로, context에서 @direction 키를 설정하여 문서의 기본 방향을 지정할 수 있습니다:

위 예제는 두 문자열 HTML و CSS: تصميم و إنشاء مواقع الويبمكتبةar-EG 언어 태그와 rtl 방향을 연관시킵니다. 기본 방향은 타입 강제되지 않은 모든 문자열에 적용됩니다.

하위 트리의 기본 방향을 해제하려면, 스코프된 컨텍스트에서 @directionnull로 설정할 수 있습니다:

Example 75: 기본 방향 해제
{
  "@context": {
    ...
    "@version": 1.1,
    "@vocab": "http://example.com/",
    "@language": "ar-EG",
    "@direction": "rtl",
    "details": {
      "@context": {
        "@direction": null
      }
    }
  },
  "title": "HTML و CSS: تصميم و إنشاء مواقع الويب",
  "details": {"genre": "Technical Publication"}
}

둘째로, 특정 term에 기본 방향을 연관시키려면 확장된 용어 정의를 사용할 수 있습니다:

Example 76: 언어와 방향이 있는 확장된 용어 정의
{
  "@context": {
    ...
    "@version": 1.1,
    "@language": "ar-EG",
    "@direction": "rtl",
    "ex": "http://example.com/vocab/",
    "publisher": { "@id": "ex:publisher", "@direction": null },
    "title": { "@id": "ex:title" },
    "title_en": { "@id": "ex:title", "@language": "en", "@direction": "ltr" }
  },
  "publisher": "مكتبة",
  "title": "HTML و CSS: تصميم و إنشاء مواقع الويب",
  "title_en": "HTML and CSS: Design and Build Websites",
  ...
}

위 예제는 세 개의 속성을 생성합니다:

Subject Property Value Language Direction
_:b0 http://example.com/vocab/publisher مكتبة ar-EG
_:b0 http://example.com/vocab/title HTML و CSS: تصميم و إنشاء مواقع الويب ar-EG rtl
_:b0 http://example.com/vocab/title HTML and CSS: Design and Build Websites en ltr
참고

기본 방향 연관은 일반 문자열과 언어 태그된 문자열에만 적용됩니다. 타입화된 값이나 타입 강제 대상 값에는 기본 방향이 부여되지 않습니다.

셋째로, 값 객체를 사용하여 기본 언어와 기본 방향을 오버라이드할 수 있습니다:

Example 77: 확장된 값을 사용해 기본 언어와 기본 방향 오버라이드
{
  "@context": {
    ...
    "@language": "ar-EG",
    "@direction": "rtl"
  },
  "title": "HTML و CSS: تصميم و إنشاء مواقع الويب",
  "author": {
    "@value": "Jon Duckett",
    "@language": "en",
    "@direction": null
  }
}

기본 방향에 관해 더 깊이 있는 논의는 Strings on the Web: Language and Direction Metadata를 참조하십시오.

4.3 값 순서

이 절은 비규범적입니다.

JSON-LD 작성자는 배열을 사용하여 여러 값을 간단하게 표현할 수 있습니다. 그래프는 노드 간의 링크에 대한 순서를 설명하지 않기 때문에, JSON-LD의 배열은 기본적으로 포함된 요소들의 순서를 전달하지 않습니다. 이는 기본적으로 정렬된 일반 JSON 배열과는 정반대입니다. 예를 들어, 다음과 같은 간단한 문서를 고려하십시오:

여러 값은 확장된 형식을 사용하여 표현할 수도 있습니다:

참고

위 예제는 문장으로 보았을 때 다시 순서가 없는(고유한 순서를 갖지 않는) 문장들을 생성합니다.

속성의 여러 값들은 일반적으로 동일한 타입이지만, JSON-LD는 이에 대해 제한을 두지 않으며 속성은 서로 다른 타입의 값을 가질 수 있습니다:

참고

문장으로 보았을 때, 값들은 고유한(내재된) 순서를 가지지 않습니다.

4.3.1 목록

이 절은 비규범적입니다.

정렬된 컬렉션의 개념은 데이터 모델링에서 중요하므로, 특정 언어적 지원이 유용합니다. JSON-LD에서는 @list 키워드를 사용하여 목록을 나타낼 수 있습니다:

이는 이 배열을 정렬된 것으로 설명하며, 문서를 처리할 때 순서가 유지됩니다. 특정 다중 값 속성의 모든 사용이 리스트라면, context에서 @container@list로 설정하여 이를 축약할 수 있습니다:

RDF에서의 리스트 구현은 익명 노드들을 rdf:firstrdf:rest 속성을 사용해 연결하고, 리스트의 끝을 리소스 rdf:nil로 정의하는 방식에 의존합니다(“문장” 탭이 보여주는 바와 같습니다). 이렇게 하면 순서가 없는 문장 집합 내에서 순서를 표현할 수 있습니다.

JSON-LD와 Turtle 모두 정렬된 리스트를 표현하기 위한 단축 표기를 제공합니다.

JSON-LD 1.1에서는 리스트 객체의 값이 또 다른 리스트 객체일 수 있는, 즉 리스트의 리스트 구조가 완전히 지원됩니다.

"@container": "@list" 정의는 배열 값이 자체적으로 리스트임을 재귀적으로 기술합니다. 예를 들어, The GeoJSON Format에서 coordinatespositions의 정렬된 목록이며, 각 포지션은 두 개 이상의 숫자로 표현되는 배열입니다.

Example 83: GeoJSON으로 표현된 좌표
{
  "type": "Feature",
  "bbox": [-10.0, -10.0, 10.0, 10.0],
  "geometry": {
    "type": "Polygon",
    "coordinates": [
        [
            [-10.0, -10.0],
            [10.0, -10.0],
            [10.0, 10.0],
            [-10.0, -10.0]
        ]
    ]
  }
  //...
}

이 예제들에서는 bboxcoordinates 안에 표현된 값들이 순서를 유지해야 하므로 임베디드 리스트 구조를 사용해야 합니다. JSON-LD 1.1에서는 적절한 컨텍스트 정의를 추가하여 이를 재귀적 리스트로 표현할 수 있습니다:

참고로 coordinates는 세 수준의 리스트를 포함합니다.

@list 컨테이너와 연결된 용어의 값은 값이 하나이거나 전혀 없더라도 항상 배열 형태로 표현됩니다.

4.3.2 집합

이 절은 비규범적입니다.

@list정렬된 목록을 설명하는 데 사용되는 반면, @set 키워드는 정렬되지 않은 집합을 설명하는 데 사용됩니다. 문서 본문에서의 @set 사용은 단순한 문법적 설탕이므로 문서 처리 시 최적화되어 제거됩니다. 그러나 문맥(context) 내에서 사용할 때 @set는 유용합니다. @set 컨테이너와 연결된 용어의 값들은 값이 하나만 있어 축약 형태에서 비배열 형태로 최적화될 경우에도 항상 배열 형식으로 표현됩니다(자세한 내용은 § 5.2 축약된 문서 형식 참조). 이렇게 하면 값이 하나인 경우에도 항상 배열 형태가 유지되어 후처리가 쉬워집니다.

이는 이 배열이 정렬되지 않았음을 설명하며, 처리 중에 순서가 바뀔 수 있습니다. 기본적으로 값들의 배열은 정렬되지 않지만, context에서 @container@set으로 설정하여 이를 명시할 수 있습니다.

JSON-LD 1.1 이후로 @set 키워드는 확장된 용어 정의 내의 다른 컨테이너 사양들과 결합되어, 색인된 값들의 축약된 표현이 항상 배열로 일관되게 표현되도록 할 수 있습니다. 자세한 내용은 § 4.6 인덱스된 값들을 참조하십시오.

4.3.3 @set@type과 함께 사용하기

이 절은 비규범적입니다.

처리 모드(processing mode)가 json-ld-1.0로 설정되지 않은 한, @type@container@set으로 설정된 확장된 용어 정의에서 사용할 수 있습니다; 그러한 확장된 용어 정의 내에는 다른 항목을 설정할 수 없습니다. 이는 Compaction algorithm에서 @type의 값들(또는 별칭)이 항상 배열로 표현되도록 보장하는 데 사용됩니다.

Example 87: @type에 @container: @set 설정하기
{
  "@context": {
    "@version": 1.1,
    "@type": {"@container": "@set"}
  },
  "@type": ["http:/example.org/type"]
}

4.4 중첩된 속성

이 절은 비규범적입니다.

많은 JSON API는 중간 객체를 사용해 속성을 엔터티와 분리합니다. JSON-LD에서는 이러한 것을 중첩된 속성이라고 합니다. 예를 들어, 가능한 레이블 집합을 공통 속성 아래에 그룹화할 수 있습니다:

labels키워드 @nest로 정의하면, JSON-LD 프로세서labels 속성으로 만든 중첩을 무시하고 그 내용을 포함하는 객체 안에 직접 선언된 것처럼 처리합니다. 이 경우 labels 속성은 의미적으로 무의미합니다. 그것을 @nest와 동등하게 정의하면 확장 시 무시되어 다음과 동등해집니다:

마찬가지로, 용어 정의@nest 속성을 포함할 수 있으며, 이는 @nest에 별칭된 용어를 참조하여 해당 용어로 축약할 때 해당 속성들이 그 별칭된 용어 아래에 중첩되게 합니다. 아래 예제에서는 main_labelother_label이 모두 "@nest": "labels"로 정의되어 있어, 축약 시 labels 아래에 직렬화됩니다.

Example 90: 속성 중첩 정의 - 확장된 입력
[{
  "@id": "http://example.org/myresource",
  "http://xmlns.com/foaf/0.1/homepage": [
    {"@id": "http://example.org"}
  ],
  "http://www.w3.org/2004/02/skos/core#prefLabel": [
    {"@value": "This is the main label for my resource"}
  ],
  "http://www.w3.org/2004/02/skos/core#altLabel": [
    {"@value": "This is the other label"}
  ]
}]
Example 91: 속성 중첩 정의 - 컨텍스트
{
  "@context": {
    "@version": 1.1,
    "skos": "http://www.w3.org/2004/02/skos/core#",
    "labels": "@nest",
    "main_label": {"@id": "skos:prefLabel", "@nest": "labels"},
    "other_label": {"@id": "skos:altLabel", "@nest": "labels"},
    "homepage": {"@id": "http://xmlns.com/foaf/0.1/homepage", "@type": "@id"}
  }
}
참고

중첩된 속성은 JSON-LD 1.1의 새로운 기능입니다.

4.5 임베딩

이 절은 비규범적입니다.

임베딩은 작성자가 노드 객체속성 값으로 사용할 수 있게 하는 JSON-LD 기능입니다. 이는 두 노드 사이에 부모-자식 관계를 만드는 데 흔히 사용되는 메커니즘입니다.

임베딩이 없으면 노드 객체들은 다른 노드 객체의 식별자를 참조하여 연결될 수 있습니다. 예를 들어:

이전 예제는 Manu와 Gregg 두 개의 노드 객체를 기술하며, knows 속성은 문자열 값을 식별자로 처리하도록 정의되어 있습니다. 임베딩을 사용하면 Gregg의 노드 객체를 knows 속성의 값으로 임베드할 수 있습니다:

위와 같은 노드 객체는 JSON-LD 문서의 모든 값 위치에서 사용될 수 있습니다.

그래프에서 노드에 식별자를 부여하는 것이 모범 사례로 간주되지만, 때로는 이것이 비현실적일 수 있습니다. 데이터 모델에서 명시적 식별자가 없는 노드는 blank node라고 하며, JSON-LD와 같은 직렬화에서 blank node identifier를 사용하여 표현할 수 있습니다. 이전 예제에서 상위 수준의 Manu 노드는 식별자가 없으며, 데이터 모델 내에서 그것을 기술하는 데 식별자가 필요하지 않습니다. 그러나 Gregg에서 Manu로의 knows 관계를 기술하려면 blank node identifier를 도입해야 합니다(여기서는 _:b0).

Blank node 식별자플래트닝 같은 알고리즘에 의해 자동으로 도입될 수 있지만, 작성자가 이러한 관계를 직접 기술하는 데에도 유용합니다.

4.5.1 Blank Node 식별하기

이 절은 비규범적입니다.

때로는 노드를 고유하게 식별할 수 없는 상태로 정보를 표현해야 할 필요가 있습니다. 이러한 유형의 노드를 blank node라고 합니다. JSON-LD는 모든 노드가 @id로 식별될 것을 요구하지 않습니다. 그러나 일부 그래프 토폴로지는 직렬화 가능한 식별자가 필요할 수 있습니다. 예를 들어 루프를 포함한 그래프는 임베딩만으로 직렬화할 수 없으므로 노드들을 연결하기 위해 @id가 필요합니다. 이러한 상황에서는 밑줄(_)을 스킴으로 사용하는 IRI처럼 보이는 blank node identifier를 사용할 수 있습니다. 이는 문서 내에서 로컬로 노드를 참조할 수 있게 하지만 외부 문서에서 참조할 수는 없습니다. 해당 식별자는 그가 사용된 문서에만 범위가 있습니다.

위 예제는 IRI로는 식별할 수 없는 두 명의 비밀 요원에 대한 정보를 포함합니다. agent 1agent 2를 알고 있다는 것을 표현하는 것은 blank node 식별자 없이도 가능하지만, agent 2에서 agent 1을 참조하려면 agent 1에 식별자를 할당해야 합니다.

처리 중에 blank node 식별자가 다시 레이블링될 수 있다는 점에 유의하십시오. 동일한 blank node를 여러 번 참조한다면, 개발자는 해당 노드에 대해 해석 가능한(역참조 가능한) IRI를 부여하는 것을 고려해야 합니다. 그렇게 하면 다른 문서에서도 참조할 수 있게 됩니다.

4.6 인덱스된 값

이 절은 비규범적입니다.

때때로 여러 속성 값을 배열을 반복하여 찾는 것보다 더 직접적으로 접근해야 할 필요가 있습니다. JSON-LD는 중간 을 사용해 특정 인덱스를 연관된 값과 연결할 수 있는 인덱싱 메커니즘을 제공합니다.

데이터 인덱싱
§ 4.6.1 데이터 인덱싱에 설명된 바와 같이, 데이터 인덱싱은 임의의 키로 노드나 값을 참조할 수 있게 합니다.
언어 인덱싱
§ 4.6.2 언어 인덱싱에 설명된 바와 같이, 언어 인덱싱은 언어가 문자열을 참조하도록 허용하며, 해당 문자열과 연관된 언어로 해석되게 합니다.
노드 식별자 인덱싱
§ 4.6.3 노드 식별자 인덱싱에 설명된 바와 같이, 노드 식별자 인덱싱은 IRI노드를 참조하도록 허용하고, 해당 IRI를 그 노드의 식별자로 해석되게 합니다.
노드 타입 인덱싱
§ 4.6.4 노드 타입 인덱싱에 설명된 바와 같이, 노드 타입 인덱싱은 IRI노드를 참조하도록 허용하고, 해당 IRI를 그 노드의 타입으로 해석되게 합니다.

JSON-LD에서 인덱싱의 다른 사용에 대해서는 § 4.9 명명된 그래프를 참조하십시오.

4.6.1 데이터 인덱싱

이 절은 비규범적입니다.

데이터베이스는 일반적으로 데이터 접근을 더 효율적으로 만들기 위해 사용됩니다. 개발자들은 종종 이러한 기능을 애플리케이션 데이터로 확장하여 유사한 성능 이득을 얻습니다. 이러한 데이터는 Linked Data 관점에서는 의미가 없을 수 있지만 애플리케이션에 유용합니다.

JSON-LD는 데이터를 더 효율적으로 접근할 수 있는 형태로 구조화하는 데 사용할 수 있는 인덱스 맵의 개념을 도입합니다. 데이터 인덱싱 기능은 키가 IRI에 매핑되지 않는 단순 키-값 맵을 사용하여 데이터를 구조화할 수 있게 합니다. 이는 특정 항목을 찾기 위해 배열을 스캔하는 대신 직접 접근을 가능하게 합니다. JSON-LD에서는 이러한 데이터를 컨텍스트에서 @index 키워드를 @container 선언과 연관시켜 지정할 수 있습니다:

위 예제에서 athletes 용어인덱스 맵으로 표시되었습니다. catcherpitcher 키는 의미론적으로는 무시되지만 문법적으로는 JSON-LD 프로세서에 의해 보존됩니다. JavaScript에서 사용하면 개발자는 다음 코드 조각으로 특정 선수에 접근할 수 있습니다: obj.athletes.pitcher.

데이터의 해석은 문장 표에 표현되어 있습니다. 인덱스 키가 문장에는 나타나지 않는 것에 주목하십시오. 그러나 문서를 JSON-LD 프로세서로 축약하거나 확장하면(자세한 내용은 § 5.2 축약된 문서 형식§ 5.1 확장된 문서 형식 참조) 인덱스 키는 계속 존재합니다.

경고

데이터 인덱스는 RDF로 왕복 변환할 때 보존되지 않으므로 이 기능은 신중하게 사용해야 합니다. 보존되는 다른 인덱싱 메커니즘이 더 적합한 경우가 자주 있습니다.

@container의 값은 @index@set를 모두 포함하는 배열일 수도 있습니다. 축약할 때 이것은 JSON-LD 프로세서가 인덱스의 모든 값에 대해 배열 형식을 사용하도록 보장합니다.

처리 모드(processing mode)가 json-ld-1.0로 설정되지 않은 한, 특수 인덱스 @none는 연관된 인덱스가 없는 데이터를 인덱싱하는 데 사용되어 정규화된 표현을 유지하는 데 유용합니다.

4.6.1.1 속성 기반 데이터 인덱싱

이 절은 비규범적입니다.

가장 단순한 형태에서(위 예제들처럼) 데이터 인덱싱은 인덱스 맵의 키에 의미를 부여하지 않습니다. 그러나 어떤 상황에서는 객체를 인덱싱하는 데 사용되는 키들이 해당 객체들과 의미론적으로 연결되어 있으며, 문법적으로뿐만 아니라 의미론적으로도 보존되어야 합니다.

처리 모드(processing mode)가 json-ld-1.0로 설정되지 않은 한, 용어 설명에서 "@container": "@index""@index" 키를 동반할 수 있습니다. 해당 키의 값은 IRI로 확장되어야 하며, 이는 각 객체를 키와 연결하는 의미적 속성을 식별합니다.

참고

속성 기반 데이터 인덱싱을 사용할 때, 인덱스 맵노드 객체에만 적용할 수 있으며, 값 객체그래프 객체에는 적용할 수 없습니다. 값 객체는 특정 키들만 가질 수 있도록 제한되며 임의의 속성은 지원하지 않습니다.

4.6.2 언어 인덱싱

이 절은 비규범적입니다.

여러 언어의 문자열 값을 포함하는 JSON은 언어 맵을 사용해 표현할 수 있으며, 이렇게 하면 속성 값을 언어 태그로 쉽게 인덱싱할 수 있습니다. 이는 특정 항목을 찾기 위해 배열을 스캔하는 대신 언어 값에 직접 접근할 수 있게 합니다. JSON-LD에서는 이러한 데이터를 컨텍스트에서 @language 키워드를 @container 선언과 연관시켜 지정할 수 있습니다:

위 예제에서 label 용어는 언어 맵으로 표시되었습니다. ende 키는 각각의 값과 암묵적으로 연관되며 JSON-LD 프로세서가 처리합니다. 이를 통해 개발자는 obj.label.de와 같이 독일어 버전의 label에 접근할 수 있습니다. 다만 이는 언어가 주요 언어 서브태그로 제한되고 "de-at" 같은 다른 서브태그에 의존하지 않는 경우에만 적절합니다.

@container의 값은 또한 @language@set를 모두 포함하는 배열일 수 있습니다. 축약할 때 이는 JSON-LD 프로세서가 언어 태그 값들의 모든 항목에 대해 배열 형태를 사용하도록 보장합니다.

처리 모드(processing mode)가 json-ld-1.0로 설정되지 않은 한, 언어가 없는 문자열을 인덱싱할 때 특수 인덱스 @none가 사용됩니다. 이는 데이터 타입이 없는 문자열 값에 대한 정규화된 표현을 유지하는 데 유용합니다.

4.6.3 노드 식별자 인덱싱

이 절은 비규범적입니다.

인덱스 맵 외에도, JSON-LD는 데이터를 구조화하기 위한 id 맵 개념을 도입합니다. id 인덱싱 기능은 키가 IRI에 매핑되는 단순 키-값 맵을 사용하여 데이터를 구조화할 수 있게 합니다. 이는 특정 항목을 찾기 위해 배열을 스캔하는 대신 관련된 노드 객체에 직접 접근할 수 있게 합니다. JSON-LD에서는 이러한 데이터를 컨텍스트에서 @id 키워드를 @container 선언과 연관시켜 지정할 수 있습니다:

위 예제에서 post 용어는 id 맵으로 표시되었습니다. http://example.com/posts/1/enhttp://example.com/posts/1/de 키는 노드 객체 값의 @id 속성으로 해석됩니다.

위 데이터의 해석은 § 4.6.1 데이터 인덱싱에서의 해석과 JSON-LD 프로세서를 사용했을 때 정확히 동일합니다.

@container의 값은 또한 @id@set를 모두 포함하는 배열일 수 있습니다. 축약할 때 이는 JSON-LD 프로세서가 노드 식별자 값들의 모든 항목에 대해 배열 형식을 사용하도록 보장합니다.

특수 인덱스 @none@id가 없는 노드 객체를 인덱싱하는 데 사용되어 정규화된 표현을 유지하는 데 유용합니다. @none 인덱스는 아래 예제에서 사용된 none과 같이 @none로 확장되는 용어일 수도 있습니다.

참고

Id 맵은 JSON-LD 1.1의 새로운 기능입니다.

4.6.4 노드 타입 인덱싱

이 절은 비규범적입니다.

id인덱스 맵 외에도, JSON-LD는 데이터를 구조화하기 위한 타입 맵 개념을 도입합니다. 타입 인덱싱 기능은 키가 IRI에 매핑되는 단순 키-값 맵을 사용하여 데이터를 구조화할 수 있게 합니다. 이는 특정 @type노드 객체를 기반으로 데이터를 구조화할 수 있게 합니다. JSON-LD에서는 이러한 데이터를 컨텍스트에서 @type 키워드를 @container 선언과 연관시켜 지정할 수 있습니다:

위 예제에서 affiliation 용어는 타입 맵으로 표시되었습니다. schema:Corporationschema:ProfessionalService 키는 노드 객체 값의 @type 속성으로 해석됩니다.

@container의 값은 또한 @type@set를 모두 포함하는 배열일 수 있습니다. 축약할 때 이는 JSON-LD 프로세서가 모든 타입 값에 대해 배열 형식을 사용하도록 보장합니다.

특수 인덱스 @none@type이 없는 노드 객체를 인덱싱하는 데 사용되어 정규화된 표현을 유지하는 데 유용합니다. @none 인덱스는 아래 예제에서 사용된 none과 같이 @none로 확장되는 용어일 수도 있습니다.

id 맵과 마찬가지로, @type과 함께 사용할 때도 컨테이너는 키 값이 항상 배열에 포함되도록 하기 위해 @set을 포함할 수 있습니다.

참고

Type 맵은 JSON-LD 1.1의 새로운 기능입니다.

4.7 포함된 노드

이 절은 비규범적입니다.

때때로 다른 노드 객체의 일부로 노드 객체들을 나열하는 것이 유용할 수 있습니다. 예를 들어, 어떤 다른 자원에서 사용되는 자원의 집합을 표현할 때 그렇습니다. 포함된 블록은 일차 노드 객체에서 참조될 수 있는 이러한 보조 노드 객체를 수집하는 데에도 사용될 수 있습니다. 예를 들어, 일부가 공통 요소를 공유하는 다양한 항목들의 목록을 포함하는 노드 객체를 생각해 보십시오:

예제 109: 포함된 블록
{
  "@context": {
    "@version": 1.1,
    "@vocab": "http://example.org/",
    "classification": {"@type": "@vocab"}
  },
  "@id": "http://example.org/org-1",
  "members": [{
    "@id":"http://example.org/person-1",
    "name": "Manu Sporny",
    "classification": "employee"
  }, {
    "@id":"http://example.org/person-2",
    "name": "Dave Longley",
    "classification": "employee"
  }, {
    "@id": "http://example.org/person-3",
    "name": "Gregg Kellogg",
    "classification": "contractor"
  }],
  "@included": [{
    "@id": "http://example.org/employee",
    "label": "An Employee"
  }, {
    "@id": "http://example.org/contractor",
    "label": "A Contractor"
  }]
}

평탄화되면, 이것은 employeecontractor 요소들을 포함된 블록에서 바깥쪽 배열로 이동시킵니다.

포함된 리소스는 JSON APIInclusion of Related Resources에 설명되어 있으며, 이는 일부 기본 리소스와 연관된 관련 리소스를 포함하는 방법입니다; @included은 JSON-LD에서 유사한 가능성을 제공합니다.

노드 객체 내에서 @included를 사용한 부산물로, 은 오직 @included만을 포함할 수 있으며, 이는 § 4.1 고급 컨텍스트 사용에 설명된 기능과 유사한 기능을 제공합니다. 여기서 @graph는 연결되지 않은 노드들을 기술하는 데 사용됩니다.

그러나 @graph와는 대조적으로, @included는 동일한 속성들과 상호작용하지 않으며, 이 기능은 § 4.9 명명 그래프에서 더 자세히 논의됩니다.

4.8 역방향 속성

이 절은 비규범적입니다.

JSON-LD는 방향성 그래프를 직렬화합니다. 이것은 모든 속성이 한 노드에서 다른 노드를 가리킨다는 것을 의미합니다. 그러나 경우에 따라 역방향으로 직렬화하는 것이 바람직할 수 있습니다. 예를 들어 한 사람과 그 자녀들이 문서에 기술되어야 하는 경우를 생각해 보십시오. 사용된 어휘에 children 속성이 없고 단지 parent 속성만 제공된다면, 각 자녀를 나타내는 노드는 다음 예와 같이 부모를 가리키는 속성으로 표현되어야 할 것입니다.

이러한 데이터를 표현하는 것은 JSON-LD의 @reverse 키워드를 사용하는 것이 훨씬 간단합니다:

또한 @reverse 키워드는 다음 예시에서 보이는 것처럼 확장된 용어 정의에서도 역방향 속성을 생성하는 데 사용할 수 있습니다:

4.9 명명된 그래프

이 절은 비규범적입니다.

때때로 단일 노드뿐만 아니라 그래프 자체에 대해 서술해야 할 때가 있습니다. 이는 @graph 키워드를 사용하여 여러 노드를 그룹화함으로써 수행할 수 있습니다. 개발자는 또한 다음 예제와 같이 @graph 키워드로 표현된 데이터를 @id 키워드와 짝지어 이름을 지정할 수 있습니다:

위 예제는 명명된 그래프IRI http://example.org/foaf-graph로 식별하여 표현합니다. 해당 그래프는 Manu와 Gregg에 대한 문장들로 구성됩니다. 그래프 자체에 대한 메타데이터는 그래프가 생성된 시점을 지정하는 generatedAt 속성을 통해 표현됩니다.

JSON-LD 문서의 최상위 구조가 이고 @graph와 (선택적으로) @context 외에 다른 키를 포함하지 않는 경우(IRI나 키워드로 매핑되지 않는 속성들은 무시됨), @graph는 암묵적인 기본 그래프를 표현하는 것으로 간주됩니다. 이 메커니즘은 문서의 최상위에 동일한 컨텍스트를 공유하는 여러 노드가 존재하는 경우(예: 문서가 평탄화된 경우)에 유용합니다. @graph 키워드는 이러한 노드들을 배열로 수집하고 공유 컨텍스트를 사용할 수 있게 합니다.

이 경우 그래프에 관련 없는 노드들이 포함되어 있으므로 임베딩을 사용할 수 없습니다. 이는 배열 내에서 여러 노드 객체를 사용하고 각 노드 객체 내에서 @context를 정의하는 것과 동등합니다:

4.9.1 그래프 컨테이너

이 절은 비규범적입니다.

경우에 따라 JSON 표현 내부에서 이를 명시하지 않고도 데이터를 논리적으로 별도의 그래프로 분할하는 것이 유용합니다. 예를 들어, JSON 문서는 다른 메타데이터가 주장되는 데이터와 관련된 데이터를 포함할 수 있으며, 이러한 데이터를 명명된 그래프 개념을 사용하여 데이터 모델에서 분리하는 것이 유용할 수 있습니다. 이는 @graph 키워드를 사용하는 구문적 오버헤드를 필요로 하지 않습니다.

확장된 용어 정의(expanded term definition)는 @container 값으로 @graph를 사용할 수 있습니다. 이는 해당 용어의 값들이 명명된 그래프로 간주되어야 함을 나타내며, 이때 그래프 이름은 자동으로 할당된 blank node identifier가 되어 암묵적 명명 그래프를 생성합니다. 확장 시, 이들은 간단한 그래프 객체가 됩니다.

다른 예는 익명으로 된 명명된 그래프를 사용하는 경우입니다:

위 예제는 명명된 그래프(익명)를 표현하여 하나의 서술을 하고 있습니다. 기본 그래프에는 주체가 해당 서술을 작성했다는 문장이 포함되어 있습니다. 이는 문장들을 명명된 그래프로 분리한 다음, 그 명명된 그래프에 포함된 문장들에 대해 추가로 단언하는 예입니다.

Note

엄밀히 말하면, 그러한 용어의 값은 명명된 그래프 자체가 아니라, 데이터셋 내에 별도로 존재하는 해당 명명된 그래프에 연관된 그래프 이름입니다.

Note

그래프 컨테이너는 JSON-LD 1.1의 새로운 기능입니다.

4.9.2 명명된 그래프 데이터 인덱싱

이 절은 비규범적입니다.

노드 객체를 인덱스로 인덱싱하는 것 외에도, 그래프 객체 역시 인덱스로 인덱싱될 수 있습니다. § 4.9.1 그래프 컨테이너에서 도입된 @graph 컨테이너 타입과 @index를 함께 사용하면, 해당 속성의 객체 값은 키가 IRIs로 매핑되는 것이 아니라 그 값들이 되는 명명된 그래프에 연관된 @index 속성에서 가져온 키-값 맵으로 처리됩니다. 확장 시, 이러한 값들은 간단한 그래프 객체여야 합니다.

다음 예제는 기본 그래프인덱스 맵을 사용하여 여러 명명된 그래프를 참조하는 방식을 설명합니다.

인덱스 맵과 마찬가지로, @graph와 함께 사용할 때 컨테이너는 또한 @set을 포함하여 키 값이 항상 배열에 포함되도록 할 수 있습니다.

특별 인덱스 @none@index 키가 없는 그래프를 인덱싱하는 데 사용되며, 정규화된 표현을 유지하는 데 유용합니다. 단, 여러 식별되지 않은 명명된 그래프가 @none 인덱스를 사용하여 압축된 문서를 압축 해제하면 해당 그래프들의 내용이 병합됩니다. 이를 방지하려면 각 그래프에 고유한 @index 키를 부여하십시오.

Note

명명된 그래프 데이터 인덱싱은 JSON-LD 1.1의 새로운 기능입니다.

4.9.3 명명된 그래프 인덱싱

이 절은 비규범적입니다.

식별자로 노드 객체를 인덱싱하는 것 외에, 그래프 객체는 그들의 그래프 이름으로도 인덱싱될 수 있습니다. § 4.9.1 그래프 컨테이너에서 도입된 @graph 컨테이너 타입과 @id를 함께 사용하면, 해당 속성의 객체 값은 키가 그 값들인 명명된 그래프의 식별자를 나타내는 키-값 맵으로 처리됩니다.

다음 예제는 기본 그래프id 맵을 사용하여 여러 명명된 그래프를 참조하는 방식을 설명합니다.

id 맵과 마찬가지로, @graph와 함께 사용할 때 컨테이너는 또한 @set을 포함하여 키 값이 항상 배열에 포함되도록 할 수 있습니다.

또한 id 맵과 마찬가지로, 특별 인덱스 @none@id가 없는 명명된 그래프를 인덱싱하는 데 사용되며, 정규화된 표현을 유지하는 데 유용합니다. @none 인덱스는 또한 @none으로 확장되는 용어일 수도 있습니다. 단, 여러 그래프가 @id 없이 표현되면 확장 시 병합됩니다. 이를 방지하려면 @none을 신중하게 사용하거나 그래프에 고유한 식별자를 부여하십시오.

Note

그래프 컨테이너는 JSON-LD 1.1의 새로운 기능입니다.

4.10 문서 로딩

이 절은 규범적이지 않습니다.

JSON-LD 1.1 처리 알고리즘 및 API 명세 [JSON-LD11-API] 는 JSON-LD 처리기에 대한 인터페이스를 정의하며, 다양한 형식의 JSON-LD를 다루는데 사용되는 여러 메서드를 포함합니다 (자세한 내용은 § 5. Forms of JSON-LD 참고). 여기에는 원격 문서(참조된 JSON-LD 문서 및 원격 컨텍스트 포함)를 로딩하는 일반적인 메커니즘과 [HTML] 등 다른 형식에서 임베드된 JSON-LD를 추출하는 기능이 포함됩니다. 이 내용은 원격 문서 및 컨텍스트 검색 에서 더 자세히 설명됩니다 ([JSON-LD11-API]).

documentLoader 는 원격 문서 로딩이 문제가 될 수 있는 다양한 상황에서 유용하게 사용될 수 있습니다:

5. JSON-LD의 형식

이 절은 규범적이지 않습니다.

많은 데이터 형식과 마찬가지로 JSON-LD에서 데이터를 기술하는 단 하나의 정답은 없습니다. 그러나 JSON-LD는 그래프를 기술하기 위해 사용되므로, 의미(Linked Data로서의 의미)를 변경하지 않으면서 데이터의 형태(shape)를 변경하는 특정 변환을 사용할 수 있습니다.

Expanded Document Form
Expansion은 JSON-LD 문서를 가져와서 context를 적용하여 @context가 더 이상 필요하지 않게 만드는 과정입니다. 이 절은 § 5.1 Expanded Document Form에서 더 자세히 설명됩니다.
Compacted Document Form
Compaction은 제공된 context를 기존 JSON-LD 문서에 적용하는 과정입니다. 이 과정은 § 5.2 Compacted Document Form에서 더 자세히 설명됩니다.
Flattened Document Form
Flattening은 임베디드된 노드를 JSON 트리의 최상위로 추출하고, 임베디드 노드를 참조로 교체하며 필요시 블랭크 노드 식별자를 생성하는 과정입니다. 이 과정은 § 5.3 Flattened Document Form에서 더 자세히 설명됩니다.
Framed Document Form
Framing은 예시 frame 문서를 사용하여 JSON-LD 문서의 데이터를 원하는 형태로 구성하는 데 사용됩니다. 이 예시 문서는 flattened 데이터와 일치시키는 데 사용되며, 결과 데이터가 어떻게 형성되어야 하는지의 예를 보여줍니다. 이 과정은 § 5.4 Framed Document Form에서 더 자세히 설명됩니다.

5.1 확장된 문서 형식

이 절은 규범적이지 않습니다.

JSON-LD 1.1 Processing Algorithms and API 명세 [JSON-LD11-API] 는 JSON-LD 문서를 확장(expanding)하는 방법을 정의합니다. Expansion은 JSON-LD 문서를 가져와 모든 IRI, 타입 및 값을 확장하여 @context가 더 이상 필요하지 않게 만드는 과정입니다.

예를 들어, 다음 JSON-LD 입력 문서를 가정해 보겠습니다:

Example 123: 확장할 샘플 JSON-LD 문서
{
   "@context": {
      "name": "http://xmlns.com/foaf/0.1/name",
      "homepage": {
        "@id": "http://xmlns.com/foaf/0.1/homepage",
        "@type": "@id"
      }
   },
   "name": "Manu Sporny",
   "homepage": "http://manu.sporny.org/"
}

위 JSON-LD 입력 문서에 대해 JSON-LD Expansion algorithm을 실행하면 다음과 같은 출력이 생성됩니다:

JSON-LD의 미디어 타입profile 매개변수를 정의하며 이를 통해 expanded document form을 신호하거나 요청할 수 있습니다. 확장된 문서 형태를 식별하는 profile URI는 http://www.w3.org/ns/json-ld#expanded입니다.

5.2 컴팩트된 문서 형식

이 절은 규범적이지 않습니다.

JSON-LD 1.1 Processing Algorithms and API 명세 [JSON-LD11-API]는 JSON-LD 문서를 압축(compacting)하는 방법을 정의합니다. Compaction은 개발자가 제공한 context를 적용하여 IRIterm이나 compact IRI로 단축하고, 확장된 형식으로 표현된 JSON-LD 값을 문자열이나 숫자 같은 단순 값으로 표현하는 과정입니다. 이는 문서를 애플리케이션별 용어로 표현하여 문서 작업을 더 간단하게 만드는 경우가 많습니다. 또한 압축된 문서는 일반적으로 사람이 읽기에 더 쉽습니다.

예를 들어, 다음 JSON-LD 입력 문서를 가정해 보겠습니다:

Example 125: 샘플 확장된 JSON-LD 문서
[
  {
    "http://xmlns.com/foaf/0.1/name": [ "Manu Sporny" ],
    "http://xmlns.com/foaf/0.1/homepage": [
      {
       "@id": "http://manu.sporny.org/"
      }
    ]
  }
]

추가로, 다음과 같은 개발자가 제공한 JSON-LD 컨텍스트를 가정합니다:

Example 126: 샘플 컨텍스트
{
  "@context": {
    "name": "http://xmlns.com/foaf/0.1/name",
    "homepage": {
      "@id": "http://xmlns.com/foaf/0.1/homepage",
      "@type": "@id"
    }
  }
}

위에서 제공된 context를 사용하여 앞의 JSON-LD 입력 문서에 대해 JSON-LD Compaction algorithm을 실행하면 다음과 같은 출력이 생성됩니다:

JSON-LD의 미디어 타입profile 매개변수를 정의하며 이를 통해 compacted document form을 신호하거나 요청할 수 있습니다. 압축된 문서 형태를 식별하는 profile URI는 http://www.w3.org/ns/json-ld#compacted입니다.

Compaction의 세부 사항은 Compaction algorithm에 설명되어 있습니다. 이 절은 문서를 압축하는 데 사용될 컨텍스트를 작성하는 저자들을 위한 안내로서 알고리즘이 어떻게 동작하는지 간단히 설명합니다.

Compaction의 목적은 term definitions, vocabulary mapping, default language, 및 base IRI를 기존 JSON-LD 문서에 적용하여 문서가 JSON으로 직접 사용되도록 맞춤화된 형태로 표현되게 하는 것입니다. 여기에는 가능한 경우 값을 strings로 표현하고, list objects의 사용을 단순한 arrays로 줄이며, nodes 간의 관계를 반전시키고, 여러 값을 배열로 표현하는 대신 데이터 맵을 사용하여 값에 인덱싱하는 것 등이 포함됩니다.

5.2.1 IRI 단축

이 절은 규범적이지 않습니다.

확장된 JSON-LD 문서에서는 IRI가 항상 절대 IRI로 표현됩니다. 많은 경우 더 짧은 표현을 사용하는 것이 바람직하며, 이는 상대 IRI 참조, compact IRI 또는 term일 수 있습니다. Compaction은 컨텍스트의 여러 요소를 결합하여 이러한 IRI의 짧은 형태를 만듭니다. 자세한 내용은 § 4.1.2 Default Vocabulary, § 4.1.3 Base IRI, 및 § 4.1.5 Compact IRIs를 참조하십시오.

vocabulary mappingvocabulary relative일 수 있는 IRI들을 축약하는 데 사용할 수 있으며, 이는 vocabulary mapping과 일치하는 IRI 접두사를 제거함으로써 이루어집니다. 이는 IRI가 프로퍼티로 사용되거나 @type의 값으로 사용되거나 "@type": "@vocab"로 설명된 term의 값으로 사용되는 경우에 적용됩니다.

5.2.2 값을 문자열로 표현하기

이 절은 규범적이지 않습니다.

모호성을 피하기 위해 expanded document form은 항상 노드와 값을 node objectsvalue objects를 사용해 표현합니다. 또한 프로퍼티 값은 값이 하나뿐인 경우에도 항상 배열에 포함됩니다. 때로는 접근의 일관성을 유지하기 위해 유용하지만, 대부분의 JSON 데이터는 가능한 한 단순한 표현을 사용하므로 프로퍼티는 단일 값을 갖고, 이는 문자열이나 노드 객체와 같은 구조화된 값으로 표현됩니다. 기본적으로 compaction은 단순 문자열인 값을 문자열로 표현하지만, 때로 값이 IRI, 날짜, 또는 단순 문자열로 표현하면 정보가 손실되는 다른 타입된 값일 수 있습니다. term definition 내에서 이를 지정하면, 문자열 값의 의미는 해당 term의 정의에서 유추될 수 있습니다. 자세한 내용은 § 4.2 Describing Values를 참조하십시오.

5.2.3 리스트를 배열로 표현하기

이 절은 규범적이지 않습니다.

§ 4.3.1 Lists에서 설명한 것처럼, JSON-LD는 순서가 있는 값을 표현하기 위해 확장된 문법으로 @list 키워드를 사용합니다. 표현을 단순화하기 위해 용어(term)를 "@container": "@list"로 정의할 수 있으며, 그러면 해당 용어를 사용하는 프로퍼티의 모든 값은 순서가 있는 것으로 간주됩니다.

5.2.4 노드 관계 반전하기

이 절은 규범적이지 않습니다.

경우에 따라 두 노드를 연결하는 데 사용되는 프로퍼티는 노드 간의 방향을 반전시켜 표현하는 것이 더 적절할 수 있습니다. 예를 들어 두 사람과 공통 부모를 설명할 때가 그렇습니다. 자세한 내용은 § 4.8 Reverse Properties를 참조하십시오.

역방향 프로퍼티는 framing과 결합하면 더욱 유용할 수 있으며, framing은 문서의 최상위에 정의된 node objects를 임베디드 노드로 만들 수 있습니다. JSON-LD는 적절한 @container 정의를 term 정의 내에 지정하여 이러한 값들을 인덱싱하는 수단을 제공합니다.

5.2.5 값 인덱싱

이 절은 규범적이지 않습니다.

여러 값을 갖는 프로퍼티는 일반적으로 순서가 없는 배열을 사용해 표현됩니다. 이는 해당 JSON의 내부화된 표현을 다루는 애플리케이션이 특정 패턴과 일치하는 값을 찾기 위해 배열의 값을 반복(iterate)해야 함을 의미합니다. 예를 들어 언어 태그가 있는 문자열을 언어 en으로 찾는 경우가 그렇습니다.

데이터는 @id, @type, @language, @index 등 여러 키로 인덱싱될 수 있습니다. 자세한 내용은 § 4.6 Indexed Values§ 4.9 Named Graphs를 참조하십시오.

5.2.6 값을 객체로 정규화하기

이 절은 규범적이지 않습니다.

때로는 문서를 압축하되 node object와 value object 표현을 유지하는 것이 유용할 수 있습니다. 이를 위해 term definition에서 "@type": "@none"를 설정할 수 있습니다. 이것은 Value Compaction 알고리즘이 항상 값의 객체 형태를 사용하게 하지만 그 값의 구성 요소는 압축될 수 있도록 합니다.

5.2.7 단일 값을 배열로 표현하기

이 절은 규범적이지 않습니다.

일반적으로 압축할 때 값이 하나뿐인 프로퍼티는 문자열 또는 으로 표현되고, 여러 값을 가진 프로퍼티는 문자열 또는 의 배열로 표현됩니다. 이는 해당 프로퍼티에 접근하는 애플리케이션이 두 표현 중 어느 쪽이든 받아들일 준비가 되어 있어야 함을 의미합니다. 모든 값을 배열로 표현하도록 강제하려면 term definition에서 "@container": "@set"를 설정할 수 있습니다. 또한 @set은 다른 container 설정과 결합하여 사용할 수 있습니다. 예를 들어 앞서의 언어-맵 예제를 보면:

5.2.8 용어 선택

이 절은 규범적이지 않습니다.

압축 시 Compaction algorithm은 해당 프로퍼티의 값들이 그 term definition@container, @type, 및 @language 사양과 일치할 때만 그 프로퍼티에 대해 용어(term)를 사용하여 압축합니다. 이는 실제로 동일한 IRI를 갖는 여러 값을 서로 다른 프로퍼티들로 분리할 수 있습니다. 일치하는 term definition이 없는 경우, compaction 알고리즘은 프로퍼티의 절대 IRI를 사용하여 압축합니다.

5.3 평탄화된 문서 형식

이 절은 규범적이지 않습니다.

JSON-LD 1.1 Processing Algorithms and API 명세 [JSON-LD11-API]는 JSON-LD 문서를 flattening하는 방법을 정의합니다. Flattening노드의 모든 속성을 단일 에 수집하고, 모든 blank node에 대해 blank node identifiers를 라벨링합니다. 이는 데이터의 형태를 보장하여 특정 애플리케이션에서 JSON-LD를 처리하는 데 필요한 코드를 크게 단순화할 수 있습니다.

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

Example 137: 평탄화할 샘플 JSON-LD 문서
{
  "@context": {
    "name": "http://xmlns.com/foaf/0.1/name",
    "knows": "http://xmlns.com/foaf/0.1/knows"
  },
  "@id": "http://me.markus-lanthaler.com/",
  "name": "Markus Lanthaler",
  "knows": [
    {
      "@id": "http://manu.sporny.org/about#manu",
      "name": "Manu Sporny"
    }, {
      "name": "Dave Longley"
    }
  ]
}

위 JSON-LD 입력 문서에 대해 JSON-LD Flattening algorithm을 실행하고 동일한 컨텍스트를 사용하면 다음과 같은 출력이 생성됩니다:

JSON-LD의 미디어 타입profile 매개변수를 정의하며 이를 통해 flattened document form을 신호하거나 요청할 수 있습니다. 평탄화된 문서 형태를 식별하는 profile URI는 http://www.w3.org/ns/json-ld#flattened입니다. 이는 확장된 문서 형태나 압축된 문서 형태의 profile URI와 결합하여 사용할 수 있습니다.

5.4 프레이밍된 문서 형식

이 절은 규범적이지 않습니다.

JSON-LD 1.1 Framing 명세 [JSON-LD11-FRAMING]는 JSON-LD 문서를 framing하는 방법을 정의합니다. Framing 은 예시 frame 문서를 사용해 JSON-LD 문서의 데이터를 원하는 구조로 만드는 데 사용됩니다. 이 프레임 문서는 flattened 데이터와 일치시키는 데 사용되며, 결과 데이터가 어떻게 형성되어야 하는지의 예를 제공합니다.

예를 들어, 다음과 같은 JSON-LD 프레임을 가정합니다:

Example 139: 샘플 라이브러리 프레임
{
  "@context": {
    "@version": 1.1,
    "@vocab": "http://example.org/"
  },
  "@type": "Library",
  "contains": {
    "@type": "Book",
    "contains": {
      "@type": "Chapter"
    }
  }
}

이 프레임 문서는 타입이 Library인 객체들을 최상위에 배치하고, 라이브러리 객체와 contains 속성으로 연결된 타입이 Book인 객체들을 프로퍼티 값으로 임베드하도록 하는 구조를 설명합니다. 또한 타입이 Chapter인 객체들을 해당 참조하는 Book 객체의 임베디드 값으로 배치합니다.

프레임 구성 요소와 일치하는 평탄화된 객체 집합을 사용할 때:

Example 140: 평탄화된 라이브러리 객체들
{
  "@context": {
    "@vocab": "http://example.org/",
    "contains": {"@type": "@id"}
  },
  "@graph": [{
    "@id": "http://example.org/library",
    "@type": "Library",
    "contains": "http://example.org/library/the-republic"
  }, {
    "@id": "http://example.org/library/the-republic",
    "@type": "Book",
    "creator": "Plato",
    "title": "The Republic",
    "contains": "http://example.org/library/the-republic#introduction"
  }, {
    "@id": "http://example.org/library/the-republic#introduction",
    "@type": "Chapter",
    "description": "An introductory chapter on The Republic.",
    "title": "The Introduction"
  }]
}

Frame Algorithm은 프레임의 구조를 따르는 새 문서를 생성할 수 있습니다:

JSON-LD의 미디어 타입profile 매개변수를 정의하며 이를 통해 framed document form을 신호하거나 요청할 수 있습니다. 프레임된 문서 형태를 식별하는 profile URI는 http://www.w3.org/ns/json-ld#framed입니다.

JSON-LD의 미디어 타입은 또한 HTML 문서 내에 프레임을 포함하는 script element를 식별하는 profile 매개변수를 정의합니다. 타입이 application/ld+json;profile=http://www.w3.org/ns/json-ld#frame인 첫 번째 script elementframe을 찾는 데 사용됩니다.

7. HTML 문서에 JSON-LD 임베딩하기

참고

이 절은 documentLoaderHTML 스크립트 추출을 지원하는 경우에 사용할 수 있는 기능을 설명합니다. 자세한 내용은 원격 문서 및 컨텍스트 검색을 참조하십시오.

JSON-LD 콘텐츠는 HTML 내에서 script 요소type 속성으로 application/ld+json를 설정하여 쉽게 임베딩할 수 있습니다. 이렇게 하면 데이터 블록이 생성됩니다.

이러한 데이터의 사용 방식을 정의하는 것은 본 명세의 범위를 벗어납니다. 임베디드된 JSON-LD 문서는 그대로 추출되거나 예를 들어 RDF로 해석될 수 있습니다.

JSON-LD 콘텐츠가 RDF로 추출되는 경우(RDF11-CONCEPTS), 그것은 반드시 RDF 데이터셋으로 확장되어야 하며, Deserialize JSON-LD to RDF Algorithm ([JSON-LD11-API])를 사용해야 합니다. 특정 스크립트가 대상이 아닌 한(예: § 7.3 특정 JSON-LD 스크립트 요소 찾기 참조), script 요소들typeapplication/ld+json인 모든 요소는 반드시 처리되어 단일 데이터셋으로 병합되어야 하며, 서로 다른 스크립트 요소에 포함된 블랭크 노드 식별자는 동일 문서에 있는 것처럼 취급되어 공유됩니다(즉, 블랭크 노드가 다른 JSON-LD 스크립트 요소들 간에 공유됨).

7.1 HTML의 base 요소로부터 기본 IRI 상속

JSON-LD script 요소를 처리할 때, 포함하는 HTML 문서의 문서 기본 URL이 [HTML]에 정의된 대로 포함된 JSON-LD 콘텐츠의 기본 base IRI를 설정하는 데 사용됩니다.

HTML은 기본 URL의 동적 변경을 허용합니다. 이 명세는 특정 동작을 요구하지 않으며, 모든 시스템이 base IRI를 동일하게 처리하도록 보장하기 위해 저자는 권장되는 대로 IRIs를 사용하거나 § 4.1.3 Base IRI에 명시된 대로 명시적으로 지정해야 합니다. 구현(특히 DOM을 네이티브로 운영하는 구현)은 기본 URL의 동적 변경을 고려할 수 있습니다(허용).

7.2 JSON-LD script 요소의 내용 제한

이 절은 규범적이지 않습니다.

HTML의 script 요소 내용 제한으로 인해, script 요소에 포함된 JSON-LD 데이터에는 추가적인 인코딩 제한이 적용됩니다.

저자는 HTML 내부에 임베드된 스크립트에서 comment-open, script-open, comment-close, 또는 script-close와 혼동될 수 있는 문자 시퀀스 사용을 피해야 합니다.

참고
해당 내용은 아래에 표시된 대로 이스케이프되어야 하지만, JSON-LD API를 통해 처리한 후에도 내용은 이스케이프된 상태로 남아 있습니다 ([JSON-LD11-API]).
  • & → & (ampersand, U+0026)
  • &lt; → < (less-than sign, U+003C)
  • &gt; → > (greater-than sign, U+003E)
  • &quot; → " (quotation mark, U+0022)
  • &apos; → ' (apostrophe, U+0027)

7.3 특정 JSON-LD 스크립트 요소 찾기

HTML 문서 내의 특정 script 요소는 URL로 위치한 HTML 문서 내의 스크립트 요소의 고유 식별자와 일치하는 프래그먼트 식별자를 사용하여 찾을 수 있습니다 (참조: [DOM]). JSON-LD 프로세서는 지정된 데이터 블록의 내용을 추출하여 독립 실행형 JSON-LD 문서로 파싱해야 하며(반드시), 동일한 HTML 문서의 다른 마크업과 결과를 병합해서는 안 됩니다(금지).

예를 들어, http://example.com/document에 위치한 HTML 문서가 있고, 아이디가 "dave"인 스크립트 요소를 지정하려면 URL http://example.com/document#dave를 사용할 수 있습니다.

8. 데이터 모델

JSON-LD는 JSON을 기반으로 하는 Linked Data의 직렬화 형식입니다. 따라서 구문(이는 [RFC8259]의 JSON에 의해 정의됨)과 데이터 모델(이는 RDF 데이터 모델의 확장임) 사이를 구별하는 것이 중요합니다. JSON-LD가 RDF 데이터 모델과 어떻게 연관되는지에 대한 정확한 세부사항은 § 10. RDF와의 관계에서 제공됩니다.

RDF 모델에 익숙하지 않은 개발자의 이해를 돕기 위해, 다음 요약을 제공합니다:

JSON-LD 문서는 위에서 정의한 데이터 모델로 표현할 수 없는 데이터를 포함할 수 있습니다(MAY). 달리 명시되지 않는 한, 그러한 데이터는 JSON-LD 문서가 처리될 때 무시됩니다. 이 규칙의 결과 중 하나는 @context에 매핑되지 않는 속성들이 IRI, blank node, 또는 키워드로 매핑되지 않으면 무시된다는 것입니다.

또한 JSON 직렬화 형식은 내부적으로 JSON-LD 내부 표현을 사용하여 표현되며, 이는 리스트, 맵, 문자열, 숫자, 불리언, null과 같은 일반적인 개념을 사용하여 JSON 문서로 표현된 데이터를 설명합니다.

이 이미지는 기본 그래프 하나와 두 개의 이름 있는 그래프를 포함한 링크드 데이터 데이터셋을 보여줍니다.

그림 1 링크드 데이터 데이터셋의 도식입니다.
부록에서 링크드 데이터 데이터셋 도표 설명을 확인할 수 있습니다. 이미지 파일은 SVG PNG 형식으로 제공됩니다.

이 그림에서 설명된 데이터셋은 다음과 같이 표현될 수 있습니다:

Note

외부 수준에서 세 개의 최상위 리소스(그중 두 개는 이름이 있는 그래프)를 설명하기 위해 @graph를 사용한 점에 주목하십시오. 이름이 있는 그래프는 각각의 그래프 이름을 제공하기 위해 @id와 함께 @graph를 사용합니다.

9. JSON-LD 문법

이 절은 이전 절들에서 설명한 구문 규칙을 보다 형식적으로 재진술합니다.

JSON-LD 문서는 [RFC8259]에 설명된 대로 유효한 JSON 텍스트이어야 MUST 하며, 또는 유효한 JSON-LD 내부 표현으로 표현될 수 있는 형식이어야 합니다.

JSON-LD 문서는 하나의 노드 객체, 오직 @context 및/또는 @graph 엔트리만을 포함하는 , 또는 0개 이상의 노드 객체로 구성된 배열이어야 합니다(MUST).

JSON과 달리 JSON-LD에서는 객체의 키가 반드시 유일해야 합니다(MUST).

이 문법에서 키워드가 논의될 때, 해당 문장은 그 키워드의 별칭(alias)에도 동일하게 적용됩니다.

참고

JSON-LD는 키워드의 별칭을 허용합니다(자세한 내용은 § 4.1.6 키워드 별칭 참조). 예를 들어 활성 컨텍스트가 id라는 term@id의 별칭으로 정의한 경우, 해당 별칭은 @id의 대체로 정당하게 사용될 수 있습니다. 단, 키워드 별칭은 컨텍스트 처리 중에 확장되지 않는다는 점에 유의하십시오.

9.1 용어(terms)

term은 짧은 형태의 문자열로서 IRI, blank node identifier, 또는 키워드로 확장됩니다.

term은 JSON-LD의 키워드와 같아서는 안 됩니다(MUST NOT), 단, @type는 예외입니다.

Compact IRI의 prefix로 사용될 때, prefix가 IRI 스킴과 혼동되는 것을 피하기 위해 terms는 가능한 경우 IANA에 등록된 URI 스킴 목록에 속하지 않는 것이 좋습니다(SHOULD NOT). 유사하게, Compact IRI와 term 간의 혼동을 피하려면 term에 콜론(:)을 포함하지 않는 것이 바람직하며(SHOULD NOT), isegment-nz-nc 형태로 제한하는 것이 권장됩니다.

전향 호환성 문제를 피하기 위해 term@ 문자로 시작해서 오직 하나 이상의 알파벳 문자만으로 구성되는 형태로 시작해서는 안 됩니다(SHOULD NOT), 이는 향후 JSON-LD 버전에서 추가 키워드가 도입될 수 있기 때문입니다. 또한 term은 빈 문자열("")이어서는 안 됩니다(MUST NOT), 일부 프로그래밍 언어는 빈 JSON 키를 처리하지 못할 수 있습니다.

더 자세한 내용은 § 3.1 컨텍스트§ 3.2 IRIs를 참조하여 termsIRIs로 매핑하는 방법에 대해 살펴보십시오.

9.2 노드 객체(Node Objects)

노드 객체노드의 하나 이상 속성을 그래프에 직렬화된 형태로 나타냅니다. 은 다음 조건을 만족할 때 노드 객체로 간주됩니다:

문서 내에서 한 노드의 속성들은 서로 다른 노드 객체들에 걸쳐 분산될 수 있습니다. 이 경우 서로 다른 노드 객체들의 키를 병합하여 결과 노드의 속성을 만들어야 합니다.

노드 객체는 반드시 이어야 합니다(MUST). 활성 컨텍스트에서 유효한 terms 또는 compact IRIs, 또는 IRIs가 아닌 모든 키는 다음의 키워드(또는 그 별칭)가 아닌 한 처리 시 무시되어야 합니다(MUST):

만약 노드 객체에 @context 키가 있다면 그 값은 MUST null, IRI 참조, 컨텍스트 정의, 또는 이들로 구성된 배열이어야 합니다.

만약 노드 객체에 @id 키가 있다면 그 값은 MUST IRI 참조 또는 compact IRI (blank node identifier 포함)이어야 합니다. 자세한 내용은 § 3.3 Node Identifiers, § 4.1.5 Compact IRIs, 및 § 4.5.1 Identifying Blank Nodes를 참조하십시오.

만약 노드 객체에 @graph 키가 있다면 그 값은 MUST 노드 객체 또는 0개 이상의 노드 객체로 구성된 배열이어야 합니다. 노드 객체가 @id를 동시에 포함하면 그 값은 이름이 있는 그래프의 그래프 이름으로 사용됩니다. @graph 값에 대해 자세한 논의는 § 4.9 Named Graphs를 참조하십시오. 특수한 경우로, 맵이 문서의 루트이며 @graph@context 외의 키를 포함하지 않는다면 그 맵은 노드 객체로 취급되지 않으며 이는 연결된 그래프를 구성하지 않는 노드 객체들을 정의할 수 있는 방법입니다. 이렇게 하면 모든 구성 노드 객체들이 공유하는 컨텍스트를 정의할 수 있습니다.

만약 노드 객체에 @type 키가 있다면 그 값은 MUST IRI 참조, compact IRI(blank node identifier 포함), 활성 컨텍스트 내에 정의된 term(IRI로 확장되는), 또는 이들로 구성된 배열 중 하나여야 합니다. § 3.5 Specifying the Type를 참조하십시오.

만약 노드 객체에 @reverse 키가 있다면 그 값은 역방향 속성을 나타내는 엔트리들을 포함한 맵이어야 하며(MUST), 각 역방향 속성의 값은 IRI 참조, compact IRI, blank node identifier, 노드 객체 또는 이들의 조합을 포함하는 배열이어야 합니다.

만약 노드 객체에 @included 키가 있다면 그 값은 MUST included block이어야 합니다. 포함 블록에 관해서는 § 9.13 Included Blocks를 참조하십시오.

만약 노드 객체에 @index 키가 있다면 그 값은 MUST 문자열이어야 합니다. § 4.6.1 Data Indexing를 참조하십시오.

만약 노드 객체에 @nest 키가 있다면 그 값은 맵 또는 맵들의 배열이어야 하며(MUST), 그 내부 맵은 value object를 포함해서는 안 됩니다(MUST NOT)。§ 9.14 Property Nesting에서 @nest 값에 대해 더 논의합니다。

노드 객체의 키들 중 키워드가 아닌 것들은 활성 컨텍스트를 사용하여 IRI로 확장될 수 있습니다(MAY). IRI로 확장된 키에 대한 값들은 다음 중 하나여야 합니다(MUST):

9.3 프레임 객체(Frame Objects)

프레이밍(framing)을 할 때, 프레임 객체는 프레이밍에 특화된 엔트리들을 허용하기 위해 노드 객체를 확장합니다.

프레임 객체의 사용 방법에 대해서는 [JSON-LD11-FRAMING]를 참조하십시오.

9.4 그래프 객체(Graph Objects)

그래프 객체는 이름이 있는 그래프(named graph)를 나타내며, 명시적 그래프 이름을 포함할 수 있습니다(MAY). 맵은 다음 조건을 만족할 때 그래프 객체로 간주됩니다: JSON-LD 컨텍스트 외부에 존재하고, @graph 엔트리를 포함하며, 문서의 최상위 맵이 아니고, @graph, @index, @id, @context 또는 이들의 별칭 외에는 다른 엔트리를 포함하지 않는 경우입니다.

그래프 객체에 @context 키가 있다면 그 값은 MUST null, IRI 참조, 컨텍스트 정의 또는 이들로 구성된 배열이어야 합니다.

그래프 객체에 @id 키가 있다면 그 값은 이름이 있는 그래프의 식별자(graph name)로 사용되며, MUST IRI 참조 또는 compact IRI(blank node identifier 포함)여야 합니다. 자세한 내용은 관련 섹션들을 참조하십시오.

@id 엔트리가 없는 그래프 객체는 단순 그래프 객체(simple graph object)이며 명시적 식별자가 없는 이름이 있는 그래프를 나타냅니다. 데이터 모델 상에서는 암묵적으로 할당된 blank node identifier가 그래프 이름으로 존재합니다.

@graph 키의 값은 MUST 노드 객체 또는 0개 이상의 노드 객체로 구성된 배열이어야 합니다. § 4.9 Named Graphs를 참조하십시오.

9.5 값 객체(Value Objects)

value object는 값에 명시적으로 타입이나 언어를 연결하여 typed valuelanguage-tagged string을 생성하고, 경우에 따라 base direction을 연결하는 데 사용됩니다.

value objectMUST map이며, 반드시 @value 키를 포함해야 합니다. 또한 @type, @language, @direction, @index 또는 @context 키를 가질 MAY 있으나, 동시에 @type@language 또는 @direction 키를 함께 포함해서는 안 됩니다(MUST NOT). 한 value object는 또한 MUST NOT IRI로 확장되거나 keyword로 확장되는 다른 어떤 키도 포함해서는 안 됩니다.

@value 키에 연결된 값은 MUST string, number, true, false 또는 null 중 하나여야 합니다. 만약 @type 키에 연결된 값이 @json이라면, 그 값은 array 또는 objectMAY 있습니다.

@type 키에 연결된 값은 MUST term, IRI, compact IRI, vocabulary mapping을 사용하여 IRI로 변환될 수 있는 문자열, @json, 또는 null이어야 합니다.

@language 키에 연결된 값은 MUST [BCP47]에 설명된 lexical form을 가져야 하거나 null일 수 있습니다.

@direction 키에 연결된 값은 MUST "ltr" 또는 "rtl" 중 하나이거나 null이어야 합니다.

@index 키에 연결된 값은 MUST string이어야 합니다.

자세한 내용은 § 4.2.1 Typed Values§ 4.2.4 String Internationalization를 참조하여 value object에 대한 추가 정보를 확인하십시오.

9.6 값 패턴(Value Patterns)

프레이밍을 할 때, 값 패턴값 객체를 확장하여 프레이밍에 특화된 엔트리들을 허용합니다.

9.7 리스트와 셋(sets)

리스트는 순서가 있는 값들의 집합을 나타내며, 셋은 순서가 없는 값들의 집합을 나타냅니다. 특별한 명시가 없는 한 JSON-LD에서 배열은 순서가 없다고 간주됩니다. 따라서 문서 본문에서 사용된 @set 키워드는 처리 시 최적화되어 사라지는 문법적 설탕(syntactic sugar)입니다. 그러나 문맥(context) 내에서 매우 유용합니다. @set 또는 @list 컨테이너와 연관된 용어의 값은 문서를 처리할 때 항상 배열 형태로 표현됩니다—비록 단일 값만 있더라도(압축된 문서 형태에서는 비배열 형태로 최적화될 수 있는 경우라도) 이는 후처리를 단순화하여 데이터가 항상 결정론적 형태로 유지되도록 합니다.

리스트 객체MUST 이어야 하며, @list@index 외에는 IRI나 키워드로 확장되는 키를 포함해서는 안 됩니다.

셋 객체MUST 이어야 하며, @set@index 외에는 IRI나 키워드로 확장되는 키를 포함해서는 안 됩니다. 처리 시 @index 키는 무시된다는 점에 유의하십시오.

@list@set 키에 연결된 값은 반드시 다음 타입들 중 하나여야 합니다(MUST):

셋과 리스트에 관한 추가 논의는 § 4.3 Value Ordering을 참조하십시오。

9.8 언어 맵(Language Maps)

언어 맵은 값에 언어를 연결하여 프로그램이 쉽게 접근할 수 있도록 하는 데 사용됩니다. 언어 맵은 노드 객체 내의 용어 값으로 사용될 수 있으며, 해당 용어가 @container@language로 정의했거나 @language@set를 포함하는 배열로 정의된 경우에 해당합니다。언어 맵의 키는 BCP47 언어 태그를 나타내는 문자열, 키워드 @none, 또는 @none로 확장되는 term 중 하나여야 하며(MUST), 값은 다음 타입 중 하나여야 합니다:

언어 맵에 관한 추가 설명은 § 4.2.4 String Internationalization을 참조하십시오。

9.9 인덱스 맵(Index Maps)

인덱스 맵은 의미적 의미가 없는 키들이지만 보존되어야 하는 경우 JSON-LD 문서에서 사용할 수 있게 합니다. 인덱스 맵은 용어가 @container@index로 정의되었거나 @index@set를 포함하는 배열로 정의된 경우 노드 객체 내에서 용어 값으로 사용될 수 있습니다。인덱스 맵의 엔트리 값은 다음 타입 중 하나여야 합니다(MUST):

이 주제에 대한 추가 정보는 § 4.6.1 Data Indexing를 참조하십시오。

인덱스 맵은 또한 용어가 @container@graph@index를 모두 포함하는 배열(선택적으로 @set 포함)으로 정의된 경우 인덱스를 관련된 이름이 있는 그래프(named graphs)에 매핑하는 데 사용될 수 있습니다. 값은 인덱싱된 키를 사용하여 인덱스되는 이름 있는 그래프 내에 포함된 노드 객체들이며, 값에 @id가 포함되지 않으면 단순 그래프 객체로 표현될 수 있고, @id가 포함되면 이름이 있는 그래프로 표현됩니다。

9.10 속성 기반 인덱스 맵

속성 기반의 인덱스 맵은 인덱스가 그래프 내에서 속성 값으로 의미론적으로 보존되는 인덱스 맵의 변형입니다. 속성 기반의 인덱스 맵은 용어가 @container@index로 설정했거나 @index@set를 모두 포함하는 배열로 설정되어 있고, @index문자열로 설정된 경우 노드 객체 내의 용어 값으로 사용할 수 있습니다. 속성 기반 인덱스 맵의 값들은 반드시 노드 객체이거나, 문자열로서 노드 객체로 확장될 수 있어야 합니다.

확장(expanding)할 때, 활성 컨텍스트(active context)가 @index 값에 대한 용어 정의를 포함하고 있으면, 해당 용어 정의가 인덱스 맵(index map)의 키를 확장하는 데 사용됩니다. 그렇지 않으면, 키들은 간단한 값 객체로 확장됩니다. 인덱스 맵의 확장된 값들에 있는 각 노드 객체에는 추가적인 속성 값이 하나 더 추가되는데, 그 속성은 @index의 확장된 값이고, 그 값은 확장된 참조 키입니다.

이 주제에 관해 더 자세한 정보는 § 4.6.1.1 속성 기반 데이터 인덱싱을 참조하십시오.

9.11 Id 맵

id 맵IRI를 프로그램이 쉽게 접근할 수 있는 값에 연결하는 데 사용됩니다. id 맵은 용어가 @container@id로 설정했거나, @id@set를 모두 포함하는 배열로 설정된 경우 노드 객체 내의 용어 값으로 사용할 수 있습니다. id 맵의 키는 반드시 IRI이어야 합니다 (IRI 참조 또는 compact IRI 포함, blank node identifier 포함), 또는 키워드 @none, 또는 @none로 확장되는 term이어야 하며, 값들은 반드시 노드 객체여야 합니다.

값이 @id로 확장되는 속성을 포함하는 경우, 그 값은 참조 키와 동등해야 합니다(MUST). 그렇지 않으면, 확장 시 값에서 가져온 해당 속성이 그 노드 객체 값의 @id로 사용됩니다.

Id 맵은 또한 용어가 @container@graph@id를 모두 포함하는 배열로 정의되고 선택적으로 @set를 포함하는 경우, 인덱스를 그래프 이름에 매핑하는 데 사용될 수 있습니다. 이때 값은 참조 키로 이름이 지정된 이름이 있는 그래프 내에 포함된 노드 객체들로 구성됩니다.

9.12 Type 맵

type 맵IRI를 프로그램이 쉽게 접근할 수 있는 값에 연결하는 데 사용됩니다. type 맵은 용어가 @container@type로 설정했거나, @type@set를 모두 포함하는 배열로 설정된 경우 노드 객체 내의 용어 값으로 사용할 수 있습니다. type 맵의 키는 반드시 IRIs (IRI 참조 또는 compact IRI 포함, blank node identifier 포함), terms, 또는 키워드 @none이어야 하며, 값들은 반드시 노드 객체이거나 문자열로서 노드 객체로 확장될 수 있어야 합니다.

값이 @type으로 확장되는 속성을 포함하고, 적절한 확장을 거친 참조 키와 값이 참조 키를 포함하는 경우에는 해당 노드 객체가 이미 그 타입을 포함하고 있는 것입니다. 그렇지 않으면, 확장 시 값에서 가져온 해당 속성이 그 노드 객체 값의 @type으로 추가됩니다.

9.13 포함 블록(Included Blocks)

포함 블록노드 객체들의 집합을 제공하는 데 사용됩니다. 포함 블록은 노드 객체의 멤버 값으로 @included 또는 @included의 별칭이 사용된 경우에 나타날 수 있습니다(MAY). 포함 블록은 단일 노드 객체이거나 노드 객체들의 배열입니다.

확장(expanding)할 때, 여러 포함 블록들은 단일 포함 블록으로 합쳐집니다.

9.14 속성 네스팅(Property Nesting)

중첩된 속성노드 객체속성들을 별도의 맵이나, 또는 맵들의 배열로 모으는 데 사용됩니다. 이러한 맵들은 값 객체가 되어서는 안 됩니다. 네스팅은 의미론적으로 투명하며, 확장 과정에서 제거됩니다. 속성 네스팅은 재귀적이며, 중첩된 속성들의 집합은 추가 네스팅을 포함할 수 있습니다.

의미론적으로, 네스팅은 해당 속성과 값들이 포함하는 노드 객체 내부에 직접 선언된 것처럼 처리됩니다.

9.15 컨텍스트 정의(Context Definitions)

컨텍스트 정의노드 객체에서의 로컬 컨텍스트를 정의합니다.

컨텍스트 정의반드시 이어야 하며, 그 키들은 반드시 용어, compact IRI, IRI, 또는 다음 키워드 중 하나여야 합니다: @base, @import, @language, @propagate, @protected, @type, @version, 또는 @vocab.

컨텍스트 정의에 @base 키가 있으면, 그 값은 반드시 IRI 참조 또는 null이어야 합니다.

컨텍스트 정의에 @direction 키가 있으면, 그 값은 반드시 "ltr" 또는 "rtl" 중 하나이거나 null이어야 합니다.

컨텍스트 정의가 @import 키워드를 포함하면, 그 값은 반드시 IRI 참조이어야 합니다. @import로 참조된 컨텍스트 정의는 자체적으로 @import 키를 포함해서는 안 됩니다(MUST NOT).

컨텍스트 정의에 @language 키가 있으면, 그 값은 BCP47에서 설명된 어휘적 형태(lexical form)를 가져야 하며 또는 null이어야 합니다(MUST).

컨텍스트 정의에 @propagate 키가 있으면, 그 값은 반드시 true 또는 false여야 합니다.

컨텍스트 정의에 @protected 키가 있으면, 그 값은 반드시 true 또는 false여야 합니다.

컨텍스트 정의에 @type 키가 있으면, 그 값은 반드시 @container@set로 설정된 맵이어야 하며, 선택적으로 @protected 엔트리를 가질 수 있습니다.

컨텍스트 정의에 @version 키가 있으면, 그 값은 반드시 숫자형이며 값은 1.1이어야 합니다.

컨텍스트 정의에 @vocab 키가 있으면, 그 값은 반드시 IRI 참조, compact IRI, blank node identifier, term, 또는 null이어야 합니다.

키가 키워드가 아닌 경우 그 값은 반드시 IRI, compact IRI, term, blank node identifier, 키워드, null, 또는 확장된 용어 정의이어야 합니다.

9.15.1 확장된 용어 정의(Expanded term definition)

확장된 용어 정의는 용어와 그 확장 식별자 간의 매핑과, 그 용어가 노드 객체의 키로 사용될 때 연관된 값의 기타 속성들을 설명하는 데 사용됩니다.

확장된 용어 정의반드시 이어야 하며, 다음 키들 중 0개 이상으로 구성됩니다: @id, @reverse, @type, @language, @container, @context, @prefix, @propagate, 또는 @protected. 확장된 용어 정의는 다른 키를 포함해서는 안 됩니다(SHOULD NOT).

연관된 용어가 @type일 때, 확장된 용어 정의는 @container@protected 외의 키를 포함해서는 안 됩니다(MUST NOT). @container의 값은 단일 값 @set로 제한됩니다.

정의되는 용어가 IRI 또는 compact IRI가 아니고 활성 컨텍스트에 @vocab 매핑이 없는 경우, 확장된 용어 정의는 반드시 @id 키를 포함해야 합니다.

키가 IRI 또는 compact IRI 형태인 용어 정의는 그 키 자체의 확장 이외의 IRI로 확장되어서는 안 됩니다(MUST NOT).

확장된 용어 정의에 @id 키가 있으면, 그 값은 반드시 null, IRI, blank node identifier, compact IRI, term, 또는 키워드여야 합니다.

확장된 용어 정의에 @reverse 엔트리가 있으면, 그때는 동시에 @id@nest 엔트리를 가질 수 없으며(MUST NOT), 그 값은 반드시 IRI, blank node identifier, compact IRI, 또는 term이어야 합니다. 만약 @container 엔트리가 존재하면, 그 값은 반드시 null, @set, 또는 @index이어야 합니다.

확장된 용어 정의에 @type 키워드가 있으면, 그 값은 반드시 IRI, compact IRI, term, null, 또는 키워드 중 하나여야 합니다. 허용되는 키워드에는 @id, @json, @none, 또는 @vocab가 포함됩니다.

확장된 용어 정의에 @language 키워드가 있으면, 그 값은 BCP47의 어휘적 형태를 가져야 하거나 null이어야 합니다(MUST).

확장된 용어 정의에 @index 키워드가 있으면, 그 값은 반드시 IRI, compact IRI, 또는 term이어야 합니다.

확장된 용어 정의에 @container 키워드가 있으면, 그 값은 반드시 다음 중 하나여야 합니다: @list, @set, @language, @index, @id, @graph, @type, 또는 null, 또는 정확히 그들 중 하나만을 포함하는 배열이나, @set와 결합된 형태의 조합 등이 허용됩니다. 또한 @container@graph@id 또는 @index를 함께 포함하는 배열일 수 있으며, 선택적으로 @set를 포함할 수도 있습니다. 만약 값이 @language이면, 해당 용어가 @context 외부에서 사용될 때 관련 값은 언어 맵이어야 합니다. 값이 @index이면, 해당 용어가 @context 외부에서 사용될 때 그 값은 인덱스 맵이어야 합니다.

확장된 용어 정의에 @context 엔트리가 있으면, 그 값은 유효한 context definition이어야 합니다(MUST).

확장된 용어 정의에 @nest 키워드가 있으면, 그 값은 @nest이거나 @nest로 확장되는 용어여야 합니다(MUST).

확장된 용어 정의에 @prefix 키워드가 있으면, 그 값은 반드시 true 또는 false여야 합니다.

확장된 용어 정의에 @propagate 키워드가 있으면, 그 값은 반드시 true 또는 false여야 합니다.

확장된 용어 정의에 @protected 키워드가 있으면, 그 값은 반드시 true 또는 false여야 합니다.

용어는 순환적으로 사용되어서는 안 됩니다(MUST NOT). 즉 서로 의존하는 용어 정의의 순환이 있어서는 안 됩니다.

컨텍스트에 관한 추가 논의는 § 3.1 The Context를 참조하십시오.

9.16 키워드(Keywords)

JSON-LD의 키워드§ 1.7 구문 토큰 및 키워드에서 설명되어 있으며, 이 절은 각 키워드가 다양한 JSON-LD 구조 내에서 어디에 나타날 수 있는지를 설명합니다.

노드 객체, 값 객체, 그래프 객체, 리스트 객체, 셋 객체, 및 중첩된 속성 내에서는 키워드 별칭을 해당 키워드 대신 사용할 수 있습니다(MAY), 단 @context는 예외로 별칭을 허용하지 않습니다(MUST NOT). 로컬 컨텍스트와 확장된 용어 정의 내에서는 키워드 별칭을 사용할 수 없습니다(MAY NOT).

@base
비별칭 @base 키워드는 컨텍스트 정의의 키로 사용할 수 있습니다(MAY). 그 값은 반드시 IRI 참조 또는 null이어야 합니다.
@container
비별칭 @container 키워드는 확장된 용어 정의의 키로 사용할 수 있습니다(MAY). 그 값은 반드시 @list, @set, @language, @index, @id, @graph, @type 중 하나이거나 null이어야 합니다. 또는 이들 중 정확히 하나만 포함하는 배열, 혹은 @set@index/@id/@graph/@type/@language의 결합 등이 허용됩니다.
@context
@context 키워드는 별칭이 허용되지 않으며(MUST NOT), 다음 객체들에서 키로 사용할 수 있습니다(MAY):

@context의 값은 반드시 null, IRI 참조, 컨텍스트 정의, 또는 이들의 배열이어야 합니다.

@direction
@direction 키워드는 별칭이 가능하며(MAY) 값 객체의 키로 사용할 수 있습니다. 그 값은 반드시 "ltr" 또는 "rtl"이거나 null이어야 합니다.

비별칭 @direction는 컨텍스트 정의의 키로 사용할 수 있습니다(MAY).

@graph
@graph 키워드는 별칭이 가능하며(MAY) 노드 객체나 그래프 객체의 키로 사용할 수 있습니다. 그 값은 반드시 값 객체, 노드 객체, 또는 이들의 배열이어야 합니다.
@id
@id 키워드는 별칭이 가능하며(MAY) 노드 객체나 그래프 객체의 키로 사용할 수 있습니다. 확장된 용어 정의에서도 키 또는 @container의 값으로 사용할 수 있습니다. 그 값은 반드시 IRI 참조 또는 compact IRI이어야 합니다.
@import
비별칭 @import 키워드는 컨텍스트 정의에서 사용할 수 있으며(MAY), 그 값은 반드시 IRI 참조여야 합니다.
@included
@included 키워드는 별칭이 가능하고(MAY) 그 값은 반드시 포함 블록이어야 합니다.
@index
@index 키워드는 별칭이 가능하고(MAY) 노드 객체, 값 객체, 그래프 객체, 셋 객체, 리스트 객체의 키로 사용할 수 있습니다. 그 값은 반드시 문자열이어야 합니다.
@json
@json 키워드는 별칭이 가능하며(MAY) 값 객체의 @type 값이나 확장된 용어 정의에서 사용할 수 있습니다.
@language
@language 키워드는 별칭이 가능하며(MAY) 값 객체의 키로 사용할 수 있습니다. 그 값은 BCP47 어휘적 형태의 문자열이거나 null이어야 합니다(MUST).
@list
@list 키워드는 별칭이 가능하며(MAY) 리스트 객체의 키로 반드시 사용되어야 합니다(MUST). 그 값은 문자열, 숫자, true, false, null, 노드 객체, 값 객체, 또는 이들의 배열 중 하나여야 합니다.
@nest
@nest 키워드는 별칭이 가능하고(MAY) 노드 객체의 키로 사용할 수 있으며, 그 값은 반드시 맵이어야 합니다.
@none
@none 키워드는 별칭이 가능하며(MAY) 인덱스 맵, id 맵, 언어 맵, 타입 맵 등의 키로 사용할 수 있습니다.
@prefix
비별칭 @prefix 키워드는 확장된 용어 정의의 키로 사용될 수 있으며, 그 값은 반드시 true 또는 false 여야 합니다.
@propagate
비별칭 @propagate 키워드는 컨텍스트 정의에서 사용할 수 있으며, 그 값은 반드시 true 또는 false 여야 합니다.
@protected
비별칭 @protected 키워드는 컨텍스트 정의 또는 확장된 용어 정의에서 사용할 수 있으며, 그 값은 반드시 true 또는 false 여야 합니다.
@reverse
@reverse 키워드는 별칭이 가능하며(MAY) 노드 객체의 키로 사용할 수 있습니다. 그 값은 반드시 IRI 참조 또는 compact IRI여야 합니다.
@set
@set 키워드는 별칭이 가능하며(MAY) 셋 객체의 키로 반드시 사용되어야 합니다(MUST). 그 값은 문자열, 숫자, true, false, null, 노드 객체, 값 객체, 또는 이들의 배열 중 하나여야 합니다.
@type
@type 키워드는 별칭이 가능하며(MAY) 노드 객체나 값 객체의 키로 사용할 수 있습니다. 그 값은 term, IRI 참조, 또는 compact IRI여야 합니다(MUST).
@value
@value 키워드는 별칭이 가능하며(MAY) 값 객체의 키로 반드시 사용되어야 합니다(MUST). 그 값은 문자열, 숫자, true, false, 또는 null 중 하나여야 합니다.
@version
비별칭 @version 키워드는 컨텍스트 정의의 키로 사용될 수 있으며, 그 값은 반드시 숫자형이고 값은 1.1이어야 합니다.
@vocab
비별칭 @vocab 키워드는 컨텍스트 정의의 키로 사용되거나 확장된 용어 정의 내의 @type 값으로 사용될 수 있습니다. 그 값은 IRI 참조, compact IRI, blank node identifier, term, 또는 null이어야 합니다.

10. RDF와의 관계

JSON-LD는 구체적 RDF 구문(concrete RDF syntax)으로, [RDF11-CONCEPTS]에 설명된 바와 같습니다. 따라서 JSON-LD 문서는 RDF 문서이자 JSON 문서이며, 그에 따라 RDF 데이터 모델의 인스턴스를 나타냅니다. 그러나 JSON-LD는 또한 RDF 데이터 모델을 확장하여 선택적으로 JSON-LD가 일반화된 RDF 데이터셋을 직렬화할 수 있도록 합니다. JSON-LD의 RDF 데이터 모델에 대한 확장들은 다음과 같습니다:

Note

속성 레이블에 blank node identifiers를 사용하는 것은 구식이며, 향후 JSON-LD 버전에서 제거될 수 있으며, 일반화된 RDF 데이터셋에 대한 지원도 마찬가지일 수 있습니다.

요약하면, 이러한 차이로 인해 JSON-LD는 모든 RDF 그래프 또는 데이터셋을 직렬화할 수 있으며, 대부분의 JSON-LD 문서는 RDF 1.1 Concepts에 설명된 대로 직접 RDF로 해석될 수 있지만 모든 문서가 그런 것은 아닙니다 ([RDF11-CONCEPTS]).

저자들은 속성에 blank node identifiers를 사용하지 않도록 강력히 권장합니다. 대신 다음 메커니즘 중 하나를 고려하십시오:

JSON-LD를 RDF로 해석하거나 RDF를 JSON-LD로 직렬화하는 규범적 알고리즘은 JSON-LD 1.1 처리 알고리즘 및 API 명세([JSON-LD11-API])에 명세되어 있습니다.

JSON-LD가 RDF 데이터셋을 직렬화할 수 있음에도 불구하고, JSON-LD는 그래프 소스(graph source)로도 사용될 수 있습니다. 그런 경우 소비자는 반드시 기본 그래프만 사용하고 모든 이름 있는 그래프는 무시해야 합니다. 이는 서버가 Turtle이나 JSON-LD와 같은 언어로 데이터를 노출할 때 HTTP 콘텐츠 협상을 사용할 수 있게 합니다.

Note

데이터셋과 그래프 양쪽 문법을 모두 지원하는 게시자는 주 데이터를 기본 그래프에 저장하도록 보장해야 하며, 이는 데이터셋을 지원하지 않는 소비자도 정보를 처리할 수 있게 합니다.

10.1 RDF 직렬화/역직렬화

이 절은 비규범적입니다.

RDF를 JSON-LD로 직렬화하거나 JSON-LD를 RDF로 역직렬화하는 과정은 RDF 직렬화-역직렬화 알고리즘을 실행하는 것에 의존합니다. 이는 JSON-LD 1.1 처리 알고리즘 및 API 명세([JSON-LD11-API])에 정의되어 있습니다. 이 문서에서 이들 알고리즘을 더 자세히 설명하는 것은 범위를 벗어나지만, 과정을 설명하기 위해 필요한 작업의 요약을 제공합니다.

JSON-LD 문서를 RDF로 역직렬화하는 절차는 다음 단계를 포함합니다:

  1. JSON-LD 문서를 확장(expand)하여 모든 컨텍스트를 제거합니다. 이렇게 하면 프로퍼티, 타입 및 값들이 IRI 및 확장된 값으로 완전하게 표현됩니다. 확장(Expansion)§ 5.1 확장된 문서 형태에서 더 자세히 논의됩니다.
  2. 문서를 평탄화(flatten)하여 문서를 노드 객체들의 배열로 변환합니다. 평탄화는 § 5.3 평탄화된 문서 형태에서 더 자세히 설명됩니다.
  3. 노드 객체를 일련의 트리플(triples)로 변환합니다.

예를 들어, 다음은 압축된 형태의 JSON-LD 문서입니다:

Example 151: 샘플 JSON-LD 문서
{
  "@context": {
    "name": "http://xmlns.com/foaf/0.1/name",
    "knows": "http://xmlns.com/foaf/0.1/knows"
  },
  "@id": "http://me.markus-lanthaler.com/",
  "name": "Markus Lanthaler",
  "knows": [
    {
      "@id": "http://manu.sporny.org/about#manu",
      "name": "Manu Sporny"
    }, {
      "name": "Dave Longley"
    }
  ]
}

위 JSON-LD 입력 문서에 대해 JSON-LD의 확장평탄화 알고리즘을 실행하면 다음과 같은 출력이 생성됩니다:

Example 152: 앞의 예시의 확장 및 평탄화된 형태
[
  {
    "@id": "_:b0",
    "http://xmlns.com/foaf/0.1/name": "Dave Longley"
  }, {
    "@id": "http://manu.sporny.org/about#manu",
    "http://xmlns.com/foaf/0.1/name": "Manu Sporny"
  }, {
    "@id": "http://me.markus-lanthaler.com/",
    "http://xmlns.com/foaf/0.1/name": "Markus Lanthaler",
    "http://xmlns.com/foaf/0.1/knows": [
      { "@id": "http://manu.sporny.org/about#manu" },
      { "@id": "_:b0" }
    ]
  }
]

이를 RDF로 역직렬화하는 과정은 각 노드 객체를 하나 이상의 트리플로 변환하는 간단한 과정입니다. 이는 Turtle로 다음과 같이 표현할 수 있습니다:

Example 153: 확장/평탄화된 문서의 Turtle 표현
@prefix foaf: <http://xmlns.com/foaf/0.1/> .

_:b0 foaf:name "Dave Longley" .

<http://manu.sporny.org/about#manu> foaf:name "Manu Sporny" .

<http://me.markus-lanthaler.com/> foaf:name "Markus Lanthaler" ;
    foaf:knows <http://manu.sporny.org/about#manu>, _:b0 .

RDF를 JSON-LD로 직렬화하는 과정은 이 마지막 단계를 역으로 생각하면 되며, RDF의 트리플과 거의 일치하는 확장된 JSON-LD 문서를 생성하도록, 공통 주어를 가진 모든 트리플에 대해 단일 노드 객체를 사용하고, 공통 술어를 가진 트리플들에 대해 단일 프로퍼티를 사용하는 방식으로 진행됩니다. 결과는 프레이밍 알고리즘을 사용하여 원하는 객체 임베딩을 생성하도록 프레임될 수 있습니다.

10.2 rdf:JSON 데이터형

RDF는 JSON 콘텐츠를 가능한 리터럴 값으로 허용합니다. 이는 리터럴 값 안에 마크업을 포함할 수 있게 합니다. 이러한 콘텐츠는 데이터 그래프에서 데이터 타입이 rdf:JSON으로 설정된 리터럴을 사용해 표시됩니다.

rdf:JSON 데이터형은 다음과 같이 정의됩니다:

이 데이터형을 나타내는 IRI
http://www.w3.org/1999/02/22-rdf-syntax-ns#JSON입니다.
렉시컬 공간(lexical space)
JSON 문법을 준수하는 UNICODE 문자열들의 집합입니다(자세한 내용은 RFC8259의 Section 2 JSON Grammar 참조).
값 공간(value space)
는 또한 JSON 문법을 준수하는 UNICODE 문자열들의 집합이며, 다음 제약을 추가로 만족해야 합니다:
  • 불필요한 공백을 포함해서는 안 됩니다(MUST NOT),
  • 객체의 키는 사전순(lexicographically)으로 정렬되어야 합니다(MUST),
  • 네이티브 숫자 값은 ECMASCRIPT 섹션 7.1.12.1에 따라 직렬화되어야 합니다(MUST),
  • 문자열은 U+0000에서 U+001F까지의 유니코드 코드포인트를 소문자 16진수 유니코드 표기(\uhhhh)로 직렬화해야 합니다. 다만 미리 정의된 JSON 제어 문자 U+0008, U+0009, U+000A, U+000C, U+000D는 각각 \b, \t, \n, \f, \r로 직렬화하는 것이 권장됩니다. 그 밖의 유니코드 문자는 가능한 한 "있는 그대로" 직렬화해야 하며, 단 U+005C(\)와 U+0022(")는 각각 \\\"로 직렬화하는 것이 권장됩니다(SHOULD).
Issue
JSON 정규화 표준인 JSON Canonicalization Scheme (JCS) [RFC8785]는 떠오르는 표준입니다. 이 명세는 향후 이러한 정규 표현을 요구하도록 업데이트될 가능성이 있습니다. 사용자들은 JSON 리터럴의 렉시컬 표현을 RDF 리터럴로서 의존하지 않도록 주의해야 합니다.
비록 이들을 문자열들의 집합으로 정의하지만, 이 값 공간은 기존 규격과의 부작용을 피하기 위해 xsd:string의 값 공간과 구분되어 간주됩니다.
렉시컬-값 매핑(lexical-to-value mapping)
는 렉시컬 공간의 임의의 요소를 다음의 결과로 매핑합니다:
  1. 이를 JSON.parse에 의해 생성되는 내부 표현으로 파싱하여 ECMASCRIPT 표현과 일치하는 내부 표현을 얻습니다,
  2. 그 다음 위에서 설명한 값 공간의 제약을 준수하면서 JSON 형식으로 직렬화합니다.
정규 매핑(canonical mapping)
는 값 공간의 임의의 요소를 렉시컬 공간의 동일한 문자열로 매핑합니다.

10.3 i18n 네임스페이스

이 절은 비규범적입니다.

i18n 네임스페이스는 언어 태그기본 방향의 조합을 RDF 리터럴에서 기술하는 데 사용됩니다. 이는 BCP47 언어 태그와 기본 방향을 대체 메커니즘으로 설명하는 데 사용됩니다.

이 네임스페이스를 기반으로 한 데이터형은 기본 방향을 사용하는 JSON-LD 문서의 라운드 트리핑을 허용하지만, 그 메커니즘 자체는 표준화되어 있지 않습니다.

JSON-LD를 RDF로 역직렬화하는 알고리즘rdfDirection 옵션을 i18n-datatype으로 설정하면 RDF 리터럴을 생성할 때 i18n 네임스페이스를 사용하여 값 객체에 포함된 @direction과 선택적 @language를 결합한 IRI를 생성할 수 있습니다. 구체적으로는 https://www.w3.org/ns/i18n# 뒤에 @language 값(있다면)을 소문자로 붙이고 이어서 밑줄("_")과 @direction 값을 붙입니다.

상호 운용성을 향상시키기 위해, 데이터형 IRI를 생성할 때 언어 태그는 소문자로 정규화됩니다.

다음 예시는 언어 태그 ar-EG과 기본 방향 rtl을 인코딩한 i18n:ar-EG_rtl 값을 가진 두 진술을 보여줍니다.

@prefix ex: <http://example.org/> .
@prefix i18n: <https://www.w3.org/ns/i18n#> .

# Note that this version preserves the base direction using a non-standard datatype.
[
  ex:title "HTML و CSS: تصميم و إنشاء مواقع الويب"^^i18n:ar-eg_rtl;
  ex:publisher "مكتبة"^^i18n:ar-eg_rtl
] .

§ 4.2.4.1 기본 방향(Base Direction)을 참조하면 문자열에 대한 기본 방향 사용에 관한 자세한 정보를 얻을 수 있습니다.

10.4 rdf:CompoundLiteral 클래스 및 rdf:language, rdf:direction 속성

이 절은 비규범적입니다.

이 명세는 rdf:value에 대한 동일한 주체에서 문자열 값을 연관시키기 위해 기본 방향과 선택적 언어 태그를 포함하는 RDF 리터럴 값을 기술하는 데 사용되는 rdf:CompoundLiteral 클래스를 정의합니다. 이 클래스는 rdf:languagerdf:direction의 도메인으로 설정됩니다.

rdf:CompoundLiteral
복합 리터럴을 나타내는 클래스입니다.
rdf:language
RDF 속성입니다. 이 속성의 범위(range)는 rdfs:Literal이며, 그 값은 잘-형성된 BCP47 언어 태그여야 합니다(MUST). 이 속성의 도메인(domain)은 rdf:CompoundLiteral입니다.
rdf:direction
RDF 속성입니다. 이 속성의 범위는 rdfs:Literal이며, 그 값은 "ltr" 또는 "rtl" 중 하나여야 합니다(MUST). 이 속성의 도메인은 rdf:CompoundLiteral입니다.

JSON-LD를 RDF로 역직렬화하는 알고리즘rdfDirection 옵션을 compound-literal로 설정하여 RDF 리터럴을 생성할 때 이들 속성을 사용하여 값 객체의 @direction 및 선택적 @language를 설명할 수 있습니다.

상호 운용성을 향상시키기 위해, 데이터형 IRI를 생성할 때 언어 태그는 소문자로 정규화됩니다.

다음 예시는 복합 리터럴을 사용하여 언어 태그 ar-EG와 기본 방향 rtl을 가지는 문자열을 나타내는 두 진술을 보여줍니다.

@prefix ex: <http://example.org/> .

# Note that this version preserves the base direction using a bnode structure.
[
  ex:title [
    rdf:value "HTML و CSS: تصميم و إنشاء مواقع الويب",
    rdf:language "ar-eg",
    rdf:direction "rtl"
  ];
  ex:publisher [
    rdf:value "مكتبة",
    rdf:language "ar-eg",
    rdf:direction "rtl"
  ]
] .

§ 4.2.4.1 기본 방향(Base Direction)을 참조하면 문자열에 대한 기본 방향 사용에 관한 자세한 정보를 얻을 수 있습니다.

11. 보안 고려사항

자세한 내용은 Security Considerations§ C. IANA Considerations에서 참조하십시오.

Note

이 명세의 향후 버전들은 캐시된 및 검색된 콘텐츠가 원격 서버에서 가져온 데이터와 일치하는지 확인하는 수단으로 서브리소스 무결성(Subresource Integrity, SRI)을 통합할 수 있습니다; 관련 논의는 issue 86를 참조하십시오.

12. 프라이버시 고려사항

외부 컨텍스트를 가져오는 것은 JSON-LD 프로세서의 동작을 노출시킬 수 있으며, 중간 노드가 검색된 리소스를 검사하여 클라이언트 애플리케이션을 지문(fingerprint)으로 식별할 수 있게 하고, 중간자 공격의 기회를 제공할 수 있습니다(참조: [fingerprinting-guidance] 참조). 이를 방지하기 위해 게시자는 원격 컨텍스트를 캐싱하여 향후 사용하거나, documentLoader를 사용하여 그러한 컨텍스트의 로컬 버전을 유지하는 것을 고려해야 합니다.

13. 국제화 고려사항

JSON-LD는 RDF 데이터 모델을 사용하므로, 좌->우 또는 우->좌 방향 지시자가 포함된 문자열인 JSON-LD 값을 올바르게 기록하는 능력에는 설계상 제한이 있습니다. JSON-LD와 RDF는 문자열에 연결된 언어를 지정하는 메커니즘(언어 태그 문자열)을 제공하지만, 문자열의 기본 방향을 나타내는 수단은 제공하지 않습니다.

유니코드는 문자열 내에서 방향을 신호하는 메커니즘을 제공합니다(참조: Unicode Bidirectional Algorithm [UAX9]). 그러나 문자열의 전체적인 기본 방향을 문자열 시작 부분으로부터 결정할 수 없을 때에는, 외부 지시기가 필요합니다. 예를 들어 HTML의 dir 속성처럼 말입니다. 현재 이 속성에는 RDF 리터럴에 대한 대응 수단이 없습니다.

RDF에서 기본 방향을 올바르게 표현하는 문제는 이 작업 그룹이 해결할 수 있는 범위가 아니며, 이는 핵심 RDF 데이터 모델의 제약입니다. 향후 RDF 작업 그룹이 이 문제를 검토하여 언어 태그가 있는 문자열의 기본 방향을 지정할 수 있는 기능을 추가할 것을 기대합니다.

향후 버전에서 더 포괄적인 해결책이 다뤄질 때까지, 게시자들은 문자열의 기본 방향을 문자열 내용만으로 올바르게 유추할 수 없는 경우 이 문제를 고려해야 합니다. 웹에서 사용되는 문자열에 대한 언어 및 기본 방향 식별의 모범 사례에 대해서는 [string-meta]를 참조하십시오.

A. 이미지 설명

이 절은 비규범적입니다.

A.1 링크드 데이터 데이터셋

이 절은 비규범적입니다.

이 절은 링크드 데이터 데이터셋 도표§ 8. 데이터 모델에서 설명합니다.

이미지는 서로 다른 링크드 데이터 그래프를 설명하는 점선 상자 세 개로 구성되어 있습니다. 각 상자에는 링크드 데이터 관계를 설명하는 화살표로 연결된 도형들이 포함되어 있습니다.

첫 번째 상자는 제목이 "default graph: <no name>"이며 두 개의 리소스 http://example.com/people/alicehttp://example.com/people/bob ("Alice"와 "Bob"을 각각 나타냄)을 설명합니다. 이들 사이에는 schema:knows라는 레이블이 붙은 화살표로 연결되어 두 리소스 간의 knows 관계를 나타냅니다. 또한 "Alice" 리소스는 다음 세 가지 리터럴과 연관되어 있습니다:

Alice
데이터 타입이나 언어가 없는 RDF 리터럴입니다.
weiblich | de
값이 "weiblich"이고 언어 태그(language tag)가 "de"인 언어 태그 문자열입니다.
female | en
값이 "female"이고 언어 태그가 "en"인 언어 태그 문자열입니다.

두 번째 및 세 번째 상자는 각각 그래프 이름이 "http://example.com/graphs/1" 및 "http://example.com/graphs/1"인 두 개의 이름 있는 그래프을 설명합니다.

두 번째 상자는 두 개의 리소스 http://example.com/people/alicehttp://example.com/people/bob로 구성되며, 이들은 schema:parent 관계로 연결되어 있고 http://example.com/people/bob에 "Bob"이라는 이름을 부여합니다.

세 번째 상자는 두 개의 리소스로 구성되어 있는데, 하나는 이름이 http://example.com/people/bob이고 다른 하나는 이름이 없습니다. 이 두 리소스는 schema:sibling 관계로 서로 연결되어 있으며 두 번째 리소스는 "Mary"라는 이름을 갖습니다.

B. 다른 링크드 데이터 형식과의 관계

이 절은 비규범적입니다.

아래의 JSON-LD 예제들은 JSON-LD가 Turtle, RDFa, Microdata와 같은 다른 링크드 데이터 형식으로 표시된 의미적 데이터를 어떻게 표현할 수 있는지를 보여줍니다. 이 절들은 JSON-LD가 다양한 링크드 데이터 접근 방식 전반에서 무엇을 표현할 수 있는지에 대해 매우 유연하다는 근거로 제공됩니다.

B.1 Turtle

이 절은 비규범적입니다.

다음은 [Turtle]로 표현된 RDF를 JSON-LD로 변환하는 예들입니다.

B.1.1 프리픽스 정의

JSON-LD 컨텍스트는 Turtle의 @prefix 선언과 직접적으로 대응되는 항목을 가집니다:

Example 154: Turtle로 직렬화된 문장 집합
@prefix foaf: <http://xmlns.com/foaf/0.1/> .

<http://manu.sporny.org/about#manu> a foaf:Person;
  foaf:name "Manu Sporny";
  foaf:homepage <http://manu.sporny.org/> .
Example 155: 동일한 문장 집합의 JSON-LD 직렬화
{
  "@context": {
    "foaf": "http://xmlns.com/foaf/0.1/"
  },
  "@id": "http://manu.sporny.org/about#manu",
  "@type": "foaf:Person",
  "foaf:name": "Manu Sporny",
  "foaf:homepage": { "@id": "http://manu.sporny.org/" }
}

B.1.2 임베딩

둘 다 [Turtle]와 JSON-LD는 임베딩을 허용하지만, Turtle은 blank nodes의 임베딩만 허용합니다.

Example 156: Turtle에서의 임베딩
@prefix foaf: <http://xmlns.com/foaf/0.1/> .

<http://manu.sporny.org/about#manu>
  a foaf:Person;
  foaf:name "Manu Sporny";
  foaf:knows [ a foaf:Person; foaf:name "Gregg Kellogg" ] .
Example 157: 동일한 임베딩 예제의 JSON-LD
{
  "@context": {
    "foaf": "http://xmlns.com/foaf/0.1/"
  },
  "@id": "http://manu.sporny.org/about#manu",
  "@type": "foaf:Person",
  "foaf:name": "Manu Sporny",
  "foaf:knows": {
    "@type": "foaf:Person",
    "foaf:name": "Gregg Kellogg"
  }
}

B.1.3 네이티브 데이터 타입 변환

JSON-LD에서 숫자와 불리언 값은 네이티브 데이터 타입입니다. [Turtle]는 이러한 값을 표현하는 축약 문법을 제공하지만, RDF의 추상 구문은 숫자와 불리언 값을 타입이 지정된 리터럴로 표현해야 합니다. 따라서 완전한 라운드 트리핑을 허용하기 위해 JSON-LD 1.1 처리 알고리즘 및 API 명세([JSON-LD11-API])는 JSON-LD의 네이티브 데이터 타입과 RDF의 대응 타입 간의 변환 규칙을 정의합니다. 분수 부분이 없는 숫자xsd:integer 타입 리터럴로, 분수 부분이 있는 숫자는 xsd:double 타입 리터럴로, 그리고 불리언 값 truefalsexsd:boolean 타입 리터럴로 변환됩니다. 모든 타입된 리터럴은 정규 렉시컬 형식입니다.

Example 158: 숫자 및 불리언 값에 네이티브 데이터 타입을 사용하는 JSON-LD
{
  "@context": {
    "ex": "http://example.com/vocab#"
  },
  "@id": "http://example.com/",
  "ex:numbers": [ 14, 2.78 ],
  "ex:booleans": [ true, false ]
}
Example 159: 타입이 지정된 리터럴을 사용한 동일 예제 (Turtle)
@prefix ex: <http://example.com/vocab#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

<http://example.com/>
  ex:numbers "14"^^xsd:integer, "2.78E0"^^xsd:double ;
  ex:booleans "true"^^xsd:boolean, "false"^^xsd:boolean .
Note
이 해석은 [Turtle]와는 다르며, Turtle에서는 리터럴 2.78xsd:decimal로 변환됩니다. 그 이유는 대부분의 JSON 도구가 분수 부분을 포함한 숫자를 부동 소수점으로 파싱하므로, RDF로 되돌릴 때 xsd:double이 가장 적절한 데이터 타입이기 때문입니다.

B.1.4 리스트

JSON-LD와 [Turtle]는 모두 값의 순차적 리스트를 표현할 수 있습니다.

Example 160: Turtle의 값 리스트
@prefix foaf: <http://xmlns.com/foaf/0.1/> .

<http://example.org/people#joebob> a foaf:Person;
  foaf:name "Joe Bob";
  foaf:nick ( "joe" "bob" "jaybee" ) .
Example 161: JSON-LD의 동일한 값 리스트 예제
{
  "@context": {
    "foaf": "http://xmlns.com/foaf/0.1/"
  },
  "@id": "http://example.org/people#joebob",
  "@type": "foaf:Person",
  "foaf:name": "Joe Bob",
  "foaf:nick": {
    "@list": [ "joe", "bob", "jaybee" ]
  }
}

B.2 RDFa

이 절은 비규범적입니다.

다음 예시는 RDFa [RDFA-CORE]로 세 사람의 이름과 홈페이지를 설명합니다.

Example 162: 세 사람을 설명하는 RDFa 단편
<div prefix="foaf: http://xmlns.com/foaf/0.1/">
   <ul>
      <li typeof="foaf:Person">
        <a property="foaf:homepage" href="http://example.com/bob/">
          <span property="foaf:name">Bob</span>
        </a>
      </li>
      <li typeof="foaf:Person">
        <a property="foaf:homepage" href="http://example.com/eve/">
         <span property="foaf:name">Eve</span>
        </a>
      </li>
      <li typeof="foaf:Person">
        <a property="foaf:homepage" href="http://example.com/manu/">
          <span property="foaf:name">Manu</span>
        </a>
      </li>
   </ul>
</div>

아래에는 단일 컨텍스트를 사용한 JSON-LD 구현 예가 설명되어 있습니다.

Example 163: 동일한 설명의 JSON-LD (노드 객체들 간에 컨텍스트 공유)
{
  "@context": {
    "foaf": "http://xmlns.com/foaf/0.1/",
    "foaf:homepage": {"@type": "@id"}
  },
  "@graph": [
    {
      "@type": "foaf:Person",
      "foaf:homepage": "http://example.com/bob/",
      "foaf:name": "Bob"
    }, {
      "@type": "foaf:Person",
      "foaf:homepage": "http://example.com/eve/",
      "foaf:name": "Eve"
    }, {
      "@type": "foaf:Person",
      "foaf:homepage": "http://example.com/manu/",
      "foaf:name": "Manu"
    }
  ]
}

B.3 Microdata

이 절은 비규범적입니다.

아래의 HTML Microdata [MICRODATA] 예시는 책 정보를 Microdata Work 항목으로 표현합니다.

Example 164: Microdata를 사용하여 책을 설명하는 HTML
<dl itemscope
    itemtype="http://purl.org/vocab/frbr/core#Work"
    itemid="http://purl.oreilly.com/works/45U8QJGZSQKDH8N">
 <dt>Title</dt>
 <dd><cite itemprop="http://purl.org/dc/elements/1.1/title">Just a Geek</cite></dd>
 <dt>By</dt>
 <dd><span itemprop="http://purl.org/dc/elements/1.1/creator">Wil Wheaton</span></dd>
 <dt>Format</dt>
 <dd itemprop="http://purl.org/vocab/frbr/core#realization"
     itemscope
     itemtype="http://purl.org/vocab/frbr/core#Expression"
     itemid="http://purl.oreilly.com/products/9780596007683.BOOK">
  <link itemprop="http://purl.org/dc/elements/1.1/type" href="http://purl.oreilly.com/product-types/BOOK">
  Print
 </dd>
 <dd itemprop="http://purl.org/vocab/frbr/core#realization"
     itemscope
     itemtype="http://purl.org/vocab/frbr/core#Expression"
     itemid="http://purl.oreilly.com/products/9780596802189.EBOOK">
  <link itemprop="http://purl.org/dc/elements/1.1/type" href="http://purl.oreilly.com/product-types/EBOOK">
  Ebook
 </dd>
</dl>

Microdata 정보의 JSON-LD 표현은 컨텍스트를 피하고 대신 항목을 전체 IRI로 참조하려는 Microdata 커뮤니티의 의도를 그대로 따릅니다.

Example 165: 컨텍스트를 피한 JSON-LD의 동일한 책 설명
[
  {
    "@id": "http://purl.oreilly.com/works/45U8QJGZSQKDH8N",
    "@type": "http://purl.org/vocab/frbr/core#Work",
    "http://purl.org/dc/elements/1.1/title": "Just a Geek",
    "http://purl.org/dc/elements/1.1/creator": "Wil Wheaton",
    "http://purl.org/vocab/frbr/core#realization":
    [
      {"@id": "http://purl.oreilly.com/products/9780596007683.BOOK"},
      {"@id": "http://purl.oreilly.com/products/9780596802189.EBOOK"}
    ]
  }, {
    "@id": "http://purl.oreilly.com/products/9780596007683.BOOK",
    "@type": "http://purl.org/vocab/frbr/core#Expression",
    "http://purl.org/dc/elements/1.1/type": {"@id": "http://purl.oreilly.com/product-types/BOOK"}
  }, {
    "@id": "http://purl.oreilly.com/products/9780596802189.EBOOK",
    "@type": "http://purl.org/vocab/frbr/core#Expression",
    "http://purl.org/dc/elements/1.1/type": {"@id": "http://purl.oreilly.com/product-types/EBOOK"}
  }
]

C. IANA 고려사항

이 절은 IANA 등록을 위해 Internet Engineering Steering Group (IESG)에 제출되었습니다.

application/ld+json

Type name:
application
Subtype name:
ld+json
Required parameters:
N/A
Optional parameters:
profile

JSON-LD 문서에 적용되는 특정 제약이나 관례를 식별하는 공백으로 구분된 URI의 비어 있지 않은 목록입니다([RFC6906]). 프로필은 프로필 지식 없이 처리할 때 리소스 표현의 의미를 변경하지 않으므로, 프로필을 알고 있는 클라이언트와 모르는 클라이언트가 동일한 표현을 안전하게 사용할 수 있습니다. profile 매개변수는 콘텐츠 협상 과정에서 클라이언트가 선호도를 표현하는 데 사용될 수 있습니다(MAY). 프로필 매개변수가 주어지면 서버는 인식하는 목록의 프로필을 준수하는 문서를 반환하는 것이 바람직합니다(SHOULD), 인식하지 못하는 프로필은 무시해야 합니다(MUST). 프로필 URI는 역참조 가능하고 해당 URI에서 유용한 문서를 제공하는 것이 권장됩니다. 배경과 자세한 내용은 [RFC6906]를 참조하십시오.

이 명세는 profile 매개변수에 대한 여섯 가지 값을 정의합니다.

http://www.w3.org/ns/json-ld#expanded
확장된 JSON-LD 문서 형태(expanded document form)를 요청하거나 지정하기 위해 사용됩니다.
http://www.w3.org/ns/json-ld#compacted
압축된 JSON-LD 문서 형태(compacted document form)를 요청하거나 지정하기 위해 사용됩니다.
http://www.w3.org/ns/json-ld#context
JSON-LD 컨텍스트 문서(context document)를 요청하거나 지정하기 위해 사용됩니다.
http://www.w3.org/ns/json-ld#flattened
평탄화된 JSON-LD 문서 형태(flattened document form)를 요청하거나 지정하기 위해 사용됩니다.
http://www.w3.org/ns/json-ld#frame
JSON-LD 프레임 문서(frame)를 요청하거나 지정하기 위해 사용됩니다.
http://www.w3.org/ns/json-ld#framed
프레임된 JSON-LD 문서 형태(framed document form)를 요청하거나 지정하기 위해 사용됩니다.

http://www.w3.org/ns/json-ld로 시작하는 다른 모든 URI는 JSON-LD 명세에 의해 향후 사용을 위해 예약됩니다.

다른 명세들은 자체 의미를 정의하는 추가적인 profile 매개변수 URI를 게시할 수 있습니다. 여기에는 파일 확장자를 profile 매개변수와 연관시키는 기능이 포함될 수 있습니다.

미디어 타입 매개변수로 사용될 때([RFC4288]), HTTP Accept 헤더에서의 profile 값은 공백 같은 특수 문자를 포함하는 경우 따옴표(")로 둘러싸여야 합니다(MUST), 특히 여러 프로필 URI가 결합될 때 필요합니다.

프로필 미디어 타입 매개변수를 처리할 때, 그 값이 IRI가 아니라 하나 이상의 URI를 포함한다는 점을 주의해야 합니다. 경우에 따라 IRI와 URI 간 변환이 필요할 수 있으며, 이는 RFC3986의 관련 절을 따릅니다.

인코딩 고려사항:
RFC 8259, section 11을 참조하십시오.
보안 고려사항:
RFC 8259, section 12를 참조하십시오 [RFC8259]

JSON-LD는 지향성 그래프를 위한 순수한 데이터 교환 형식으로 의도되므로, 직렬화된 내용을 JavaScript의 eval() 같은 코드 실행 메커니즘을 통해 파싱하기 위해 전달해서는 안 됩니다(SHOULD NOT). (잘못된) 문서에 코드가 포함되어 실행될 경우 예기치 않은 부작용으로 시스템 보안이 손상될 수 있습니다.

JSON-LD 문서를 처리할 때 원격 컨텍스트 및 프레임에 대한 링크는 일반적으로 자동으로 따라가게 되어 사용자의 명시적 요청 없이 파일 전송이 발생합니다. 원격 컨텍스트가 제3자에 의해 제공될 경우, 그들은 사용 패턴을 수집하거나 유사한 정보를 얻어 프라이버시 문제를 일으킬 수 있습니다. JSON-LD 1.1 처리 알고리즘 및 API 명세와 같은 특정 구현체는 이 동작을 제어하기 위한 세밀한 메커니즘을 제공할 수 있습니다.

웹에서 로드되는 원격 컨텍스트가 비보안 연결(예: HTTP)을 통해 제공되면 공격자가 이를 변경하여 JSON-LD의 active context를 손상시킬 수 있습니다. 중요한 목적에 원격 컨텍스트에 의존하는 응용 프로그램은 시스템에서 사용하기 전에 해당 원격 컨텍스트를 검증하고 캐시하는 것이 권장됩니다.

JSON-LD는 긴 IRI를 짧은 용어로 대체하는 것을 허용하므로, 문서를 처리하면 확장되어 수신자의 자원을 모두 소비할 수 있습니다. 응용 프로그램은 모든 데이터에 대해 주의 깊게 취급해야 합니다.

JSON-LD는 사용할 수 있는 IRI 스킴에 제한을 두지 않으며, 어휘 상대 IRI는 IRI 해석이 아니라 문자열 연결을 사용하므로, 역참조될 때 악의적으로 사용될 수 있는 IRI를 구성할 수 있습니다.

상호운용성 고려사항:
해당 없음
게시 명세:
http://www.w3.org/TR/json-ld
이 미디어 타입을 사용하는 응용 프로그램:
지향성 그래프의 교환을 필요로 하는 모든 프로그래밍 환경. JSON-LD 구현은 JavaScript, Python, Ruby, PHP 및 C++용으로 만들어져 왔습니다.
추가 정보:
매직 넘버:
해당 없음
파일 확장자:
.jsonld
Macintosh 파일 타입 코드:
TEXT
추가 문의자(이름 및 이메일):
Ivan Herman <ivan@w3.org>
의도된 사용:
일반적 사용(Common)
사용 제한:
N/A
저자:
Manu Sporny, Dave Longley, Gregg Kellogg, Markus Lanthaler, Niklas Lindström
변경 관리:
W3C

application/ld+json와 함께 사용되는 프래그먼트 식별자는 RDF 문법에서와 같이 처리되며, 이는 RDF 1.1 Concepts and Abstract Syntax에 따릅니다 [RDF11-CONCEPTS].

이 등록은 [JSON-LD10]에 있는 application/ld+json의 원래 정의에 대한 업데이트입니다.

C.1 예시

이 절은 비규범적입니다.

다음 예시는 프로필 매개변수가 서로 다른 허용 가능한 응답을 설명하는 데 어떻게 사용될 수 있는지에 대한 다양한 방식을 보여줍니다.

Example 166: 확장된 문서를 요청하는 프로필을 포함한 HTTP 요청
GET /ordinary-json-document.json HTTP/1.1
Host: example.com
Accept: application/ld+json;profile=http://www.w3.org/ns/json-ld#expanded

서버에 요청된 리소스를 확장된 문서 형태의 JSON-LD로 반환하도록 요청합니다.

Example 167: 압축된 문서를 요청하는 프로필을 포함한 HTTP 요청
GET /ordinary-json-document.json HTTP/1.1
Host: example.com
Accept: application/ld+json;profile=http://www.w3.org/ns/json-ld#compacted

서버에 요청된 리소스를 압축된 문서 형태의 JSON-LD로 반환하도록 요청합니다. 명시적 컨텍스트 리소스가 지정되지 않았으므로 서버는 애플리케이션 특유의 기본 컨텍스트를 사용하여 압축합니다.

Example 168: 축소 컨텍스트에 대한 참조와 함께 압축된 문서를 요청하는 프로필을 포함한 HTTP 요청
GET /ordinary-json-document.json HTTP/1.1
Host: example.com
Accept: application/ld+json;profile="http://www.w3.org/ns/json-ld#flattened http://www.w3.org/ns/json-ld#compacted"

서버에 요청된 리소스를 압축된 문서 형태평탄화된 문서 형태의 JSON-LD로 반환하도록 요청합니다. 두 URI가 공백으로 구분되어 있으므로 큰따옴표(")로 묶여 있음을 주의하십시오.

D. 미해결 이슈

이 절은 비규범적입니다.

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

Issue 108: 메타데이터가 포함된 참조에 의한 컨텍스트 고려 defer-future-versionprivacy-trackersecurity-tracker

메타데이터가 포함된 참조에 의한 컨텍스트를 고려하십시오.

Issue 191: 복잡하지 않은 접두어 용어 정의에 대한 Compact IRI 확장 지원 defer-future-versionspec:enhancement

비단순(prefix가 아닌) 접두어 term 정의에 대한 Compact IRI 확장 지원.

Issue 280: language-maps가 별도의 기본 방향을 허용하지 않음 defer-future-version

language-maps가 별도의 기본 방향을 허용하지 않습니다.

Issue 328: JSON-LD 코어 구문의 @context@default defer-future-version

@context 내의 @default에 관한 문제.

Issue 329: @prefix에 대한 제안 defer-future-version

@prefix에 대한 제안.

Issue 335: 타입 강제 변환 / 노드 변환: @coerce 키워드 또는 유사 기능 defer-future-version

타입 강제 변환 / 노드 변환: @coerce 키워드 또는 유사한 기능.

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

이 절은 비규범적입니다.

또한 § F. JSON-LD Community Group 최종 보고서 이후의 변경사항를 참조하십시오.

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

이 절은 비규범적입니다.

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

이 절은 비규범적입니다.

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

이 절은 비규범적입니다.

I. 감사의 글

이 절은 비규범적입니다.

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

또한, 발행 시점에 워킹 그룹의 구성원이었던 다음 사람들에게도 감사드립니다:

많은 감사는 JSON-LD 커뮤니티 그룹(JSON-LD Community Group) 참가자들에게 돌아갑니다. 이들은 많은 기술적 이슈를 메일링 리스트와 주간 화상회의를 통해 함께 해결했습니다: Chris Webber, David Wood, Drummond Reed, Eleanor Joslin, Fabien Gandon, Herm Fisher, Jamie Pitts, Kim Hamilton Duffy, Niklas Lindström, Paolo Ciccarese, Paul Frazze, Paul Warren, Reto Gmür, Rob Trainer, Ted Thibodeau Jr., 그리고 Victor Charpenay.

J. 참고문헌

J.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/
[IANA-URI-SCHEMES]
Uniform Resource Identifier (URI) Schemes. IANA. URL: https://www.iana.org/assignments/uri-schemes/uri-schemes.xhtml
[JSON]
The application/json Media Type for JavaScript Object Notation (JSON). D. Crockford. IETF. July 2006. Informational. URL: https://tools.ietf.org/html/rfc4627
[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-API]
JSON-LD 1.1 Processing Algorithms and API. Gregg Kellogg; Dave Longley; Pierre-Antoine Champin. W3C. 7 May 2020. W3C Proposed Recommendation. URL: https://www.w3.org/TR/json-ld11-api/
[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/
[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/
[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
[RFC4288]
Media Type Specifications and Registration Procedures. N. Freed; J. Klensin. IETF. December 2005. Best Current Practice. URL: https://tools.ietf.org/html/rfc4288
[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
[RFC6906]
The 'profile' Link Relation Type. E. Wilde. IETF. March 2013. Informational. URL: https://tools.ietf.org/html/rfc6906
[RFC7231]
Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content. R. Fielding, Ed.; J. Reschke, Ed. June 2014. Proposed Standard. URL: https://tools.ietf.org/html/rfc7231
[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
[UAX9]
Unicode Bidirectional Algorithm. Mark Davis; Aharon Lanin; Andrew Glass. Unicode Consortium. 12 February 2020. Unicode Standard Annex #9. URL: https://www.unicode.org/reports/tr9/tr9-42.html
[UNICODE]
The Unicode Standard. Unicode Consortium. URL: https://www.unicode.org/versions/latest/

J.2 비규범적 참조

[fingerprinting-guidance]
Mitigating Browser Fingerprinting in Web Specifications. Nick Doty. W3C. 28 March 2019. W3C Note. URL: https://www.w3.org/TR/fingerprinting-guidance/
[INFRA]
Infra Standard. Anne van Kesteren; Domenic Denicola. WHATWG. Living Standard. URL: https://infra.spec.whatwg.org/
[JSON.API]
JSON API. Steve Klabnik; Yehuda Katz; Dan Gebhardt; Tyler Kellen; Ethan Resnick. 29 May 2015. unofficial. URL: https://jsonapi.org/format/
[ld-glossary]
Linked Data Glossary. Bernadette Hyland; Ghislain Auguste Atemezing; Michael Pendleton; Biplav Srivastava. W3C. 27 June 2013. W3C Note. URL: https://www.w3.org/TR/ld-glossary/
[LINKED-DATA]
Linked Data Design Issues. Tim Berners-Lee. W3C. 27 July 2006. W3C-Internal Document. URL: https://www.w3.org/DesignIssues/LinkedData.html
[MICRODATA]
HTML Microdata. Charles 'chaals' (McCathie) Nevile; Dan Brickley; Ian Hickson. W3C. 26 April 2018. W3C Working Draft. URL: https://www.w3.org/TR/microdata/
[RDFA-CORE]
RDFa Core 1.1 - Third Edition. Ben Adida; Mark Birbeck; Shane McCarron; Ivan Herman et al. W3C. 17 March 2015. W3C Recommendation. URL: https://www.w3.org/TR/rdfa-core/
[rfc4122]
A Universally Unique IDentifier (UUID) URN Namespace. P. Leach; M. Mealling; R. Salz. IETF. July 2005. Proposed Standard. URL: https://tools.ietf.org/html/rfc4122
[RFC7049]
Concise Binary Object Representation (CBOR). C. Bormann; P. Hoffman. IETF. October 2013. Proposed Standard. URL: https://tools.ietf.org/html/rfc7049
[RFC7946]
The GeoJSON Format. H. Butler; M. Daly; A. Doyle; S. Gillies; S. Hagen; T. Schaub. IETF. August 2016. Proposed Standard. URL: https://tools.ietf.org/html/rfc7946
[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
[SPARQL11-OVERVIEW]
SPARQL 1.1 Overview. The W3C SPARQL Working Group. W3C. 21 March 2013. W3C Recommendation. URL: https://www.w3.org/TR/sparql11-overview/
[SRI]
Subresource Integrity. Devdatta Akhawe; Frederik Braun; Francois Marier; Joel Weinberger. W3C. 23 June 2016. W3C Recommendation. URL: https://www.w3.org/TR/SRI/
[string-meta]
Strings on the Web: Language and Direction Metadata. Addison Phillips; Richard Ishida. W3C. 11 June 2019. W3C Working Draft. URL: https://www.w3.org/TR/string-meta/
[TriG]
RDF 1.1 TriG. Gavin Carothers; Andy Seaborne. W3C. 25 February 2014. W3C Recommendation. URL: https://www.w3.org/TR/trig/
[Turtle]
RDF 1.1 Turtle. Eric Prud'hommeaux; Gavin Carothers. W3C. 25 February 2014. W3C Recommendation. URL: https://www.w3.org/TR/turtle/
[URN]
URN Syntax. R. Moats. IETF. May 1997. Proposed Standard. URL: https://tools.ietf.org/html/rfc2141
[WEBIDL]
Web IDL. Boris Zbarsky. W3C. 15 December 2016. W3C Editor's Draft. URL: https://heycam.github.io/webidl/
[YAML]
YAML Ain’t Markup Language (YAML™) Version 1.2. Oren Ben-Kiki; Clark Evans; Ingy döt Net. 1 October 2009. URL: http://yaml.org/spec/1.2/spec.html