출판 이후 보고된 오류나 문제를 확인하려면 정오표를 확인하십시오.
또한 번역본을 참조하십시오.
이 문서는 비규범적 형식으로도 제공됩니다: EPUB
Copyright © 2010-2020 W3C® (MIT, ERCIM, Keio, Beihang). W3C liability, trademark and permissive document license rules apply.
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 권고안 중 하나입니다:
이 섹션은 비규범적입니다.
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는 문서를 결정론적 구조로 재구성하여 처리를 단순화하는 메커니즘을 제공합니다.
이 섹션은 비규범적입니다.
이 문서는 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 이후의 변경사항을 강조할 수 있습니다. 변경사항을 보려면 을 선택하세요.
이 섹션은 비규범적입니다.
이 명세의 개발에 참여할 수 있는 여러 방법이 있습니다:
이 섹션은 비규범적입니다.
이 명세서에서는 다음과 같은 타이포그래피 규약을 사용합니다:
markupmarkup definition reference markup external definition reference노트는 연한 녹색 박스에 왼쪽에 녹색 테두리와 "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.
이 섹션은 비규범적입니다.
이 문서는 외부 명세에서 정의된 다음 용어들을 사용하며, JSON-LD에 특화된 용어들을 정의합니다.
다음에서 가져온 용어들: ECMAScript Language Specification [ECMASCRIPT], The JavaScript Object Notation (JSON) Data Interchange Format [RFC8259], Infra Standard [INFRA], 및 Web IDL [WEBIDL]
true와 false.내부 표현에서는 JSON object가 map로 설명됩니다(참조: INFRA). 이는 키/값 쌍으로 구성된 entries로 구성됩니다.
Application Programming Interface에서, map은 [WEBIDL] record로 기술됩니다.
@context의 map entry에서 값 또는 값의 @id가
null이면 해당 항목은 용어의 IRI와의 연계를 명시적으로 분리합니다. JSON-LD 문서 본문에서 값이 null인
map entry는 해당 항목이 정의되지 않은 것과 동일한 의미를 가집니다. expanded 형태에서 @value,
@list, 또는 @set이 null로 설정되면 전체 JSON 객체가 무시됩니다.
true, 또는 false 중 하나입니다.
다음은 Internationalized Resource Identifiers (IRIs)에서 가져온 용어들입니다.
@type의 값, 그리고 vocabulary
relative로 정의된 용어들은 문서의 base IRI가 아니라 vocabulary mapping에 상대적으로 해석됩니다.다음은 RDF 관련 명세들에서 가져온 용어들입니다: RDF 1.1 Concepts and Abstract Syntax, RDF Schema 1.1, 그리고 Linked Data Design Issues.
_:로 시작하는 식별자가 할당됩니다.
_:로 시작합니다.
@direction 키를 사용하여 context에서 설정할 수 있으며, 값은 "ltr",
"rtl" 또는 null 중 하나여야 합니다. 자세한 규범적 설명은 Context Definitions 섹션을
참조하십시오.
@language 키를 사용하여 context에서 설정할 수 있으며, 값은
BCP47 언어 코드 문자열 또는 null이어야 합니다. 자세한 규범적 설명은 Context Definitions 섹션을 참조하십시오.
@default 키를 가진 map입니다.
@context가 node object, value object, graph object, list
object, set object, nested properties의 값 또는 expanded term definition의 값으로 나타나는 context입니다.
값은 context 정의를 위한 map, IRI, 또는 위의 것들을 결합한 배열이 될 수 있습니다.
@graph entry를 가져야 하며, 선택적으로 @id 및 @index entry를 가질 수
있습니다. simple graph object는 @id entry가 없는 graph object입니다. node objects는
@graph entry를 가질 수 있지만 다른 entries가 함께 있으면 graph object로 간주되지 않습니다. 자세한 규범적 설명은
Graph Objects 섹션을 참조하십시오.
@container가 @id로 설정된 term의 map 값입니다. id map의 값은 node
objects여야 하며 키는 관련 node object의 @id를 나타내는 IRIs로 해석됩니다. 값에 @id로
확장되는 키를 포함하면 그 값은 id map의 참조 키와 동일해야 합니다. Id Maps 섹션을 참조하십시오.
@container가 @graph로 설정된 expanded term definition의 값에서 생성된 named
graph입니다.
@included이거나 그 별칭이며 값이 하나 이상의 node
objects인 항목입니다. Included Blocks 섹션을 참조하십시오.
@container가 @index로 설정된 term의 map 값이며, 값은 문자열, 숫자,
true, false, null, node object, value object, list
object, set object 또는 위의 타입들의 배열 중 하나여야 합니다. Index Maps 섹션을 참조하십시오.
rdf:JSON인 literal입니다. value object 표현에서
@type의 값은 @json입니다. JSON literal은 유효한 JSON 값을 나타냅니다. The
rdf:JSON Datatype 섹션을 참조하십시오.
true 또는 false, typed value, 또는 language-tagged
string이며 RDF literal을 나타냅니다.
@container가 @language로 설정된 term의 map 값이며, 키는 BCP47
언어 코드를 나타내는 문자열이어야 하고 값은 null, 문자열 또는 위의 것들의 배열이어야 합니다. Language Maps 섹션을 참조하십시오.
@list 키를 가진 map이며 선택적으로 @index 키를 가질 수 있지만 다른
entries는 가질 수 없습니다. Lists and Sets 섹션을 참조하십시오.
@context 키로 지정된 map으로 명시된 context입니다.
@value, @list, 또는 @set 키를 포함하지 않고, 최상위 map이
@graph와 @context 외에 다른 entries를 포함하지 않는 경우가 아닌 경우 node object로
간주됩니다. Node Objects 섹션을 참조하십시오.
@id 키만을 가지는 node object로 노드를 참조하는 데 사용됩니다.
@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을 확장합니다.
@set entry를 가진 map이며 선택적으로 @index를 가질 수 있으나 다른
entries는 가질 수 없습니다. Lists and Sets 섹션을 참조하십시오.
@container가 @type로 설정된 term의 map 값으로, 키는 해당 node object의
@type을 나타내는 IRIs로 해석되며 값은 node object 또는 node object의 배열이어야 합니다. Type Maps 섹션을
참조하십시오.
@value entry를 가진 map입니다. Value Objects 섹션을 참조하십시오.
@vocab 키를 사용하여 설정되며, 값은 IRI, compact IRI, term 또는
null이 될 수 있습니다. Context Definitions 섹션을 참조하십시오.
이 섹션은 비규범적입니다.
JSON-LD는 다음과 같은 설계 목표를 만족합니다:
@context 속성을 포함하되 무시하면 JSON-LD의 기본 기능을 사용할 수 있습니다.이 섹션은 비규범적입니다.
일반적으로 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 문서인 것처럼 동작하게 할 수 있습니다.
이 섹션은 비규범적입니다.
JSON-LD는 언어의 핵심 부분인 여러 구문 토큰과 키워드를 규정합니다. 키워드에 대한 규범적 설명은 § 9.16 Keywords에 있습니다.
:@base@container@context@context 키워드는 The Context 섹션에서 자세히 설명됩니다.
@direction@graph@id@id 속성만 포함하는 node object입니다.
@import@included@index@json@type 값으로 사용됩니다. JSON Literals 섹션을 참조하십시오.
@language@list@nest@none@prefixtrue인 경우, 이 term은 compact IRI를 구성하는 데 사용할 수 있습니다. 값이 false이면 term이
compact IRI 구성에 사용되는 것을 방지합니다. 또한 compact IRI를 확장할 때 term이 고려될지 여부를 결정합니다.@propagatetrue로, context는 node objects를 가로질러
전파됩니다(타입-스코프 컨텍스트는 기본적으로 false). 이를 false로 설정하면 새로운 node object로 들어갈 때 해당
context 내에서 생성된 term 정의가 제거됩니다.@protected@reverse@set@type@type를 node objects와 value objects 모두의 타입을 정의하는 데 사용하는 것은 데이터의 타입 지정을
위한 기본 필요를 충족합니다. 전문가들은 @type의 중첩 사용에 대해 우려할 수 있지만, 웹 개발자들이 이 기능을 수년간 사용해 온 결과
typed literal 값을 표현하는 데 @type가 남용된 사례는 드뭅니다.
@value@version@version이
json-ld-1.0으로 설정되었을 때 사용 불가능합니다.
@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의 모든 키, 키워드 및 값은 대소문자를 구분합니다.
비규범적이라고 표시된 절들뿐만 아니라 이 명세서의 모든 저작 지침, 다이어그램, 예제 및 주석은 비규범적입니다. 이 명세서의 나머지 모든 부분은 규범적입니다.
본 문서에서 키워드 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:title는 http://purl.org/dc/terms/title를 나타내는 약식 표기입니다.
이 절은 비규범적입니다.
JSON [RFC8259]는 경량의 언어 독립적 데이터 교환 형식입니다. 파싱과 생성이 용이합니다. 그러나 서로 다른 출처의 JSON을 통합하는 것은 어렵습니다 — 키가 다른 데이터 출처와 충돌할 수 있기 때문입니다. 또한 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를 사용하는 것입니다.
예를 들어 name과 homepage 같은 용어가 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에서 찾을 수 있습니다.
이 절은 비규범적입니다.
두 사람이 서로 소통할 때 대화는 일반적으로 공유된 환경, 즉 "대화의 컨텍스트"에서 이루어집니다. 이 공유된 컨텍스트는 상호 친구의 이름과 같은 약식 용어를 사용하여 더 빠르게 소통하되 정확성을 잃지 않도록 합니다. JSON-LD의 컨텍스트도 같은 방식으로 작동합니다. 컨텍스트는 두 애플리케이션이 약식 용어를 사용하여 서로 효율적으로 소통하되 정확성을 잃지 않도록 해 줍니다.
간단히 말해, 컨텍스트는 용어를 IRI로 매핑하는 데 사용됩니다.
용어는 대소문자를 구분하며, 예약된 JSON-LD 키워드가 아닌 대부분의 유효한 문자열은 용어로 사용할 수
있습니다.
예외는 빈 문자열 ""와 키워드 형태(즉 "@"로 시작하고 하나 이상의 문자로만 이루어진 문자열)를
가지는 문자열이며, 이러한 문자열은 용어로 사용할 수 없습니다. 또한 ":"를 포함하는 등 IRI 형태의 문자열은 용어로 사용해서는 안 됩니다.
앞 절의 샘플 문서에 대한 컨텍스트는 대략 다음과 같습니다:
{
"@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 object나 value object 내에 나타날 수 있습니다.
만약 용어 키를 가진 entry의 값이 map이라면, 그 map은 expanded term
definition이라 불립니다. 위 예제는 image와 homepage의 값이 문자열일 경우 이를 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로 매핑되는지뿐만 아니라 homepage와 image에 연관된 문자열
값들이 "@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에 위치합니다.
{
"@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에서 다룹니다.
이 절은 비규범적입니다.
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로 해석될 수 있으며, 특히 키가 @id인
map entry의 값일 때 그렇습니다:
{
...
"homepage": { "@id": "http://example.com/" }
...
}
IRI로 해석되는 값들은 상대 IRI
참조로도 표현될 수 있습니다. 예를 들어 다음 문서가 http://example.com/about/에 위치한다고 가정하면 상대 참조
../는 http://example.com/로 확장됩니다(상대 IRI 참조를 어디에 사용할 수 있는지에 대한 자세한 내용은 § 9.
JSON-LD Grammar를 참조하십시오).
{
...
"homepage": { "@id": "../" }
...
}
IRI는 키 위치에 직접 표현될 수도 있습니다:
{
...
"http://schema.org/name": "Manu Sporny",
...
}
위 예제에서 키 http://schema.org/name는 IRI로 해석됩니다.
용어가 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는 여러 가지 방식으로 표현될 수 있습니다:
@id 또는 @type을 사용하여 지정된 문자열 값에 대해 IRI가 생성됩니다.@type이 @id 또는 @vocab 값으로 설정된 형 변환 규칙을 포함하는 경우, 해당 키의 문자열 값에
대해 IRI가 생성됩니다.이 절은 JSON-LD에서 IRI와 관련된 가장 기본적인 기능만 다룹니다. IRI와 관련된 고급 기능은 § 4. Advanced Concepts에서 다룹니다.
이 절은 비규범적입니다.
RDF 그래프에서 노드를 외부에서 참조하려면 노드에 식별자가 있어야 합니다. IRI는 Linked Data의 근본 개념이며, 노드를 진정으로 연결하려면 식별자를 dereference했을 때 그 노드의 표현을 반환해야 합니다. 이를 통해 애플리케이션은 해당 노드에 대한 추가 정보를 검색할 수 있습니다.
JSON-LD에서 노드는 @id 키워드를
사용하여 식별됩니다:
위 예제는 node object가
http://me.markus-lanthaler.com/라는 IRI로 식별되는 것을 보여줍니다.
이 절은 JSON-LD에서 노드 식별자와 관련된 가장 기본적인 기능만 다룹니다. 노드 식별자와 관련된 고급 기능은 § 4. Advanced Concepts에서 다룹니다.
이 절은 비규범적입니다.
문법으로서 JSON은 제한된 수의 구문 요소만을 가집니다:
true 및
false, 불리언 리터럴 값들을 설명하는 요소,
null, 값의 부재를 설명하는 요소,JSON-LD 데이터 모델은 RDF 데이터 모델을 기반으로 보다 풍부한 자원 집합을 허용합니다. 데이터 모델은 § 8. Data Model에서 더 자세히 설명됩니다. JSON-LD는 JSON 객체를 사용하여 다양한 자원과 이들 간의 관계를 기술합니다:
@list 키 아래에 배열을 감싸 정렬된 값을 표현하는 데 사용됩니다. Set Objects는 일관성을 위해 존재하며 @set 키의
배열 값과 동등합니다. 자세한 내용은 § 4.3.1
Lists 및 § 4.3.2
Sets를 참조하십시오.
@index로 인덱싱할 수 있게 합니다. 자세한 내용은 § 4.6.1
Data Indexing 및 규범적 정의는 § 9.9
Index Maps를 참조하십시오.
@id로 인덱싱할 수 있게 합니다. 자세한 내용은 § 4.6.3 Node Identifier
Indexing 및 규범적 정의는 § 9.11 Id
Maps를 참조하십시오.
@type으로 인덱싱할 수 있게 합니다. 자세한 내용은 § 4.6.4
Node Type Indexing 및 규범적 정의는 § 9.12
Type Maps를 참조하십시오.
이 절은 비규범적입니다.
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에서 더 자세히 다룹니다.
이 절은 비규범적입니다.
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 역방향 속성을 참조하십시오.
다음 절들에서는 이러한 고급 기능들을 더 상세히 설명합니다.
이 절은 비규범적입니다.
섹션 § 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 키를 처리할 수 있는 것은 아니므로 허용되지 않습니다.
이 절은 비규범적입니다.
JSON-LD 1.1에서 정의된 새로운 기능들은 processing mode가 json-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 문서를
잘못 처리하는 것을 방지할 수 있습니다.
{
"@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 문서를 잘못 처리하여 다른 결과를 생성하는 것을 방지합니다.
이 절은 비규범적입니다.
때로는 모든 속성과 타입이 같은 어휘에서 올 수 있습니다. JSON-LD의 @vocab 키워드는 작성자가 공통 접두사를 설정하게 해 주며, 이는 vocabulary mapping으로
사용되어
term과 일치하지 않고 콜론을 포함하지 않는(즉 IRI도
compact IRI도 아닌) 모든 속성과 타입에 적용됩니다.
만약 @vocab를 사용하지만 어떤 map의 특정 키들을 해당 어휘로 확장하지 않으려면, 해당 term을 null로 context에 명시적으로 설정할 수 있습니다. 예를 들어 아래 예제에서 databaseId 항목은
IRI로 확장되지 않아 확장 시 해당 속성이 삭제됩니다.
JSON-LD 1.1부터는 local context의 vocabulary mapping을 상대 IRI 참조로 설정할 수 있으며, 이는 활성 컨텍스트의 기존 vocabulary mapping에 이어 붙여집니다(활성 컨텍스트에 vocabulary mapping이 없을 때의 적용 방식은 § 4.1.4 문서 기반을 기본 어휘로 사용하기 참조).
다음 예제는 상대 IRI 참조를 사용하여 속성을 확장했을 때의 효과를 보여주며, 확장 결과는 아래의 Expanded(결과) 탭에 표시되어 있습니다.
@vocab의 문법은 § 9.15 Context Definitions에 정의된
대로,
값으로 term이나 compact IRI를 허용합니다.
@vocab 값에 사용된 용어는 컨텍스트가 도입될 때 유효 범위에 있어야 하며, 그렇지 않으면 동일한 컨텍스트 내에서
@vocab와 다른 용어들 간에 순환 종속성이 발생할 수 있습니다.
이 절은 비규범적입니다.
JSON-LD는 IRI를 상대 형태로
명시할 수 있으며,
이는 문서의 기본(base)을 기준으로 RFC3986 섹션 5.1에
따라 해석됩니다.
context에서 @base
키워드를 사용하여 base IRI를 명시적으로 설정할 수
있습니다.
예를 들어 JSON-LD 문서가 http://example.com/document.jsonld에서 가져와졌다면,
상대 IRI 참조는 해당 IRI를 기준으로 해석됩니다:
{
"@context": {
"label": "http://www.w3.org/2000/01/rdf-schema#label"
},
"@id": "",
"label": "Just a simple document"
}
이 문서는 빈 @id를 사용하여 문서 기본을 가리킵니다. 그러나 문서가 다른 위치로 이동하면 해당 IRI도 변경됩니다.
이를 방지하기 위해 문서의 context에서
@base 매핑을 정의하여 문서의 base IRI를 덮어쓸 수 있습니다.
@base를 null로
설정하면 상대 IRI 참조가 IRI로 확장되는 것을 방지합니다.
참고로 외부 컨텍스트에서는 @base가 무시된다는 점에 유의하십시오.
이 절은 비규범적입니다.
어떤 경우에는 어휘 용어들이 외부 어휘가 아니라 문서 자체 내에 직접 정의되기도 합니다. JSON-LD 1.1부터는 local context의 vocabulary mapping을 상대 IRI 참조로 설정할 수 있으며, 이는 범위에 vocabulary mapping이 없을 경우 base IRI를 기준으로 해석됩니다. 이로 인해 어휘를 기준으로 확장되는 용어들(예: node object의 키들)은 base IRI를 바탕으로 IRI를 생성하게 됩니다.
{
"@context": {
"@version": 1.1,
"@base": "http://example/document",
"@vocab": "#"
},
"@id": "http://example.org/places#BrewEats",
"@type": "Restaurant",
"name": "Brew Eats"
...
}
이 문서가 http://example/document에 위치한다면 다음과 같이 확장됩니다:
이 절은 비규범적입니다.
compact IRI는 prefix와
suffix를 콜론(:)으로 구분하여 IRI를 표현하는 방법입니다.
prefix는 term으로서 active context에서 가져오며, JSON-LD 문서에서 특정한 IRI를 식별하는 짧은 문자열입니다. 예를 들어
foaf 접두사는 Friend-of-a-Friend 어휘의 약어로 사용될 수 있으며, 이 어휘는 IRI
http://xmlns.com/foaf/0.1/로 식별됩니다. 개발자는 접두사 끝에 FOAF 어휘의 용어를 덧붙여 해당 어휘 용어의 짧은 형태 IRI를
나타낼 수 있습니다. 예를 들어 foaf:name은 http://xmlns.com/foaf/0.1/name으로 확장됩니다.
위 예제에서 foaf:name은 IRI
http://xmlns.com/foaf/0.1/name으로, foaf:Person은
http://xmlns.com/foaf/0.1/Person으로 확장됩니다.
Prefixes는 값의 형태가
prefix:suffix 조합으로 표현된 compact IRI일
때, 그 prefix가 term로 active
context에 정의되어 있고 suffix가 두 개의 슬래시(//)로 시작하지 않을 경우 확장됩니다. compact IRI는
prefix에 매핑된 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에서
@prefix가 false로 설정되어 있으면, 그 용어는 compact IRI 확장이나 IRI를 compact IRI로 축약하는 데
사용되지 않습니다.
1.0 프로세서의 용어 선택 동작은 JSON-LD 1.0에 대한 정정(errata)으로 인해 변경되었습니다. 이는 기존 JSON-LD 문서를 처리하는 동작에는 영향을 주지 않지만 Compact IRI를 사용해 문서를 compact할 때 약간의 차이를 만듭니다.
compacting 동작은 다음의 expanded 형태 입력 문서를 고려하여 설명할 수 있습니다:
[{
"http://example.com/vocab/property": [{"@value": "property"}],
"http://example.com/vocab/propertyOne": [{"@value": "propertyOne"}]
}]
다음 컨텍스트를 1.0 processing mode에서 사용하면, 원래보다 vocab 용어가 선택되어 property보다 우선하게 됩니다(비록 property에 연결된 IRI가 원래 IRI를 더 많이 포착하더라도).
{
"@context": {
"vocab": "http://example.com/vocab/",
"property": "http://example.com/vocab/property"
}
}
위의 expanded 입력 문서를 이전 컨텍스트로 compact하면 다음과 같은 compacted 결과가 생성됩니다:
원래의 [JSON-LD10]에서는 용어 선택 알고리즘이 property를 선택하여 Compact IRI
property:One을 생성했었습니다. 원래 동작은 @prefix를 사용하여 명시적으로 지정할 수 있습니다:
{
"@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의 접두사 부분으로 사용할 수 있게 됩니다.
이 절은 비규범적입니다.
JSON-LD의 각 키워드는
@context를 제외하고 애플리케이션별 키워드로 별칭(alias)을 지정할 수 있습니다. 이 기능을 통해 기존 레거시 JSON 문서에 이미 존재하는
JSON 키를 재사용하여 JSON-LD로 활용할 수 있습니다.
또한 개발자가 JSON-LD의 context만으로 도메인별
구현을 설계할 수 있게 합니다.
위 예제에서 @id와 @type 키워드는 각각 url과 a라는 별칭이 지정되었습니다.
@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 키워드를 참조하십시오.
이 절은 비규범적입니다.
일반적으로 IRI 확장 규칙은 IRI가 기대되는 모든 위치에 적용됩니다(자세한 내용은 § 3.2 IRIs 참조). context 정의 내에서는, 컨텍스트 내에 정의된 용어들이 순환 의존성이 없을 경우 해당
컨텍스트 내에서 사용할 수 있습니다. 예를 들어, 타입화된 값을 정의할 때 xsd 네임스페이스를 사용하는 것이 일반적입니다:
{
"@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를 정의할 때에도 사용될 수 있습니다:
{
"@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는 용어 정의의 좌측(키) 위치에서도 사용될 수 있습니다.
{
"@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로 확장되는 것을 방지하여 원치 않는 결과를 초래하지 않도록 합니다.
{
"@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는 컨텍스트의 키 위치에서도 사용할 수 있습니다:
{
"@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:homepage가 http://xmlns.com/foaf/0.1/homepage와 동일하지 않기
때문입니다.
즉, 용어는 컨텍스트에서 접두사 조회 메커니즘이 적용되기 전 직접 문자열 비교로 먼저 조회됩니다.
IRI 참조나 compact IRI가 임의의 다른 관련 없는 IRI로 확장되는 것은 허용되지 않습니다. 이는 1.0 알고리즘에서 허용되었지만 권장되지 않았던 동작을 변경한 것입니다.
컨텍스트에서 용어를 사용하는 데 있어 유일한 다른 예외는 순환 정의가 허용되지 않는다는 것입니다. 즉, term1의 정의가 term2에 의존하고 term2도 term1에 의존하는 경우는 허용되지 않습니다. 예를 들어 다음과 같은 컨텍스트 정의는 불법입니다:
{
"@context": {
"term1": "term2:foo",
"term2": "term1:bar"
},
...
}
이 절은 비규범적입니다.
확장된 용어 정의(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)에 따라 결정됩니다.
예를 들어 다음의 의미적으로 동등한 예제를 고려하십시오. 첫 번째 예제는 속성과 타입이 자체적인 스코프된 컨텍스트를 정의하여 확장 시 포함되는 방법을 보여줍니다.
{
"@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들이 처리됩니다. 이전 예제는 다음과 논리적으로 동등합니다:
{
"@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의 새로운 기능입니다.
이 절은 비규범적입니다.
한 번 도입된 컨텍스트는 이후의
컨텍스트가 @context를
null로 설정하거나 용어를 재정의하여 제거하지 않는 한 계속 유효합니다.
다만, 해당 컨텍스트의 영향을 해당 노드 객체가
진입될 때까지만으로 제한하는 타입-스코프
컨텍스트의 예외가 있습니다.
이 동작은 @propagate 키워드를 사용하여 변경할 수 있습니다.
다음 예제는 @propagate가 false로 설정된 컨텍스트에서 정의된 용어들이
새로운 노드 객체로 내려갈 때 실질적으로 제거되는
방법을 보여줍니다.
배열로 포함된 컨텍스트들은 롤백(rollback)이 정의되는 방식 때문에
@propagate에 대해 모두 동일한 값을 가져야 합니다.
(참조: JSON-LD 1.1 Processing Algorithms and
API)
이 절은 비규범적입니다.
JSON-LD 1.0에는 적용 중인 컨텍스트를 수정하는 메커니즘이 포함되어 있었습니다. 이는 원격 컨텍스트를 로드하여 처리한 뒤, 새 컨텍스트를 통해 추가 변경을 적용하는 기능을 포함했습니다.
그러나 JSON-LD 1.1의 도입으로 기존의 JSON-LD 1.0 컨텍스트를 로드하여 처리 전에 JSON-LD 1.1 기능을 적용할 수 있기를 원합니다.
@import 키워드를 컨텍스트에
사용하면,
다른 원격 컨텍스트(가져온 컨텍스트)를 로드하여
처리 전에 수정할 수 있습니다. 이러한 수정을 포함하는 컨텍스트는 래핑(wrapping) 컨텍스트라고 합니다.
가져온 컨텍스트가 로드되면 래핑 컨텍스트의 내용이 처리 전에 병합됩니다. 병합 작업은 래핑 컨텍스트의 각 키-값 쌍을 로드된 가져온 컨텍스트에 추가하며,
래핑 컨텍스트의 키-값 쌍이 우선권을 가집니다.
가져온 컨텍스트를 재사용하고 처리 전에 인라인으로 편집할 수 있게 하면, 컨텍스트 전체의 키워드를 적용하여 가져온 컨텍스트의 모든 용어 정의를 조정할 수 있습니다. 마찬가지로 용어 정의를 처리 전에 대체하여, 예를 들어 보호된 용어와 일치하도록 하거나 추가적인 타입 강제 정보를 포함하도록 조정할 수 있습니다.
다음 예제들은 @import를 사용해 가져온 컨텍스트를 로드하고 @propagate를 true로 설정하는
방식으로
타입-스코프 컨텍스트를 표현하는
방법을 보여줍니다.
예를 들어 URL https://json-ld.org/contexts/remote-context.jsonld로 원격에서 참조할 수 있는
컨텍스트가 있다고 가정합시다:
{
"@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",
...
}
}
래핑 컨텍스트는 이를 소스로 삼아 수정하는 데 사용할 수 있습니다:
{
"@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
}
}
}
}
그 효과는 가져온 전체 컨텍스트가 타입-스코프 컨텍스트에 복사된 것과 같습니다:
{
"@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
}
}
}
}
마찬가지로 래핑 컨텍스트는 용어 정의를 대체하거나 가져온 컨텍스트의 용어 정의가 처리되는 방식을 변경할 수 있는 다른 컨텍스트-전역 키워드를 설정할 수 있습니다:
{
"@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 정의를 대체합니다
}
}
다시 말해, 이는 전체 가져온 컨텍스트가 해당 컨텍스트에 복사된 것과 동일한 효과를 냅니다:
{
"@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 항목을 포함할 수 없습니다.
이 절은 비규범적입니다.
JSON-LD는 많은 명세에서 지정된 데이터 형식으로 사용됩니다. 그러나 일부 JSON-LD 내용을 아무런 JSON-LD 알고리즘을 사용하지 않고 일반 JSON으로 처리하도록 허용하려는 요구도 있습니다. JSON-LD는 매우 유연하기 때문에, 일부 원래 형식의 용어들은 임베디드 컨텍스트를 통해 지역적으로 재정의되어 JSON-LD 기반 구현에서 다른 의미를 가질 수 있습니다. 반면에 "일반 JSON" 구현은 이러한 임베디드 컨텍스트를 해석할 수 없을 수 있어, 해당 용어들을 원래 의미로 계속 해석할 수 있습니다. 이러한 해석의 분기를 방지하기 위해 JSON-LD 1.1은 용어 정의를 보호(protected)할 수 있도록 허용합니다.
보호된 용어 정의는
항목
@protected가
true로 설정된 용어 정의입니다.
이는 일반적으로 해당 용어 정의가 이후의 컨텍스트들에 의해 덮어써지는 것을 방지합니다.
동일한 용어의 새 정의나 "@context": null으로 컨텍스트를 제거하려는 시도는 오류를 발생시키고 처리를 중단합니다
(다만 아래 특정 상황에서 예외가 있습니다).
{
"@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"
}
}
컨텍스트의 거의 모든 용어 정의를 보호해야 하는 경우,
컨텍스트 자체에 항목
@protected를 true로 추가할 수 있습니다.
이는 각 용어 정의를 개별적으로 보호하는 것과 동일한 효과를 가집니다.
일부 용어 정의에서 @protected를 false로 설정하여 예외를 둘 수도 있습니다.
보호된 용어는 일반적으로 재정의할 수 없지만,
이 규칙에는 두 가지 예외가 있습니다.
첫 번째 예외는 새 정의가 보호된 용어 정의와 동일한 경우입니다
(@protected 플래그를 제외하고). 이 경우 새 정의는 보호를 위반하지 않으므로 허용됩니다.
이는 여러 컨텍스트에서 (보호된 형태를 포함해) 발생할 수 있는 @type을 type으로 별칭하는 것과 같은
널리 쓰이는 용어 정의에 유용합니다.
두 번째 예외는 속성-스코프
컨텍스트가 보호의 영향을 받지 않으므로,
보호된 용어를 새 용어 정의로 재정의하거나 "@context": null으로 컨텍스트를 지워 재정의할 수 있다는 점입니다.
그 이유는 "일반 JSON" 구현은 주어진 명세에 따라 정의된 속성만을 순회하기 때문에, 명세에 속한 속성에 대한 스코프된 컨텍스트는 명세의 일부로 간주되어 "일반 JSON" 구현도 그 의미 변경을 인지할 것으로 기대되기 때문입니다. 다른 속성에 속한 스코프된 컨텍스트는 "일반 JSON" 구현이 무시할 문서 부분에 적용되므로, JSON-LD 인지 구현과 "일반 JSON" 구현 간의 해석 분기가 발생하지 않습니다. 따라서 재정의가 허용됩니다.
용어의 재정의를 금지함으로써 보호는 또한 해당 용어의 적응(예: 더 정확한 데이터 타입 정의, 용어의 리스트 사용 제한 등)을 방해합니다. 이러한 적응은 일부 범용 컨텍스트에서 빈번하게 발생하므로, 보호 기능은 그 사용성을 저해할 수 있습니다. 따라서 컨텍스트 발행자는 이 기능을 신중히 사용해야 합니다.
보호된 용어 정의는 JSON-LD 1.1의 새로운 기능입니다.
이 절은 비규범적입니다.
값은 문자열, 날짜, 시간 등과 같은 스칼라 값과 연관된 그래프의 리프 노드입니다. (strings, 날짜, 시간 등)
이 절은 비규범적입니다.
값에 연관된 타입(즉 typed value)은 값의 타입을 나타내는 IRI와 값을 연관시켜 표시합니다. JSON-LD에서 타입화된 값은 세 가지 방식으로 표현될 수 있습니다:
@context 섹션에서 @type 키워드를 사용하여 term에 타입을 지정하는 방법.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
타입 강제 참조).
타입 강제는 문자열 값에 대해서만 적용되며, 확장된 형태의 맵(예: 노드 객체나 값 객체)에는 적용되지 않습니다.
노드 타입은 사람, 장소, 이벤트, 웹 페이지 등 설명되는 대상의 종류를 지정합니다. 값 타입은 특정 값의 데이터 타입(예: 정수, 부동소수점, 날짜 등)을 지정합니다.
@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은 노드
타입을 나타냅니다. 위 예제는 다음 데이터를 표현합니다:
이 절은 비규범적입니다.
때때로 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 리터럴의 값으로 사용될 경우 보존됩니다.
이 절은 비규범적입니다.
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/barney와
http://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에 대해 여러 표현을 초래할 수 있습니다.
예를 들어 dog와 cat을 모두 http://example.com/vocab#animal로 확장하도록
지정할 수 있습니다.
이는 서로 다른 타입 강제나 언어 규칙을 설정하는 데 유용할 수 있습니다.
이 절은 비규범적입니다.
때로는 문자열에 언어를 주석으로 달아야 할 필요가 있습니다. JSON-LD에서는 여러 방법으로 이를 수행할 수 있습니다.
첫째로, 문서의 기본 언어를
context에서 @language
키로 설정하여 지정할 수 있습니다:
위 예제는 두 문자열 花澄와 科学者에 ja 언어 태그를 연관시킵니다.
언어 태그는 BCP47에 정의되어 있습니다. 기본 언어는 타입 강제되지 않은 모든 문자열 값에 적용됩니다.
하위 트리의 기본 언어를 해제하려면, 중간 컨텍스트(예: 스코프된 컨텍스트)에서 @language를 null로 설정할 수 있습니다:
{
"@context": {
...
"@version": 1.1,
"@vocab": "http://example.com/",
"@language": "ja",
"details": {
"@context": {
"@language": null
}
}
},
"name": "花澄",
"details": {"occupation": "Ninja"}
}
둘째, 특정 term에 언어를 연관시키려면 확장된 용어 정의를 사용할 수 있습니다:
{
"@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를, Ninja에 en을,
Nindža에 cs를 각각 연관시킵니다. name의 값 Yagyū
Muneyoshi은
@language가 null로 재설정되었으므로 어떤 언어 태그도 갖지 않습니다.
언어 연관은 일반 문자열에만 적용됩니다. 타입화된 값이나 타입 강제 대상 값은 언어 태그가 붙지 않습니다.
시스템은 일반적으로 여러 언어로 속성의 값을 표현할 필요가 있습니다. 이 경우 개발자가 언어별 데이터 구조를 쉽게 탐색할 수 있도록 언어 맵(language maps)을 활용할 수 있습니다.
{
"@context": {
...
"occupation": { "@id": "ex:occupation", "@container": "@language" }
},
"name": "Yagyū Muneyoshi",
"occupation": {
"ja": "忍者",
"en": "Ninja",
"cs": "Nindža"
}
...
}
위 예제는 이전 예제와 정확히 동일한 정보를 표현하지만 모든 값을 하나의 속성으로 통합합니다. 프로그래밍 언어에서 점 표기법(dot-notation)을 지원하면
property.language 패턴(예: obj.occupation.en)으로 특정 언어의 값을 접근할 수 있습니다(언어가 주 언어
서브태그로 제한되는 경우).
셋째로, 값 객체를 사용하여 기본 언어를 오버라이드할 수 있습니다:
{
"@context": {
...
"@language": "ja"
},
"name": "花澄",
"occupation": {
"@value": "Scientist",
"@language": "en"
}
}
값 객체를 사용하여 @language를 생략하거나 null로 설정하면 일반 문자열로 지정할 수 있습니다:
{
"@context": {
...
"@language": "ja"
},
"name": {
"@value": "Frank"
},
"occupation": {
"@value": "Ninja",
"@language": "en"
},
"speciality": "手裏剣"
}
맵된 값의 언어 설정에 관한 설명은 § 9.8 언어 맵을 참조하십시오.
이 절은 비규범적입니다.
문자열 또는 언어 태그된 문자열에 대해 기본
방향을 주석으로 달 수 있습니다.
언어와 마찬가지로, context에서
@direction 키를 설정하여 문서의 기본 방향을 지정할 수 있습니다:
위 예제는 두 문자열 HTML و CSS: تصميم و إنشاء مواقع الويب 및 مكتبة에
ar-EG 언어 태그와 rtl 방향을 연관시킵니다. 기본 방향은 타입 강제되지 않은 모든 문자열에 적용됩니다.
하위 트리의 기본 방향을 해제하려면, 스코프된 컨텍스트에서 @direction을 null로 설정할 수 있습니다:
{
"@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에 기본 방향을 연관시키려면 확장된 용어 정의를 사용할 수 있습니다:
{
"@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 |
기본 방향 연관은 일반 문자열과 언어 태그된 문자열에만 적용됩니다. 타입화된 값이나 타입 강제 대상 값에는 기본 방향이 부여되지 않습니다.
셋째로, 값 객체를 사용하여 기본 언어와 기본 방향을 오버라이드할 수 있습니다:
{
"@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를 참조하십시오.
이 절은 비규범적입니다.
JSON-LD 작성자는 배열을 사용하여 여러 값을 간단하게 표현할 수 있습니다. 그래프는 노드 간의 링크에 대한 순서를 설명하지 않기 때문에, JSON-LD의 배열은 기본적으로 포함된 요소들의 순서를 전달하지 않습니다. 이는 기본적으로 정렬된 일반 JSON 배열과는 정반대입니다. 예를 들어, 다음과 같은 간단한 문서를 고려하십시오:
여러 값은 확장된 형식을 사용하여 표현할 수도 있습니다:
위 예제는 문장으로 보았을 때 다시 순서가 없는(고유한 순서를 갖지 않는) 문장들을 생성합니다.
속성의 여러 값들은 일반적으로 동일한 타입이지만, JSON-LD는 이에 대해 제한을 두지 않으며 속성은 서로 다른 타입의 값을 가질 수 있습니다:
문장으로 보았을 때, 값들은 고유한(내재된) 순서를 가지지 않습니다.
이 절은 비규범적입니다.
정렬된 컬렉션의 개념은 데이터 모델링에서 중요하므로, 특정 언어적 지원이 유용합니다. JSON-LD에서는 @list 키워드를 사용하여 목록을 나타낼 수 있습니다:
이는 이 배열을 정렬된 것으로 설명하며, 문서를 처리할
때 순서가 유지됩니다. 특정 다중 값 속성의 모든 사용이 리스트라면, context에서 @container를 @list로 설정하여 이를 축약할 수
있습니다:
RDF에서의 리스트
구현은 익명 노드들을 rdf:first와 rdf:rest 속성을 사용해 연결하고, 리스트의 끝을 리소스
rdf:nil로 정의하는 방식에 의존합니다(“문장” 탭이 보여주는 바와 같습니다). 이렇게 하면 순서가 없는 문장 집합 내에서 순서를 표현할 수 있습니다.
JSON-LD와 Turtle 모두 정렬된 리스트를 표현하기 위한 단축 표기를 제공합니다.
JSON-LD 1.1에서는 리스트 객체의 값이 또 다른 리스트 객체일 수 있는, 즉 리스트의 리스트 구조가 완전히 지원됩니다.
"@container": "@list" 정의는 배열 값이 자체적으로 리스트임을 재귀적으로 기술합니다. 예를 들어, The GeoJSON Format에서
coordinates는 positions의 정렬된 목록이며, 각 포지션은 두 개 이상의 숫자로 표현되는 배열입니다.
{
"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]
]
]
}
//...
}
이 예제들에서는 bbox 및 coordinates 안에 표현된 값들이 순서를 유지해야 하므로 임베디드 리스트 구조를 사용해야 합니다. JSON-LD 1.1에서는 적절한 컨텍스트 정의를 추가하여 이를 재귀적 리스트로 표현할 수 있습니다:
참고로 coordinates는 세 수준의 리스트를 포함합니다.
@list 컨테이너와 연결된 용어의 값은 값이 하나이거나 전혀 없더라도 항상 배열 형태로 표현됩니다.
이 절은 비규범적입니다.
@list가 정렬된 목록을 설명하는 데 사용되는 반면, @set 키워드는 정렬되지 않은 집합을 설명하는
데 사용됩니다. 문서 본문에서의 @set 사용은 단순한 문법적 설탕이므로 문서 처리 시 최적화되어 제거됩니다. 그러나 문맥(context) 내에서 사용할 때
@set는 유용합니다.
@set 컨테이너와 연결된 용어의 값들은 값이 하나만 있어 축약 형태에서 비배열 형태로 최적화될 경우에도 항상 배열 형식으로 표현됩니다(자세한 내용은 § 5.2
축약된 문서 형식 참조). 이렇게 하면 값이 하나인 경우에도 항상 배열 형태가 유지되어 후처리가 쉬워집니다.
이는 이 배열이 정렬되지 않았음을 설명하며, 처리 중에
순서가 바뀔 수 있습니다. 기본적으로 값들의 배열은 정렬되지 않지만, context에서 @container를 @set으로 설정하여 이를 명시할 수
있습니다.
JSON-LD 1.1 이후로 @set 키워드는 확장된 용어 정의 내의 다른 컨테이너 사양들과 결합되어, 색인된 값들의 축약된
표현이 항상 배열로 일관되게 표현되도록 할 수 있습니다. 자세한 내용은 § 4.6 인덱스된 값들을 참조하십시오.
@set을
@type과 함께 사용하기
이 절은 비규범적입니다.
처리 모드(processing mode)가 json-ld-1.0로 설정되지 않은 한,
@type은 @container가 @set으로 설정된 확장된 용어 정의에서
사용할 수 있습니다; 그러한 확장된 용어 정의 내에는 다른 항목을 설정할 수 없습니다. 이는 Compaction algorithm에서
@type의 값들(또는 별칭)이 항상 배열로 표현되도록 보장하는 데 사용됩니다.
{
"@context": {
"@version": 1.1,
"@type": {"@container": "@set"}
},
"@type": ["http:/example.org/type"]
}
이 절은 비규범적입니다.
많은 JSON API는 중간 객체를 사용해 속성을 엔터티와 분리합니다. JSON-LD에서는 이러한 것을 중첩된 속성이라고 합니다. 예를 들어, 가능한 레이블 집합을 공통 속성 아래에 그룹화할 수 있습니다:
labels를 키워드
@nest로 정의하면,
JSON-LD
프로세서는 labels 속성으로 만든 중첩을 무시하고 그 내용을 포함하는 객체 안에 직접 선언된 것처럼 처리합니다. 이 경우 labels
속성은 의미적으로 무의미합니다. 그것을 @nest와 동등하게 정의하면 확장 시 무시되어 다음과 동등해집니다:
마찬가지로, 용어 정의는
@nest 속성을 포함할 수 있으며,
이는 @nest에 별칭된 용어를 참조하여 해당 용어로 축약할 때 해당 속성들이 그 별칭된 용어 아래에 중첩되게 합니다.
아래 예제에서는 main_label과 other_label이 모두 "@nest": "labels"로 정의되어 있어,
축약 시 labels 아래에 직렬화됩니다.
[{
"@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"}
]
}]
{
"@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의 새로운 기능입니다.
이 절은 비규범적입니다.
임베딩은 작성자가 노드 객체를 속성 값으로 사용할 수 있게 하는 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 식별자는 플래트닝 같은 알고리즘에 의해 자동으로 도입될 수 있지만, 작성자가 이러한 관계를 직접 기술하는 데에도 유용합니다.
이 절은 비규범적입니다.
때로는 노드를 고유하게 식별할 수 없는 상태로 정보를 표현해야 할 필요가 있습니다.
이러한 유형의 노드를 blank node라고 합니다. JSON-LD는
모든 노드가 @id로 식별될 것을 요구하지 않습니다. 그러나 일부 그래프 토폴로지는 직렬화 가능한 식별자가 필요할 수 있습니다. 예를 들어 루프를 포함한
그래프는 임베딩만으로 직렬화할 수 없으므로 노드들을 연결하기 위해 @id가 필요합니다.
이러한 상황에서는 밑줄(_)을 스킴으로 사용하는 IRI처럼 보이는 blank node
identifier를 사용할 수 있습니다. 이는 문서 내에서 로컬로 노드를 참조할 수 있게 하지만 외부 문서에서 참조할 수는 없습니다. 해당 식별자는 그가 사용된
문서에만 범위가 있습니다.
위 예제는 IRI로는 식별할 수 없는 두 명의 비밀 요원에 대한 정보를 포함합니다. agent 1이 agent 2를 알고 있다는 것을 표현하는 것은 blank node 식별자 없이도 가능하지만, agent 2에서 agent 1을 참조하려면 agent 1에 식별자를 할당해야 합니다.
처리 중에 blank node 식별자가 다시 레이블링될 수 있다는 점에 유의하십시오. 동일한 blank node를 여러 번 참조한다면, 개발자는 해당 노드에 대해 해석 가능한(역참조 가능한) IRI를 부여하는 것을 고려해야 합니다. 그렇게 하면 다른 문서에서도 참조할 수 있게 됩니다.
이 절은 비규범적입니다.
때때로 여러 속성 값을 배열을 반복하여 찾는 것보다 더 직접적으로 접근해야 할 필요가 있습니다. JSON-LD는 중간 맵을 사용해 특정 인덱스를 연관된 값과 연결할 수 있는 인덱싱 메커니즘을 제공합니다.
JSON-LD에서 인덱싱의 다른 사용에 대해서는 § 4.9 명명된 그래프를 참조하십시오.
이 절은 비규범적입니다.
데이터베이스는 일반적으로 데이터 접근을 더 효율적으로 만들기 위해 사용됩니다. 개발자들은 종종 이러한 기능을 애플리케이션 데이터로 확장하여 유사한 성능 이득을 얻습니다. 이러한 데이터는 Linked Data 관점에서는 의미가 없을 수 있지만 애플리케이션에 유용합니다.
JSON-LD는 데이터를 더 효율적으로 접근할 수 있는 형태로 구조화하는 데 사용할 수 있는 인덱스 맵의 개념을 도입합니다.
데이터 인덱싱 기능은 키가 IRI에
매핑되지 않는 단순 키-값 맵을 사용하여 데이터를 구조화할 수 있게 합니다.
이는 특정 항목을 찾기 위해 배열을 스캔하는 대신 직접 접근을 가능하게 합니다.
JSON-LD에서는 이러한 데이터를 컨텍스트에서 @index 키워드를 @container 선언과 연관시켜 지정할 수 있습니다:
위 예제에서 athletes 용어는
인덱스 맵으로 표시되었습니다.
catcher와 pitcher 키는 의미론적으로는 무시되지만 문법적으로는 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는 연관된 인덱스가 없는 데이터를 인덱싱하는 데 사용되어 정규화된 표현을 유지하는 데 유용합니다.
이 절은 비규범적입니다.
가장 단순한 형태에서(위 예제들처럼) 데이터 인덱싱은 인덱스 맵의 키에 의미를 부여하지 않습니다. 그러나 어떤 상황에서는 객체를 인덱싱하는 데 사용되는 키들이 해당 객체들과 의미론적으로 연결되어 있으며, 문법적으로뿐만 아니라 의미론적으로도 보존되어야 합니다.
처리 모드(processing
mode)가 json-ld-1.0로 설정되지 않은 한,
용어 설명에서 "@container": "@index"는 "@index" 키를 동반할 수 있습니다.
해당 키의 값은 IRI로 확장되어야 하며,
이는 각 객체를 키와 연결하는 의미적 속성을 식별합니다.
이 절은 비규범적입니다.
여러 언어의 문자열 값을 포함하는 JSON은 언어
맵을 사용해 표현할 수 있으며,
이렇게 하면 속성 값을 언어 태그로 쉽게 인덱싱할 수 있습니다.
이는 특정 항목을 찾기 위해 배열을 스캔하는 대신 언어 값에 직접 접근할 수 있게 합니다.
JSON-LD에서는 이러한 데이터를 컨텍스트에서 @language 키워드를 @container 선언과 연관시켜 지정할 수 있습니다:
위 예제에서 label 용어는 언어 맵으로 표시되었습니다.
en과 de 키는 각각의 값과 암묵적으로 연관되며 JSON-LD 프로세서가 처리합니다.
이를 통해 개발자는 obj.label.de와 같이 독일어 버전의 label에 접근할 수 있습니다.
다만 이는 언어가 주요 언어 서브태그로 제한되고 "de-at" 같은 다른 서브태그에 의존하지 않는 경우에만 적절합니다.
@container의 값은 또한 @language와 @set를 모두 포함하는 배열일 수 있습니다.
축약할 때 이는 JSON-LD 프로세서가
언어 태그 값들의 모든 항목에 대해 배열 형태를
사용하도록 보장합니다.
처리 모드(processing mode)가 json-ld-1.0로 설정되지 않은 한,
언어가 없는 문자열을 인덱싱할 때 특수 인덱스 @none가 사용됩니다. 이는 데이터 타입이 없는 문자열 값에 대한 정규화된 표현을 유지하는 데 유용합니다.
이 절은 비규범적입니다.
인덱스 맵 외에도,
JSON-LD는 데이터를 구조화하기 위한 id 맵 개념을
도입합니다.
id 인덱싱 기능은 키가 IRI에
매핑되는 단순 키-값 맵을 사용하여 데이터를 구조화할 수 있게 합니다.
이는 특정 항목을 찾기 위해 배열을 스캔하는 대신 관련된 노드 객체에 직접 접근할 수 있게 합니다.
JSON-LD에서는 이러한 데이터를 컨텍스트에서 @id 키워드를 @container 선언과 연관시켜 지정할 수 있습니다:
위 예제에서 post 용어는 id
맵으로 표시되었습니다.
http://example.com/posts/1/en 및 http://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의 새로운 기능입니다.
이 절은 비규범적입니다.
id 및 인덱스 맵 외에도, JSON-LD는 데이터를
구조화하기 위한 타입 맵 개념을 도입합니다.
타입 인덱싱 기능은 키가 IRI에
매핑되는 단순 키-값 맵을 사용하여 데이터를 구조화할 수 있게 합니다.
이는 특정 @type의 노드
객체를 기반으로 데이터를 구조화할 수 있게 합니다.
JSON-LD에서는 이러한 데이터를 컨텍스트에서 @type 키워드를 @container 선언과 연관시켜 지정할 수 있습니다:
위 예제에서 affiliation 용어는 타입 맵으로 표시되었습니다.
schema:Corporation 및 schema:ProfessionalService 키는
노드 객체 값의 @type
속성으로 해석됩니다.
@container의 값은 또한 @type과 @set를 모두 포함하는 배열일 수 있습니다.
축약할 때 이는 JSON-LD 프로세서가
모든 타입 값에 대해 배열 형식을 사용하도록
보장합니다.
특수 인덱스 @none는 @type이 없는 노드 객체를 인덱싱하는 데 사용되어 정규화된 표현을 유지하는 데 유용합니다.
@none 인덱스는 아래 예제에서 사용된 none과 같이 @none로 확장되는 용어일 수도 있습니다.
id 맵과 마찬가지로, @type과
함께 사용할 때도 컨테이너는 키 값이 항상 배열에 포함되도록 하기 위해 @set을 포함할 수 있습니다.
Type 맵은 JSON-LD 1.1의 새로운 기능입니다.
이 절은 비규범적입니다.
때때로 다른 노드 객체의 일부로 노드 객체들을 나열하는 것이 유용할 수 있습니다. 예를 들어, 어떤 다른 자원에서 사용되는 자원의 집합을 표현할 때 그렇습니다. 포함된 블록은 일차 노드 객체에서 참조될 수 있는 이러한 보조 노드 객체를 수집하는 데에도 사용될 수 있습니다. 예를 들어, 일부가 공통 요소를 공유하는 다양한 항목들의 목록을 포함하는 노드 객체를 생각해 보십시오:
{
"@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"
}]
}
평탄화되면,
이것은 employee 및 contractor 요소들을
포함된 블록에서
바깥쪽 배열로 이동시킵니다.
포함된 리소스는 JSON API의 Inclusion of Related Resources에
설명되어 있으며, 이는 일부 기본 리소스와 연관된 관련 리소스를 포함하는 방법입니다;
@included은 JSON-LD에서 유사한 가능성을 제공합니다.
노드 객체 내에서 @included를 사용한 부산물로, 맵은
오직 @included만을 포함할 수 있으며, 이는 § 4.1
고급 컨텍스트 사용에 설명된 기능과 유사한 기능을 제공합니다.
여기서 @graph는 연결되지 않은 노드들을 기술하는 데 사용됩니다.
그러나 @graph와는 대조적으로, @included는 동일한 속성들과
상호작용하지 않으며, 이 기능은 § 4.9
명명 그래프에서
더 자세히 논의됩니다.
이 절은 비규범적입니다.
JSON-LD는 방향성 그래프를 직렬화합니다. 이것은 모든 속성이 한 노드에서 다른 노드나 값를 가리킨다는 것을 의미합니다. 그러나 경우에 따라 역방향으로 직렬화하는 것이 바람직할 수 있습니다. 예를 들어 한 사람과 그 자녀들이 문서에 기술되어야 하는 경우를 생각해 보십시오. 사용된 어휘에 children 속성이 없고 단지 parent 속성만 제공된다면, 각 자녀를 나타내는 노드는 다음 예와 같이 부모를 가리키는 속성으로 표현되어야 할 것입니다.
이러한 데이터를 표현하는 것은 JSON-LD의 @reverse
키워드를 사용하는 것이 훨씬 간단합니다:
또한 @reverse 키워드는
다음 예시에서 보이는 것처럼 확장된 용어
정의에서도
역방향 속성을 생성하는 데 사용할 수 있습니다:
이 절은 비규범적입니다.
때때로 단일 노드뿐만 아니라 그래프 자체에 대해 서술해야
할 때가 있습니다. 이는 @graph
키워드를 사용하여 여러 노드를 그룹화함으로써 수행할 수 있습니다. 개발자는 또한 다음 예제와 같이
@graph 키워드로 표현된 데이터를
@id 키워드와 짝지어 이름을 지정할 수
있습니다:
위 예제는 명명된 그래프를
IRI
http://example.org/foaf-graph로 식별하여 표현합니다. 해당 그래프는 Manu와 Gregg에 대한 문장들로 구성됩니다. 그래프 자체에 대한
메타데이터는 그래프가 생성된 시점을 지정하는 generatedAt 속성을 통해 표현됩니다.
JSON-LD 문서의 최상위 구조가 맵이고
@graph와 (선택적으로) @context 외에 다른 키를 포함하지 않는 경우(IRI나 키워드로 매핑되지 않는 속성들은 무시됨),
@graph는 암묵적인 기본 그래프를 표현하는 것으로 간주됩니다. 이 메커니즘은
문서의 최상위에 동일한 컨텍스트를 공유하는 여러 노드가 존재하는 경우(예: 문서가 평탄화된 경우)에 유용합니다. @graph 키워드는 이러한 노드들을 배열로 수집하고 공유 컨텍스트를 사용할 수 있게 합니다.
이 경우 그래프에 관련 없는 노드들이 포함되어 있으므로 임베딩을
사용할 수 없습니다.
이는 배열 내에서 여러 노드 객체를 사용하고 각 노드 객체
내에서 @context를 정의하는 것과 동등합니다:
이 절은 비규범적입니다.
경우에 따라 JSON 표현 내부에서 이를 명시하지 않고도 데이터를 논리적으로 별도의 그래프로 분할하는 것이 유용합니다. 예를 들어, JSON 문서는 다른 메타데이터가 주장되는
데이터와 관련된 데이터를 포함할 수 있으며, 이러한 데이터를 명명된 그래프 개념을 사용하여 데이터 모델에서 분리하는
것이 유용할 수 있습니다. 이는 @graph 키워드를 사용하는 구문적 오버헤드를 필요로 하지 않습니다.
확장된 용어 정의(expanded
term definition)는 @container 값으로 @graph를 사용할 수 있습니다. 이는 해당 용어의 값들이
명명된 그래프로
간주되어야 함을 나타내며, 이때 그래프 이름은 자동으로 할당된 blank node
identifier가 되어 암묵적 명명 그래프를 생성합니다. 확장 시, 이들은 간단한 그래프 객체가 됩니다.
다른 예는 익명으로 된 명명된 그래프를 사용하는 경우입니다:
위 예제는 명명된 그래프(익명)를 표현하여 하나의 서술을 하고 있습니다. 기본 그래프에는 주체가 해당 서술을 작성했다는 문장이 포함되어 있습니다. 이는 문장들을 명명된 그래프로 분리한 다음, 그 명명된 그래프에 포함된 문장들에 대해 추가로 단언하는 예입니다.
그래프 컨테이너는 JSON-LD 1.1의 새로운 기능입니다.
이 절은 비규범적입니다.
노드 객체를 인덱스로 인덱싱하는 것 외에도, 그래프
객체 역시 인덱스로 인덱싱될 수 있습니다. § 4.9.1 그래프 컨테이너에서 도입된 @graph 컨테이너 타입과
@index를 함께 사용하면, 해당 속성의 객체 값은 키가 IRIs로 매핑되는 것이 아니라 그 값들이 되는 명명된 그래프에 연관된
@index 속성에서 가져온 키-값 맵으로 처리됩니다. 확장 시, 이러한 값들은 간단한 그래프 객체여야 합니다.
다음 예제는 기본 그래프가 인덱스 맵을 사용하여 여러 명명된 그래프를 참조하는 방식을 설명합니다.
인덱스 맵과 마찬가지로,
@graph와 함께 사용할 때 컨테이너는 또한 @set을 포함하여 키 값이 항상 배열에 포함되도록 할 수 있습니다.
특별 인덱스 @none는 @index 키가 없는 그래프를 인덱싱하는 데 사용되며, 정규화된 표현을 유지하는
데 유용합니다. 단, 여러 식별되지 않은 명명된 그래프가 @none 인덱스를 사용하여 압축된 문서를 압축 해제하면 해당
그래프들의 내용이 병합됩니다. 이를 방지하려면 각 그래프에 고유한 @index 키를 부여하십시오.
명명된 그래프 데이터 인덱싱은 JSON-LD 1.1의 새로운 기능입니다.
이 절은 비규범적입니다.
식별자로 노드 객체를 인덱싱하는 것 외에, 그래프
객체는 그들의 그래프 이름으로도 인덱싱될 수 있습니다. § 4.9.1 그래프
컨테이너에서 도입된 @graph 컨테이너 타입과 @id를 함께 사용하면, 해당 속성의 객체 값은 키가 그 값들인 명명된 그래프의
식별자를 나타내는 키-값 맵으로 처리됩니다.
다음 예제는 기본 그래프가 id 맵을 사용하여 여러 명명된 그래프를 참조하는 방식을 설명합니다.
id 맵과 마찬가지로, @graph와
함께 사용할 때 컨테이너는 또한 @set을 포함하여 키 값이 항상 배열에 포함되도록 할 수 있습니다.
또한 id 맵과 마찬가지로, 특별 인덱스
@none는 @id가 없는 명명된 그래프를 인덱싱하는 데 사용되며, 정규화된 표현을
유지하는 데 유용합니다. @none 인덱스는 또한 @none으로 확장되는 용어일 수도 있습니다.
단, 여러 그래프가 @id 없이 표현되면 확장 시 병합됩니다. 이를 방지하려면 @none을 신중하게
사용하거나 그래프에 고유한 식별자를 부여하십시오.
그래프 컨테이너는 JSON-LD 1.1의 새로운 기능입니다.
이 절은 규범적이지 않습니다.
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 는 원격 문서 로딩이 문제가 될 수 있는 다양한 상황에서 유용하게 사용될 수 있습니다:
이 절은 규범적이지 않습니다.
많은 데이터 형식과 마찬가지로 JSON-LD에서 데이터를 기술하는 단 하나의 정답은 없습니다. 그러나 JSON-LD는 그래프를 기술하기 위해 사용되므로, 의미(Linked Data로서의 의미)를 변경하지 않으면서 데이터의 형태(shape)를 변경하는 특정 변환을 사용할 수 있습니다.
@context가 더 이상 필요하지 않게 만드는 과정입니다.
이 절은 § 5.1
Expanded Document Form에서 더 자세히 설명됩니다.
이 절은 규범적이지 않습니다.
JSON-LD 1.1 Processing Algorithms and API 명세 [JSON-LD11-API]
는 JSON-LD 문서를 확장(expanding)하는 방법을 정의합니다.
Expansion은 JSON-LD 문서를 가져와
모든 IRI, 타입 및 값을 확장하여 @context가 더 이상 필요하지 않게 만드는 과정입니다.
예를 들어, 다음 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입니다.
이 절은 규범적이지 않습니다.
JSON-LD 1.1 Processing Algorithms and API 명세 [JSON-LD11-API]는 JSON-LD 문서를 압축(compacting)하는 방법을 정의합니다. Compaction은 개발자가 제공한 context를 적용하여 IRI를 term이나 compact IRI로 단축하고, 확장된 형식으로 표현된 JSON-LD 값을 문자열이나 숫자 같은 단순 값으로 표현하는 과정입니다. 이는 문서를 애플리케이션별 용어로 표현하여 문서 작업을 더 간단하게 만드는 경우가 많습니다. 또한 압축된 문서는 일반적으로 사람이 읽기에 더 쉽습니다.
예를 들어, 다음 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 컨텍스트를 가정합니다:
{
"@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 간의 관계를 반전시키고, 여러 값을 배열로 표현하는 대신 데이터 맵을 사용하여 값에 인덱싱하는 것 등이 포함됩니다.
이 절은 규범적이지 않습니다.
확장된 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 mapping은
vocabulary relative일 수 있는 IRI들을 축약하는 데 사용할 수 있으며,
이는 vocabulary mapping과 일치하는 IRI 접두사를 제거함으로써 이루어집니다.
이는 IRI가 프로퍼티로 사용되거나 @type의 값으로 사용되거나
"@type": "@vocab"로 설명된 term의 값으로 사용되는 경우에 적용됩니다.
이 절은 규범적이지 않습니다.
모호성을 피하기 위해 expanded document form은 항상 노드와 값을 node objects와 value objects를 사용해 표현합니다. 또한 프로퍼티 값은 값이 하나뿐인 경우에도 항상 배열에 포함됩니다. 때로는 접근의 일관성을 유지하기 위해 유용하지만, 대부분의 JSON 데이터는 가능한 한 단순한 표현을 사용하므로 프로퍼티는 단일 값을 갖고, 이는 문자열이나 노드 객체와 같은 구조화된 값으로 표현됩니다. 기본적으로 compaction은 단순 문자열인 값을 문자열로 표현하지만, 때로 값이 IRI, 날짜, 또는 단순 문자열로 표현하면 정보가 손실되는 다른 타입된 값일 수 있습니다. term definition 내에서 이를 지정하면, 문자열 값의 의미는 해당 term의 정의에서 유추될 수 있습니다. 자세한 내용은 § 4.2 Describing Values를 참조하십시오.
이 절은 규범적이지 않습니다.
§ 4.3.1 Lists에서 설명한
것처럼,
JSON-LD는 순서가 있는 값을 표현하기 위해 확장된 문법으로 @list 키워드를 사용합니다.
표현을 단순화하기 위해 용어(term)를 "@container": "@list"로 정의할 수 있으며,
그러면 해당 용어를 사용하는 프로퍼티의 모든 값은 순서가 있는 것으로 간주됩니다.
이 절은 규범적이지 않습니다.
경우에 따라 두 노드를 연결하는 데 사용되는 프로퍼티는 노드 간의 방향을 반전시켜 표현하는 것이 더 적절할 수 있습니다. 예를 들어 두 사람과 공통 부모를 설명할 때가 그렇습니다. 자세한 내용은 § 4.8 Reverse Properties를 참조하십시오.
역방향 프로퍼티는 framing과 결합하면 더욱 유용할 수 있으며, framing은 문서의 최상위에 정의된 node objects를 임베디드 노드로 만들 수 있습니다. JSON-LD는 적절한 @container 정의를 term 정의 내에 지정하여 이러한 값들을 인덱싱하는 수단을 제공합니다.
이 절은 규범적이지 않습니다.
여러 값을 갖는 프로퍼티는 일반적으로 순서가 없는 배열을 사용해 표현됩니다.
이는 해당 JSON의 내부화된 표현을 다루는 애플리케이션이 특정 패턴과 일치하는 값을 찾기 위해 배열의 값을 반복(iterate)해야 함을 의미합니다.
예를 들어 언어 태그가 있는 문자열을 언어 en으로 찾는 경우가 그렇습니다.
데이터는 @id, @type, @language, @index 등 여러 키로 인덱싱될 수 있습니다. 자세한 내용은 § 4.6 Indexed Values 및 § 4.9 Named Graphs를 참조하십시오.
이 절은 규범적이지 않습니다.
때로는 문서를 압축하되 node object와 value object 표현을 유지하는 것이 유용할 수 있습니다.
이를 위해 term definition에서 "@type": "@none"를 설정할 수 있습니다.
이것은 Value Compaction 알고리즘이
항상 값의 객체 형태를 사용하게 하지만 그 값의 구성 요소는 압축될 수 있도록 합니다.
이 절은 규범적이지 않습니다.
일반적으로 압축할 때 값이 하나뿐인 프로퍼티는 문자열 또는 맵으로 표현되고,
여러 값을 가진 프로퍼티는 문자열 또는 맵의 배열로 표현됩니다.
이는 해당 프로퍼티에 접근하는 애플리케이션이 두 표현 중 어느 쪽이든 받아들일 준비가 되어 있어야 함을 의미합니다.
모든 값을 배열로 표현하도록 강제하려면 term definition에서 "@container": "@set"를 설정할 수 있습니다.
또한 @set은 다른 container 설정과 결합하여 사용할 수 있습니다. 예를 들어 앞서의 언어-맵 예제를 보면:
이 절은 규범적이지 않습니다.
압축 시 Compaction algorithm은
해당 프로퍼티의 값들이 그 term
definition의
@container, @type, 및 @language 사양과 일치할 때만 그 프로퍼티에 대해
용어(term)를 사용하여 압축합니다.
이는 실제로 동일한 IRI를 갖는 여러 값을 서로 다른 프로퍼티들로 분리할 수 있습니다. 일치하는
term definition이 없는 경우,
compaction 알고리즘은 프로퍼티의 절대 IRI를 사용하여 압축합니다.
이 절은 규범적이지 않습니다.
JSON-LD 1.1 Processing Algorithms and API 명세 [JSON-LD11-API]는 JSON-LD 문서를 flattening하는 방법을 정의합니다. Flattening은 노드의 모든 속성을 단일 맵에 수집하고, 모든 blank node에 대해 blank node identifiers를 라벨링합니다. 이는 데이터의 형태를 보장하여 특정 애플리케이션에서 JSON-LD를 처리하는 데 필요한 코드를 크게 단순화할 수 있습니다.
예를 들어, 다음 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와 결합하여 사용할 수 있습니다.
이 절은 규범적이지 않습니다.
JSON-LD 1.1 Framing 명세 [JSON-LD11-FRAMING]는 JSON-LD 문서를 framing하는 방법을 정의합니다. Framing 은 예시 frame 문서를 사용해 JSON-LD 문서의 데이터를 원하는 구조로 만드는 데 사용됩니다. 이 프레임 문서는 flattened 데이터와 일치시키는 데 사용되며, 결과 데이터가 어떻게 형성되어야 하는지의 예를 제공합니다.
예를 들어, 다음과 같은 JSON-LD 프레임을 가정합니다:
{
"@context": {
"@version": 1.1,
"@vocab": "http://example.org/"
},
"@type": "Library",
"contains": {
"@type": "Book",
"contains": {
"@type": "Chapter"
}
}
}
이 프레임 문서는 타입이 Library인 객체들을 최상위에 배치하고, 라이브러리 객체와 contains 속성으로 연결된 타입이 Book인 객체들을 프로퍼티 값으로 임베드하도록 하는 구조를 설명합니다. 또한 타입이 Chapter인 객체들을 해당 참조하는 Book 객체의 임베디드 값으로 배치합니다.
프레임 구성 요소와 일치하는 평탄화된 객체 집합을 사용할 때:
{
"@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
element가
frame을 찾는 데 사용됩니다.
JSON-LD 처리의 특정 측면은 HTTP Link Headers [RFC8288]를 사용해 수정할 수 있습니다. 이러한 헤더는 자체적으로 JSON-LD가 아닌 리소스를 검색할 때 사용될 수 있으며, Link Relation의 정보를 사용하여 이를 JSON-LD로 해석할 수 있습니다.
일반 JSON 문서를 처리할 때, 링크 관계는 원격 문서를 가져올 때 반환되는 HTTP Link Header를 사용하여 지정할 수 있으며, 이는 § 6.1 JSON을 JSON-LD로 해석하기에서 설명됩니다.
다른 경우에는 리소스가 JSON-LD로 쉽게 해석될 수 없는 표현으로 반환될 수 있습니다. 일반적으로는 클라이언트가 다른 표현보다 JSON-LD를 선호하도록 지정할 수 있게 하기 위해 HTTP 콘텐츠 협상을 사용하지만, 특정 상황에서는 서버가 그런 요청에 적절히 응답하는 것이 불가능하거나 실용적이지 않을 수 있습니다. 이를 위해 HTTP Link Header를 사용해 원래 요청된 리소스 대신 사용할 문서의 대체 위치를 제공할 수 있습니다. 이는 § 6.2 대체 문서 위치에서 설명됩니다.
일반적인 JSON 문서는 명시적인 JSON-LD context
문서를 제공함으로써 JSON-LD로 해석될 수 있습니다. 이를 제공하는 한 방법은
context 문서를
HTTP Link Header에 참조하는
것입니다.
이렇게 하면 개발자가 문서를 대폭 변경하지 않고도 JSON을 기계가 모호함 없이 읽을 수 있게 하며,
기존 인프라에 대한 업그레이드 경로를 제공하면서 application/json 미디어 타입이나
+json 접미사가 있는 미디어 타입에 의존하는 기존 클라이언트를 깨뜨리지 않습니다
([RFC6839]).
일반 JSON 문서에 외부 컨텍스트를 사용하려면, HTTP를 통해 일반 JSON 문서를 검색할 때 프로세서는 반드시 다음과 같이 JSON-LD 문서를 Link Header로 참조한 경우 이를 가져오려고 시도해야 합니다:
rel="http://www.w3.org/ns/json-ld#context", 및type="application/ld+json".참조된 문서는 최상위에 JSON 객체를
포함해야 합니다(반드시). 참조된 객체 내의 @context
엔트리는 참조하는 문서의 최상위
JSON 객체에 추가됩니다.
참조 문서의 최상위가 배열이고 그 항목들이
JSON 객체인 경우,
@context 서브트리는 모든 배열 항목에 추가됩니다. 참조된 문서에서 @context 서브트리 외부에 위치한
모든 추가 정보는 반드시 폐기되어야 합니다. 사실상 이는 활성 컨텍스트가
참조된 외부 context로 초기화됨을 의미합니다.
응답은 http://www.w3.org/ns/json-ld#context 링크 관계를 사용하는
HTTP Link Header를
둘 이상 포함해서는 안 됩니다(금지).
다른 URI 스킴에 대해 JSON-LD Context를 제공하는 다른 메커니즘이 설명될 수 있습니다(허용).
JSON-LD 1.1 Processing Algorithms and API 명세는 프로그램적으로 JSON 문서를 확장할 때 사용할 expandContext 옵션을 제공합니다.
다음 예시는 HTTP를 통해 일반 JSON 문서와 함께 외부 컨텍스트를 사용하는 방법을 보여줍니다:
GET /ordinary-json-document.json HTTP/1.1 Host: example.com Accept: application/ld+json,application/json,*/*;q=0.1 ==================================== HTTP/1.1 200 OK ... Content-Type: application/json Link: <https://json-ld.org/contexts/person.jsonld>; rel="http://www.w3.org/ns/json-ld#context"; type="application/ld+json" { "name": "Markus Lanthaler", "homepage": "http://www.markus-lanthaler.com/", "image": "http://twitter.com/account/profile_image/markuslanthaler" }
참고로, JSON-LD 문서가
application/ld+json 미디어 타입으로 제공되는 경우, 해당 문서는 본문에 모든 컨텍스트 정보를 포함해야 하며(반드시), 외부 컨텍스트에 대한 참조를 포함하더라도
http://www.w3.org/ns/json-ld#context 링크 관계를 통해 제공된 컨텍스트는 그런 문서들에 대해서는
무시되어야 합니다(반드시).
직접적으로 JSON-LD로 해석될 수 없는 문서는 JSON-LD를 포함하는 대체 위치를 제공할 수 있습니다. 이를 제공하는 한 방법은 JSON-LD 문서를 HTTP Link Header로 참조하는 것입니다. 예를 들어, 네임스페이스에 연관된 URL이 본질적으로 HTML 문서를 포함하지만, 그 URL과 연관된 JSON-LD 컨텍스트는 다른 곳에 위치할 수 있는 경우에 유용합니다.
대체 위치를 지정하려면, 비-JSON 리소스(즉, application/json 또는 그 파생형이 아닌 미디어 타입을 사용하는 리소스)는
다음과 같이 Link Header를 사용해 대체 위치를 반환할 수 있습니다:
rel="alternate", 그리고type="application/ld+json".응답은 type="application/ld+json"과 함께 alternate 링크 관계를 사용하는
HTTP Link Header를
둘 이상 포함해서는 안 됩니다(금지).
다른 URI 스킴에 대해 대체 위치를 제공하는 다른 메커니즘이 설명될 수 있습니다(허용).
다음 예시는 HTTP 문서와 함께 대체 위치를 사용하는 방법을 보여줍니다:
GET /index.html HTTP/1.1 Host: example.com Accept: application/ld+json,application/json,*/*;q=0.1 ==================================== HTTP/1.1 200 OK ... Content-Type: text/html Link: <alternate.jsonld>; rel="alternate"; type="application/ld+json" <html> <head> <title>Primary Entrypoint</title> </head> <body> <p>This is the primary entrypoint for a vocabulary</p> </body> </html>
비-JSON 결과를 본 프로세서는 링크 헤더의 존재를 확인하고 대신 해당 문서를 로드합니다.
이 절은 documentLoader가 HTML 스크립트 추출을 지원하는 경우에 사용할 수 있는 기능을 설명합니다. 자세한 내용은 원격 문서 및 컨텍스트 검색을 참조하십시오.
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 요소들 중
type이 application/ld+json인 모든 요소는 반드시
처리되어 단일 데이터셋으로
병합되어야 하며,
서로 다른 스크립트 요소에 포함된 블랭크 노드 식별자는 동일 문서에 있는 것처럼 취급되어 공유됩니다(즉, 블랭크 노드가 다른 JSON-LD 스크립트 요소들 간에 공유됨).
base 요소로부터 기본 IRI 상속
JSON-LD script 요소를 처리할 때, 포함하는 HTML 문서의 문서 기본 URL이 [HTML]에 정의된 대로 포함된 JSON-LD 콘텐츠의 기본 base IRI를 설정하는 데 사용됩니다.
HTML은 기본 URL의 동적 변경을 허용합니다. 이 명세는 특정 동작을 요구하지 않으며, 모든 시스템이 base IRI를 동일하게 처리하도록 보장하기 위해 저자는 권장되는 대로 IRIs를 사용하거나 § 4.1.3 Base IRI에 명시된 대로 명시적으로 지정해야 합니다. 구현(특히 DOM을 네이티브로 운영하는 구현)은 기본 URL의 동적 변경을 고려할 수 있습니다(허용).
script 요소의 내용 제한
이 절은 규범적이지 않습니다.
HTML의 script 요소 내용 제한으로 인해, script 요소에 포함된 JSON-LD 데이터에는 추가적인 인코딩 제한이 적용됩니다.
저자는 HTML 내부에 임베드된 스크립트에서 comment-open, script-open, comment-close, 또는 script-close와 혼동될 수 있는 문자 시퀀스 사용을 피해야 합니다.
& → & (ampersand, U+0026)< → < (less-than sign, U+003C)> → > (greater-than sign, U+003E)" → " (quotation mark, U+0022)' → ' (apostrophe, U+0027)HTML 문서 내의 특정 script 요소는 URL로 위치한 HTML 문서 내의 스크립트 요소의 고유 식별자와 일치하는 프래그먼트 식별자를 사용하여 찾을 수 있습니다 (참조: [DOM]). JSON-LD 프로세서는 지정된 데이터 블록의 내용을 추출하여 독립 실행형 JSON-LD 문서로 파싱해야 하며(반드시), 동일한 HTML 문서의 다른 마크업과 결과를 병합해서는 안 됩니다(금지).
예를 들어, http://example.com/document에 위치한 HTML 문서가 있고,
아이디가 "dave"인 스크립트 요소를 지정하려면 URL http://example.com/document#dave를 사용할 수 있습니다.
JSON-LD는 JSON을 기반으로 하는 Linked Data의 직렬화 형식입니다. 따라서 구문(이는 [RFC8259]의 JSON에 의해 정의됨)과 데이터 모델(이는 RDF 데이터 모델의 확장임) 사이를 구별하는 것이 중요합니다. JSON-LD가 RDF 데이터 모델과 어떻게 연관되는지에 대한 정확한 세부사항은 § 10. RDF와의 관계에서 제공됩니다.
RDF 모델에 익숙하지 않은 개발자의 이해를 돕기 위해, 다음 요약을 제공합니다:
#) 사용을 고려하십시오.
{
"@id": "http://example.org/1"
}
_:로 시작합니다.
xsd:string인 타입된 값으로 해석됨), 숫자(소수 부분이 0이 아닌 수 또는 정수로 표현하기에는 너무 큰 수는 xsd:double로
해석되고, 그 외는 xsd:integer로 해석됨), true 또는 false(이는
xsd:boolean 타입으로 해석됨), 또는 언어 태그가 있는 문자열로 해석됩니다.
JSON-LD 문서는 위에서 정의한 데이터 모델로 표현할 수 없는 데이터를 포함할 수 있습니다(MAY).
달리 명시되지 않는 한, 그러한 데이터는 JSON-LD 문서가 처리될 때 무시됩니다. 이 규칙의 결과 중 하나는 @context에 매핑되지 않는 속성들이 IRI,
blank node, 또는 키워드로 매핑되지 않으면 무시된다는 것입니다.
또한 JSON 직렬화 형식은 내부적으로 JSON-LD 내부 표현을 사용하여 표현되며, 이는 리스트, 맵, 문자열, 숫자, 불리언, null과 같은 일반적인 개념을 사용하여 JSON 문서로 표현된 데이터를 설명합니다.
이 그림에서 설명된 데이터셋은 다음과 같이 표현될 수 있습니다:
외부 수준에서 세 개의 최상위 리소스(그중 두 개는 이름이 있는 그래프)를 설명하기 위해
@graph를 사용한 점에 주목하십시오.
이름이 있는 그래프는 각각의 그래프 이름을 제공하기 위해 @id와 함께 @graph를 사용합니다.
이 절은 이전 절들에서 설명한 구문 규칙을 보다 형식적으로 재진술합니다.
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의 대체로 정당하게 사용될
수 있습니다. 단, 키워드 별칭은 컨텍스트 처리 중에 확장되지 않는다는 점에 유의하십시오.
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를 참조하여 terms를 IRIs로 매핑하는 방법에 대해 살펴보십시오.
노드 객체는 노드의 하나 이상 속성을 그래프에 직렬화된 형태로 나타냅니다. 맵은 다음 조건을 만족할 때 노드 객체로 간주됩니다:
@graph 및 @context 외의 다른 엔트리를 포함하지 않는 경우가 아닐 것,@value, @list, 또는 @set 키워드를 포함하지 않을 것,문서 내에서 한 노드의 속성들은 서로 다른 노드 객체들에 걸쳐 분산될 수 있습니다. 이 경우 서로 다른 노드 객체들의 키를 병합하여 결과 노드의 속성을 만들어야 합니다.
노드 객체는 반드시 맵이어야 합니다(MUST). 활성 컨텍스트에서 유효한 terms 또는 compact IRIs, 또는 IRIs가 아닌 모든 키는 다음의 키워드(또는 그 별칭)가 아닌 한 처리 시 무시되어야 합니다(MUST):
@context,@id,@included,@graph,@nest,@type,@reverse,@index만약 노드 객체에 @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):
프레이밍(framing)을 할 때, 프레임 객체는 프레이밍에 특화된 엔트리들을 허용하기 위해 노드 객체를 확장합니다.
@default의 값은 @null 또는 오직 @null만 포함한 배열을 포함하여, IRI로 확장되는 일반적인
엔트리 값들 외에도 허용될 수 있습니다.
@id와 @type의 값은 또한 빈 맵(와일드카드), 빈 맵만을 포함하는 배열, 빈 배열(매치 없음), 또는 IRI들의 배열일 수
있습니다(MAY).@embed 키를 포함할 수 있으며 그 값은 @always, @once, 또는
@never 중 하나일 수 있습니다(MAY).
@explicit, @omitDefault, 또는 @requireAll 같은 불리언 값의
엔트리를 포함할 수 있습니다(MAY).프레임 객체의 사용 방법에 대해서는 [JSON-LD11-FRAMING]를 참조하십시오.
그래프 객체는 이름이 있는 그래프(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를 참조하십시오.
한 value object는 값에 명시적으로 타입이나 언어를 연결하여 typed value나 language-tagged string을 생성하고, 경우에 따라 base direction을 연결하는 데 사용됩니다.
한 value object는 MUST 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 또는 object일 MAY 있습니다.
@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에 대한 추가 정보를 확인하십시오.
프레이밍을 할 때, 값 패턴은 값 객체를 확장하여 프레이밍에 특화된 엔트리들을 허용합니다.
@value, @language, @direction 및
@type의 값은 추가로 빈 맵(와일드카드), 빈 맵만 포함한 배열, 빈 배열(매치 없음), 또는 문자열들의 배열일 수 있습니다(MAY).
리스트는 순서가 있는 값들의
집합을 나타내며, 셋은 순서가 없는 값들의 집합을 나타냅니다. 특별한 명시가 없는 한 JSON-LD에서 배열은 순서가 없다고 간주됩니다. 따라서 문서 본문에서 사용된 @set
키워드는 처리 시 최적화되어 사라지는 문법적 설탕(syntactic sugar)입니다. 그러나 문맥(context) 내에서 매우 유용합니다. @set 또는
@list 컨테이너와 연관된 용어의 값은 문서를 처리할 때 항상 배열 형태로 표현됩니다—비록 단일 값만 있더라도(압축된 문서 형태에서는 비배열 형태로 최적화될 수
있는 경우라도) 이는 후처리를 단순화하여 데이터가 항상 결정론적 형태로 유지되도록 합니다.
리스트 객체는 MUST 맵이어야 하며, @list와
@index 외에는 IRI나 키워드로 확장되는 키를 포함해서는 안 됩니다.
셋 객체는 MUST 맵이어야 하며, @set와
@index 외에는 IRI나 키워드로 확장되는 키를 포함해서는 안 됩니다. 처리 시 @index 키는 무시된다는 점에 유의하십시오.
@list 및 @set 키에 연결된 값은 반드시 다음 타입들 중 하나여야 합니다(MUST):
셋과 리스트에 관한 추가 논의는 § 4.3 Value Ordering을 참조하십시오。
언어 맵은 값에 언어를 연결하여 프로그램이 쉽게 접근할 수
있도록 하는 데 사용됩니다. 언어 맵은 노드 객체 내의
용어 값으로 사용될 수 있으며, 해당 용어가 @container를 @language로 정의했거나 @language와
@set를 포함하는 배열로 정의된 경우에 해당합니다。언어 맵의 키는 BCP47 언어 태그를 나타내는 문자열, 키워드 @none, 또는
@none로 확장되는 term 중 하나여야 하며(MUST), 값은 다음 타입 중 하나여야
합니다:
언어 맵에 관한 추가 설명은 § 4.2.4 String Internationalization을 참조하십시오。
인덱스 맵은 의미적 의미가 없는 키들이지만 보존되어야 하는 경우
JSON-LD 문서에서 사용할 수 있게 합니다. 인덱스 맵은 용어가 @container로 @index로 정의되었거나
@index와 @set를 포함하는 배열로 정의된 경우 노드 객체 내에서 용어 값으로 사용될 수 있습니다。인덱스 맵의 엔트리 값은 다음 타입 중 하나여야 합니다(MUST):
이 주제에 대한 추가 정보는 § 4.6.1 Data Indexing를 참조하십시오。
인덱스 맵은 또한 용어가 @container로 @graph와 @index를 모두 포함하는
배열(선택적으로 @set 포함)으로 정의된 경우 인덱스를 관련된 이름이 있는 그래프(named graphs)에 매핑하는 데 사용될 수 있습니다.
값은 인덱싱된 키를 사용하여 인덱스되는 이름 있는 그래프 내에 포함된 노드 객체들이며, 값에 @id가 포함되지 않으면 단순 그래프 객체로 표현될 수 있고,
@id가 포함되면 이름이 있는 그래프로 표현됩니다。
속성 기반의 인덱스 맵은 인덱스가 그래프 내에서 속성 값으로
의미론적으로 보존되는 인덱스 맵의 변형입니다.
속성 기반의 인덱스 맵은
용어가 @container를 @index로 설정했거나
@index와 @set를 모두 포함하는 배열로 설정되어 있고,
@index가 문자열로 설정된 경우
노드 객체 내의 용어 값으로 사용할 수 있습니다.
속성 기반 인덱스 맵의 값들은
반드시 노드 객체이거나,
문자열로서
노드 객체로 확장될 수 있어야 합니다.
확장(expanding)할 때,
활성 컨텍스트(active context)가
@index 값에 대한 용어
정의를 포함하고 있으면,
해당 용어 정의가
인덱스 맵(index map)의 키를 확장하는 데 사용됩니다.
그렇지 않으면, 키들은 간단한 값 객체로 확장됩니다.
인덱스 맵의 확장된 값들에 있는 각 노드 객체에는
추가적인 속성 값이 하나 더 추가되는데, 그 속성은 @index의 확장된 값이고,
그 값은 확장된 참조 키입니다.
이 주제에 관해 더 자세한 정보는 § 4.6.1.1 속성 기반 데이터 인덱싱을 참조하십시오.
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를 포함하는 경우,
인덱스를 그래프 이름에
매핑하는 데 사용될 수 있습니다. 이때 값은 참조 키로 이름이 지정된 이름이 있는 그래프 내에 포함된
노드 객체들로 구성됩니다.
type 맵은 IRI를
프로그램이 쉽게 접근할 수 있는 값에 연결하는 데 사용됩니다. type
맵은 용어가 @container를 @type로 설정했거나,
@type와 @set를 모두 포함하는 배열로 설정된 경우
노드 객체 내의 용어 값으로 사용할 수 있습니다.
type 맵의 키는
반드시 IRIs (IRI 참조 또는 compact IRI 포함, blank node identifier
포함),
terms, 또는 키워드 @none이어야 하며,
값들은 반드시 노드 객체이거나 문자열로서 노드 객체로 확장될 수 있어야 합니다.
값이 @type으로 확장되는 속성을 포함하고, 적절한 확장을 거친 참조 키와 값이 참조 키를 포함하는 경우에는
해당 노드 객체가 이미 그 타입을 포함하고 있는 것입니다.
그렇지 않으면, 확장 시 값에서 가져온 해당 속성이 그 노드
객체 값의 @type으로 추가됩니다.
포함 블록은 노드 객체들의 집합을 제공하는 데 사용됩니다.
포함 블록은 노드 객체의 멤버 값으로
@included 또는 @included의 별칭이 사용된 경우에 나타날 수 있습니다(MAY).
포함 블록은 단일 노드 객체이거나
노드 객체들의 배열입니다.
확장(expanding)할 때, 여러 포함 블록들은 단일 포함 블록으로 합쳐집니다.
중첩된 속성은 노드 객체의 속성들을 별도의 맵이나, 또는 맵들의 배열로 모으는 데 사용됩니다. 이러한 맵들은 값 객체가 되어서는 안 됩니다. 네스팅은 의미론적으로 투명하며, 확장 과정에서 제거됩니다. 속성 네스팅은 재귀적이며, 중첩된 속성들의 집합은 추가 네스팅을 포함할 수 있습니다.
의미론적으로, 네스팅은 해당 속성과 값들이 포함하는 노드 객체 내부에 직접 선언된 것처럼 처리됩니다.
컨텍스트 정의는 노드 객체에서의 로컬 컨텍스트를 정의합니다.
컨텍스트 정의는 반드시 맵이어야 하며,
그 키들은 반드시 용어, 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, 또는 확장된 용어 정의이어야 합니다.
확장된 용어 정의는 용어와 그 확장 식별자 간의 매핑과, 그 용어가 노드 객체의 키로 사용될 때 연관된 값의 기타 속성들을 설명하는 데 사용됩니다.
확장된 용어 정의는 반드시 맵이어야 하며, 다음 키들 중 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를 참조하십시오.
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이어야 합니다.
JSON-LD는 구체적 RDF 구문(concrete RDF syntax)으로, [RDF11-CONCEPTS]에 설명된 바와 같습니다. 따라서 JSON-LD 문서는 RDF 문서이자 JSON 문서이며, 그에 따라 RDF 데이터 모델의 인스턴스를 나타냅니다. 그러나 JSON-LD는 또한 RDF 데이터 모델을 확장하여 선택적으로 JSON-LD가 일반화된 RDF 데이터셋을 직렬화할 수 있도록 합니다. JSON-LD의 RDF 데이터 모델에 대한 확장들은 다음과 같습니다:
true와 false를 지원합니다. JSON-LD 1.1 처리 알고리즘 및 API 명세서([JSON-LD11-API])는 JSON의 네이티브 데이터 타입과
RDF 대응 타입 간의 변환 규칙을 정의하여 라운드 트리핑을
허용합니다.
속성 레이블에 blank node identifiers를 사용하는 것은 구식이며, 향후 JSON-LD 버전에서 제거될 수 있으며, 일반화된 RDF 데이터셋에 대한 지원도 마찬가지일 수 있습니다.
요약하면, 이러한 차이로 인해 JSON-LD는 모든 RDF 그래프 또는 데이터셋을 직렬화할 수 있으며, 대부분의 JSON-LD 문서는 RDF 1.1 Concepts에 설명된 대로 직접 RDF로 해석될 수 있지만 모든 문서가 그런 것은 아닙니다 ([RDF11-CONCEPTS]).
저자들은 속성에 blank node identifiers를 사용하지 않도록 강력히 권장합니다. 대신 다음 메커니즘 중 하나를 고려하십시오:
urn:example:1과 같은 URN(자세한 내용은 [URN] 참조), 또는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 콘텐츠 협상을 사용할 수 있게 합니다.
데이터셋과 그래프 양쪽 문법을 모두 지원하는 게시자는 주 데이터를 기본 그래프에 저장하도록 보장해야 하며, 이는 데이터셋을 지원하지 않는 소비자도 정보를 처리할 수 있게 합니다.
이 절은 비규범적입니다.
RDF를 JSON-LD로 직렬화하거나 JSON-LD를 RDF로 역직렬화하는 과정은 RDF 직렬화-역직렬화 알고리즘을 실행하는 것에 의존합니다. 이는 JSON-LD 1.1 처리 알고리즘 및 API 명세([JSON-LD11-API])에 정의되어 있습니다. 이 문서에서 이들 알고리즘을 더 자세히 설명하는 것은 범위를 벗어나지만, 과정을 설명하기 위해 필요한 작업의 요약을 제공합니다.
JSON-LD 문서를 RDF로 역직렬화하는 절차는 다음 단계를 포함합니다:
예를 들어, 다음은 압축된 형태의 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의 확장 및 평탄화 알고리즘을 실행하면 다음과 같은 출력이 생성됩니다:
[
{
"@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로 다음과 같이 표현할 수 있습니다:
@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 문서를 생성하도록, 공통 주어를 가진 모든 트리플에 대해 단일 노드 객체를 사용하고, 공통 술어를 가진 트리플들에 대해 단일 프로퍼티를 사용하는 방식으로 진행됩니다. 결과는 프레이밍 알고리즘을 사용하여 원하는 객체 임베딩을 생성하도록 프레임될 수 있습니다.
rdf:JSON 데이터형RDF는 JSON 콘텐츠를 가능한 리터럴 값으로 허용합니다.
이는 리터럴 값 안에 마크업을 포함할 수 있게 합니다.
이러한 콘텐츠는 데이터 그래프에서 데이터 타입이 rdf:JSON으로
설정된 리터럴을 사용해 표시됩니다.
rdf:JSON 데이터형은 다음과 같이 정의됩니다:
http://www.w3.org/1999/02/22-rdf-syntax-ns#JSON입니다.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).
xsd:string의 값 공간과 구분되어 간주됩니다.
JSON.parse에 의해 생성되는 내부 표현으로 파싱하여 ECMASCRIPT 표현과 일치하는 내부 표현을 얻습니다,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)을 참조하면 문자열에 대한 기본 방향 사용에 관한 자세한 정보를 얻을 수 있습니다.
rdf:CompoundLiteral 클래스 및 rdf:language,
rdf:direction 속성
이 절은 비규범적입니다.
이 명세는 rdf:value에 대한 동일한 주체에서 문자열 값을 연관시키기 위해 기본 방향과 선택적 언어 태그를 포함하는 RDF 리터럴 값을 기술하는 데 사용되는
rdf:CompoundLiteral 클래스를 정의합니다. 이 클래스는 rdf:language와
rdf:direction의 도메인으로 설정됩니다.
rdf:CompoundLiteralrdf:languagerdfs:Literal이며, 그 값은 잘-형성된 BCP47 언어 태그여야 합니다(MUST).
이 속성의 도메인(domain)은 rdf:CompoundLiteral입니다.rdf:directionrdfs: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)을 참조하면 문자열에 대한 기본 방향 사용에 관한 자세한 정보를 얻을 수 있습니다.
자세한 내용은 Security Considerations를 § C. IANA Considerations에서 참조하십시오.
이 명세의 향후 버전들은 캐시된 및 검색된 콘텐츠가 원격 서버에서 가져온 데이터와 일치하는지 확인하는 수단으로 서브리소스 무결성(Subresource Integrity, SRI)을 통합할 수 있습니다; 관련 논의는 issue 86를 참조하십시오.
외부 컨텍스트를 가져오는 것은 JSON-LD 프로세서의 동작을 노출시킬 수 있으며, 중간 노드가 검색된 리소스를 검사하여 클라이언트 애플리케이션을 지문(fingerprint)으로 식별할 수 있게 하고, 중간자 공격의 기회를 제공할 수 있습니다(참조: [fingerprinting-guidance] 참조). 이를 방지하기 위해 게시자는 원격 컨텍스트를 캐싱하여 향후 사용하거나, documentLoader를 사용하여 그러한 컨텍스트의 로컬 버전을 유지하는 것을 고려해야 합니다.
JSON-LD는 RDF 데이터 모델을 사용하므로, 좌->우 또는 우->좌 방향 지시자가 포함된 문자열인 JSON-LD 값을 올바르게 기록하는 능력에는 설계상 제한이 있습니다. JSON-LD와 RDF는 문자열에 연결된 언어를 지정하는 메커니즘(언어 태그 문자열)을 제공하지만, 문자열의 기본 방향을 나타내는 수단은 제공하지 않습니다.
유니코드는 문자열 내에서 방향을 신호하는 메커니즘을 제공합니다(참조: Unicode Bidirectional Algorithm [UAX9]). 그러나 문자열의 전체적인 기본 방향을 문자열 시작 부분으로부터 결정할 수 없을 때에는, 외부 지시기가 필요합니다. 예를 들어 HTML의 dir 속성처럼 말입니다. 현재 이 속성에는 RDF 리터럴에 대한 대응 수단이 없습니다.
RDF에서 기본 방향을 올바르게 표현하는 문제는 이 작업 그룹이 해결할 수 있는 범위가 아니며, 이는 핵심 RDF 데이터 모델의 제약입니다. 향후 RDF 작업 그룹이 이 문제를 검토하여 언어 태그가 있는 문자열의 기본 방향을 지정할 수 있는 기능을 추가할 것을 기대합니다.
향후 버전에서 더 포괄적인 해결책이 다뤄질 때까지, 게시자들은 문자열의 기본 방향을 문자열 내용만으로 올바르게 유추할 수 없는 경우 이 문제를 고려해야 합니다. 웹에서 사용되는 문자열에 대한 언어 및 기본 방향 식별의 모범 사례에 대해서는 [string-meta]를 참조하십시오.
이 절은 비규범적입니다.
이 절은 비규범적입니다.
이 절은 링크드 데이터 데이터셋 도표을 § 8. 데이터 모델에서 설명합니다.
이미지는 서로 다른 링크드 데이터 그래프를 설명하는 점선 상자 세 개로 구성되어 있습니다. 각 상자에는 링크드 데이터 관계를 설명하는 화살표로 연결된 도형들이 포함되어 있습니다.
첫 번째 상자는 제목이 "default graph: <no name>"이며 두 개의 리소스
http://example.com/people/alice와 http://example.com/people/bob
("Alice"와 "Bob"을 각각 나타냄)을 설명합니다. 이들 사이에는 schema:knows라는 레이블이 붙은 화살표로 연결되어 두 리소스 간의 knows
관계를 나타냅니다. 또한 "Alice" 리소스는 다음 세 가지 리터럴과 연관되어 있습니다:
두 번째 및 세 번째 상자는 각각 그래프 이름이 "http://example.com/graphs/1" 및 "http://example.com/graphs/1"인 두 개의 이름 있는 그래프을 설명합니다.
두 번째 상자는 두 개의 리소스
http://example.com/people/alice와 http://example.com/people/bob로 구성되며,
이들은 schema:parent 관계로 연결되어 있고 http://example.com/people/bob에 "Bob"이라는 이름을
부여합니다.
세 번째 상자는 두 개의 리소스로 구성되어 있는데, 하나는 이름이 http://example.com/people/bob이고 다른 하나는 이름이 없습니다.
이 두 리소스는 schema:sibling 관계로 서로 연결되어 있으며 두 번째 리소스는 "Mary"라는 이름을 갖습니다.
이 절은 비규범적입니다.
아래의 JSON-LD 예제들은 JSON-LD가 Turtle, RDFa, Microdata와 같은 다른 링크드 데이터 형식으로 표시된 의미적 데이터를 어떻게 표현할 수 있는지를 보여줍니다. 이 절들은 JSON-LD가 다양한 링크드 데이터 접근 방식 전반에서 무엇을 표현할 수 있는지에 대해 매우 유연하다는 근거로 제공됩니다.
이 절은 비규범적입니다.
다음은 [Turtle]로 표현된 RDF를 JSON-LD로 변환하는 예들입니다.
JSON-LD 컨텍스트는 Turtle의 @prefix 선언과 직접적으로 대응되는 항목을 가집니다:
@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/> .
{
"@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/" }
}
둘 다 [Turtle]와 JSON-LD는 임베딩을 허용하지만, Turtle은 blank nodes의 임베딩만 허용합니다.
@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" ] .
{
"@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"
}
}
JSON-LD에서 숫자와 불리언 값은 네이티브 데이터 타입입니다. [Turtle]는 이러한 값을 표현하는 축약 문법을 제공하지만, RDF의
추상 구문은 숫자와 불리언 값을 타입이 지정된 리터럴로 표현해야 합니다. 따라서 완전한 라운드 트리핑을 허용하기 위해 JSON-LD 1.1 처리 알고리즘 및 API
명세([JSON-LD11-API])는 JSON-LD의 네이티브
데이터 타입과 RDF의 대응 타입 간의 변환 규칙을 정의합니다. 분수 부분이 없는 숫자는
xsd:integer 타입 리터럴로, 분수 부분이 있는 숫자는 xsd:double 타입 리터럴로, 그리고 불리언 값
true와 false는 xsd:boolean 타입 리터럴로 변환됩니다. 모든 타입된 리터럴은 정규 렉시컬
형식입니다.
{
"@context": {
"ex": "http://example.com/vocab#"
},
"@id": "http://example.com/",
"ex:numbers": [ 14, 2.78 ],
"ex:booleans": [ true, false ]
}
@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 .
2.78이
xsd:decimal로 변환됩니다. 그 이유는 대부분의 JSON 도구가 분수 부분을 포함한 숫자를 부동 소수점으로 파싱하므로, RDF로 되돌릴 때
xsd:double이 가장 적절한 데이터 타입이기 때문입니다.
JSON-LD와 [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" ) .
{
"@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" ]
}
}
이 절은 비규범적입니다.
다음 예시는 RDFa [RDFA-CORE]로 세 사람의 이름과 홈페이지를 설명합니다.
<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 구현 예가 설명되어 있습니다.
이 절은 비규범적입니다.
아래의 HTML Microdata [MICRODATA] 예시는 책 정보를 Microdata Work 항목으로 표현합니다.
<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 커뮤니티의 의도를 그대로 따릅니다.
[
{
"@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"}
}
]
이 절은 IANA 등록을 위해 Internet Engineering Steering Group (IESG)에 제출되었습니다.
profileJSON-LD 문서에 적용되는 특정 제약이나 관례를 식별하는 공백으로 구분된 URI의 비어 있지 않은 목록입니다([RFC6906]). 프로필은 프로필 지식 없이 처리할 때
리소스 표현의 의미를 변경하지 않으므로, 프로필을 알고 있는 클라이언트와 모르는 클라이언트가 동일한 표현을 안전하게 사용할 수 있습니다.
profile 매개변수는 콘텐츠 협상 과정에서 클라이언트가 선호도를 표현하는 데 사용될 수 있습니다(MAY). 프로필 매개변수가 주어지면 서버는 인식하는 목록의 프로필을 준수하는 문서를 반환하는 것이 바람직합니다(SHOULD), 인식하지 못하는 프로필은 무시해야 합니다(MUST). 프로필 URI는 역참조 가능하고 해당 URI에서 유용한 문서를 제공하는 것이 권장됩니다. 배경과 자세한 내용은
[RFC6906]를 참조하십시오.
이 명세는 profile 매개변수에 대한 여섯 가지 값을 정의합니다.
http://www.w3.org/ns/json-ld#expandedhttp://www.w3.org/ns/json-ld#compactedhttp://www.w3.org/ns/json-ld#contexthttp://www.w3.org/ns/json-ld#flattenedhttp://www.w3.org/ns/json-ld#framehttp://www.w3.org/ns/json-ld#framedhttp://www.w3.org/ns/json-ld로 시작하는 다른 모든 URI는 JSON-LD 명세에 의해 향후 사용을 위해 예약됩니다.
다른 명세들은 자체 의미를 정의하는 추가적인 profile 매개변수 URI를 게시할 수 있습니다. 여기에는 파일 확장자를
profile 매개변수와 연관시키는 기능이 포함될 수 있습니다.
미디어 타입 매개변수로 사용될 때([RFC4288]),
HTTP Accept 헤더에서의
profile 값은 공백 같은 특수 문자를 포함하는 경우 따옴표(")로 둘러싸여야 합니다(MUST), 특히 여러 프로필 URI가 결합될 때 필요합니다.
프로필 미디어 타입 매개변수를 처리할 때, 그 값이 IRI가 아니라 하나 이상의 URI를 포함한다는 점을 주의해야 합니다. 경우에 따라 IRI와 URI 간 변환이 필요할 수 있으며, 이는 RFC3986의 관련 절을 따릅니다.
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를 구성할 수 있습니다.
application/ld+json와 함께 사용되는 프래그먼트 식별자는 RDF 문법에서와 같이 처리되며, 이는 RDF 1.1 Concepts and Abstract Syntax에 따릅니다 [RDF11-CONCEPTS].
이 등록은 [JSON-LD10]에 있는 application/ld+json의 원래 정의에 대한 업데이트입니다.
이 절은 비규범적입니다.
다음 예시는 프로필 매개변수가 서로 다른 허용 가능한 응답을 설명하는 데 어떻게 사용될 수 있는지에 대한 다양한 방식을 보여줍니다.
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로 반환하도록 요청합니다.
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로 반환하도록 요청합니다. 명시적 컨텍스트 리소스가 지정되지 않았으므로 서버는 애플리케이션 특유의 기본 컨텍스트를 사용하여 압축합니다.
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가 공백으로 구분되어 있으므로 큰따옴표(")로 묶여 있음을 주의하십시오.
이 절은 비규범적입니다.
다음은 발행 시점에 열려 있던 이슈들의 목록입니다.
메타데이터가 포함된 참조에 의한 컨텍스트를 고려하십시오.
비단순(prefix가 아닌) 접두어 term 정의에 대한 Compact IRI 확장 지원.
language-maps가 별도의 기본 방향을 허용하지 않습니다.
@context 내 @default defer-future-version
@context 내의 @default에 관한 문제.
@prefix에 대한 제안 defer-future-version
@prefix에 대한 제안.
@coerce 키워드 또는 유사 기능 defer-future-version
타입 강제 변환 / 노드 변환: @coerce 키워드 또는 유사한 기능.
이 절은 비규범적입니다.
@version 엔트리를 포함할 수 있으며, 이는 처리 모드(processing mode)를 설정하는 데 사용됩니다.@context 속성을 가질 수 있습니다.
@container 값은 확장된 용어 정의 내에서 이제
@id, @graph 및 @type를 포함할 수 있으며, 이는 id 맵 및 type 맵에 대응합니다.
@nest 속성을 가질 수 있으며, 이는 동일한 @nest 매핑을 사용하여 속성을 포함하는 용어를 식별합니다.
확장 시, @nest로 확장되는 속성의 값들은 마치 둘러싼 노드 객체 내부에 직접 포함된 것처럼 처리됩니다.
@none 키를 가질 수 있게 되었으며,
이는 이전 JSON-LD 1.0이 문자열 키만 허용하던 것을 업데이트한 것입니다.
@container 값은 이제 적절한 컨테이너 키워드를 포함하고 @set를 함께 포함하는 배열일 수 있습니다(단 @list 제외). 이는 해당 속성 값들이 항상
배열 형태로 표현되도록 보장하는 방법을 제공합니다.@prefix가 true로 설정된 경우에만 적용됩니다. 1.0 알고리즘은 값이 URI의 gen-delim 문자로 끝나는 용어만 고려하도록
업데이트되었습니다.
@container가 @graph로 설정된 용어 정의를 가진 속성의 값은 암묵적 이름 지정된 그래프로 해석되며, 해당 그래프 이름은 새로
할당되는 blank node identifier에서
가져옵니다. 다른 조합으로는 ["@container","@id"], ["@container","@index"] 등이 있으며, 각 경우
선택적으로 @set를 포함할 수 있어 인덱스 또는 id 값으로부터 맵을 생성합니다(이는 index maps 및 id maps와 유사합니다).또한 § F. JSON-LD Community Group 최종 보고서 이후의 변경사항를 참조하십시오.
이 절은 비규범적입니다.
@type 또는 @type의 별칭 값을 가진 항목은 이제 그 @container를 @set로
설정하여 @type 엔트리가 항상 배열로 표현되도록 할 수 있습니다. 이는 또한 @type에 대한 용어를 정의할 수 있게 하며, 그 값은
@container가 @set로 설정된 맵이어야 합니다.
"@type": "@none" 지원이 추가되어 값 압축을 방지할 수 있으며, rdf:JSON 데이터형이 정의되었습니다.application/ld+json;profile=http://www.w3.org/ns/json-ld#frame 형식으로 식별될 수 있습니다.
@propagate 엔트리로 제어할 수
있습니다.@import 엔트리를 포함하여 컨텍스트 내부에서 원격 컨텍스트를 참조할 수 있게 되었으며, 이를 통해 JSON-LD 1.0 용으로 작성된 컨텍스트에
JSON-LD 1.1 기능을 추가할 수 있습니다.@direction을 지원하도록 업데이트되었습니다.json-ld-1.0으로 설정되지 않는 한 기본적으로 json-ld-1.1입니다."@"1*ALPHA 형태의 용어에 대한 전향 호환성 문제에 대해 경고합니다.i18n 데이터형 또는 rdf:CompoundLiteral을 생성할 때 상호 운용성 향상을 위해 언어 태그는 소문자로 정규화됩니다.이 절은 비규범적입니다.
"@prefix": false가 compact IRI 동작에 미치는 영향(확장 및 압축 모두)을 설명했습니다.@index 키워드에 대한 누락된 규범적 정의를 추가했습니다(§ 9.15.1 Expanded term definition).이 절은 비규범적입니다.
@embed 키워드의 규범적 설명과 일치하지 않게 의도치 않게 벗어난 오타를 수정했습니다(이는 Issue 358에 대한
응답입니다).이 절은 비규범적입니다.
편집자들은 이 명세의 작성 및 편집에 중요한 기여를 해 준 다음 개인들에게 특별히 감사드립니다:
또한, 발행 시점에 워킹 그룹의 구성원이었던 다음 사람들에게도 감사드립니다:
많은 감사는 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.