--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/spec/CR/json-ld-api/20130822/diff-20130516.html Tue Aug 13 18:54:07 2013 +0200
@@ -0,0 +1,36417 @@
+<!DOCTYPE html>
+<html lang="en" dir="ltr" prefix="bibo: http://purl.org/ontology/bibo/" typeof="bibo:Document">
+<head>
+<title>JSON-LD 1.0 Processing Algorithms and API</title>
+<meta http-equiv="content-type" content="text/html; charset=UTF-8">
+<style type="text/css">
+ .diff {
+ font-weight:bold; color:#0a3;
+ }
+ .error a {
+ color: #ff4500;
+ border-bottom: 1px dotted #ff4500;
+ text-decoration: none;
+ }
+ .atrisk-head {
+ font-style: italic;
+ }
+ ol.algorithm {
+ counter-reset: numsection;
+ list-style-type: none;
+ }
+ ol.algorithm li {
+ margin: 0.5em 0;
+ }
+ ol.algorithm li:before {
+ font-weight: bold;
+ counter-increment: numsection;
+ content: counters(numsection, ".") ") ";
+ }
+</style>
+<style>/
+/* --- INLINES --- */
+em.rfc2119 {
+ text-transform: lowercase;
+ font-variant: small-caps;
+ font-style: normal;
+ color: #900;
+}
+
+h1 acronym, h2 acronym, h3 acronym, h4 acronym, h5 acronym, h6 acronym, a acronym,
+h1 abbr, h2 abbr, h3 abbr, h4 abbr, h5 abbr, h6 abbr, a abbr {
+ border: none;
+}
+
+dfn {
+ font-weight: bold;
+}
+
+a.internalDFN {
+ color: inherit;
+ border-bottom: 1px solid #99c;
+ text-decoration: none;
+}
+
+a.externalDFN {
+ color: inherit;
+ border-bottom: 1px dotted #ccc;
+ text-decoration: none;
+}
+
+a.bibref {
+ text-decoration: none;
+}
+
+cite .bibref {
+ font-style: normal;
+}
+
+code {
+ color: #ff4500;
+}
+
+/* --- TOC --- */
+.toc a, .tof a {
+ text-decoration: none;
+}
+
+a .secno, a .figno {
+ color: #000;
+}
+
+ul.tof, ol.tof {
+ list-style: none outside none;
+}
+
+.caption {
+ margin-top: 0.5em;
+ font-style: italic;
+}
+
+/* --- TABLE --- */
+table.simple {
+ border-spacing: 0;
+ border-collapse: collapse;
+ border-bottom: 3px solid #005a9c;
+}
+
+.simple th {
+ background: #005a9c;
+ color: #fff;
+ padding: 3px 5px;
+ text-align: left;
+}
+
+.simple th[scope="row"] {
+ background: inherit;
+ color: inherit;
+ border-top: 1px solid #ddd;
+}
+
+.simple td {
+ padding: 3px 10px;
+ border-top: 1px solid #ddd;
+}
+
+.simple tr:nth-child(even) {
+ background: #f0f6ff;
+}
+
+/* --- DL --- */
+.section dd > p:first-child {
+ margin-top: 0;
+}
+
+.section dd > p:last-child {
+ margin-bottom: 0;
+}
+
+.section dd {
+ margin-bottom: 1em;
+}
+
+.section dl.attrs dd, .section dl.eldef dd {
+ margin-bottom: 0;
+}
+</style><style>/* --- EXAMPLES --- */
+div.example-title {
+ min-width: 7.5em;
+ color: #b9ab2d;
+}
+div.example-title span {
+ text-transform: uppercase;
+}
+aside.example, div.example, div.illegal-example {
+ padding: 0.5em;
+ margin: 1em 0;
+ position: relative;
+ clear: both;
+}
+div.illegal-example { color: red }
+div.illegal-example p { color: black }
+aside.example, div.example {
+ padding: .5em;
+ border-left-width: .5em;
+ border-left-style: solid;
+ border-color: #e0cb52;
+ background: #fcfaee;
+}
+
+aside.example div.example {
+ border-left-width: .1em;
+ border-color: #999;
+ background: #fff;
+}
+aside.example div.example div.example-title {
+ color: #999;
+}
+</style><style>/* --- ISSUES/NOTES --- */
+div.issue-title, div.note-title {
+ padding-right: 1em;
+ min-width: 7.5em;
+ color: #b9ab2d;
+}
+div.issue-title { color: #e05252; }
+div.note-title { color: #2b2; }
+div.issue-title span, div.note-title span {
+ text-transform: uppercase;
+}
+div.note, div.issue {
+ margin-top: 1em;
+ margin-bottom: 1em;
+}
+.note > p:first-child, .issue > p:first-child { margin-top: 0 }
+.issue, .note {
+ padding: .5em;
+ border-left-width: .5em;
+ border-left-style: solid;
+}
+div.issue, div.note {
+ padding: 1em 1.2em 0.5em;
+ margin: 1em 0;
+ position: relative;
+ clear: both;
+}
+span.note, span.issue { padding: .1em .5em .15em; }
+
+.issue {
+ border-color: #e05252;
+ background: #fbe9e9;
+}
+.note {
+ border-color: #52e052;
+ background: #e9fbe9;
+}
+
+
+</style><style>/* --- WEB IDL --- */
+pre.idl {
+ border-top: 1px solid #90b8de;
+ border-bottom: 1px solid #90b8de;
+ padding: 1em;
+ line-height: 120%;
+}
+
+pre.idl::before {
+ content: "WebIDL";
+ display: block;
+ width: 150px;
+ background: #90b8de;
+ color: #fff;
+ font-family: initial;
+ padding: 3px;
+ font-weight: bold;
+ margin: -1em 0 1em -1em;
+}
+
+.idlType {
+ color: #ff4500;
+ font-weight: bold;
+ text-decoration: none;
+}
+
+/*.idlModule*/
+/*.idlModuleID*/
+/*.idlInterface*/
+.idlInterfaceID, .idlDictionaryID, .idlCallbackID, .idlEnumID {
+ font-weight: bold;
+ color: #005a9c;
+}
+a.idlEnumItem {
+ color: #000;
+ border-bottom: 1px dotted #ccc;
+ text-decoration: none;
+}
+
+.idlSuperclass {
+ font-style: italic;
+ color: #005a9c;
+}
+
+/*.idlAttribute*/
+.idlAttrType, .idlFieldType, .idlMemberType {
+ color: #005a9c;
+}
+.idlAttrName, .idlFieldName, .idlMemberName {
+ color: #ff4500;
+}
+.idlAttrName a, .idlFieldName a, .idlMemberName a {
+ color: #ff4500;
+ border-bottom: 1px dotted #ff4500;
+ text-decoration: none;
+}
+
+/*.idlMethod*/
+.idlMethType, .idlCallbackType {
+ color: #005a9c;
+}
+.idlMethName {
+ color: #ff4500;
+}
+.idlMethName a {
+ color: #ff4500;
+ border-bottom: 1px dotted #ff4500;
+ text-decoration: none;
+}
+
+/*.idlCtor*/
+.idlCtorName {
+ color: #ff4500;
+}
+.idlCtorName a {
+ color: #ff4500;
+ border-bottom: 1px dotted #ff4500;
+ text-decoration: none;
+}
+
+/*.idlParam*/
+.idlParamType {
+ color: #005a9c;
+}
+.idlParamName, .idlDefaultValue {
+ font-style: italic;
+}
+
+.extAttr {
+ color: #666;
+}
+
+/*.idlSectionComment*/
+.idlSectionComment {
+ color: gray;
+}
+
+/*.idlConst*/
+.idlConstType {
+ color: #005a9c;
+}
+.idlConstName {
+ color: #ff4500;
+}
+.idlConstName a {
+ color: #ff4500;
+ border-bottom: 1px dotted #ff4500;
+ text-decoration: none;
+}
+
+/*.idlException*/
+.idlExceptionID {
+ font-weight: bold;
+ color: #c00;
+}
+
+.idlTypedefID, .idlTypedefType {
+ color: #005a9c;
+}
+
+.idlRaises, .idlRaises a.idlType, .idlRaises a.idlType code, .excName a, .excName a code {
+ color: #c00;
+ font-weight: normal;
+}
+
+.excName a {
+ font-family: monospace;
+}
+
+.idlRaises a.idlType, .excName a.idlType {
+ border-bottom: 1px dotted #c00;
+}
+
+.excGetSetTrue, .excGetSetFalse, .prmNullTrue, .prmNullFalse, .prmOptTrue, .prmOptFalse {
+ width: 45px;
+ text-align: center;
+}
+.excGetSetTrue, .prmNullTrue, .prmOptTrue { color: #0c0; }
+.excGetSetFalse, .prmNullFalse, .prmOptFalse { color: #c00; }
+
+.idlImplements a {
+ font-weight: bold;
+}
+
+dl.attributes, dl.methods, dl.constants, dl.constructors, dl.fields, dl.dictionary-members {
+ margin-left: 2em;
+}
+
+.attributes dt, .methods dt, .constants dt, .constructors dt, .fields dt, .dictionary-members dt {
+ font-weight: normal;
+}
+
+.attributes dt code, .methods dt code, .constants dt code, .constructors dt code, .fields dt code, .dictionary-members dt code {
+ font-weight: bold;
+ color: #000;
+ font-family: monospace;
+}
+
+.attributes dt code, .fields dt code, .dictionary-members dt code {
+ background: #ffffd2;
+}
+
+.attributes dt .idlAttrType code, .fields dt .idlFieldType code, .dictionary-members dt .idlMemberType code {
+ color: #005a9c;
+ background: transparent;
+ font-family: inherit;
+ font-weight: normal;
+ font-style: italic;
+}
+
+.methods dt code {
+ background: #d9e6f8;
+}
+
+.constants dt code {
+ background: #ddffd2;
+}
+
+.constructors dt code {
+ background: #cfc;
+}
+
+.attributes dd, .methods dd, .constants dd, .constructors dd, .fields dd, .dictionary-members dd {
+ margin-bottom: 1em;
+}
+
+table.parameters, table.exceptions {
+ border-spacing: 0;
+ border-collapse: collapse;
+ margin: 0.5em 0;
+ width: 100%;
+}
+table.parameters { border-bottom: 1px solid #90b8de; }
+table.exceptions { border-bottom: 1px solid #deb890; }
+
+.parameters th, .exceptions th {
+ color: #fff;
+ padding: 3px 5px;
+ text-align: left;
+ font-family: initial;
+ font-weight: normal;
+ text-shadow: #666 1px 1px 0;
+}
+.parameters th { background: #90b8de; }
+.exceptions th { background: #deb890; }
+
+.parameters td, .exceptions td {
+ padding: 3px 10px;
+ border-top: 1px solid #ddd;
+ vertical-align: top;
+}
+
+.parameters tr:first-child td, .exceptions tr:first-child td {
+ border-top: none;
+}
+
+.parameters td.prmName, .exceptions td.excName, .exceptions td.excCodeName {
+ width: 100px;
+}
+
+.parameters td.prmType {
+ width: 120px;
+}
+
+table.exceptions table {
+ border-spacing: 0;
+ border-collapse: collapse;
+ width: 100%;
+}
+</style><link rel="stylesheet" href="https://www.w3.org/StyleSheets/TR/W3C-CR"><!--[if lt IE 9]><script src='https://www.w3.org/2008/site/js/html5shiv.js'></script><![endif]--><style type='text/css'>
+.diff-old-a {
+ font-size: smaller;
+ color: red;
+}
+
+.diff-new { background-color: yellow; }
+.diff-chg { background-color: lime; }
+.diff-new:before,
+.diff-new:after
+ { content: "\2191" }
+.diff-chg:before, .diff-chg:after
+ { content: "\2195" }
+.diff-old { text-decoration: line-through; background-color: #FBB; }
+.diff-old:before,
+.diff-old:after
+ { content: "\2193" }
+:focus { border: thin red solid}
+</style>
+</head>
+
+
+<body class="h-entry">
+<div class="head">
+<p>
+<a href="http://www.w3.org/">
+<img width="72" height="48" src="https://www.w3.org/Icons/w3c_home" alt="W3C">
+</a>
+</p>
+<h1 class="title p-name" id="title">
+JSON-LD
+1.0
+Processing
+Algorithms
+and
+API
+</h1>
+<h2 id="w3c-candidate-recommendation-22-august-2013">
+<abbr title="World Wide Web Consortium">
+W3C
+</abbr>
+<del class="diff-old">Last
+Call
+Working
+Draft
+16
+May
+</del>
+<ins class="diff-chg">Candidate
+Recommendation
+</ins><time class="dt-published" datetime="2013-08-22"><ins class="diff-chg">
+22
+August
+</ins>
+2013
+</time>
+</h2>
+<dl>
+<dt>
+This
+version:
+</dt>
+<dd>
+<del class="diff-old">http://www.w3.org/TR/2013/WD-json-ld-api-20130516/
+</del>
+<a class="u-url" href="http://www.w3.org/TR/2013/CR-json-ld-api-20130822/">
+<ins class="diff-chg">http://www.w3.org/TR/2013/CR-json-ld-api-20130822/
+</ins>
+</a>
+</dd>
+<dt>
+Latest
+published
+version:
+</dt>
+<dd>
+<a href="http://www.w3.org/TR/json-ld-api/">
+http://www.w3.org/TR/json-ld-api/
+</a>
+</dd>
+<dt>
+Latest
+editor's
+draft:
+</dt>
+<dd>
+<a href="http://json-ld.org/spec/latest/json-ld-api/index.html">
+http://json-ld.org/spec/latest/json-ld-api/index.html
+</a>
+</dd>
+<dt>
+Test
+suite:
+</dt>
+<dd>
+<a href="http://www.w3.org/2013/json-ld-tests/">
+http://www.w3.org/2013/json-ld-tests/
+</a>
+</dd>
+<dt>
+Previous
+version:
+</dt>
+<dd>
+<del class="diff-old">http://www.w3.org/TR/2013/WD-json-ld-api-20130411/
+</del>
+<a href="http://www.w3.org/TR/2013/WD-json-ld-api-20130516/">
+<ins class="diff-chg">http://www.w3.org/TR/2013/WD-json-ld-api-20130516/
+</ins>
+</a>
+</dd>
+<dt>
+Editors:
+</dt>
+<dd rel="bibo:editor" inlist="">
+<span typeof="foaf:Person">
+<a rel="foaf:homepage" property="foaf:name" content="Markus Lanthaler" href="http://www.markus-lanthaler.com/">
+Markus
+Lanthaler
+</a>,
+<a rel="foaf:workplaceHomepage" class="p-org org h-org h-card" href="http://www.tugraz.at/">
+Graz
+University
+of
+Technology
+</a>
+</span>
+</dd>
+<dd rel="bibo:editor" inlist="">
+<span typeof="foaf:Person">
+<a rel="foaf:homepage" property="foaf:name" content="Gregg Kellogg" href="http://greggkellogg.net/">
+Gregg
+Kellogg
+</a>,
+<a rel="foaf:workplaceHomepage" class="p-org org h-org h-card" href="http://kellogg-assoc.com/">
+Kellogg
+Associates
+</a>
+</span>
+</dd>
+<dd rel="bibo:editor" inlist="">
+<span typeof="foaf:Person">
+<a rel="foaf:homepage" property="foaf:name" content="Manu Sporny" href="http://manu.sporny.org/">
+Manu
+Sporny
+</a>,
+<a rel="foaf:workplaceHomepage" class="p-org org h-org h-card" href="http://digitalbazaar.com/">
+Digital
+Bazaar
+</a>
+</span>
+</dd>
+<dt>
+Authors:
+</dt>
+<dd rel="dcterms:contributor">
+<span typeof="foaf:Person">
+<a rel="foaf:homepage" property="foaf:name" content="Dave Longley" href="http://digitalbazaar.com/">
+Dave
+Longley
+</a>,
+<a rel="foaf:workplaceHomepage" class="p-org org h-org h-card" href="http://digitalbazaar.com/">
+Digital
+Bazaar
+</a>
+</span>
+</dd>
+<dd rel="dcterms:contributor">
+<span typeof="foaf:Person">
+<a rel="foaf:homepage" property="foaf:name" content="Gregg Kellogg" href="http://greggkellogg.net/">
+Gregg
+Kellogg
+</a>,
+<a rel="foaf:workplaceHomepage" class="p-org org h-org h-card" href="http://kellogg-assoc.com/">
+Kellogg
+Associates
+</a>
+</span>
+</dd>
+<dd rel="dcterms:contributor">
+<span typeof="foaf:Person">
+<a rel="foaf:homepage" property="foaf:name" content="Markus Lanthaler" href="http://www.markus-lanthaler.com/">
+Markus
+Lanthaler
+</a>,
+<a rel="foaf:workplaceHomepage" class="p-org org h-org h-card" href="http://www.tugraz.at/">
+Graz
+University
+of
+Technology
+</a>
+</span>
+</dd>
+<dd rel="dcterms:contributor">
+<span typeof="foaf:Person">
+<a rel="foaf:homepage" property="foaf:name" content="Manu Sporny" href="http://digitalbazaar.com/">
+Manu
+Sporny
+</a>,
+<a rel="foaf:workplaceHomepage" class="p-org org h-org h-card" href="http://digitalbazaar.com/">
+Digital
+Bazaar
+</a>
+</span>
+</dd>
+</dl>
+<p>
+This
+document
+is
+also
+available
+in
+this
+non-normative
+format:
+<a rel="alternate" href="diff-20130516.html">
+diff
+to
+previous
+version
+</a>
+</p>
+<p class="copyright">
+<a href="http://www.w3.org/Consortium/Legal/ipr-notice#Copyright">
+Copyright
+</a>
+©
+2010-2013
+<a href="http://www.w3.org/">
+<abbr title="World Wide Web Consortium">
+W3C
+</abbr>
+</a>
+<sup>
+®
+</sup>
+(
+<a href="http://www.csail.mit.edu/">
+<abbr title="Massachusetts Institute of Technology">
+MIT
+</abbr>
+</a>,
+<a href="http://www.ercim.eu/">
+<abbr title="European Research Consortium for Informatics and Mathematics">
+ERCIM
+</abbr>
+</a>,
+<a href="http://www.keio.ac.jp/">
+Keio
+</a>,
+<a href="http://ev.buaa.edu.cn/">
+Beihang
+</a>
+),
+All
+Rights
+Reserved.
+<abbr title="World Wide Web Consortium">
+W3C
+</abbr>
+<a href="http://www.w3.org/Consortium/Legal/ipr-notice#Legal_Disclaimer">
+liability
+</a>,
+<a href="http://www.w3.org/Consortium/Legal/ipr-notice#W3C_Trademarks">
+trademark
+</a>
+and
+<a href="http://www.w3.org/Consortium/Legal/copyright-documents">
+document
+use
+</a>
+rules
+apply.
+</p>
+<hr>
+</div>
+<section id="abstract" class="introductory" property="dcterms:abstract" datatype="" typeof="bibo:Chapter" resource="#abstract" rel="bibo:chapter">
+<h2>
+Abstract
+</h2>
+<p>
+This
+specification
+defines
+an
+Application
+Programming
+Interface
+(API)
+and
+a
+set
+of
+algorithms
+for
+programmatic
+transformations
+of
+JSON-LD
+documents.
+Restructuring
+data
+according
+<ins class="diff-new">to
+</ins>
+the
+defined
+transformations
+often
+dramatically
+simplifies
+its
+usage.
+</p>
+</section>
+<section id="sotd" class="introductory" typeof="bibo:Chapter" resource="#sotd" rel="bibo:chapter">
+<h2>
+Status
+of
+This
+Document
+</h2>
+<p>
+<em>
+This
+section
+describes
+the
+status
+of
+this
+document
+at
+the
+time
+of
+its
+publication.
+Other
+documents
+may
+supersede
+this
+document.
+A
+list
+of
+current
+<abbr title="World Wide Web Consortium">
+W3C
+</abbr>
+publications
+and
+the
+latest
+revision
+of
+this
+technical
+report
+can
+be
+found
+in
+the
+<a href="http://www.w3.org/TR/">
+<abbr title="World Wide Web Consortium">
+W3C
+</abbr>
+technical
+reports
+index
+</a>
+at
+http://www.w3.org/TR/.
+</em>
+</p>
+<p>
+This
+document
+has
+been
+under
+development
+for
+over
+<del class="diff-old">34
+</del>
+<ins class="diff-chg">30
+</ins>
+months
+in
+the
+JSON
+for
+Linking
+Data
+Community
+Group.
+The
+document
+has
+recently
+been
+transferred
+to
+the
+RDF
+Working
+Group
+for
+review,
+improvement,
+and
+publication
+along
+the
+Recommendation
+track.
+The
+specification
+has
+undergone
+significant
+development,
+review,
+and
+changes
+during
+the
+course
+of
+the
+last
+<del class="diff-old">34
+</del>
+<ins class="diff-chg">30
+</ins>
+months.
+</p>
+<p>
+There
+are
+several
+independent
+<a href="http://json-ld.org/#impl">
+interoperable
+implementations
+</a>
+of
+this
+specification.
+There
+is
+a
+fairly
+complete
+test
+suite
+[
+<cite>
+<a class="bibref" href="#bib-JSON-LD-TESTS">
+JSON-LD-TESTS
+</a>
+</cite>
+]
+and
+a
+<a href="http://json-ld.org/playground/">
+live
+JSON-LD
+editor
+</a>
+that
+is
+capable
+of
+demonstrating
+the
+features
+described
+in
+this
+document.
+While
+there
+will
+be
+continuous
+development
+on
+implementations,
+the
+test
+suite,
+and
+the
+live
+editor,
+they
+are
+believed
+to
+be
+mature
+enough
+to
+be
+integrated
+into
+a
+non-production
+system
+at
+this
+point
+in
+time.
+There
+is
+an
+expectation
+that
+they
+could
+be
+used
+in
+a
+production
+system
+within
+the
+next
+three
+months.
+</p>
+<p>
+<del class="diff-old">There
+are
+a
+number
+of
+ways
+that
+one
+may
+participate
+in
+the
+development
+of
+this
+specification:
+If
+you
+want
+to
+make
+sure
+that
+your
+feedback
+is
+formally
+addressed
+by
+the
+RDF
+Working
+Group,
+you
+should
+send
+it
+to
+public-rdf-comments:
+public-rdf-comments@w3.org
+Ad-hoc
+technical
+discussion
+primarily
+occurs
+on
+the
+public
+community
+mailing
+list:
+public-linked-json@w3.org
+Public
+JSON-LD
+Community
+Group
+teleconferences
+are
+held
+on
+Tuesdays
+at
+1400UTC
+every
+week.
+Participation
+is
+open
+to
+the
+public.
+RDF
+Working
+Group
+teleconferences
+are
+held
+on
+Wednesdays
+at
+1500UTC
+every
+week.
+Participation
+is
+limited
+to
+RDF
+Working
+Group
+members.
+Specification
+bugs
+and
+issues
+should
+be
+reported
+in
+the
+issue
+tracker
+if
+you
+do
+not
+want
+to
+send
+an
+email
+to
+the
+public-rdf-comments
+mailing
+list.
+Source
+code
+for
+the
+specification
+can
+be
+found
+on
+Github.
+The
+#json-ld
+IRC
+channel
+is
+available
+for
+real-time
+discussion
+on
+irc.freenode.net.
+This
+is
+a
+second
+Last
+Call
+Working
+Draft
+for
+this
+document.
+</del>
+Changes
+since
+the
+<a href="http://www.w3.org/TR/2013/WD-json-ld-api-20130411/">
+<del class="diff-old">11
+April
+2013
+</del>
+<ins class="diff-chg">11 April 2013
+</ins>
+Last
+Call
+Working
+Draft
+</a>:
+</p>
+<ul>
+<li>
+Use
+of
+DOM
+Futures
+instead
+of
+callbacks
+in
+the
+Application
+Programming
+Interface
+</li>
+<li>
+Processing
+of
+terms
+that
+are
+redefined
+to
+themselves
+without
+raising
+an
+<code class="error">
+<a href="#idl-def-JsonLdErrorCode.cyclic-IRI-mapping">
+cyclic
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+mapping
+</a>
+</code>
+error
+</li>
+<li>
+Raise
+an
+<code class="error">
+<a href="#idl-def-JsonLdErrorCode.invalid-IRI-mapping">
+invalid
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+mapping
+</a>
+</code>
+error
+if
+relative
+URLs
+are
+used
+in
+term
+definitions
+</li>
+<li>
+Support
+<ins class="diff-new">relative
+IRIs
+in
+</ins><code><ins class="diff-new">
+@base
+</ins></code></li><li><ins class="diff-new">
+Remove
+default
+value
+of
+</ins><code class="idlMemberName"><a href="#idl-def-JsonLdOptions"><ins class="diff-new">
+JsonLdOption's
+</ins></a></code><code class="idlMemberName"><a href="#widl-JsonLdOptions-base"><ins class="diff-new">
+base
+</ins></a></code><ins class="diff-new">
+member
+</ins></li><li><ins class="diff-new">
+Support
+</ins>
+lists
+of
+lists
+when
+<del class="diff-old">converting
+from
+</del>
+<ins class="diff-chg">serializing
+</ins>
+RDF
+<del class="diff-old">to
+</del>
+<ins class="diff-chg">as
+</ins>
+JSON-LD
+</li>
+<li>
+Support
+for
+relative
+URLs
+in
+<code>
+@base
+</code>
+and
+documents
+that
+do
+not
+have
+a
+base
+<del class="diff-old">value.
+</del>
+<ins class="diff-chg">value
+</ins></li></ul><p><ins class="diff-chg">
+Changes
+since
+the
+</ins><a href="http://www.w3.org/TR/2013/WD-json-ld-api-20130516/"><ins class="diff-chg">
+16 May 2013
+Last
+Call
+Working
+Draft
+</ins></a>:</p><ul><li><ins class="diff-chg">
+Ensure
+determinism
+of
+the
+Deserialize
+JSON-LD
+to
+RDF
+algorithm
+by
+specifying
+the
+processing
+order
+</ins></li><li><ins class="diff-chg">
+Change
+the
+default
+value
+of
+the
+</ins><em><ins class="diff-chg">
+use
+native
+types
+</ins></em><ins class="diff-chg">
+flag
+in
+the
+Serialize
+RDF
+as
+JSON-LD
+algorithm
+to
+</ins><code><ins class="diff-chg">
+false
+</ins></code></li><li><ins class="diff-chg">
+Clarify
+that
+the
+</ins><i><ins class="diff-chg">
+identifier
+map
+</ins></i><ins class="diff-chg">
+and
+the
+</ins><i><ins class="diff-chg">
+counter
+</ins></i><ins class="diff-chg">
+used
+by
+the
+Generate
+Blank
+Node
+Identifier
+algorithm
+are
+reset
+before
+running
+the
+Flattening
+and
+the
+Deserialize
+JSON-LD
+to
+RDF
+algorithms
+</ins></li><li><ins class="diff-chg">
+Raise
+an
+error
+if
+a
+blank
+node
+is
+used
+as
+data
+type
+</ins></li><li><ins class="diff-chg">
+Clarify
+that
+blank
+node
+identifier
+are
+supported
+as
+value
+of
+</ins><code><ins class="diff-chg">
+@vocab
+</ins></code></li><li><ins class="diff-chg">
+When
+generating
+RDF,
+exclude
+</ins><a class="tref internalDFN" title="rdf-triple" href="#dfn-rdf-triple"><ins class="diff-chg">
+triples
+</ins></a><ins class="diff-chg">
+containing
+a
+</ins><a class="tref internalDFN" title="blank-node" href="#dfn-blank-node"><ins class="diff-chg">
+blank
+node
+</ins></a><a class="tref internalDFN" title="rdf-predicate" href="#dfn-rdf-predicate"><ins class="diff-chg">
+predicate
+</ins></a>,<ins class="diff-chg">
+unless
+the
+</ins><i><ins class="diff-chg">
+produce
+generalized
+RDF
+</ins></i><ins class="diff-chg">
+flag
+is
+set
+</ins></li><li><ins class="diff-chg">
+Update
+reference
+to
+DOM
+Promises
+(have
+been
+called
+DOM
+Futures)
+</ins></li><li><ins class="diff-chg">
+Fix
+bug
+in
+</ins><a href="#serialize-rdf-as-json-ld-algorithm"><ins class="diff-chg">
+Serialize
+RDF
+to
+JSON-LD
+algorithm
+</ins></a><ins class="diff-chg">
+to
+handle
+lists
+correctly
+</ins></li><li><ins class="diff-chg">
+Support
+processing
+of
+documents
+with
+a
+</ins><code><ins class="diff-chg">
++json
+</ins></code><ins class="diff-chg">
+media
+type
+as
+defined
+in
+[
+</ins><cite><a class="bibref" href="#bib-RFC6839"><ins class="diff-chg">
+RFC6839
+</ins></a></cite><ins class="diff-chg">
+]
+</ins></li><li><ins class="diff-chg">
+Use
+the
+</ins><a href="#idl-def-LoadDocumentCallback" class="idlType"><code><ins class="diff-chg">
+LoadDocumentCallback
+</ins></code></a><ins class="diff-chg">
+(previously
+</ins><code><ins class="diff-chg">
+LoadContextCallback
+</ins></code><ins class="diff-chg">
+)
+to
+retrieve
+remote
+contexts
+and
+remote
+documents
+</ins></li><li><ins class="diff-chg">
+Allow
+contexts
+to
+be
+passed
+into
+the
+API
+directly.
+Previously
+only
+context
+documents,
+i.e.,
+objects
+having
+a
+</ins><code><ins class="diff-chg">
+@context
+</ins></code><ins class="diff-chg">
+member
+were
+allowed.
+</ins>
+</li>
+</ul>
+<p>
+This
+document
+was
+published
+by
+the
+<a href="http://www.w3.org/2011/rdf-wg/">
+RDF
+Working
+Group
+</a>
+as
+a
+<del class="diff-old">Last
+Call
+Working
+Draft.
+</del>
+<ins class="diff-chg">Candidate
+Recommendation.
+</ins>
+This
+document
+is
+intended
+to
+become
+a
+<abbr title="World Wide Web Consortium">
+W3C
+</abbr>
+Recommendation.
+If
+you
+wish
+to
+make
+comments
+regarding
+this
+document,
+please
+send
+them
+to
+<a href="mailto:public-rdf-comments@w3.org">
+public-rdf-comments@w3.org
+</a>
+(
+<a href="mailto:public-rdf-comments-request@w3.org?subject=subscribe">
+subscribe
+</a>,
+<a href="http://lists.w3.org/Archives/Public/public-rdf-comments/">
+archives
+</a>
+).
+<del class="diff-old">The
+Last
+Call
+period
+ends
+06
+June
+</del>
+<abbr title="World Wide Web Consortium">
+<ins class="diff-chg">W3C
+</ins></abbr><ins class="diff-chg">
+publishes
+a
+Candidate
+Recommendation
+to
+indicate
+that
+the
+document
+is
+believed
+to
+be
+stable
+and
+to
+encourage
+implementation
+by
+the
+developer
+community.
+This
+Candidate
+Recommendation
+is
+expected
+to
+advance
+to
+Proposed
+Recommendation
+no
+earlier
+than
+19
+September
+</ins>
+2013.
+All
+comments
+are
+welcome.
+</p>
+<p>
+Publication
+as
+a
+<del class="diff-old">Last
+Call
+Working
+Draft
+</del>
+<ins class="diff-chg">Candidate
+Recommendation
+</ins>
+does
+not
+imply
+endorsement
+by
+the
+<abbr title="World Wide Web Consortium">
+W3C
+</abbr>
+Membership.
+This
+is
+a
+draft
+document
+and
+may
+be
+updated,
+replaced
+or
+obsoleted
+by
+other
+documents
+at
+any
+time.
+It
+is
+inappropriate
+to
+cite
+this
+document
+as
+other
+than
+work
+in
+progress.
+</p>
+<p>
+<del class="diff-old">This
+is
+a
+Last
+Call
+Working
+Draft
+and
+thus
+the
+Working
+Group
+has
+determined
+that
+</del>
+<ins class="diff-chg">Before
+</ins>
+this
+<del class="diff-old">document
+has
+satisfied
+</del>
+<ins class="diff-chg">specification
+exits
+Candidate
+Recommendation,
+two
+or
+more
+independent
+implementations
+must
+pass
+each
+test,
+although
+no
+single
+implementation
+must
+pass
+each
+test.
+The
+working
+group
+will
+decide
+when
+</ins>
+the
+<del class="diff-old">relevant
+technical
+requirements
+and
+</del>
+<ins class="diff-chg">test
+suite
+</ins>
+is
+<del class="diff-old">sufficiently
+stable
+</del>
+<ins class="diff-chg">of
+sufficient
+quality
+</ins>
+to
+<del class="diff-old">advance
+through
+</del>
+<ins class="diff-chg">test
+interoperability
+and
+will
+produce
+an
+implementation
+report
+(hosted
+together
+with
+</ins>
+the
+<del class="diff-old">Technical
+Recommendation
+process.
+</del>
+<ins class="diff-chg">test
+suite).
+</ins>
+</p>
+<p>
+This
+document
+was
+produced
+by
+a
+group
+operating
+under
+the
+<a href="http://www.w3.org/Consortium/Patent-Policy-20040205/">
+5
+February
+2004
+<abbr title="World Wide Web Consortium">
+W3C
+</abbr>
+Patent
+Policy
+</a>.
+<abbr title="World Wide Web Consortium">
+W3C
+</abbr>
+maintains
+a
+<a href="http://www.w3.org/2004/01/pp-impl/46168/status" rel="disclosure">
+public
+list
+of
+any
+patent
+disclosures
+</a>
+made
+in
+connection
+with
+the
+deliverables
+of
+the
+group;
+that
+page
+also
+includes
+instructions
+for
+disclosing
+a
+patent.
+An
+individual
+who
+has
+actual
+knowledge
+of
+a
+patent
+which
+the
+individual
+believes
+contains
+<a href="http://www.w3.org/Consortium/Patent-Policy-20040205/#def-essential">
+Essential
+Claim(s)
+</a>
+must
+disclose
+the
+information
+in
+accordance
+with
+<a href="http://www.w3.org/Consortium/Patent-Policy-20040205/#sec-Disclosure">
+section
+6
+of
+the
+<abbr title="World Wide Web Consortium">
+W3C
+</abbr>
+Patent
+Policy
+</a>.
+</p>
+</section>
+<section id="toc">
+<h2 class="introductory">
+Table
+of
+Contents
+</h2>
+<ul class="toc">
+<li class="tocline">
+<a href="#introduction" class="tocxref">
+<span class="secno">
+1.
+</span>
+Introduction
+</a>
+</li>
+<li class="tocline">
+<a href="#features" class="tocxref">
+<span class="secno">
+2.
+</span>
+Features
+</a>
+<ul class="toc">
+<li class="tocline">
+<a href="#expansion" class="tocxref">
+<span class="secno">
+2.1
+</span>
+Expansion
+</a>
+</li>
+<li class="tocline">
+<a href="#compaction" class="tocxref">
+<span class="secno">
+2.2
+</span>
+Compaction
+</a>
+</li>
+<li class="tocline">
+<a href="#flattening" class="tocxref">
+<span class="secno">
+2.3
+</span>
+Flattening
+</a>
+</li>
+<li class="tocline">
+<a href="#rdf-serialization-deserialization" class="tocxref">
+<span class="secno">
+2.4
+</span>
+RDF
+<del class="diff-old">Conversion
+</del>
+<ins class="diff-chg">Serialization/Deserialization
+</ins>
+</a>
+</li>
+</ul>
+</li>
+<li class="tocline">
+<a href="#conformance" class="tocxref">
+<span class="secno">
+3.
+</span>
+Conformance
+</a>
+</li>
+<li class="tocline">
+<a href="#general-terminology" class="tocxref">
+<span class="secno">
+4.
+</span>
+General
+Terminology
+</a>
+</li>
+<li class="tocline">
+<a href="#algorithm-terms" class="tocxref">
+<span class="secno">
+5.
+</span>
+Algorithm
+Terms
+</a>
+</li>
+<li class="tocline">
+<a href="#context-processing-algorithms" class="tocxref">
+<span class="secno">
+6.
+</span>
+Context
+Processing
+Algorithms
+</a>
+<ul class="toc">
+<li class="tocline">
+<a href="#context-processing-algorithm" class="tocxref">
+<span class="secno">
+6.1
+</span>
+Context
+Processing
+Algorithm
+</a>
+</li>
+<li class="tocline">
+<a href="#create-term-definition" class="tocxref">
+<span class="secno">
+6.2
+</span>
+Create
+Term
+Definition
+</a>
+</li>
+<li class="tocline">
+<a href="#iri-expansion" class="tocxref">
+<span class="secno">
+6.3
+</span>
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+Expansion
+</a>
+</li>
+</ul>
+</li>
+<li class="tocline">
+<a href="#expansion-algorithms" class="tocxref">
+<span class="secno">
+7.
+</span>
+Expansion
+Algorithms
+</a>
+<ul class="toc">
+<li class="tocline">
+<a href="#expansion-algorithm" class="tocxref">
+<span class="secno">
+7.1
+</span>
+Expansion
+Algorithm
+</a>
+</li>
+<li class="tocline">
+<a href="#value-expansion" class="tocxref">
+<span class="secno">
+7.2
+</span>
+Value
+Expansion
+</a>
+</li>
+</ul>
+</li>
+<li class="tocline">
+<a href="#compaction-algorithms" class="tocxref">
+<span class="secno">
+8.
+</span>
+Compaction
+Algorithms
+</a>
+<ul class="toc">
+<li class="tocline">
+<a href="#compaction-algorithm" class="tocxref">
+<span class="secno">
+8.1
+</span>
+Compaction
+Algorithm
+</a>
+</li>
+<li class="tocline">
+<a href="#inverse-context-creation" class="tocxref">
+<span class="secno">
+8.2
+</span>
+Inverse
+Context
+Creation
+</a>
+</li>
+<li class="tocline">
+<a href="#iri-compaction" class="tocxref">
+<span class="secno">
+8.3
+</span>
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+Compaction
+</a>
+</li>
+<li class="tocline">
+<a href="#term-selection" class="tocxref">
+<span class="secno">
+8.4
+</span>
+Term
+Selection
+</a>
+</li>
+<li class="tocline">
+<a href="#value-compaction" class="tocxref">
+<span class="secno">
+8.5
+</span>
+Value
+Compaction
+</a>
+</li>
+</ul>
+</li>
+<li class="tocline">
+<a href="#flattening-algorithms" class="tocxref">
+<span class="secno">
+9.
+</span>
+Flattening
+Algorithms
+</a>
+<ul class="toc">
+<li class="tocline">
+<a href="#flattening-algorithm" class="tocxref">
+<span class="secno">
+9.1
+</span>
+Flattening
+Algorithm
+</a>
+</li>
+<li class="tocline">
+<a href="#node-map-generation" class="tocxref">
+<span class="secno">
+9.2
+</span>
+Node
+Map
+Generation
+</a>
+</li>
+<li class="tocline">
+<a href="#generate-blank-node-identifier" class="tocxref">
+<span class="secno">
+9.3
+</span>
+Generate
+Blank
+Node
+Identifier
+</a>
+</li>
+</ul>
+</li>
+<li class="tocline">
+<a href="#rdf-serialization-deserialization-algorithms" class="tocxref">
+<span class="secno">
+10.
+</span>
+RDF
+<del class="diff-old">Conversion
+</del>
+<ins class="diff-chg">Serialization/Deserialization
+</ins>
+Algorithms
+</a>
+<ul class="toc">
+<li class="tocline">
+<a href="#deserialize-json-ld-to-rdf-algorithm" class="tocxref">
+<span class="secno">
+10.1
+</span>
+<del class="diff-old">Convert
+</del>
+<ins class="diff-chg">Deserialize
+JSON-LD
+</ins>
+to
+RDF
+<del class="diff-old">Algorithm
+</del>
+<ins class="diff-chg">algorithm
+</ins>
+</a>
+</li>
+<li class="tocline">
+<a href="#object-to-rdf-conversion" class="tocxref">
+<span class="secno">
+10.2
+</span>
+Object
+to
+RDF
+Conversion
+</a>
+</li>
+<li class="tocline">
+<a href="#list-to-rdf-conversion" class="tocxref">
+<span class="secno">
+10.3
+</span>
+List
+to
+RDF
+Conversion
+</a>
+</li>
+<li class="tocline">
+<a href="#serialize-rdf-as-json-ld-algorithm" class="tocxref">
+<span class="secno">
+10.4
+</span>
+<del class="diff-old">Convert
+from
+</del>
+<ins class="diff-chg">Serialize
+</ins>
+RDF
+<ins class="diff-new">as
+JSON-LD
+</ins>
+Algorithm
+</a>
+</li>
+<li class="tocline">
+<a href="#rdf-to-object-conversion" class="tocxref">
+<span class="secno">
+10.5
+</span>
+RDF
+to
+Object
+Conversion
+</a>
+</li>
+<li class="tocline">
+<a href="#data-round-tripping" class="tocxref">
+<span class="secno">
+10.6
+</span>
+Data
+Round
+Tripping
+</a>
+</li>
+</ul>
+</li>
+<li class="tocline">
+<a href="#the-application-programming-interface" class="tocxref">
+<span class="secno">
+11.
+</span>
+The
+Application
+Programming
+Interface
+</a>
+<ul class="toc">
+<li class="tocline">
+<a href="#the-jsonldprocessor-interface" class="tocxref">
+<span class="secno">
+11.1
+</span>
+The
+<span class="formerLink">
+<code>
+JsonLdProcessor
+</code>
+</span>
+Interface
+</a>
+</li>
+<li class="tocline">
+<a href="#the-jsonldoptions-type" class="tocxref">
+<span class="secno">
+11.2
+</span>
+The
+<span class="formerLink">
+<code>
+JsonLdOptions
+</code>
+</span>
+Type
+</a>
+</li>
+<li class="tocline">
+<a href="#remote-document-and-context-retrieval" class="tocxref">
+<span class="secno">
+11.3
+</span>
+Remote
+<ins class="diff-new">Document
+and
+</ins>
+Context
+Retrieval
+</a>
+</li>
+<li class="tocline">
+<a href="#error-handling" class="tocxref">
+<span class="secno">
+11.4
+</span>
+Error
+Handling
+</a>
+</li>
+</ul>
+</li>
+<li class="tocline">
+<a href="#acknowledgements" class="tocxref">
+<span class="secno">
+A.
+</span>
+Acknowledgements
+</a>
+</li>
+<li class="tocline">
+<a href="#references" class="tocxref">
+<span class="secno">
+B.
+</span>
+References
+</a>
+<ul class="toc">
+<li class="tocline">
+<a href="#normative-references" class="tocxref">
+<span class="secno">
+B.1
+</span>
+Normative
+references
+</a>
+</li>
+<li class="tocline">
+<a href="#informative-references" class="tocxref">
+<span class="secno">
+B.2
+</span>
+Informative
+references
+</a>
+</li>
+</ul>
+</li>
+</ul>
+</section>
+<section class="informative" id="introduction">
+<h2>
+<span class="secno">
+1.
+</span>
+Introduction
+</h2>
+<p>
+<em>
+This
+section
+is
+non-normative.
+</em>
+</p>
+<p>
+This
+document
+is
+a
+detailed
+specification
+for
+an
+Application
+Programming
+Interface
+for
+the
+JSON-LD
+syntax.
+The
+document
+is
+primarily
+intended
+for
+the
+following
+audiences:
+</p>
+<ul>
+<li>
+Developers
+who
+want
+an
+overview
+of
+the
+JSON-LD
+API.
+</li>
+<li>
+Web
+authors
+and
+developers
+who
+want
+a
+very
+detailed
+view
+of
+how
+a
+<a class="tref internalDFN" title="json-ld-processor" href="#dfn-json-ld-processor">
+JSON-LD
+Processor
+</a>
+or
+a
+<a class="tref internalDFN" title="json-ld-api-implementation" href="#dfn-json-ld-api-implementation">
+JSON-LD
+API
+Implementation
+</a>
+operates.
+</li>
+<li>
+Software
+developers
+who
+want
+to
+implement
+the
+algorithms
+to
+transform
+JSON-LD
+documents.
+</li>
+</ul>
+<p>
+To
+understand
+the
+basics
+in
+this
+specification
+you
+must
+first
+be
+familiar
+with
+JSON,
+which
+is
+detailed
+in
+[
+<cite>
+<a class="bibref" href="#bib-RFC4627">
+RFC4627
+</a>
+</cite>
+].
+You
+must
+also
+understand
+the
+JSON-LD
+syntax
+defined
+in
+[
+<cite>
+<a class="bibref" href="#bib-JSON-LD">
+JSON-LD
+</a>
+</cite>
+],
+which
+is
+the
+base
+syntax
+used
+by
+all
+of
+the
+algorithms
+in
+this
+document.
+To
+understand
+the
+API
+and
+how
+it
+is
+intended
+to
+operate
+in
+a
+programming
+environment,
+it
+is
+useful
+to
+have
+working
+knowledge
+of
+the
+JavaScript
+programming
+language
+[
+<cite>
+<a class="bibref" href="#bib-ECMA-262">
+ECMA-262
+</a>
+</cite>
+]
+and
+WebIDL
+[
+<cite>
+<a class="bibref" href="#bib-WEBIDL">
+WEBIDL
+</a>
+</cite>
+].
+To
+understand
+how
+JSON-LD
+maps
+to
+RDF,
+it
+is
+helpful
+to
+be
+familiar
+with
+the
+basic
+RDF
+concepts
+[
+<cite>
+<a class="bibref" href="#bib-RDF11-CONCEPTS">
+RDF11-CONCEPTS
+</a>
+</cite>
+].
+</p>
+</section>
+<section class="informative" id="features">
+<h2>
+<span class="secno">
+2.
+</span>
+Features
+</h2>
+<p>
+<em>
+This
+section
+is
+non-normative.
+</em>
+</p>
+<p>
+The
+JSON-LD
+Syntax
+specification
+[
+<cite>
+<a class="bibref" href="#bib-JSON-LD">
+JSON-LD
+</a>
+</cite>
+]
+defines
+a
+syntax
+to
+express
+Linked
+Data
+in
+JSON.
+Because
+there
+is
+more
+than
+one
+way
+to
+express
+Linked
+Data
+using
+this
+syntax,
+it
+is
+often
+useful
+to
+be
+able
+to
+transform
+JSON-LD
+documents
+so
+that
+they
+may
+be
+more
+easily
+consumed
+by
+specific
+applications.
+</p>
+<p>
+JSON-LD
+uses
+<a class="tref internalDFN" title="context" href="#dfn-context">
+contexts
+</a>
+to
+allow
+Linked
+Data
+to
+be
+expressed
+in
+a
+way
+that
+is
+specifically
+tailored
+to
+a
+particular
+person
+or
+application.
+By
+providing
+a
+<a class="tref internalDFN" title="context" href="#dfn-context">
+context
+</a>,
+JSON
+data
+can
+be
+expressed
+in
+a
+way
+that
+is
+a
+natural
+fit
+for
+a
+particular
+person
+or
+application
+whilst
+also
+indicating
+how
+the
+data
+should
+be
+understood
+at
+a
+global
+scale.
+In
+order
+for
+people
+or
+applications
+to
+share
+data
+that
+was
+created
+using
+a
+<a class="tref internalDFN" title="context" href="#dfn-context">
+context
+</a>
+that
+is
+different
+from
+their
+own,
+a
+JSON-LD
+processor
+must
+be
+able
+to
+transform
+a
+document
+from
+one
+<a class="tref internalDFN" title="context" href="#dfn-context">
+context
+</a>
+to
+another.
+Instead
+of
+requiring
+JSON-LD
+processors
+to
+write
+specific
+code
+for
+every
+imaginable
+<a class="tref internalDFN" title="context" href="#dfn-context">
+context
+</a>
+switching
+scenario,
+it
+is
+much
+easier
+to
+specify
+a
+single
+algorithm
+that
+can
+remove
+any
+<a class="tref internalDFN" title="context" href="#dfn-context">
+context
+</a>.
+Similarly,
+another
+algorithm
+can
+be
+specified
+to
+subsequently
+apply
+any
+<a class="tref internalDFN" title="context" href="#dfn-context">
+context
+</a>.
+These
+two
+algorithms
+represent
+the
+most
+basic
+transformations
+of
+JSON-LD
+documents.
+They
+are
+referred
+to
+as
+<a class="tref internalDFN" title="expansion" href="#dfn-expansion">
+expansion
+</a>
+and
+<a class="tref internalDFN" title="compaction" href="#dfn-compaction">
+compaction
+</a>,
+respectively.
+</p>
+<p>
+There
+are
+four
+major
+types
+of
+transformation
+that
+are
+discussed
+in
+this
+document:
+expansion,
+compaction,
+flattening,
+and
+RDF
+<del class="diff-old">conversion.
+</del>
+<ins class="diff-chg">serialization/deserialization.
+</ins>
+</p>
+<section class="informative" id="expansion">
+<h3>
+<span class="secno">
+2.1
+</span>
+Expansion
+</h3>
+<p>
+<em>
+This
+section
+is
+non-normative.
+</em>
+</p>
+<p>
+The
+algorithm
+that
+removes
+<a class="tref internalDFN" title="context" href="#dfn-context">
+context
+</a>
+is
+called
+<dfn title="expansion" id="dfn-expansion">
+expansion
+</dfn>.
+Before
+performing
+any
+other
+transformations
+on
+a
+JSON-LD
+document,
+it
+is
+easiest
+to
+remove
+any
+<a class="tref internalDFN" title="context" href="#dfn-context">
+context
+</a>
+from
+it
+and
+to
+make
+data
+structures
+more
+regular.
+</p>
+<p>
+To
+get
+an
+idea
+of
+how
+context
+and
+data
+structuring
+affects
+the
+same
+data,
+here
+is
+an
+example
+of
+JSON-LD
+that
+uses
+only
+<a class="tref internalDFN" title="term" href="#dfn-term">
+terms
+</a>
+and
+is
+fairly
+compact:
+</p>
+ <div class="example"><div class="example-title"><span>Example 1</span>: Sample JSON-LD document</div><pre class="example">{
+ "@context": {
+ "name": "http://xmlns.com/foaf/0.1/name",
+ "homepage": {
+ "@id": "http://xmlns.com/foaf/0.1/homepage",
+ "@type": "@id"
+ }
+ },
+ "@id": "http://me.markus-lanthaler.com/",
+ "name": "Markus Lanthaler",
+ "homepage": "http://www.markus-lanthaler.com/"
+}
+</pre>
+</div>
+<p>
+The
+next
+input
+example
+uses
+one
+<a class="tref internalDFN" title="iri" href="#dfn-iri">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+to
+express
+a
+property
+and
+an
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>
+to
+encapsulate
+another,
+but
+leaves
+the
+rest
+of
+the
+information
+untouched.
+</p>
+ <div class="example"><div class="example-title"><span>Example 2</span>: Sample JSON-LD document using an IRI instead of a term to express a property</div><pre class="example">{
+ "@context": {
+ <span class="diff">"website": "http://xmlns.com/foaf/0.1/homepage"</span>
+ },
+ "@id": "http://me.markus-lanthaler.com/",
+ "<span class="diff">http://xmlns.com/foaf/0.1/name</span>": "Markus Lanthaler",
+ <span class="diff">"website"</span>: <span class="diff">{ "@id":</span> "http://www.markus-lanthaler.com/" <span class="diff">}</span>
+}
+</pre>
+</div>
+<p>
+Note
+that
+both
+inputs
+are
+valid
+JSON-LD
+and
+both
+represent
+the
+same
+information.
+The
+difference
+is
+in
+their
+<a class="tref internalDFN" title="context" href="#dfn-context">
+context
+</a>
+information
+and
+in
+the
+data
+structures
+used.
+A
+JSON-LD
+processor
+can
+remove
+<a class="tref internalDFN" title="context" href="#dfn-context">
+context
+</a>
+and
+ensure
+that
+the
+data
+is
+more
+regular
+by
+employing
+<a class="tref internalDFN" title="expansion" href="#dfn-expansion">
+expansion
+</a>.
+</p>
+<p>
+<a class="tref internalDFN" title="expansion" href="#dfn-expansion">
+Expansion
+</a>
+has
+two
+important
+goals:
+removing
+any
+contextual
+information
+from
+the
+document,
+and
+ensuring
+all
+values
+are
+represented
+in
+a
+regular
+form.
+These
+goals
+are
+accomplished
+by
+expanding
+all
+properties
+to
+<a class="tref internalDFN" title="absolute-iri" href="#dfn-absolute-iri">
+absolute
+IRIs
+</a>
+and
+by
+expressing
+all
+values
+in
+<a class="tref internalDFN" title="array" href="#dfn-array">
+arrays
+</a>
+in
+<a class="tref internalDFN" title="expanded-form" href="#dfn-expanded-form">
+expanded
+form
+</a>.
+<a class="tref internalDFN" title="expanded-form" href="#dfn-expanded-form">
+Expanded
+form
+</a>
+is
+the
+most
+verbose
+and
+regular
+way
+of
+expressing
+of
+values
+in
+JSON-LD;
+all
+contextual
+information
+from
+the
+document
+is
+instead
+stored
+locally
+with
+each
+value.
+Running
+the
+<a href="#expansion-algorithm">
+Expansion
+algorithm
+</a>
+(
+<code class="idlMemberName">
+<a href="#widl-JsonLdProcessor-expand-Promise-any-input-JsonLdOptions-options">
+expand
+</a>
+</code>
+operation)
+against
+the
+above
+examples
+results
+in
+the
+following
+output:
+</p>
+ <div class="example"><div class="example-title"><span>Example 3</span>: Expanded sample document</div><pre class="example">[
+ {
+ "@id": "http://me.markus-lanthaler.com/",
+ "http://xmlns.com/foaf/0.1/name": [
+ { "@value": "Markus Lanthaler" }
+ ],
+ "http://xmlns.com/foaf/0.1/homepage": [
+ { "@id": "http://www.markus-lanthaler.com/" }
+ ]
+ }
+]
+</pre>
+</div>
+<p>
+Note
+that
+in
+the
+output
+above
+all
+<a class="tref internalDFN" title="context" href="#dfn-context">
+context
+</a>
+definitions
+have
+been
+removed,
+all
+<a class="tref internalDFN" title="term" href="#dfn-term">
+terms
+</a>
+and
+<a class="tref internalDFN" title="compact-iri" href="#dfn-compact-iri">
+compact
+IRIs
+</a>
+have
+been
+expanded
+to
+absolute
+<a class="tref internalDFN" title="iri" href="#dfn-iri">
+IRIs
+</a>,
+and
+all
+<a class="tref internalDFN" title="json-ld-value" href="#dfn-json-ld-value">
+JSON-LD
+values
+</a>
+are
+expressed
+in
+<a class="tref internalDFN" title="array" href="#dfn-array">
+arrays
+</a>
+in
+<a class="tref internalDFN" title="expanded-form" href="#dfn-expanded-form">
+expanded
+form
+</a>.
+While
+the
+output
+is
+more
+verbose
+and
+difficult
+for
+a
+human
+to
+read,
+it
+establishes
+a
+baseline
+that
+makes
+JSON-LD
+processing
+easier
+because
+of
+its
+very
+regular
+structure.
+</p>
+</section>
+<section class="informative" id="compaction">
+<h3>
+<span class="secno">
+2.2
+</span>
+Compaction
+</h3>
+<p>
+<em>
+This
+section
+is
+non-normative.
+</em>
+</p>
+<p>
+While
+<a class="tref internalDFN" title="expansion" href="#dfn-expansion">
+expansion
+</a>
+removes
+<a class="tref internalDFN" title="context" href="#dfn-context">
+context
+</a>
+from
+a
+given
+input,
+<a class="tref internalDFN" title="compaction" href="#dfn-compaction">
+compaction's
+</a>
+primary
+function
+is
+to
+perform
+the
+opposite
+operation:
+to
+express
+a
+given
+input
+according
+to
+a
+particular
+<a class="tref internalDFN" title="context" href="#dfn-context">
+context
+</a>.
+<dfn title="compaction" id="dfn-compaction">
+Compaction
+</dfn>
+applies
+a
+<a class="tref internalDFN" title="context" href="#dfn-context">
+context
+</a>
+that
+specifically
+tailors
+the
+way
+information
+is
+expressed
+for
+a
+particular
+person
+or
+application.
+This
+simplifies
+applications
+that
+consume
+JSON
+or
+JSON-LD
+by
+expressing
+the
+data
+in
+application-specific
+terms,
+and
+it
+makes
+the
+data
+easier
+to
+read
+by
+humans.
+</p>
+<p>
+<a class="tref internalDFN" title="compaction" href="#dfn-compaction">
+Compaction
+</a>
+uses
+a
+developer-supplied
+<a class="tref internalDFN" title="context" href="#dfn-context">
+context
+</a>
+to
+shorten
+<a class="tref internalDFN" title="iri" href="#dfn-iri">
+IRIs
+</a>
+to
+<a class="tref internalDFN" title="term" href="#dfn-term">
+terms
+</a>
+or
+<a class="tref internalDFN" title="compact-iri" href="#dfn-compact-iri">
+compact
+IRIs
+</a>
+and
+<a class="tref internalDFN" title="json-ld-value" href="#dfn-json-ld-value">
+JSON-LD
+values
+</a>
+expressed
+in
+<a class="tref internalDFN" title="expanded-form" href="#dfn-expanded-form">
+expanded
+form
+</a>
+to
+simple
+values
+such
+as
+<a class="tref internalDFN" title="string" href="#dfn-string">
+strings
+</a>
+or
+<a class="tref internalDFN" title="number" href="#dfn-number">
+numbers
+</a>.
+</p>
+<p>
+For
+example,
+assume
+the
+following
+expanded
+JSON-LD
+input
+document:
+</p>
+ <div class="example"><div class="example-title"><span>Example 4</span>: Expanded sample document</div><pre class="example">[
+ {
+ "@id": "http://me.markus-lanthaler.com/",
+ "http://xmlns.com/foaf/0.1/name": [
+ { "@value": "Markus Lanthaler" }
+ ],
+ "http://xmlns.com/foaf/0.1/homepage": [
+ { "@id": "http://www.markus-lanthaler.com/" }
+ ]
+ }
+]
+</pre>
+</div>
+<p>
+Additionally,
+assume
+the
+following
+developer-supplied
+JSON-LD
+<a class="tref internalDFN" title="context" href="#dfn-context">
+context
+</a>:
+</p>
+ <div class="example"><div class="example-title"><span>Example 5</span>: JSON-LD context</div><pre class="example">{
+ "@context": {
+ "name": "http://xmlns.com/foaf/0.1/name",
+ "homepage": {
+ "@id": "http://xmlns.com/foaf/0.1/homepage",
+ "@type": "@id"
+ }
+ }
+}
+</pre>
+</div>
+<p>
+Running
+the
+<a href="#compaction-algorithm">
+Compaction
+Algorithm
+</a>
+(
+<code class="idlMemberName">
+<a href="#widl-JsonLdProcessor-compact-Promise-any-input-JsonLdContext-context-JsonLdOptions-options">
+compact
+</a>
+</code>
+operation)
+given
+the
+context
+supplied
+above
+against
+the
+JSON-LD
+input
+document
+provided
+above
+would
+result
+in
+the
+following
+output:
+</p>
+ <div class="example"><div class="example-title"><span>Example 6</span>: Compacted sample document</div><pre class="example">{
+ "@context": {
+ "name": "http://xmlns.com/foaf/0.1/name",
+ "homepage": {
+ "@id": "http://xmlns.com/foaf/0.1/homepage",
+ "@type": "@id"
+ }
+ },
+ "@id": "http://me.markus-lanthaler.com/",
+ "name": "Markus Lanthaler",
+ "homepage": "http://www.markus-lanthaler.com/"
+}
+</pre>
+</div>
+<p>
+Note
+that
+all
+<a class="tref internalDFN" title="iri" href="#dfn-iri">
+IRIs
+</a>
+have
+been
+compacted
+to
+<a class="tref internalDFN" title="term" href="#dfn-term">
+terms
+</a>
+as
+specified
+in
+the
+<a class="tref internalDFN" title="context" href="#dfn-context">
+context
+</a>,
+which
+has
+been
+injected
+into
+the
+output.
+While
+compacted
+output
+is
+useful
+to
+humans,
+it
+is
+also
+used
+to
+generate
+structures
+that
+are
+easy
+to
+program
+against.
+Compaction
+enables
+developers
+to
+map
+any
+expanded
+document
+into
+an
+application-specific
+compacted
+document.
+While
+the
+context
+provided
+above
+mapped
+<code>
+http://xmlns.com/foaf/0.1/name
+</code>
+to
+<code>
+name
+</code>,
+it
+could
+also
+have
+been
+mapped
+to
+any
+other
+term
+provided
+by
+the
+developer.
+</p>
+</section>
+<section class="informative" id="flattening">
+<h3>
+<span class="secno">
+2.3
+</span>
+Flattening
+</h3>
+<p>
+<em>
+This
+section
+is
+non-normative.
+</em>
+</p>
+<p>
+While
+expansion
+ensures
+that
+a
+document
+is
+in
+a
+uniform
+structure,
+flattening
+goes
+a
+step
+further
+to
+ensure
+that
+the
+shape
+of
+the
+data
+is
+deterministic.
+In
+expanded
+documents,
+the
+properties
+of
+a
+single
+<a class="tref internalDFN" title="node" href="#dfn-node">
+node
+</a>
+may
+be
+spread
+across
+a
+number
+of
+different
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+objects
+</a>.
+By
+flattening
+a
+document,
+all
+properties
+of
+a
+<a class="tref internalDFN" title="node" href="#dfn-node">
+node
+</a>
+are
+collected
+in
+a
+single
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>
+and
+all
+<a class="tref internalDFN" title="blank-node" href="#dfn-blank-node">
+blank
+nodes
+</a>
+are
+labeled
+with
+a
+<a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">
+blank
+node
+identifier
+</a>.
+This
+may
+drastically
+simplify
+the
+code
+required
+to
+process
+JSON-LD
+data
+in
+certain
+applications.
+</p>
+<p>
+For
+example,
+assume
+the
+following
+JSON-LD
+input
+document:
+</p>
+ <div class="example"><div class="example-title"><span>Example 7</span>: Sample JSON-LD document</div><pre class="example">{
+ "@context": {
+ "name": "http://xmlns.com/foaf/0.1/name",
+ "knows": "http://xmlns.com/foaf/0.1/knows"
+ },
+ "@id": "http://me.markus-lanthaler.com/",
+ "name": "Markus Lanthaler",
+ "knows": [
+ {
+ "name": "Dave Longley"
+ }
+ ]
+}
+</pre>
+</div>
+<p>
+Running
+the
+<a href="#flattening-algorithm">
+Flattening
+algorithm
+</a>
+(
+<code class="idlMemberName">
+<a href="#widl-JsonLdProcessor-flatten-Promise-any-input-JsonLdContext-context-JsonLdOptions-options">
+flatten
+</a>
+</code>
+operation)
+with
+a
+context
+set
+to
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>
+to
+prevent
+compaction
+returns
+the
+following
+document:
+</p>
+ <div class="example"><div class="example-title"><span>Example 8</span>: Flattened sample document in expanded form</div><pre class="example">[
+ {
+ "@id": "_:t0",
+ "http://xmlns.com/foaf/0.1/name": [
+ { "@value": "Dave Longley" }
+ ]
+ },
+ {
+ "@id": "http://me.markus-lanthaler.com/",
+ "http://xmlns.com/foaf/0.1/name": [
+ { "@value": "Markus Lanthaler" }
+ ],
+ "http://xmlns.com/foaf/0.1/knows": [
+ { "@id": "_:t0" }
+ ]
+ }
+]
+</pre>
+</div>
+<p>
+Note
+how
+in
+the
+output
+above
+all
+properties
+of
+a
+<a class="tref internalDFN" title="node" href="#dfn-node">
+node
+</a>
+are
+collected
+in
+a
+single
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>
+and
+how
+the
+<a class="tref internalDFN" title="blank-node" href="#dfn-blank-node">
+blank
+node
+</a>
+representing
+"Dave
+Longley"
+has
+been
+assigned
+the
+<a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">
+blank
+node
+identifier
+</a>
+<code>
+_:t0
+</code>.
+</p>
+<p>
+To
+make
+it
+easier
+for
+humans
+to
+read
+or
+for
+certain
+applications
+to
+process
+it,
+a
+flattened
+document
+can
+be
+compacted
+by
+passing
+a
+context.
+Using
+the
+same
+context
+as
+the
+input
+document,
+the
+flattened
+and
+compacted
+document
+looks
+as
+follows:
+</p>
+ <div class="example"><div class="example-title"><span>Example 9</span>: Flattened and compacted sample document</div><pre class="example">{
+ "@context": {
+ "name": "http://xmlns.com/foaf/0.1/name",
+ "knows": "http://xmlns.com/foaf/0.1/knows"
+ },
+ "@graph": [
+ {
+ "@id": "_:t0",
+ "name": "Dave Longley"
+ },
+ {
+ "@id": "http://me.markus-lanthaler.com/",
+ "name": "Markus Lanthaler",
+ "knows": { "@id": "_:t0" }
+ }
+ ]
+}
+</pre>
+</div>
+<p>
+Please
+note
+that
+the
+result
+of
+flattening
+and
+compacting
+a
+document
+is
+always
+a
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>
+which
+contains
+an
+<code>
+@graph
+</code>
+member
+that
+represents
+the
+<a class="tref internalDFN" title="default-graph" href="#dfn-default-graph">
+default
+graph
+</a>.
+</p>
+</section>
+<section class="informative" id="rdf-serialization-deserialization">
+<h3>
+<span class="secno">
+2.4
+</span>
+RDF
+<del class="diff-old">Conversion
+</del>
+<ins class="diff-chg">Serialization/Deserialization
+</ins>
+</h3>
+<p>
+<em>
+This
+section
+is
+non-normative.
+</em>
+</p>
+<p>
+JSON-LD
+can
+be
+used
+to
+serialize
+<del class="diff-old">data
+expressed
+in
+</del>
+RDF
+<ins class="diff-new">data
+</ins>
+as
+described
+in
+[
+<cite>
+<a class="bibref" href="#bib-RDF11-CONCEPTS">
+RDF11-CONCEPTS
+</a>
+</cite>
+].
+This
+ensures
+that
+data
+can
+be
+round-tripped
+to
+and
+from
+any
+RDF
+syntax
+without
+any
+loss
+in
+fidelity.
+</p>
+<p>
+For
+example,
+assume
+the
+following
+RDF
+input
+serialized
+in
+Turtle
+[
+<cite>
+<a class="bibref" href="#bib-TURTLE">
+TURTLE
+</a>
+</cite>
+]:
+</p>
+ <div class="example"><div class="example-title"><span>Example 10</span>: Sample Turtle document</div><pre class="example"><http://me.markus-lanthaler.com/> <http://xmlns.com/foaf/0.1/name> "Markus Lanthaler" .
+<http://me.markus-lanthaler.com/>
+<http://xmlns.com/foaf/0.1/homepage>
+<http://www.markus-lanthaler.com/>
+.
+</pre>
+</div>
+<p>
+Using
+the
+<del class="diff-old">Convert
+from
+</del>
+<a href="#serialize-rdf-as-json-ld-algorithm">
+<ins class="diff-chg">Serialize
+</ins>
+RDF
+<ins class="diff-new">as
+JSON-LD
+</ins>
+algorithm
+</a>
+a
+developer
+could
+transform
+this
+document
+into
+expanded
+JSON-LD:
+</p>
+ <div class="example"><div class="example-title"><span>Example 11</span>: Sample Turtle document converted to JSON-LD</div><pre class="example">[
+ {
+ "@id": "http://me.markus-lanthaler.com/",
+ "http://xmlns.com/foaf/0.1/name": [
+ { "@value": "Markus Lanthaler" }
+ ],
+ "http://xmlns.com/foaf/0.1/homepage": [
+ { "@id": "http://www.markus-lanthaler.com/" }
+ ]
+ }
+]
+</pre>
+</div>
+<p>
+Note
+that
+the
+output
+above
+could
+easily
+be
+compacted
+using
+the
+technique
+outlined
+in
+the
+previous
+section.
+It
+is
+also
+possible
+to
+<del class="diff-old">transform
+</del>
+<ins class="diff-chg">deserialize
+</ins>
+the
+JSON-LD
+document
+back
+to
+RDF
+using
+the
+<del class="diff-old">Convert
+</del>
+<a href="#deserialize-json-ld-to-rdf-algorithm">
+<ins class="diff-chg">Deserialize
+JSON-LD
+</ins>
+to
+RDF
+algorithm
+</a>.
+</p>
+</section>
+</section>
+<section id="conformance">
+<h2>
+<span class="secno">
+3.
+</span>
+Conformance
+</h2>
+<p>
+All
+examples
+and
+notes
+as
+well
+as
+sections
+marked
+as
+non-normative
+in
+this
+specification
+are
+non-normative.
+Everything
+else
+in
+this
+specification
+is
+normative.
+</p>
+<p>
+The
+keywords
+<em class="rfc2119" title="MUST">
+MUST
+</em>,
+<em class="rfc2119" title="MUST NOT">
+MUST
+NOT
+</em>,
+<em class="rfc2119" title="REQUIRED">
+REQUIRED
+</em>,
+<em class="rfc2119" title="SHOULD">
+SHOULD
+</em>,
+<em class="rfc2119" title="SHOULD NOT">
+SHOULD
+NOT
+</em>,
+<em class="rfc2119" title="RECOMMENDED">
+RECOMMENDED
+</em>,
+<em class="rfc2119" title="MAY">
+MAY
+</em>,
+and
+<em class="rfc2119" title="OPTIONAL">
+OPTIONAL
+</em>
+in
+this
+specification
+are
+to
+be
+interpreted
+as
+described
+in
+[
+<cite>
+<a class="bibref" href="#bib-RFC2119">
+RFC2119
+</a>
+</cite>
+].
+</p>
+<p>
+There
+are
+three
+classes
+of
+products
+that
+can
+claim
+conformance
+to
+this
+specification:
+<a class="tref internalDFN" title="json-ld-processor" href="#dfn-json-ld-processor">
+JSON-LD
+Processors
+</a>,
+<a class="tref internalDFN" title="json-ld-api-implementation" href="#dfn-json-ld-api-implementation">
+JSON-LD
+API
+Implementations
+</a>,
+and
+<del class="diff-old">JSON-LD-RDF
+Converters
+</del>
+<a class="tref internalDFN" title="rdf-serializer/deserializer" href="#dfn-rdf-serializer/deserializer">
+<ins class="diff-chg">RDF
+Serializers/Deserializers
+</ins>
+</a>.
+</p>
+<p>
+A
+conforming
+<dfn title="json-ld-processor" id="dfn-json-ld-processor">
+JSON-LD
+Processor
+</dfn>
+is
+a
+system
+which
+can
+perform
+the
+<a href="#expansion-algorithm">
+Expansion
+</a>,
+<a href="#compaction-algorithm">
+Compaction
+</a>,
+and
+<a href="#flattening-algorithm">
+Flattening
+</a>
+operations
+defined
+in
+this
+specification.
+</p>
+<p>
+A
+conforming
+<dfn title="json-ld-api-implementation" id="dfn-json-ld-api-implementation">
+JSON-LD
+API
+Implementation
+</dfn>
+is
+a
+conforming
+<a class="tref internalDFN" title="json-ld-processor" href="#dfn-json-ld-processor">
+JSON-LD
+Processor
+</a>
+that
+exposes
+the
+<a href="#the-application-programming-interface">
+Application
+Programming
+Interface
+(API)
+</a>
+defined
+in
+this
+specification.
+It
+<em class="rfc2119" title="MUST">
+MUST
+</em>
+implement
+the
+<code>
+json-ld-1.0
+</code>
+processing
+mode
+(for
+further
+details,
+see
+the
+<code class="idlMemberName">
+<a href="#widl-JsonLdOptions-processingMode">
+processingMode
+</a>
+</code>
+option
+of
+<a href="#idl-def-JsonLdOptions" class="idlType">
+<code>
+JsonLdOptions
+</code>
+</a>
+).
+</p>
+<p>
+<a class="tref internalDFN" title="json-ld-processor" href="#dfn-json-ld-processor">
+JSON-LD
+Processors
+</a>
+and
+<a class="tref internalDFN" title="json-ld-api-implementation" href="#dfn-json-ld-api-implementation">
+API
+Implementations
+</a>
+<em class="rfc2119" title="MUST NOT">
+MUST
+NOT
+</em>
+attempt
+to
+correct
+malformed
+<a class="tref internalDFN" title="iri" href="#dfn-iri">
+IRIs
+</a>
+or
+language
+tags;
+however,
+they
+<em class="rfc2119" title="MAY">
+MAY
+</em>
+issue
+validation
+warnings.
+IRIs
+are
+not
+modified
+other
+than
+<del class="diff-old">converted
+</del>
+<ins class="diff-chg">conversion
+</ins>
+between
+<a class="tref internalDFN" title="relative-iri" href="#dfn-relative-iri">
+relative
+</a>
+and
+<a class="tref internalDFN" title="absolute-iri" href="#dfn-absolute-iri">
+absolute
+IRIs
+</a>.
+</p>
+<p>
+A
+conforming
+<del class="diff-old">JSON-LD-RDF
+Converter
+</del>
+<dfn title="rdf-serializer/deserializer" id="dfn-rdf-serializer/deserializer">
+<ins class="diff-chg">RDF
+Serializer/Deserializer
+</ins>
+</dfn>
+is
+a
+system
+that
+can
+<del class="diff-old">perform
+Conversion
+</del>
+<a href="#deserialize-json-ld-to-rdf-algorithm">
+<ins class="diff-chg">deserialize
+JSON-LD
+</ins>
+to
+RDF
+</a>
+and
+<del class="diff-old">Conversion
+from
+</del>
+<a href="#serialize-rdf-as-json-ld-algorithm">
+<ins class="diff-chg">serialize
+</ins>
+RDF
+<del class="diff-old">.
+</del>
+<ins class="diff-chg">as
+JSON-LD
+</ins></a><ins class="diff-chg">
+as
+defined
+in
+this
+specification.
+</ins>
+</p>
+<p>
+The
+algorithms
+in
+this
+specification
+are
+generally
+written
+with
+more
+concern
+for
+clarity
+than
+efficiency.
+Thus,
+<a class="tref internalDFN" title="json-ld-processor" href="#dfn-json-ld-processor">
+JSON-LD
+Processors
+</a>
+and
+<a class="tref internalDFN" title="json-ld-api-implementation" href="#dfn-json-ld-api-implementation">
+API
+Implementations
+</a>
+may
+implement
+the
+algorithms
+given
+in
+this
+specification
+in
+any
+way
+desired,
+so
+long
+as
+the
+end
+result
+is
+indistinguishable
+from
+the
+result
+that
+would
+be
+obtained
+by
+the
+specification's
+algorithms.
+</p>
+<div class="note">
+<div class="note-title" role="heading" aria-level="3">
+<span>
+Note
+</span>
+</div>
+<p class="">
+Implementers
+can
+partially
+check
+their
+level
+of
+conformance
+to
+this
+specification
+by
+successfully
+passing
+the
+test
+cases
+of
+the
+JSON-LD
+test
+suite
+[
+<cite>
+<a class="bibref" href="#bib-JSON-LD-TESTS">
+JSON-LD-TESTS
+</a>
+</cite>
+].
+Note,
+however,
+that
+passing
+all
+the
+tests
+in
+the
+test
+suite
+does
+not
+imply
+complete
+conformance
+to
+this
+specification.
+It
+only
+implies
+that
+the
+implementation
+conforms
+to
+aspects
+tested
+by
+the
+test
+suite.
+</p>
+</div>
+</section>
+<section id="general-terminology">
+<h2>
+<span class="secno">
+4.
+</span>
+General
+Terminology
+</h2>
+<p>
+This
+document
+uses
+the
+following
+terms
+as
+defined
+in
+JSON
+[
+<cite>
+<a class="bibref" href="#bib-RFC4627">
+RFC4627
+</a>
+</cite>
+].
+Refer
+to
+the
+<em>
+JSON
+Grammar
+</em>
+section
+in
+[
+<cite>
+<a class="bibref" href="#bib-RFC4627">
+RFC4627
+</a>
+</cite>
+]
+for
+formal
+definitions.
+</p>
+<dl>
+<dt>
+<dfn title="json-object" id="dfn-json-object">
+JSON
+object
+</dfn>
+</dt>
+<dd>
+An
+object
+structure
+is
+represented
+as
+a
+pair
+of
+curly
+brackets
+surrounding
+zero
+or
+more
+key-value
+pairs.
+A
+key
+is
+a
+<a class="tref internalDFN" title="string" href="#dfn-string">
+string
+</a>.
+A
+single
+colon
+comes
+after
+each
+key,
+separating
+the
+key
+from
+the
+value.
+A
+single
+comma
+separates
+a
+value
+from
+a
+following
+key.
+In
+contrast
+to
+JSON,
+in
+JSON-LD
+the
+keys
+in
+an
+object
+must
+be
+unique.
+</dd>
+<dt>
+<dfn title="array" id="dfn-array">
+array
+</dfn>
+</dt>
+<dd>
+An
+array
+structure
+is
+represented
+as
+square
+brackets
+surrounding
+zero
+or
+more
+values.
+Values
+are
+separated
+by
+commas.
+In
+JSON,
+an
+array
+is
+an
+<em>
+ordered
+</em>
+sequence
+of
+zero
+or
+more
+values.
+While
+JSON-LD
+uses
+the
+same
+array
+representation
+as
+JSON,
+the
+collection
+is
+<em>
+unordered
+</em>
+by
+default.
+While
+order
+is
+preserved
+in
+regular
+JSON
+arrays,
+it
+is
+not
+in
+regular
+JSON-LD
+arrays
+unless
+specifically
+defined
+(see
+<cite>
+<a href="http://www.w3.org/TR/2013/CR-json-ld-20130822/#sets-and-lists">
+Sets
+and
+Lists
+</a>
+</cite>
+in
+the
+JSON-LD
+specification
+[
+<cite>
+<a class="bibref" href="#bib-JSON-LD">
+JSON-LD
+</a>
+</cite>
+]).
+</dd>
+<dt>
+<dfn title="string" id="dfn-string">
+string
+</dfn>
+</dt>
+<dd>
+A
+string
+is
+a
+sequence
+of
+zero
+or
+more
+Unicode
+characters,
+wrapped
+in
+double
+quotes,
+using
+backslash
+escapes
+(if
+necessary).
+A
+character
+is
+represented
+as
+a
+single
+character
+string.
+</dd>
+<dt>
+<dfn title="number" id="dfn-number">
+number
+</dfn>
+</dt>
+<dd>
+A
+number
+is
+similar
+to
+that
+used
+in
+most
+programming
+languages,
+except
+that
+the
+octal
+and
+hexadecimal
+formats
+are
+not
+used
+and
+that
+leading
+zeros
+are
+not
+allowed.
+</dd>
+<dt>
+<dfn title="true" id="dfn-true">
+true
+</dfn>
+and
+<dfn title="false" id="dfn-false">
+false
+</dfn>
+</dt>
+<dd>
+Values
+that
+are
+used
+to
+express
+one
+of
+two
+possible
+boolean
+states.
+</dd>
+<dt>
+<dfn title="null" id="dfn-null">
+null
+</dfn>
+</dt>
+<dd>
+The
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>
+value.
+A
+key-value
+pair
+in
+the
+<code>
+@context
+</code>
+where
+the
+value,
+or
+the
+<code>
+@id
+</code>
+of
+the
+value,
+is
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>
+explicitly
+decouples
+a
+term's
+association
+with
+an
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>.
+A
+key-value
+pair
+in
+the
+body
+of
+a
+JSON-LD
+document
+whose
+value
+is
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>
+has
+the
+same
+meaning
+as
+if
+the
+key-value
+pair
+was
+not
+defined.
+If
+<code>
+@value
+</code>,
+<code>
+@list
+</code>,
+or
+<code>
+@set
+</code>
+is
+set
+to
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>
+in
+expanded
+form,
+then
+the
+entire
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>
+is
+ignored.
+</dd>
+</dl>
+<p>
+Furthermore,
+the
+following
+terminology
+is
+used
+throughout
+this
+document:
+</p>
+<dl>
+<dt>
+<dfn title="keyword" id="dfn-keyword">
+keyword
+</dfn>
+</dt>
+<dd>
+A
+JSON
+key
+that
+is
+specific
+to
+JSON-LD,
+specified
+in
+the
+section
+<cite>
+<a href="http://www.w3.org/TR/2013/CR-json-ld-20130822/#syntax-tokens-and-keywords">
+Syntax
+Tokens
+and
+Keywords
+</a>
+</cite>
+of
+the
+JSON-LD
+specification
+[
+<cite>
+<a class="bibref" href="#bib-JSON-LD">
+JSON-LD
+</a>
+</cite>
+].
+</dd>
+<dt>
+<dfn title="context" id="dfn-context">
+context
+</dfn>
+</dt>
+<dd>
+A
+set
+of
+rules
+for
+interpreting
+a
+JSON-LD
+document
+as
+specified
+in
+the
+section
+<cite>
+<a href="http://www.w3.org/TR/2013/CR-json-ld-20130822/#the-context">
+The
+Context
+</a>
+</cite>
+of
+the
+JSON-LD
+specification
+[
+<cite>
+<a class="bibref" href="#bib-JSON-LD">
+JSON-LD
+</a>
+</cite>
+].
+</dd>
+<dt>
+<dfn title="json-ld-document" id="dfn-json-ld-document">
+JSON-LD
+document
+</dfn>
+</dt>
+<dd>
+A
+<a class="tref internalDFN" title="json-ld-document" href="#dfn-json-ld-document">
+JSON-LD
+document
+</a>
+is
+a
+serialization
+of
+a
+collection
+of
+<del class="diff-old">JSON-LD
+</del>
+<a class="tref internalDFN" title="graph" href="#dfn-graph">
+graphs
+</a>
+and
+comprises
+exactly
+one
+<a class="tref internalDFN" title="default-graph" href="#dfn-default-graph">
+default
+graph
+</a>
+and
+zero
+or
+more
+<a class="tref internalDFN" title="named-graph" href="#dfn-named-graph">
+named
+graphs
+</a>.
+</dd>
+<dt>
+<dfn title="named-graph" id="dfn-named-graph">
+named
+graph
+</dfn>
+</dt>
+<dd>
+A
+named
+graph
+is
+a
+pair
+consisting
+of
+an
+<a class="tref internalDFN" title="iri" href="#dfn-iri">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+or
+<a class="tref internalDFN" title="blank-node" href="#dfn-blank-node">
+blank
+node
+</a>
+(the
+<dfn title="graph-name" id="dfn-graph-name">
+graph
+name
+</dfn>
+)
+and
+a
+<del class="diff-old">JSON-LD
+</del>
+<a class="tref internalDFN" title="graph" href="#dfn-graph">
+graph
+</a>.
+</dd>
+<dt>
+<dfn title="default-graph" id="dfn-default-graph">
+default
+graph
+</dfn>
+</dt>
+<dd>
+The
+default
+graph
+is
+the
+only
+graph
+in
+a
+JSON-LD
+document
+which
+has
+no
+<a class="tref internalDFN" title="graph-name" href="#dfn-graph-name">
+graph
+name
+</a>.
+</dd>
+<dt>
+<del class="diff-old">JSON-LD
+graph
+</del>
+<dfn title="graph" id="dfn-graph">
+<ins class="diff-chg">Graph
+</ins>
+</dfn>
+</dt>
+<dd>
+A
+labeled
+directed
+graph,
+i.e.,
+a
+set
+of
+<a class="tref internalDFN" title="node" href="#dfn-node">
+nodes
+</a>
+connected
+by
+<a class="tref internalDFN" title="edge" href="#dfn-edge">
+edges
+</a>,
+as
+specified
+in
+the
+<cite>
+<a href="http://www.w3.org/TR/2013/CR-json-ld-20130822/#data-model">
+Data
+Model
+</a>
+</cite>
+section
+of
+the
+JSON-LD
+specification
+[
+<cite>
+<a class="bibref" href="#bib-JSON-LD">
+JSON-LD
+</a>
+</cite>
+].
+</dd>
+<dt>
+<dfn title="edge" id="dfn-edge">
+edge
+</dfn>
+</dt>
+<dd>
+Every
+<a class="tref internalDFN" title="edge" href="#dfn-edge">
+edge
+</a>
+has
+a
+direction
+associated
+with
+it
+and
+is
+labeled
+with
+an
+<a class="tref internalDFN" title="iri" href="#dfn-iri">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+or
+a
+<a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">
+blank
+node
+identifier
+</a>.
+Within
+the
+JSON-LD
+syntax
+these
+edge
+labels
+are
+called
+<dfn title="property" id="dfn-property">
+properties
+</dfn>.
+Whenever
+possible,
+an
+<a class="tref internalDFN" title="edge" href="#dfn-edge">
+edge
+</a>
+should
+be
+labeled
+with
+an
+<a class="tref internalDFN" title="iri" href="#dfn-iri">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>.
+</dd>
+<dt>
+<dfn title="node" id="dfn-node">
+node
+</dfn>
+</dt>
+<dd>
+Every
+<a class="tref internalDFN" title="node" href="#dfn-node">
+node
+</a>
+is
+an
+<a class="tref internalDFN" title="iri" href="#dfn-iri">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>,
+a
+<a class="tref internalDFN" title="blank-node" href="#dfn-blank-node">
+blank
+node
+</a>,
+a
+<a class="tref internalDFN" title="json-ld-value" href="#dfn-json-ld-value">
+JSON-LD
+value
+</a>,
+or
+a
+<a class="tref internalDFN" title="list" href="#dfn-list">
+list
+</a>.
+</dd>
+<dt>
+<dfn title="iri" id="dfn-iri">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</dfn>
+</dt>
+<dd>
+An
+<a class="tref internalDFN" title="iri" href="#dfn-iri">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+(Internationalized
+Resource
+Identifier)
+is
+a
+string
+that
+conforms
+to
+the
+syntax
+defined
+in
+[
+<cite>
+<a class="bibref" href="#bib-RFC3987">
+RFC3987
+</a>
+</cite>
+].
+</dd>
+<dt>
+<dfn title="absolute-iri" id="dfn-absolute-iri">
+absolute
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</dfn>
+</dt>
+<dd>
+An
+absolute
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+is
+defined
+in
+[
+<cite>
+<a class="bibref" href="#bib-RFC3987">
+RFC3987
+</a>
+</cite>
+]
+containing
+a
+<em>
+scheme
+</em>
+along
+with
+a
+<em>
+path
+</em>
+and
+optional
+<em>
+query
+</em>
+and
+fragment
+segments.
+</dd>
+<dt>
+<dfn title="relative-iri" id="dfn-relative-iri">
+relative
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</dfn>
+</dt>
+<dd>
+A
+relative
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+is
+an
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+that
+is
+relative
+<ins class="diff-new">to
+</ins>
+some
+other
+<a class="tref internalDFN" title="absolute-iri" href="#dfn-absolute-iri">
+absolute
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+<del class="diff-old">;
+in
+the
+case
+of
+JSON-LD
+this
+is
+the
+base
+location
+of
+the
+document.
+</del>
+</a>.
+</dd>
+<dt>
+<dfn title="blank-node" id="dfn-blank-node">
+blank
+node
+</dfn>
+</dt>
+<dd>
+A
+<a class="tref internalDFN" title="node" href="#dfn-node">
+node
+</a>
+in
+a
+<del class="diff-old">JSON-LD
+</del>
+<a class="tref internalDFN" title="graph" href="#dfn-graph">
+graph
+</a>
+that
+is
+neither
+an
+<a class="tref internalDFN" title="iri" href="#dfn-iri">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>,
+nor
+a
+<a class="tref internalDFN" title="json-ld-value" href="#dfn-json-ld-value">
+JSON-LD
+value
+</a>,
+nor
+a
+<a class="tref internalDFN" title="list" href="#dfn-list">
+list
+</a>.
+</dd>
+<dt>
+<dfn title="blank-node-identifier" id="dfn-blank-node-identifier">
+blank
+node
+identifier
+</dfn>
+</dt>
+<dd>
+A
+blank
+node
+identifier
+is
+a
+string
+that
+can
+be
+used
+as
+an
+identifier
+for
+a
+<a class="tref internalDFN" title="blank-node" href="#dfn-blank-node">
+blank
+node
+</a>
+within
+the
+scope
+of
+a
+JSON-LD
+document.
+Blank
+node
+identifiers
+begin
+with
+<code>
+_:
+</code>.
+</dd>
+<dt>
+<dfn title="json-ld-value" id="dfn-json-ld-value">
+JSON-LD
+value
+</dfn>
+</dt>
+<dd>
+A
+<a class="tref internalDFN" title="json-ld-value" href="#dfn-json-ld-value">
+JSON-LD
+value
+</a>
+is
+a
+<a class="tref internalDFN" title="string" href="#dfn-string">
+string
+</a>,
+a
+<a class="tref internalDFN" title="number" href="#dfn-number">
+number
+</a>,
+<a class="tref internalDFN" title="true" href="#dfn-true">
+true
+</a>
+or
+<a class="tref internalDFN" title="false" href="#dfn-false">
+false
+</a>,
+a
+<a class="tref internalDFN" title="typed-value" href="#dfn-typed-value">
+typed
+value
+</a>,
+or
+a
+<a class="tref internalDFN" title="language-tagged-string" href="#dfn-language-tagged-string">
+language-tagged
+string
+</a>.
+</dd>
+<dt>
+<dfn title="typed-value" id="dfn-typed-value">
+typed
+value
+</dfn>
+</dt>
+<dd>
+A
+<a class="tref internalDFN" title="typed-value" href="#dfn-typed-value">
+typed
+value
+</a>
+consists
+of
+a
+value,
+which
+is
+a
+string,
+and
+a
+type,
+which
+is
+an
+<a class="tref internalDFN" title="iri" href="#dfn-iri">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>.
+</dd>
+<dt>
+<dfn title="language-tagged-string" id="dfn-language-tagged-string">
+language-tagged
+string
+</dfn>
+</dt>
+<dd>
+A
+<a class="tref internalDFN" title="language-tagged-string" href="#dfn-language-tagged-string">
+language-tagged
+string
+</a>
+consists
+of
+a
+string
+and
+a
+non-empty
+language
+tag
+as
+defined
+by
+[
+<cite>
+<a class="bibref" href="#bib-BCP47">
+BCP47
+</a>
+</cite>
+].
+The
+language
+tag
+must
+be
+well-formed
+according
+to
+<a href="http://tools.ietf.org/html/bcp47#section-2.2.9">
+section
+2.2.9
+Classes
+of
+Conformance
+</a>
+of
+[
+<cite>
+<a class="bibref" href="#bib-BCP47">
+BCP47
+</a>
+</cite>
+],
+and
+is
+normalized
+to
+lowercase.
+</dd>
+<dt>
+<dfn title="list" id="dfn-list">
+list
+</dfn>
+</dt>
+<dd>
+A
+<a class="tref internalDFN" title="list" href="#dfn-list">
+list
+</a>
+is
+an
+ordered
+sequence
+of
+<a class="tref internalDFN" title="iri" href="#dfn-iri">
+IRIs
+</a>,
+<a class="tref internalDFN" title="blank-node" href="#dfn-blank-node">
+blank
+nodes
+</a>,
+and
+<a class="tref internalDFN" title="json-ld-value" href="#dfn-json-ld-value">
+JSON-LD
+values
+</a>.
+</dd>
+</dl>
+</section>
+<section id="algorithm-terms">
+<h2>
+<span class="secno">
+5.
+</span>
+Algorithm
+Terms
+</h2>
+<dl>
+<dt>
+<dfn title="active-graph" id="dfn-active-graph">
+active
+graph
+</dfn>
+</dt>
+<dd>
+The
+name
+of
+the
+currently
+active
+graph
+that
+the
+processor
+should
+use
+when
+processing.
+</dd>
+<dt>
+<dfn title="active-subject" id="dfn-active-subject">
+active
+subject
+</dfn>
+</dt>
+<dd>
+The
+currently
+active
+subject
+that
+the
+processor
+should
+use
+when
+processing.
+</dd>
+<dt>
+<dfn title="active-property" id="dfn-active-property">
+active
+property
+</dfn>
+</dt>
+<dd>
+The
+currently
+active
+<a class="tref internalDFN" title="property" href="#dfn-property">
+property
+</a>
+or
+<a class="tref internalDFN" title="keyword" href="#dfn-keyword">
+keyword
+</a>
+that
+the
+processor
+should
+use
+when
+processing.
+</dd>
+<dt>
+<dfn title="active-context" id="dfn-active-context">
+active
+context
+</dfn>
+</dt>
+<dd>
+A
+context
+that
+is
+used
+to
+resolve
+<a class="tref internalDFN" title="term" href="#dfn-term">
+terms
+</a>
+while
+the
+processing
+algorithm
+is
+running.
+</dd>
+<dt>
+<dfn title="local-context" id="dfn-local-context">
+local
+context
+</dfn>
+</dt>
+<dd>
+A
+context
+that
+is
+specified
+within
+a
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>,
+specified
+via
+the
+<code>
+@context
+</code>
+<a class="tref internalDFN" title="keyword" href="#dfn-keyword">
+keyword
+</a>.
+</dd>
+<dt>
+<dfn title="json-ld-input" id="dfn-json-ld-input">
+JSON-LD
+input
+</dfn>
+</dt>
+<dd>
+The
+JSON-LD
+data
+structure
+that
+is
+provided
+as
+input
+to
+the
+algorithm.
+</dd>
+<dt>
+<dfn title="term" id="dfn-term">
+term
+</dfn>
+</dt>
+<dd>
+A
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term
+</a>
+is
+a
+short
+word
+defined
+in
+a
+context
+that
+may
+be
+expanded
+to
+an
+<a class="tref internalDFN" title="iri" href="#dfn-iri">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+</dd>
+<dt>
+<dfn title="compact-iri" id="dfn-compact-iri">
+compact
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</dfn>
+</dt>
+<dd>
+A
+compact
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+has
+the
+form
+of
+<dfn title="prefix" id="dfn-prefix">
+prefix
+</dfn>:
+<em>
+suffix
+</em>
+and
+is
+used
+as
+a
+way
+of
+expressing
+an
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+without
+needing
+to
+define
+separate
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term
+</a>
+definitions
+for
+each
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+contained
+within
+a
+common
+vocabulary
+identified
+by
+<a class="tref internalDFN" title="prefix" href="#dfn-prefix">
+prefix
+</a>.
+</dd>
+<dt>
+<dfn title="node-object" id="dfn-node-object">
+node
+object
+</dfn>
+</dt>
+<dd>
+A
+<a class="tref internalDFN" title="node-object" href="#dfn-node-object">
+node
+object
+</a>
+represents
+zero
+or
+more
+properties
+of
+a
+<a class="tref internalDFN" title="node" href="#dfn-node">
+node
+</a>
+in
+the
+<del class="diff-old">JSON-LD
+</del>
+<a class="tref internalDFN" title="graph" href="#dfn-graph">
+graph
+</a>
+serialized
+by
+the
+JSON-LD
+document.
+A
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>
+is
+a
+<a class="tref internalDFN" title="node-object" href="#dfn-node-object">
+node
+object
+</a>
+if
+it
+exists
+outside
+of
+the
+JSON-LD
+<a class="tref internalDFN" title="context" href="#dfn-context">
+context
+</a>
+and:
+<ul>
+<li>
+it
+does
+not
+contain
+the
+<code>
+@value
+</code>,
+<code>
+@list
+</code>,
+or
+<code>
+@set
+</code>
+keywords,
+or
+</li>
+<li>
+it
+is
+not
+the
+top-most
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>
+in
+the
+JSON-LD
+document
+consisting
+of
+no
+other
+members
+than
+<code>
+@graph
+</code>
+and
+<code>
+@context
+</code>.
+</li>
+</ul>
+</dd>
+<dt>
+<dfn title="value-object" id="dfn-value-object">
+value
+object
+</dfn>
+</dt>
+<dd>
+A
+<a class="tref internalDFN" title="value-object" href="#dfn-value-object">
+value
+object
+</a>
+is
+a
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>
+that
+has
+an
+<code>
+@value
+</code>
+member.
+</dd>
+<dt>
+<dfn title="list-object" id="dfn-list-object">
+list
+object
+</dfn>
+</dt>
+<dd>
+A
+<a class="tref internalDFN" title="list-object" href="#dfn-list-object">
+list
+object
+</a>
+is
+a
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>
+that
+has
+an
+<code>
+@list
+</code>
+member.
+</dd>
+<dt>
+<dfn title="set-object" id="dfn-set-object">
+set
+object
+</dfn>
+</dt>
+<dd>
+A
+<a class="tref internalDFN" title="set-object" href="#dfn-set-object">
+set
+object
+</a>
+is
+a
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>
+that
+has
+an
+<code>
+@set
+</code>
+member.
+</dd>
+<dt>
+<dfn title="scalar" id="dfn-scalar">
+scalar
+</dfn>
+</dt>
+<dd>
+A
+scalar
+is
+either
+a
+JSON
+<a class="tref internalDFN" title="string" href="#dfn-string">
+string
+</a>,
+<a class="tref internalDFN" title="number" href="#dfn-number">
+number
+</a>,
+<a class="tref internalDFN" title="true" href="#dfn-true">
+true
+</a>,
+or
+<a class="tref internalDFN" title="false" href="#dfn-false">
+false
+</a>.
+</dd>
+<dt>
+<dfn title="rdf-subject" id="dfn-rdf-subject">
+RDF
+subject
+</dfn>
+</dt>
+<dd>
+A
+<a class="tref externalDFN" title="subject" href="http://www.w3.org/TR/rdf11-concepts/#dfn-subject">
+subject
+</a>
+as
+specified
+by
+[
+<cite>
+<a class="bibref" href="#bib-RDF11-CONCEPTS">
+RDF11-CONCEPTS
+</a>
+</cite>
+].
+</dd>
+<dt>
+<dfn title="rdf-predicate" id="dfn-rdf-predicate">
+RDF
+predicate
+</dfn>
+</dt>
+<dd>
+A
+<a class="tref externalDFN" title="predicate" href="http://www.w3.org/TR/rdf11-concepts/#dfn-predicate">
+predicate
+</a>
+as
+specified
+by
+[
+<cite>
+<a class="bibref" href="#bib-RDF11-CONCEPTS">
+RDF11-CONCEPTS
+</a>
+</cite>
+].
+</dd>
+<dt>
+<dfn title="rdf-object" id="dfn-rdf-object">
+RDF
+object
+</dfn>
+</dt>
+<dd>
+An
+<a class="tref externalDFN" title="object" href="http://www.w3.org/TR/rdf11-concepts/#dfn-object">
+object
+</a>
+as
+specified
+by
+[
+<cite>
+<a class="bibref" href="#bib-RDF11-CONCEPTS">
+RDF11-CONCEPTS
+</a>
+</cite>
+].
+</dd>
+<dt>
+<dfn title="rdf-triple" id="dfn-rdf-triple">
+RDF
+triple
+</dfn>
+</dt>
+<dd>
+A
+<a class="tref externalDFN" title="triple" href="http://www.w3.org/TR/rdf11-concepts/#dfn-rdf-triple">
+triple
+</a>
+as
+specified
+by
+[
+<cite>
+<a class="bibref" href="#bib-RDF11-CONCEPTS">
+RDF11-CONCEPTS
+</a>
+</cite>
+].
+</dd>
+<dt>
+<dfn title="rdf-dataset" id="dfn-rdf-dataset">
+RDF
+dataset
+</dfn>
+</dt>
+<dd>
+A
+<a class="tref externalDFN" title="dataset" href="http://www.w3.org/TR/rdf11-concepts/#dfn-rdf-dataset">
+dataset
+</a>
+as
+specified
+by
+[
+<cite>
+<a class="bibref" href="#bib-RDF11-CONCEPTS">
+RDF11-CONCEPTS
+</a>
+</cite>
+]
+representing
+a
+collection
+of
+<a class="tref externalDFN" title="rdf-graphs" href="http://www.w3.org/TR/rdf11-concepts/#dfn-rdf-graph">
+RDF
+graphs
+</a>.
+</dd>
+</dl>
+</section>
+<section id="context-processing-algorithms">
+<h2>
+<span class="secno">
+6.
+</span>
+Context
+Processing
+Algorithms
+</h2>
+<section id="context-processing-algorithm">
+<h3>
+<span class="secno">
+6.1
+</span>
+Context
+Processing
+Algorithm
+</h3>
+<p>
+When
+processing
+a
+JSON-LD
+data
+structure,
+each
+processing
+rule
+is
+applied
+using
+information
+provided
+by
+the
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>.
+This
+section
+describes
+how
+to
+produce
+an
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>.
+</p>
+<p>
+The
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>
+contains
+the
+active
+<dfn title="term-definition" id="dfn-term-definition">
+term
+definitions
+</dfn>
+which
+specify
+how
+properties
+and
+values
+have
+to
+be
+interpreted
+as
+well
+as
+the
+current
+<dfn title="base-iri" id="dfn-base-iri">
+base
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</dfn>,
+the
+<dfn title="vocabulary-mapping" id="dfn-vocabulary-mapping">
+vocabulary
+mapping
+</dfn>
+and
+the
+<dfn title="default-language" id="dfn-default-language">
+default
+language
+</dfn>.
+Each
+<a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">
+term
+definition
+</a>
+consists
+of
+an
+<dfn title="iri-mapping" id="dfn-iri-mapping">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+mapping
+</dfn>,
+a
+boolean
+flag
+<dfn title="reverse-property" id="dfn-reverse-property">
+reverse
+property
+</dfn>,
+an
+optional
+<dfn title="type-mapping" id="dfn-type-mapping">
+type
+mapping
+</dfn>
+or
+<dfn title="language-mapping" id="dfn-language-mapping">
+language
+mapping
+</dfn>,
+and
+an
+optional
+<dfn title="container-mapping" id="dfn-container-mapping">
+container
+mapping
+</dfn>.
+A
+<a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">
+term
+definition
+</a>
+can
+not
+only
+be
+used
+to
+map
+a
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term
+</a>
+to
+an
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>,
+but
+also
+to
+map
+a
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term
+</a>
+to
+a
+<a class="tref internalDFN" title="keyword" href="#dfn-keyword">
+keyword
+</a>,
+in
+which
+case
+it
+is
+referred
+to
+as
+a
+<dfn title="keyword-alias" id="dfn-keyword-alias">
+keyword
+alias
+</dfn>.
+</p>
+<p>
+When
+processing,
+the
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>
+is
+initialized
+without
+any
+<a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">
+term
+definitions
+</a>,
+<a class="tref internalDFN" title="vocabulary-mapping" href="#dfn-vocabulary-mapping">
+vocabulary
+mapping
+</a>,
+or
+<a class="tref internalDFN" title="default-language" href="#dfn-default-language">
+default
+language
+</a>.
+If
+a
+<a class="tref internalDFN" title="local-context" href="#dfn-local-context">
+local
+context
+</a>
+is
+encountered
+during
+processing,
+a
+new
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>
+is
+created
+by
+cloning
+the
+existing
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>.
+Then
+the
+information
+from
+the
+<a class="tref internalDFN" title="local-context" href="#dfn-local-context">
+local
+context
+</a>
+is
+merged
+into
+the
+new
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>.
+Given
+that
+<a class="tref internalDFN" title="local-context" href="#dfn-local-context">
+local
+contexts
+</a>
+may
+contain
+references
+to
+remote
+contexts,
+this
+includes
+their
+retrieval.
+</p>
+<section class="informative">
+<h4 id="overview">
+Overview
+</h4>
+<p>
+<em>
+This
+section
+is
+non-normative.
+</em>
+</p>
+<p>
+First
+we
+prepare
+a
+new
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>
+<i>
+result
+</i>
+by
+cloning
+the
+current
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>.
+Then
+we
+normalize
+the
+form
+of
+the
+passed
+<a class="tref internalDFN" title="local-context" href="#dfn-local-context">
+local
+context
+</a>
+to
+an
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>.
+<a class="tref internalDFN" title="local-context" href="#dfn-local-context">
+Local
+contexts
+</a>
+may
+be
+in
+the
+form
+of
+a
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>,
+a
+<a class="tref internalDFN" title="string" href="#dfn-string">
+string
+</a>,
+or
+an
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>
+containing
+a
+combination
+of
+the
+two.
+Finally
+we
+process
+each
+<a class="tref internalDFN" title="context" href="#dfn-context">
+context
+</a>
+contained
+in
+the
+<a class="tref internalDFN" title="local-context" href="#dfn-local-context">
+local
+context
+</a>
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>
+as
+follows.
+</p>
+<p>
+If
+<a class="tref internalDFN" title="context" href="#dfn-context">
+context
+</a>
+is
+a
+<a class="tref internalDFN" title="string" href="#dfn-string">
+string
+</a>,
+it
+represents
+a
+reference
+to
+a
+remote
+context.
+We
+dereference
+the
+remote
+context
+and
+replace
+<a class="tref internalDFN" title="context" href="#dfn-context">
+context
+</a>
+with
+the
+value
+of
+the
+<code>
+@context
+</code>
+key
+of
+the
+top-level
+object
+in
+the
+retrieved
+JSON-LD
+document.
+If
+there's
+no
+such
+key,
+an
+invalid
+remote
+context
+has
+been
+detected.
+Otherwise,
+we
+process
+<a class="tref internalDFN" title="context" href="#dfn-context">
+context
+</a>
+by
+recursively
+using
+this
+algorithm
+ensuring
+that
+there
+is
+no
+cyclical
+reference.
+</p>
+<p>
+If
+<a class="tref internalDFN" title="context" href="#dfn-context">
+context
+</a>
+is
+a
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>,
+we
+first
+update
+the
+<a class="tref internalDFN" title="base-iri" href="#dfn-base-iri">
+base
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>,
+the
+<a class="tref internalDFN" title="vocabulary-mapping" href="#dfn-vocabulary-mapping">
+vocabulary
+mapping
+</a>,
+and
+the
+<a class="tref internalDFN" title="default-language" href="#dfn-default-language">
+default
+language
+</a>
+by
+processing
+three
+specific
+keywords:
+<code>
+@base
+</code>,
+<code>
+@vocab
+</code>,
+and
+<code>
+@language
+</code>.
+These
+are
+handled
+before
+any
+other
+keys
+in
+the
+<a class="tref internalDFN" title="local-context" href="#dfn-local-context">
+local
+context
+</a>
+because
+they
+affect
+how
+the
+other
+keys
+are
+processed.
+Please
+note
+that
+<code>
+@base
+</code>
+is
+ignored
+when
+processing
+remote
+contexts.
+</p>
+<p>
+Then,
+for
+every
+other
+key
+in
+<a class="tref internalDFN" title="local-context" href="#dfn-local-context">
+local
+context
+</a>,
+we
+update
+the
+<a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">
+term
+definition
+</a>
+in
+<i>
+result
+</i>.
+Since
+<a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">
+term
+definitions
+</a>
+in
+a
+<a class="tref internalDFN" title="local-context" href="#dfn-local-context">
+local
+context
+</a>
+may
+themselves
+contain
+<a class="tref internalDFN" title="term" href="#dfn-term">
+terms
+</a>
+or
+<a class="tref internalDFN" title="compact-iri" href="#dfn-compact-iri">
+compact
+IRIs
+</a>,
+we
+may
+need
+to
+recurse.
+When
+doing
+so,
+we
+must
+ensure
+that
+there
+is
+no
+cyclical
+dependency,
+which
+is
+an
+error.
+After
+we
+have
+processed
+any
+<a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">
+term
+definition
+</a>
+dependencies,
+we
+update
+the
+current
+<a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">
+term
+definition
+</a>,
+which
+may
+be
+a
+<a class="tref internalDFN" title="keyword-alias" href="#dfn-keyword-alias">
+keyword
+alias
+</a>.
+</p>
+<p>
+Finally,
+we
+return
+<i>
+result
+</i>
+as
+the
+new
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>.
+</p>
+</section>
+<section>
+<h4 id="algorithm">
+Algorithm
+</h4>
+<p>
+This
+algorithm
+specifies
+how
+a
+new
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>
+is
+updated
+with
+a
+<a class="tref internalDFN" title="local-context" href="#dfn-local-context">
+local
+context
+</a>.
+The
+algorithm
+takes
+three
+input
+variables:
+an
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>,
+a
+<a class="tref internalDFN" title="local-context" href="#dfn-local-context">
+local
+context
+</a>,
+and
+an
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>
+<i>
+remote
+contexts
+</i>
+which
+is
+used
+to
+detect
+cyclical
+context
+inclusions.
+If
+<i>
+remote
+contexts
+</i>
+is
+not
+passed,
+it
+is
+initialized
+to
+an
+empty
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>.
+</p>
+<ol class="algorithm">
+<li>
+Initialize
+<i>
+result
+</i>
+to
+the
+result
+of
+cloning
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>.
+</li>
+<li>
+If
+<a class="tref internalDFN" title="local-context" href="#dfn-local-context">
+local
+context
+</a>
+is
+not
+an
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>,
+set
+it
+to
+an
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>
+containing
+only
+<a class="tref internalDFN" title="local-context" href="#dfn-local-context">
+local
+context
+</a>.
+</li>
+<li>
+For
+each
+item
+<i>
+context
+</i>
+in
+<a class="tref internalDFN" title="local-context" href="#dfn-local-context">
+local
+context
+</a>:
+<ol class="algorithm">
+<li>
+If
+<i>
+context
+</i>
+is
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>,
+set
+<i>
+result
+</i>
+to
+a
+newly-initialized
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>
+and
+continue
+with
+the
+next
+<i>
+context
+</i>.
+The
+<a class="tref internalDFN" title="base-iri" href="#dfn-base-iri">
+base
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+of
+the
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>
+is
+set
+to
+the
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+of
+the
+currently
+being
+processed
+document
+(which
+might
+be
+different
+from
+the
+currently
+being
+processed
+context),
+if
+available;
+otherwise
+to
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>.
+If
+set,
+the
+<code class="idlMemberName">
+<del class="diff-old">compactArrays
+</del>
+<a href="#widl-JsonLdOptions-base">
+<ins class="diff-chg">base
+</ins>
+</a>
+</code>
+option
+of
+a
+<a class="tref internalDFN" title="json-ld-api-implementation" href="#dfn-json-ld-api-implementation">
+JSON-LD
+API
+Implementation
+</a>
+overrides
+the
+<a class="tref internalDFN" title="base-iri" href="#dfn-base-iri">
+base
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>.
+</li>
+<li>
+If
+<i>
+context
+</i>
+is
+a
+<a class="tref internalDFN" title="string" href="#dfn-string">
+string
+</a>,
+<ol class="algorithm">
+<li>
+Set
+<i>
+context
+</i>
+to
+the
+result
+of
+resolving
+<i>
+value
+</i>
+against
+the
+base
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+which
+is
+established
+as
+specified
+in
+<cite>
+<a href="http://tools.ietf.org/html/rfc3986#section-5.1">
+section
+5.1
+Establishing
+a
+Base
+URI
+</a>
+</cite>
+of
+[
+<cite>
+<a class="bibref" href="#bib-RFC3986">
+RFC3986
+</a>
+</cite>
+].
+Only
+the
+basic
+algorithm
+in
+<cite>
+<a href="http://tools.ietf.org/html/rfc3986#section-5.2">
+section
+5.2
+</a>
+</cite>
+of
+[
+<cite>
+<a class="bibref" href="#bib-RFC3986">
+RFC3986
+</a>
+</cite>
+]
+is
+used;
+neither
+<cite>
+<a href="http://tools.ietf.org/html/rfc3986#section-6.2.2">
+Syntax-Based
+Normalization
+</a>
+</cite>
+nor
+<cite>
+<a href="http://tools.ietf.org/html/rfc3986#section-6.2.3">
+Scheme-Based
+Normalization
+</a>
+</cite>
+are
+performed.
+Characters
+additionally
+allowed
+in
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+references
+are
+treated
+in
+the
+same
+way
+that
+unreserved
+characters
+are
+treated
+in
+URI
+references,
+per
+<cite>
+<a href="http://tools.ietf.org/html/rfc3987#section-6.5">
+section
+6.5
+</a>
+</cite>
+of
+[
+<cite>
+<a class="bibref" href="#bib-RFC3987">
+RFC3987
+</a>
+</cite>
+].
+</li>
+<li>
+If
+<i>
+context
+</i>
+is
+in
+the
+<i>
+remote
+contexts
+</i>
+array,
+a
+<code class="error">
+<a href="#idl-def-JsonLdErrorCode.recursive-context-inclusion">
+recursive
+context
+inclusion
+</a>
+</code>
+error
+has
+been
+detected
+and
+processing
+is
+aborted;
+otherwise,
+add
+<i>
+context
+</i>
+to
+<i>
+remote
+contexts
+</i>.
+</li>
+<li>
+Dereference
+<i>
+context
+</i>.
+If
+<i>
+context
+</i>
+cannot
+be
+dereferenced,
+a
+<code class="error">
+<a href="#idl-def-JsonLdErrorCode.loading-remote-context-failed">
+loading
+remote
+context
+failed
+</a>
+</code>
+error
+has
+been
+detected
+and
+processing
+is
+aborted.
+If
+the
+dereferenced
+document
+has
+no
+top-level
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>
+with
+an
+<code>
+@context
+</code>
+member,
+an
+<code class="error">
+<a href="#idl-def-JsonLdErrorCode.invalid-remote-context">
+invalid
+remote
+context
+</a>
+</code>
+has
+been
+detected
+and
+processing
+is
+aborted;
+otherwise,
+set
+<i>
+context
+</i>
+to
+the
+value
+of
+that
+member.
+</li>
+<li>
+Set
+<i>
+result
+</i>
+to
+the
+result
+of
+recursively
+calling
+this
+algorithm,
+passing
+<i>
+result
+</i>
+for
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>,
+<i>
+context
+</i>
+for
+<a class="tref internalDFN" title="local-context" href="#dfn-local-context">
+local
+context
+</a>,
+and
+<i>
+remote
+contexts
+</i>.
+</li>
+<li>
+Continue
+with
+the
+next
+<i>
+context
+</i>.
+</li>
+</ol>
+</li>
+<li>
+If
+<i>
+context
+</i>
+is
+not
+a
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>,
+an
+<code class="error">
+<a href="#idl-def-JsonLdErrorCode.invalid-local-context">
+invalid
+local
+context
+</a>
+</code>
+error
+has
+been
+detected
+and
+processing
+is
+aborted.
+</li>
+<li>
+If
+<i>
+context
+</i>
+has
+an
+<code>
+@base
+</code>
+key
+and
+<i>
+remote
+contexts
+</i>
+is
+empty,
+i.e.,
+the
+currently
+being
+processed
+context
+is
+not
+a
+remote
+context:
+<ol class="algorithm">
+<li>
+Initialize
+<i>
+value
+</i>
+to
+the
+value
+associated
+with
+the
+<code>
+@base
+</code>
+key.
+</li>
+<li>
+If
+<i>
+value
+</i>
+is
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>,
+remove
+the
+<a class="tref internalDFN" title="base-iri" href="#dfn-base-iri">
+base
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+of
+<i>
+result
+</i>.
+</li>
+<li>
+Otherwise,
+if
+<i>
+value
+</i>
+is
+an
+<a class="tref internalDFN" title="absolute-iri" href="#dfn-absolute-iri">
+absolute
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>,
+the
+<a class="tref internalDFN" title="base-iri" href="#dfn-base-iri">
+base
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+of
+<i>
+result
+</i>
+is
+set
+to
+<i>
+value
+</i>.
+</li>
+<li>
+Otherwise,
+if
+<i>
+value
+</i>
+is
+a
+<a class="tref internalDFN" title="relative-iri" href="#dfn-relative-iri">
+relative
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+and
+the
+<a class="tref internalDFN" title="base-iri" href="#dfn-base-iri">
+base
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+of
+<i>
+result
+</i>
+is
+not
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>,
+set
+the
+<a class="tref internalDFN" title="base-iri" href="#dfn-base-iri">
+base
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+of
+<i>
+result
+</i>
+to
+the
+result
+of
+resolving
+<i>
+value
+</i>
+against
+the
+current
+<a class="tref internalDFN" title="base-iri" href="#dfn-base-iri">
+base
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+of
+<i>
+result
+</i>.
+</li>
+<li>
+Otherwise,
+an
+<code class="error">
+<a href="#idl-def-JsonLdErrorCode.invalid-base-IRI">
+invalid
+base
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+</code>
+error
+has
+been
+detected
+and
+processing
+is
+aborted.
+</li>
+</ol>
+</li>
+<li>
+If
+<i>
+context
+</i>
+has
+an
+<code>
+@vocab
+</code>
+key:
+<ol class="algorithm">
+<li>
+Initialize
+<i>
+value
+</i>
+to
+the
+value
+associated
+with
+the
+<code>
+@vocab
+</code>
+key.
+</li>
+<li>
+If
+<i>
+value
+</i>
+is
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>,
+remove
+any
+<a class="tref internalDFN" title="vocabulary-mapping" href="#dfn-vocabulary-mapping">
+vocabulary
+mapping
+</a>
+from
+<i>
+result
+</i>.
+</li>
+<li>
+Otherwise,
+if
+<i>
+value
+</i>
+is
+an
+<a class="tref internalDFN" title="absolute-iri" href="#dfn-absolute-iri">
+absolute
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+<ins class="diff-new">or
+</ins><a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier"><ins class="diff-new">
+blank
+node
+identifier
+</ins>
+</a>,
+the
+<a class="tref internalDFN" title="vocabulary-mapping" href="#dfn-vocabulary-mapping">
+vocabulary
+mapping
+</a>
+of
+<i>
+result
+</i>
+is
+set
+to
+<i>
+value
+</i>.
+If
+it
+is
+not
+an
+<a class="tref internalDFN" title="absolute-iri" href="#dfn-absolute-iri">
+absolute
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+<ins class="diff-new">or
+</ins><a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier"><ins class="diff-new">
+blank
+node
+identifier
+</ins>
+</a>,
+an
+<code class="error">
+<a href="#idl-def-JsonLdErrorCode.invalid-vocab-mapping">
+invalid
+vocab
+mapping
+</a>
+</code>
+error
+has
+been
+detected
+and
+processing
+is
+aborted.
+</li>
+</ol>
+</li>
+<li>
+If
+<i>
+context
+</i>
+has
+an
+<code>
+@language
+</code>
+key:
+<ol class="algorithm">
+<li>
+Initialize
+<i>
+value
+</i>
+to
+the
+value
+associated
+with
+the
+<code>
+@language
+</code>
+key.
+</li>
+<li>
+If
+<i>
+value
+</i>
+is
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>,
+remove
+any
+<a class="tref internalDFN" title="default-language" href="#dfn-default-language">
+default
+language
+</a>
+from
+<i>
+result
+</i>.
+</li>
+<li>
+Otherwise,
+if
+<i>
+value
+</i>
+is
+<a class="tref internalDFN" title="string" href="#dfn-string">
+string
+</a>,
+the
+<a class="tref internalDFN" title="default-language" href="#dfn-default-language">
+default
+language
+</a>
+of
+<i>
+result
+</i>
+is
+set
+to
+lowercased
+<i>
+value
+</i>.
+If
+it
+is
+not
+a
+<a class="tref internalDFN" title="string" href="#dfn-string">
+string
+</a>,
+an
+<code class="error">
+<a href="#idl-def-JsonLdErrorCode.invalid-default-language">
+invalid
+default
+language
+</a>
+</code>
+error
+has
+been
+detected
+and
+processing
+is
+aborted.
+</li>
+</ol>
+</li>
+<li>
+Create
+a
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>
+<i>
+defined
+</i>
+to
+use
+to
+keep
+track
+of
+whether
+or
+not
+a
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term
+</a>
+has
+already
+been
+defined
+or
+currently
+being
+defined
+during
+recursion.
+</li>
+<li>
+For
+each
+<i>
+key
+</i>
+-
+<i>
+value
+</i>
+pair
+in
+<i>
+context
+</i>
+where
+<i>
+key
+</i>
+is
+not
+<code>
+@base
+</code>,
+<code>
+@vocab
+</code>,
+or
+<code>
+@language
+</code>,
+invoke
+the
+<a href="#create-term-definition">
+Create
+Term
+Definition
+algorithm
+</a>,
+passing
+<i>
+result
+</i>
+for
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>,
+<i>
+context
+</i>
+for
+<a class="tref internalDFN" title="local-context" href="#dfn-local-context">
+local
+context
+</a>,
+<i>
+key
+</i>,
+and
+<i>
+defined
+</i>.
+</li>
+</ol>
+</li>
+<li>
+Return
+<i>
+result
+</i>.
+</li>
+</ol>
+</section>
+</section>
+<section id="create-term-definition">
+<h3>
+<span class="secno">
+6.2
+</span>
+Create
+Term
+Definition
+</h3>
+<p>
+This
+algorithm
+is
+called
+from
+the
+<a href="#context-processing-algorithm">
+Context
+Processing
+algorithm
+</a>
+to
+create
+a
+<a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">
+term
+definition
+</a>
+in
+the
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>
+for
+a
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term
+</a>
+being
+processed
+in
+a
+<a class="tref internalDFN" title="local-context" href="#dfn-local-context">
+local
+context
+</a>.
+</p>
+<section class="informative">
+<h4 id="overview-1">
+Overview
+</h4>
+<p>
+<em>
+This
+section
+is
+non-normative.
+</em>
+</p>
+<p>
+<a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">
+Term
+definitions
+</a>
+are
+created
+by
+parsing
+the
+information
+in
+the
+given
+<a class="tref internalDFN" title="local-context" href="#dfn-local-context">
+local
+context
+</a>
+for
+the
+given
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term
+</a>.
+If
+the
+given
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term
+</a>
+is
+a
+<a class="tref internalDFN" title="compact-iri" href="#dfn-compact-iri">
+compact
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>,
+it
+may
+omit
+an
+<a class="tref internalDFN" title="iri-mapping" href="#dfn-iri-mapping">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+mapping
+</a>
+by
+depending
+on
+its
+<a class="tref internalDFN" title="prefix" href="#dfn-prefix">
+prefix
+</a>
+having
+its
+own
+<a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">
+term
+definition
+</a>.
+If
+the
+<a class="tref internalDFN" title="prefix" href="#dfn-prefix">
+prefix
+</a>
+is
+a
+key
+in
+the
+<a class="tref internalDFN" title="local-context" href="#dfn-local-context">
+local
+context
+</a>,
+then
+its
+<a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">
+term
+definition
+</a>
+must
+first
+be
+created,
+through
+recursion,
+before
+continuing.
+Because
+a
+<a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">
+term
+definition
+</a>
+can
+depend
+on
+other
+<a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">
+term
+definitions
+</a>,
+a
+mechanism
+must
+be
+used
+to
+detect
+cyclical
+dependencies.
+The
+solution
+employed
+here
+uses
+a
+map,
+<i>
+defined
+</i>,
+that
+keeps
+track
+of
+whether
+or
+not
+a
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term
+</a>
+has
+been
+defined
+or
+is
+currently
+in
+the
+process
+of
+being
+defined.
+This
+map
+is
+checked
+before
+any
+recursion
+is
+attempted.
+</p>
+<p>
+After
+all
+dependencies
+for
+a
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term
+</a>
+have
+been
+defined,
+the
+rest
+of
+the
+information
+in
+the
+<a class="tref internalDFN" title="local-context" href="#dfn-local-context">
+local
+context
+</a>
+for
+the
+given
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term
+</a>
+is
+taken
+into
+account,
+creating
+the
+appropriate
+<a class="tref internalDFN" title="iri-mapping" href="#dfn-iri-mapping">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+mapping
+</a>,
+<a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">
+container
+mapping
+</a>,
+and
+<a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">
+type
+mapping
+</a>
+or
+<a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">
+language
+mapping
+</a>
+for
+the
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term
+</a>.
+</p>
+</section>
+<section>
+<h4 id="algorithm-1">
+Algorithm
+</h4>
+<p>
+The
+algorithm
+has
+four
+required
+inputs
+which
+are:
+an
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>,
+a
+<a class="tref internalDFN" title="local-context" href="#dfn-local-context">
+local
+context
+</a>,
+a
+<i>
+term
+</i>,
+and
+a
+map
+<i>
+defined
+</i>.
+</p>
+<ol class="algorithm">
+<li>
+If
+<i>
+defined
+</i>
+contains
+the
+key
+<i>
+term
+</i>
+and
+the
+associated
+value
+is
+<a class="tref internalDFN" title="true" href="#dfn-true">
+true
+</a>
+(indicating
+that
+the
+<a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">
+term
+definition
+</a>
+has
+already
+been
+created),
+return.
+Otherwise,
+if
+the
+value
+is
+<a class="tref internalDFN" title="false" href="#dfn-false">
+false
+</a>,
+a
+<code class="error">
+<a href="#idl-def-JsonLdErrorCode.cyclic-IRI-mapping">
+cyclic
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+mapping
+</a>
+</code>
+error
+has
+been
+detected
+and
+processing
+is
+aborted.
+</li>
+<li>
+Set
+the
+value
+associated
+with
+<i>
+defined
+</i>
+'s
+<i>
+term
+</i>
+key
+to
+<a class="tref internalDFN" title="false" href="#dfn-false">
+false
+</a>.
+This
+indicates
+that
+the
+<a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">
+term
+definition
+</a>
+is
+now
+being
+created
+but
+is
+not
+yet
+complete.
+</li>
+<li>
+Since
+<a class="tref internalDFN" title="keyword" href="#dfn-keyword">
+keywords
+</a>
+cannot
+be
+overridden,
+<i>
+term
+</i>
+must
+not
+be
+a
+<a class="tref internalDFN" title="keyword" href="#dfn-keyword">
+keyword
+</a>.
+Otherwise,
+a
+<code class="error">
+<a href="#idl-def-JsonLdErrorCode.keyword-redefinition">
+keyword
+redefinition
+</a>
+</code>
+error
+has
+been
+detected
+and
+processing
+is
+aborted.
+</li>
+<li>
+Remove
+any
+existing
+<a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">
+term
+definition
+</a>
+for
+<i>
+term
+</i>
+in
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>.
+</li>
+<li>
+Initialize
+<i>
+value
+</i>
+to
+a
+copy
+of
+the
+value
+associated
+with
+the
+key
+<i>
+term
+</i>
+in
+<a class="tref internalDFN" title="local-context" href="#dfn-local-context">
+local
+context
+</a>.
+</li>
+<li>
+If
+<i>
+value
+</i>
+is
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>
+or
+<i>
+value
+</i>
+is
+a
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>
+containing
+the
+key-value
+pair
+<code>
+@id
+</code>
+-
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>,
+set
+the
+<a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">
+term
+definition
+</a>
+in
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>
+to
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>,
+set
+the
+value
+associated
+with
+<i>
+defined
+</i>
+'s
+key
+<i>
+term
+</i>
+to
+<a class="tref internalDFN" title="true" href="#dfn-true">
+true
+</a>,
+and
+return.
+</li>
+<li>
+Otherwise,
+if
+<i>
+value
+</i>
+is
+a
+<a class="tref internalDFN" title="string" href="#dfn-string">
+string
+</a>,
+convert
+it
+to
+a
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>
+consisting
+of
+a
+single
+member
+whose
+key
+is
+<code>
+@id
+</code>
+and
+whose
+value
+is
+<i>
+value
+</i>.
+</li>
+<li>
+Otherwise,
+<i>
+value
+</i>
+must
+be
+a
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>,
+if
+not,
+an
+<code class="error">
+<a href="#idl-def-JsonLdErrorCode.invalid-term-definition">
+invalid
+term
+definition
+</a>
+</code>
+error
+has
+been
+detected
+and
+processing
+is
+aborted.
+</li>
+<li>
+Create
+a
+new
+<a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">
+term
+definition
+</a>,
+<i>
+definition
+</i>.
+</li>
+<li>
+If
+<i>
+value
+</i>
+contains
+the
+key
+<code>
+<del class="diff-old">@reverse
+</del>
+<ins class="diff-chg">@type
+</ins>
+</code>:
+<ol class="algorithm">
+<li>
+<del class="diff-old">If
+</del>
+<ins class="diff-chg">Initialize
+</ins>
+<i>
+<del class="diff-old">value
+</del>
+<ins class="diff-chg">type
+</ins>
+</i>
+<del class="diff-old">contains
+</del>
+<ins class="diff-chg">to
+the
+value
+associated
+with
+the
+</ins><code><ins class="diff-chg">
+@type
+</ins></code><ins class="diff-chg">
+key,
+which
+must
+be
+a
+</ins><a class="tref internalDFN" title="string" href="#dfn-string"><ins class="diff-chg">
+string
+</ins></a>.<ins class="diff-chg">
+Otherwise,
+</ins>
+an
+<code class="error">
+<a href="#idl-def-JsonLdErrorCode.invalid-type-mapping">
+<ins class="diff-new">invalid
+type
+mapping
+</ins></a></code><ins class="diff-new">
+error
+has
+been
+detected
+and
+processing
+is
+aborted.
+</ins></li><li><ins class="diff-new">
+Set
+</ins><i><ins class="diff-new">
+type
+</ins></i><ins class="diff-new">
+to
+the
+result
+of
+using
+the
+</ins><a href="#iri-expansion"><abbr title="Internationalized Resource Identifier"><ins class="diff-new">
+IRI
+</ins></abbr><ins class="diff-new">
+Expansion
+algorithm
+</ins></a>,<ins class="diff-new">
+passing
+</ins><a class="tref internalDFN" title="active-context" href="#dfn-active-context"><ins class="diff-new">
+active
+context
+</ins></a>,<i><ins class="diff-new">
+type
+</ins></i><ins class="diff-new">
+for
+</ins><i><ins class="diff-new">
+value
+</ins></i>,<a class="tref internalDFN" title="true" href="#dfn-true"><ins class="diff-new">
+true
+</ins></a><ins class="diff-new">
+for
+</ins><i><ins class="diff-new">
+vocab
+</ins></i>,<a class="tref internalDFN" title="false" href="#dfn-false"><ins class="diff-new">
+false
+</ins></a><ins class="diff-new">
+for
+</ins><i><ins class="diff-new">
+document
+relative
+</ins></i>,<a class="tref internalDFN" title="local-context" href="#dfn-local-context"><ins class="diff-new">
+local
+context
+</ins></a>,<ins class="diff-new">
+and
+</ins><i><ins class="diff-new">
+defined
+</ins></i>.<ins class="diff-new">
+If
+the
+expanded
+</ins><i><ins class="diff-new">
+type
+</ins></i><ins class="diff-new">
+is
+neither
+</ins>
+<code>
+@id
+</code>,
+<del class="diff-old">an
+</del>
+<ins class="diff-chg">nor
+</ins>
+<code>
+<del class="diff-old">@type
+</del>
+<ins class="diff-chg">@vocab
+</ins>
+</code>,
+<del class="diff-old">or
+</del>
+<ins class="diff-chg">nor
+an
+</ins><a class="tref internalDFN" title="absolute-iri" href="#dfn-absolute-iri"><ins class="diff-chg">
+absolute
+</ins><abbr title="Internationalized Resource Identifier"><ins class="diff-chg">
+IRI
+</ins></abbr></a>,
+an
+<code class="error">
+<a href="#idl-def-JsonLdErrorCode.invalid-type-mapping">
+<ins class="diff-new">invalid
+type
+mapping
+</ins></a></code><ins class="diff-new">
+error
+has
+been
+detected
+and
+processing
+is
+aborted.
+</ins></li><li><ins class="diff-new">
+Set
+the
+</ins><a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping"><ins class="diff-new">
+type
+mapping
+</ins></a><ins class="diff-new">
+for
+</ins><i><ins class="diff-new">
+definition
+</ins></i><ins class="diff-new">
+to
+</ins><i><ins class="diff-new">
+type
+</ins></i>.</li></ol></li><li><ins class="diff-new">
+If
+</ins><i><ins class="diff-new">
+value
+</ins></i><ins class="diff-new">
+contains
+the
+key
+</ins>
+<code>
+<del class="diff-old">@language
+</del>
+<ins class="diff-chg">@reverse
+</ins></code>:<ol class="algorithm"><li><ins class="diff-chg">
+If
+</ins><i><ins class="diff-chg">
+value
+</ins></i><ins class="diff-chg">
+contains
+an
+</ins><code><ins class="diff-chg">
+@id
+</ins>
+</code>,
+member,
+an
+<code class="error">
+<a href="#idl-def-JsonLdErrorCode.invalid-reverse-property">
+invalid
+reverse
+property
+</a>
+</code>
+error
+has
+been
+detected
+and
+processing
+is
+aborted.
+</li>
+<li>
+If
+the
+value
+associated
+with
+the
+<code>
+@reverse
+</code>
+key
+is
+not
+a
+<a class="tref internalDFN" title="string" href="#dfn-string">
+string
+</a>,
+an
+<code class="error">
+<a href="#idl-def-JsonLdErrorCode.invalid-IRI-mapping">
+invalid
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+mapping
+</a>
+</code>
+error
+has
+been
+detected
+and
+processing
+is
+aborted.
+</li>
+<li>
+Otherwise,
+set
+the
+<a class="tref internalDFN" title="iri-mapping" href="#dfn-iri-mapping">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+mapping
+</a>
+of
+<i>
+definition
+</i>
+to
+the
+result
+of
+using
+the
+<a href="#iri-expansion">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+Expansion
+algorithm
+</a>,
+passing
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>,
+the
+value
+associated
+with
+the
+<code>
+@reverse
+</code>
+key
+for
+<i>
+value
+</i>,
+<a class="tref internalDFN" title="true" href="#dfn-true">
+true
+</a>
+for
+<i>
+vocab
+</i>,
+<a class="tref internalDFN" title="false" href="#dfn-false">
+false
+</a>
+for
+<i>
+document
+relative
+</i>,
+<a class="tref internalDFN" title="local-context" href="#dfn-local-context">
+local
+context
+</a>,
+and
+<i>
+defined
+</i>.
+If
+the
+result
+is
+not
+an
+<a class="tref internalDFN" title="absolute-iri" href="#dfn-absolute-iri">
+absolute
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>,
+i.e.,
+it
+contains
+no
+colon
+(
+<code>:
+</code>
+),
+an
+<code class="error">
+<a href="#idl-def-JsonLdErrorCode.invalid-IRI-mapping">
+invalid
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+mapping
+</a>
+</code>
+error
+has
+been
+detected
+and
+processing
+is
+aborted.
+</li>
+<li>
+<del class="diff-old">Set
+the
+type
+mapping
+of
+definition
+to
+@id
+.
+</del>
+If
+<i>
+value
+</i>
+contains
+an
+<code>
+@container
+</code>
+member,
+set
+the
+<a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">
+container
+mapping
+</a>
+of
+<i>
+definition
+</i>
+to
+<del class="diff-old">@index
+</del>
+<ins class="diff-chg">its
+value;
+</ins>
+if
+<del class="diff-old">that
+is
+the
+</del>
+<ins class="diff-chg">its
+</ins>
+value
+<del class="diff-old">of
+the
+</del>
+<ins class="diff-chg">is
+neither
+</ins>
+<code>
+<del class="diff-old">@container
+member;
+otherwise
+</del>
+<ins class="diff-chg">@set
+</ins></code>,<ins class="diff-chg">
+nor
+</ins><code><ins class="diff-chg">
+@index
+</ins></code>,<ins class="diff-chg">
+nor
+</ins><a class="tref internalDFN" title="null" href="#dfn-null"><ins class="diff-chg">
+null
+</ins></a>,
+an
+<code class="error">
+<a href="#idl-def-JsonLdErrorCode.invalid-reverse-property">
+invalid
+reverse
+property
+</a>
+</code>
+error
+has
+been
+detected
+(reverse
+properties
+only
+support
+<ins class="diff-new">set-
+and
+</ins>
+index-containers)
+and
+processing
+is
+aborted.
+</li>
+<li>
+Set
+the
+<a class="tref internalDFN" title="reverse-property" href="#dfn-reverse-property">
+reverse
+property
+</a>
+flag
+of
+<i>
+definition
+</i>
+to
+<a class="tref internalDFN" title="true" href="#dfn-true">
+true
+</a>.
+</li>
+<li>
+Set
+the
+<a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">
+term
+definition
+</a>
+of
+<i>
+term
+</i>
+in
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>
+to
+<i>
+definition
+</i>
+and
+the
+value
+associated
+with
+<i>
+defined
+</i>
+'s
+key
+<i>
+term
+</i>
+to
+<a class="tref internalDFN" title="true" href="#dfn-true">
+true
+</a>
+and
+return.
+</li>
+</ol>
+</li>
+<li>
+Set
+the
+<a class="tref internalDFN" title="reverse-property" href="#dfn-reverse-property">
+reverse
+property
+</a>
+flag
+of
+<i>
+definition
+</i>
+to
+<a class="tref internalDFN" title="false" href="#dfn-false">
+false
+</a>.
+</li>
+<li>
+If
+<i>
+value
+</i>
+contains
+the
+key
+<code>
+@id
+</code>
+and
+its
+value
+does
+not
+equal
+<i>
+term
+</i>:
+<ol class="algorithm">
+<li>
+If
+the
+value
+associated
+with
+the
+<code>
+@id
+</code>
+key
+is
+not
+a
+<a class="tref internalDFN" title="string" href="#dfn-string">
+string
+</a>,
+an
+<code class="error">
+<a href="#idl-def-JsonLdErrorCode.invalid-IRI-mapping">
+invalid
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+mapping
+</a>
+</code>
+error
+has
+been
+detected
+and
+processing
+is
+aborted.
+</li>
+<li>
+Otherwise,
+set
+the
+<a class="tref internalDFN" title="iri-mapping" href="#dfn-iri-mapping">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+mapping
+</a>
+of
+<i>
+definition
+</i>
+to
+the
+result
+of
+using
+the
+<a href="#iri-expansion">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+Expansion
+algorithm
+</a>,
+passing
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>,
+the
+value
+associated
+with
+the
+<code>
+@id
+</code>
+key
+for
+<i>
+value
+</i>,
+<a class="tref internalDFN" title="true" href="#dfn-true">
+true
+</a>
+for
+<i>
+vocab
+</i>,
+<a class="tref internalDFN" title="false" href="#dfn-false">
+false
+</a>
+for
+<i>
+document
+relative
+</i>,
+<a class="tref internalDFN" title="local-context" href="#dfn-local-context">
+local
+context
+</a>,
+and
+<i>
+defined
+</i>.
+If
+the
+resulting
+<a class="tref internalDFN" title="iri-mapping" href="#dfn-iri-mapping">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+mapping
+</a>
+equals
+<code>
+@context
+</code>,
+an
+<code class="error">
+<a href="#idl-def-JsonLdErrorCode.invalid-keyword-alias">
+invalid
+keyword
+alias
+</a>
+</code>
+error
+has
+been
+detected
+and
+processing
+is
+aborted.
+</li>
+</ol>
+</li>
+<li>
+Otherwise
+if
+the
+<i>
+term
+</i>
+contains
+a
+colon
+(
+<code>:
+</code>
+):
+<ol class="algorithm">
+<li>
+If
+<i>
+term
+</i>
+is
+a
+<a class="tref internalDFN" title="compact-iri" href="#dfn-compact-iri">
+compact
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+with
+a
+<a class="tref internalDFN" title="prefix" href="#dfn-prefix">
+prefix
+</a>
+that
+is
+a
+key
+in
+<a class="tref internalDFN" title="local-context" href="#dfn-local-context">
+local
+context
+</a>
+a
+dependency
+has
+been
+found.
+Use
+this
+algorithm
+recursively
+passing
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>,
+<a class="tref internalDFN" title="local-context" href="#dfn-local-context">
+local
+context
+</a>,
+the
+<a class="tref internalDFN" title="prefix" href="#dfn-prefix">
+prefix
+</a>
+as
+<i>
+term
+</i>,
+and
+<i>
+defined
+</i>.
+</li>
+<li>
+If
+<i>
+term
+</i>
+'s
+<a class="tref internalDFN" title="prefix" href="#dfn-prefix">
+prefix
+</a>
+has
+a
+<a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">
+term
+definition
+</a>
+in
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>,
+set
+the
+<a class="tref internalDFN" title="iri-mapping" href="#dfn-iri-mapping">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+mapping
+</a>
+of
+<i>
+definition
+</i>
+to
+the
+result
+of
+concatenating
+the
+value
+associated
+with
+the
+<a class="tref internalDFN" title="prefix" href="#dfn-prefix">
+prefix
+</a>
+'s
+<a class="tref internalDFN" title="iri-mapping" href="#dfn-iri-mapping">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+mapping
+</a>
+and
+the
+<i>
+term
+</i>
+'s
+<i>
+suffix
+</i>.
+</li>
+<li>
+Otherwise,
+<i>
+term
+</i>
+is
+an
+<a class="tref internalDFN" title="absolute-iri" href="#dfn-absolute-iri">
+absolute
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>.
+Set
+the
+<a class="tref internalDFN" title="iri-mapping" href="#dfn-iri-mapping">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+mapping
+</a>
+of
+<i>
+definition
+</i>
+to
+<i>
+term
+</i>.
+</li>
+</ol>
+</li>
+<li>
+Otherwise,
+if
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>
+has
+a
+<a class="tref internalDFN" title="vocabulary-mapping" href="#dfn-vocabulary-mapping">
+vocabulary
+mapping
+</a>,
+the
+<a class="tref internalDFN" title="iri-mapping" href="#dfn-iri-mapping">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+mapping
+</a>
+of
+<i>
+definition
+</i>
+is
+set
+to
+the
+result
+of
+concatenating
+the
+value
+associated
+with
+the
+<a class="tref internalDFN" title="vocabulary-mapping" href="#dfn-vocabulary-mapping">
+vocabulary
+mapping
+</a>
+and
+<i>
+term
+</i>.
+If
+it
+does
+not
+have
+a
+<a class="tref internalDFN" title="vocabulary-mapping" href="#dfn-vocabulary-mapping">
+vocabulary
+mapping
+</a>,
+an
+<code class="error">
+<a href="#idl-def-JsonLdErrorCode.invalid-IRI-mapping">
+invalid
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+mapping
+</a>
+</code>
+error
+been
+detected
+and
+processing
+is
+aborted.
+</li>
+<li>
+If
+<i>
+value
+</i>
+contains
+the
+key
+<code>
+<del class="diff-old">@type
+:
+Initialize
+type
+to
+the
+value
+associated
+with
+the
+@type
+key,
+which
+must
+be
+a
+string
+.
+Otherwise,
+an
+invalid
+type
+mapping
+error
+has
+been
+detected
+and
+processing
+is
+aborted.
+Set
+type
+to
+the
+result
+of
+using
+the
+IRI
+Expansion
+algorithm
+,
+passing
+active
+context
+,
+type
+for
+value
+,
+true
+for
+vocab
+,
+false
+for
+document
+relative
+,
+local
+context
+,
+and
+defined
+.
+If
+the
+expanded
+type
+is
+neither
+@id
+,
+nor
+@vocab
+,
+nor
+an
+absolute
+IRI
+,
+an
+invalid
+type
+mapping
+error
+has
+been
+detected
+and
+processing
+is
+aborted.
+Set
+the
+type
+mapping
+for
+definition
+to
+type
+.
+If
+value
+contains
+the
+key
+</del>
+@container
+</code>:
+<ol class="algorithm">
+<li>
+Initialize
+<i>
+container
+</i>
+to
+the
+value
+associated
+with
+the
+<code>
+@container
+</code>
+key,
+which
+must
+be
+either
+<code>
+@list
+</code>,
+<code>
+@set
+</code>,
+<code>
+@index
+</code>,
+or
+<code>
+@language
+</code>.
+Otherwise,
+an
+<code class="error">
+<a href="#idl-def-JsonLdErrorCode.invalid-container-mapping">
+invalid
+container
+mapping
+</a>
+</code>
+error
+has
+been
+detected
+and
+processing
+is
+aborted.
+</li>
+<li>
+Set
+the
+<a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">
+container
+mapping
+</a>
+of
+<i>
+definition
+</i>
+to
+<i>
+container
+</i>.
+</li>
+</ol>
+</li>
+<li>
+If
+<i>
+value
+</i>
+contains
+the
+key
+<code>
+@language
+</code>
+and
+does
+not
+contain
+the
+key
+<code>
+@type
+</code>:
+<ol class="algorithm">
+<li>
+Initialize
+<i>
+language
+</i>
+to
+the
+value
+associated
+with
+the
+<code>
+@language
+</code>
+key,
+which
+must
+be
+either
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>
+or
+a
+<a class="tref internalDFN" title="string" href="#dfn-string">
+string
+</a>.
+Otherwise,
+an
+<code class="error">
+<a href="#idl-def-JsonLdErrorCode.invalid-language-mapping">
+invalid
+language
+mapping
+</a>
+</code>
+error
+has
+been
+detected
+and
+processing
+is
+aborted.
+</li>
+<li>
+If
+<i>
+language
+</i>
+is
+a
+<a class="tref internalDFN" title="string" href="#dfn-string">
+string
+</a>
+set
+it
+to
+lowercased
+<i>
+language
+</i>.
+Set
+the
+<a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">
+language
+mapping
+</a>
+of
+<i>
+definition
+</i>
+to
+<i>
+language
+</i>.
+</li>
+</ol>
+</li>
+<li>
+Set
+the
+<a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">
+term
+definition
+</a>
+of
+<i>
+term
+</i>
+in
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>
+to
+<i>
+definition
+</i>
+and
+set
+the
+value
+associated
+with
+<i>
+defined
+</i>
+'s
+key
+<i>
+term
+</i>
+to
+<a class="tref internalDFN" title="true" href="#dfn-true">
+true
+</a>.
+</li>
+</ol>
+</section>
+</section>
+<section id="iri-expansion">
+<h3>
+<span class="secno">
+6.3
+</span>
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+Expansion
+</h3>
+<p>
+In
+JSON-LD
+documents,
+some
+keys
+and
+values
+may
+represent
+<a class="tref internalDFN" title="iri" href="#dfn-iri">
+IRIs
+</a>.
+This
+section
+defines
+an
+algorithm
+for
+transforming
+a
+<a class="tref internalDFN" title="string" href="#dfn-string">
+string
+</a>
+that
+represents
+an
+<a class="tref internalDFN" title="iri" href="#dfn-iri">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+into
+an
+<a class="tref internalDFN" title="absolute-iri" href="#dfn-absolute-iri">
+absolute
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+or
+<a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">
+blank
+node
+identifier
+</a>.
+It
+also
+covers
+transforming
+<a class="tref internalDFN" title="keyword-alias" href="#dfn-keyword-alias">
+keyword
+aliases
+</a>
+into
+<a class="tref internalDFN" title="keyword" href="#dfn-keyword">
+keywords
+</a>.
+</p>
+<p>
+<a class="tref internalDFN" title="iri" href="#dfn-iri">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+expansion
+may
+occur
+during
+context
+processing
+or
+during
+any
+of
+the
+other
+JSON-LD
+algorithms.
+If
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+expansion
+occurs
+during
+context
+processing,
+then
+the
+<a class="tref internalDFN" title="local-context" href="#dfn-local-context">
+local
+context
+</a>
+and
+its
+related
+<i>
+defined
+</i>
+map
+from
+the
+<a href="#context-processing-algorithm">
+Context
+Processing
+algorithm
+</a>
+are
+passed
+to
+this
+algorithm.
+This
+allows
+for
+<a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">
+term
+definition
+</a>
+dependencies
+to
+be
+processed
+via
+the
+<a href="#create-term-definition">
+Create
+Term
+Definition
+algorithm
+</a>.
+</p>
+<section class="informative">
+<h4 id="overview-2">
+Overview
+</h4>
+<p>
+<em>
+This
+section
+is
+non-normative.
+</em>
+</p>
+<p>
+In
+order
+to
+expand
+<i>
+value
+</i>
+to
+an
+<a class="tref internalDFN" title="absolute-iri" href="#dfn-absolute-iri">
+absolute
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>,
+we
+must
+first
+determine
+if
+it
+is
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>,
+a
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term
+</a>,
+a
+<a class="tref internalDFN" title="keyword-alias" href="#dfn-keyword-alias">
+keyword
+alias
+</a>,
+or
+some
+form
+of
+<a class="tref internalDFN" title="iri" href="#dfn-iri">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>.
+Based
+on
+what
+we
+find,
+we
+handle
+the
+specific
+kind
+of
+expansion;
+for
+example,
+we
+expand
+a
+<a class="tref internalDFN" title="keyword-alias" href="#dfn-keyword-alias">
+keyword
+alias
+</a>
+to
+a
+<a class="tref internalDFN" title="keyword" href="#dfn-keyword">
+keyword
+</a>
+and
+a
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term
+</a>
+to
+an
+<a class="tref internalDFN" title="absolute-iri" href="#dfn-absolute-iri">
+absolute
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+according
+to
+its
+<a class="tref internalDFN" title="iri-mapping" href="#dfn-iri-mapping">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+mapping
+</a>
+in
+the
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>.
+While
+inspecting
+<i>
+value
+</i>
+we
+may
+also
+find
+that
+we
+need
+to
+create
+<a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">
+term
+definition
+</a>
+dependencies
+because
+we're
+running
+this
+algorithm
+during
+context
+processing.
+We
+can
+tell
+whether
+or
+not
+we're
+running
+during
+context
+processing
+by
+checking
+<a class="tref internalDFN" title="local-context" href="#dfn-local-context">
+local
+context
+</a>
+against
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>.
+We
+know
+we
+need
+to
+create
+a
+<a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">
+term
+definition
+</a>
+in
+the
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>
+when
+<i>
+value
+</i>
+is
+a
+key
+in
+the
+<a class="tref internalDFN" title="local-context" href="#dfn-local-context">
+local
+context
+</a>
+and
+the
+<i>
+defined
+</i>
+map
+does
+not
+have
+a
+key
+for
+<i>
+value
+</i>
+with
+an
+associated
+value
+of
+<a class="tref internalDFN" title="true" href="#dfn-true">
+true
+</a>.
+The
+<i>
+defined
+</i>
+map
+is
+used
+during
+<a href="#context-processing-algorithm">
+Context
+Processing
+</a>
+to
+keep
+track
+of
+which
+<a class="tref internalDFN" title="term" href="#dfn-term">
+terms
+</a>
+have
+already
+been
+defined
+or
+are
+in
+the
+process
+of
+being
+defined.
+We
+create
+a
+<a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">
+term
+definition
+</a>
+by
+using
+the
+<a href="#create-term-definition">
+Create
+Term
+Definition
+algorithm
+</a>.
+</p>
+</section>
+<section>
+<h4 id="algorithm-2">
+Algorithm
+</h4>
+<p>
+The
+algorithm
+takes
+two
+required
+and
+four
+optional
+input
+variables.
+The
+required
+inputs
+are
+an
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>
+and
+a
+<i>
+value
+</i>
+to
+be
+expanded.
+The
+optional
+inputs
+are
+two
+flags,
+<i>
+document
+relative
+</i>
+and
+<i>
+vocab
+</i>,
+that
+specifying
+whether
+<i>
+value
+</i>
+can
+be
+interpreted
+as
+a
+<a class="tref internalDFN" title="relative-iri" href="#dfn-relative-iri">
+relative
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+against
+the
+document's
+base
+<a class="tref internalDFN" title="iri" href="#dfn-iri">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+or
+the
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context's
+</a>
+<a class="tref internalDFN" title="vocabulary-mapping" href="#dfn-vocabulary-mapping">
+vocabulary
+mapping
+</a>,
+respectively,
+and
+a
+<a class="tref internalDFN" title="local-context" href="#dfn-local-context">
+local
+context
+</a>
+and
+a
+map
+<i>
+defined
+</i>
+to
+be
+used
+when
+this
+algorithm
+is
+used
+during
+<a href="#context-processing-algorithm">
+Context
+Processing
+</a>.
+If
+not
+passed,
+the
+two
+flags
+are
+set
+to
+<code>
+false
+</code>
+and
+<a class="tref internalDFN" title="local-context" href="#dfn-local-context">
+local
+context
+</a>
+and
+<i>
+defined
+</i>
+are
+initialized
+to
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>.
+</p>
+<ol class="algorithm">
+<li>
+If
+<i>
+value
+</i>
+is
+a
+<a class="tref internalDFN" title="keyword" href="#dfn-keyword">
+keyword
+</a>
+or
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>,
+return
+<i>
+value
+</i>
+as
+is.
+</li>
+<li>
+If
+<a class="tref internalDFN" title="local-context" href="#dfn-local-context">
+local
+context
+</a>
+is
+not
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>,
+it
+contains
+a
+key
+that
+equals
+<i>
+value
+</i>,
+and
+the
+value
+associated
+with
+the
+key
+that
+equals
+<i>
+value
+</i>
+in
+<i>
+defined
+</i>
+is
+not
+<a class="tref internalDFN" title="true" href="#dfn-true">
+true
+</a>,
+invoke
+the
+<a href="#create-term-definition">
+Create
+Term
+Definition
+algorithm
+</a>,
+passing
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>,
+<a class="tref internalDFN" title="local-context" href="#dfn-local-context">
+local
+context
+</a>,
+<i>
+value
+</i>
+as
+<i>
+term
+</i>,
+and
+<i>
+defined
+</i>.
+This
+will
+ensure
+that
+a
+<a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">
+term
+definition
+</a>
+is
+created
+for
+<i>
+value
+</i>
+in
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>
+during
+<a href="#context-processing-algorithm">
+Context
+Processing
+</a>.
+</li>
+<li>
+If
+<i>
+vocab
+</i>
+is
+<a class="tref internalDFN" title="true" href="#dfn-true">
+true
+</a>
+and
+the
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>
+has
+a
+<a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">
+term
+definition
+</a>
+for
+<i>
+value
+</i>,
+return
+the
+associated
+<a class="tref internalDFN" title="iri-mapping" href="#dfn-iri-mapping">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+mapping
+</a>.
+</li>
+<li>
+If
+<i>
+value
+</i>
+contains
+a
+colon
+(
+<code>:
+</code>
+),
+it
+is
+either
+an
+<a class="tref internalDFN" title="absolute-iri" href="#dfn-absolute-iri">
+absolute
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+or
+a
+<a class="tref internalDFN" title="compact-iri" href="#dfn-compact-iri">
+compact
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>:
+<ol class="algorithm">
+<li>
+Split
+<i>
+value
+</i>
+into
+a
+<a class="tref internalDFN" title="prefix" href="#dfn-prefix">
+prefix
+</a>
+and
+<i>
+suffix
+</i>
+at
+the
+first
+occurrence
+of
+a
+colon
+(
+<code>:
+</code>
+).
+</li>
+<li>
+If
+<a class="tref internalDFN" title="prefix" href="#dfn-prefix">
+prefix
+</a>
+is
+underscore
+(
+<code>
+_
+</code>
+)
+or
+<i>
+suffix
+</i>
+begins
+with
+double-forward-slash
+(
+<code>
+//
+</code>
+),
+return
+<i>
+value
+</i>
+as
+it
+is
+already
+an
+<a class="tref internalDFN" title="absolute-iri" href="#dfn-absolute-iri">
+absolute
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+or
+a
+<a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">
+blank
+node
+identifier
+</a>.
+</li>
+<li>
+If
+<a class="tref internalDFN" title="local-context" href="#dfn-local-context">
+local
+context
+</a>
+is
+not
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>,
+it
+contains
+a
+key
+that
+equals
+<a class="tref internalDFN" title="prefix" href="#dfn-prefix">
+prefix
+</a>,
+and
+the
+value
+associated
+with
+the
+key
+that
+equals
+<i>
+prefix
+</i>
+in
+<i>
+defined
+</i>
+is
+not
+<a class="tref internalDFN" title="true" href="#dfn-true">
+true
+</a>,
+invoke
+the
+<a href="#create-term-definition">
+Create
+Term
+Definition
+algorithm
+</a>,
+passing
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>,
+<a class="tref internalDFN" title="local-context" href="#dfn-local-context">
+local
+context
+</a>,
+<i>
+prefix
+</i>
+as
+<i>
+term
+</i>,
+and
+<i>
+defined
+</i>.
+This
+will
+ensure
+that
+a
+<a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">
+term
+definition
+</a>
+is
+created
+for
+<a class="tref internalDFN" title="prefix" href="#dfn-prefix">
+prefix
+</a>
+in
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>
+during
+<a href="#context-processing-algorithm">
+Context
+Processing
+</a>.
+</li>
+<li>
+If
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>
+contains
+a
+<a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">
+term
+definition
+</a>
+for
+<a class="tref internalDFN" title="prefix" href="#dfn-prefix">
+prefix
+</a>,
+return
+the
+result
+of
+concatenating
+the
+<a class="tref internalDFN" title="iri-mapping" href="#dfn-iri-mapping">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+mapping
+</a>
+associated
+with
+<a class="tref internalDFN" title="prefix" href="#dfn-prefix">
+prefix
+</a>
+and
+<i>
+suffix
+</i>.
+</li>
+<li>
+Return
+<i>
+value
+</i>
+as
+it
+is
+already
+an
+<a class="tref internalDFN" title="absolute-iri" href="#dfn-absolute-iri">
+absolute
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>.
+</li>
+</ol>
+</li>
+<li>
+If
+<i>
+vocab
+</i>
+is
+<a class="tref internalDFN" title="true" href="#dfn-true">
+true
+</a>,
+and
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>
+has
+a
+<a class="tref internalDFN" title="vocabulary-mapping" href="#dfn-vocabulary-mapping">
+vocabulary
+mapping
+</a>,
+return
+the
+result
+of
+concatenating
+the
+<a class="tref internalDFN" title="vocabulary-mapping" href="#dfn-vocabulary-mapping">
+vocabulary
+mapping
+</a>
+with
+<i>
+value
+</i>.
+</li>
+<li>
+Otherwise,
+if
+<i>
+document
+relative
+</i>
+is
+<a class="tref internalDFN" title="true" href="#dfn-true">
+true
+</a>,
+set
+<i>
+value
+</i>
+to
+the
+result
+of
+resolving
+<i>
+value
+</i>
+against
+the
+<a class="tref internalDFN" title="base-iri" href="#dfn-base-iri">
+base
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>.
+Only
+the
+basic
+algorithm
+in
+<cite>
+<a href="http://tools.ietf.org/html/rfc3986#section-5.2">
+section
+5.2
+</a>
+</cite>
+of
+[
+<cite>
+<a class="bibref" href="#bib-RFC3986">
+RFC3986
+</a>
+</cite>
+]
+is
+used;
+neither
+<cite>
+<a href="http://tools.ietf.org/html/rfc3986#section-6.2.2">
+Syntax-Based
+Normalization
+</a>
+</cite>
+nor
+<cite>
+<a href="http://tools.ietf.org/html/rfc3986#section-6.2.3">
+Scheme-Based
+Normalization
+</a>
+</cite>
+are
+performed.
+Characters
+additionally
+allowed
+in
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+references
+are
+treated
+in
+the
+same
+way
+that
+unreserved
+characters
+are
+treated
+in
+URI
+references,
+per
+<cite>
+<a href="http://tools.ietf.org/html/rfc3987#section-6.5">
+section
+6.5
+</a>
+</cite>
+of
+[
+<cite>
+<a class="bibref" href="#bib-RFC3987">
+RFC3987
+</a>
+</cite>
+].
+</li>
+<li>
+If
+<a class="tref internalDFN" title="local-context" href="#dfn-local-context">
+local
+context
+</a>
+is
+not
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>
+and
+<i>
+value
+</i>
+is
+not
+an
+<a class="tref internalDFN" title="absolute-iri" href="#dfn-absolute-iri">
+absolute
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>,
+an
+<code class="error">
+<a href="#idl-def-JsonLdErrorCode.invalid-IRI-mapping">
+invalid
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+mapping
+</a>
+</code>
+error
+has
+been
+detected
+and
+processing
+is
+aborted.
+</li>
+<li>
+Otherwise,
+return
+<i>
+value
+</i>
+as
+is.
+</li>
+</ol>
+</section>
+</section>
+</section>
+<section id="expansion-algorithms">
+<h2>
+<span class="secno">
+7.
+</span>
+Expansion
+Algorithms
+</h2>
+<section id="expansion-algorithm">
+<h3>
+<span class="secno">
+7.1
+</span>
+Expansion
+Algorithm
+</h3>
+<p>
+This
+algorithm
+expands
+a
+JSON-LD
+document,
+such
+that
+all
+<a class="tref internalDFN" title="context" href="#dfn-context">
+context
+</a>
+definitions
+are
+removed,
+all
+<a class="tref internalDFN" title="term" href="#dfn-term">
+terms
+</a>
+and
+<a class="tref internalDFN" title="compact-iri" href="#dfn-compact-iri">
+compact
+IRIs
+</a>
+are
+expanded
+to
+<a class="tref internalDFN" title="absolute-iri" href="#dfn-absolute-iri">
+absolute
+IRIs
+</a>,
+<a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">
+blank
+node
+identifiers
+</a>,
+or
+<a class="tref internalDFN" title="keyword" href="#dfn-keyword">
+keywords
+</a>
+and
+all
+<a class="tref internalDFN" title="json-ld-value" href="#dfn-json-ld-value">
+JSON-LD
+values
+</a>
+are
+expressed
+in
+<a class="tref internalDFN" title="array" href="#dfn-array">
+arrays
+</a>
+in
+<a class="tref internalDFN" title="expanded-form" href="#dfn-expanded-form">
+expanded
+form
+</a>.
+</p>
+<section class="informative">
+<h4 id="overview-3">
+Overview
+</h4>
+<p>
+<em>
+This
+section
+is
+non-normative.
+</em>
+</p>
+<p>
+Starting
+with
+its
+root
+<i>
+element
+</i>,
+we
+can
+process
+the
+JSON-LD
+document
+recursively,
+until
+we
+have
+a
+fully
+<a class="tref internalDFN" title="expansion" href="#dfn-expansion">
+expanded
+</a>
+<i>
+result
+</i>.
+When
+<a class="tref internalDFN" title="expansion" href="#dfn-expansion">
+expanding
+</a>
+an
+<i>
+element
+</i>,
+we
+can
+treat
+each
+one
+differently
+according
+to
+its
+type,
+in
+order
+to
+break
+down
+the
+problem:
+</p>
+<ol>
+<li>
+If
+the
+<i>
+element
+</i>
+is
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>,
+there
+is
+nothing
+to
+expand.
+</li>
+<li>
+Otherwise,
+if
+<i>
+element
+</i>
+is
+a
+<a class="tref internalDFN" title="scalar" href="#dfn-scalar">
+scalar
+</a>,
+we
+expand
+it
+according
+to
+the
+<a href="#value-expansion">
+Value
+Expansion
+algorithm
+</a>.
+</li>
+<li>
+Otherwise,
+if
+the
+<i>
+element
+</i>
+is
+an
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>,
+then
+we
+expand
+each
+of
+its
+items
+recursively
+and
+return
+them
+in
+a
+new
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>.
+</li>
+<li>
+Otherwise,
+<i>
+element
+</i>
+is
+a
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>.
+We
+expand
+each
+of
+its
+keys,
+adding
+them
+to
+our
+<i>
+result
+</i>,
+and
+then
+we
+expand
+each
+value
+for
+each
+key
+recursively.
+Some
+of
+the
+keys
+will
+be
+<a class="tref internalDFN" title="term" href="#dfn-term">
+terms
+</a>
+or
+<a class="tref internalDFN" title="compact-iri" href="#dfn-compact-iri">
+compact
+IRIs
+</a>
+and
+others
+will
+be
+<a class="tref internalDFN" title="keyword" href="#dfn-keyword">
+keywords
+</a>
+or
+simply
+ignored
+because
+they
+do
+not
+have
+definitions
+in
+the
+<a class="tref internalDFN" title="context" href="#dfn-context">
+context
+</a>.
+Any
+<a class="tref internalDFN" title="iri" href="#dfn-iri">
+IRIs
+</a>
+will
+be
+expanded
+using
+the
+<a href="#iri-expansion">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+Expansion
+algorithm
+</a>.
+</li>
+</ol>
+<p>
+Finally,
+after
+ensuring
+<i>
+result
+</i>
+is
+in
+an
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>,
+we
+return
+<i>
+result
+</i>.
+</p>
+</section>
+<section>
+<h4 id="algorithm-3">
+Algorithm
+</h4>
+<p>
+The
+algorithm
+takes
+three
+input
+variables:
+an
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>,
+an
+<a class="tref internalDFN" title="active-property" href="#dfn-active-property">
+active
+property
+</a>,
+and
+an
+<i>
+element
+</i>
+to
+be
+expanded.
+To
+begin,
+the
+<del class="diff-old">active
+context
+is
+set
+to
+the
+result
+of
+performing,
+Context
+Processing
+on
+the
+passed
+expandContext
+,
+or
+empty
+if
+expandContext
+is
+null
+,
+</del>
+<a class="tref internalDFN" title="active-property" href="#dfn-active-property">
+active
+property
+</a>
+is
+set
+to
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>,
+and
+<i>
+element
+</i>
+is
+set
+to
+the
+<a class="tref internalDFN" title="json-ld-input" href="#dfn-json-ld-input">
+JSON-LD
+input
+</a>.
+</p>
+<ol class="algorithm">
+<li>
+If
+<i>
+element
+</i>
+is
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>,
+return
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>.
+</li>
+<li>
+If
+<i>
+element
+</i>
+is
+a
+<a class="tref internalDFN" title="scalar" href="#dfn-scalar">
+scalar
+</a>,
+<ol class="algorithm">
+<li>
+If
+<a class="tref internalDFN" title="active-property" href="#dfn-active-property">
+active
+property
+</a>
+is
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>
+or
+<code>
+@graph
+</code>,
+drop
+the
+free-floating
+<a class="tref internalDFN" title="scalar" href="#dfn-scalar">
+scalar
+</a>
+by
+returning
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>.
+</li>
+<li>
+Return
+the
+result
+of
+the
+<a href="#value-expansion">
+Value
+Expansion
+algorithm
+</a>,
+passing
+the
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>,
+<a class="tref internalDFN" title="active-property" href="#dfn-active-property">
+active
+property
+</a>,
+and
+<i>
+element
+</i>
+as
+<i>
+value
+</i>.
+</li>
+</ol>
+</li>
+<li>
+If
+<i>
+element
+</i>
+is
+an
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>,
+<ol class="algorithm">
+<li>
+Initialize
+an
+empty
+array,
+<i>
+result
+</i>.
+</li>
+<li>
+For
+each
+<i>
+item
+</i>
+in
+<i>
+element
+</i>:
+<ol class="algorithm">
+<li>
+Initialize
+<i>
+expanded
+item
+</i>
+to
+the
+result
+of
+using
+this
+algorithm
+recursively,
+passing
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>,
+<a class="tref internalDFN" title="active-property" href="#dfn-active-property">
+active
+property
+</a>,
+and
+<i>
+item
+</i>
+as
+<i>
+element
+</i>.
+</li>
+<li>
+If
+the
+<a class="tref internalDFN" title="active-property" href="#dfn-active-property">
+active
+property
+</a>
+is
+<code>
+@list
+</code>
+or
+its
+<a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">
+container
+mapping
+</a>
+is
+set
+to
+<code>
+@list
+</code>,
+the
+<i>
+expanded
+item
+</i>
+must
+not
+be
+an
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>
+or
+a
+<a class="tref internalDFN" title="list-object" href="#dfn-list-object">
+list
+object
+</a>,
+otherwise
+a
+<code class="error">
+<a href="#idl-def-JsonLdErrorCode.list-of-lists">
+list
+of
+lists
+</a>
+</code>
+error
+has
+been
+detected
+and
+processing
+is
+aborted.
+</li>
+<li>
+If
+<i>
+expanded
+item
+</i>
+is
+an
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>,
+append
+each
+of
+its
+items
+to
+<i>
+result
+</i>.
+Otherwise,
+if
+<i>
+expanded
+item
+</i>
+is
+not
+null,
+append
+it
+to
+<i>
+result
+</i>.
+</li>
+</ol>
+</li>
+<li>
+Return
+<i>
+result
+</i>.
+</li>
+</ol>
+</li>
+<li>
+Otherwise
+<i>
+element
+</i>
+is
+a
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>.
+</li>
+<li>
+If
+<i>
+element
+</i>
+contains
+the
+key
+<code>
+@context
+</code>,
+set
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>
+to
+the
+result
+of
+the
+<a href="#context-processing-algorithm">
+Context
+Processing
+algorithm
+</a>,
+passing
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>
+and
+the
+value
+of
+the
+<code>
+@context
+</code>
+key
+as
+<a class="tref internalDFN" title="local-context" href="#dfn-local-context">
+local
+context
+</a>.
+</li>
+<li>
+Initialize
+an
+empty
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>,
+<i>
+result
+</i>.
+</li>
+<li>
+For
+each
+<i>
+key
+</i>
+and
+<i>
+value
+</i>
+in
+<i>
+element
+</i>,
+ordered
+lexicographically
+by
+<i>
+key
+</i>:
+<ol class="algorithm">
+<li>
+If
+<i>
+key
+</i>
+is
+<code>
+@context
+</code>,
+continue
+to
+the
+next
+<i>
+key
+</i>.
+</li>
+<li>
+Set
+<i>
+expanded
+property
+</i>
+to
+the
+result
+of
+using
+the
+<a href="#iri-expansion">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+Expansion
+algorithm
+</a>,
+passing
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>,
+<i>
+key
+</i>
+for
+<i>
+value
+</i>,
+and
+<a class="tref internalDFN" title="true" href="#dfn-true">
+true
+</a>
+for
+<i>
+vocab
+</i>.
+</li>
+<li>
+If
+<i>
+expanded
+property
+</i>
+is
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>
+or
+it
+neither
+contains
+a
+colon
+(
+<code>:
+</code>
+)
+nor
+it
+is
+a
+<a class="tref internalDFN" title="keyword" href="#dfn-keyword">
+keyword
+</a>,
+drop
+<i>
+key
+</i>
+by
+continuing
+to
+the
+next
+<i>
+key
+</i>.
+</li>
+<li>
+If
+<i>
+expanded
+property
+</i>
+is
+a
+<a class="tref internalDFN" title="keyword" href="#dfn-keyword">
+keyword
+</a>:
+<ol class="algorithm">
+<li>
+If
+<a class="tref internalDFN" title="active-property" href="#dfn-active-property">
+active
+property
+</a>
+equals
+<code>
+@reverse
+</code>,
+an
+<code class="error">
+<a href="#idl-def-JsonLdErrorCode.invalid-reverse-property-map">
+invalid
+reverse
+property
+map
+</a>
+</code>
+error
+has
+been
+detected
+and
+processing
+is
+aborted.
+</li>
+<li>
+If
+<i>
+result
+</i>
+has
+already
+an
+<i>
+expanded
+property
+</i>
+member,
+an
+<code class="error">
+<a href="#idl-def-JsonLdErrorCode.colliding-keywords">
+colliding
+keywords
+</a>
+</code>
+error
+has
+been
+detected
+and
+processing
+is
+aborted.
+</li>
+<li>
+If
+<i>
+expanded
+property
+</i>
+is
+<code>
+@id
+</code>
+and
+<i>
+value
+</i>
+is
+not
+a
+<a class="tref internalDFN" title="string" href="#dfn-string">
+string
+</a>,
+an
+<code class="error">
+<a href="#idl-def-JsonLdErrorCode.invalid--id-value">
+invalid
+@id
+value
+</a>
+</code>
+error
+has
+been
+detected
+and
+processing
+is
+aborted.
+Otherwise,
+set
+<i>
+expanded
+value
+</i>
+to
+the
+result
+of
+using
+the
+<a href="#iri-expansion">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+Expansion
+algorithm
+</a>,
+passing
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>,
+<i>
+value
+</i>,
+and
+<a class="tref internalDFN" title="true" href="#dfn-true">
+true
+</a>
+for
+<i>
+document
+relative
+</i>.
+</li>
+<li>
+If
+<i>
+expanded
+property
+</i>
+is
+<code>
+@type
+</code>
+and
+<i>
+value
+</i>
+is
+neither
+a
+<a class="tref internalDFN" title="string" href="#dfn-string">
+string
+</a>
+nor
+an
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>
+of
+<a class="tref internalDFN" title="string" href="#dfn-string">
+strings
+</a>,
+an
+<code class="error">
+<a href="#idl-def-JsonLdErrorCode.invalid-type-value">
+invalid
+type
+value
+</a>
+</code>
+error
+has
+been
+detected
+and
+processing
+is
+aborted.
+Otherwise,
+set
+<i>
+expanded
+value
+</i>
+to
+the
+result
+of
+using
+the
+<a href="#iri-expansion">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+Expansion
+algorithm
+</a>,
+passing
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>,
+<a class="tref internalDFN" title="true" href="#dfn-true">
+true
+</a>
+for
+<i>
+vocab
+</i>,
+and
+<a class="tref internalDFN" title="true" href="#dfn-true">
+true
+</a>
+for
+<i>
+document
+relative
+</i>
+to
+expand
+the
+<i>
+value
+</i>
+or
+each
+of
+its
+items.
+</li>
+<li>
+If
+<i>
+expanded
+property
+</i>
+is
+<code>
+@graph
+</code>,
+set
+<i>
+expanded
+value
+</i>
+to
+the
+result
+of
+using
+this
+algorithm
+recursively
+passing
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>,
+<code>
+@graph
+</code>
+for
+<a class="tref internalDFN" title="active-property" href="#dfn-active-property">
+active
+property
+</a>,
+and
+<i>
+value
+</i>
+for
+<i>
+element
+</i>.
+</li>
+<li>
+If
+<i>
+expanded
+property
+</i>
+is
+<code>
+@value
+</code>
+and
+<i>
+value
+</i>
+is
+not
+a
+<a class="tref internalDFN" title="scalar" href="#dfn-scalar">
+scalar
+</a>
+or
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>,
+an
+<code class="error">
+<a href="#idl-def-JsonLdErrorCode.invalid-value-object-value">
+invalid
+value
+object
+value
+</a>
+</code>
+error
+has
+been
+detected
+and
+processing
+is
+aborted.
+Otherwise,
+set
+<i>
+expanded
+value
+</i>
+to
+<i>
+value
+</i>.
+If
+<i>
+expanded
+value
+</i>
+is
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>,
+set
+the
+<code>
+@value
+</code>
+member
+of
+<i>
+result
+</i>
+to
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>
+and
+continue
+with
+the
+next
+<i>
+key
+</i>
+from
+<i>
+element
+</i>.
+Null
+values
+need
+to
+be
+preserved
+in
+this
+case
+as
+the
+meaning
+of
+an
+<code>
+@type
+</code>
+member
+depends
+on
+the
+existence
+of
+an
+<code>
+@value
+</code>
+member.
+</li>
+<li>
+If
+<i>
+expanded
+property
+</i>
+is
+<code>
+@language
+</code>
+and
+<i>
+value
+</i>
+is
+not
+a
+<a class="tref internalDFN" title="string" href="#dfn-string">
+string
+</a>,
+an
+<code class="error">
+<a href="#idl-def-JsonLdErrorCode.invalid-language-tagged-string">
+invalid
+language-tagged
+string
+</a>
+</code>
+error
+has
+been
+detected
+and
+processing
+is
+aborted.
+Otherwise,
+set
+<i>
+expanded
+value
+</i>
+to
+lowercased
+<i>
+value
+</i>.
+</li>
+<li>
+If
+<i>
+expanded
+property
+</i>
+is
+<code>
+@index
+</code>
+and
+<i>
+value
+</i>
+is
+not
+a
+<a class="tref internalDFN" title="string" href="#dfn-string">
+string
+</a>,
+an
+<code class="error">
+<a href="#idl-def-JsonLdErrorCode.invalid--index-value">
+invalid
+@index
+value
+</a>
+</code>
+error
+has
+been
+detected
+and
+processing
+is
+aborted.
+Otherwise,
+set
+<i>
+expanded
+value
+</i>
+to
+<i>
+value
+</i>.
+</li>
+<li>
+If
+<i>
+expanded
+property
+</i>
+is
+<code>
+@list
+</code>:
+<ol class="algorithm">
+<li>
+If
+<a class="tref internalDFN" title="active-property" href="#dfn-active-property">
+active
+property
+</a>
+is
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>
+or
+<code>
+@graph
+</code>,
+continue
+with
+the
+next
+<i>
+key
+</i>
+from
+<i>
+element
+</i>
+to
+remove
+the
+free-floating
+list.
+</li>
+<li>
+Otherwise,
+initialize
+<i>
+expanded
+value
+</i>
+to
+the
+result
+of
+using
+this
+algorithm
+recursively
+passing
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>,
+<a class="tref internalDFN" title="active-property" href="#dfn-active-property">
+active
+property
+</a>,
+and
+<i>
+value
+</i>
+for
+<i>
+element
+</i>.
+</li>
+<li>
+If
+<i>
+expanded
+value
+</i>
+is
+a
+<a class="tref internalDFN" title="list-object" href="#dfn-list-object">
+list
+object
+</a>,
+a
+<code class="error">
+<a href="#idl-def-JsonLdErrorCode.list-of-lists">
+list
+of
+lists
+</a>
+</code>
+error
+has
+been
+detected
+and
+processing
+is
+aborted.
+</li>
+</ol>
+</li>
+<li>
+If
+<i>
+expanded
+property
+</i>
+is
+<code>
+@set
+</code>,
+set
+<i>
+expanded
+value
+</i>
+to
+the
+result
+of
+using
+this
+algorithm
+recursively,
+passing
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>,
+<a class="tref internalDFN" title="active-property" href="#dfn-active-property">
+active
+property
+</a>,
+and
+<i>
+value
+</i>
+for
+<i>
+element
+</i>.
+</li>
+<li>
+If
+<i>
+expanded
+property
+</i>
+is
+<code>
+@reverse
+</code>
+and
+<i>
+value
+</i>
+is
+not
+a
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>,
+an
+<code class="error">
+<a href="#idl-def-JsonLdErrorCode.invalid--reverse-value">
+invalid
+@reverse
+value
+</a>
+</code>
+error
+has
+been
+detected
+and
+processing
+is
+aborted.
+Otherwise
+<ol class="algorithm">
+<li>
+Initialize
+<i>
+expanded
+value
+</i>
+to
+the
+result
+of
+using
+this
+algorithm
+recursively,
+passing
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>,
+<code>
+@reverse
+</code>
+as
+<a class="tref internalDFN" title="active-property" href="#dfn-active-property">
+active
+property
+</a>,
+and
+<i>
+value
+</i>
+as
+<i>
+element
+</i>.
+</li>
+<li>
+If
+<i>
+expanded
+value
+</i>
+contains
+an
+<code>
+@reverse
+</code>
+member,
+i.e.,
+properties
+that
+are
+reversed
+twice,
+execute
+for
+each
+of
+its
+<i>
+property
+</i>
+and
+<i>
+item
+</i>
+the
+following
+steps:
+<ol class="algorithm">
+<li>
+If
+<i>
+result
+</i>
+does
+not
+have
+a
+<i>
+property
+</i>
+member,
+create
+one
+and
+set
+its
+value
+to
+an
+empty
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>.
+</li>
+<li>
+Append
+<i>
+item
+</i>
+to
+the
+value
+of
+the
+<i>
+property
+</i>
+member
+of
+<i>
+result
+</i>.
+</li>
+</ol>
+</li>
+<li>
+If
+<i>
+expanded
+value
+</i>
+contains
+members
+other
+than
+<code>
+@reverse
+</code>:
+<ol class="algorithm">
+<li>
+If
+<i>
+result
+</i>
+does
+not
+have
+an
+<code>
+@reverse
+</code>
+member,
+create
+one
+and
+set
+its
+value
+to
+an
+empty
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>.
+</li>
+<li>
+Reference
+the
+value
+of
+the
+<code>
+@reverse
+</code>
+member
+in
+<i>
+result
+</i>
+using
+the
+variable
+<i>
+reverse
+map
+</i>.
+</li>
+<li>
+For
+each
+<i>
+property
+</i>
+and
+<i>
+items
+</i>
+in
+<i>
+expanded
+value
+</i>
+other
+than
+<code>
+@reverse
+</code>:
+<ol class="algorithm">
+<li>
+For
+each
+<i>
+item
+</i>
+in
+<i>
+items
+</i>:
+<ol class="algorithm">
+<li>
+If
+<i>
+item
+</i>
+is
+a
+<a class="tref internalDFN" title="value-object" href="#dfn-value-object">
+value
+object
+</a>
+or
+<a class="tref internalDFN" title="list-object" href="#dfn-list-object">
+list
+object
+</a>,
+an
+<code class="error">
+<a href="#idl-def-JsonLdErrorCode.invalid--reverse-value">
+invalid
+reverse
+property
+value
+</a>
+</code>
+has
+been
+detected
+and
+processing
+is
+aborted.
+</li>
+<li>
+If
+<i>
+reverse
+map
+</i>
+has
+no
+<i>
+property
+</i>
+member,
+create
+one
+and
+initialize
+its
+value
+to
+an
+empty
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>.
+</li>
+<li>
+Append
+<i>
+item
+</i>
+to
+the
+value
+of
+the
+<i>
+property
+</i>
+member
+in
+<i>
+reverse
+map
+</i>.
+</li>
+</ol>
+</li>
+</ol>
+</li>
+</ol>
+</li>
+<li>
+Continue
+with
+the
+next
+<i>
+key
+</i>
+from
+<i>
+element
+</i>.
+</li>
+</ol>
+</li>
+<li>
+Unless
+<i>
+expanded
+value
+</i>
+is
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>,
+set
+the
+<i>
+expanded
+property
+</i>
+member
+of
+<i>
+result
+</i>
+to
+<i>
+expanded
+value
+</i>.
+</li>
+<li>
+Continue
+with
+the
+next
+<i>
+key
+</i>
+from
+<i>
+element
+</i>.
+</li>
+</ol>
+</li>
+<li>
+Otherwise,
+if
+<i>
+key
+</i>
+'s
+<a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">
+container
+mapping
+</a>
+in
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>
+is
+<code>
+@language
+</code>
+and
+<i>
+value
+</i>
+is
+a
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>
+then
+<i>
+value
+</i>
+is
+expanded
+from
+a
+<a class="tref externalDFN" title="language-map" href="http://www.w3.org/TR/2013/CR-json-ld-20130822/#dfn-language-map">
+language
+map
+</a>
+as
+follows:
+<ol class="algorithm">
+<li>
+Initialize
+<i>
+expanded
+value
+</i>
+to
+an
+empty
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>.
+</li>
+<li>
+For
+each
+key-value
+pair
+<i>
+language
+</i>
+-
+<i>
+language
+value
+</i>
+in
+<i>
+value
+</i>,
+ordered
+lexicographically
+by
+<i>
+language
+</i>:
+<ol class="algorithm">
+<li>
+If
+<i>
+language
+value
+</i>
+is
+not
+an
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>
+set
+it
+to
+an
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>
+containing
+only
+<i>
+language
+value
+</i>.
+</li>
+<li>
+For
+each
+<i>
+item
+</i>
+in
+<i>
+language
+value
+</i>:
+<ol class="algorithm">
+<li>
+<i>
+item
+</i>
+must
+be
+a
+<a class="tref internalDFN" title="string" href="#dfn-string">
+string
+</a>,
+otherwise
+an
+<code class="error">
+<a href="#idl-def-JsonLdErrorCode.invalid-language-map-value">
+invalid
+language
+map
+value
+</a>
+</code>
+error
+has
+been
+detected
+and
+processing
+is
+aborted.
+</li>
+<li>
+Append
+a
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>
+to
+<i>
+expanded
+value
+</i>
+that
+consists
+of
+two
+key-value
+pairs:
+(
+<code>
+@value
+</code>
+-
+<i>
+item
+</i>
+)
+and
+(
+<code>
+@language
+</code>
+-lowercased
+<i>
+language
+</i>
+).
+</li>
+</ol>
+</li>
+</ol>
+</li>
+</ol>
+</li>
+<li>
+Otherwise,
+if
+<i>
+key
+</i>
+'s
+<a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">
+container
+mapping
+</a>
+in
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>
+is
+<code>
+@index
+</code>
+and
+<i>
+value
+</i>
+is
+a
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>
+then
+<i>
+value
+</i>
+is
+expanded
+from
+an
+index
+map
+as
+follows:
+<ol class="algorithm">
+<li>
+Initialize
+<i>
+expanded
+value
+</i>
+to
+an
+empty
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>.
+</li>
+<li>
+For
+each
+key-value
+pair
+<i>
+index
+</i>
+-
+<i>
+index
+value
+</i>
+in
+<i>
+value
+</i>,
+ordered
+lexicographically
+by
+<i>
+index
+</i>:
+<ol class="algorithm">
+<li>
+If
+<i>
+index
+value
+</i>
+is
+not
+an
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>
+set
+it
+to
+an
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>
+containing
+only
+<i>
+index
+value
+</i>.
+</li>
+<li>
+Initialize
+<i>
+index
+value
+</i>
+to
+the
+result
+of
+using
+this
+algorithm
+recursively,
+passing
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>,
+<i>
+key
+</i>
+as
+<a class="tref internalDFN" title="active-property" href="#dfn-active-property">
+active
+property
+</a>,
+and
+<i>
+index
+value
+</i>
+as
+<i>
+element
+</i>.
+</li>
+<li>
+For
+each
+<i>
+item
+</i>
+in
+<i>
+index
+value
+</i>:
+<ol class="algorithm">
+<li>
+If
+<i>
+item
+</i>
+does
+not
+have
+the
+key
+<code>
+@index
+</code>,
+add
+the
+key-value
+pair
+(
+<code>
+@index
+</code>
+-
+<i>
+index
+</i>
+)
+to
+<i>
+item
+</i>.
+</li>
+<li>
+Append
+<i>
+item
+</i>
+to
+<i>
+expanded
+value
+</i>.
+</li>
+</ol>
+</li>
+</ol>
+</li>
+</ol>
+</li>
+<li>
+Otherwise,
+initialize
+<i>
+expanded
+value
+</i>
+to
+the
+result
+of
+using
+this
+algorithm
+recursively,
+passing
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>,
+<i>
+key
+</i>
+for
+<a class="tref internalDFN" title="active-property" href="#dfn-active-property">
+active
+property
+</a>,
+and
+<i>
+value
+</i>
+for
+<i>
+element
+</i>.
+</li>
+<li>
+If
+<i>
+expanded
+value
+</i>
+is
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>,
+ignore
+<i>
+key
+</i>
+by
+continuing
+to
+the
+next
+<i>
+key
+</i>
+from
+<i>
+element
+</i>.
+</li>
+<li>
+If
+the
+<a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">
+container
+mapping
+</a>
+associated
+to
+<i>
+key
+</i>
+in
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>
+is
+<code>
+@list
+</code>
+and
+<i>
+expanded
+value
+</i>
+is
+not
+already
+a
+<a class="tref internalDFN" title="list-object" href="#dfn-list-object">
+list
+object
+</a>,
+convert
+<i>
+expanded
+value
+</i>
+to
+a
+<a class="tref internalDFN" title="list-object" href="#dfn-list-object">
+list
+object
+</a>
+by
+first
+setting
+it
+to
+an
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>
+containing
+only
+<i>
+expanded
+value
+</i>
+if
+it
+is
+not
+already
+an
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>,
+and
+then
+by
+setting
+it
+to
+a
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>
+containing
+the
+key-value
+pair
+<code>
+@list
+</code>
+-
+<i>
+expanded
+value
+</i>.
+</li>
+<li>
+Otherwise,
+if
+the
+<a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">
+term
+definition
+</a>
+associated
+to
+<i>
+key
+</i>
+indicates
+that
+it
+is
+a
+<a class="tref internalDFN" title="reverse-property" href="#dfn-reverse-property">
+reverse
+property
+</a>
+<ol class="algorithm">
+<li>
+If
+<i>
+result
+</i>
+has
+no
+<code>
+@reverse
+</code>
+member,
+create
+one
+and
+initialize
+its
+value
+to
+an
+empty
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>.
+</li>
+<li>
+Reference
+the
+value
+of
+the
+<code>
+@reverse
+</code>
+member
+in
+<i>
+result
+</i>
+using
+the
+variable
+<i>
+reverse
+map
+</i>.
+</li>
+<li>
+If
+<i>
+expanded
+value
+</i>
+is
+not
+an
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>,
+set
+it
+to
+an
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>
+containing
+<i>
+expanded
+value
+</i>.
+</li>
+<li>
+For
+each
+<i>
+item
+</i>
+in
+<i>
+expanded
+value
+</i>
+<ol class="algorithm">
+<li>
+If
+<i>
+item
+</i>
+is
+a
+<a class="tref internalDFN" title="value-object" href="#dfn-value-object">
+value
+object
+</a>
+or
+<a class="tref internalDFN" title="list-object" href="#dfn-list-object">
+list
+object
+</a>,
+an
+<code class="error">
+<a href="#idl-def-JsonLdErrorCode.invalid--reverse-value">
+invalid
+reverse
+property
+value
+</a>
+</code>
+has
+been
+detected
+and
+processing
+is
+aborted.
+</li>
+<li>
+If
+<i>
+reverse
+map
+</i>
+has
+no
+<i>
+expanded
+property
+</i>
+member,
+create
+one
+and
+initialize
+its
+value
+to
+an
+empty
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>.
+</li>
+<li>
+Append
+<i>
+item
+</i>
+to
+the
+value
+of
+the
+<i>
+expanded
+property
+</i>
+member
+of
+<i>
+reverse
+map
+</i>.
+</li>
+</ol>
+</li>
+</ol>
+</li>
+<li>
+Otherwise,
+if
+<i>
+key
+</i>
+is
+not
+a
+<a class="tref internalDFN" title="reverse-property" href="#dfn-reverse-property">
+reverse
+property
+</a>:
+<ol class="algorithm">
+<li>
+If
+<i>
+result
+</i>
+does
+not
+have
+an
+<i>
+expanded
+property
+</i>
+member,
+create
+one
+and
+initialize
+its
+value
+to
+an
+empty
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>.
+</li>
+<li>
+Append
+<i>
+expanded
+value
+</i>
+to
+value
+of
+the
+<i>
+expanded
+property
+</i>
+member
+of
+<i>
+result
+</i>.
+</li>
+</ol>
+</li>
+</ol>
+</li>
+<li>
+If
+<i>
+result
+</i>
+contains
+the
+key
+<code>
+@value
+</code>:
+<ol class="algorithm">
+<li>
+The
+<i>
+result
+</i>
+must
+not
+contain
+any
+keys
+other
+than
+<code>
+@value
+</code>,
+<code>
+@language
+</code>,
+<code>
+@type
+</code>,
+and
+<code>
+@index
+</code>.
+It
+must
+not
+contain
+both
+the
+<code>
+@language
+</code>
+key
+and
+the
+<code>
+@type
+</code>
+key.
+Otherwise,
+an
+<code class="error">
+<a href="#idl-def-JsonLdErrorCode.invalid-value-object">
+invalid
+value
+object
+</a>
+</code>
+error
+has
+been
+detected
+and
+processing
+is
+aborted.
+</li>
+<li>
+If
+the
+value
+of
+<i>
+result
+</i>
+'s
+<code>
+@value
+</code>
+key
+is
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>,
+then
+set
+<i>
+result
+</i>
+to
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>.
+</li>
+<li>
+Otherwise,
+if
+the
+value
+of
+<i>
+result
+</i>
+'s
+<code>
+@value
+</code>
+member
+is
+not
+a
+<a class="tref internalDFN" title="string" href="#dfn-string">
+string
+</a>
+and
+<i>
+result
+</i>
+contains
+the
+key
+<code>
+@language
+</code>,
+an
+<code class="error">
+<a href="#idl-def-JsonLdErrorCode.invalid-language-tagged-value">
+invalid
+language-tagged
+value
+</a>
+</code>
+error
+has
+been
+detected
+(only
+<a class="tref internalDFN" title="string" href="#dfn-string">
+strings
+</a>
+can
+be
+language-tagged)
+and
+processing
+is
+aborted.
+</li>
+<li>
+Otherwise,
+if
+the
+<i>
+result
+</i>
+has
+a
+<code>
+@type
+</code>
+member
+and
+its
+value
+is
+not
+<del class="diff-old">a
+string
+</del>
+<ins class="diff-chg">an
+</ins><a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier"><ins class="diff-chg">
+IRI
+</ins></abbr>
+</a>,
+an
+<code class="error">
+<a href="#idl-def-JsonLdErrorCode.invalid-typed-value">
+invalid
+typed
+value
+</a>
+</code>
+error
+has
+been
+detected
+and
+processing
+is
+aborted.
+</li>
+</ol>
+</li>
+<li>
+Otherwise,
+if
+<i>
+result
+</i>
+contains
+the
+key
+<code>
+@type
+</code>
+and
+its
+associated
+value
+is
+not
+an
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>,
+set
+it
+to
+an
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>
+containing
+only
+the
+associated
+value.
+</li>
+<li>
+Otherwise,
+if
+<i>
+result
+</i>
+contains
+the
+key
+<code>
+@set
+</code>
+or
+<code>
+@list
+</code>:
+<ol class="algorithm">
+<li>
+The
+<i>
+result
+</i>
+must
+contain
+at
+most
+one
+other
+key
+and
+that
+key
+must
+be
+<code>
+@index
+</code>.
+Otherwise,
+an
+<code class="error">
+<a href="#idl-def-JsonLdErrorCode.invalid-set-or-list-object">
+invalid
+set
+or
+list
+object
+</a>
+</code>
+error
+has
+been
+detected
+and
+processing
+is
+aborted.
+</li>
+<li>
+If
+<i>
+result
+</i>
+contains
+the
+key
+<code>
+@set
+</code>,
+then
+set
+<i>
+result
+</i>
+to
+the
+key's
+associated
+value.
+</li>
+</ol>
+</li>
+<li>
+If
+<i>
+result
+</i>
+contains
+only
+the
+key
+<code>
+@language
+</code>,
+set
+<i>
+result
+</i>
+to
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>.
+</li>
+<li>
+If
+<a class="tref internalDFN" title="active-property" href="#dfn-active-property">
+active
+property
+</a>
+is
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>
+or
+<code>
+@graph
+</code>,
+drop
+free-floating
+values
+as
+follows:
+<ol class="algorithm">
+<li>
+If
+<i>
+result
+</i>
+is
+an
+empty
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>
+or
+contains
+the
+keys
+<code>
+@value
+</code>
+or
+<code>
+@list
+</code>,
+set
+<i>
+result
+</i>
+to
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>.
+</li>
+<li>
+Otherwise,
+if
+<i>
+result
+</i>
+is
+a
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>
+whose
+only
+key
+is
+<code>
+@id
+</code>,
+set
+<i>
+result
+</i>
+to
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>.
+</li>
+</ol>
+</li>
+<li>
+Return
+<i>
+result
+</i>.
+</li>
+</ol>
+<p>
+If,
+after
+the
+above
+algorithm
+is
+run,
+the
+result
+is
+a
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>
+that
+contains
+only
+an
+<code>
+@graph
+</code>
+key,
+set
+the
+result
+to
+the
+value
+of
+<code>
+@graph
+</code>
+'s
+value.
+Otherwise,
+if
+the
+result
+is
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>,
+set
+it
+to
+an
+empty
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>.
+Finally,
+if
+the
+result
+is
+not
+an
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>,
+then
+set
+the
+result
+to
+an
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>
+containing
+only
+the
+result.
+</p>
+</section>
+</section>
+<section id="value-expansion">
+<h3>
+<span class="secno">
+7.2
+</span>
+Value
+Expansion
+</h3>
+<p>
+Some
+values
+in
+JSON-LD
+can
+be
+expressed
+in
+a
+<a class="tref internalDFN" title="compacted-form" href="#dfn-compacted-form">
+compact
+form
+</a>.
+These
+values
+are
+required
+to
+be
+<a class="tref internalDFN" title="expansion" href="#dfn-expansion">
+expanded
+</a>
+at
+times
+when
+processing
+JSON-LD
+documents.
+A
+value
+is
+said
+to
+be
+in
+<dfn title="expanded-form" id="dfn-expanded-form">
+expanded
+form
+</dfn>
+after
+the
+application
+of
+this
+algorithm.
+</p>
+<section class="informative">
+<h4 id="overview-4">
+Overview
+</h4>
+<p>
+<em>
+This
+section
+is
+non-normative.
+</em>
+</p>
+<p>
+If
+<a class="tref internalDFN" title="active-property" href="#dfn-active-property">
+active
+property
+</a>
+has
+a
+<a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">
+type
+mapping
+</a>
+in
+the
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>
+set
+to
+<code>
+@id
+</code>
+or
+<code>
+@vocab
+</code>,
+a
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>
+with
+a
+single
+member
+<code>
+@id
+</code>
+whose
+value
+is
+the
+result
+of
+using
+the
+<a href="#iri-expansion">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+Expansion
+algorithm
+</a>
+on
+<i>
+value
+</i>
+is
+returned.
+</p>
+<p>
+Otherwise,
+the
+result
+will
+be
+a
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>
+containing
+an
+<code>
+@value
+</code>
+member
+whose
+value
+is
+the
+passed
+<i>
+value
+</i>.
+Additionally,
+an
+<code>
+@type
+</code>
+member
+will
+be
+included
+if
+there
+is
+a
+<a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">
+type
+mapping
+</a>
+associated
+with
+the
+<a class="tref internalDFN" title="active-property" href="#dfn-active-property">
+active
+property
+</a>
+or
+an
+<code>
+@language
+</code>
+member
+if
+<i>
+value
+</i>
+is
+a
+<a class="tref internalDFN" title="string" href="#dfn-string">
+string
+</a>
+and
+there
+is
+<a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">
+language
+mapping
+</a>
+associated
+with
+the
+<a class="tref internalDFN" title="active-property" href="#dfn-active-property">
+active
+property
+</a>.
+</p>
+</section>
+<section>
+<h4 id="algorithm-4">
+Algorithm
+</h4>
+<p>
+The
+algorithm
+takes
+three
+required
+inputs:
+an
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>,
+an
+<a class="tref internalDFN" title="active-property" href="#dfn-active-property">
+active
+property
+</a>,
+and
+a
+<i>
+value
+</i>
+to
+expand.
+</p>
+<ol class="algorithm">
+<li>
+If
+the
+<a class="tref internalDFN" title="active-property" href="#dfn-active-property">
+active
+property
+</a>
+has
+a
+<a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">
+type
+mapping
+</a>
+in
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>
+that
+is
+<code>
+@id
+</code>,
+return
+a
+new
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>
+containing
+a
+single
+key-value
+pair
+where
+the
+key
+is
+<code>
+@id
+</code>
+and
+the
+value
+is
+the
+result
+of
+using
+the
+<a href="#iri-expansion">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+Expansion
+algorithm
+</a>,
+passing
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>,
+<i>
+value
+</i>,
+and
+<a class="tref internalDFN" title="true" href="#dfn-true">
+true
+</a>
+for
+<i>
+document
+relative
+</i>.
+</li>
+<li>
+If
+<a class="tref internalDFN" title="active-property" href="#dfn-active-property">
+active
+property
+</a>
+has
+a
+<a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">
+type
+mapping
+</a>
+in
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>
+that
+is
+<code>
+@vocab
+</code>,
+return
+a
+new
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>
+containing
+a
+single
+key-value
+pair
+where
+the
+key
+is
+<code>
+@id
+</code>
+and
+the
+value
+is
+the
+result
+of
+using
+the
+<a href="#iri-expansion">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+Expansion
+algorithm
+</a>,
+passing
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>,
+<i>
+value
+</i>,
+<a class="tref internalDFN" title="true" href="#dfn-true">
+true
+</a>
+for
+<i>
+vocab
+</i>,
+and
+<a class="tref internalDFN" title="true" href="#dfn-true">
+true
+</a>
+for
+<i>
+document
+relative
+</i>.
+</li>
+<li>
+Otherwise,
+initialize
+<i>
+result
+</i>
+to
+a
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>
+with
+an
+<code>
+@value
+</code>
+member
+whose
+value
+is
+set
+to
+<i>
+value
+</i>.
+</li>
+<li>
+If
+<a class="tref internalDFN" title="active-property" href="#dfn-active-property">
+active
+property
+</a>
+has
+a
+<a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">
+type
+mapping
+</a>
+in
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>,
+add
+an
+<code>
+@type
+</code>
+member
+to
+<i>
+result
+</i>
+and
+set
+its
+value
+to
+the
+value
+associated
+with
+the
+<a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">
+type
+mapping
+</a>.
+</li>
+<li>
+Otherwise,
+if
+<i>
+value
+</i>
+is
+a
+<a class="tref internalDFN" title="string" href="#dfn-string">
+string
+</a>:
+<ol class="algorithm">
+<li>
+If
+a
+<a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">
+language
+mapping
+</a>
+is
+associated
+with
+<a class="tref internalDFN" title="active-property" href="#dfn-active-property">
+active
+property
+</a>
+in
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>,
+add
+an
+<code>
+@language
+</code>
+to
+<i>
+result
+</i>
+and
+set
+its
+value
+to
+the
+language
+code
+associated
+with
+the
+<a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">
+language
+mapping
+</a>
+;
+unless
+the
+<a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">
+language
+mapping
+</a>
+is
+set
+to
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>
+in
+which
+case
+no
+member
+is
+added.
+</li>
+<li>
+Otherwise,
+if
+the
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>
+has
+a
+<a class="tref internalDFN" title="default-language" href="#dfn-default-language">
+default
+language
+</a>,
+add
+an
+<code>
+@language
+</code>
+to
+<i>
+result
+</i>
+and
+set
+its
+value
+to
+the
+<a class="tref internalDFN" title="default-language" href="#dfn-default-language">
+default
+language
+</a>.
+</li>
+</ol>
+</li>
+<li>
+Return
+<i>
+result
+</i>.
+</li>
+</ol>
+</section>
+</section>
+</section>
+<section id="compaction-algorithms">
+<h2>
+<span class="secno">
+8.
+</span>
+Compaction
+Algorithms
+</h2>
+<section id="compaction-algorithm">
+<h3>
+<span class="secno">
+8.1
+</span>
+Compaction
+Algorithm
+</h3>
+<p>
+This
+algorithm
+compacts
+a
+JSON-LD
+document,
+such
+that
+the
+given
+<a class="tref internalDFN" title="context" href="#dfn-context">
+context
+</a>
+is
+applied.
+This
+must
+result
+in
+shortening
+any
+applicable
+<a class="tref internalDFN" title="iri" href="#dfn-iri">
+IRIs
+</a>
+to
+<a class="tref internalDFN" title="term" href="#dfn-term">
+terms
+</a>
+or
+<a class="tref internalDFN" title="compact-iri" href="#dfn-compact-iri">
+compact
+IRIs
+</a>,
+any
+applicable
+<a class="tref internalDFN" title="keyword" href="#dfn-keyword">
+keywords
+</a>
+to
+<a class="tref internalDFN" title="keyword-alias" href="#dfn-keyword-alias">
+keyword
+aliases
+</a>,
+and
+any
+applicable
+<a class="tref internalDFN" title="json-ld-value" href="#dfn-json-ld-value">
+JSON-LD
+values
+</a>
+expressed
+in
+<a class="tref internalDFN" title="expanded-form" href="#dfn-expanded-form">
+expanded
+form
+</a>
+to
+simple
+values
+such
+as
+<a class="tref internalDFN" title="string" href="#dfn-string">
+strings
+</a>
+or
+<a class="tref internalDFN" title="number" href="#dfn-number">
+numbers
+</a>.
+</p>
+<section class="informative">
+<h4 id="overview-5">
+Overview
+</h4>
+<p>
+<em>
+This
+section
+is
+non-normative.
+</em>
+</p>
+<p>
+Starting
+with
+its
+root
+<i>
+element
+</i>,
+we
+can
+process
+the
+JSON-LD
+document
+recursively,
+until
+we
+have
+a
+fully
+<a class="tref internalDFN" title="compaction" href="#dfn-compaction">
+compacted
+</a>
+<i>
+result
+</i>.
+When
+<a class="tref internalDFN" title="compaction" href="#dfn-compaction">
+compacting
+</a>
+an
+<i>
+element
+</i>,
+we
+can
+treat
+each
+one
+differently
+according
+to
+its
+type,
+in
+order
+to
+break
+down
+the
+problem:
+</p>
+<ol>
+<li>
+If
+the
+<i>
+element
+</i>
+is
+a
+<a class="tref internalDFN" title="scalar" href="#dfn-scalar">
+scalar
+</a>,
+it
+is
+already
+in
+<a class="tref internalDFN" title="compacted-form" href="#dfn-compacted-form">
+compacted
+form
+</a>,
+so
+we
+simply
+return
+it.
+</li>
+<li>
+If
+the
+<i>
+element
+</i>
+is
+an
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>,
+we
+compact
+each
+of
+its
+items
+recursively
+and
+return
+them
+in
+a
+new
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>.
+</li>
+<li>
+Otherwise
+<i>
+element
+</i>
+is
+a
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>.
+The
+value
+of
+each
+key
+in
+element
+is
+compacted
+recursively.
+Some
+of
+the
+keys
+will
+be
+compacted,
+using
+the
+<a href="#iri-compaction">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+Compaction
+algorithm
+</a>,
+to
+<a class="tref internalDFN" title="term" href="#dfn-term">
+terms
+</a>
+or
+<a class="tref internalDFN" title="compact-iri" href="#dfn-compact-iri">
+compact
+IRIs
+</a>
+and
+others
+will
+be
+compacted
+from
+<a class="tref internalDFN" title="keyword" href="#dfn-keyword">
+keywords
+</a>
+to
+<a class="tref internalDFN" title="keyword-alias" href="#dfn-keyword-alias">
+keyword
+aliases
+</a>
+or
+simply
+left
+unchanged
+because
+they
+do
+not
+have
+definitions
+in
+the
+<a class="tref internalDFN" title="context" href="#dfn-context">
+context
+</a>.
+Values
+will
+be
+converted
+to
+<a class="tref internalDFN" title="compacted-form" href="#dfn-compacted-form">
+compacted
+form
+</a>
+via
+the
+<a href="#value-compaction">
+Value
+Compaction
+algorithm
+</a>.
+Some
+data
+will
+be
+reshaped
+based
+on
+<a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">
+container
+mappings
+</a>
+specified
+in
+the
+context
+such
+as
+<code>
+@index
+</code>
+or
+<code>
+@language
+</code>
+maps.
+</li>
+</ol>
+<p>
+The
+final
+output
+is
+a
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>
+with
+a
+<code>
+@context
+</code>
+key,
+if
+a
+non-empty
+<a class="tref internalDFN" title="context" href="#dfn-context">
+context
+</a>
+was
+given,
+where
+the
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>
+is
+either
+<i>
+result
+</i>
+or
+a
+wrapper
+for
+it
+where
+<i>
+result
+</i>
+appears
+as
+the
+value
+of
+an
+(aliased)
+<code>
+@graph
+</code>
+key
+because
+<i>
+result
+</i>
+contained
+two
+or
+more
+items
+in
+an
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>.
+</p>
+</section>
+<section>
+<h4 id="algorithm-5">
+Algorithm
+</h4>
+<p>
+The
+algorithm
+takes
+five
+required
+input
+variables:
+an
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>,
+an
+<a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">
+inverse
+context
+</a>,
+an
+<a class="tref internalDFN" title="active-property" href="#dfn-active-property">
+active
+property
+</a>,
+an
+<i>
+element
+</i>
+to
+be
+compacted,
+and
+a
+flag
+<code class="idlMemberName">
+<a href="#widl-JsonLdOptions-compactArrays">
+compactArrays
+</a>
+</code>.
+To
+begin,
+the
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>
+is
+set
+to
+the
+result
+of
+performing
+<a href="#context-processing-algorithm">
+Context
+Processing
+</a>
+on
+the
+passed
+<a class="tref internalDFN" title="context" href="#dfn-context">
+context
+</a>,
+the
+<a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">
+inverse
+context
+</a>
+is
+set
+to
+the
+result
+of
+performing
+the
+<a href="#inverse-context-creation">
+Inverse
+Context
+Creation
+algorithm
+</a>
+on
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>,
+the
+<a class="tref internalDFN" title="active-property" href="#dfn-active-property">
+active
+property
+</a>
+is
+set
+to
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>,
+<i>
+element
+</i>
+is
+set
+to
+the
+result
+of
+performing
+the
+<a href="#expansion-algorithm">
+Expansion
+algorithm
+</a>
+on
+the
+<a class="tref internalDFN" title="json-ld-input" href="#dfn-json-ld-input">
+JSON-LD
+input
+</a>,
+and,
+if
+not
+passed,
+<code class="idlMemberName">
+<a href="#widl-JsonLdOptions-compactArrays">
+compactArrays
+</a>
+</code>
+is
+set
+to
+<a class="tref internalDFN" title="true" href="#dfn-true">
+true
+</a>.
+</p>
+<ol class="algorithm">
+<li>
+If
+<i>
+element
+</i>
+is
+a
+<a class="tref internalDFN" title="scalar" href="#dfn-scalar">
+scalar
+</a>,
+it
+is
+already
+in
+its
+most
+compact
+form,
+so
+simply
+return
+<i>
+element
+</i>.
+</li>
+<li>
+If
+<i>
+element
+</i>
+is
+an
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>:
+<ol class="algorithm">
+<li>
+Initialize
+<i>
+result
+</i>
+to
+an
+empty
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>.
+</li>
+<li>
+For
+each
+<i>
+item
+</i>
+in
+<i>
+element
+</i>:
+<ol class="algorithm">
+<li>
+Initialize
+<i>
+compacted
+item
+</i>
+to
+the
+result
+of
+using
+this
+algorithm
+recursively,
+passing
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>,
+<a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">
+inverse
+context
+</a>,
+<a class="tref internalDFN" title="active-property" href="#dfn-active-property">
+active
+property
+</a>,
+and
+<em>
+item
+</em>
+for
+<i>
+element
+</i>.
+</li>
+<li>
+If
+<i>
+compacted
+item
+</i>
+is
+not
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>,
+then
+append
+it
+to
+<i>
+result
+</i>.
+</li>
+</ol>
+</li>
+<li>
+If
+<i>
+result
+</i>
+contains
+only
+one
+item
+(it
+has
+a
+length
+of
+<code>
+1
+</code>
+),
+<a class="tref internalDFN" title="active-property" href="#dfn-active-property">
+active
+property
+</a>
+has
+no
+<a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">
+container
+mapping
+</a>
+in
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>,
+and
+<code class="idlMemberName">
+<a href="#widl-JsonLdOptions-compactArrays">
+compactArrays
+</a>
+</code>
+is
+<a class="tref internalDFN" title="true" href="#dfn-true">
+true
+</a>,
+set
+<i>
+result
+</i>
+to
+its
+only
+item.
+</li>
+<li>
+Return
+<i>
+result
+</i>.
+</li>
+</ol>
+</li>
+<li>
+Otherwise
+<i>
+element
+</i>
+is
+a
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>.
+</li>
+<li>
+If
+<i>
+element
+</i>
+has
+an
+<code>
+@value
+</code>
+or
+<code>
+@id
+</code>
+member
+and
+the
+result
+of
+using
+the
+<a href="#value-compaction">
+Value
+Compaction
+algorithm
+</a>,
+passing
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>,
+<a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">
+inverse
+context
+</a>,
+<a class="tref internalDFN" title="active-property" href="#dfn-active-property">
+active
+property
+</a>,and
+<i>
+element
+</i>
+as
+<i>
+value
+</i>
+is
+a
+<a class="tref internalDFN" title="scalar" href="#dfn-scalar">
+scalar
+</a>,
+return
+that
+result.
+</li>
+<li>
+Initialize
+<i>
+inside
+reverse
+</i>
+to
+<a class="tref internalDFN" title="true" href="#dfn-true">
+true
+</a>
+if
+<a class="tref internalDFN" title="active-property" href="#dfn-active-property">
+active
+property
+</a>
+equals
+<code>
+@reverse
+</code>,
+otherwise
+to
+<a class="tref internalDFN" title="false" href="#dfn-false">
+false
+</a>.
+</li>
+<li>
+Initialize
+<i>
+result
+</i>
+to
+an
+empty
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>.
+</li>
+<li>
+For
+each
+key
+<i>
+expanded
+property
+</i>
+and
+value
+<i>
+expanded
+value
+</i>
+in
+<i>
+element
+</i>,
+ordered
+lexicographically
+by
+<i>
+expanded
+property
+</i>:
+<ol class="algorithm">
+<li>
+If
+<i>
+expanded
+property
+</i>
+is
+<code>
+@id
+</code>
+or
+<code>
+@type
+</code>:
+<ol class="algorithm">
+<li>
+If
+<i>
+expanded
+value
+</i>
+is
+a
+<a class="tref internalDFN" title="string" href="#dfn-string">
+string
+</a>,
+then
+initialize
+<i>
+compacted
+value
+</i>
+to
+the
+result
+of
+using
+the
+<a href="#iri-compaction">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+Compaction
+algorithm
+</a>,
+passing
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>,
+<a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">
+inverse
+context
+</a>,
+<i>
+expanded
+value
+</i>
+for
+<i>
+iri
+</i>,
+and
+<a class="tref internalDFN" title="true" href="#dfn-true">
+true
+</a>
+for
+<i>
+vocab
+</i>
+if
+<i>
+expanded
+property
+</i>
+is
+<code>
+@type
+</code>,
+<a class="tref internalDFN" title="false" href="#dfn-false">
+false
+</a>
+otherwise.
+</li>
+<li>
+Otherwise,
+<i>
+expanded
+value
+</i>
+must
+be
+a
+<code>
+@type
+</code>
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>:
+<ol class="algorithm">
+<li>
+Initialize
+<i>
+compacted
+value
+</i>
+to
+an
+empty
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>.
+</li>
+<li>
+For
+each
+item
+<i>
+expanded
+type
+</i>
+in
+<i>
+expanded
+value
+</i>,
+append
+the
+result
+of
+of
+using
+the
+<a href="#iri-compaction">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+Compaction
+algorithm
+</a>,
+passing
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>,
+<a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">
+inverse
+context
+</a>,
+<i>
+expanded
+type
+</i>
+for
+<i>
+iri
+</i>,
+and
+<a class="tref internalDFN" title="true" href="#dfn-true">
+true
+</a>
+for
+<i>
+vocab
+</i>,
+to
+<i>
+compacted
+value
+</i>.
+</li>
+<li>
+If
+<i>
+compacted
+value
+</i>
+contains
+only
+one
+item
+(it
+has
+a
+length
+of
+<code>
+1
+</code>
+),
+then
+set
+<i>
+compacted
+value
+</i>
+to
+its
+only
+item.
+</li>
+</ol>
+</li>
+<li>
+Initialize
+<i>
+alias
+</i>
+to
+the
+result
+of
+using
+the
+<a href="#iri-compaction">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+Compaction
+algorithm
+</a>,
+passing
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>,
+<a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">
+inverse
+context
+</a>,
+<i>
+expanded
+property
+</i>
+for
+<i>
+iri
+</i>,
+and
+<a class="tref internalDFN" title="true" href="#dfn-true">
+true
+</a>
+for
+<i>
+vocab
+</i>.
+</li>
+<li>
+Add
+a
+member
+<i>
+alias
+</i>
+to
+<i>
+result
+</i>
+whose
+value
+is
+set
+to
+<i>
+compacted
+value
+</i>
+and
+continue
+to
+the
+next
+<i>
+expanded
+property
+</i>.
+</li>
+</ol>
+</li>
+<li>
+If
+<i>
+expanded
+property
+</i>
+is
+<code>
+@reverse
+</code>:
+<ol class="algorithm">
+<li>
+Initialize
+<i>
+compacted
+value
+</i>
+to
+the
+result
+of
+using
+this
+algorithm
+recursively,
+passing
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>,
+<a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">
+inverse
+context
+</a>,
+<code>
+@reverse
+</code>
+for
+<a class="tref internalDFN" title="active-property" href="#dfn-active-property">
+active
+property
+</a>,
+and
+<i>
+expanded
+value
+</i>
+for
+<i>
+element
+</i>.
+</li>
+<li>
+For
+each
+<i>
+property
+</i>
+and
+<i>
+value
+</i>
+in
+<i>
+compacted
+value
+</i>:
+<ol class="algorithm">
+<li>
+If
+the
+<a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">
+term
+definition
+</a>
+for
+<i>
+property
+</i>
+in
+the
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>
+indicates
+that
+<i>
+property
+</i>
+is
+a
+<a class="tref internalDFN" title="reverse-property" href="#dfn-reverse-property">
+reverse
+property
+</a>
+<ol class="algorithm">
+<li>
+If
+<ins class="diff-new">the
+</ins><a class="tref internalDFN" title="term-definition" href="#dfn-term-definition"><ins class="diff-new">
+term
+definition
+</ins></a><ins class="diff-new">
+for
+</ins><i><ins class="diff-new">
+property
+</ins></i><ins class="diff-new">
+in
+the
+</ins><a class="tref internalDFN" title="active-context" href="#dfn-active-context"><ins class="diff-new">
+active
+context
+</ins></a><ins class="diff-new">
+has
+a
+</ins><a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping"><ins class="diff-new">
+container
+mapping
+</ins></a><ins class="diff-new">
+of
+</ins><code><ins class="diff-new">
+@set
+</ins></code><ins class="diff-new">
+or
+</ins>
+<code class="idlMemberName">
+<a href="#widl-JsonLdOptions-compactArrays">
+compactArrays
+</a>
+</code>
+is
+<a class="tref internalDFN" title="false" href="#dfn-false">
+false
+</a>,
+and
+<i>
+value
+</i>
+is
+not
+an
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>,
+set
+<i>
+value
+</i>
+to
+a
+new
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>
+containing
+only
+<i>
+value
+</i>.
+</li>
+<li>
+If
+<i>
+property
+</i>
+is
+not
+a
+member
+of
+<i>
+result
+</i>,
+add
+one
+and
+set
+its
+value
+to
+<i>
+value
+</i>.
+</li>
+<li>
+Otherwise,
+if
+the
+value
+of
+the
+<i>
+property
+</i>
+member
+of
+<i>
+result
+</i>
+is
+not
+an
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>,
+set
+it
+to
+a
+new
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>
+containing
+only
+the
+value.
+Then
+append
+<i>
+value
+</i>
+to
+its
+value
+if
+<i>
+value
+</i>
+is
+not
+an
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>,
+otherwise
+append
+each
+of
+its
+items.
+</li>
+<li>
+Remove
+the
+<i>
+property
+</i>
+member
+from
+<i>
+compacted
+value
+</i>.
+</li>
+</ol>
+</li>
+</ol>
+</li>
+<li>
+If
+<i>
+compacted
+value
+</i>
+has
+some
+remaining
+members,
+i.e.,
+it
+is
+not
+an
+empty
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>:
+<ol class="algorithm">
+<li>
+Initialize
+<i>
+alias
+</i>
+to
+the
+result
+of
+using
+the
+<a href="#iri-compaction">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+Compaction
+algorithm
+</a>,
+passing
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>,
+<a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">
+inverse
+context
+</a>,
+<code>
+@reverse
+</code>
+for
+<i>
+iri
+</i>,
+and
+<a class="tref internalDFN" title="true" href="#dfn-true">
+true
+</a>
+for
+<i>
+vocab
+</i>.
+</li>
+<li>
+Set
+the
+value
+of
+the
+<i>
+alias
+</i>
+member
+of
+<i>
+result
+</i>
+to
+<i>
+compacted
+value
+<del class="diff-old">and
+continue
+</del>
+</i>.
+</li>
+</ol>
+</li>
+<li>
+<ins class="diff-chg">Continue
+</ins>
+with
+the
+next
+<i>
+expanded
+property
+</i>
+from
+<i>
+element
+</i>.
+</li>
+</ol>
+</li>
+<li>
+If
+<i>
+expanded
+property
+</i>
+is
+<code>
+@index
+</code>
+and
+<a class="tref internalDFN" title="active-property" href="#dfn-active-property">
+active
+property
+</a>
+has
+a
+<a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">
+container
+mapping
+</a>
+in
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>
+that
+is
+<code>
+@index
+</code>,
+then
+the
+compacted
+result
+will
+be
+inside
+of
+an
+<code>
+@index
+</code>
+container,
+drop
+the
+<code>
+@index
+</code>
+property
+by
+continuing
+to
+the
+next
+<i>
+expanded
+property
+</i>.
+</li>
+<li>
+Otherwise,
+if
+<i>
+expanded
+property
+</i>
+is
+<code>
+@index
+</code>,
+<code>
+@value
+</code>,
+or
+<code>
+@language
+</code>:
+<ol class="algorithm">
+<li>
+Initialize
+<i>
+alias
+</i>
+to
+the
+result
+of
+using
+the
+<a href="#iri-compaction">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+Compaction
+algorithm
+</a>,
+passing
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>,
+<a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">
+inverse
+context
+</a>,
+<i>
+expanded
+property
+</i>
+for
+<i>
+iri
+</i>,
+and
+<a class="tref internalDFN" title="true" href="#dfn-true">
+true
+</a>
+for
+<i>
+vocab
+</i>.
+</li>
+<li>
+Add
+a
+member
+<i>
+alias
+</i>
+to
+<i>
+result
+</i>
+whose
+value
+is
+set
+to
+<i>
+expanded
+value
+</i>
+and
+continue
+with
+the
+next
+<i>
+expanded
+property
+</i>.
+</li>
+</ol>
+</li>
+<li>
+If
+<i>
+expanded
+value
+</i>
+is
+an
+empty
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>:
+<ol class="algorithm">
+<li>
+Initialize
+<i>
+item
+active
+property
+</i>
+to
+the
+result
+of
+using
+the
+<a href="#iri-compaction">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+Compaction
+algorithm
+</a>,
+passing
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>,
+<a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">
+inverse
+context
+</a>,
+<i>
+expanded
+property
+</i>
+for
+<i>
+iri
+</i>,
+<i>
+expanded
+value
+</i>
+for
+<i>
+value
+</i>,
+<a class="tref internalDFN" title="true" href="#dfn-true">
+true
+</a>
+for
+<i>
+vocab
+</i>,
+and
+<i>
+inside
+reverse
+</i>.
+</li>
+<li>
+If
+<i>
+result
+</i>
+does
+not
+have
+the
+key
+that
+equals
+<i>
+item
+active
+property
+</i>,
+set
+this
+key's
+value
+in
+<i>
+result
+</i>
+to
+an
+empty
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>.
+Otherwise,
+if
+the
+key's
+value
+is
+not
+an
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>,
+then
+set
+it
+to
+one
+containing
+only
+the
+value.
+</li>
+</ol>
+</li>
+<li>
+At
+this
+point,
+<i>
+expanded
+value
+</i>
+must
+be
+an
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>
+due
+to
+the
+<a href="#expansion-algorithm">
+Expansion
+algorithm
+</a>.
+For
+each
+item
+<i>
+expanded
+item
+</i>
+in
+<i>
+expanded
+value
+</i>:
+<ol class="algorithm">
+<li>
+Initialize
+<i>
+item
+active
+property
+</i>
+to
+the
+result
+of
+using
+the
+<a href="#iri-compaction">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+Compaction
+algorithm
+</a>,
+passing
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>,
+<a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">
+inverse
+context
+</a>,
+<i>
+expanded
+property
+</i>
+for
+<i>
+iri
+</i>,
+<i>
+expanded
+item
+</i>
+for
+<i>
+value
+</i>,
+<a class="tref internalDFN" title="true" href="#dfn-true">
+true
+</a>
+for
+<i>
+vocab
+</i>,
+and
+<i>
+inside
+reverse
+</i>.
+</li>
+<li>
+Initialize
+<i>
+container
+</i>
+to
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>.
+If
+there
+is
+a
+<a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">
+container
+mapping
+</a>
+for
+<i>
+item
+active
+property
+</i>
+in
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>,
+set
+<i>
+container
+</i>
+to
+its
+value.
+</li>
+<li>
+Initialize
+<i>
+compacted
+item
+</i>
+to
+the
+result
+of
+using
+this
+algorithm
+recursively,
+passing
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>,
+<a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">
+inverse
+context
+</a>,
+<i>
+item
+active
+property
+</i>
+for
+<a class="tref internalDFN" title="active-property" href="#dfn-active-property">
+active
+property
+</a>,
+<i>
+expanded
+item
+</i>
+for
+<i>
+element
+</i>
+if
+it
+does
+not
+contain
+the
+key
+<code>
+@list
+</code>,
+otherwise
+pass
+the
+key's
+associated
+value
+for
+<i>
+element
+</i>.
+</li>
+<li>
+If
+<i>
+expanded
+item
+</i>
+is
+a
+<a class="tref internalDFN" title="list-object" href="#dfn-list-object">
+list
+object
+</a>:
+<ol class="algorithm">
+<li>
+If
+<i>
+compacted
+item
+</i>
+is
+not
+an
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>,
+then
+set
+it
+to
+an
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>
+containing
+only
+<i>
+compacted
+item
+</i>.
+</li>
+<li>
+If
+<i>
+container
+</i>
+is
+not
+<code>
+@list
+</code>:
+<ol class="algorithm">
+<li>
+Convert
+<i>
+compacted
+item
+</i>
+to
+a
+<a class="tref internalDFN" title="list-object" href="#dfn-list-object">
+list
+object
+</a>
+by
+setting
+it
+to
+a
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>
+containing
+key-value
+pair
+where
+the
+key
+is
+the
+result
+of
+the
+<a href="#iri-compaction">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+Compaction
+algorithm
+</a>,
+passing
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>,
+<a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">
+inverse
+context
+</a>,
+<code>
+@list
+</code>
+for
+<i>
+iri
+</i>,
+and
+<i>
+compacted
+item
+</i>
+for
+<i>
+value
+</i>.
+</li>
+<li>
+If
+<i>
+expanded
+item
+</i>
+contains
+the
+key
+<code>
+@index
+</code>,
+then
+add
+a
+key-value
+pair
+to
+<i>
+compacted
+item
+</i>
+where
+the
+key
+is
+the
+result
+of
+the
+<a href="#iri-compaction">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+Compaction
+algorithm
+</a>,
+passing
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>,
+<a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">
+inverse
+context
+</a>,
+<code>
+@index
+</code>
+as
+<i>
+iri
+</i>,
+and
+the
+value
+associated
+with
+the
+<code>
+@index
+</code>
+key
+in
+<i>
+expanded
+item
+</i>
+as
+<i>
+value
+</i>.
+</li>
+</ol>
+</li>
+<li>
+Otherwise,
+<i>
+item
+active
+property
+</i>
+must
+not
+be
+a
+key
+in
+<i>
+result
+</i>
+because
+there
+cannot
+be
+two
+<a class="tref internalDFN" title="list-object" href="#dfn-list-object">
+list
+objects
+</a>
+associated
+with
+an
+<a class="tref internalDFN" title="active-property" href="#dfn-active-property">
+active
+property
+</a>
+that
+has
+a
+<a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">
+container
+mapping
+</a>
+;
+a
+<code class="error">
+<a href="#idl-def-JsonLdErrorCode.compaction-to-list-of-lists">
+compaction
+to
+list
+of
+lists
+</a>
+</code>
+error
+has
+been
+detected
+and
+processing
+is
+aborted.
+</li>
+</ol>
+</li>
+<li>
+If
+<i>
+container
+</i>
+is
+<code>
+@language
+</code>
+or
+<code>
+@index
+</code>:
+<ol class="algorithm">
+<li>
+If
+<i>
+item
+active
+property
+</i>
+is
+not
+a
+key
+in
+<i>
+result
+</i>,
+initialize
+it
+to
+an
+empty
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>.
+Initialize
+<i>
+map
+object
+</i>
+to
+the
+value
+of
+<i>
+item
+active
+property
+</i>
+in
+<i>
+result
+</i>.
+</li>
+<li>
+If
+<i>
+container
+</i>
+is
+<code>
+@language
+</code>
+and
+<i>
+compacted
+item
+</i>
+contains
+the
+key
+<code>
+@value
+</code>,
+then
+set
+<i>
+compacted
+item
+</i>
+to
+the
+value
+associated
+with
+its
+<code>
+@value
+</code>
+key.
+</li>
+<li>
+Initialize
+<i>
+map
+key
+</i>
+to
+the
+value
+associated
+with
+with
+the
+key
+that
+equals
+<i>
+container
+</i>
+in
+<i>
+expanded
+item
+</i>.
+</li>
+<li>
+If
+<i>
+map
+key
+</i>
+is
+not
+a
+key
+in
+<i>
+map
+object
+</i>,
+then
+set
+this
+key's
+value
+in
+<i>
+map
+object
+</i>
+to
+<i>
+compacted
+item
+</i>.
+Otherwise,
+if
+the
+value
+is
+not
+an
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>,
+then
+set
+it
+to
+one
+containing
+only
+the
+value
+and
+then
+append
+<i>
+compacted
+item
+</i>
+to
+it.
+</li>
+</ol>
+</li>
+<li>
+Otherwise,
+<ol class="algorithm">
+<li>
+If
+<code class="idlMemberName">
+<a href="#widl-JsonLdOptions-compactArrays">
+compactArrays
+</a>
+</code>
+is
+<a class="tref internalDFN" title="false" href="#dfn-false">
+false
+</a>,
+<i>
+container
+</i>
+is
+<code>
+@set
+</code>
+or
+<code>
+@list
+</code>,
+or
+<i>
+expanded
+property
+</i>
+is
+<code>
+@list
+</code>
+or
+<code>
+@graph
+</code>
+and
+<i>
+compacted
+item
+</i>
+is
+not
+an
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>,
+set
+it
+to
+a
+new
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>
+containing
+only
+<i>
+compacted
+item
+</i>.
+</li>
+<li>
+If
+<i>
+item
+active
+property
+</i>
+is
+not
+a
+key
+in
+<i>
+result
+</i>
+then
+add
+the
+key-value
+pair,
+(
+<i>
+item
+active
+property
+</i>
+-
+<i>
+compacted
+item
+</i>
+),
+to
+<i>
+result
+</i>.
+</li>
+<li>
+Otherwise,
+if
+the
+value
+associated
+with
+the
+key
+that
+equals
+<i>
+item
+active
+property
+</i>
+in
+<i>
+result
+</i>
+is
+not
+an
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>,
+set
+it
+to
+a
+new
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>
+containing
+only
+the
+value.
+Then
+append
+<i>
+compacted
+item
+</i>
+to
+the
+value
+if
+<i>
+compacted
+item
+</i>
+is
+not
+an
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>,
+otherwise,
+concatenate
+it.
+</li>
+</ol>
+</li>
+</ol>
+</li>
+</ol>
+</li>
+<li>
+Return
+<i>
+result
+</i>.
+</li>
+</ol>
+<p>
+If,
+after
+the
+algorithm
+outlined
+above
+is
+run,
+the
+result
+<i>
+result
+</i>
+is
+an
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>,
+replace
+it
+with
+a
+new
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>
+with
+a
+single
+member
+whose
+key
+is
+the
+result
+of
+using
+the
+<a href="#iri-compaction">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+Compaction
+algorithm
+</a>,
+passing
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>,
+<a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">
+inverse
+context
+</a>,
+and
+<code>
+@graph
+</code>
+as
+<i>
+iri
+</i>
+and
+whose
+value
+is
+the
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>
+<i>
+result
+</i>.
+Finally,
+if
+a
+non-empty
+<i>
+context
+</i>
+has
+been
+passed,
+add
+an
+<code>
+@context
+</code>
+member
+to
+<i>
+result
+</i>
+and
+set
+its
+value
+to
+the
+passed
+<i>
+context
+</i>.
+</p>
+</section>
+</section>
+<section id="inverse-context-creation">
+<h3>
+<span class="secno">
+8.2
+</span>
+Inverse
+Context
+Creation
+</h3>
+<p>
+When
+there
+is
+more
+than
+one
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term
+</a>
+that
+could
+be
+chosen
+to
+compact
+an
+<a class="tref internalDFN" title="iri" href="#dfn-iri">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>,
+it
+has
+to
+be
+ensured
+that
+the
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term
+</a>
+selection
+is
+both
+deterministic
+and
+represents
+the
+most
+context-appropriate
+choice
+whilst
+taking
+into
+consideration
+algorithmic
+complexity.
+</p>
+<p>
+In
+order
+to
+make
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term
+</a>
+selections,
+the
+concept
+of
+an
+<a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">
+inverse
+context
+</a>
+is
+introduced.
+An
+<dfn title="inverse-context" id="dfn-inverse-context">
+inverse
+context
+</dfn>
+is
+essentially
+a
+reverse
+lookup
+table
+that
+maps
+<a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">
+container
+mappings
+</a>,
+<a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">
+type
+mappings
+</a>,
+and
+<a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">
+language
+mappings
+</a>
+to
+a
+simple
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term
+</a>
+for
+a
+given
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>.
+A
+<a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">
+inverse
+context
+</a>
+only
+needs
+to
+be
+generated
+for
+an
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>
+if
+it
+is
+being
+used
+for
+<a class="tref internalDFN" title="compaction" href="#dfn-compaction">
+compaction
+</a>.
+</p>
+<p>
+To
+make
+use
+of
+an
+<a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">
+inverse
+context
+</a>,
+a
+list
+of
+preferred
+<a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">
+container
+mappings
+</a>
+and
+the
+<a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">
+type
+mapping
+</a>
+or
+<a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">
+language
+mapping
+</a>
+are
+gathered
+for
+a
+particular
+value
+associated
+with
+an
+<a class="tref internalDFN" title="iri" href="#dfn-iri">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>.
+These
+parameters
+are
+then
+fed
+to
+the
+<a href="#term-selection">
+Term
+Selection
+algorithm
+</a>,
+which
+will
+find
+the
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term
+</a>
+that
+most
+appropriately
+matches
+the
+value's
+mappings.
+</p>
+<section class="informative">
+<h4 id="overview-6">
+Overview
+</h4>
+<p>
+<em>
+This
+section
+is
+non-normative.
+</em>
+</p>
+<p>
+To
+create
+an
+<a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">
+inverse
+context
+</a>
+for
+a
+given
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>,
+each
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term
+</a>
+in
+the
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>
+is
+visited,
+ordered
+by
+length,
+shortest
+first
+(ties
+are
+broken
+by
+choosing
+the
+lexicographically
+least
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term
+</a>
+).
+For
+each
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term
+</a>,
+an
+entry
+is
+added
+to
+the
+<a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">
+inverse
+context
+</a>
+for
+each
+possible
+combination
+of
+<a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">
+container
+mapping
+</a>
+and
+<a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">
+type
+mapping
+</a>
+or
+<a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">
+language
+mapping
+</a>
+that
+would
+legally
+match
+the
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term
+</a>.
+Illegal
+matches
+include
+differences
+between
+a
+value's
+<a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">
+type
+mapping
+</a>
+or
+<a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">
+language
+mapping
+</a>
+and
+that
+of
+the
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term
+</a>.
+If
+a
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term
+</a>
+has
+no
+<a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">
+container
+mapping
+</a>,
+<a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">
+type
+mapping
+</a>,
+or
+<a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">
+language
+mapping
+</a>
+(or
+some
+combination
+of
+these),
+then
+it
+will
+have
+an
+entry
+in
+the
+<a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">
+inverse
+context
+</a>
+using
+the
+special
+key
+<code>
+@none
+</code>.
+This
+allows
+the
+<a href="#term-selection">
+Term
+Selection
+algorithm
+</a>
+to
+fall
+back
+to
+choosing
+more
+generic
+<a class="tref internalDFN" title="term" href="#dfn-term">
+terms
+</a>
+when
+a
+more
+specifically-matching
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term
+</a>
+is
+not
+available
+for
+a
+particular
+<a class="tref internalDFN" title="iri" href="#dfn-iri">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+and
+value
+combination.
+</p>
+</section>
+<section>
+<h4 id="algorithm-6">
+Algorithm
+</h4>
+<p>
+The
+algorithm
+takes
+one
+required
+input:
+the
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>
+that
+the
+<a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">
+inverse
+context
+</a>
+is
+being
+created
+for.
+</p>
+<ol class="algorithm">
+<li>
+Initialize
+<i>
+result
+</i>
+to
+an
+empty
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>.
+</li>
+<li>
+Initialize
+<i>
+default
+language
+</i>
+to
+<code>
+@none
+</code>.
+If
+the
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>
+has
+a
+<a class="tref internalDFN" title="default-language" href="#dfn-default-language">
+default
+language
+</a>,
+set
+<i>
+default
+language
+</i>
+to
+it.
+</li>
+<li>
+For
+each
+key
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term
+</a>
+and
+value
+<a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">
+term
+definition
+</a>
+in
+the
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>,
+ordered
+by
+shortest
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term
+</a>
+first
+(breaking
+ties
+by
+choosing
+the
+lexicographically
+least
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term
+</a>
+):
+<ol class="algorithm">
+<li>
+If
+the
+<a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">
+term
+definition
+</a>
+is
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>,
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term
+</a>
+cannot
+be
+selected
+during
+<a class="tref internalDFN" title="compaction" href="#dfn-compaction">
+compaction
+</a>,
+so
+continue
+to
+the
+next
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term
+</a>.
+</li>
+<li>
+Initialize
+<i>
+container
+</i>
+to
+<code>
+@none
+</code>.
+If
+there
+is
+a
+<a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">
+container
+mapping
+</a>
+in
+<a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">
+term
+definition
+</a>,
+set
+<i>
+container
+</i>
+to
+its
+associated
+value.
+</li>
+<li>
+Initialize
+<i>
+iri
+</i>
+to
+the
+value
+of
+the
+<a class="tref internalDFN" title="iri-mapping" href="#dfn-iri-mapping">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+mapping
+</a>
+for
+the
+<a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">
+term
+definition
+</a>.
+</li>
+<li>
+If
+<i>
+iri
+</i>
+is
+not
+a
+key
+in
+<i>
+result
+</i>,
+add
+a
+key-value
+pair
+where
+the
+key
+is
+<i>
+iri
+</i>
+and
+the
+value
+is
+an
+empty
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>
+to
+<i>
+result
+</i>.
+</li>
+<li>
+Reference
+the
+value
+associated
+with
+the
+<i>
+iri
+</i>
+member
+in
+<i>
+result
+</i>
+using
+the
+variable
+<i>
+container
+map
+</i>.
+</li>
+<li>
+If
+<i>
+container
+map
+</i>
+has
+no
+<i>
+container
+</i>
+member,
+create
+one
+and
+set
+its
+value
+to
+a
+new
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>
+with
+two
+members.
+The
+first
+member
+is
+<code>
+@language
+</code>
+and
+its
+value
+is
+a
+new
+empty
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>,
+the
+second
+member
+is
+<code>
+@type
+</code>
+and
+its
+value
+is
+a
+new
+empty
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>.
+</li>
+<li>
+Reference
+the
+value
+associated
+with
+the
+<i>
+container
+</i>
+member
+in
+<i>
+container
+map
+</i>
+using
+the
+variable
+<i>
+type/language
+map
+</i>.
+</li>
+<li>
+If
+the
+<a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">
+term
+definition
+</a>
+indicates
+that
+the
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term
+</a>
+represents
+a
+<a class="tref internalDFN" title="reverse-property" href="#dfn-reverse-property">
+reverse
+property
+</a>:
+<ol class="algorithm">
+<li>
+Reference
+the
+value
+associated
+with
+the
+<code>
+@type
+</code>
+member
+in
+<i>
+type/language
+map
+</i>
+using
+the
+variable
+<i>
+type
+map
+</i>.
+</li>
+<li>
+If
+<i>
+type
+map
+</i>
+does
+not
+have
+a
+<code>
+@reverse
+</code>
+member,
+create
+one
+and
+set
+its
+value
+to
+the
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term
+</a>
+being
+processed.
+</li>
+</ol>
+</li>
+<li>
+Otherwise,
+if
+<a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">
+term
+definition
+</a>
+has
+a
+<a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">
+type
+mapping
+</a>:
+<ol class="algorithm">
+<li>
+Reference
+the
+value
+associated
+with
+the
+<code>
+@type
+</code>
+member
+in
+<i>
+type/language
+map
+</i>
+using
+the
+variable
+<i>
+type
+map
+</i>.
+</li>
+<li>
+If
+<i>
+type
+map
+</i>
+does
+not
+have
+a
+member
+corresponding
+to
+the
+<a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">
+type
+mapping
+</a>
+in
+<a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">
+term
+definition
+</a>,
+create
+one
+and
+set
+its
+value
+to
+the
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term
+</a>
+being
+processed.
+</li>
+</ol>
+</li>
+<li>
+Otherwise,
+if
+<a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">
+term
+definition
+</a>
+has
+a
+<a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">
+language
+mapping
+</a>
+(might
+be
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>
+):
+<ol class="algorithm">
+<li>
+Reference
+the
+value
+associated
+with
+the
+<code>
+@language
+</code>
+member
+in
+<i>
+type/language
+map
+</i>
+using
+the
+variable
+<i>
+language
+map
+</i>.
+</li>
+<li>
+If
+the
+<a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">
+language
+mapping
+</a>
+equals
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>,
+set
+<i>
+language
+</i>
+to
+<code>
+@null
+</code>
+;
+otherwise
+set
+it
+to
+the
+language
+code
+in
+<a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">
+language
+mapping
+</a>.
+</li>
+<li>
+If
+<i>
+language
+map
+</i>
+does
+not
+have
+a
+<i>
+language
+</i>
+member,
+create
+one
+and
+set
+its
+value
+to
+the
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term
+</a>
+being
+processed.
+</li>
+</ol>
+</li>
+<li>
+Otherwise:
+<ol class="algorithm">
+<li>
+Reference
+the
+value
+associated
+with
+the
+<code>
+@language
+</code>
+member
+in
+<i>
+type/language
+map
+</i>
+using
+the
+variable
+<i>
+language
+map
+</i>.
+</li>
+<li>
+If
+<i>
+language
+map
+</i>
+does
+not
+have
+a
+<i>
+default
+language
+</i>
+member,
+create
+one
+and
+set
+its
+value
+to
+the
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term
+</a>
+being
+processed.
+</li>
+<li>
+If
+<i>
+language
+map
+</i>
+does
+not
+have
+a
+<code>
+@none
+</code>
+member,
+create
+one
+and
+set
+its
+value
+to
+the
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term
+</a>
+being
+processed.
+</li>
+<li>
+Reference
+the
+value
+associated
+with
+the
+<code>
+@type
+</code>
+member
+in
+<i>
+type/language
+map
+</i>
+using
+the
+variable
+<i>
+type
+map
+</i>.
+</li>
+<li>
+If
+<i>
+type
+map
+</i>
+does
+not
+have
+a
+<code>
+@none
+</code>
+member,
+create
+one
+and
+set
+its
+value
+to
+the
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term
+</a>
+being
+processed.
+</li>
+</ol>
+</li>
+</ol>
+</li>
+<li>
+Return
+<i>
+result
+</i>.
+</li>
+</ol>
+</section>
+</section>
+<section id="iri-compaction">
+<h3>
+<span class="secno">
+8.3
+</span>
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+Compaction
+</h3>
+<p>
+This
+algorithm
+compacts
+an
+<a class="tref internalDFN" title="iri" href="#dfn-iri">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+to
+a
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term
+</a>
+or
+<a class="tref internalDFN" title="compact-iri" href="#dfn-compact-iri">
+compact
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>,
+or
+a
+<a class="tref internalDFN" title="keyword" href="#dfn-keyword">
+keyword
+</a>
+to
+a
+<a class="tref internalDFN" title="keyword-alias" href="#dfn-keyword-alias">
+keyword
+alias
+</a>.
+A
+value
+that
+is
+associated
+with
+the
+<a class="tref internalDFN" title="iri" href="#dfn-iri">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+may
+be
+passed
+in
+order
+to
+assist
+in
+selecting
+the
+most
+context-appropriate
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term
+</a>.
+</p>
+<section class="informative">
+<h4 id="overview-7">
+Overview
+</h4>
+<p>
+<em>
+This
+section
+is
+non-normative.
+</em>
+</p>
+<p>
+If
+the
+passed
+<a class="tref internalDFN" title="iri" href="#dfn-iri">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+is
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>,
+we
+simply
+return
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>.
+Otherwise,
+we
+first
+try
+to
+find
+a
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term
+</a>
+that
+the
+<a class="tref internalDFN" title="iri" href="#dfn-iri">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+or
+<a class="tref internalDFN" title="keyword" href="#dfn-keyword">
+keyword
+</a>
+can
+be
+compacted
+to
+if
+it
+is
+relative
+to
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context's
+</a>
+<a class="tref internalDFN" title="vocabulary-mapping" href="#dfn-vocabulary-mapping">
+vocabulary
+mapping
+</a>.
+In
+order
+to
+select
+the
+most
+appropriate
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term
+</a>,
+we
+may
+have
+to
+collect
+information
+about
+the
+passed
+<i>
+value
+</i>.
+This
+information
+includes
+which
+<a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">
+container
+mappings
+</a>
+would
+be
+preferred
+for
+expressing
+the
+<i>
+value
+</i>,
+and
+what
+its
+<a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">
+type
+mapping
+</a>
+or
+<a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">
+language
+mapping
+</a>
+is.
+For
+<a class="tref internalDFN" title="list-object" href="#dfn-list-object">
+JSON-LD
+lists
+</a>,
+the
+<a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">
+type
+mapping
+</a>
+or
+<a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">
+language
+mapping
+</a>
+will
+be
+chosen
+based
+on
+the
+most
+specific
+values
+that
+work
+for
+all
+items
+in
+the
+list.
+Once
+this
+information
+is
+gathered,
+it
+is
+passed
+to
+the
+<a href="#term-selection">
+Term
+Selection
+algorithm
+</a>,
+which
+will
+return
+the
+most
+appropriate
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term
+</a>
+to
+use.
+</p>
+<p>
+If
+no
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term
+</a>
+was
+found
+that
+could
+be
+used
+to
+compact
+the
+<a class="tref internalDFN" title="iri" href="#dfn-iri">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>,
+an
+attempt
+is
+made
+<ins class="diff-new">to
+</ins>
+compact
+the
+<a class="tref internalDFN" title="iri" href="#dfn-iri">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+using
+the
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context's
+</a>
+<a class="tref internalDFN" title="vocabulary-mapping" href="#dfn-vocabulary-mapping">
+vocabulary
+mapping
+</a>,
+if
+there
+is
+one.
+If
+the
+<a class="tref internalDFN" title="iri" href="#dfn-iri">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+could
+not
+be
+compacted,
+an
+attempt
+is
+made
+to
+find
+a
+<a class="tref internalDFN" title="compact-iri" href="#dfn-compact-iri">
+compact
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>.
+If
+there
+is
+no
+appropriate
+<a class="tref internalDFN" title="compact-iri" href="#dfn-compact-iri">
+compact
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>,
+the
+<a class="tref internalDFN" title="iri" href="#dfn-iri">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+is
+transformed
+to
+a
+<a class="tref internalDFN" title="relative-iri" href="#dfn-relative-iri">
+relative
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+using
+the
+document's
+<a class="tref internalDFN" title="base-iri" href="#dfn-base-iri">
+base
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>.
+Finally,
+if
+the
+<a class="tref internalDFN" title="iri" href="#dfn-iri">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+or
+<a class="tref internalDFN" title="keyword" href="#dfn-keyword">
+keyword
+</a>
+still
+could
+not
+be
+compacted,
+it
+is
+returned
+as
+is.
+</p>
+</section>
+<section>
+<h4 id="algorithm-7">
+Algorithm
+</h4>
+<p>
+This
+algorithm
+takes
+three
+required
+inputs
+and
+three
+optional
+inputs.
+The
+required
+inputs
+<ins class="diff-new">are
+</ins>
+an
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>,
+an
+<a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">
+inverse
+context
+</a>,
+and
+the
+<i>
+iri
+</i>
+to
+be
+compacted.
+The
+optional
+inputs
+are
+a
+<i>
+value
+</i>
+associated
+with
+the
+<i>
+iri
+</i>,
+a
+<i>
+vocab
+</i>
+flag
+which
+specifies
+whether
+the
+passed
+<i>
+iri
+</i>
+should
+be
+compacted
+using
+the
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context's
+</a>
+<a class="tref internalDFN" title="vocabulary-mapping" href="#dfn-vocabulary-mapping">
+vocabulary
+mapping
+</a>,
+and
+a
+<i>
+reverse
+</i>
+flag
+which
+specifies
+whether
+a
+<a class="tref internalDFN" title="reverse-property" href="#dfn-reverse-property">
+reverse
+property
+</a>
+is
+being
+compacted.
+If
+not
+passed,
+<i>
+value
+</i>
+is
+set
+to
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>
+and
+<i>
+vocab
+</i>
+and
+<i>
+reverse
+</i>
+are
+both
+set
+to
+<code>
+false
+</code>.
+</p>
+<ol class="algorithm">
+<li>
+If
+<i>
+iri
+</i>
+is
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>,
+return
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>.
+</li>
+<li>
+If
+<i>
+vocab
+</i>
+is
+<a class="tref internalDFN" title="true" href="#dfn-true">
+true
+</a>
+and
+<i>
+iri
+</i>
+is
+a
+key
+in
+<a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">
+inverse
+context
+</a>:
+<ol class="algorithm">
+<li>
+Initialize
+<i>
+default
+language
+</i>
+to
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context's
+</a>
+<a class="tref internalDFN" title="default-language" href="#dfn-default-language">
+default
+language
+</a>,
+if
+it
+has
+one,
+otherwise
+to
+<code>
+@none
+</code>.
+</li>
+<li>
+Initialize
+<i>
+containers
+</i>
+to
+an
+empty
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>.
+This
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>
+will
+be
+used
+to
+keep
+track
+of
+an
+ordered
+list
+of
+preferred
+<a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">
+container
+mappings
+</a>
+for
+a
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term
+</a>,
+based
+on
+what
+is
+compatible
+with
+<i>
+value
+</i>.
+</li>
+<li>
+Initialize
+<i>
+type/language
+</i>
+to
+<code>
+@language
+</code>,
+and
+<i>
+type/language
+value
+</i>
+to
+<code>
+@null
+</code>.
+These
+two
+variables
+will
+keep
+track
+of
+the
+preferred
+<a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">
+type
+mapping
+</a>
+or
+<a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">
+language
+mapping
+</a>
+for
+a
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term
+</a>,
+based
+on
+what
+is
+compatible
+with
+<i>
+value
+</i>.
+</li>
+<li>
+If
+<i>
+value
+</i>
+is
+a
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>
+that
+contains
+the
+key
+<code>
+@index
+</code>,
+then
+append
+the
+value
+<code>
+@index
+</code>
+to
+<i>
+containers
+</i>.
+</li>
+<li>
+If
+<i>
+reverse
+</i>
+is
+<a class="tref internalDFN" title="true" href="#dfn-true">
+true
+</a>,
+set
+<i>
+type/language
+</i>
+to
+<code>
+@type
+</code>,
+<i>
+type/language
+value
+</i>
+to
+<code>
+@reverse
+</code>,
+and
+append
+<code>
+@set
+</code>
+to
+<i>
+containers
+</i>.
+</li>
+<li>
+Otherwise,
+if
+<i>
+value
+</i>
+is
+a
+<a class="tref internalDFN" title="list-object" href="#dfn-list-object">
+list
+object
+</a>,
+then
+set
+<i>
+type/language
+</i>
+and
+<i>
+type/language
+value
+</i>
+to
+the
+most
+specific
+values
+that
+work
+for
+all
+items
+in
+the
+list
+as
+follows:
+<ol class="algorithm">
+<li>
+If
+<code>
+@index
+</code>
+is
+a
+not
+key
+in
+<i>
+value
+</i>,
+then
+append
+<code>
+@list
+</code>
+to
+<i>
+containers
+</i>.
+</li>
+<li>
+Initialize
+<i>
+list
+</i>
+to
+the
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>
+associated
+with
+the
+key
+<code>
+@list
+</code>
+in
+<i>
+value
+</i>.
+</li>
+<li>
+Initialize
+<i>
+common
+type
+</i>
+and
+<i>
+common
+language
+</i>
+to
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>.
+If
+<i>
+list
+</i>
+is
+empty,
+set
+<i>
+common
+language
+</i>
+to
+<i>
+default
+language
+</i>.
+</li>
+<li>
+For
+each
+<i>
+item
+</i>
+in
+<i>
+list
+</i>:
+<ol class="algorithm">
+<li>
+Initialize
+<i>
+item
+language
+</i>
+to
+<code>
+@none
+</code>
+and
+<i>
+item
+type
+</i>
+to
+<code>
+@none
+</code>.
+</li>
+<li>
+If
+<i>
+item
+</i>
+contains
+the
+key
+<code>
+@value
+</code>:
+<ol class="algorithm">
+<li>
+If
+<i>
+item
+</i>
+contains
+the
+key
+<code>
+@language
+</code>,
+then
+set
+<i>
+item
+language
+</i>
+to
+its
+associated
+value.
+</li>
+<li>
+Otherwise,
+if
+<i>
+item
+</i>
+contains
+the
+key
+<code>
+@type
+</code>,
+set
+<i>
+item
+type
+</i>
+to
+its
+associated
+value.
+</li>
+<li>
+Otherwise,
+set
+<i>
+item
+language
+</i>
+to
+<code>
+@null
+</code>.
+</li>
+</ol>
+</li>
+<li>
+Otherwise,
+set
+<i>
+item
+type
+</i>
+to
+<code>
+@id
+</code>.
+</li>
+<li>
+If
+<i>
+common
+language
+</i>
+is
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>,
+set
+it
+to
+<i>
+item
+language
+</i>.
+</li>
+<li>
+Otherwise,
+if
+<i>
+item
+language
+</i>
+does
+not
+equal
+<i>
+common
+language
+</i>
+and
+<i>
+item
+</i>
+contains
+the
+key
+<code>
+@value
+</code>,
+then
+set
+<i>
+common
+language
+</i>
+to
+<code>
+@none
+</code>
+because
+list
+items
+have
+conflicting
+languages.
+</li>
+<li>
+If
+<i>
+common
+type
+</i>
+is
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>,
+set
+it
+to
+<i>
+item
+type
+</i>.
+</li>
+<li>
+Otherwise,
+if
+<i>
+item
+type
+</i>
+does
+not
+equal
+<i>
+common
+type
+</i>,
+then
+set
+<i>
+common
+type
+</i>
+to
+<code>
+@none
+</code>
+because
+list
+items
+have
+conflicting
+types.
+</li>
+<li>
+If
+<i>
+common
+language
+</i>
+is
+<code>
+@none
+</code>
+and
+<i>
+common
+type
+</i>
+is
+<code>
+@none
+</code>,
+then
+stop
+processing
+items
+in
+the
+list
+because
+it
+has
+been
+detected
+that
+there
+is
+no
+common
+language
+or
+type
+amongst
+the
+items.
+</li>
+</ol>
+</li>
+<li>
+If
+<i>
+common
+language
+</i>
+is
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>,
+set
+it
+to
+<code>
+@none
+</code>.
+</li>
+<li>
+If
+<i>
+common
+type
+</i>
+is
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>,
+set
+it
+to
+<code>
+@none
+</code>.
+</li>
+<li>
+If
+<i>
+common
+type
+</i>
+is
+not
+<code>
+@none
+</code>
+then
+set
+<i>
+type/language
+</i>
+to
+<code>
+@type
+</code>
+and
+<i>
+type/language
+value
+</i>
+to
+<i>
+common
+type
+</i>.
+</li>
+<li>
+Otherwise,
+set
+<i>
+type/language
+value
+</i>
+to
+<i>
+common
+language
+</i>.
+</li>
+</ol>
+</li>
+<li>
+Otherwise:
+<ol class="algorithm">
+<li>
+If
+<i>
+value
+</i>
+is
+a
+<a class="tref internalDFN" title="value-object" href="#dfn-value-object">
+value
+object
+</a>:
+<ol class="algorithm">
+<li>
+If
+<i>
+value
+</i>
+contains
+the
+key
+<code>
+@language
+</code>
+and
+does
+not
+contain
+the
+key
+<code>
+@index
+</code>,
+then
+set
+<i>
+type/language
+value
+</i>
+to
+its
+associated
+value
+and
+append
+<code>
+@language
+</code>
+to
+<i>
+containers
+</i>.
+</li>
+<li>
+Otherwise,
+if
+<i>
+value
+</i>
+contains
+the
+key
+<code>
+@type
+</code>,
+then
+set
+<i>
+type/language
+value
+</i>
+to
+its
+associated
+value
+and
+set
+<i>
+type/language
+</i>
+to
+<code>
+@type
+</code>.
+</li>
+</ol>
+</li>
+<li>
+Otherwise,
+set
+<i>
+type/language
+</i>
+to
+<code>
+@type
+</code>
+and
+set
+<i>
+type/language
+value
+</i>
+to
+<code>
+@id
+</code>.
+</li>
+<li>
+Append
+<code>
+@set
+</code>
+to
+<i>
+containers
+</i>.
+</li>
+</ol>
+</li>
+<li>
+Append
+<code>
+@none
+</code>
+to
+<i>
+containers
+</i>.
+This
+represents
+the
+non-existence
+of
+a
+<a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">
+container
+mapping
+</a>,
+and
+it
+will
+be
+the
+last
+<a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">
+container
+mapping
+</a>
+value
+to
+be
+checked
+as
+it
+is
+the
+most
+generic.
+</li>
+<li>
+If
+<i>
+type/language
+value
+</i>
+is
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>,
+set
+it
+to
+<code>
+@null
+</code>.
+This
+is
+the
+key
+under
+which
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>
+values
+are
+stored
+in
+the
+<a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">
+inverse
+context
+</a>
+<i>
+entry
+</i>.
+</li>
+<li>
+Initialize
+<i>
+preferred
+values
+</i>
+to
+an
+empty
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>.
+This
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>
+will
+indicate,
+in
+order,
+the
+preferred
+values
+for
+a
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term's
+</a>
+<a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">
+type
+mapping
+</a>
+or
+<a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">
+language
+mapping
+</a>.
+</li>
+<li>
+If
+<i>
+type/language
+value
+</i>
+is
+<code>
+@reverse
+</code>,
+append
+<code>
+@reverse
+</code>
+to
+<i>
+preferred
+values
+</i>.
+</li>
+<li>
+If
+<i>
+type/language
+value
+</i>
+is
+<code>
+@id
+</code>
+or
+<code>
+@reverse
+</code>
+and
+<i>
+value
+</i>
+has
+an
+<code>
+@id
+</code>
+member:
+<ol class="algorithm">
+<li>
+If
+the
+result
+of
+using
+the
+<a href="#iri-compaction">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+compaction
+algorithm
+</a>,
+passing
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>,
+<a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">
+inverse
+context
+</a>,
+the
+value
+associated
+with
+the
+<code>
+@id
+</code>
+key
+in
+<i>
+value
+</i>
+for
+<i>
+iri
+</i>,
+<a class="tref internalDFN" title="true" href="#dfn-true">
+true
+</a>
+for
+<i>
+vocab
+</i>,
+and
+<a class="tref internalDFN" title="true" href="#dfn-true">
+true
+</a>
+for
+<i>
+document
+relative
+</i>
+has
+a
+<a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">
+term
+definition
+</a>
+in
+the
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>
+with
+an
+<a class="tref internalDFN" title="iri-mapping" href="#dfn-iri-mapping">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+mapping
+</a>
+that
+equals
+the
+value
+associated
+with
+the
+<code>
+@id
+</code>
+key
+in
+<i>
+value
+</i>,
+then
+append
+<code>
+@vocab
+</code>,
+<code>
+@id
+</code>,
+and
+<code>
+@none
+</code>,
+in
+that
+order,
+to
+<i>
+preferred
+values
+</i>.
+</li>
+<li>
+Otherwise,
+append
+<code>
+@id
+</code>,
+<code>
+@vocab
+</code>,
+and
+<code>
+@none
+</code>,
+in
+that
+order,
+to
+<i>
+preferred
+values
+</i>.
+</li>
+</ol>
+</li>
+<li>
+Otherwise,
+append
+<i>
+type/language
+value
+</i>
+and
+<code>
+@none
+</code>,
+in
+that
+order,
+to
+<i>
+preferred
+values
+</i>.
+</li>
+<li>
+Initialize
+<i>
+term
+</i>
+to
+the
+result
+of
+the
+<a href="#term-selection">
+Term
+Selection
+algorithm
+</a>,
+passing
+<a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">
+inverse
+context
+</a>,
+<i>
+iri
+</i>,
+<i>
+containers
+</i>,
+<i>
+type/language
+</i>,
+and
+<i>
+preferred
+values
+</i>.
+</li>
+<li>
+If
+<i>
+term
+</i>
+is
+not
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>,
+return
+<i>
+term
+</i>.
+</li>
+</ol>
+</li>
+<li>
+At
+this
+point,
+there
+is
+no
+simple
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term
+</a>
+that
+<i>
+iri
+</i>
+can
+be
+compacted
+to.
+If
+<i>
+vocab
+</i>
+is
+<a class="tref internalDFN" title="true" href="#dfn-true">
+true
+</a>
+and
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>
+has
+a
+<a class="tref internalDFN" title="vocabulary-mapping" href="#dfn-vocabulary-mapping">
+vocabulary
+mapping
+</a>:
+<ol class="algorithm">
+<li>
+If
+<i>
+iri
+</i>
+begins
+with
+the
+<a class="tref internalDFN" title="vocabulary-mapping" href="#dfn-vocabulary-mapping">
+vocabulary
+mapping's
+</a>
+value
+but
+is
+longer,
+then
+initialize
+<i>
+suffix
+</i>
+to
+the
+substring
+of
+<i>
+iri
+</i>
+that
+does
+not
+match.
+If
+<i>
+suffix
+</i>
+does
+not
+have
+a
+<a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">
+term
+definition
+</a>
+in
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>,
+then
+return
+<i>
+suffix
+</i>.
+</li>
+</ol>
+</li>
+<li>
+The
+<i>
+iri
+</i>
+could
+not
+be
+compacted
+using
+the
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context's
+</a>
+<a class="tref internalDFN" title="vocabulary-mapping" href="#dfn-vocabulary-mapping">
+vocabulary
+mapping
+</a>.
+Try
+to
+create
+a
+<a class="tref internalDFN" title="compact-iri" href="#dfn-compact-iri">
+compact
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>,
+starting
+by
+initializing
+<i>
+compact
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</i>
+to
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>.
+This
+variable
+will
+be
+used
+to
+tore
+the
+created
+<a class="tref internalDFN" title="compact-iri" href="#dfn-compact-iri">
+compact
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>,
+if
+any.
+</li>
+<li>
+For
+each
+key
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term
+</a>
+and
+value
+<a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">
+term
+definition
+</a>
+in
+the
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>:
+<ol class="algorithm">
+<li>
+If
+the
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term
+</a>
+contains
+a
+colon
+(
+<code>:
+</code>
+),
+then
+continue
+to
+the
+next
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term
+</a>
+because
+<a class="tref internalDFN" title="term" href="#dfn-term">
+terms
+</a>
+with
+colons
+can't
+be
+used
+as
+<a class="tref internalDFN" title="prefix" href="#dfn-prefix">
+prefixes
+</a>.
+</li>
+<li>
+If
+the
+<a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">
+term
+definition
+</a>
+is
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>,
+its
+<a class="tref internalDFN" title="iri-mapping" href="#dfn-iri-mapping">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+mapping
+</a>
+equals
+<i>
+iri
+</i>,
+or
+its
+<a class="tref internalDFN" title="iri-mapping" href="#dfn-iri-mapping">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+mapping
+</a>
+is
+not
+a
+substring
+at
+the
+beginning
+of
+<i>
+iri
+</i>,
+the
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term
+</a>
+cannot
+be
+used
+as
+a
+<a class="tref internalDFN" title="prefix" href="#dfn-prefix">
+prefix
+</a>
+because
+it
+is
+not
+a
+partial
+match
+with
+<i>
+iri
+</i>.
+Continue
+with
+the
+next
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term
+</a>.
+</li>
+<li>
+Initialize
+<i>
+candidate
+</i>
+by
+concatenating
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term
+</a>,
+a
+colon
+(
+<code>:
+</code>
+),
+and
+the
+substring
+of
+<i>
+iri
+</i>
+that
+follows
+after
+the
+value
+of
+the
+<a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">
+term
+definition's
+</a>
+<a class="tref internalDFN" title="iri-mapping" href="#dfn-iri-mapping">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+mapping
+</a>.
+</li>
+<li>
+If
+either
+<i>
+compact
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</i>
+is
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>
+or
+<i>
+candidate
+</i>
+is
+shorter
+or
+the
+same
+length
+but
+lexicographically
+less
+than
+<i>
+compact
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</i>
+and
+<i>
+candidate
+</i>
+does
+not
+have
+a
+<a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">
+term
+definition
+</a>
+in
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>
+or
+if
+the
+<a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">
+term
+definition
+</a>
+has
+an
+<a class="tref internalDFN" title="iri-mapping" href="#dfn-iri-mapping">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+mapping
+</a>
+that
+equals
+<i>
+iri
+</i>
+and
+<i>
+value
+</i>
+is
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>,
+set
+<i>
+compact
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</i>
+to
+<i>
+candidate
+</i>.
+</li>
+</ol>
+</li>
+<li>
+If
+<i>
+compact
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</i>
+is
+not
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>,
+return
+<i>
+compact
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</i>.
+</li>
+<li>
+If
+<i>
+vocab
+</i>
+is
+<a class="tref internalDFN" title="false" href="#dfn-false">
+false
+</a>
+then
+transform
+<i>
+iri
+</i>
+to
+a
+<a class="tref internalDFN" title="relative-iri" href="#dfn-relative-iri">
+relative
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+using
+the
+document's
+base
+<a class="tref internalDFN" title="iri" href="#dfn-iri">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>.
+</li>
+<li>
+Finally,
+return
+<i>
+iri
+</i>
+as
+is.
+</li>
+</ol>
+</section>
+</section>
+<section id="term-selection">
+<h3>
+<span class="secno">
+8.4
+</span>
+Term
+Selection
+</h3>
+<p>
+This
+algorithm,
+invoked
+via
+the
+<a href="#iri-compaction">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+Compaction
+algorithm
+</a>,
+makes
+use
+of
+an
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context's
+</a>
+<a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">
+inverse
+context
+</a>
+to
+find
+the
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term
+</a>
+that
+is
+best
+used
+to
+<a class="tref internalDFN" title="compaction" href="#dfn-compaction">
+compact
+</a>
+an
+<a class="tref internalDFN" title="iri" href="#dfn-iri">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>.
+Other
+information
+about
+a
+value
+associated
+with
+the
+<a class="tref internalDFN" title="iri" href="#dfn-iri">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+is
+given,
+including
+which
+<a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">
+container
+mappings
+</a>
+and
+which
+<a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">
+type
+mapping
+</a>
+or
+<a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">
+language
+mapping
+</a>
+would
+be
+best
+used
+to
+express
+the
+value.
+</p>
+<section class="informative">
+<h4 id="overview-8">
+Overview
+</h4>
+<p>
+<em>
+This
+section
+is
+non-normative.
+</em>
+</p>
+<p>
+The
+<a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">
+inverse
+context's
+</a>
+entry
+for
+the
+<a class="tref internalDFN" title="iri" href="#dfn-iri">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+will
+be
+first
+searched
+according
+to
+the
+preferred
+<a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">
+container
+mappings
+</a>,
+in
+the
+order
+that
+they
+are
+given.
+Amongst
+<a class="tref internalDFN" title="term" href="#dfn-term">
+terms
+</a>
+with
+a
+matching
+<a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">
+container
+mapping
+</a>,
+preference
+will
+be
+given
+to
+those
+with
+a
+matching
+<a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">
+type
+mapping
+</a>
+or
+<a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">
+language
+mapping
+</a>,
+over
+those
+without
+a
+<a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">
+type
+mapping
+</a>
+or
+<a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">
+language
+mapping
+</a>.
+If
+there
+is
+no
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term
+</a>
+with
+a
+matching
+<a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">
+container
+mapping
+</a>
+then
+the
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term
+</a>
+without
+a
+<a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">
+container
+mapping
+</a>
+that
+matches
+the
+given
+<a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">
+type
+mapping
+</a>
+or
+<a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">
+language
+mapping
+</a>
+is
+selected.
+If
+there
+is
+still
+no
+selected
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term
+</a>,
+then
+a
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term
+</a>
+with
+no
+<a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">
+type
+mapping
+</a>
+or
+<a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">
+language
+mapping
+</a>
+will
+be
+selected
+if
+available.
+No
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term
+</a>
+will
+be
+selected
+that
+has
+a
+conflicting
+<a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">
+type
+mapping
+</a>
+or
+<a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">
+language
+mapping
+</a>.
+Ties
+between
+<a class="tref internalDFN" title="term" href="#dfn-term">
+terms
+</a>
+that
+have
+the
+same
+mappings
+are
+resolved
+by
+first
+choosing
+the
+shortest
+terms,
+and
+then
+by
+choosing
+the
+lexicographically
+least
+term.
+Note
+that
+these
+ties
+are
+resolved
+automatically
+because
+they
+were
+previously
+resolved
+when
+the
+<a href="#inverse-context-creation">
+Inverse
+Context
+Creation
+algorithm
+</a>
+was
+used
+to
+create
+the
+<a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">
+inverse
+context
+</a>.
+</p>
+</section>
+<section>
+<h4 id="algorithm-8">
+Algorithm
+</h4>
+<p>
+This
+algorithm
+has
+five
+required
+inputs.
+They
+are:
+an
+<a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">
+inverse
+context
+</a>,
+a
+<a class="tref internalDFN" title="keyword" href="#dfn-keyword">
+keyword
+</a>
+or
+<a class="tref internalDFN" title="iri" href="#dfn-iri">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+<i>
+iri
+</i>,
+an
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>
+<i>
+containers
+</i>
+that
+represents
+an
+ordered
+list
+of
+preferred
+<a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">
+container
+mappings
+</a>,
+a
+<a class="tref internalDFN" title="string" href="#dfn-string">
+string
+</a>
+<i>
+type/language
+</i>
+that
+indicates
+whether
+to
+look
+for
+a
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term
+</a>
+with
+a
+matching
+<a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">
+type
+mapping
+</a>
+or
+<a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">
+language
+mapping
+</a>,
+and
+an
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>
+representing
+an
+ordered
+list
+of
+<i>
+preferred
+values
+</i>
+for
+the
+<a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">
+type
+mapping
+</a>
+or
+<a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">
+language
+mapping
+</a>
+to
+look
+for.
+</p>
+<ol class="algorithm">
+<li>
+Initialize
+<i>
+container
+map
+</i>
+to
+the
+value
+associated
+with
+<i>
+iri
+</i>
+in
+the
+<a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">
+inverse
+context
+</a>.
+</li>
+<li>
+For
+each
+item
+<i>
+container
+</i>
+in
+<i>
+containers
+</i>:
+<ol class="algorithm">
+<li>
+If
+<i>
+container
+</i>
+is
+not
+a
+key
+in
+<i>
+container
+map
+</i>,
+then
+there
+is
+no
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term
+</a>
+with
+a
+matching
+<a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">
+container
+mapping
+</a>
+for
+it,
+so
+continue
+to
+the
+next
+<i>
+container
+</i>.
+</li>
+<li>
+Initialize
+<i>
+type/language
+map
+</i>
+to
+the
+value
+associated
+with
+the
+<i>
+container
+</i>
+member
+in
+<i>
+container
+map
+</i>.
+</li>
+<li>
+Initialize
+<i>
+value
+map
+</i>
+to
+the
+value
+associated
+with
+<i>
+type/language
+</i>
+member
+in
+<i>
+type/language
+map
+</i>.
+</li>
+<li>
+For
+each
+<i>
+item
+</i>
+in
+<i>
+preferred
+values
+</i>:
+<ol class="algorithm">
+<li>
+If
+<i>
+item
+</i>
+is
+not
+a
+key
+in
+<i>
+value
+map
+</i>,
+then
+there
+is
+no
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term
+</a>
+with
+a
+matching
+<a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">
+type
+mapping
+</a>
+or
+<a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">
+language
+mapping
+</a>,
+so
+continue
+to
+the
+next
+<i>
+item
+</i>.
+</li>
+<li>
+Otherwise,
+a
+matching
+term
+has
+been
+found,
+return
+the
+value
+associated
+with
+the
+<i>
+item
+</i>
+member
+in
+<i>
+value
+map
+</i>.
+</li>
+</ol>
+</li>
+</ol>
+</li>
+<li>
+No
+matching
+term
+has
+been
+found.
+Return
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>.
+</li>
+</ol>
+</section>
+</section>
+<section id="value-compaction">
+<h3>
+<span class="secno">
+8.5
+</span>
+Value
+Compaction
+</h3>
+<p>
+<a class="tref internalDFN" title="expansion" href="#dfn-expansion">
+Expansion
+</a>
+transforms
+all
+values
+into
+<a class="tref internalDFN" title="expanded-form" href="#dfn-expanded-form">
+expanded
+form
+</a>
+in
+JSON-LD.
+This
+algorithm
+performs
+the
+opposite
+operation,
+transforming
+a
+value
+into
+<dfn title="compacted-form" id="dfn-compacted-form">
+compacted
+form
+</dfn>.
+This
+algorithm
+compacts
+a
+value
+according
+to
+the
+<a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">
+term
+definition
+</a>
+in
+the
+given
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>
+that
+is
+associated
+with
+the
+value's
+associated
+<a class="tref internalDFN" title="active-property" href="#dfn-active-property">
+active
+property
+</a>.
+</p>
+<section class="informative">
+<h4 id="overview-9">
+Overview
+</h4>
+<p>
+<em>
+This
+section
+is
+non-normative.
+</em>
+</p>
+<p>
+The
+<i>
+value
+</i>
+to
+compact
+has
+either
+an
+<code>
+@id
+</code>
+or
+an
+<code>
+@value
+</code>
+member.
+</p>
+<p>
+For
+the
+former
+case,
+if
+the
+<a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">
+type
+mapping
+</a>
+of
+<a class="tref internalDFN" title="active-property" href="#dfn-active-property">
+active
+property
+</a>
+is
+set
+to
+<code>
+@id
+</code>
+or
+<code>
+@vocab
+</code>
+and
+<i>
+value
+</i>
+consists
+of
+only
+<del class="diff-old">of
+</del>
+an
+<code>
+@id
+</code>
+member
+and,
+if
+<del class="diff-old">if
+</del>
+the
+<a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">
+container
+mapping
+</a>
+of
+<a class="tref internalDFN" title="active-property" href="#dfn-active-property">
+active
+property
+</a>
+is
+set
+to
+<code>
+@index
+</code>,
+an
+<code>
+@index
+</code>
+member,
+<i>
+value
+</i>
+can
+be
+compacted
+to
+a
+<a class="tref internalDFN" title="string" href="#dfn-string">
+string
+</a>
+by
+returning
+the
+result
+of
+using
+the
+<a href="#iri-compaction">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+Compaction
+algorithm
+</a>
+to
+compact
+the
+value
+associated
+with
+the
+<code>
+@id
+</code>
+member.
+Otherwise,
+<i>
+value
+</i>
+cannot
+be
+compacted
+and
+is
+returned
+as
+is.
+</p>
+<p>
+For
+the
+latter
+case,
+it
+might
+be
+possible
+to
+compact
+<i>
+value
+</i>
+just
+into
+the
+value
+associated
+with
+the
+<code>
+@value
+</code>
+member.
+This
+can
+be
+done
+if
+the
+<a class="tref internalDFN" title="active-property" href="#dfn-active-property">
+active
+property
+</a>
+has
+a
+matching
+<a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">
+type
+mapping
+</a>
+or
+<a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">
+language
+mapping
+</a>
+and
+there
+is
+either
+no
+<code>
+@index
+</code>
+member
+or
+the
+<a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">
+container
+mapping
+</a>
+of
+<a class="tref internalDFN" title="active-property" href="#dfn-active-property">
+active
+property
+</a>
+is
+set
+to
+<code>
+@index
+</code>.
+It
+can
+also
+be
+done
+if
+<code>
+@value
+</code>
+is
+the
+only
+member
+in
+<i>
+value
+</i>
+(apart
+an
+<code>
+@index
+</code>
+member
+in
+case
+the
+<a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">
+container
+mapping
+</a>
+of
+<a class="tref internalDFN" title="active-property" href="#dfn-active-property">
+active
+property
+</a>
+is
+set
+to
+<code>
+@index
+</code>
+)
+and
+either
+its
+associated
+value
+is
+not
+a
+<a class="tref internalDFN" title="string" href="#dfn-string">
+string
+</a>,
+there
+is
+no
+<a class="tref internalDFN" title="default-language" href="#dfn-default-language">
+default
+language
+</a>,
+or
+there
+is
+an
+explicit
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>
+<a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">
+language
+mapping
+</a>
+for
+the
+<a class="tref internalDFN" title="active-property" href="#dfn-active-property">
+active
+property
+</a>.
+</p>
+</section>
+<section>
+<h4 id="algorithm-9">
+Algorithm
+</h4>
+<p>
+This
+algorithm
+has
+four
+required
+inputs:
+an
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>,
+an
+<a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">
+inverse
+context
+</a>,
+an
+<a class="tref internalDFN" title="active-property" href="#dfn-active-property">
+active
+property
+</a>,
+and
+a
+<i>
+value
+</i>
+to
+be
+compacted.
+</p>
+<ol class="algorithm">
+<li>
+Initialize
+<i>
+number
+members
+</i>
+to
+the
+number
+of
+members
+<i>
+value
+</i>
+contains.
+</li>
+<li>
+If
+<i>
+value
+</i>
+has
+an
+<code>
+@index
+</code>
+member
+and
+the
+<a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">
+container
+mapping
+</a>
+associated
+to
+<a class="tref internalDFN" title="active-property" href="#dfn-active-property">
+active
+property
+</a>
+is
+set
+to
+<code>
+@index
+</code>,
+decrease
+<i>
+number
+members
+</i>
+by
+<code>
+1
+</code>.
+</li>
+<li>
+If
+<i>
+number
+members
+</i>
+is
+greater
+than
+<code>
+2
+</code>,
+return
+<i>
+value
+</i>
+as
+it
+cannot
+be
+compacted.
+</li>
+<li>
+If
+<i>
+value
+</i>
+has
+an
+<code>
+@id
+</code>
+member:
+<ol class="algorithm">
+<li>
+If
+<i>
+number
+members
+</i>
+is
+<code>
+1
+</code>
+and
+the
+<a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">
+type
+mapping
+</a>
+of
+<a class="tref internalDFN" title="active-property" href="#dfn-active-property">
+active
+property
+</a>
+is
+set
+to
+<code>
+@id
+</code>,
+return
+the
+result
+of
+using
+the
+<a href="#iri-compaction">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+compaction
+algorithm
+</a>,
+passing
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>,
+<a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">
+inverse
+context
+</a>,
+and
+the
+value
+of
+the
+<code>
+@id
+</code>
+member
+for
+<i>
+iri
+</i>.
+</li>
+<li>
+Otherwise,
+if
+<i>
+number
+members
+</i>
+is
+<code>
+1
+</code>
+and
+the
+<a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">
+type
+mapping
+</a>
+of
+<a class="tref internalDFN" title="active-property" href="#dfn-active-property">
+active
+property
+</a>
+is
+set
+to
+<code>
+@vocab
+</code>,
+return
+the
+result
+of
+using
+the
+<a href="#iri-compaction">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+compaction
+algorithm
+</a>,
+passing
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>,
+<a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">
+inverse
+context
+</a>,
+the
+value
+of
+the
+<code>
+@id
+</code>
+member
+for
+<i>
+iri
+</i>,
+and
+<a class="tref internalDFN" title="true" href="#dfn-true">
+true
+</a>
+for
+<i>
+vocab
+</i>.
+</li>
+<li>
+Otherwise,
+return
+<i>
+value
+</i>
+as
+is.
+</li>
+</ol>
+</li>
+<li>
+Otherwise,
+if
+<i>
+value
+</i>
+has
+an
+<code>
+@type
+</code>
+member
+whose
+value
+matches
+the
+<a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">
+type
+mapping
+</a>
+of
+<a class="tref internalDFN" title="active-property" href="#dfn-active-property">
+active
+property
+</a>,
+return
+the
+value
+associated
+with
+the
+<code>
+@value
+</code>
+member
+of
+<i>
+value
+</i>.
+</li>
+<li>
+Otherwise,
+if
+<i>
+value
+</i>
+has
+an
+<code>
+@language
+</code>
+member
+whose
+value
+matches
+the
+<a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">
+language
+mapping
+</a>
+of
+<a class="tref internalDFN" title="active-property" href="#dfn-active-property">
+active
+property
+</a>,
+return
+the
+value
+associated
+with
+the
+<code>
+@value
+</code>
+member
+of
+<i>
+value
+</i>.
+</li>
+<li>
+Otherwise,
+if
+<i>
+number
+members
+</i>
+equals
+<code>
+1
+</code>
+and
+either
+the
+value
+of
+the
+<code>
+@value
+</code>
+member
+is
+not
+a
+<a class="tref internalDFN" title="string" href="#dfn-string">
+string
+</a>,
+or
+the
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>
+has
+no
+<a class="tref internalDFN" title="default-language" href="#dfn-default-language">
+default
+language
+</a>,
+or
+the
+<a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">
+language
+mapping
+</a>
+of
+<a class="tref internalDFN" title="active-property" href="#dfn-active-property">
+active
+property
+</a>
+is
+set
+to
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>,,
+return
+the
+value
+associated
+with
+the
+<code>
+@value
+</code>
+member.
+</li>
+<li>
+Otherwise,
+return
+<i>
+value
+</i>
+as
+is.
+</li>
+</ol>
+</section>
+</section>
+</section>
+<section id="flattening-algorithms">
+<h2>
+<span class="secno">
+9.
+</span>
+Flattening
+Algorithms
+</h2>
+<section id="flattening-algorithm">
+<h3>
+<span class="secno">
+9.1
+</span>
+Flattening
+Algorithm
+</h3>
+<p>
+This
+algorithm
+flattens
+an
+expanded
+JSON-LD
+document
+by
+collecting
+all
+properties
+of
+a
+<a class="tref internalDFN" title="node" href="#dfn-node">
+node
+</a>
+in
+a
+single
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>
+and
+labeling
+all
+<a class="tref internalDFN" title="blank-node" href="#dfn-blank-node">
+blank
+nodes
+</a>
+with
+<a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">
+blank
+node
+identifiers
+</a>.
+This
+resulting
+uniform
+shape
+of
+the
+document,
+may
+drastically
+simplify
+the
+code
+required
+to
+process
+JSON-LD
+data
+in
+certain
+applications.
+</p>
+<section class="informative">
+<h4 id="overview-10">
+Overview
+</h4>
+<p>
+<em>
+This
+section
+is
+non-normative.
+</em>
+</p>
+<p>
+First,
+a
+<i>
+node
+map
+</i>
+is
+generated
+using
+the
+<a href="#node-map-generation">
+Node
+Map
+Generation
+algorithm
+</a>
+which
+collects
+all
+properties
+of
+a
+<a class="tref internalDFN" title="node" href="#dfn-node">
+node
+</a>
+in
+a
+single
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>.
+In
+the
+next
+step,
+the
+<i>
+node
+map
+</i>
+is
+converted
+to
+a
+JSON-LD
+document
+in
+<a class="tref externalDFN" title="flattened-document-form" href="http://www.w3.org/TR/2013/CR-json-ld-20130822/#flattened-document-form">
+flattened
+document
+form
+</a>.
+Finally,
+if
+a
+<a class="tref internalDFN" title="context" href="#dfn-context">
+context
+</a>
+has
+been
+passed,
+the
+flattened
+document
+is
+compacted
+using
+the
+<a href="#compaction-algorithm">
+Compaction
+algorithm
+</a>
+before
+being
+returned.
+</p>
+</section>
+<section>
+<h4 id="algorithm-10">
+Algorithm
+</h4>
+<p>
+The
+algorithm
+takes
+two
+input
+variables,
+an
+<i>
+element
+</i>
+to
+flatten
+and
+an
+optional
+<i>
+context
+</i>
+used
+to
+compact
+the
+flattened
+document.
+If
+not
+passed,
+<i>
+context
+</i>
+is
+set
+to
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>.
+</p>
+<p>
+<ins class="diff-new">This
+algorithm
+generates
+new
+</ins><a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier"><ins class="diff-new">
+blank
+node
+identifiers
+</ins></a><ins class="diff-new">
+and
+relabels
+existing
+</ins><a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier"><ins class="diff-new">
+blank
+node
+identifiers
+</ins></a>.<ins class="diff-new">
+The
+used
+</ins><a href="#generate-blank-node-identifier"><ins class="diff-new">
+Generate
+Blank
+Node
+Identifier
+algorithm
+</ins></a><ins class="diff-new">
+keeps
+an
+</ins><i><ins class="diff-new">
+identifier
+map
+</ins></i><ins class="diff-new">
+and
+a
+</ins><i><ins class="diff-new">
+counter
+</ins></i><ins class="diff-new">
+to
+ensure
+consistent
+relabeling
+and
+avoid
+collisions.
+Thus,
+before
+this
+algorithm
+is
+run,
+the
+</ins><i><ins class="diff-new">
+identifier
+map
+</ins></i><ins class="diff-new">
+is
+reset
+and
+the
+</ins><i><ins class="diff-new">
+counter
+</ins></i><ins class="diff-new">
+is
+initialized
+to
+</ins><code><ins class="diff-new">
+0
+</ins></code>.</p>
+<ol class="algorithm">
+<li>
+Initialize
+<i>
+node
+map
+</i>
+to
+a
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>
+consisting
+of
+a
+single
+member
+whose
+key
+is
+<code>
+@default
+</code>
+and
+whose
+value
+is
+an
+empty
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>.
+</li>
+<li>
+Perform
+the
+<a href="#node-map-generation">
+Node
+Map
+Generation
+algorithm
+</a>,
+passing
+<i>
+element
+</i>
+and
+<i>
+node
+map
+</i>.
+</li>
+<li>
+Initialize
+<i>
+default
+graph
+</i>
+to
+the
+value
+of
+the
+<code>
+@default
+</code>
+member
+of
+<i>
+node
+map
+</i>,
+which
+is
+a
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>
+representing
+the
+<a class="tref internalDFN" title="default-graph" href="#dfn-default-graph">
+default
+graph
+</a>.
+</li>
+<li>
+For
+each
+key-value
+pair
+<i>
+graph
+name
+</i>
+-
+<i>
+graph
+</i>
+in
+<i>
+node
+map
+</i>
+where
+<i>
+graph
+name
+</i>
+is
+not
+<code>
+@default
+</code>,
+perform
+the
+following
+steps:
+<ol class="algorithm">
+<li>
+If
+<i>
+default
+graph
+</i>
+does
+not
+have
+a
+<i>
+graph
+name
+</i>
+member,
+create
+one
+and
+initialize
+its
+value
+to
+a
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>
+consisting
+of
+an
+<code>
+@id
+</code>
+member
+whose
+value
+is
+set
+to
+<i>
+graph
+name
+</i>.
+</li>
+<li>
+Reference
+the
+value
+associated
+with
+the
+<i>
+graph
+name
+</i>
+member
+in
+<i>
+default
+graph
+</i>
+using
+the
+variable
+<i>
+entry
+</i>.
+</li>
+<li>
+Add
+an
+<code>
+@graph
+</code>
+member
+to
+<i>
+entry
+</i>
+and
+set
+it
+to
+an
+empty
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>.
+</li>
+<li>
+For
+each
+<i>
+id
+</i>
+-
+<i>
+node
+</i>
+pair
+in
+<i>
+graph
+</i>
+ordered
+by
+<i>
+id
+</i>,
+add
+<i>
+node
+</i>
+to
+the
+<code>
+@graph
+</code>
+member
+of
+<i>
+entry
+<del class="diff-old">.
+</del>
+</i>,
+<ins class="diff-chg">unless
+the
+only
+member
+of
+</ins><i><ins class="diff-chg">
+node
+</ins></i><ins class="diff-chg">
+is
+</ins><code><ins class="diff-chg">
+@id
+</ins></code>.
+</li>
+</ol>
+</li>
+<li>
+Initialize
+an
+empty
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>
+<i>
+flattened
+</i>.
+</li>
+<li>
+For
+each
+<i>
+id
+</i>
+-
+<i>
+node
+</i>
+pair
+in
+<i>
+default
+graph
+</i>
+ordered
+by
+<i>
+id
+</i>,
+add
+<i>
+node
+</i>
+to
+<i>
+flattened
+<del class="diff-old">.
+</del>
+</i>,
+<ins class="diff-chg">unless
+the
+only
+member
+of
+</ins><i><ins class="diff-chg">
+node
+</ins></i><ins class="diff-chg">
+is
+</ins><code><ins class="diff-chg">
+@id
+</ins></code>.
+</li>
+<li>
+If
+<i>
+context
+</i>
+is
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>,
+return
+<i>
+flattened
+</i>.
+</li>
+<li>
+Otherwise,
+return
+the
+result
+of
+compacting
+<i>
+flattened
+</i>
+according
+the
+<a href="#compaction-algorithm">
+Compaction
+algorithm
+</a>
+passing
+<i>
+context
+</i>
+ensuring
+that
+the
+compaction
+result
+has
+only
+the
+<code>
+@graph
+</code>
+keyword
+(or
+its
+alias)
+at
+the
+top-level
+other
+than
+<code>
+@context
+</code>,
+even
+if
+the
+context
+is
+empty
+or
+if
+there
+is
+only
+one
+element
+to
+put
+in
+the
+<code>
+@graph
+</code>
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>.
+This
+ensures
+that
+the
+returned
+document
+has
+a
+deterministic
+structure.
+</li>
+</ol>
+</section>
+</section>
+<section id="node-map-generation">
+<h3>
+<span class="secno">
+9.2
+</span>
+Node
+Map
+Generation
+</h3>
+<p>
+This
+algorithm
+creates
+a
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>
+<i>
+node
+map
+</i>
+holding
+an
+indexed
+representation
+of
+the
+<a class="tref internalDFN" title="graph" href="#dfn-graph">
+graphs
+</a>
+and
+<a class="tref internalDFN" title="node" href="#dfn-node">
+nodes
+</a>
+represented
+in
+the
+passed
+expanded
+document.
+All
+<a class="tref internalDFN" title="node" href="#dfn-node">
+nodes
+</a>
+that
+are
+not
+uniquely
+identified
+by
+an
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+get
+assigned
+a
+(new)
+<a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">
+blank
+node
+identifier
+</a>.
+The
+resulting
+<i>
+node
+map
+</i>
+will
+have
+a
+member
+for
+every
+graph
+in
+the
+document
+whose
+value
+is
+another
+object
+with
+a
+member
+for
+every
+<a class="tref internalDFN" title="node" href="#dfn-node">
+node
+</a>
+represented
+in
+the
+document.
+The
+default
+graph
+is
+stored
+under
+the
+<code>
+@default
+</code>
+member,
+all
+other
+graphs
+are
+stored
+under
+their
+<a class="tref internalDFN" title="graph-name" href="#dfn-graph-name">
+graph
+name
+</a>.
+</p>
+<section class="informative">
+<h4 id="overview-11">
+Overview
+</h4>
+<p>
+<em>
+This
+section
+is
+non-normative.
+</em>
+</p>
+<p>
+The
+algorithm
+recursively
+runs
+over
+an
+expanded
+JSON-LD
+document
+to
+collect
+all
+<a class="tref internalDFN" title="property" href="#dfn-property">
+properties
+</a>
+of
+a
+<a class="tref internalDFN" title="node" href="#dfn-node">
+node
+</a>
+in
+a
+single
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>.
+The
+algorithm
+constructs
+a
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>
+<i>
+node
+map
+</i>
+whose
+keys
+represent
+the
+<a class="tref internalDFN" title="graph-name" href="#dfn-graph-name">
+graph
+names
+</a>
+used
+in
+the
+document
+(the
+<a class="tref internalDFN" title="default-graph" href="#dfn-default-graph">
+default
+graph
+</a>
+is
+stored
+under
+the
+key
+<code>
+@default
+</code>
+)
+and
+whose
+associated
+values
+are
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+objects
+</a>
+which
+index
+the
+<a class="tref internalDFN" title="node" href="#dfn-node">
+nodes
+</a>
+in
+the
+<a class="tref internalDFN" title="graph" href="#dfn-graph">
+graph
+</a>.
+If
+a
+<a class="tref internalDFN" title="property" href="#dfn-property">
+property's
+</a>
+value
+is
+a
+<a class="tref internalDFN" title="node-object" href="#dfn-node-object">
+node
+object
+</a>,
+it
+is
+<del class="diff-old">replace
+</del>
+<ins class="diff-chg">replaced
+</ins>
+by
+a
+<a class="tref internalDFN" title="node-object" href="#dfn-node-object">
+node
+object
+</a>
+consisting
+of
+only
+an
+<code>
+@id
+</code>
+member.
+If
+a
+<a class="tref internalDFN" title="node-object" href="#dfn-node-object">
+node
+object
+</a>
+has
+no
+<code>
+@id
+</code>
+member
+or
+it
+is
+identified
+by
+a
+<a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">
+blank
+node
+identifier
+</a>,
+a
+new
+<a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">
+blank
+node
+identifier
+</a>
+is
+generated.
+This
+relabeling
+of
+<a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">
+blank
+node
+identifiers
+</a>
+is
+also
+<del class="diff-old">be
+</del>
+done
+for
+<a class="tref internalDFN" title="property" href="#dfn-property">
+properties
+</a>
+and
+values
+of
+<code>
+@type
+</code>.
+</p>
+</section>
+<section>
+<h4 id="algorithm-11">
+Algorithm
+</h4>
+<p>
+The
+algorithm
+takes
+as
+input
+an
+expanded
+JSON-LD
+document
+<i>
+element
+</i>
+and
+a
+reference
+to
+a
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>
+<i>
+node
+map
+</i>.
+Furthermore
+it
+has
+the
+optional
+parameters
+<a class="tref internalDFN" title="active-graph" href="#dfn-active-graph">
+active
+graph
+</a>
+(which
+defaults
+to
+<code>
+@default
+</code>
+),
+an
+<a class="tref internalDFN" title="active-subject" href="#dfn-active-subject">
+active
+subject
+</a>,
+<a class="tref internalDFN" title="active-property" href="#dfn-active-property">
+active
+property
+</a>,
+and
+a
+reference
+to
+a
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>
+<i>
+list
+</i>.
+If
+not
+passed,
+<a class="tref internalDFN" title="active-subject" href="#dfn-active-subject">
+active
+subject
+</a>,
+<a class="tref internalDFN" title="active-property" href="#dfn-active-property">
+active
+property
+</a>,
+and
+<i>
+list
+</i>
+are
+set
+to
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>.
+</p>
+<ol class="algorithm">
+<li>
+If
+<i>
+element
+</i>
+is
+an
+array,
+process
+each
+<i>
+item
+</i>
+in
+<i>
+element
+</i>
+as
+follows
+and
+then
+return:
+<ol class="algorithm">
+<li>
+Run
+this
+algorithm
+recursively
+by
+passing
+<i>
+item
+</i>
+for
+<i>
+element
+</i>,
+<i>
+node
+map
+</i>,
+<a class="tref internalDFN" title="active-graph" href="#dfn-active-graph">
+active
+graph
+</a>,
+<a class="tref internalDFN" title="active-subject" href="#dfn-active-subject">
+active
+subject
+</a>,
+<a class="tref internalDFN" title="active-property" href="#dfn-active-property">
+active
+property
+</a>,
+and
+<i>
+list
+</i>.
+</li>
+</ol>
+</li>
+<li>
+Otherwise
+<i>
+element
+</i>
+is
+a
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>.
+Reference
+the
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>
+which
+is
+the
+value
+of
+the
+<a class="tref internalDFN" title="active-graph" href="#dfn-active-graph">
+active
+graph
+</a>
+member
+of
+<i>
+node
+map
+</i>
+using
+the
+variable
+<i>
+graph
+</i>.
+If
+the
+<a class="tref internalDFN" title="active-subject" href="#dfn-active-subject">
+active
+subject
+</a>
+is
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>,
+set
+<i>
+node
+</i>
+to
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>
+otherwise
+reference
+the
+<a class="tref internalDFN" title="active-subject" href="#dfn-active-subject">
+active
+subject
+</a>
+member
+of
+<i>
+graph
+</i>
+using
+the
+variable
+<i>
+node
+</i>.
+</li>
+<li>
+If
+<i>
+element
+</i>
+has
+an
+<code>
+@type
+</code>
+member,
+perform
+for
+each
+<i>
+item
+</i>
+the
+following
+steps:
+<ol class="algorithm">
+<li>
+If
+<i>
+item
+</i>
+is
+a
+<a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">
+blank
+node
+identifier
+</a>,
+replace
+it
+with
+a
+newly
+<a href="#generate-blank-node-identifier">
+generated
+blank
+node
+identifier
+</a>
+passing
+<i>
+item
+</i>
+for
+<i>
+identifier
+</i>.
+</li>
+<del class="diff-old">If
+graph
+has
+no
+member
+item
+,
+create
+one
+and
+initialize
+its
+value
+to
+a
+JSON
+object
+consisting
+of
+a
+single
+member
+@id
+whose
+value
+is
+item
+.
+</del>
+</ol>
+</li>
+<li>
+If
+<i>
+element
+</i>
+has
+an
+<code>
+@value
+</code>
+member,
+perform
+the
+following
+steps:
+<ol class="algorithm">
+<li>
+If
+<i>
+list
+</i>
+is
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>:
+<ol class="algorithm">
+<li>
+If
+<i>
+node
+</i>
+does
+not
+have
+an
+<a class="tref internalDFN" title="active-property" href="#dfn-active-property">
+active
+property
+</a>
+member,
+create
+one
+and
+initialize
+its
+value
+to
+an
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>
+containing
+<i>
+element
+</i>.
+</li>
+<li>
+Otherwise,
+compare
+<i>
+element
+</i>
+against
+every
+item
+in
+the
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>
+associated
+with
+the
+<a class="tref internalDFN" title="active-property" href="#dfn-active-property">
+active
+property
+</a>
+member
+of
+<i>
+node
+</i>.
+If
+there
+is
+no
+item
+equivalent
+to
+<i>
+element
+</i>,
+append
+<i>
+element
+</i>
+to
+the
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>.
+Two
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+objects
+</a>
+are
+considered
+equal
+if
+they
+have
+equivalent
+key-value
+pairs.
+</li>
+</ol>
+</li>
+<li>
+Otherwise,
+append
+<i>
+element
+</i>
+to
+the
+<code>
+@list
+</code>
+member
+of
+<i>
+list
+</i>.
+</li>
+</ol>
+</li>
+<li>
+Otherwise,
+if
+<i>
+element
+</i>
+has
+an
+<code>
+@list
+</code>
+member,
+perform
+the
+following
+steps:
+<ol class="algorithm">
+<li>
+Initialize
+a
+new
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>
+<i>
+result
+</i>
+consisting
+of
+a
+single
+member
+<code>
+@list
+</code>
+whose
+value
+is
+initialized
+to
+an
+empty
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>.
+</li>
+<li>
+Recursively
+call
+this
+algorithm
+passing
+the
+value
+of
+<i>
+element's
+</i>
+<code>
+@list
+</code>
+member
+for
+<i>
+element
+</i>,
+<a class="tref internalDFN" title="active-graph" href="#dfn-active-graph">
+active
+graph
+</a>,
+<a class="tref internalDFN" title="active-subject" href="#dfn-active-subject">
+active
+subject
+</a>,
+<a class="tref internalDFN" title="active-property" href="#dfn-active-property">
+active
+property
+</a>,
+and
+<i>
+result
+</i>
+for
+<i>
+list
+</i>.
+</li>
+<li>
+Append
+<i>
+result
+</i>
+to
+the
+<del class="diff-old">the
+</del>
+value
+of
+the
+<a class="tref internalDFN" title="active-property" href="#dfn-active-property">
+active
+property
+</a>
+member
+of
+<i>
+node
+</i>.
+</li>
+</ol>
+</li>
+<li>
+Otherwise
+<i>
+element
+</i>
+is
+a
+<a class="tref internalDFN" title="node-object" href="#dfn-node-object">
+node
+object
+</a>,
+perform
+the
+following
+steps:
+<ol class="algorithm">
+<li>
+If
+<i>
+element
+</i>
+has
+an
+<code>
+@id
+</code>
+member,
+set
+<i>
+id
+</i>
+to
+its
+value
+and
+remove
+the
+member
+from
+<i>
+element
+</i>.
+If
+<i>
+id
+</i>
+is
+a
+<a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">
+blank
+node
+identifier
+</a>,
+replace
+it
+with
+a
+newly
+<a href="#generate-blank-node-identifier">
+generated
+blank
+node
+identifier
+</a>
+passing
+<i>
+id
+</i>
+for
+<i>
+identifier
+</i>.
+</li>
+<li>
+Otherwise,
+set
+<i>
+id
+</i>
+to
+the
+result
+of
+the
+<a href="#generate-blank-node-identifier">
+Generate
+Blank
+Node
+Identifier
+algorithm
+</a>
+passing
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>
+for
+<i>
+identifier
+</i>.
+</li>
+<li>
+If
+<i>
+graph
+</i>
+does
+not
+contain
+a
+member
+<i>
+id
+</i>,
+create
+one
+and
+initialize
+its
+value
+to
+a
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>
+consisting
+of
+a
+single
+member
+<code>
+@id
+</code>
+whose
+value
+is
+<i>
+id
+</i>.
+</li>
+<li>
+If
+<a class="tref internalDFN" title="active-property" href="#dfn-active-property">
+active
+property
+</a>
+is
+not
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>,
+perform
+the
+following
+steps:
+<ol class="algorithm">
+<li>
+Create
+a
+new
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>
+<i>
+reference
+</i>
+consisting
+of
+a
+single
+member
+<code>
+@id
+</code>
+whose
+value
+is
+<i>
+id
+</i>.
+</li>
+<li>
+If
+<i>
+list
+</i>
+is
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>:
+<ol class="algorithm">
+<li>
+If
+<i>
+node
+</i>
+does
+not
+have
+an
+<a class="tref internalDFN" title="active-property" href="#dfn-active-property">
+active
+property
+</a>
+member,
+create
+one
+and
+initialize
+its
+value
+to
+an
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>
+containing
+<i>
+reference
+</i>.
+</li>
+<li>
+Otherwise,
+compare
+<i>
+reference
+</i>
+against
+every
+item
+in
+the
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>
+associated
+with
+the
+<a class="tref internalDFN" title="active-property" href="#dfn-active-property">
+active
+property
+</a>
+member
+of
+<i>
+node
+</i>.
+If
+there
+is
+no
+item
+equivalent
+to
+<i>
+reference
+</i>,
+append
+<i>
+reference
+</i>
+to
+the
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>.
+Two
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+objects
+</a>
+are
+considered
+equal
+if
+they
+have
+equivalent
+key-value
+pairs.
+</li>
+</ol>
+</li>
+<li>
+Otherwise,
+append
+<i>
+element
+</i>
+to
+the
+<code>
+@list
+</code>
+member
+of
+<i>
+list
+</i>.
+</li>
+</ol>
+</li>
+<li>
+Reference
+the
+value
+of
+the
+<i>
+id
+</i>
+member
+of
+<i>
+graph
+</i>
+using
+the
+variable
+<i>
+node
+</i>.
+</li>
+<li>
+If
+<i>
+element
+</i>
+has
+an
+<code>
+@type
+</code>
+key,
+append
+each
+item
+of
+its
+associated
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>
+to
+the
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>
+associated
+with
+the
+<code>
+@type
+</code>
+key
+of
+<i>
+node
+</i>
+unless
+it
+is
+already
+in
+that
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>.
+Finally
+remove
+the
+<code>
+@type
+</code>
+member
+from
+<i>
+element
+</i>.
+</li>
+<li>
+If
+<i>
+element
+</i>
+has
+an
+<code>
+@index
+</code>
+member,
+set
+the
+<code>
+@index
+</code>
+member
+of
+<i>
+node
+</i>
+to
+its
+value.
+If
+<a class="tref internalDFN" title="node" href="#dfn-node">
+node
+</a>
+has
+already
+an
+<code>
+@index
+</code>
+member
+with
+a
+different
+value,
+a
+<code class="error">
+<a href="#idl-def-JsonLdErrorCode.conflicting-indexes">
+conflicting
+indexes
+</a>
+</code>
+error
+has
+been
+detected
+and
+processing
+is
+aborted.
+Otherwise,
+continue
+by
+removing
+the
+<code>
+@index
+</code>
+member
+from
+<i>
+element
+</i>.
+</li>
+<li>
+If
+<i>
+element
+</i>
+has
+an
+<code>
+@reverse
+</code>
+member:
+<ol class="algorithm">
+<li>
+Create
+a
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>
+<i>
+referenced
+node
+</i>
+with
+a
+single
+member
+<code>
+@id
+</code>
+whose
+value
+is
+<i>
+id
+</i>.
+</li>
+<li>
+Set
+<i>
+reverse
+map
+</i>
+to
+the
+value
+of
+the
+<code>
+@reverse
+</code>
+member
+of
+<i>
+element
+</i>.
+</li>
+<li>
+For
+each
+key-value
+pair
+<i>
+property
+</i>
+-
+<i>
+values
+</i>
+in
+<i>
+reverse
+map
+</i>:
+<ol class="algorithm">
+<li>
+For
+each
+<i>
+value
+</i>
+of
+<i>
+values
+</i>:
+<ol class="algorithm">
+<li>
+If
+<i>
+value
+</i>
+has
+a
+<i>
+property
+</i>
+member,
+append
+<i>
+referenced
+node
+</i>
+to
+its
+value;
+otherwise
+create
+a
+<i>
+property
+</i>
+member
+whose
+value
+is
+an
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>
+containing
+<i>
+referenced
+node
+</i>.
+</li>
+<li>
+Recursively
+invoke
+this
+algorithm
+passing
+<i>
+value
+</i>
+for
+<i>
+element
+</i>,
+<i>
+node
+map
+</i>,
+and
+<a class="tref internalDFN" title="active-graph" href="#dfn-active-graph">
+active
+graph
+</a>.
+</li>
+</ol>
+</li>
+</ol>
+</li>
+<li>
+Remove
+the
+<code>
+@reverse
+</code>
+member
+from
+<i>
+element
+</i>.
+</li>
+</ol>
+</li>
+<li>
+If
+<i>
+element
+</i>
+has
+an
+<code>
+@graph
+</code>
+member,
+recursively
+invoke
+this
+algorithm
+passing
+the
+value
+of
+the
+<code>
+@graph
+</code>
+member
+for
+<i>
+element
+</i>,
+<i>
+node
+map
+</i>,
+and
+<i>
+id
+</i>
+for
+<a class="tref internalDFN" title="active-graph" href="#dfn-active-graph">
+active
+graph
+</a>
+before
+removing
+the
+<code>
+@graph
+</code>
+member
+from
+<i>
+element
+</i>.
+</li>
+<li>
+Finally,
+for
+each
+key-value
+pair
+<i>
+property
+</i>
+-
+<i>
+value
+</i>
+in
+<i>
+element
+</i>
+ordered
+by
+<i>
+property
+</i>
+perform
+the
+following
+steps:
+<ol class="algorithm">
+<li>
+If
+<i>
+property
+</i>
+is
+a
+<a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">
+blank
+node
+identifier
+</a>,
+replace
+it
+with
+a
+newly
+<a href="#generate-blank-node-identifier">
+generated
+blank
+node
+identifier
+</a>
+passing
+<i>
+property
+</i>
+for
+<i>
+identifier
+</i>.
+</li>
+<li>
+If
+<i>
+node
+</i>
+does
+not
+have
+a
+<i>
+property
+</i>
+member,
+create
+one
+and
+initialize
+its
+value
+to
+an
+empty
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>.
+</li>
+<li>
+Recursively
+invoke
+this
+algorithm
+passing
+<i>
+value
+</i>
+for
+<i>
+element
+</i>,
+<i>
+node
+map
+</i>,
+<a class="tref internalDFN" title="active-graph" href="#dfn-active-graph">
+active
+graph
+</a>,
+<i>
+id
+</i>
+for
+<a class="tref internalDFN" title="active-subject" href="#dfn-active-subject">
+active
+subject
+</a>,
+<ins class="diff-new">and
+</ins>
+<i>
+property
+</i>
+for
+<a class="tref internalDFN" title="active-property" href="#dfn-active-property">
+active
+property
+<del class="diff-old">,
+and
+list
+.
+</del>
+</a>.
+</li>
+</ol>
+</li>
+</ol>
+</li>
+</ol>
+</section>
+</section>
+<section id="generate-blank-node-identifier">
+<h3>
+<span class="secno">
+9.3
+</span>
+Generate
+Blank
+Node
+Identifier
+</h3>
+<p>
+This
+algorithm
+is
+used
+to
+<del class="diff-old">determine
+if
+two
+</del>
+generate
+new
+<a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">
+blank
+node
+identifiers
+</a>
+or
+to
+relabel
+an
+existing
+<a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">
+blank
+node
+identifier
+</a>
+to
+avoid
+collision
+by
+the
+introduction
+of
+new
+ones.
+</p>
+<section class="informative">
+<h4 id="overview-12">
+Overview
+</h4>
+<p>
+<em>
+This
+section
+is
+non-normative.
+</em>
+</p>
+<p>
+The
+simplest
+case
+is
+if
+there
+exists
+already
+a
+<a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">
+blank
+node
+identifier
+</a>
+in
+the
+<i>
+identifier
+map
+</i>
+for
+the
+passed
+<i>
+identifier
+</i>,
+in
+which
+case
+it
+is
+simply
+returned.
+Otherwise,
+a
+new
+<a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">
+blank
+node
+identifier
+</a>
+is
+generated
+by
+concatenating
+the
+string
+<code>
+_:b
+</code>
+and
+the
+<i>
+counter
+</i>.
+If
+the
+passed
+<i>
+identifier
+</i>
+is
+not
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>,
+an
+entry
+is
+created
+in
+the
+<i>
+identifier
+map
+</i>
+associating
+the
+<i>
+identifier
+</i>
+with
+the
+<a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">
+blank
+node
+identifier
+</a>.
+Finally,
+the
+<i>
+counter
+</i>
+is
+increased
+by
+one
+and
+the
+new
+<a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">
+blank
+node
+identifier
+</a>
+is
+returned.
+</p>
+</section>
+<section>
+<h4 id="algorithm-12">
+Algorithm
+</h4>
+<p>
+The
+algorithm
+takes
+a
+single
+input
+variable
+<i>
+identifier
+</i>
+which
+may
+be
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>.
+Between
+its
+executions,
+the
+algorithm
+needs
+to
+keep
+an
+<i>
+identifier
+map
+</i>
+to
+relabel
+existing
+<a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">
+blank
+node
+identifiers
+</a>
+consistently
+and
+a
+<i>
+counter
+</i>
+to
+generate
+new
+<a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">
+blank
+node
+identifiers
+</a>.
+The
+<i>
+counter
+</i>
+is
+initialized
+to
+<code>
+0
+</code>
+by
+default.
+</p>
+<ol class="algorithm">
+<li>
+If
+<i>
+identifier
+</i>
+is
+not
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>
+and
+has
+an
+entry
+in
+the
+<i>
+identifier
+map
+</i>,
+return
+the
+mapped
+identifier.
+</li>
+<li>
+Otherwise,
+generate
+a
+new
+<a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">
+blank
+node
+identifier
+</a>
+by
+concatenating
+the
+string
+<code>
+_:b
+</code>
+and
+<i>
+counter
+</i>.
+</li>
+<li>
+Increment
+<i>
+counter
+</i>
+by
+<code>
+1
+</code>.
+</li>
+<li>
+If
+<i>
+identifier
+</i>
+is
+not
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>,
+create
+a
+new
+entry
+for
+<i>
+identifier
+</i>
+in
+<i>
+identifier
+map
+</i>
+and
+set
+its
+value
+to
+the
+new
+<a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">
+blank
+node
+identifier
+</a>.
+</li>
+<li>
+Return
+the
+new
+<a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">
+blank
+node
+identifier
+</a>.
+</li>
+</ol>
+</section>
+</section>
+</section>
+<section id="rdf-serialization-deserialization-algorithms">
+<h2>
+<span class="secno">
+10.
+</span>
+RDF
+<del class="diff-old">Conversion
+</del>
+<ins class="diff-chg">Serialization/Deserialization
+</ins>
+Algorithms
+</h2>
+<p>
+This
+section
+describes
+algorithms
+to
+<del class="diff-old">transform
+</del>
+<ins class="diff-chg">deserialize
+</ins>
+a
+JSON-LD
+document
+to
+an
+<a class="tref internalDFN" title="rdf-dataset" href="#dfn-rdf-dataset">
+RDF
+dataset
+</a>
+and
+vice
+versa.
+The
+algorithms
+are
+designed
+for
+in-memory
+implementations
+with
+random
+access
+to
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>
+elements.
+</p>
+<p>
+Throughout
+this
+section,
+the
+following
+vocabulary
+<a class="tref internalDFN" title="prefix" href="#dfn-prefix">
+prefixes
+</a>
+are
+used
+in
+<a class="tref internalDFN" title="compact-iri" href="#dfn-compact-iri">
+compact
+IRIs
+</a>:
+</p>
+<table class="simple">
+<thead>
+<tr>
+<th>
+Prefix
+</th>
+<th>
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+rdf
+</td>
+<td>
+http://www.w3.org/1999/02/22-rdf-syntax-ns#
+</td>
+</tr>
+<tr>
+<td>
+rdfs
+</td>
+<td>
+http://www.w3.org/2000/01/rdf-schema#
+</td>
+</tr>
+<tr>
+<td>
+xsd
+</td>
+<td>
+http://www.w3.org/2001/XMLSchema#
+</td>
+</tr>
+</tbody>
+</table>
+<section id="deserialize-json-ld-to-rdf-algorithm">
+<h3>
+<span class="secno">
+10.1
+</span>
+<del class="diff-old">Convert
+</del>
+<ins class="diff-chg">Deserialize
+JSON-LD
+</ins>
+to
+RDF
+<del class="diff-old">Algorithm
+</del>
+<ins class="diff-chg">algorithm
+</ins>
+</h3>
+<p>
+This
+<del class="diff-old">algorithms
+converts
+</del>
+<ins class="diff-chg">algorithm
+deserializes
+</ins>
+a
+JSON-LD
+document
+to
+an
+<a class="tref internalDFN" title="rdf-dataset" href="#dfn-rdf-dataset">
+RDF
+dataset
+</a>.
+Please
+note
+that
+RDF
+does
+not
+allow
+a
+<a class="tref internalDFN" title="blank-node" href="#dfn-blank-node">
+blank
+node
+</a>
+to
+be
+used
+as
+a
+<del class="diff-old">graph
+name
+or
+</del>
+<a class="tref internalDFN" title="property" href="#dfn-property">
+property
+</a>,
+while
+JSON-LD
+does.
+<del class="diff-old">JSON-LD-RDF
+Converters
+can
+work
+around
+this
+restriction,
+when
+converting
+JSON-LD
+to
+RDF,
+</del>
+<ins class="diff-chg">Therefore,
+</ins>
+by
+<del class="diff-old">converting
+such
+</del>
+<ins class="diff-chg">default
+RDF
+triples
+that
+would
+have
+contained
+</ins>
+blank
+nodes
+<del class="diff-old">to
+IRIs
+,
+minting
+new
+"Skolem
+IRIs"
+</del>
+as
+<del class="diff-old">per
+Replacing
+Blank
+Nodes
+with
+IRIs
+of
+[
+RDF11-CONCEPTS
+].
+</del>
+<ins class="diff-chg">properties
+are
+discarded
+when
+interpreting
+JSON-LD
+as
+RDF.
+</ins>
+</p>
+<div class="issue atrisk">
+<div class="issue-title" role="heading" aria-level="4">
+<span>
+Feature
+at
+Risk
+<del class="diff-old">1
+</del>
+<ins class="diff-chg">3
+</ins>
+</span>:
+Allow
+blank
+nodes
+to
+be
+used
+as
+<del class="diff-old">graph
+name
+or
+property
+</del>
+<ins class="diff-chg">properties
+</ins>
+</div>
+<div class="atrisk">
+<p class="atrisk-head">
+Note:
+This
+feature
+is
+<a href="http://www.w3.org/2005/10/Process-20051014/tr#cfi">
+"at
+risk"
+</a>
+and
+may
+be
+removed
+from
+this
+specification
+based
+on
+feedback.
+Please
+send
+feedback
+to
+<a href="mailto:public-rdf-comments@w3.org">
+public-rdf-comments@w3.org
+</a>.
+For
+the
+current
+status
+see
+<a href="http://www.w3.org/2011/rdf-wg/wiki/JSON-LD_Features_at_Risk">
+features
+"at
+risk"
+in
+JSON-LD
+1.0
+</a>
+</p>
+<p>
+RDF
+<del class="diff-old">does
+</del>
+<ins class="diff-chg">graphs
+do
+</ins>
+not
+<del class="diff-old">currently
+</del>
+allow
+<del class="diff-old">a
+</del>
+<a class="tref internalDFN" title="blank-node" href="#dfn-blank-node">
+blank
+<del class="diff-old">node
+</del>
+<ins class="diff-chg">nodes
+</ins>
+</a>
+to
+be
+used
+as
+<del class="diff-old">graph
+name
+or
+property
+</del>
+<ins class="diff-chg">an
+</ins><a class="tref internalDFN" title="rdf-predicate" href="#dfn-rdf-predicate"><ins class="diff-chg">
+RDF
+predicate
+</ins>
+</a>,
+while
+JSON-LD
+does.
+<del class="diff-old">JSON-LD-RDF
+Converters
+can
+work
+around
+</del>
+<ins class="diff-chg">Unless
+the
+</ins><i><ins class="diff-chg">
+produce
+generalized
+RDF
+</ins></i><ins class="diff-chg">
+flag
+is
+set,
+</ins>
+this
+<del class="diff-old">restriction,
+when
+converting
+JSON-LD
+to
+RDF,
+by
+converting
+such
+</del>
+<ins class="diff-chg">algorithm
+will
+exclude
+triples
+including
+a
+</ins>
+<a class="tref internalDFN" title="blank-node" href="#dfn-blank-node">
+blank
+<del class="diff-old">nodes
+to
+IRIs
+,
+minting
+new
+"Skolem
+IRIs"
+as
+per
+Replacing
+Blank
+Nodes
+with
+IRIs
+of
+[
+RDF11-CONCEPTS
+</del>
+<ins class="diff-chg">node
+</ins>
+</a>
+<del class="diff-old">].
+Based
+on
+feedback
+from
+implementors
+the
+Working
+Group
+may
+decide
+to
+disallow
+blank
+nodes
+as
+graph
+names
+and
+properties
+in
+JSON-LD.
+If
+this
+change
+would
+affect
+you,
+be
+sure
+to
+send
+in
+a
+comment.
+</del>
+<a class="tref internalDFN" title="rdf-predicate" href="#dfn-rdf-predicate">
+<ins class="diff-chg">RDF
+predicate
+</ins></a>.
+</p>
+</div>
+</div>
+<section class="informative">
+<h4 id="overview-13">
+Overview
+</h4>
+<p>
+<em>
+This
+section
+is
+non-normative.
+</em>
+</p>
+<p>
+The
+JSON-LD
+document
+is
+expanded
+and
+converted
+to
+a
+<i>
+node
+map
+</i>
+using
+the
+<a href="#node-map-generation">
+Node
+Map
+Generation
+algorithm
+</a>.
+This
+allows
+each
+graph
+represented
+within
+the
+document
+to
+be
+extracted
+and
+flattened,
+making
+it
+easier
+to
+process
+each
+<a class="tref internalDFN" title="node-object" href="#dfn-node-object">
+node
+object
+</a>.
+Each
+graph
+from
+the
+<i>
+node
+map
+</i>
+is
+processed
+to
+extract
+<a class="tref internalDFN" title="rdf-triple" href="#dfn-rdf-triple">
+RDF
+triples
+</a>,
+to
+which
+any
+(non-default)
+graph
+name
+is
+applied
+to
+create
+an
+<a class="tref internalDFN" title="rdf-dataset" href="#dfn-rdf-dataset">
+RDF
+dataset
+</a>.
+Each
+<a class="tref internalDFN" title="node-object" href="#dfn-node-object">
+node
+object
+</a>
+in
+the
+<i>
+node
+map
+</i>
+has
+an
+<code>
+@id
+</code>
+member
+which
+corresponds
+to
+the
+<a class="tref internalDFN" title="rdf-subject" href="#dfn-rdf-subject">
+RDF
+subject
+</a>,
+the
+other
+members
+represent
+<a class="tref internalDFN" title="rdf-predicate" href="#dfn-rdf-predicate">
+RDF
+predicates
+</a>.
+Each
+member
+value
+is
+either
+an
+<a class="tref internalDFN" title="iri" href="#dfn-iri">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+or
+<a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">
+blank
+node
+identifier
+</a>
+or
+can
+be
+transformed
+to
+an
+<a class="tref externalDFN" title="rdf-literal" href="http://www.w3.org/TR/rdf11-concepts/#dfn-literal">
+RDF
+literal
+</a>
+to
+generate
+an
+<a class="tref internalDFN" title="rdf-triple" href="#dfn-rdf-triple">
+RDF
+triple
+</a>.
+<a class="tref internalDFN" title="list" href="#dfn-list">
+Lists
+</a>
+are
+transformed
+into
+an
+<a class="tref externalDFN" title="rdf-collection" href="http://www.w3.org/TR/rdf-schema/#ch_collectionvocab">
+RDF
+Collection
+</a>
+using
+the
+<a href="#list-to-rdf-conversion">
+List
+to
+RDF
+Conversion
+algorithm.
+</a>
+</p>
+</section>
+<section>
+<h4 id="algorithm-13">
+Algorithm
+</h4>
+<p>
+The
+algorithm
+takes
+a
+JSON-LD
+document
+<i>
+element
+</i>
+and
+returns
+an
+<a class="tref internalDFN" title="rdf-dataset" href="#dfn-rdf-dataset">
+RDF
+dataset
+</a>.
+<ins class="diff-new">Unless
+the
+</ins><i><ins class="diff-new">
+produce
+generalized
+RDF
+</ins></i><ins class="diff-new">
+flag
+is
+set
+to
+</ins><a class="tref internalDFN" title="true" href="#dfn-true"><ins class="diff-new">
+true
+</ins></a>,<a class="tref internalDFN" title="rdf-triple" href="#dfn-rdf-triple"><ins class="diff-new">
+RDF
+triples
+</ins></a><ins class="diff-new">
+containing
+a
+</ins><a class="tref internalDFN" title="blank-node" href="#dfn-blank-node"><ins class="diff-new">
+blank
+node
+</ins></a><a class="tref internalDFN" title="rdf-predicate" href="#dfn-rdf-predicate"><ins class="diff-new">
+predicate
+</ins></a><ins class="diff-new">
+are
+excluded
+from
+output.
+</ins></p><p><ins class="diff-new">
+This
+algorithm
+generates
+new
+</ins><a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier"><ins class="diff-new">
+blank
+node
+identifiers
+</ins></a><ins class="diff-new">
+and
+relabels
+existing
+</ins><a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier"><ins class="diff-new">
+blank
+node
+identifiers
+</ins></a>.<ins class="diff-new">
+The
+used
+</ins><a href="#generate-blank-node-identifier"><ins class="diff-new">
+Generate
+Blank
+Node
+Identifier
+algorithm
+</ins></a><ins class="diff-new">
+keeps
+an
+</ins><i><ins class="diff-new">
+identifier
+map
+</ins></i><ins class="diff-new">
+and
+a
+</ins><i><ins class="diff-new">
+counter
+</ins></i><ins class="diff-new">
+to
+ensure
+consistent
+relabeling
+and
+avoid
+collisions.
+Thus,
+before
+this
+algorithm
+is
+run,
+the
+</ins><i><ins class="diff-new">
+identifier
+map
+</ins></i><ins class="diff-new">
+is
+reset
+and
+the
+</ins><i><ins class="diff-new">
+counter
+</ins></i><ins class="diff-new">
+is
+initialized
+to
+</ins><code><ins class="diff-new">
+0
+</ins></code>.
+</p>
+<ol class="algorithm">
+<li>
+Expand
+<i>
+element
+</i>
+according
+<ins class="diff-new">to
+</ins>
+the
+<a href="#expansion-algorithm">
+Expansion
+algorithm
+</a>.
+</li>
+<li>
+Generate
+a
+<i>
+node
+map
+</i>
+according
+<ins class="diff-new">to
+</ins>
+the
+<a href="#node-map-generation">
+Node
+Map
+Generation
+algorithm
+</a>.
+</li>
+<li>
+Initialize
+an
+empty
+<a class="tref internalDFN" title="rdf-dataset" href="#dfn-rdf-dataset">
+RDF
+dataset
+</a>
+<i>
+dataset
+</i>.
+</li>
+<li>
+For
+each
+<i>
+graph
+name
+</i>
+and
+<i>
+graph
+</i>
+in
+<i>
+node
+map
+</i>
+<ins class="diff-new">ordered
+by
+</ins><i><ins class="diff-new">
+graph
+name
+</ins>
+</i>:
+<ol class="algorithm">
+<li>
+Initialize
+<i>
+triples
+</i>
+as
+an
+empty
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>.
+</li>
+<li>
+For
+each
+<i>
+subject
+</i>
+and
+<i>
+node
+</i>
+in
+<i>
+graph
+</i>
+<ins class="diff-new">ordered
+by
+</ins><i><ins class="diff-new">
+subject
+</ins>
+</i>:
+<ol class="algorithm">
+<li>
+For
+each
+<i>
+property
+</i>
+and
+<i>
+values
+</i>
+in
+<i>
+node
+</i>
+<ins class="diff-new">ordered
+by
+</ins><i><ins class="diff-new">
+property
+</ins>
+</i>:
+<ol class="algorithm">
+<li>
+If
+<i>
+property
+</i>
+is
+<code>
+@type
+</code>,
+then
+for
+each
+<i>
+type
+</i>
+in
+<i>
+values
+</i>,
+append
+a
+<a class="tref internalDFN" title="triple" href="http://www.w3.org/TR/rdf11-concepts/#dfn-rdf-triple">
+triple
+</a>
+composed
+of
+<i>
+subject
+</i>,
+<code>
+rdf:type
+</code>,
+and
+<i>
+type
+</i>
+to
+<i>
+triples
+</i>.
+</li>
+<li>
+Otherwise,
+if
+<i>
+property
+</i>
+is
+a
+<a class="tref internalDFN" title="keyword" href="#dfn-keyword">
+keyword
+</a>
+continue
+to
+the
+next
+<i>
+property
+</i>
+-
+<i>
+values
+</i>
+pair.
+</li>
+<li>
+Otherwise,
+<ins class="diff-new">if
+</ins><i><ins class="diff-new">
+property
+</ins></i><ins class="diff-new">
+is
+a
+</ins><a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier"><ins class="diff-new">
+blank
+node
+identifier
+</ins></a><ins class="diff-new">
+and
+the
+</ins><i><ins class="diff-new">
+produce
+generalized
+RDF
+</ins></i><ins class="diff-new">
+flag
+is
+not
+</ins><a class="tref internalDFN" title="true" href="#dfn-true"><ins class="diff-new">
+true
+</ins></a>,<ins class="diff-new">
+continue
+to
+the
+next
+</ins><i><ins class="diff-new">
+property
+</ins></i><ins class="diff-new">
+-
+</ins><i><ins class="diff-new">
+values
+</ins></i><ins class="diff-new">
+pair.
+</ins></li><li><ins class="diff-new">
+Otherwise,
+</ins>
+<i>
+property
+</i>
+is
+an
+<a class="tref internalDFN" title="iri" href="#dfn-iri">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+or
+<a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">
+blank
+node
+identifier
+</a>.
+For
+each
+<i>
+item
+</i>
+in
+<i>
+values
+</i>:
+<ol class="algorithm">
+<li>
+If
+<i>
+item
+</i>
+is
+a
+<a class="tref internalDFN" title="list-object" href="#dfn-list-object">
+list
+object
+</a>,
+initialize
+<i>
+list
+triples
+</i>
+as
+an
+empty
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>
+and
+<i>
+list
+head
+</i>
+to
+the
+result
+of
+the
+<a href="#list-to-rdf-conversion">
+List
+Conversion
+algorithm
+</a>,
+passing
+the
+value
+associated
+with
+the
+<code>
+@list
+</code>
+key
+from
+<i>
+item
+</i>
+and
+<i>
+list
+triples
+</i>.
+Append
+first
+a
+<a class="tref internalDFN" title="triple" href="http://www.w3.org/TR/rdf11-concepts/#dfn-rdf-triple">
+triple
+</a>
+composed
+of
+<i>
+subject
+</i>,
+<i>
+property
+</i>,
+and
+<i>
+list
+head
+</i>
+to
+<i>
+triples
+</i>
+and
+finally
+append
+all
+<a class="tref internalDFN" title="triple" href="http://www.w3.org/TR/rdf11-concepts/#dfn-rdf-triple">
+triples
+</a>
+from
+<i>
+list
+triples
+</i>
+to
+<i>
+triples
+</i>.
+</li>
+<li>
+Otherwise,
+<i>
+item
+</i>
+is
+a
+<a class="tref internalDFN" title="value-object" href="#dfn-value-object">
+value
+object
+</a>
+or
+a
+<a class="tref internalDFN" title="node-object" href="#dfn-node-object">
+node
+object
+</a>.
+Append
+a
+<a class="tref internalDFN" title="triple" href="http://www.w3.org/TR/rdf11-concepts/#dfn-rdf-triple">
+triple
+</a>
+composed
+of
+<i>
+subject
+</i>,
+<i>
+property
+</i>,
+and
+the
+result
+of
+using
+the
+<a href="#object-to-rdf-conversion">
+Object
+to
+RDF
+Conversion
+algorithm
+</a>
+passing
+<i>
+item
+</i>
+to
+<i>
+triples
+</i>.
+</li>
+</ol>
+</li>
+</ol>
+</li>
+</ol>
+</li>
+<li>
+If
+<i>
+graph
+name
+</i>
+is
+<code>
+@default
+</code>,
+add
+<i>
+triples
+</i>
+to
+the
+<a class="tref internalDFN" title="default-graph" href="#dfn-default-graph">
+default
+graph
+</a>
+in
+<i>
+dataset
+</i>.
+</li>
+<li>
+Otherwise,
+create
+a
+<a class="tref internalDFN" title="named-graph" href="#dfn-named-graph">
+named
+graph
+</a>
+in
+<i>
+dataset
+</i>
+composed
+of
+<i>
+graph
+name
+</i>
+and
+add
+<i>
+triples
+</i>.
+</li>
+</ol>
+</li>
+<li>
+Return
+<i>
+dataset
+</i>.
+</li>
+</ol>
+</section>
+</section>
+<section id="object-to-rdf-conversion">
+<h3>
+<span class="secno">
+10.2
+</span>
+Object
+to
+RDF
+Conversion
+</h3>
+<p>
+This
+algorithm
+takes
+a
+<a class="tref internalDFN" title="node-object" href="#dfn-node-object">
+node
+object
+</a>
+or
+<a class="tref internalDFN" title="value-object" href="#dfn-value-object">
+value
+object
+</a>
+and
+transforms
+it
+into
+an
+<a class="tref externalDFN" title="rdf-resource" href="http://www.w3.org/TR/rdf11-concepts/#dfn-resource">
+RDF
+resource
+</a>
+to
+be
+used
+as
+the
+<a class="tref internalDFN" title="object" href="http://www.w3.org/TR/rdf11-concepts/#dfn-object">
+object
+</a>
+of
+an
+<a class="tref internalDFN" title="rdf-triple" href="#dfn-rdf-triple">
+RDF
+triple
+</a>.
+</p>
+<section class="informative">
+<h4 id="overview-14">
+Overview
+</h4>
+<p>
+<em>
+This
+section
+is
+non-normative.
+</em>
+</p>
+<p>
+<a class="tref internalDFN" title="value-object" href="#dfn-value-object">
+Value
+objects
+</a>
+are
+transformed
+to
+<a class="tref internalDFN" title="rdf-literal" href="http://www.w3.org/TR/rdf11-concepts/#dfn-literal">
+RDF
+literals
+</a>
+as
+described
+in
+<a class="sectionRef" href="#data-round-tripping">
+section
+10.6
+Data
+Round
+Tripping
+</a>
+whereas
+<a class="tref internalDFN" title="node-object" href="#dfn-node-object">
+node
+objects
+</a>
+are
+transformed
+to
+<a class="tref internalDFN" title="iri" href="#dfn-iri">
+IRIs
+</a>
+or
+<a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">
+blank
+node
+identifiers
+</a>.
+</p>
+</section>
+<section>
+<h4 id="algorithm-14">
+Algorithm
+</h4>
+<p>
+The
+algorithm
+takes
+as
+its
+sole
+argument
+<i>
+item
+</i>
+which
+must
+be
+either
+a
+<a class="tref internalDFN" title="value-object" href="#dfn-value-object">
+value
+object
+</a>
+or
+<a class="tref internalDFN" title="node-object" href="#dfn-node-object">
+node
+object
+</a>.
+</p>
+<ol class="algorithm">
+<li>
+If
+<i>
+item
+</i>
+is
+a
+<a class="tref internalDFN" title="node-object" href="#dfn-node-object">
+node
+object
+</a>
+return
+the
+<a class="tref internalDFN" title="iri" href="#dfn-iri">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+or
+<a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">
+blank
+node
+identifier
+</a>
+associated
+with
+its
+<code>
+@id
+</code>
+member.
+</li>
+<li>
+Otherwise,
+<i>
+item
+</i>
+is
+a
+<a class="tref internalDFN" title="value-object" href="#dfn-value-object">
+value
+object
+</a>.
+Initialize
+<i>
+value
+</i>
+to
+the
+value
+associated
+with
+the
+<code>
+@value
+</code>
+member
+in
+<i>
+item
+</i>.
+</li>
+<li>
+Initialize
+<i>
+datatype
+</i>
+to
+the
+value
+associated
+with
+the
+<code>
+@type
+</code>
+member
+of
+<i>
+item
+</i>
+or
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>
+if
+<i>
+item
+</i>
+does
+not
+have
+such
+a
+member.
+</li>
+<li>
+If
+<i>
+value
+</i>
+is
+<a class="tref internalDFN" title="true" href="#dfn-true">
+true
+</a>
+or
+<a class="tref internalDFN" title="false" href="#dfn-false">
+false
+</a>,
+set
+<i>
+value
+</i>
+to
+the
+<a class="tref internalDFN" title="string" href="#dfn-string">
+string
+</a>
+<code>
+true
+</code>
+or
+<code>
+false
+</code>
+which
+is
+the
+<a class="tref internalDFN" title="canonical-lexical-form" href="#dfn-canonical-lexical-form">
+canonical
+lexical
+form
+</a>
+as
+described
+in
+<a class="sectionRef" href="#data-round-tripping">
+section
+10.6
+Data
+Round
+Tripping
+</a>
+If
+<i>
+datatype
+</i>
+is
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>,
+set
+it
+to
+<code>
+xsd:boolean
+</code>.
+</li>
+<li>
+Otherwise,
+if
+<i>
+value
+</i>
+is
+a
+<a class="tref internalDFN" title="number" href="#dfn-number">
+number
+</a>
+with
+<del class="diff-old">fractions
+</del>
+<ins class="diff-chg">a
+non-zero
+fractional
+part
+(the
+result
+of
+a
+modulo‑1
+operation)
+</ins>
+or
+<i>
+value
+</i>
+is
+a
+<a class="tref internalDFN" title="number" href="#dfn-number">
+number
+</a>
+and
+<i>
+datatype
+</i>
+equals
+<code>
+xsd:double
+</code>,
+convert
+<i>
+value
+</i>
+to
+a
+<a class="tref internalDFN" title="string" href="#dfn-string">
+string
+</a>
+in
+<a class="tref internalDFN" title="canonical-lexical-form" href="#dfn-canonical-lexical-form">
+canonical
+lexical
+form
+</a>
+of
+an
+<code>
+xsd:double
+</code>
+as
+defined
+in
+[
+<cite>
+<a class="bibref" href="#bib-XMLSCHEMA11-2">
+XMLSCHEMA11-2
+</a>
+</cite>
+]
+and
+described
+in
+<a class="sectionRef" href="#data-round-tripping">
+section
+10.6
+Data
+Round
+Tripping
+</a>.
+If
+<i>
+datatype
+</i>
+is
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>,
+set
+it
+to
+<code>
+xsd:double
+</code>.
+</li>
+<li>
+Otherwise,
+if
+<i>
+value
+</i>
+is
+a
+<a class="tref internalDFN" title="number" href="#dfn-number">
+number
+</a>
+<del class="diff-old">without
+fractions
+</del>
+<ins class="diff-chg">with
+no
+non-zero
+fractional
+part
+(the
+result
+of
+a
+modulo‑1
+operation)
+</ins>
+or
+<i>
+value
+</i>
+is
+a
+<a class="tref internalDFN" title="number" href="#dfn-number">
+number
+</a>
+and
+<i>
+datatype
+</i>
+equals
+<code>
+xsd:integer
+</code>,
+convert
+<i>
+value
+</i>
+to
+a
+<a class="tref internalDFN" title="string" href="#dfn-string">
+string
+</a>
+in
+<a class="tref internalDFN" title="canonical-lexical-form" href="#dfn-canonical-lexical-form">
+canonical
+lexical
+form
+</a>
+of
+an
+<code>
+xsd:integer
+</code>
+as
+defined
+in
+[
+<cite>
+<a class="bibref" href="#bib-XMLSCHEMA11-2">
+XMLSCHEMA11-2
+</a>
+</cite>
+]
+and
+described
+in
+<a class="sectionRef" href="#data-round-tripping">
+section
+10.6
+Data
+Round
+Tripping
+</a>.
+If
+<i>
+datatype
+</i>
+is
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>,
+set
+it
+to
+<code>
+xsd:integer
+</code>.
+</li>
+<li>
+Otherwise,
+if
+<i>
+datatype
+</i>
+is
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>,
+set
+it
+to
+<code>
+xsd:string
+</code>
+or
+<code>
+rdf:langString
+</code>,
+depending
+on
+if
+item
+has
+an
+<code>
+@language
+</code>
+member.
+</li>
+<li>
+Initialize
+<i>
+literal
+</i>
+as
+an
+<a class="tref internalDFN" title="rdf-literal" href="http://www.w3.org/TR/rdf11-concepts/#dfn-literal">
+RDF
+literal
+</a>
+using
+<i>
+value
+</i>
+and
+<i>
+datatype
+</i>.
+If
+<i>
+item
+</i>
+has
+an
+<code>
+@language
+</code>
+member,
+add
+the
+value
+associated
+with
+the
+<code>
+@language
+</code>
+key
+as
+the
+language
+tag
+of
+<i>
+literal
+</i>.
+</li>
+<li>
+Return
+<i>
+literal
+</i>.
+</li>
+</ol>
+</section>
+</section>
+<section id="list-to-rdf-conversion">
+<h3>
+<span class="secno">
+10.3
+</span>
+List
+to
+RDF
+Conversion
+</h3>
+<p>
+List
+Conversion
+is
+the
+process
+of
+taking
+a
+<a class="tref internalDFN" title="list-object" href="#dfn-list-object">
+list
+object
+</a>
+and
+transforming
+it
+into
+an
+<a class="tref externalDFN" title="rdf-collection" href="http://www.w3.org/TR/rdf-schema/#ch_collectionvocab">
+RDF
+Collection
+</a>
+as
+defined
+in
+RDF
+Semantics
+[
+<cite>
+<a class="bibref" href="#bib-RDF-MT">
+RDF-MT
+</a>
+</cite>
+].
+</p>
+<section class="informative">
+<h4 id="overview-15">
+Overview
+</h4>
+<p>
+<em>
+This
+section
+is
+non-normative.
+</em>
+</p>
+<p>
+For
+each
+element
+of
+the
+<a class="tref internalDFN" title="list" href="#dfn-list">
+list
+</a>
+a
+new
+<a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">
+blank
+node
+identifier
+</a>
+is
+allocated
+which
+is
+used
+to
+generate
+<code>
+rdf:first
+</code>
+and
+<code>
+rdf:rest
+</code>
+<a class="tref internalDFN" title="rdf-triple" href="#dfn-rdf-triple">
+triples
+</a>.
+The
+algorithm
+returns
+the
+list
+head,
+which
+is
+either
+the
+<del class="diff-old">the
+</del>
+first
+allocated
+<a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">
+blank
+node
+identifier
+</a>
+or
+<code>
+rdf:nil
+</code>
+if
+the
+<a class="tref internalDFN" title="list" href="#dfn-list">
+list
+</a>
+is
+empty.
+</p>
+</section>
+<section>
+<h4 id="algorithm-15">
+Algorithm
+</h4>
+<p>
+The
+algorithm
+takes
+two
+inputs:
+an
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>
+<i>
+list
+</i>
+and
+an
+empty
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>
+<i>
+list
+triples
+</i>
+used
+for
+returning
+the
+generated
+<a class="tref internalDFN" title="rdf-triple" href="#dfn-rdf-triple">
+triples
+</a>.
+</p>
+<ol class="algorithm">
+<li>
+If
+<i>
+list
+</i>
+is
+empty,
+return
+<code>
+rdf:nil
+</code>.
+</li>
+<li>
+Otherwise,
+create
+an
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>
+<i>
+bnodes
+</i>
+composed
+of
+a
+<a href="#generate-blank-node-identifier">
+newly
+generated
+blank
+node
+identifier
+</a>
+for
+each
+entry
+in
+<i>
+list
+</i>.
+</li>
+<li>
+Initialize
+an
+empty
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>
+<i>
+list
+triples
+</i>.
+</li>
+<li>
+For
+each
+pair
+of
+<i>
+subject
+</i>
+from
+<i>
+bnodes
+</i>
+and
+<i>
+item
+</i>
+from
+<i>
+list
+</i>:
+<ol class="algorithm">
+<li>
+Append
+a
+<a class="tref internalDFN" title="triple" href="http://www.w3.org/TR/rdf11-concepts/#dfn-rdf-triple">
+triple
+</a>
+composed
+of
+<i>
+subject
+</i>,
+<code>
+rdf:first
+</code>,
+and
+the
+result
+of
+using
+th
+<a href="#object-to-rdf-conversion">
+Object
+to
+RDF
+Conversion
+algorithm
+</a>
+passing
+<i>
+item
+</i>
+to
+<i>
+list
+triples
+</i>.
+</li>
+<li>
+Set
+<i>
+rest
+</i>
+as
+the
+next
+entry
+in
+<i>
+bnodes
+</i>,
+or
+if
+that
+does
+not
+exist,
+<code>
+rdf:nil
+</code>.
+Append
+a
+<a class="tref internalDFN" title="triple" href="http://www.w3.org/TR/rdf11-concepts/#dfn-rdf-triple">
+triple
+</a>
+composed
+of
+<i>
+subject
+</i>,
+<code>
+rdf:rest
+</code>,
+and
+<i>
+rest
+</i>
+to
+<i>
+list
+triples
+</i>.
+</li>
+</ol>
+</li>
+<li>
+Return
+the
+first
+<a class="tref internalDFN" title="blank-node" href="#dfn-blank-node">
+blank
+node
+</a>
+from
+<i>
+bnodes
+</i>
+or
+<code>
+rdf:nil
+</code>
+if
+<i>
+bnodes
+</i>
+is
+empty.
+</li>
+</ol>
+</section>
+</section>
+<section id="serialize-rdf-as-json-ld-algorithm">
+<h3>
+<span class="secno">
+10.4
+</span>
+<del class="diff-old">Convert
+from
+</del>
+<ins class="diff-chg">Serialize
+</ins>
+RDF
+<ins class="diff-new">as
+JSON-LD
+</ins>
+Algorithm
+</h3>
+<p>
+This
+algorithm
+<del class="diff-old">converts
+</del>
+<ins class="diff-chg">serializes
+</ins>
+an
+<a class="tref internalDFN" title="rdf-dataset" href="#dfn-rdf-dataset">
+RDF
+dataset
+</a>
+consisting
+of
+a
+<a class="tref internalDFN" title="default-graph" href="#dfn-default-graph">
+default
+graph
+</a>
+and
+zero
+or
+more
+<a class="tref internalDFN" title="named-graph" href="#dfn-named-graph">
+named
+graphs
+</a>
+into
+a
+JSON-LD
+document.
+</p>
+<section class="informative">
+<h4 id="overview-16">
+Overview
+</h4>
+<p>
+<em>
+This
+section
+is
+non-normative.
+</em>
+</p>
+<p>
+Iterate
+through
+each
+graph
+in
+the
+dataset,
+converting
+<ins class="diff-new">each
+</ins>
+<a class="tref internalDFN" title="rdf-collection" href="http://www.w3.org/TR/rdf-schema/#ch_collectionvocab">
+RDF
+<del class="diff-old">Collections
+</del>
+<ins class="diff-chg">Collection
+</ins>
+</a>
+into
+a
+<a class="tref internalDFN" title="list" href="#dfn-list">
+list
+</a>
+and
+generating
+a
+JSON-LD
+document
+in
+expanded
+form
+for
+all
+<a class="tref internalDFN" title="rdf-literal" href="http://www.w3.org/TR/rdf11-concepts/#dfn-literal">
+RDF
+literals
+</a>,
+<a class="tref internalDFN" title="iri" href="#dfn-iri">
+IRIs
+</a>
+and
+<a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">
+blank
+node
+identifiers
+</a>.
+If
+the
+<i>
+use
+native
+types
+</i>
+flag
+is
+set
+to
+<a class="tref internalDFN" title="true" href="#dfn-true">
+true
+</a>,
+<a class="tref internalDFN" title="rdf-literal" href="http://www.w3.org/TR/rdf11-concepts/#dfn-literal">
+RDF
+literals
+</a>
+with
+a
+<a class="tref externalDFN" title="datatype-iri" href="http://www.w3.org/TR/rdf11-concepts/#dfn-datatype-iri">
+datatype
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+that
+equals
+<code>
+xsd:integer
+</code>
+or
+<code>
+xsd:double
+</code>
+are
+converted
+to
+a
+<a class="tref internalDFN" title="number" href="#dfn-number">
+JSON
+numbers
+</a>
+and
+<a class="tref internalDFN" title="rdf-literal" href="http://www.w3.org/TR/rdf11-concepts/#dfn-literal">
+RDF
+literals
+</a>
+with
+a
+<a class="tref externalDFN" title="datatype-iri" href="http://www.w3.org/TR/rdf11-concepts/#dfn-datatype-iri">
+datatype
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+that
+equals
+<code>
+xsd:boolean
+</code>
+are
+converted
+to
+<a class="tref internalDFN" title="true" href="#dfn-true">
+true
+</a>
+or
+<a class="tref internalDFN" title="false" href="#dfn-false">
+false
+</a>
+based
+on
+their
+<a class="tref externalDFN" title="lexical-form" href="http://www.w3.org/TR/rdf11-concepts/#dfn-lexical-form">
+lexical
+form
+</a>
+as
+described
+in
+<a class="sectionRef" href="#data-round-tripping">
+section
+10.6
+Data
+Round
+Tripping
+</a>.
+</p>
+</section>
+<section>
+<h4 id="algorithm-16">
+Algorithm
+</h4>
+<p>
+The
+algorithm
+takes
+two
+required
+inputs:
+an
+<a class="tref internalDFN" title="rdf-dataset" href="#dfn-rdf-dataset">
+RDF
+dataset
+</a>
+and
+a
+flag
+<i>
+use
+native
+types
+</i>
+that
+defaults
+to
+<del class="diff-old">true
+</del>
+<a class="tref internalDFN" title="false" href="#dfn-false">
+<ins class="diff-chg">false
+</ins>
+</a>.
+</p>
+<ol class="algorithm">
+<li>
+Initialize
+<i>
+default
+graph
+</i>
+to
+an
+empty
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>.
+</li>
+<li>
+Initialize
+<i>
+graph
+map
+</i>
+to
+a
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>
+consisting
+of
+a
+single
+member
+<code>
+@default
+</code>
+whose
+value
+references
+<i>
+default
+graph
+</i>.
+</li>
+<li>
+For
+each
+<i>
+graph
+</i>
+in
+<a class="tref internalDFN" title="rdf-dataset" href="#dfn-rdf-dataset">
+RDF
+dataset
+</a>:
+<ol class="algorithm">
+<li>
+If
+<i>
+graph
+</i>
+is
+the
+<a class="tref internalDFN" title="default-graph" href="#dfn-default-graph">
+default
+graph
+</a>,
+set
+<i>
+name
+</i>
+to
+<code>
+@default
+</code>,
+otherwise
+to
+the
+<a class="tref internalDFN" title="graph-name" href="#dfn-graph-name">
+graph
+name
+</a>
+associated
+with
+<i>
+graph
+</i>.
+</li>
+<li>
+If
+<i>
+graph
+map
+</i>
+has
+no
+<i>
+name
+</i>
+member,
+create
+one
+and
+set
+its
+value
+to
+an
+empty
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>.
+</li>
+<li>
+If
+<i>
+graph
+</i>
+is
+not
+the
+<a class="tref internalDFN" title="default-graph" href="#dfn-default-graph">
+default
+graph
+</a>
+and
+<i>
+default
+graph
+</i>
+does
+not
+have
+a
+<i>
+name
+</i>
+member,
+create
+such
+a
+member
+and
+initialize
+its
+value
+to
+a
+new
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>
+with
+a
+single
+member
+<code>
+@id
+</code>
+whose
+value
+is
+<i>
+name
+</i>.
+</li>
+<li>
+Reference
+the
+value
+of
+the
+<i>
+name
+</i>
+member
+in
+<i>
+graph
+map
+</i>
+using
+the
+variable
+<i>
+node
+map
+</i>.
+</li>
+<li>
+For
+each
+<a class="tref internalDFN" title="rdf-triple" href="#dfn-rdf-triple">
+RDF
+triple
+</a>
+in
+<i>
+graph
+</i>
+consisting
+of
+<i>
+subject
+</i>,
+<i>
+predicate
+</i>,
+and
+<i>
+object
+</i>:
+<ol class="algorithm">
+<li>
+If
+<i>
+node
+map
+</i>
+does
+not
+have
+a
+<i>
+subject
+</i>
+member,
+create
+one
+and
+initialize
+its
+value
+to
+a
+new
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>
+consisting
+of
+a
+single
+member
+<code>
+@id
+</code>
+whose
+value
+is
+set
+to
+<i>
+subject
+</i>.
+</li>
+<li>
+Reference
+the
+value
+of
+the
+<i>
+subject
+</i>
+member
+in
+<i>
+node
+map
+</i>
+using
+the
+variable
+<i>
+node
+</i>.
+</li>
+<li>
+If
+<i>
+object
+</i>
+is
+an
+<a class="tref internalDFN" title="iri" href="#dfn-iri">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+or
+<a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">
+blank
+node
+identifier
+</a>,
+<del class="diff-old">does
+not
+equal
+rdf:nil
+,
+</del>
+and
+<i>
+node
+map
+</i>
+does
+not
+have
+an
+<i>
+object
+</i>
+member,
+create
+one
+and
+initialize
+its
+value
+to
+a
+new
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>
+consisting
+of
+a
+single
+member
+<code>
+@id
+</code>
+whose
+value
+is
+set
+to
+<i>
+object
+</i>.
+</li>
+<li>
+If
+<i>
+predicate
+</i>
+equals
+<code>
+rdf:type
+</code>,
+and
+<i>
+object
+</i>
+is
+an
+<a class="tref internalDFN" title="iri" href="#dfn-iri">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+or
+<a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">
+blank
+node
+identifier
+</a>,
+append
+<i>
+object
+</i>
+to
+the
+value
+of
+the
+<code>
+@type
+</code>
+member
+of
+<i>
+node
+<del class="diff-old">.
+</del>
+</i>
+<ins class="diff-chg">;
+unless
+such
+an
+item
+already
+exists.
+</ins>
+If
+no
+such
+member
+exists,
+create
+one
+and
+initialize
+it
+to
+an
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>
+whose
+only
+item
+is
+<i>
+object
+</i>.
+Finally,
+continue
+to
+the
+next
+<a class="tref internalDFN" title="rdf-triple" href="#dfn-rdf-triple">
+RDF
+triple
+</a>.
+</li>
+<li>
+<del class="diff-old">If
+object
+equals
+rdf:nil
+and
+predicate
+does
+not
+equal
+rdf:rest
+,
+set
+value
+to
+a
+new
+JSON
+object
+consisting
+of
+a
+single
+member
+@list
+whose
+value
+is
+set
+to
+an
+empty
+array
+.
+Otherwise,
+set
+</del>
+<ins class="diff-chg">Set
+</ins>
+<i>
+value
+</i>
+to
+the
+result
+of
+using
+the
+<a href="#rdf-to-object-conversion">
+RDF
+to
+Object
+Conversion
+algorithm
+</a>,
+passing
+<i>
+object
+</i>
+and
+<i>
+use
+native
+types
+</i>.
+</li>
+<li>
+If
+<i>
+node
+</i>
+does
+not
+have
+an
+<i>
+predicate
+</i>
+member,
+create
+one
+and
+initialize
+its
+value
+to
+an
+empty
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>.
+</li>
+<li>
+<del class="diff-old">Add
+a
+reference
+</del>
+<ins class="diff-chg">If
+there
+is
+no
+item
+equivalent
+</ins>
+to
+<i>
+value
+</i>
+<del class="diff-old">to
+the
+to
+</del>
+<ins class="diff-chg">in
+</ins>
+the
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>
+associated
+with
+the
+<i>
+predicate
+</i>
+member
+of
+<i>
+node
+<del class="diff-old">.
+</del>
+</i>,
+<ins class="diff-chg">append
+a
+reference
+to
+</ins><i><ins class="diff-chg">
+value
+</ins></i><ins class="diff-chg">
+to
+the
+</ins><a class="tref internalDFN" title="array" href="#dfn-array"><ins class="diff-chg">
+array
+</ins></a>.<ins class="diff-chg">
+Two
+JSON
+objects
+are
+considered
+equal
+if
+they
+have
+equivalent
+key-value
+pairs.
+</ins>
+</li>
+<li>
+If
+<i>
+object
+</i>
+is
+a
+<a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">
+blank
+node
+identifier
+</a>
+<del class="diff-old">and
+predicate
+equals
+neither
+rdf:first
+nor
+rdf:rest
+,
+</del>
+<ins class="diff-chg">or
+</ins><a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier"><ins class="diff-chg">
+IRI
+</ins></abbr></a>,
+it
+might
+represent
+the
+<del class="diff-old">head
+of
+a
+RDF
+list:
+</del>
+<ins class="diff-chg">list
+node:
+</ins>
+<ol class="algorithm">
+<li>
+If
+the
+<i>
+object
+</i>
+member
+of
+<i>
+node
+map
+</i>
+has
+<del class="diff-old">an
+</del>
+<ins class="diff-chg">no
+</ins>
+<code>
+usages
+</code>
+member,
+<del class="diff-old">add
+a
+reference
+</del>
+<ins class="diff-chg">create
+one
+and
+initialize
+it
+</ins>
+to
+<ins class="diff-new">an
+empty
+</ins><a class="tref internalDFN" title="array" href="#dfn-array"><ins class="diff-new">
+array
+</ins></a>.</li><li><ins class="diff-new">
+Reference
+the
+</ins><code><ins class="diff-new">
+usages
+</ins></code><ins class="diff-new">
+member
+of
+the
+</ins>
+<i>
+<del class="diff-old">value
+</del>
+<ins class="diff-chg">object
+</ins>
+</i>
+<del class="diff-old">to
+it;
+otherwise
+create
+such
+a
+</del>
+member
+<ins class="diff-new">of
+</ins><i><ins class="diff-new">
+node
+map
+</ins></i><ins class="diff-new">
+using
+the
+variable
+</ins><i><ins class="diff-new">
+usages
+</ins></i>.</li><li><ins class="diff-new">
+Append
+a
+new
+</ins><a class="tref internalDFN" title="json-object" href="#dfn-json-object"><ins class="diff-new">
+JSON
+object
+</ins></a><ins class="diff-new">
+consisting
+of
+three
+members,
+</ins><code><ins class="diff-new">
+node
+</ins></code>,<code><ins class="diff-new">
+property
+</ins></code>,
+and
+<del class="diff-old">set
+its
+</del>
+<code>
+value
+</code>
+to
+<del class="diff-old">an
+</del>
+<ins class="diff-chg">the
+</ins><i><ins class="diff-chg">
+usages
+</ins></i>
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+<del class="diff-old">whose
+only
+item
+</del>
+</a>.
+<ins class="diff-chg">The
+</ins><code><ins class="diff-chg">
+node
+</ins></code><ins class="diff-chg">
+member
+</ins>
+is
+<ins class="diff-new">set
+to
+a
+reference
+to
+</ins><i><ins class="diff-new">
+node
+</ins></i>,<code><ins class="diff-new">
+property
+</ins></code><ins class="diff-new">
+to
+</ins><i><ins class="diff-new">
+predicate
+</ins></i>,<ins class="diff-new">
+and
+</ins><code><ins class="diff-new">
+value
+</ins></code><ins class="diff-new">
+to
+</ins>
+a
+reference
+to
+<i>
+value
+</i>.
+</li>
+</ol>
+</li>
+</ol>
+</li>
+</ol>
+</li>
+<li>
+For
+each
+<i>
+name
+</i>
+and
+<i>
+graph
+object
+</i>
+in
+<i>
+graph
+map
+</i>:
+<ol class="algorithm">
+<li>
+<ins class="diff-new">If
+</ins><i><ins class="diff-new">
+graph
+object
+</ins></i><ins class="diff-new">
+has
+no
+</ins><code><ins class="diff-new">
+rdf:nil
+</ins></code><ins class="diff-new">
+member,
+continue
+with
+the
+next
+</ins><i><ins class="diff-new">
+name
+</ins></i><ins class="diff-new">
+-
+</ins><i><ins class="diff-new">
+graph
+object
+</ins></i><ins class="diff-new">
+pair
+as
+the
+graph
+does
+not
+contain
+any
+lists
+that
+need
+to
+be
+converted.
+</ins></li><li>
+Initialize
+<i>
+<del class="diff-old">subjects
+</del>
+<ins class="diff-chg">nil
+</ins>
+</i>
+to
+<del class="diff-old">an
+array
+whose
+items
+are
+</del>
+the
+<del class="diff-old">keys
+</del>
+<ins class="diff-chg">value
+of
+the
+</ins><code><ins class="diff-chg">
+rdf:nil
+</ins></code><ins class="diff-chg">
+member
+</ins>
+of
+<i>
+graph
+object
+</i>.
+</li>
+<li>
+For
+<ins class="diff-new">each
+</ins>
+item
+<i>
+<del class="diff-old">subj
+</del>
+<ins class="diff-chg">usage
+</ins>
+</i>
+<del class="diff-old">of
+</del>
+<ins class="diff-chg">in
+</ins>
+the
+<del class="diff-old">array
+</del>
+<code>
+<ins class="diff-chg">usages
+</ins></code><ins class="diff-chg">
+member
+of
+</ins>
+<i>
+<del class="diff-old">subjects
+</del>
+<ins class="diff-chg">nil
+</ins>
+</i>,
+perform
+the
+following
+steps:
+<ol class="algorithm">
+<li>
+<del class="diff-old">If
+graph
+object
+does
+not
+have
+a
+</del>
+<ins class="diff-chg">Initialize
+</ins>
+<i>
+<del class="diff-old">subj
+</del>
+<ins class="diff-chg">node
+</ins>
+</i>
+<del class="diff-old">member,
+it
+has
+been
+removed
+as
+it
+was
+part
+of
+a
+list.
+Continue
+with
+</del>
+<ins class="diff-chg">to
+</ins>
+the
+<del class="diff-old">next
+subj
+.
+Reference
+</del>
+<ins class="diff-chg">value
+of
+</ins>
+the
+value
+of
+the
+<del class="diff-old">subj
+</del>
+<code>
+<ins class="diff-chg">node
+</ins></code>
+member
+of
+<i>
+<del class="diff-old">graph
+object
+using
+the
+variable
+node
+.
+If
+</del>
+<ins class="diff-chg">usage
+</ins></i>,
+<i>
+<del class="diff-old">node
+</del>
+<ins class="diff-chg">property
+</ins>
+</i>
+<del class="diff-old">has
+no
+</del>
+<ins class="diff-chg">to
+the
+value
+of
+the
+</ins>
+<code>
+<del class="diff-old">usages
+</del>
+<ins class="diff-chg">property
+</ins>
+</code>
+member
+<del class="diff-old">or
+its
+value
+is
+not
+an
+array
+consisting
+</del>
+of
+<del class="diff-old">one
+item,
+continue
+with
+the
+next
+</del>
+<i>
+<del class="diff-old">subj
+.
+Reference
+the
+only
+item
+of
+the
+array
+which
+is
+</del>
+<ins class="diff-chg">usage
+</ins></i>,<ins class="diff-chg">
+and
+</ins><i><ins class="diff-chg">
+head
+</ins></i><ins class="diff-chg">
+to
+</ins>
+the
+value
+of
+the
+<code>
+<del class="diff-old">usages
+</del>
+<ins class="diff-chg">value
+</ins>
+</code>
+member
+of
+<i>
+<del class="diff-old">node
+using
+the
+variable
+value
+</del>
+<ins class="diff-chg">usage
+</ins>
+</i>.
+</li>
+<li>
+Initialize
+<del class="diff-old">the
+variables
+</del>
+<ins class="diff-chg">two
+empty
+</ins><a class="tref internalDFN" title="array" href="#dfn-array"><ins class="diff-chg">
+arrays
+</ins></a>
+<i>
+list
+</i>
+and
+<i>
+list
+nodes
+<del class="diff-old">to
+empty
+arrays
+.
+Initialize
+the
+subject
+to
+subj
+</del>
+</i>.
+</li>
+<li>
+<del class="diff-old">As
+long
+as
+</del>
+<ins class="diff-chg">While
+</ins>
+<i>
+<del class="diff-old">subject
+</del>
+<ins class="diff-chg">property
+</ins>
+</i>
+<del class="diff-old">does
+not
+equal
+</del>
+<ins class="diff-chg">equals
+</ins>
+<code>
+<del class="diff-old">rdf:nil
+</del>
+<ins class="diff-chg">rdf:rest
+</ins></code>,<ins class="diff-chg">
+the
+value
+associated
+to
+the
+</ins><code><ins class="diff-chg">
+usages
+</ins>
+</code>
+<del class="diff-old">and
+</del>
+<ins class="diff-chg">member
+of
+</ins>
+<i>
+<del class="diff-old">list
+</del>
+<ins class="diff-chg">node
+</ins>
+</i>
+<del class="diff-old">is
+not
+null
+,
+perform
+the
+following
+steps:
+If
+</del>
+<ins class="diff-chg">has
+exactly
+1
+entry,
+</ins>
+<i>
+node
+</i>
+<del class="diff-old">is
+null
+;
+the
+value
+of
+its
+@id
+member
+does
+not
+begin
+with
+_:
+;
+it
+</del>
+has
+<del class="diff-old">members
+other
+than
+@id
+,
+usages
+,
+</del>
+<ins class="diff-chg">a
+</ins>
+<code>
+rdf:first
+<del class="diff-old">,
+</del>
+</code>
+and
+<code>
+rdf:rest
+</code>
+<del class="diff-old">;
+the
+value
+</del>
+<ins class="diff-chg">property,
+both
+</ins>
+of
+<del class="diff-old">its
+rdf:first
+and
+member
+is
+not
+</del>
+<ins class="diff-chg">which
+have
+as
+value
+</ins>
+an
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>
+consisting
+of
+a
+single
+<del class="diff-old">item;
+or
+the
+value
+of
+its
+</del>
+<ins class="diff-chg">element,
+and
+</ins><i><ins class="diff-chg">
+node
+</ins></i><ins class="diff-chg">
+has
+no
+other
+members
+apart
+from
+an
+optional
+</ins>
+<code>
+<del class="diff-old">rdf:rest
+</del>
+<ins class="diff-chg">@type
+</ins>
+</code>
+member
+<ins class="diff-new">whose
+value
+</ins>
+is
+<del class="diff-old">not
+</del>
+an
+array
+<del class="diff-old">containing
+</del>
+<ins class="diff-chg">with
+</ins>
+a
+single
+item
+<del class="diff-old">which
+is
+a
+JSON
+object
+that
+has
+an
+</del>
+<ins class="diff-chg">equal
+to
+</ins>
+<code>
+<del class="diff-old">@id
+member,
+it
+is
+not
+</del>
+<ins class="diff-chg">rdf:List
+</ins></code>,<i><ins class="diff-chg">
+node
+</ins></i><ins class="diff-chg">
+represents
+</ins>
+a
+<del class="diff-old">valid
+</del>
+<ins class="diff-chg">well-formed
+</ins>
+list
+node.
+<del class="diff-old">Set
+list
+</del>
+<ins class="diff-chg">Perform
+the
+following
+steps
+</ins>
+to
+<del class="diff-old">null.
+Otherwise:
+</del>
+<ins class="diff-chg">traverse
+the
+list
+backwards
+towards
+its
+head:
+</ins>
+<ol class="algorithm">
+<li>
+<del class="diff-old">Add
+</del>
+<ins class="diff-chg">Append
+</ins>
+the
+<ins class="diff-new">only
+</ins>
+item
+of
+<del class="diff-old">the
+array
+which
+is
+the
+value
+of
+the
+</del>
+<code>
+rdf:first
+</code>
+member
+of
+<i>
+node
+</i>
+to
+<ins class="diff-new">the
+</ins>
+<i>
+list
+<del class="diff-old">.
+</del>
+</i>
+<a class="tref internalDFN" title="array" href="#dfn-array">
+<ins class="diff-chg">array
+</ins></a>.
+</li>
+<li>
+<del class="diff-old">Add
+</del>
+<ins class="diff-chg">Append
+</ins>
+the
+value
+of
+the
+<code>
+@id
+</code>
+member
+of
+<i>
+node
+</i>
+to
+<ins class="diff-new">the
+</ins>
+<i>
+list
+nodes
+<del class="diff-old">.
+</del>
+</i>
+<a class="tref internalDFN" title="array" href="#dfn-array">
+<ins class="diff-chg">array
+</ins></a>.
+</li>
+<li>
+<del class="diff-old">The
+</del>
+<ins class="diff-chg">Initialize
+</ins><i><ins class="diff-chg">
+node
+usage
+</ins></i><ins class="diff-chg">
+to
+the
+</ins>
+only
+item
+of
+the
+<del class="diff-old">array
+which
+is
+</del>
+<code>
+<ins class="diff-chg">usages
+</ins></code><ins class="diff-chg">
+member
+of
+</ins><i><ins class="diff-chg">
+node
+</ins></i>.</li><li><ins class="diff-chg">
+Set
+</ins><i><ins class="diff-chg">
+node
+</ins></i><ins class="diff-chg">
+to
+</ins>
+the
+value
+of
+the
+<code>
+<del class="diff-old">rdf:rest
+</del>
+<ins class="diff-chg">node
+</ins>
+</code>
+member
+of
+<i>
+node
+<ins class="diff-new">usage
+</ins></i>,<i><ins class="diff-new">
+property
+</ins>
+</i>
+<del class="diff-old">is
+a
+JSON
+object
+.
+Set
+</del>
+<ins class="diff-chg">to
+the
+value
+of
+the
+</ins><code><ins class="diff-chg">
+property
+</ins></code><ins class="diff-chg">
+member
+of
+</ins>
+<i>
+<del class="diff-old">subject
+</del>
+<ins class="diff-chg">node
+usage
+</ins></i>,<ins class="diff-chg">
+and
+</ins><i><ins class="diff-chg">
+head
+</ins>
+</i>
+to
+the
+value
+of
+<del class="diff-old">its
+</del>
+<ins class="diff-chg">the
+</ins>
+<code>
+<del class="diff-old">@id
+</del>
+<ins class="diff-chg">value
+</ins>
+</code>
+<del class="diff-old">member.
+</del>
+<ins class="diff-chg">member
+of
+</ins><i><ins class="diff-chg">
+node
+usage
+</ins></i>.
+</li>
+<li>
+If
+<ins class="diff-new">the
+</ins><code><ins class="diff-new">
+@id
+</ins></code><ins class="diff-new">
+member
+of
+</ins>
+<i>
+<del class="diff-old">graph
+object
+</del>
+<ins class="diff-chg">node
+</ins>
+</i>
+<del class="diff-old">has
+</del>
+<ins class="diff-chg">is
+an
+</ins><a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier"><ins class="diff-chg">
+IRI
+</ins></abbr></a><ins class="diff-chg">
+instead
+of
+</ins>
+a
+<a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">
+<ins class="diff-new">blank
+node
+identifier
+</ins></a>,<ins class="diff-new">
+exit
+the
+while
+loop.
+</ins></li></ol></li><li><ins class="diff-new">
+If
+</ins>
+<i>
+<del class="diff-old">subject
+</del>
+<ins class="diff-chg">property
+</ins>
+</i>
+<del class="diff-old">member,
+reference
+its
+</del>
+<ins class="diff-chg">equals
+</ins><code><ins class="diff-chg">
+rdf:first
+</ins></code>,<ins class="diff-chg">
+i.e.,
+the
+detected
+list
+is
+nested
+inside
+another
+list
+</ins><ol class="algorithm"><li><ins class="diff-chg">
+and
+the
+</ins>
+value
+<del class="diff-old">using
+</del>
+<ins class="diff-chg">of
+</ins>
+the
+<del class="diff-old">variable
+</del>
+<code>
+<ins class="diff-chg">@id
+</ins></code><ins class="diff-chg">
+of
+</ins>
+<i>
+node
+</i>
+<del class="diff-old">;
+otherwise
+set
+</del>
+<ins class="diff-chg">equals
+</ins><code><ins class="diff-chg">
+rdf:nil
+</ins></code>,<ins class="diff-chg">
+i.e.,
+the
+detected
+list
+is
+empty,
+continue
+with
+the
+next
+</ins>
+<i>
+<del class="diff-old">node
+</del>
+<ins class="diff-chg">usage
+</ins>
+</i>
+<ins class="diff-new">item.
+The
+</ins><code><ins class="diff-new">
+rdf:nil
+</ins></code><ins class="diff-new">
+node
+cannot
+be
+converted
+</ins>
+to
+<del class="diff-old">null
+</del>
+<ins class="diff-chg">a
+</ins><a class="tref internalDFN" title="list-object" href="#dfn-list-object"><ins class="diff-chg">
+list
+object
+</ins></a><ins class="diff-chg">
+as
+it
+would
+result
+in
+a
+list
+of
+lists,
+which
+isn't
+supported.
+</ins></li><li><ins class="diff-chg">
+Otherwise,
+the
+list
+consists
+of
+at
+least
+one
+item.
+We
+preserve
+the
+head
+node
+and
+transform
+the
+rest
+of
+the
+linked
+list
+to
+a
+</ins><a class="tref internalDFN" title="list-object" href="#dfn-list-object"><ins class="diff-chg">
+list
+object
+</ins>
+</a>.
+</li>
+<li>
+<del class="diff-old">If
+</del>
+<ins class="diff-chg">Set
+</ins>
+<i>
+<del class="diff-old">list
+nodes
+</del>
+<ins class="diff-chg">head
+id
+</ins>
+</i>
+<del class="diff-old">contains
+</del>
+<ins class="diff-chg">to
+the
+value
+of
+the
+</ins><code><ins class="diff-chg">
+@id
+</ins></code><ins class="diff-chg">
+member
+of
+</ins>
+<i>
+<del class="diff-old">subject
+</del>
+<ins class="diff-chg">head
+</ins></i>.</li><li><ins class="diff-chg">
+Set
+</ins><i><ins class="diff-chg">
+head
+</ins>
+</i>
+<del class="diff-old">a
+cycle
+has
+been
+detected,
+</del>
+<ins class="diff-chg">to
+the
+value
+of
+the
+</ins><i><ins class="diff-chg">
+head
+id
+</ins></i><ins class="diff-chg">
+member
+of
+</ins><i><ins class="diff-chg">
+graph
+object
+</ins></i><ins class="diff-chg">
+so
+that
+all
+it's
+properties
+can
+be
+accessed.
+</ins></li><li><ins class="diff-chg">
+Then,
+</ins>
+set
+<i>
+<del class="diff-old">list
+</del>
+<ins class="diff-chg">head
+</ins>
+</i>
+to
+<del class="diff-old">null
+.
+</del>
+<ins class="diff-chg">the
+only
+item
+in
+the
+value
+of
+the
+</ins><code><ins class="diff-chg">
+rdf:rest
+</ins></code><ins class="diff-chg">
+member
+of
+</ins><i><ins class="diff-chg">
+head
+</ins></i>.
+</li>
+<li>
+<del class="diff-old">If
+</del>
+<ins class="diff-chg">Finally,
+remove
+the
+last
+item
+of
+the
+</ins>
+<i>
+list
+</i>
+<del class="diff-old">is
+null
+,
+continue
+with
+</del>
+<a class="tref internalDFN" title="array" href="#dfn-array">
+<ins class="diff-chg">array
+</ins></a><ins class="diff-chg">
+and
+the
+last
+item
+of
+</ins>
+the
+<del class="diff-old">next
+</del>
+<i>
+<del class="diff-old">subj
+.
+</del>
+<ins class="diff-chg">list
+nodes
+</ins></i><a class="tref internalDFN" title="array" href="#dfn-array"><ins class="diff-chg">
+array
+</ins></a>.</li></ol>
+</li>
+<li>
+Remove
+the
+<code>
+@id
+</code>
+member
+from
+<i>
+<del class="diff-old">value
+</del>
+<ins class="diff-chg">head
+</ins>
+</i>.
+</li>
+<li>
+<ins class="diff-new">Reverse
+the
+order
+of
+the
+</ins><i><ins class="diff-new">
+list
+</ins></i><a class="tref internalDFN" title="array" href="#dfn-array"><ins class="diff-new">
+array
+</ins></a>.</li><li>
+Add
+<del class="diff-old">an
+</del>
+<ins class="diff-chg">a
+</ins>
+<code>
+@list
+</code>
+member
+to
+<i>
+<del class="diff-old">value
+</del>
+<ins class="diff-chg">head
+</ins>
+</i>
+and
+initialize
+<del class="diff-old">it
+</del>
+<ins class="diff-chg">its
+value
+</ins>
+to
+<ins class="diff-new">the
+</ins>
+<i>
+list
+<del class="diff-old">.
+</del>
+</i>
+<a class="tref internalDFN" title="array" href="#dfn-array">
+<ins class="diff-chg">array
+</ins></a>.
+</li>
+<li>
+For
+each
+<ins class="diff-new">item
+</ins>
+<i>
+<del class="diff-old">subject
+</del>
+<ins class="diff-chg">node
+id
+</ins>
+</i>
+in
+<i>
+list
+nodes
+</i>,
+remove
+the
+<i>
+<del class="diff-old">subject
+</del>
+<ins class="diff-chg">node
+id
+</ins>
+</i>
+member
+<del class="diff-old">of
+</del>
+<ins class="diff-chg">from
+</ins>
+<i>
+graph
+object
+</i>.
+</li>
+</ol>
+</li>
+</ol>
+</li>
+<li>
+Initialize
+an
+empty
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>
+<i>
+result
+</i>.
+</li>
+<li>
+For
+each
+<i>
+subject
+</i>
+and
+<i>
+node
+</i>
+in
+<i>
+default
+graph
+</i>
+ordered
+by
+<i>
+subject
+</i>:
+<ol class="algorithm">
+<li>
+If
+<i>
+graph
+map
+</i>
+has
+a
+<i>
+subject
+</i>
+member:
+<ol class="algorithm">
+<li>
+Add
+a
+<code>
+@graph
+</code>
+member
+to
+<i>
+node
+</i>
+and
+initialize
+its
+value
+to
+an
+empty
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>.
+</li>
+<li>
+For
+each
+key-value
+pair
+<i>
+s
+</i>
+-
+<i>
+n
+</i>
+in
+the
+<del class="diff-old">the
+</del>
+<i>
+subject
+</i>
+member
+of
+<i>
+graph
+map
+</i>
+ordered
+by
+<i>
+s
+</i>,
+append
+<i>
+n
+</i>
+to
+the
+<code>
+@graph
+</code>
+member
+of
+<i>
+node
+</i>
+after
+removing
+its
+<code>
+usages
+</code>
+<del class="diff-old">member.
+</del>
+<ins class="diff-chg">member,
+unless
+the
+only
+remaining
+member
+of
+</ins><i><ins class="diff-chg">
+n
+</ins></i><ins class="diff-chg">
+is
+</ins><code><ins class="diff-chg">
+@id
+</ins></code>.
+</li>
+</ol>
+</li>
+<li>
+Append
+<i>
+node
+</i>
+to
+<i>
+result
+</i>
+after
+removing
+its
+<code>
+usages
+</code>
+<del class="diff-old">member.
+</del>
+<ins class="diff-chg">member,
+unless
+the
+only
+remaining
+member
+of
+</ins><i><ins class="diff-chg">
+node
+</ins></i><ins class="diff-chg">
+is
+</ins><code><ins class="diff-chg">
+@id
+</ins></code>.
+</li>
+</ol>
+</li>
+<li>
+Return
+<i>
+result
+</i>.
+</li>
+</ol>
+</section>
+</section>
+<section id="rdf-to-object-conversion">
+<h3>
+<span class="secno">
+10.5
+</span>
+RDF
+to
+Object
+Conversion
+</h3>
+<p>
+This
+algorithm
+transforms
+an
+RDF
+literal
+to
+a
+JSON-LD
+<a class="tref internalDFN" title="value-object" href="#dfn-value-object">
+value
+object
+</a>
+and
+a
+RDF
+blank
+node
+or
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+to
+an
+JSON-LD
+<a class="tref internalDFN" title="node-object" href="#dfn-node-object">
+node
+object
+</a>.
+</p>
+<section class="informative">
+<h4 id="overview-17">
+Overview
+</h4>
+<p>
+<em>
+This
+section
+is
+non-normative.
+</em>
+</p>
+<p>
+<a class="tref internalDFN" title="rdf-literal" href="http://www.w3.org/TR/rdf11-concepts/#dfn-literal">
+RDF
+literals
+</a>
+are
+transformed
+to
+<a class="tref internalDFN" title="value-object" href="#dfn-value-object">
+value
+objects
+</a>
+whereas
+<a class="tref internalDFN" title="iri" href="#dfn-iri">
+IRIs
+</a>
+and
+<a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">
+blank
+node
+identifiers
+</a>
+are
+transformed
+to
+<a class="tref internalDFN" title="node-object" href="#dfn-node-object">
+node
+objects
+</a>.
+If
+the
+<i>
+use
+native
+types
+</i>
+flag
+is
+set
+to
+<a class="tref internalDFN" title="true" href="#dfn-true">
+true
+</a>,
+<a class="tref internalDFN" title="rdf-literal" href="http://www.w3.org/TR/rdf11-concepts/#dfn-literal">
+RDF
+literals
+</a>
+with
+a
+<a class="tref externalDFN" title="datatype-iri" href="http://www.w3.org/TR/rdf11-concepts/#dfn-datatype-iri">
+datatype
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+that
+equals
+<code>
+xsd:integer
+</code>
+or
+<code>
+xsd:double
+</code>
+are
+converted
+to
+a
+<a class="tref internalDFN" title="number" href="#dfn-number">
+JSON
+numbers
+</a>
+and
+<a class="tref internalDFN" title="rdf-literal" href="http://www.w3.org/TR/rdf11-concepts/#dfn-literal">
+RDF
+literals
+</a>
+with
+a
+<a class="tref externalDFN" title="datatype-iri" href="http://www.w3.org/TR/rdf11-concepts/#dfn-datatype-iri">
+datatype
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+that
+equals
+<code>
+xsd:boolean
+</code>
+are
+converted
+to
+<a class="tref internalDFN" title="true" href="#dfn-true">
+true
+</a>
+or
+<a class="tref internalDFN" title="false" href="#dfn-false">
+false
+</a>
+based
+on
+their
+<a class="tref externalDFN" title="lexical-form" href="http://www.w3.org/TR/rdf11-concepts/#dfn-lexical-form">
+lexical
+form
+</a>
+as
+described
+in
+<a class="sectionRef" href="#data-round-tripping">
+section
+10.6
+Data
+Round
+Tripping
+</a>.
+</p>
+</section>
+<section>
+<h4 id="algorithm-17">
+Algorithm
+</h4>
+<p>
+This
+algorithm
+takes
+two
+required
+inputs:
+a
+<i>
+value
+</i>
+to
+be
+converted
+to
+a
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>
+and
+a
+flag
+<i>
+use
+native
+types
+</i>.
+</p>
+<ol class="algorithm">
+<li>
+If
+<i>
+value
+</i>
+is
+an
+<del class="diff-old">an
+</del>
+<a class="tref internalDFN" title="iri" href="#dfn-iri">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+or
+a
+<a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">
+blank
+node
+identifier
+</a>,
+return
+a
+new
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>
+consisting
+of
+a
+single
+member
+<code>
+@id
+</code>
+whose
+value
+is
+set
+to
+<i>
+value
+</i>.
+</li>
+<li>
+Otherwise
+<i>
+value
+</i>
+is
+an
+<a class="tref externalDFN" title="rdf-literal" href="http://www.w3.org/TR/rdf11-concepts/#dfn-literal">
+RDF
+literal
+</a>:
+<ol class="algorithm">
+<li>
+Initialize
+a
+new
+empty
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>
+result.
+</li>
+<li>
+Initialize
+<i>
+converted
+value
+</i>
+to
+<i>
+value
+</i>.
+</li>
+<li>
+Initialize
+<i>
+type
+</i>
+to
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>
+</li>
+<li>
+If
+<i>
+use
+native
+types
+</i>
+is
+<a class="tref internalDFN" title="true" href="#dfn-true">
+true
+</a>
+<ol class="algorithm">
+<li>
+If
+the
+<a class="tref externalDFN" title="datatype-iri" href="http://www.w3.org/TR/rdf11-concepts/#dfn-datatype-iri">
+datatype
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+of
+<i>
+value
+</i>
+equals
+<code>
+xsd:string
+</code>,
+set
+<i>
+converted
+value
+</i>
+to
+the
+<a class="tref externalDFN" title="lexical-form" href="http://www.w3.org/TR/rdf11-concepts/#dfn-lexical-form">
+lexical
+form
+</a>
+of
+<i>
+value
+</i>.
+</li>
+<li>
+Otherwise,
+if
+the
+<a class="tref externalDFN" title="datatype-iri" href="http://www.w3.org/TR/rdf11-concepts/#dfn-datatype-iri">
+datatype
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+of
+<i>
+value
+</i>
+equals
+<code>
+xsd:boolean
+</code>,
+set
+<i>
+converted
+value
+</i>
+to
+<a class="tref internalDFN" title="true" href="#dfn-true">
+true
+</a>
+if
+the
+<a class="tref externalDFN" title="lexical-form" href="http://www.w3.org/TR/rdf11-concepts/#dfn-lexical-form">
+lexical
+form
+</a>
+of
+<i>
+value
+</i>
+matches
+<code>
+true
+</code>,
+or
+<a class="tref internalDFN" title="false" href="#dfn-false">
+false
+</a>
+if
+it
+matches
+<code>
+false
+</code>.
+If
+it
+matches
+neither,
+set
+<i>
+type
+</i>
+to
+<code>
+xsd:boolean
+</code>.
+</li>
+<li>
+Otherwise,
+if
+the
+<a class="tref externalDFN" title="datatype-iri" href="http://www.w3.org/TR/rdf11-concepts/#dfn-datatype-iri">
+datatype
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+of
+<i>
+value
+</i>
+equals
+<code>
+xsd:integer
+</code>
+or
+<code>
+xsd:double
+</code>
+and
+its
+<a class="tref externalDFN" title="lexical-form" href="http://www.w3.org/TR/rdf11-concepts/#dfn-lexical-form">
+lexical
+form
+</a>
+is
+a
+valid
+<code>
+xsd:integer
+</code>
+or
+<code>
+xsd:double
+</code>
+according
+[
+<cite>
+<a class="bibref" href="#bib-XMLSCHEMA11-2">
+XMLSCHEMA11-2
+</a>
+</cite>
+],
+set
+<i>
+converted
+value
+</i>
+to
+the
+result
+of
+converting
+the
+<a class="tref externalDFN" title="lexical-form" href="http://www.w3.org/TR/rdf11-concepts/#dfn-lexical-form">
+lexical
+form
+</a>
+to
+a
+JSON
+<a class="tref internalDFN" title="number" href="#dfn-number">
+number
+</a>.
+</li>
+</ol>
+</li>
+<li>
+Otherwise,
+if
+<i>
+value
+</i>
+is
+a
+<a class="tref externalDFN" title="language-tagged-string" href="http://www.w3.org/TR/rdf11-concepts/#dfn-language-tagged-string">
+language-tagged
+string
+</a>
+add
+a
+member
+<code>
+@language
+</code>
+to
+<i>
+result
+</i>
+and
+set
+its
+value
+to
+the
+<a class="tref externalDFN" title="language-tag" href="http://www.w3.org/TR/rdf11-concepts/#dfn-language-tag">
+language
+tag
+</a>
+of
+<i>
+value
+</i>.
+</li>
+<li>
+Otherwise,
+set
+<i>
+type
+</i>
+to
+the
+<a class="tref externalDFN" title="datatype-iri" href="http://www.w3.org/TR/rdf11-concepts/#dfn-datatype-iri">
+datatype
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+of
+<i>
+value
+</i>,
+unless
+it
+equals
+<code>
+xsd:string
+</code>
+which
+is
+ignored.
+</li>
+<li>
+Add
+a
+member
+<code>
+@value
+</code>
+to
+<i>
+result
+</i>
+whose
+value
+is
+set
+to
+<i>
+converted
+value
+</i>.
+</li>
+<li>
+If
+<i>
+type
+</i>
+is
+not
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>,
+add
+a
+member
+<code>
+@type
+</code>
+to
+<i>
+result
+</i>
+whose
+value
+is
+set
+to
+<i>
+type
+</i>.
+</li>
+<li>
+Return
+<i>
+result
+</i>.
+</li>
+</ol>
+</li>
+</ol>
+</section>
+</section>
+<section id="data-round-tripping">
+<h3>
+<span class="secno">
+10.6
+</span>
+Data
+Round
+Tripping
+</h3>
+<del class="diff-old">Feature
+at
+Risk
+2
+:
+Conversion
+to/from
+JSON
+Native
+Types
+Note:
+This
+feature
+is
+"at
+risk"
+and
+may
+be
+removed
+or
+modified
+heavily
+from
+the
+feature
+described
+in
+this
+specification
+based
+on
+reviewer
+feedback.
+Please
+send
+feedback
+to
+public-rdf-comments@w3.org
+.
+For
+the
+current
+status
+see
+features
+"at
+risk"
+in
+JSON-LD
+1.0
+The
+JSON-LD-API
+allows
+certain
+RDF
+literals
+to
+be
+mapped
+to
+JSON
+numbers
+(if
+the
+"use
+native
+types"
+flag
+is
+set).
+The
+mapping
+rules
+are
+currently
+being
+debated
+as
+is
+which
+JSON-LD
+API
+methods
+the
+"use
+native
+types"
+will
+have
+an
+effect
+in.
+There
+may
+be
+changes
+made
+to
+the
+algorithm
+and
+API
+based
+on
+feedback
+during
+the
+2nd
+Last
+Call.
+Implementers
+and
+reviewers
+should
+keep
+a
+close
+eye
+on
+the
+details
+for
+this
+mechanism
+and
+comment
+on
+any
+round-tripping
+concerns
+that
+they
+may
+have.
+The
+algorithm
+and
+API
+will
+most
+likely
+change
+after
+the
+LC2
+period.
+</del>
+<p>
+When
+<del class="diff-old">converting
+</del>
+<a href="#deserialize-json-ld-to-rdf-algorithm">
+<ins class="diff-chg">deserializing
+</ins>
+JSON-LD
+to
+RDF
+</a>
+JSON-native
+<a class="tref internalDFN" title="number" href="#dfn-number">
+numbers
+</a>
+are
+automatically
+type-coerced
+to
+<code>
+xsd:integer
+</code>
+or
+<code>
+xsd:double
+</code>
+depending
+on
+whether
+the
+<a class="tref internalDFN" title="number" href="#dfn-number">
+number
+</a>
+has
+<del class="diff-old">fractions
+</del>
+<ins class="diff-chg">a
+non-zero
+fractional
+part
+</ins>
+or
+<del class="diff-old">not,
+</del>
+<ins class="diff-chg">not
+(the
+result
+of
+a
+modulo‑1
+operation),
+</ins>
+the
+boolean
+values
+<a class="tref internalDFN" title="true" href="#dfn-true">
+true
+</a>
+and
+<a class="tref internalDFN" title="false" href="#dfn-false">
+false
+</a>
+are
+coerced
+to
+<code>
+xsd:boolean
+</code>,
+and
+<a class="tref internalDFN" title="string" href="#dfn-string">
+strings
+</a>
+are
+coerced
+to
+<code>
+xsd:string
+</code>.
+The
+numeric
+or
+boolean
+values
+<del class="diff-old">itself
+</del>
+<ins class="diff-chg">themselves
+</ins>
+are
+converted
+to
+<dfn title="canonical-lexical-form" id="dfn-canonical-lexical-form">
+canonical
+lexical
+form
+</dfn>,
+i.e.,
+a
+deterministic
+string
+representation
+as
+defined
+in
+[
+<cite>
+<a class="bibref" href="#bib-XMLSCHEMA11-2">
+XMLSCHEMA11-2
+</a>
+</cite>
+].
+</p>
+<p>
+The
+<a class="tref internalDFN" title="canonical-lexical-form" href="#dfn-canonical-lexical-form">
+canonical
+lexical
+form
+</a>
+of
+an
+<em>
+integer
+</em>,
+i.e.,
+a
+<a class="tref internalDFN" title="number" href="#dfn-number">
+number
+</a>
+<del class="diff-old">without
+fractions
+</del>
+<ins class="diff-chg">with
+no
+non-zero
+fractional
+part
+</ins>
+or
+a
+<a class="tref internalDFN" title="number" href="#dfn-number">
+number
+</a>
+coerced
+to
+<code>
+xsd:integer
+</code>,
+is
+a
+finite-length
+sequence
+of
+decimal
+digits
+(
+<code>
+0-9
+</code>
+)
+with
+an
+optional
+leading
+minus
+sign;
+leading
+zeros
+are
+prohibited.
+In
+JavaScript,
+implementers
+can
+use
+the
+following
+snippet
+of
+code
+to
+convert
+an
+integer
+to
+<a class="tref internalDFN" title="canonical-lexical-form" href="#dfn-canonical-lexical-form">
+canonical
+lexical
+form
+</a>:
+</p>
+<div class="example">
+<div class="example-title">
+<span>
+Example
+12
+</span>:
+Sample
+integer
+serialization
+implementation
+in
+JavaScript
+</div>
+<pre class="example">
+(value).toFixed(0).toString()
+</pre>
+</div>
+<p>
+The
+<a class="tref internalDFN" title="canonical-lexical-form" href="#dfn-canonical-lexical-form">
+canonical
+lexical
+form
+</a>
+of
+a
+<em>
+double
+</em>,
+i.e.,
+a
+<a class="tref internalDFN" title="number" href="#dfn-number">
+number
+</a>
+with
+<del class="diff-old">fractions
+</del>
+<ins class="diff-chg">a
+non-zero
+fractional
+part
+</ins>
+or
+a
+<a class="tref internalDFN" title="number" href="#dfn-number">
+number
+</a>
+coerced
+to
+<code>
+xsd:double
+</code>,
+consists
+of
+a
+mantissa
+followed
+by
+the
+character
+<code>
+E
+</code>,
+followed
+by
+an
+exponent.
+The
+mantissa
+is
+a
+decimal
+number
+and
+the
+exponent
+is
+an
+integer.
+Leading
+zeros
+and
+a
+preceding
+plus
+sign
+(
+<code>
++
+</code>
+)
+are
+prohibited
+in
+the
+exponent.
+If
+the
+exponent
+is
+zero,
+it
+is
+indicated
+by
+<code>
+E0
+</code>.
+For
+the
+mantissa,
+the
+preceding
+optional
+plus
+sign
+is
+prohibited
+and
+the
+decimal
+point
+is
+required.
+Leading
+and
+trailing
+zeros
+are
+prohibited
+subject
+to
+the
+following:
+number
+representations
+must
+be
+normalized
+such
+that
+there
+is
+a
+single
+digit
+which
+is
+non-zero
+to
+the
+left
+of
+the
+decimal
+point
+and
+at
+least
+a
+single
+digit
+to
+the
+right
+of
+the
+decimal
+point
+unless
+the
+value
+being
+represented
+is
+zero.
+The
+canonical
+representation
+for
+zero
+is
+<code>
+0.0E0
+</code>.
+<code>
+xsd:double
+</code>
+'s
+value
+space
+is
+defined
+by
+the
+IEEE
+double-precision
+64-bit
+floating
+point
+type
+[
+<cite>
+<a class="bibref" href="#bib-IEEE-754-1985">
+IEEE-754-1985
+</a>
+</cite>
+]
+whereas
+the
+value
+space
+of
+JSON
+<a class="tref internalDFN" title="number" href="#dfn-number">
+numbers
+</a>
+is
+not
+specified;
+when
+<del class="diff-old">converting
+</del>
+<ins class="diff-chg">deserializing
+</ins>
+JSON-LD
+to
+RDF
+the
+mantissa
+is
+rounded
+to
+15 digits
+after
+the
+decimal
+point.
+In
+JavaScript,
+implementers
+can
+use
+the
+following
+snippet
+of
+code
+to
+convert
+a
+double
+to
+<a class="tref internalDFN" title="canonical-lexical-form" href="#dfn-canonical-lexical-form">
+canonical
+lexical
+form
+</a>:
+</p>
+<div class="example">
+<div class="example-title">
+<span>
+Example
+13
+</span>:
+Sample
+floating
+point
+number
+serialization
+implementation
+in
+JavaScript
+</div>
+<pre class="example">
+(value).toExponential(15).replace(/(\d)0*e\+?/,'$1E')
+</pre>
+</div>
+<p>
+The
+<a class="tref internalDFN" title="canonical-lexical-form" href="#dfn-canonical-lexical-form">
+canonical
+lexical
+form
+</a>
+of
+the
+<em>
+boolean
+</em>
+values
+<a class="tref internalDFN" title="true" href="#dfn-true">
+true
+</a>
+and
+<a class="tref internalDFN" title="false" href="#dfn-false">
+false
+</a>
+are
+the
+strings
+<code>
+true
+</code>
+and
+<code>
+false
+</code>.
+</p>
+<p>
+When
+JSON-native
+<a class="tref internalDFN" title="number" href="#dfn-number">
+numbers
+<del class="diff-old">,
+</del>
+</a>
+are
+<del class="diff-old">converted
+</del>
+<ins class="diff-chg">deserialized
+</ins>
+to
+RDF,
+lossless
+data
+round-tripping
+<del class="diff-old">can
+not
+</del>
+<ins class="diff-chg">cannot
+</ins>
+be
+<del class="diff-old">guaranteed
+</del>
+<ins class="diff-chg">guaranteed,
+</ins>
+as
+rounding
+errors
+might
+occur.
+When
+<del class="diff-old">converting
+</del>
+<a href="#serialize-rdf-as-json-ld-algorithm">
+<ins class="diff-chg">serializing
+</ins>
+RDF
+<del class="diff-old">to
+</del>
+<ins class="diff-chg">as
+</ins>
+JSON-LD
+</a>,
+similar
+rounding
+errors
+might
+occur.
+Furthermore,
+the
+datatype
+or
+the
+lexical
+representation
+might
+be
+lost.
+An
+<code>
+xsd:double
+</code>
+with
+a
+value
+of
+<code>
+2.0
+</code>
+will,
+e.g.,
+result
+in
+an
+<code>
+xsd:integer
+</code>
+with
+a
+value
+of
+<code>
+2
+</code>
+in
+<a class="tref internalDFN" title="canonical-lexical-form" href="#dfn-canonical-lexical-form">
+canonical
+lexical
+form
+</a>
+when
+converted
+from
+RDF
+to
+JSON-LD
+and
+back
+to
+RDF.
+It
+is
+important
+to
+highlight
+that
+in
+practice
+it
+might
+be
+impossible
+to
+losslessly
+convert
+an
+<code>
+xsd:integer
+</code>
+to
+a
+<a class="tref internalDFN" title="number" href="#dfn-number">
+number
+</a>
+because
+its
+value
+space
+is
+not
+limited.
+While
+the
+JSON
+specification
+[
+<cite>
+<a class="bibref" href="#bib-RFC4627">
+RFC4627
+</a>
+</cite>
+]
+does
+not
+limit
+the
+value
+space
+of
+<a class="tref internalDFN" title="number" href="#dfn-number">
+numbers
+</a>
+either,
+concrete
+implementations
+typically
+do
+have
+a
+limited
+value
+space.
+</p>
+<p>
+To
+ensure
+lossless
+round-tripping
+the
+<del class="diff-old">Converting
+from
+</del>
+<a href="#serialize-rdf-as-json-ld-algorithm">
+<ins class="diff-chg">Serialize
+</ins>
+RDF
+<ins class="diff-new">as
+JSON-LD
+</ins>
+algorithm
+</a>
+specifies
+a
+<i>
+use
+native
+types
+</i>
+flag
+which
+controls
+whether
+<a class="tref externalDFN" title="rdf-literals" href="http://www.w3.org/TR/rdf11-concepts/#dfn-literal">
+RDF
+literals
+</a>
+with
+a
+<a class="tref externalDFN" title="datatype-iri" href="http://www.w3.org/TR/rdf11-concepts/#dfn-datatype-iri">
+datatype
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+equal
+to
+<code>
+xsd:integer
+</code>,
+<code>
+xsd:double
+</code>,
+or
+<code>
+xsd:boolean
+</code>
+are
+converted
+to
+their
+JSON-native
+counterparts.
+If
+the
+<i>
+use
+native
+types
+</i>
+flag
+is
+set
+to
+<a class="tref internalDFN" title="false" href="#dfn-false">
+false
+</a>,
+all
+literals
+remain
+in
+their
+original
+string
+representation.
+</p>
+<p>
+Some
+JSON
+serializers,
+such
+as
+PHP's
+native
+implementation
+in
+some
+versions,
+backslash-escape
+the
+forward
+slash
+character.
+For
+example,
+the
+value
+<code>
+http://example.com/
+</code>
+would
+be
+serialized
+as
+<code>
+http:\/\/example.com\/
+</code>.
+This
+is
+problematic
+as
+other
+JSON
+parsers
+might
+not
+understand
+those
+escaping
+characters.
+There
+is
+no
+need
+to
+backslash-escape
+forward
+slashes
+in
+JSON-LD.
+To
+aid
+interoperability
+between
+JSON-LD
+processors,
+forward
+slashes
+<em class="rfc2119" title="MUST NOT">
+MUST
+NOT
+</em>
+be
+backslash-escaped.
+</p>
+</section>
+</section>
+<section id="the-application-programming-interface">
+<h2>
+<span class="secno">
+11.
+</span>
+The
+Application
+Programming
+Interface
+</h2>
+<p>
+This
+API
+provides
+a
+clean
+mechanism
+that
+enables
+developers
+to
+convert
+JSON-LD
+data
+into
+a
+variety
+of
+output
+formats
+that
+are
+often
+easier
+to
+work
+with.
+A
+conformant
+<a class="tref internalDFN" title="json-ld-api-implementation" href="#dfn-json-ld-api-implementation">
+JSON-LD
+API
+Implementation
+</a>
+<em class="rfc2119" title="MUST">
+MUST
+</em>
+implement
+the
+entirety
+of
+the
+following
+API.
+</p>
+<p>
+The
+JSON-LD
+API
+uses
+<del class="diff-old">Futures
+</del>
+<a class="tref internalDFN" title="promise" href="#dfn-promise">
+<ins class="diff-chg">Promises
+</ins>
+</a>
+to
+represent
+the
+result
+of
+the
+various
+asynchronous
+operations.
+<del class="diff-old">Futures
+</del>
+<dfn title="promise" id="dfn-promise">
+<ins class="diff-chg">Promises
+</ins>
+</dfn>
+are
+defined
+in
+<cite>
+<a href="http://dom.spec.whatwg.org/#promises">
+section 4
+<del class="diff-old">Futures
+</del>
+<ins class="diff-chg">Promises
+</ins>
+</a>
+</cite>
+of
+[
+<cite>
+<a class="bibref" href="#bib-DOM-WHATWG">
+DOM-WHATWG
+</a>
+</cite>
+].
+</p>
+<div class="issue atrisk">
+<div class="issue-title" role="heading" aria-level="3">
+<span>
+Feature
+at
+Risk
+<del class="diff-old">3
+</del>
+<ins class="diff-chg">8
+</ins>
+</span>:
+Properly
+referencing
+the
+DOM
+<del class="diff-old">Futures
+</del>
+<ins class="diff-chg">Promises
+</ins>
+spec
+</div>
+<div class="atrisk">
+<p class="atrisk-head">
+Note:
+This
+feature
+is
+<a href="http://www.w3.org/2005/10/Process-20051014/tr#cfi">
+"at
+risk"
+</a>
+and
+may
+be
+removed
+or
+modified
+heavily
+from
+the
+feature
+described
+in
+this
+specification
+based
+on
+reviewer
+feedback.
+Please
+send
+feedback
+to
+<a href="mailto:public-rdf-comments@w3.org">
+public-rdf-comments@w3.org
+</a>.
+For
+the
+current
+status
+see
+<a href="http://www.w3.org/2011/rdf-wg/wiki/JSON-LD_Features_at_Risk">
+features
+"at
+risk"
+in
+JSON-LD
+1.0
+</a>
+</p>
+<p>
+The
+JSON-LD
+API
+specification
+currently
+only
+refers
+to
+the
+<del class="diff-old">"Future"
+</del>
+<ins class="diff-chg">"Promise"
+</ins>
+interface
+and
+does
+not
+attempt
+to
+provide
+any
+details
+on
+the
+specific
+implementation
+of
+<del class="diff-old">Futures.
+</del>
+<ins class="diff-chg">Promises.
+</ins>
+That
+is,
+it
+does
+not
+reference
+whether
+or
+not
+'.then()'
+must
+be
+specified.
+This
+is
+done
+in
+order
+to
+allow
+for
+some
+implementation
+flexibility
+in
+the
+event
+the
+DOM
+<del class="diff-old">Futures
+</del>
+<ins class="diff-chg">Promises
+</ins>
+spec
+changes.
+The
+editors
+of
+the
+WHATWG
+DOM
+specification
+have
+asserted
+that
+the
+<del class="diff-old">Future
+</del>
+<ins class="diff-chg">Promise
+</ins>
+interface
+is
+ready
+to
+be
+incorporated
+into
+specifications.
+The
+issue
+relates
+to
+how
+to
+properly
+refer
+to
+a
+spec
+living
+in
+the
+WHATWG
+as
+a
+living
+standard
+as
+well
+as
+how
+to
+ensure
+that
+the
+interface
+provided
+by
+the
+spec
+is
+stable.
+</p>
+</div>
+</div>
+<section id="the-jsonldprocessor-interface">
+<h3>
+<span class="secno">
+11.1
+</span>
+The
+<a href="#idl-def-JsonLdProcessor" class="idlType">
+<code>
+JsonLdProcessor
+</code>
+</a>
+Interface
+</h3>
+<p>
+The
+<a href="#idl-def-JsonLdProcessor" class="idlType">
+<code>
+JsonLdProcessor
+</code>
+</a>
+interface
+is
+the
+high-level
+programming
+structure
+that
+developers
+use
+to
+access
+the
+JSON-LD
+transformation
+methods.
+</p>
+<p>
+It
+is
+important
+to
+highlight
+that
+conformant
+<a class="tref internalDFN" title="json-ld-api-implementation" href="#dfn-json-ld-api-implementation">
+JSON-LD
+API
+Implementations
+</a>
+<em class="rfc2119" title="MUST NOT">
+MUST
+NOT
+</em>
+modify
+the
+input
+parameters.
+If
+an
+error
+is
+detected,
+the
+<del class="diff-old">Future
+</del>
+<ins class="diff-chg">Promise
+</ins>
+is
+rejected
+passing
+a
+<a href="#idl-def-JsonLdError" class="idlType">
+<code>
+JsonLdError
+</code>
+</a>
+with
+the
+corresponding
+error
+<code class="idlMemberName">
+<a href="#widl-JsonLdError-code">
+code
+</a>
+</code>
+and
+processing
+is
+stopped.
+</p>
+ <pre class="idl"><span class="idlInterface" id="idl-def-JsonLdProcessor">[<span class="extAttr">Constructor</span>]
+interface <span class="idlInterfaceID">JsonLdProcessor</span> {
+<span class="idlMethod"> <span class="idlMethType"><a href="#dfn-promise" class="internalDFN">Promise</a></span> <span class="idlMethName"><a href="#widl-JsonLdProcessor-compact-Promise-any-input-JsonLdContext-context-JsonLdOptions-options">compact</a></span> (<span class="idlParam"><span class="idlParamType"><a>any</a></span> <span class="idlParamName">input</span></span>, <span class="idlParam"><span class="idlParamType"><a href="#idl-def-JsonLdContext" class="idlType"><code>JsonLdContext</code></a></span> <span class="idlParamName">context</span></span>, <span class="idlParam">optional <span class="idlParamType"><a href="#idl-def-JsonLdOptions" class="idlType"><code>JsonLdOptions</code></a></span> <span class="idlParamName">options</span></span>);</span>
+<span class="idlMethod"> <span class="idlMethType"><a href="#dfn-promise" class="internalDFN">Promise</a></span> <span class="idlMethName"><a href="#widl-JsonLdProcessor-expand-Promise-any-input-JsonLdOptions-options">expand</a></span> (<span class="idlParam"><span class="idlParamType"><a>any</a></span> <span class="idlParamName">input</span></span>, <span class="idlParam">optional <span class="idlParamType"><a href="#idl-def-JsonLdOptions" class="idlType"><code>JsonLdOptions</code></a></span> <span class="idlParamName">options</span></span>);</span>
+<span class="idlMethod"> <span class="idlMethType"><a href="#dfn-promise" class="internalDFN">Promise</a></span> <span class="idlMethName"><a href="#widl-JsonLdProcessor-flatten-Promise-any-input-JsonLdContext-context-JsonLdOptions-options">flatten</a></span> (<span class="idlParam"><span class="idlParamType"><a>any</a></span> <span class="idlParamName">input</span></span>, <span class="idlParam">optional <span class="idlParamType"><a href="#idl-def-JsonLdContext" class="idlType"><code>JsonLdContext</code></a>?</span> <span class="idlParamName">context</span></span>, <span class="idlParam">optional <span class="idlParamType"><a href="#idl-def-JsonLdOptions" class="idlType"><code>JsonLdOptions</code></a></span> <span class="idlParamName">options</span></span>);</span>
+};
+</span>
+</pre>
+<section>
+<h4 id="methods">
+Methods
+</h4>
+<dl class="methods">
+<dt id="widl-JsonLdProcessor-compact-Promise-any-input-JsonLdContext-context-JsonLdOptions-options">
+<code>
+compact
+</code>
+</dt>
+<dd>
+<p>
+<a href="#compaction">
+Compacts
+</a>
+the
+given
+<i>
+input
+</i>
+using
+the
+<i>
+context
+</i>
+according
+to
+the
+steps
+in
+the
+<a href="#compaction-algorithm">
+Compaction
+algorithm
+</a>:
+</p>
+<ol class="algorithm">
+<li>
+Create
+a
+new
+<del class="diff-old">Future
+</del>
+<a class="tref internalDFN" title="promise" href="#dfn-promise">
+<ins class="diff-chg">Promise
+</ins>
+</a>
+<i>
+<del class="diff-old">future
+</del>
+<ins class="diff-chg">promise
+</ins>
+</i>
+and
+return
+it.
+The
+following
+steps
+are
+then
+executed
+asynchronously.
+</li>
+<li>
+If
+the
+passed
+<i>
+input
+</i>
+is
+a
+<span class="idlParamType">
+DOMString
+</span>
+representing
+the
+<a class="tref internalDFN" title="iri" href="#dfn-iri">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+of
+a
+remote
+document,
+dereference
+it.
+If
+the
+retrieved
+<del class="diff-old">document
+has
+a
+</del>
+<ins class="diff-chg">document's
+</ins>
+content
+type
+<del class="diff-old">different
+than
+</del>
+<ins class="diff-chg">is
+neither
+</ins><code><ins class="diff-chg">
+application/json
+</ins></code>,<ins class="diff-chg">
+nor
+</ins>
+<code>
+application/ld+json
+<del class="diff-old">or
+</del>
+</code>,
+<ins class="diff-chg">nor
+any
+other
+media
+type
+using
+a
+</ins>
+<code>
+<del class="diff-old">application/json
+</del>
+<ins class="diff-chg">+json
+</ins>
+</code>
+<ins class="diff-new">suffix
+as
+defined
+in
+[
+</ins><cite><a class="bibref" href="#bib-RFC6839"><ins class="diff-new">
+RFC6839
+</ins></a></cite><ins class="diff-new">
+]
+</ins>
+or
+if
+the
+document
+cannot
+be
+parsed
+as
+JSON,
+reject
+the
+<i>
+<del class="diff-old">future
+</del>
+<ins class="diff-chg">promise
+</ins>
+</i>
+passing
+an
+<code class="error">
+<a href="#idl-def-JsonLdErrorCode.loading-document-failed">
+loading
+document
+failed
+</a>
+</code>
+error.
+</li>
+<li>
+Initialize
+a
+new
+empty
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>.
+The
+<a class="tref internalDFN" title="base-iri" href="#dfn-base-iri">
+base
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+of
+the
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>
+is
+set
+to
+the
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+of
+the
+currently
+being
+processed
+document,
+if
+available;
+otherwise
+to
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>.
+If
+set,
+the
+<code class="idlMemberName">
+<del class="diff-old">compactArrays
+</del>
+<a href="#widl-JsonLdOptions-base">
+<ins class="diff-chg">base
+</ins>
+</a>
+</code>
+<ins class="diff-new">option
+</ins>
+overrides
+the
+<a class="tref internalDFN" title="base-iri" href="#dfn-base-iri">
+base
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>.
+</li>
+<li>
+If
+an
+<code class="idlMemberName">
+<a href="#widl-JsonLdOptions-expandContext">
+expandContext
+</a>
+</code>
+has
+been
+passed,
+update
+the
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>
+using
+the
+<a href="#context-processing-algorithm">
+Context
+Processing
+algorithm
+</a>,
+passing
+the
+<code class="idlMemberName">
+<a href="#widl-JsonLdOptions-expandContext">
+expandContext
+</a>
+</code>
+as
+<a class="tref internalDFN" title="local-context" href="#dfn-local-context">
+local
+context
+</a>.
+<ins class="diff-new">If
+</ins><code class="idlMemberName"><a href="#widl-JsonLdOptions-expandContext"><ins class="diff-new">
+expandContext
+</ins></a></code><ins class="diff-new">
+is
+a
+</ins><a class="tref internalDFN" title="json-object" href="#dfn-json-object"><ins class="diff-new">
+JSON
+object
+</ins></a><ins class="diff-new">
+having
+a
+</ins><code><ins class="diff-new">
+@context
+</ins></code><ins class="diff-new">
+member,
+pass
+that
+member's
+value
+instead.
+</ins>
+</li>
+<li>
+If
+the
+<i>
+input
+</i>
+has
+been
+<del class="diff-old">retrieved
+and
+</del>
+<ins class="diff-chg">retrieved,
+</ins>
+the
+response
+has
+<del class="diff-old">a
+content
+type
+application/json
+and
+</del>
+an
+HTTP
+Link
+Header
+[
+<cite>
+<a class="bibref" href="#bib-RFC5988">
+RFC5988
+</a>
+</cite>
+]
+using
+the
+<code>
+http://www.w3.org/ns/json-ld#context
+</code>
+link
+<del class="diff-old">relation,
+</del>
+<ins class="diff-chg">relation
+and
+a
+content
+type
+of
+</ins><code><ins class="diff-chg">
+application/json
+</ins></code><ins class="diff-chg">
+or
+any
+media
+type
+with
+a
+</ins><code><ins class="diff-chg">
++json
+</ins></code><ins class="diff-chg">
+suffix
+as
+defined
+in
+[
+</ins><cite><a class="bibref" href="#bib-RFC6839"><ins class="diff-chg">
+RFC6839
+</ins></a></cite><ins class="diff-chg">
+]
+except
+</ins><code><ins class="diff-chg">
+application/ld+json
+</ins></code>,
+update
+the
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>
+using
+the
+<a href="#context-processing-algorithm">
+Context
+Processing
+algorithm
+</a>,
+passing
+the
+context
+referenced
+in
+the
+HTTP
+Link
+Header
+as
+<a class="tref internalDFN" title="local-context" href="#dfn-local-context">
+local
+context
+</a>.
+<ins class="diff-new">The
+HTTP
+Link
+Header
+is
+ignored
+for
+documents
+served
+as
+</ins><code><ins class="diff-new">
+application/ld+json
+</ins></code><ins class="diff-new">
+If
+multiple
+HTTP
+Link
+Headers
+using
+the
+</ins><code><ins class="diff-new">
+http://www.w3.org/ns/json-ld#context
+</ins></code><ins class="diff-new">
+link
+relation
+are
+found,
+the
+</ins><i><ins class="diff-new">
+promise
+</ins></i><ins class="diff-new">
+is
+rejected
+with
+a
+</ins><a href="#idl-def-JsonLdError" class="idlType"><code><ins class="diff-new">
+JsonLdError
+</ins></code></a><ins class="diff-new">
+whose
+code
+is
+set
+to
+</ins><code class="error"><a href="#idl-def-JsonLdErrorCode.multiple-context-link-headers"><ins class="diff-new">
+multiple
+context
+link
+headers
+</ins></a></code><ins class="diff-new">
+and
+processing
+is
+terminated.
+</ins>
+</li>
+<li>
+Set
+<i>
+expanded
+</i>
+to
+the
+result
+of
+using
+the
+<a href="#expansion-algorithm">
+Expansion
+algorithm
+</a>,
+passing
+the
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>
+and
+<i>
+input
+</i>
+as
+<i>
+element
+</i>.
+</li>
+<li>
+<ins class="diff-new">If
+</ins><i><ins class="diff-new">
+context
+</ins></i><ins class="diff-new">
+is
+a
+</ins><a class="tref internalDFN" title="json-object" href="#dfn-json-object"><ins class="diff-new">
+JSON
+object
+</ins></a><ins class="diff-new">
+having
+a
+</ins><code><ins class="diff-new">
+@context
+</ins></code><ins class="diff-new">
+member,
+set
+</ins><i><ins class="diff-new">
+context
+</ins></i><ins class="diff-new">
+to
+that
+member's
+value.
+</ins></li><li>
+Set
+<i>
+compacted
+</i>
+to
+the
+result
+of
+using
+the
+<a href="#compaction-algorithm">
+Compaction
+algorithm
+</a>,
+passing
+<i>
+context
+</i>,
+<i>
+expanded
+</i>
+as
+<i>
+element
+</i>,
+and
+if
+passed,
+the
+<code class="idlMemberName">
+<a href="#widl-JsonLdOptions-compactArrays">
+compactArrays
+</a>
+</code>
+flag
+in
+<i>
+options
+</i>.
+</li>
+<li>
+<del class="diff-old">Accept
+</del>
+<ins class="diff-chg">Fulfill
+</ins>
+the
+<i>
+<del class="diff-old">future
+</del>
+<ins class="diff-chg">promise
+</ins>
+</i>
+passing
+<i>
+compacted
+</i>.
+</li>
+</ol>
+<table class="parameters">
+<tr>
+<th>
+Parameter
+</th>
+<th>
+Type
+</th>
+<th>
+Nullable
+</th>
+<th>
+Optional
+</th>
+<th>
+Description
+</th>
+</tr>
+<tr>
+<td class="prmName">
+input
+</td>
+<td class="prmType">
+<code>
+<a>
+any
+</a>
+</code>
+</td>
+<td class="prmNullFalse">
+✘
+</td>
+<td class="prmOptFalse">
+✘
+</td>
+<td class="prmDesc">
+The
+JSON-LD
+object
+or
+array
+of
+JSON-LD
+objects
+to
+perform
+the
+compaction
+upon
+or
+an
+<a class="tref internalDFN" title="iri" href="#dfn-iri">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+referencing
+the
+JSON-LD
+document
+to
+compact.
+</td>
+</tr>
+<tr>
+<td class="prmName">
+context
+</td>
+<td class="prmType">
+<code>
+<a href="#idl-def-JsonLdContext" class="idlType">
+<code>
+JsonLdContext
+</code>
+</a>
+</code>
+</td>
+<td class="prmNullFalse">
+✘
+</td>
+<td class="prmOptFalse">
+✘
+</td>
+<td class="prmDesc">
+The
+context
+to
+use
+when
+compacting
+the
+<code>
+input
+</code>
+;
+<del class="diff-old">either
+in
+the
+form
+of
+</del>
+<ins class="diff-chg">it
+can
+be
+specified
+by
+using
+</ins>
+a
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>,
+<ins class="diff-chg">an
+</ins><a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier"><ins class="diff-chg">
+IRI
+</ins></abbr></a>,
+or
+<del class="diff-old">as
+</del>
+<ins class="diff-chg">an
+array
+consisting
+of
+</ins><a class="tref internalDFN" title="json-object" href="#dfn-json-object"><ins class="diff-chg">
+JSON
+object
+</ins></a><ins class="diff-chg">
+s
+and
+</ins>
+<a class="tref internalDFN" title="iri" href="#dfn-iri">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+<del class="diff-old">.
+</del>
+</a>
+<ins class="diff-chg">s.
+</ins>
+</td>
+</tr>
+<tr>
+<td class="prmName">
+options
+</td>
+<td class="prmType">
+<code>
+<a href="#idl-def-JsonLdOptions" class="idlType">
+<code>
+JsonLdOptions
+</code>
+</a>
+</code>
+</td>
+<td class="prmNullFalse">
+✘
+</td>
+<td class="prmOptTrue">
+✔
+</td>
+<td class="prmDesc">
+A
+set
+of
+options
+to
+configure
+the
+algorithms.
+This
+allows,
+e.g.,
+to
+set
+the
+input
+document's
+base
+<a class="tref internalDFN" title="iri" href="#dfn-iri">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>.
+</td>
+</tr>
+</table>
+<div>
+<em>
+Return
+type:
+</em>
+<code>
+<del class="diff-old">Future
+</del>
+<a href="#dfn-promise" class="internalDFN">
+<ins class="diff-chg">Promise
+</ins>
+</a>
+</code>
+</div>
+</dd>
+<dt id="widl-JsonLdProcessor-expand-Promise-any-input-JsonLdOptions-options">
+<code>
+expand
+</code>
+</dt>
+<dd>
+<p>
+<a href="#expansion">
+Expands
+</a>
+the
+given
+<i>
+input
+</i>
+according
+to
+the
+steps
+in
+the
+<a href="#expansion-algorithm">
+Expansion
+algorithm
+</a>:
+</p>
+<ol class="algorithm">
+<li>
+Create
+a
+new
+<del class="diff-old">Future
+</del>
+<a class="tref internalDFN" title="promise" href="#dfn-promise">
+<ins class="diff-chg">Promise
+</ins>
+</a>
+<i>
+<del class="diff-old">future
+</del>
+<ins class="diff-chg">promise
+</ins>
+</i>
+and
+return
+it.
+The
+following
+steps
+are
+then
+executed
+asynchronously.
+</li>
+<li>
+If
+the
+passed
+<i>
+input
+</i>
+is
+a
+<span class="idlParamType">
+DOMString
+</span>
+representing
+the
+<a class="tref internalDFN" title="iri" href="#dfn-iri">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+of
+a
+remote
+document,
+dereference
+it.
+If
+the
+retrieved
+<del class="diff-old">document
+has
+a
+</del>
+<ins class="diff-chg">document's
+</ins>
+content
+type
+<del class="diff-old">different
+than
+</del>
+<ins class="diff-chg">is
+neither
+</ins><code><ins class="diff-chg">
+application/json
+</ins></code>,<ins class="diff-chg">
+nor
+</ins>
+<code>
+application/ld+json
+<del class="diff-old">or
+</del>
+</code>,
+<ins class="diff-chg">nor
+any
+other
+media
+type
+using
+a
+</ins>
+<code>
+<del class="diff-old">application/json
+</del>
+<ins class="diff-chg">+json
+</ins>
+</code>
+<del class="diff-old">or
+if
+the
+document
+cannot
+be
+parsed
+</del>
+<ins class="diff-chg">suffix
+</ins>
+as
+<del class="diff-old">JSON,
+</del>
+<ins class="diff-chg">defined
+in
+[
+</ins><cite><a class="bibref" href="#bib-RFC6839"><ins class="diff-chg">
+RFC6839
+</ins></a></cite><ins class="diff-chg">
+],
+</ins>
+reject
+the
+<i>
+<del class="diff-old">future
+</del>
+<ins class="diff-chg">promise
+</ins>
+</i>
+passing
+an
+<code class="error">
+<a href="#idl-def-JsonLdErrorCode.loading-document-failed">
+loading
+document
+failed
+</a>
+</code>
+error.
+</li>
+<li>
+Initialize
+a
+new
+empty
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>.
+The
+<a class="tref internalDFN" title="base-iri" href="#dfn-base-iri">
+base
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+of
+the
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>
+is
+set
+to
+the
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+of
+the
+currently
+being
+processed
+document,
+if
+available;
+otherwise
+to
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>.
+If
+set,
+the
+<code class="idlMemberName">
+<del class="diff-old">compactArrays
+</del>
+<a href="#widl-JsonLdOptions-base">
+<ins class="diff-chg">base
+</ins>
+</a>
+</code>
+<ins class="diff-new">option
+</ins>
+overrides
+the
+<a class="tref internalDFN" title="base-iri" href="#dfn-base-iri">
+base
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>.
+</li>
+<li>
+If
+an
+<code class="idlMemberName">
+<a href="#widl-JsonLdOptions-expandContext">
+expandContext
+</a>
+</code>
+has
+been
+passed,
+update
+the
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>
+using
+the
+<a href="#context-processing-algorithm">
+Context
+Processing
+algorithm
+</a>,
+passing
+the
+<code class="idlMemberName">
+<a href="#widl-JsonLdOptions-expandContext">
+expandContext
+</a>
+</code>
+as
+<a class="tref internalDFN" title="local-context" href="#dfn-local-context">
+local
+context
+</a>.
+<ins class="diff-new">If
+</ins><code class="idlMemberName"><a href="#widl-JsonLdOptions-expandContext"><ins class="diff-new">
+expandContext
+</ins></a></code><ins class="diff-new">
+is
+a
+</ins><a class="tref internalDFN" title="json-object" href="#dfn-json-object"><ins class="diff-new">
+JSON
+object
+</ins></a><ins class="diff-new">
+having
+a
+</ins><code><ins class="diff-new">
+@context
+</ins></code><ins class="diff-new">
+member,
+pass
+that
+member's
+value
+instead.
+</ins>
+</li>
+<li>
+If
+the
+<i>
+input
+</i>
+has
+been
+<del class="diff-old">retrieved
+and
+</del>
+<ins class="diff-chg">retrieved,
+</ins>
+the
+response
+has
+<del class="diff-old">a
+content
+type
+application/json
+and
+</del>
+an
+HTTP
+Link
+Header
+[
+<cite>
+<a class="bibref" href="#bib-RFC5988">
+RFC5988
+</a>
+</cite>
+]
+using
+the
+<code>
+http://www.w3.org/ns/json-ld#context
+</code>
+link
+<del class="diff-old">relation,
+</del>
+<ins class="diff-chg">relation
+and
+a
+content
+type
+of
+</ins><code><ins class="diff-chg">
+application/json
+</ins></code><ins class="diff-chg">
+or
+any
+media
+type
+with
+a
+</ins><code><ins class="diff-chg">
++json
+</ins></code><ins class="diff-chg">
+suffix
+as
+defined
+in
+[
+</ins><cite><a class="bibref" href="#bib-RFC6839"><ins class="diff-chg">
+RFC6839
+</ins></a></cite><ins class="diff-chg">
+]
+except
+</ins><code><ins class="diff-chg">
+application/ld+json
+</ins></code>,
+update
+the
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>
+using
+the
+<a href="#context-processing-algorithm">
+Context
+Processing
+algorithm
+</a>,
+passing
+the
+context
+referenced
+in
+the
+HTTP
+Link
+Header
+as
+<a class="tref internalDFN" title="local-context" href="#dfn-local-context">
+local
+context
+</a>.
+<ins class="diff-new">The
+HTTP
+Link
+Header
+is
+ignored
+for
+documents
+served
+as
+</ins><code><ins class="diff-new">
+application/ld+json
+</ins></code><ins class="diff-new">
+If
+multiple
+HTTP
+Link
+Headers
+using
+the
+</ins><code><ins class="diff-new">
+http://www.w3.org/ns/json-ld#context
+</ins></code><ins class="diff-new">
+link
+relation
+are
+found,
+the
+</ins><i><ins class="diff-new">
+promise
+</ins></i><ins class="diff-new">
+is
+rejected
+with
+a
+</ins><a href="#idl-def-JsonLdError" class="idlType"><code><ins class="diff-new">
+JsonLdError
+</ins></code></a><ins class="diff-new">
+whose
+code
+is
+set
+to
+</ins><code class="error"><a href="#idl-def-JsonLdErrorCode.multiple-context-link-headers"><ins class="diff-new">
+multiple
+context
+link
+headers
+</ins></a></code><ins class="diff-new">
+and
+processing
+is
+terminated.
+</ins>
+</li>
+<li>
+Set
+<i>
+expanded
+</i>
+to
+the
+result
+of
+using
+the
+<a href="#expansion-algorithm">
+Expansion
+algorithm
+</a>,
+passing
+the
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>
+and
+<i>
+input
+</i>
+as
+<i>
+element
+</i>.
+</li>
+<li>
+<del class="diff-old">Accept
+</del>
+<ins class="diff-chg">Fulfill
+</ins>
+the
+<i>
+<del class="diff-old">future
+</del>
+<ins class="diff-chg">promise
+</ins>
+</i>
+passing
+<i>
+expanded
+</i>.
+</li>
+</ol>
+<table class="parameters">
+<tr>
+<th>
+Parameter
+</th>
+<th>
+Type
+</th>
+<th>
+Nullable
+</th>
+<th>
+Optional
+</th>
+<th>
+Description
+</th>
+</tr>
+<tr>
+<td class="prmName">
+input
+</td>
+<td class="prmType">
+<code>
+<a>
+any
+</a>
+</code>
+</td>
+<td class="prmNullFalse">
+✘
+</td>
+<td class="prmOptFalse">
+✘
+</td>
+<td class="prmDesc">
+The
+JSON-LD
+object
+or
+array
+of
+JSON-LD
+objects
+to
+perform
+the
+expansion
+upon
+or
+an
+<a class="tref internalDFN" title="iri" href="#dfn-iri">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+referencing
+the
+JSON-LD
+document
+to
+expand.
+</td>
+</tr>
+<tr>
+<td class="prmName">
+options
+</td>
+<td class="prmType">
+<code>
+<a href="#idl-def-JsonLdOptions" class="idlType">
+<code>
+JsonLdOptions
+</code>
+</a>
+</code>
+</td>
+<td class="prmNullFalse">
+✘
+</td>
+<td class="prmOptTrue">
+✔
+</td>
+<td class="prmDesc">
+A
+set
+of
+options
+to
+configure
+the
+used
+algorithms
+such.
+This
+allows,
+e.g.,
+to
+set
+the
+input
+document's
+base
+<a class="tref internalDFN" title="iri" href="#dfn-iri">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>.
+</td>
+</tr>
+</table>
+<div>
+<em>
+Return
+type:
+</em>
+<code>
+<del class="diff-old">Future
+</del>
+<a href="#dfn-promise" class="internalDFN">
+<ins class="diff-chg">Promise
+</ins>
+</a>
+</code>
+</div>
+</dd>
+<dt id="widl-JsonLdProcessor-flatten-Promise-any-input-JsonLdContext-context-JsonLdOptions-options">
+<code>
+flatten
+</code>
+</dt>
+<dd>
+<p>
+<a href="#flattening">
+Flattens
+</a>
+the
+given
+<i>
+input
+</i>
+and
+<a href="#compaction">
+compacts
+</a>
+it
+using
+the
+passed
+<i>
+context
+</i>
+according
+to
+the
+steps
+in
+the
+<a href="#flattening-algorithm">
+Flattening
+algorithm
+</a>:
+</p>
+<ol class="algorithm">
+<li>
+Create
+a
+new
+<del class="diff-old">Future
+</del>
+<a class="tref internalDFN" title="promise" href="#dfn-promise">
+<ins class="diff-chg">Promise
+</ins>
+</a>
+<i>
+<del class="diff-old">future
+</del>
+<ins class="diff-chg">promise
+</ins>
+</i>
+and
+return
+it.
+The
+following
+steps
+are
+then
+executed
+asynchronously.
+</li>
+<li>
+If
+the
+passed
+<i>
+input
+</i>
+is
+a
+<span class="idlParamType">
+DOMString
+</span>
+representing
+the
+<a class="tref internalDFN" title="iri" href="#dfn-iri">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+of
+a
+remote
+document,
+dereference
+it.
+If
+the
+retrieved
+<del class="diff-old">document
+has
+a
+</del>
+<ins class="diff-chg">document's
+</ins>
+content
+type
+<del class="diff-old">different
+than
+</del>
+<ins class="diff-chg">is
+neither
+</ins><code><ins class="diff-chg">
+application/json
+</ins></code>,<ins class="diff-chg">
+nor
+</ins>
+<code>
+application/ld+json
+<del class="diff-old">or
+</del>
+</code>,
+<ins class="diff-chg">nor
+any
+other
+media
+type
+using
+a
+</ins>
+<code>
+<del class="diff-old">application/json
+</del>
+<ins class="diff-chg">+json
+</ins>
+</code>
+<del class="diff-old">or
+if
+the
+document
+cannot
+be
+parsed
+</del>
+<ins class="diff-chg">suffix
+</ins>
+as
+<del class="diff-old">JSON,
+</del>
+<ins class="diff-chg">defined
+in
+[
+</ins><cite><a class="bibref" href="#bib-RFC6839"><ins class="diff-chg">
+RFC6839
+</ins></a></cite><ins class="diff-chg">
+],
+</ins>
+reject
+the
+<i>
+<del class="diff-old">future
+</del>
+<ins class="diff-chg">promise
+</ins>
+</i>
+passing
+an
+<code class="error">
+<a href="#idl-def-JsonLdErrorCode.loading-document-failed">
+loading
+document
+failed
+</a>
+</code>
+error.
+</li>
+<li>
+Initialize
+a
+new
+empty
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>.
+The
+<a class="tref internalDFN" title="base-iri" href="#dfn-base-iri">
+base
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+of
+the
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>
+is
+set
+to
+the
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+of
+the
+currently
+being
+processed
+document,
+if
+available;
+otherwise
+to
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>.
+If
+set,
+the
+<code class="idlMemberName">
+<del class="diff-old">compactArrays
+</del>
+<a href="#widl-JsonLdOptions-base">
+<ins class="diff-chg">base
+</ins>
+</a>
+</code>
+<ins class="diff-new">option
+</ins>
+overrides
+the
+<a class="tref internalDFN" title="base-iri" href="#dfn-base-iri">
+base
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>.
+</li>
+<li>
+If
+an
+<code class="idlMemberName">
+<a href="#widl-JsonLdOptions-expandContext">
+expandContext
+</a>
+</code>
+has
+been
+passed,
+update
+the
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>
+using
+the
+<a href="#context-processing-algorithm">
+Context
+Processing
+algorithm
+</a>,
+passing
+the
+<code class="idlMemberName">
+<a href="#widl-JsonLdOptions-expandContext">
+expandContext
+</a>
+</code>
+as
+<a class="tref internalDFN" title="local-context" href="#dfn-local-context">
+local
+context
+</a>.
+<ins class="diff-new">If
+</ins><code class="idlMemberName"><a href="#widl-JsonLdOptions-expandContext"><ins class="diff-new">
+expandContext
+</ins></a></code><ins class="diff-new">
+is
+a
+</ins><a class="tref internalDFN" title="json-object" href="#dfn-json-object"><ins class="diff-new">
+JSON
+object
+</ins></a><ins class="diff-new">
+having
+a
+</ins><code><ins class="diff-new">
+@context
+</ins></code><ins class="diff-new">
+member,
+pass
+that
+member's
+value
+instead.
+</ins>
+</li>
+<li>
+If
+the
+<i>
+input
+</i>
+has
+been
+<del class="diff-old">retrieved
+and
+</del>
+<ins class="diff-chg">retrieved,
+</ins>
+the
+response
+has
+<del class="diff-old">a
+content
+type
+application/json
+and
+</del>
+an
+HTTP
+Link
+Header
+[
+<cite>
+<a class="bibref" href="#bib-RFC5988">
+RFC5988
+</a>
+</cite>
+]
+using
+the
+<code>
+http://www.w3.org/ns/json-ld#context
+</code>
+link
+<del class="diff-old">relation,
+</del>
+<ins class="diff-chg">relation
+and
+a
+content
+type
+of
+</ins><code><ins class="diff-chg">
+application/json
+</ins></code><ins class="diff-chg">
+or
+any
+media
+type
+with
+a
+</ins><code><ins class="diff-chg">
++json
+</ins></code><ins class="diff-chg">
+suffix
+as
+defined
+in
+[
+</ins><cite><a class="bibref" href="#bib-RFC6839"><ins class="diff-chg">
+RFC6839
+</ins></a></cite><ins class="diff-chg">
+]
+except
+</ins><code><ins class="diff-chg">
+application/ld+json
+</ins></code>,
+update
+the
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>
+using
+the
+<a href="#context-processing-algorithm">
+Context
+Processing
+algorithm
+</a>,
+passing
+the
+context
+referenced
+in
+the
+HTTP
+Link
+Header
+as
+<a class="tref internalDFN" title="local-context" href="#dfn-local-context">
+local
+context
+</a>.
+<ins class="diff-new">The
+HTTP
+Link
+Header
+is
+ignored
+for
+documents
+served
+as
+</ins><code><ins class="diff-new">
+application/ld+json
+</ins></code><ins class="diff-new">
+If
+multiple
+HTTP
+Link
+Headers
+using
+the
+</ins><code><ins class="diff-new">
+http://www.w3.org/ns/json-ld#context
+</ins></code><ins class="diff-new">
+link
+relation
+are
+found,
+the
+</ins><i><ins class="diff-new">
+promise
+</ins></i><ins class="diff-new">
+is
+rejected
+with
+a
+</ins><a href="#idl-def-JsonLdError" class="idlType"><code><ins class="diff-new">
+JsonLdError
+</ins></code></a><ins class="diff-new">
+whose
+code
+is
+set
+to
+</ins><code class="error"><a href="#idl-def-JsonLdErrorCode.multiple-context-link-headers"><ins class="diff-new">
+multiple
+context
+link
+headers
+</ins></a></code><ins class="diff-new">
+and
+processing
+is
+terminated.
+</ins>
+</li>
+<li>
+Set
+<i>
+expanded
+</i>
+to
+the
+result
+of
+using
+the
+<a href="#expansion-algorithm">
+Expansion
+algorithm
+</a>,
+passing
+the
+<a class="tref internalDFN" title="active-context" href="#dfn-active-context">
+active
+context
+</a>
+and
+<i>
+input
+</i>
+as
+<i>
+element
+</i>.
+</li>
+<li>
+<ins class="diff-new">If
+</ins><i><ins class="diff-new">
+context
+</ins></i><ins class="diff-new">
+is
+a
+</ins><a class="tref internalDFN" title="json-object" href="#dfn-json-object"><ins class="diff-new">
+JSON
+object
+</ins></a><ins class="diff-new">
+having
+a
+</ins><code><ins class="diff-new">
+@context
+</ins></code><ins class="diff-new">
+member,
+set
+</ins><i><ins class="diff-new">
+context
+</ins></i><ins class="diff-new">
+to
+that
+member's
+value.
+</ins></li><li>
+Initialize
+an
+empty
+<i>
+identifier
+map
+</i>
+and
+a
+<i>
+counter
+</i>
+(set
+to
+<code>
+0
+</code>
+)
+to
+be
+used
+by
+the
+<a href="#generate-blank-node-identifier">
+Generate
+Blank
+Node
+Identifier
+algorithm
+</a>.
+</li>
+<li>
+Set
+<i>
+flattened
+</i>
+to
+the
+result
+of
+using
+the
+<a href="#flattening-algorithm">
+Flattening
+algorithm
+</a>,
+passing
+<i>
+expanded
+</i>
+as
+<i>
+element
+</i>,
+<i>
+context
+</i>,
+and
+if
+passed,
+the
+<code class="idlMemberName">
+<a href="#widl-JsonLdOptions-compactArrays">
+compactArrays
+</a>
+</code>
+flag
+in
+<i>
+options
+</i>
+(which
+is
+internally
+passed
+to
+the
+<a href="#compaction-algorithm">
+Compaction
+algorithm
+</a>
+).
+</li>
+<li>
+<del class="diff-old">Accept
+</del>
+<ins class="diff-chg">Fulfill
+</ins>
+the
+<i>
+<del class="diff-old">future
+</del>
+<ins class="diff-chg">promise
+</ins>
+</i>
+passing
+<i>
+flattened
+</i>.
+</li>
+</ol>
+<table class="parameters">
+<tr>
+<th>
+Parameter
+</th>
+<th>
+Type
+</th>
+<th>
+Nullable
+</th>
+<th>
+Optional
+</th>
+<th>
+Description
+</th>
+</tr>
+<tr>
+<td class="prmName">
+input
+</td>
+<td class="prmType">
+<code>
+<a>
+any
+</a>
+</code>
+</td>
+<td class="prmNullFalse">
+✘
+</td>
+<td class="prmOptFalse">
+✘
+</td>
+<td class="prmDesc">
+The
+JSON-LD
+object
+or
+array
+of
+JSON-LD
+objects
+or
+an
+<a class="tref internalDFN" title="iri" href="#dfn-iri">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+referencing
+the
+JSON-LD
+document
+to
+flatten.
+</td>
+</tr>
+<tr>
+<td class="prmName">
+context
+</td>
+<td class="prmType">
+<code>
+<a href="#idl-def-JsonLdContext" class="idlType">
+<code>
+JsonLdContext
+</code>
+</a>
+</code>
+</td>
+<td class="prmNullTrue">
+✔
+</td>
+<td class="prmOptTrue">
+✔
+</td>
+<td class="prmDesc">
+The
+context
+to
+use
+when
+compacting
+the
+flattened
+<code>
+input
+</code>
+;
+<del class="diff-old">either
+in
+the
+form
+of
+</del>
+<ins class="diff-chg">it
+can
+be
+specified
+by
+using
+</ins>
+a
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>,
+<ins class="diff-chg">an
+</ins><a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier"><ins class="diff-chg">
+IRI
+</ins></abbr></a>,
+or
+<del class="diff-old">as
+</del>
+<ins class="diff-chg">an
+array
+consisting
+of
+</ins><a class="tref internalDFN" title="json-object" href="#dfn-json-object"><ins class="diff-chg">
+JSON
+object
+</ins></a><ins class="diff-chg">
+s
+and
+</ins>
+<a class="tref internalDFN" title="iri" href="#dfn-iri">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+<del class="diff-old">.
+</del>
+</a>
+<ins class="diff-chg">s.
+</ins>
+If
+not
+passed
+or
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>
+is
+passed,
+the
+result
+will
+not
+be
+compacted
+but
+kept
+in
+expanded
+form.
+</td>
+</tr>
+<tr>
+<td class="prmName">
+options
+</td>
+<td class="prmType">
+<code>
+<a href="#idl-def-JsonLdOptions" class="idlType">
+<code>
+JsonLdOptions
+</code>
+</a>
+</code>
+</td>
+<td class="prmNullFalse">
+✘
+</td>
+<td class="prmOptTrue">
+✔
+</td>
+<td class="prmDesc">
+A
+set
+of
+options
+to
+configure
+the
+used
+algorithms
+such.
+This
+allows,
+e.g.,
+to
+set
+the
+input
+document's
+base
+<a class="tref internalDFN" title="iri" href="#dfn-iri">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>.
+</td>
+</tr>
+</table>
+<div>
+<em>
+Return
+type:
+</em>
+<code>
+<del class="diff-old">Future
+</del>
+<a href="#dfn-promise" class="internalDFN">
+<ins class="diff-chg">Promise
+</ins>
+</a>
+</code>
+</div>
+</dd>
+</dl>
+</section>
+<pre class="idl">
+<span class="idlTypedef" id="idl-def-JsonLdContext">
+typedef
+<span class="idlTypedefType">
+(
+<a>
+object
+</a>
+or
+<a>
+DOMString
+</a>
+<ins class="diff-new">or
+</ins><a><ins class="diff-new">
+(object
+</ins></a><ins class="diff-new">
+or
+</ins><a><ins class="diff-new">
+DOMString[])
+</ins></a>
+)
+</span>
+<span class="idlTypedefID">
+JsonLdContext
+</span>
+;
+</span>
+</pre>
+<div class="idlTypedefDesc">
+<p>
+The
+<del class="diff-old">identifier
+</del>
+<a href="#idl-def-JsonLdContext" class="idlType">
+<code>
+JsonLdContext
+</code>
+</a>
+<ins class="diff-new">type
+</ins>
+is
+used
+to
+refer
+to
+<del class="diff-old">the
+(object
+</del>
+<ins class="diff-chg">a
+value
+that
+that
+may
+be
+a
+</ins><a class="tref internalDFN" title="json-object" href="#dfn-json-object"><ins class="diff-chg">
+JSON
+object
+</ins></a>,<ins class="diff-chg">
+a
+</ins><a class="tref internalDFN" title="string" href="#dfn-string"><ins class="diff-chg">
+string
+</ins></a><ins class="diff-chg">
+representing
+an
+</ins><a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier"><ins class="diff-chg">
+IRI
+</ins></abbr></a>,
+or
+<del class="diff-old">DOMString)
+type.
+</del>
+<ins class="diff-chg">an
+array
+of
+</ins><a class="tref internalDFN" title="json-object" href="#dfn-json-object"><ins class="diff-chg">
+JSON
+objects
+</ins></a><ins class="diff-chg">
+and
+</ins><a class="tref internalDFN" title="string" href="#dfn-string"><ins class="diff-chg">
+strings
+</ins></a>.
+</p>
+</div>
+</section>
+<section id="the-jsonldoptions-type">
+<h3>
+<span class="secno">
+11.2
+</span>
+The
+<a href="#idl-def-JsonLdOptions" class="idlType">
+<code>
+JsonLdOptions
+</code>
+</a>
+Type
+</h3>
+<p>
+The
+<a href="#idl-def-JsonLdOptions" class="idlType">
+<code>
+JsonLdOptions
+</code>
+</a>
+type
+is
+used
+to
+pass
+various
+options
+to
+the
+<a href="#idl-def-JsonLdProcessor" class="idlType">
+<code>
+JsonLdProcessor
+</code>
+</a>
+methods.
+</p>
+ <pre class="idl"><span class="idlDictionary" id="idl-def-JsonLdOptions">dictionary <span class="idlDictionaryID">JsonLdOptions</span> {
+<span class="idlMember"> <span class="idlMemberType"><a>DOMString</a>?</span> <span class="idlMemberName"><a href="#widl-JsonLdOptions-base">base</a></span>;</span>
+<span class="idlMember"> <span class="idlMemberType"><a>boolean</a></span> <span class="idlMemberName"><a href="#widl-JsonLdOptions-compactArrays">compactArrays</a></span> = <span class="idlMemberValue">true</span>;</span>
+<span class="idlMember"> <span class="idlMemberType"><a href="#idl-def-LoadDocumentCallback" class="idlType"><code>LoadDocumentCallback</code></a></span> <span class="idlMemberName"><a href="#widl-JsonLdOptions-documentLoader">documentLoader</a></span> = <span class="idlMemberValue">null</span>;</span>
+<span class="idlMember"> <span class="idlMemberType">(<a>object?</a> or <a>DOMString</a>)</span> <span class="idlMemberName"><a href="#widl-JsonLdOptions-expandContext">expandContext</a></span> = <span class="idlMemberValue">null</span>;</span>
+<span class="idlMember"> <span class="idlMemberType"><a>DOMString</a></span> <span class="idlMemberName"><a href="#widl-JsonLdOptions-processingMode">processingMode</a></span> = <span class="idlMemberValue">"json-ld-1.0"</span>;</span>
+};
+</span>
+</pre>
+<section>
+<h4 id="dictionary-jsonldoptions-members">
+Dictionary
+<a class="idlType" href="#idl-def-JsonLdOptions">
+<code>
+JsonLdOptions
+</code>
+</a>
+Members
+</h4>
+<dl class="dictionary-members">
+<dt id="widl-JsonLdOptions-base">
+<code>
+base
+</code>
+of
+type
+<span class="idlMemberType">
+<a>
+DOMString
+</a>
+</span>,
+nullable
+</dt>
+<dd>
+The
+base
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+to
+use
+when
+expanding
+or
+compacting
+the
+document.
+If
+set,
+this
+overrides
+the
+input
+document's
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>.
+</dd>
+<dt id="widl-JsonLdOptions-compactArrays">
+<code>
+compactArrays
+</code>
+of
+type
+<span class="idlMemberType">
+<a>
+boolean
+</a>
+</span>,
+defaulting
+to
+<code>
+true
+</code>
+</dt>
+<dd>
+If
+set
+to
+<code>
+true
+</code>,
+the
+JSON-LD
+processor
+replaces
+arrays
+with
+just
+one
+element
+with
+that
+element
+during
+compaction.
+If
+set
+to
+<code>
+false
+</code>,
+all
+arrays
+will
+remain
+arrays
+even
+if
+they
+have
+just
+one
+element.
+</dd>
+<dt id="widl-JsonLdOptions-documentLoader">
+<code>
+<del class="diff-old">expandContext
+</del>
+<ins class="diff-chg">documentLoader
+</ins>
+</code>
+of
+type
+<span class="idlMemberType">
+<del class="diff-old">(object?
+or
+DOMString)
+</del>
+<a href="#idl-def-LoadDocumentCallback" class="idlType">
+<del class="diff-old">,
+defaulting
+to
+</del>
+<code>
+<del class="diff-old">null
+</del>
+<ins class="diff-chg">LoadDocumentCallback
+</ins>
+</code>
+</a>
+<del class="diff-old">A
+context
+that
+is
+used
+</del>
+</span>,
+<ins class="diff-chg">defaulting
+</ins>
+to
+<del class="diff-old">initialize
+the
+active
+context
+when
+expanding
+a
+document.
+loadContext
+of
+type
+</del>
+<code>
+<del class="diff-old">LoadContextCallback
+</del>
+<ins class="diff-chg">null
+</ins>
+</code>
+</dt>
+<dd>
+The
+callback
+of
+the
+<del class="diff-old">context
+</del>
+loader
+to
+be
+used
+to
+retrieve
+remote
+<ins class="diff-new">documents
+and
+</ins>
+contexts.
+If
+specified,
+it
+<em class="rfc2119" title="MUST">
+MUST
+</em>
+be
+used
+to
+retrieve
+remote
+<ins class="diff-new">documents
+and
+</ins>
+contexts;
+otherwise,
+if
+not
+specified,
+the
+processor's
+built-in
+<del class="diff-old">context
+</del>
+loader
+<em class="rfc2119" title="MUST">
+MUST
+</em>
+be
+used.
+</dd>
+<dt id="widl-JsonLdOptions-expandContext">
+<code>
+<ins class="diff-new">expandContext
+</ins></code><ins class="diff-new">
+of
+type
+</ins><span class="idlMemberType"><a><ins class="diff-new">
+(object?
+or
+DOMString)
+</ins></a></span>,<ins class="diff-new">
+defaulting
+to
+</ins><code><ins class="diff-new">
+null
+</ins></code></dt><dd><ins class="diff-new">
+A
+context
+that
+is
+used
+to
+initialize
+the
+active
+context
+when
+expanding
+a
+document.
+</ins></dd>
+<dt id="widl-JsonLdOptions-processingMode">
+<code>
+processingMode
+</code>
+of
+type
+<span class="idlMemberType">
+<a>
+DOMString
+</a>
+</span>,
+defaulting
+to
+<code>
+"json-ld-1.0"
+</code>
+</dt>
+<dd>
+If
+set
+to
+<code>
+json-ld-1.0
+</code>,
+the
+JSON-LD
+processor
+<em class="rfc2119" title="MUST">
+MUST
+</em>
+produce
+exactly
+the
+same
+results
+as
+the
+algorithms
+defined
+in
+this
+specification.
+If
+set
+to
+another
+value,
+the
+JSON-LD
+processor
+is
+allowed
+to
+extend
+or
+modify
+the
+algorithms
+defined
+in
+this
+specification
+to
+enable
+application-specific
+optimizations.
+The
+definition
+of
+such
+optimizations
+is
+beyond
+the
+scope
+of
+this
+specification
+and
+thus
+not
+defined.
+Consequently,
+different
+implementations
+<em class="rfc2119" title="MAY">
+MAY
+</em>
+implement
+different
+optimizations.
+Developers
+<em class="rfc2119" title="MUST NOT">
+MUST
+NOT
+</em>
+define
+modes
+beginning
+with
+<code>
+json-ld
+</code>
+as
+they
+are
+reserved
+for
+future
+versions
+of
+this
+specification.
+</dd>
+</dl>
+</section>
+</section>
+<section id="remote-document-and-context-retrieval">
+<h3>
+<span class="secno">
+11.3
+</span>
+Remote
+<ins class="diff-new">Document
+and
+</ins>
+Context
+Retrieval
+</h3>
+<p>
+Developers
+can
+utilize
+a
+callback
+to
+control
+how
+remote
+<ins class="diff-new">documents
+and
+</ins>
+contexts
+are
+retrieved
+by
+<a class="tref internalDFN" title="json-ld-api-implementation" href="#dfn-json-ld-api-implementation">
+JSON-LD
+API
+Implementations
+</a>.
+This
+section
+details
+the
+parameters
+of
+that
+callback
+and
+the
+data
+structure
+used
+to
+return
+the
+retrieved
+context.
+</p>
+<section>
+<del class="diff-old">LoadContextCallback
+</del>
+<h4 id="loaddocumentcallback">
+<ins class="diff-chg">LoadDocumentCallback
+</ins>
+</h4>
+<p>
+The
+<a href="#idl-def-LoadDocumentCallback" class="idlType">
+<code>
+<del class="diff-old">LoadContextCallback
+</del>
+<ins class="diff-chg">LoadDocumentCallback
+</ins>
+</code>
+</a>
+defines
+<del class="diff-old">the
+</del>
+<ins class="diff-chg">a
+</ins>
+callback
+that
+custom
+<del class="diff-old">context
+</del>
+<ins class="diff-chg">document
+</ins>
+loaders
+have
+to
+implement
+to
+be
+used
+to
+retrieve
+remote
+<ins class="diff-new">documents
+and
+</ins>
+contexts.
+</p>
+<pre class="idl">
+<span class="idlCallback" id="idl-def-LoadDocumentCallback">
+callback
+<span class="idlCallbackID">
+<del class="diff-old">LoadContextCallback
+</del>
+<ins class="diff-chg">LoadDocumentCallback
+</ins>
+</span>
+=
+<span class="idlCallbackType">
+<del class="diff-old">Future
+</del>
+<a href="#dfn-promise" class="internalDFN">
+<ins class="diff-chg">Promise
+</ins>
+</a>
+</span>
+(
+<span class="idlParam">
+<span class="idlParamType">
+<a>
+DOMString
+</a>
+</span>
+<span class="idlParamName">
+url
+</span>
+</span>
+);
+</span>
+</pre>
+<section>
+<h5 id="callback-loaddocumentcallback-parameters">
+Callback
+<a class="idlType" href="#idl-def-LoadDocumentCallback">
+<code>
+<del class="diff-old">LoadContextCallback
+</del>
+<ins class="diff-chg">LoadDocumentCallback
+</ins>
+</code>
+</a>
+Parameters
+</h5>
+<dl class="callback-members">
+<dt id="widl-LoadDocumentCallback-url">
+<code>
+url
+</code>
+of
+type
+<span class="idlMemberType">
+<a>
+DOMString
+</a>
+</span>
+</dt>
+<dd>
+The
+URL
+of
+the
+remote
+<ins class="diff-new">document
+or
+</ins>
+context
+to
+load.
+</dd>
+</dl>
+</section>
+<p>
+All
+errors
+<em class="rfc2119" title="MUST">
+MUST
+</em>
+result
+in
+the
+<del class="diff-old">Future
+</del>
+<a class="tref internalDFN" title="promise" href="#dfn-promise">
+<ins class="diff-chg">Promise
+</ins>
+</a>
+being
+rejected
+with
+a
+<a href="#idl-def-JsonLdError" class="idlType">
+<code>
+JsonLdError
+</code>
+</a>
+whose
+code
+is
+set
+to
+<code class="error">
+<a href="#idl-def-JsonLdErrorCode.loading-document-failed">
+loading
+<del class="diff-old">remote
+context
+</del>
+<ins class="diff-chg">document
+</ins>
+failed
+</a>
+<del class="diff-old">.
+</del>
+</code>
+<ins class="diff-chg">or
+</ins><code class="error"><a href="#idl-def-JsonLdErrorCode.multiple-context-link-headers"><ins class="diff-chg">
+multiple
+context
+link
+headers
+</ins></a></code><ins class="diff-chg">
+as
+described
+in
+the
+next
+section.
+</ins>
+</p>
+</section>
+<section>
+<del class="diff-old">RemoteContext
+</del>
+<h4 id="remotedocument">
+<ins class="diff-chg">RemoteDocument
+</ins>
+</h4>
+<p>
+The
+<a href="#idl-def-RemoteDocument" class="idlType">
+<code>
+<del class="diff-old">RemoteContext
+</del>
+<ins class="diff-chg">RemoteDocument
+</ins>
+</code>
+</a>
+type
+is
+used
+by
+a
+<a href="#idl-def-LoadDocumentCallback" class="idlType">
+<code>
+<del class="diff-old">LoadContextCallback
+</del>
+<ins class="diff-chg">LoadDocumentCallback
+</ins>
+</code>
+</a>
+to
+return
+information
+about
+a
+remote
+<ins class="diff-new">document
+or
+</ins>
+context.
+</p>
+<del class="diff-old"> {
+</del>
+ <pre class="idl"><span class="idlDictionary" id="idl-def-RemoteDocument">dictionary <span class="idlDictionaryID">RemoteDocument</span> {
+<span class="idlMember"> <span class="idlMemberType"><a>DOMString</a></span> <span class="idlMemberName"><a href="#widl-RemoteDocument-contextUrl">contextUrl</a></span> = <span class="idlMemberValue">null</span>;</span>
+<span class="idlMember"> <span class="idlMemberType"><a>DOMString</a></span> <span class="idlMemberName"><a href="#widl-RemoteDocument-documentUrl">documentUrl</a></span>;</span>
+<span class="idlMember"> <span class="idlMemberType"><a>any</a></span> <span class="idlMemberName"><a href="#widl-RemoteDocument-document">document</a></span>;</span>
+};
+</span>
+</pre>
+<section>
+<h5 id="dictionary-remotedocument-members">
+Dictionary
+<a class="idlType" href="#idl-def-RemoteDocument">
+<code>
+<del class="diff-old">RemoteContext
+</del>
+<ins class="diff-chg">RemoteDocument
+</ins>
+</code>
+</a>
+Members
+</h5>
+<dl class="dictionary-members">
+<dt id="widl-RemoteDocument-contextUrl">
+<code>
+<del class="diff-old">context
+</del>
+<ins class="diff-chg">contextUrl
+</ins>
+</code>
+of
+type
+<span class="idlMemberType">
+<a>
+DOMString
+</a>
+</span>,
+<ins class="diff-chg">defaulting
+to
+</ins><code><ins class="diff-chg">
+null
+</ins></code>
+</dt>
+<dd>
+<del class="diff-old">The
+raw
+</del>
+<ins class="diff-chg">If
+available,
+the
+value
+of
+the
+HTTP
+Link
+Header
+[
+</ins><cite><a class="bibref" href="#bib-RFC5988"><ins class="diff-chg">
+RFC5988
+</ins></a></cite><ins class="diff-chg">
+]
+using
+the
+</ins><code><ins class="diff-chg">
+http://www.w3.org/ns/json-ld#context
+</ins></code><ins class="diff-chg">
+link
+relation
+in
+the
+response.
+If
+the
+response's
+</ins>
+content
+<ins class="diff-new">type
+is
+</ins><code><ins class="diff-new">
+application/ld+json
+</ins></code>,<ins class="diff-new">
+the
+HTTP
+Link
+Header
+</ins><em class="rfc2119" title="MUST"><ins class="diff-new">
+MUST
+</ins></em><ins class="diff-new">
+be
+ignored.
+If
+multiple
+HTTP
+Link
+Headers
+using
+the
+</ins><code><ins class="diff-new">
+http://www.w3.org/ns/json-ld#context
+</ins></code><ins class="diff-new">
+link
+relation
+are
+found,
+the
+</ins><a class="tref internalDFN" title="promise" href="#dfn-promise"><ins class="diff-new">
+Promise
+</ins></a>
+of
+the
+<a href="#idl-def-LoadDocumentCallback" class="idlType">
+<code>
+<ins class="diff-new">LoadDocumentCallback
+</ins></code></a><em class="rfc2119" title="MUST"><ins class="diff-new">
+MUST
+</ins></em><ins class="diff-new">
+be
+rejected
+with
+a
+</ins><a href="#idl-def-JsonLdError" class="idlType"><code><ins class="diff-new">
+JsonLdError
+</ins></code></a><ins class="diff-new">
+whose
+code
+is
+set
+to
+</ins><code class="error"><a href="#idl-def-JsonLdErrorCode.multiple-context-link-headers"><ins class="diff-new">
+multiple
+context
+link
+headers
+</ins></a></code>.</dd><dt id="widl-RemoteDocument-document"><code><ins class="diff-new">
+document
+</ins></code><ins class="diff-new">
+of
+type
+</ins><span class="idlMemberType"><a><ins class="diff-new">
+any
+</ins></a></span></dt><dd><ins class="diff-new">
+The
+</ins>
+retrieved
+<del class="diff-old">JSON-LD
+context.
+</del>
+<ins class="diff-chg">document.
+This
+can
+either
+be
+the
+raw
+payload
+or
+the
+already
+parsed
+document.
+</ins>
+</dd>
+<dt id="widl-RemoteDocument-documentUrl">
+<code>
+<del class="diff-old">url
+</del>
+<ins class="diff-chg">documentUrl
+</ins>
+</code>
+of
+type
+<span class="idlMemberType">
+<a>
+DOMString
+</a>
+</span>
+</dt>
+<dd>
+The
+final
+URL
+of
+the
+loaded
+<del class="diff-old">JSON-LD
+context.
+</del>
+<ins class="diff-chg">document.
+</ins>
+This
+is
+important
+to
+handle
+HTTP
+redirects
+properly.
+</dd>
+</dl>
+</section>
+</section>
+</section>
+<section id="error-handling">
+<h3>
+<span class="secno">
+11.4
+</span>
+Error
+Handling
+</h3>
+<p>
+This
+section
+describes
+the
+datatype
+definitions
+used
+within
+the
+JSON-LD
+API
+for
+error
+handling.
+</p>
+<section>
+<h4 id="jsonlderror">
+JsonLdError
+</h4>
+<p>
+The
+<a href="#idl-def-JsonLdError" class="idlType">
+<code>
+JsonLdError
+</code>
+</a>
+type
+is
+used
+to
+report
+processing
+errors.
+</p>
+ <pre class="idl"><span class="idlDictionary" id="idl-def-JsonLdError">dictionary <span class="idlDictionaryID">JsonLdError</span> {
+<span class="idlMember"> <span class="idlMemberType"><a href="#idl-def-JsonLdErrorCode" class="idlType"><code>JsonLdErrorCode</code></a></span> <span class="idlMemberName"><a href="#widl-JsonLdError-code">code</a></span>;</span>
+<span class="idlMember"> <span class="idlMemberType"><a>DOMString</a>?</span> <span class="idlMemberName"><a href="#widl-JsonLdError-message">message</a></span> = <span class="idlMemberValue">null</span>;</span>
+};
+</span>
+</pre>
+<section>
+<h5 id="dictionary-jsonlderror-members">
+Dictionary
+<a class="idlType" href="#idl-def-JsonLdError">
+<code>
+JsonLdError
+</code>
+</a>
+Members
+</h5>
+<dl class="dictionary-members">
+<dt id="widl-JsonLdError-code">
+<code>
+code
+</code>
+of
+type
+<span class="idlMemberType">
+<a href="#idl-def-JsonLdErrorCode" class="idlType">
+<code>
+JsonLdErrorCode
+</code>
+</a>
+</span>
+</dt>
+<dd>
+a
+string
+representing
+the
+particular
+error
+type,
+as
+described
+in
+the
+various
+algorithms
+in
+this
+document.
+</dd>
+<dt id="widl-JsonLdError-message">
+<code>
+message
+</code>
+of
+type
+<span class="idlMemberType">
+<a>
+DOMString
+</a>
+</span>,
+nullable,
+defaulting
+to
+<code>
+null
+</code>
+</dt>
+<dd>
+an
+optional
+error
+message
+containing
+additional
+debugging
+information.
+The
+specific
+contents
+of
+error
+messages
+are
+outside
+the
+scope
+of
+this
+specification.
+</dd>
+</dl>
+</section>
+</section>
+<section>
+<h4 id="jsonlderrorcode">
+JsonLdErrorCode
+</h4>
+<p>
+The
+<a href="#idl-def-JsonLdErrorCode" class="idlType">
+<code>
+JsonLdErrorCode
+</code>
+</a>
+represents
+the
+collection
+of
+valid
+JSON-LD
+error
+codes.
+</p>
+<div class="issue atrisk">
+<div class="issue-title" role="heading" aria-level="5">
+<span>
+<ins class="diff-new">Feature
+at
+Risk
+4
+</ins></span>:<ins class="diff-new">
+Lists
+of
+lists
+and
+partial
+list
+conversion
+from
+RDF
+</ins></div><div class="atrisk"><p class="atrisk-head"><ins class="diff-new">
+Note:
+This
+feature
+is
+</ins><a href="http://www.w3.org/2005/10/Process-20051014/tr#cfi"><ins class="diff-new">
+"at
+risk"
+</ins></a><ins class="diff-new">
+and
+may
+be
+removed
+from
+this
+specification
+based
+on
+feedback.
+Please
+send
+feedback
+to
+</ins><a href="mailto:public-rdf-comments@w3.org"><ins class="diff-new">
+public-rdf-comments@w3.org
+</ins></a>.<ins class="diff-new">
+For
+the
+current
+status
+see
+</ins><a href="http://www.w3.org/2011/rdf-wg/wiki/JSON-LD_Features_at_Risk"><ins class="diff-new">
+features
+"at
+risk"
+in
+JSON-LD
+1.0
+</ins></a></p><p><ins class="diff-new">
+The
+JSON-LD
+algorithms
+have
+been
+updated
+to
+support
+conversion
+of
+lists
+of
+lists
+to
+</ins><a class="tref internalDFN" title="list-object" href="#dfn-list-object"><ins class="diff-new">
+list
+objects
+</ins></a><ins class="diff-new">
+by
+preserving
+the
+blank
+node
+head
+of
+the
+inner
+list.
+Lists
+of
+lists
+can,
+however,
+not
+be
+represented
+directly
+in
+JSON-LD
+using
+the
+</ins><code><ins class="diff-new">
+@list
+</ins></code><ins class="diff-new">
+construct;
+they
+have
+to
+be
+represented
+as
+a
+set
+of
+interlinked
+node
+objects
+using
+RDF's
+rdf:first
+and
+rdf:rest
+properties.
+Implementors
+are
+asked
+to
+pay
+particular
+attention
+to
+the
+feature
+and
+provide
+feedback
+on
+lists
+of
+lists
+and
+partial
+lists.
+The
+feature
+may
+remain
+in
+the
+specification,
+or
+it
+may
+be
+removed
+after
+further
+implementation
+experience
+has
+been
+gathered.
+Similarly,
+partial
+list
+conversion
+in
+the
+RDF
+algorithms
+have
+been
+marked
+as
+a
+feature
+at
+risk
+and
+may
+be
+removed
+from
+the
+specification
+based
+on
+implementation
+feedback.
+</ins></p></div></div>
+ <pre class="idl"><span class="idlEnum" id="idl-def-JsonLdErrorCode">enum <span class="idlEnumID">JsonLdErrorCode</span> {
+ "<a href="#idl-def-JsonLdErrorCode.loading-document-failed" class="idlEnumItem">loading document failed</a>",
+ "<a href="#idl-def-JsonLdErrorCode.list-of-lists" class="idlEnumItem">list of lists</a>",
+ "<a href="#idl-def-JsonLdErrorCode.invalid--index-value" class="idlEnumItem">invalid @index value</a>",
+ "<a href="#idl-def-JsonLdErrorCode.conflicting-indexes" class="idlEnumItem">conflicting indexes</a>",
+ "<a href="#idl-def-JsonLdErrorCode.invalid--id-value" class="idlEnumItem">invalid @id value</a>",
+ "<a href="#idl-def-JsonLdErrorCode.invalid-local-context" class="idlEnumItem">invalid local context</a>",
+<ins class="diff-new"> "<a href="#idl-def-JsonLdErrorCode.multiple-context-link-headers" class="idlEnumItem">multiple context link headers</a>",
+</ins>
+ "<a href="#idl-def-JsonLdErrorCode.loading-remote-context-failed" class="idlEnumItem">loading remote context failed</a>",
+ "<a href="#idl-def-JsonLdErrorCode.invalid-remote-context" class="idlEnumItem">invalid remote context</a>",
+ "<a href="#idl-def-JsonLdErrorCode.recursive-context-inclusion" class="idlEnumItem">recursive context inclusion</a>",
+ "<a href="#idl-def-JsonLdErrorCode.invalid-base-IRI" class="idlEnumItem">invalid base IRI</a>",
+ "<a href="#idl-def-JsonLdErrorCode.invalid-vocab-mapping" class="idlEnumItem">invalid vocab mapping</a>",
+ "<a href="#idl-def-JsonLdErrorCode.invalid-default-language" class="idlEnumItem">invalid default language</a>",
+ "<a href="#idl-def-JsonLdErrorCode.keyword-redefinition" class="idlEnumItem">keyword redefinition</a>",
+ "<a href="#idl-def-JsonLdErrorCode.invalid-term-definition" class="idlEnumItem">invalid term definition</a>",
+ "<a href="#idl-def-JsonLdErrorCode.invalid-reverse-property" class="idlEnumItem">invalid reverse property</a>",
+ "<a href="#idl-def-JsonLdErrorCode.invalid-IRI-mapping" class="idlEnumItem">invalid IRI mapping</a>",
+ "<a href="#idl-def-JsonLdErrorCode.cyclic-IRI-mapping" class="idlEnumItem">cyclic IRI mapping</a>",
+ "<a href="#idl-def-JsonLdErrorCode.invalid-keyword-alias" class="idlEnumItem">invalid keyword alias</a>",
+ "<a href="#idl-def-JsonLdErrorCode.invalid-type-mapping" class="idlEnumItem">invalid type mapping</a>",
+ "<a href="#idl-def-JsonLdErrorCode.invalid-language-mapping" class="idlEnumItem">invalid language mapping</a>",
+ "<a href="#idl-def-JsonLdErrorCode.colliding-keywords" class="idlEnumItem">colliding keywords</a>",
+ "<a href="#idl-def-JsonLdErrorCode.invalid-container-mapping" class="idlEnumItem">invalid container mapping</a>",
+ "<a href="#idl-def-JsonLdErrorCode.invalid-type-value" class="idlEnumItem">invalid type value</a>",
+ "<a href="#idl-def-JsonLdErrorCode.invalid-value-object" class="idlEnumItem">invalid value object</a>",
+ "<a href="#idl-def-JsonLdErrorCode.invalid-value-object-value" class="idlEnumItem">invalid value object value</a>",
+ "<a href="#idl-def-JsonLdErrorCode.invalid-language-tagged-string" class="idlEnumItem">invalid language-tagged string</a>",
+ "<a href="#idl-def-JsonLdErrorCode.invalid-language-tagged-value" class="idlEnumItem">invalid language-tagged value</a>",
+ "<a href="#idl-def-JsonLdErrorCode.invalid-typed-value" class="idlEnumItem">invalid typed value</a>",
+ "<a href="#idl-def-JsonLdErrorCode.invalid-set-or-list-object" class="idlEnumItem">invalid set or list object</a>",
+ "<a href="#idl-def-JsonLdErrorCode.invalid-language-map-value" class="idlEnumItem">invalid language map value</a>",
+ "<a href="#idl-def-JsonLdErrorCode.compaction-to-list-of-lists" class="idlEnumItem">compaction to list of lists</a>",
+ "<a href="#idl-def-JsonLdErrorCode.invalid-reverse-property-map" class="idlEnumItem">invalid reverse property map</a>",
+ "<a href="#idl-def-JsonLdErrorCode.invalid--reverse-value" class="idlEnumItem">invalid @reverse value</a>",
+ "<a href="#idl-def-JsonLdErrorCode.invalid-reverse-property-value" class="idlEnumItem">invalid reverse property value</a>"
+};
+</span>
+</pre>
+<table class="simple">
+<tr>
+<th colspan="2">
+Enumeration
+description
+</th>
+</tr>
+<tr>
+<td>
+<code id="idl-def-JsonLdErrorCode.loading-document-failed">
+loading
+document
+failed
+</code>
+</td>
+<td>
+The
+document
+could
+not
+be
+loaded
+or
+parsed
+as
+JSON.
+</td>
+</tr>
+<tr>
+<td>
+<code id="idl-def-JsonLdErrorCode.list-of-lists">
+list
+of
+lists
+</code>
+</td>
+<td>
+A
+list
+of
+lists
+was
+detected.
+List
+of
+lists
+are
+not
+supported
+in
+this
+version
+of
+JSON-LD
+due
+to
+the
+algorithmic
+<del class="diff-old">complexity
+associated
+with
+conversion
+to
+RDF.
+</del>
+<ins class="diff-chg">complexity.
+</ins>
+</td>
+</tr>
+<tr>
+<td>
+<code id="idl-def-JsonLdErrorCode.invalid--index-value">
+invalid
+@index
+value
+</code>
+</td>
+<td>
+An
+<code>
+@index
+</code>
+member
+was
+encountered
+whose
+value
+was
+not
+a
+<a class="tref internalDFN" title="string" href="#dfn-string">
+string
+</a>.
+</td>
+</tr>
+<tr>
+<td>
+<code id="idl-def-JsonLdErrorCode.conflicting-indexes">
+conflicting
+indexes
+</code>
+</td>
+<td>
+Multiple
+conflicting
+indexes
+have
+been
+found
+for
+the
+same
+node.
+</td>
+</tr>
+<tr>
+<td>
+<code id="idl-def-JsonLdErrorCode.invalid--id-value">
+invalid
+@id
+value
+</code>
+</td>
+<td>
+An
+<code>
+@id
+</code>
+member
+was
+encountered
+whose
+value
+was
+not
+a
+<a class="tref internalDFN" title="string" href="#dfn-string">
+string
+</a>.
+</td>
+</tr>
+<tr>
+<td>
+<code id="idl-def-JsonLdErrorCode.invalid-local-context">
+invalid
+local
+context
+</code>
+</td>
+<td>
+In
+invalid
+<a class="tref internalDFN" title="local-context" href="#dfn-local-context">
+local
+context
+</a>
+was
+detected.
+</td>
+</tr>
+<tr>
+<td>
+<code id="idl-def-JsonLdErrorCode.multiple-context-link-headers">
+<ins class="diff-new">multiple
+context
+link
+headers
+</ins></code></td><td><ins class="diff-new">
+Multiple
+HTTP
+Link
+Headers
+[
+</ins><cite><a class="bibref" href="#bib-RFC5988"><ins class="diff-new">
+RFC5988
+</ins></a></cite><ins class="diff-new">
+]
+using
+the
+</ins><code><ins class="diff-new">
+http://www.w3.org/ns/json-ld#context
+</ins></code><ins class="diff-new">
+link
+relation
+have
+been
+detected.
+</ins></td></tr><tr><td>
+<code id="idl-def-JsonLdErrorCode.loading-remote-context-failed">
+loading
+remote
+context
+failed
+</code>
+</td>
+<td>
+There
+was
+a
+problem
+encountered
+loading
+a
+remote
+context.
+</td>
+</tr>
+<tr>
+<td>
+<code id="idl-def-JsonLdErrorCode.invalid-remote-context">
+invalid
+remote
+context
+</code>
+</td>
+<td>
+No
+valid
+context
+document
+has
+been
+found
+for
+a
+referenced,
+remote
+context.
+</td>
+</tr>
+<tr>
+<td>
+<code id="idl-def-JsonLdErrorCode.recursive-context-inclusion">
+recursive
+context
+inclusion
+</code>
+</td>
+<td>
+A
+cycle
+in
+remote
+context
+inclusions
+has
+been
+detected.
+</td>
+</tr>
+<tr>
+<td>
+<code id="idl-def-JsonLdErrorCode.invalid-base-IRI">
+invalid
+base
+IRI
+</code>
+</td>
+<td>
+An
+invalid
+<a class="tref internalDFN" title="base-iri" href="#dfn-base-iri">
+base
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+has
+been
+detected,
+i.e.,
+it
+is
+neither
+an
+<a class="tref internalDFN" title="absolute-iri" href="#dfn-absolute-iri">
+absolute
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+nor
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>.
+</td>
+</tr>
+<tr>
+<td>
+<code id="idl-def-JsonLdErrorCode.invalid-vocab-mapping">
+invalid
+vocab
+mapping
+</code>
+</td>
+<td>
+An
+invalid
+<a class="tref internalDFN" title="vocabulary-mapping" href="#dfn-vocabulary-mapping">
+vocabulary
+mapping
+</a>
+has
+been
+detected,
+i.e.,
+it
+is
+neither
+an
+<a class="tref internalDFN" title="absolute-iri" href="#dfn-absolute-iri">
+absolute
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>
+nor
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>.
+</td>
+</tr>
+<tr>
+<td>
+<code id="idl-def-JsonLdErrorCode.invalid-default-language">
+invalid
+default
+language
+</code>
+</td>
+<td>
+The
+value
+of
+the
+<a class="tref internalDFN" title="default-language" href="#dfn-default-language">
+default
+language
+</a>
+is
+not
+a
+<a class="tref internalDFN" title="string" href="#dfn-string">
+string
+</a>
+or
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>
+and
+thus
+invalid.
+</td>
+</tr>
+<tr>
+<td>
+<code id="idl-def-JsonLdErrorCode.keyword-redefinition">
+keyword
+redefinition
+</code>
+</td>
+<td>
+A
+<a class="tref internalDFN" title="keyword" href="#dfn-keyword">
+keyword
+</a>
+redefinition
+has
+been
+detected.
+</td>
+</tr>
+<tr>
+<td>
+<code id="idl-def-JsonLdErrorCode.invalid-term-definition">
+invalid
+term
+definition
+</code>
+</td>
+<td>
+An
+invalid
+<a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">
+term
+definition
+</a>
+has
+been
+detected.
+</td>
+</tr>
+<tr>
+<td>
+<code id="idl-def-JsonLdErrorCode.invalid-reverse-property">
+invalid
+reverse
+property
+</code>
+</td>
+<td>
+An
+invalid
+reverse
+property
+definition
+has
+been
+detected.
+</td>
+</tr>
+<tr>
+<td>
+<code id="idl-def-JsonLdErrorCode.invalid-IRI-mapping">
+invalid
+IRI
+mapping
+</code>
+</td>
+<td>
+A
+<a class="tref internalDFN" title="local-context" href="#dfn-local-context">
+local
+context
+</a>
+contains
+a
+<a class="tref internalDFN" title="term" href="#dfn-term">
+term
+</a>
+that
+has
+an
+invalid
+or
+missing
+<a class="tref internalDFN" title="iri-mapping" href="#dfn-iri-mapping">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+mapping
+</a>.
+</td>
+</tr>
+<tr>
+<td>
+<code id="idl-def-JsonLdErrorCode.cyclic-IRI-mapping">
+cyclic
+IRI
+mapping
+</code>
+</td>
+<td>
+A
+cycle
+in
+<a class="tref internalDFN" title="iri-mapping" href="#dfn-iri-mapping">
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+mappings
+</a>
+has
+been
+detected.
+</td>
+</tr>
+<tr>
+<td>
+<code id="idl-def-JsonLdErrorCode.invalid-keyword-alias">
+invalid
+keyword
+alias
+</code>
+</td>
+<td>
+An
+invalid
+<a class="tref internalDFN" title="keyword" href="#dfn-keyword">
+keyword
+</a>
+alias
+definition
+has
+been
+encountered.
+</td>
+</tr>
+<tr>
+<td>
+<code id="idl-def-JsonLdErrorCode.invalid-type-mapping">
+invalid
+type
+mapping
+</code>
+</td>
+<td>
+An
+<code>
+@type
+</code>
+member
+in
+a
+<a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">
+term
+definition
+</a>
+was
+encountered
+whose
+value
+could
+not
+be
+expanded
+to
+an
+<a class="tref internalDFN" title="absolute-iri" href="#dfn-absolute-iri">
+absolute
+<abbr title="Internationalized Resource Identifier">
+IRI
+</abbr>
+</a>.
+</td>
+</tr>
+<tr>
+<td>
+<code id="idl-def-JsonLdErrorCode.invalid-language-mapping">
+invalid
+language
+mapping
+</code>
+</td>
+<td>
+An
+<code>
+@language
+</code>
+member
+in
+a
+<a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">
+term
+definition
+</a>
+was
+encountered
+whose
+value
+was
+neither
+a
+<a class="tref internalDFN" title="string" href="#dfn-string">
+string
+</a>
+nor
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>
+and
+thus
+invalid.
+</td>
+</tr>
+<tr>
+<td>
+<code id="idl-def-JsonLdErrorCode.colliding-keywords">
+colliding
+keywords
+</code>
+</td>
+<td>
+Two
+properties
+which
+expand
+to
+the
+same
+keyword
+have
+been
+detected.
+This
+might
+occur
+if
+a
+<a class="tref internalDFN" title="keyword" href="#dfn-keyword">
+keyword
+</a>
+and
+an
+<del class="diff-old">an
+</del>
+alias
+thereof
+are
+used
+at
+the
+same
+time.
+</td>
+</tr>
+<tr>
+<td>
+<code id="idl-def-JsonLdErrorCode.invalid-container-mapping">
+invalid
+container
+mapping
+</code>
+</td>
+<td>
+An
+<code>
+@container
+</code>
+member
+was
+encountered
+whose
+value
+was
+not
+one
+of
+the
+following
+<a class="tref internalDFN" title="string" href="#dfn-string">
+strings
+</a>:
+<code>
+@list
+</code>,
+<code>
+@set
+</code>,
+or
+<code>
+@index
+</code>.
+</td>
+</tr>
+<tr>
+<td>
+<code id="idl-def-JsonLdErrorCode.invalid-type-value">
+invalid
+type
+value
+</code>
+</td>
+<td>
+An
+invalid
+value
+for
+an
+<code>
+@type
+</code>
+member
+has
+been
+detected,
+i.e.,
+the
+value
+was
+neither
+a
+<a class="tref internalDFN" title="string" href="#dfn-string">
+string
+</a>
+nor
+an
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>
+of
+<a class="tref internalDFN" title="string" href="#dfn-string">
+strings
+</a>.
+</td>
+</tr>
+<tr>
+<td>
+<code id="idl-def-JsonLdErrorCode.invalid-value-object">
+invalid
+value
+object
+</code>
+</td>
+<td>
+A
+<a class="tref internalDFN" title="value-object" href="#dfn-value-object">
+value
+object
+</a>
+with
+disallowed
+members
+has
+been
+detected.
+</td>
+</tr>
+<tr>
+<td>
+<code id="idl-def-JsonLdErrorCode.invalid-value-object-value">
+invalid
+value
+object
+value
+</code>
+</td>
+<td>
+An
+invalid
+value
+for
+the
+<code>
+@value
+</code>
+member
+of
+a
+<a class="tref internalDFN" title="value-object" href="#dfn-value-object">
+value
+object
+</a>
+has
+been
+detected,
+i.e.,
+it
+is
+neither
+a
+<a class="tref internalDFN" title="scalar" href="#dfn-scalar">
+scalar
+</a>
+nor
+<a class="tref internalDFN" title="null" href="#dfn-null">
+null
+</a>.
+</td>
+</tr>
+<tr>
+<td>
+<code id="idl-def-JsonLdErrorCode.invalid-language-tagged-string">
+invalid
+language-tagged
+string
+</code>
+</td>
+<td>
+A
+<a class="tref internalDFN" title="language-tagged-string" href="http://www.w3.org/TR/rdf11-concepts/#dfn-language-tagged-string">
+language-tagged
+string
+</a>
+with
+an
+invalid
+language
+value
+was
+detected.
+</td>
+</tr>
+<tr>
+<td>
+<code id="idl-def-JsonLdErrorCode.invalid-language-tagged-value">
+invalid
+language-tagged
+value
+</code>
+</td>
+<td>
+A
+<a class="tref internalDFN" title="number" href="#dfn-number">
+number
+</a>,
+<a class="tref internalDFN" title="true" href="#dfn-true">
+true
+</a>,
+or
+<a class="tref internalDFN" title="false" href="#dfn-false">
+false
+</a>
+with
+an
+associated
+language
+tag
+was
+detected.
+</td>
+</tr>
+<tr>
+<td>
+<code id="idl-def-JsonLdErrorCode.invalid-typed-value">
+invalid
+typed
+value
+</code>
+</td>
+<td>
+A
+<a class="tref internalDFN" title="typed-value" href="#dfn-typed-value">
+typed
+value
+</a>
+with
+an
+invalid
+type
+was
+detected.
+</td>
+</tr>
+<tr>
+<td>
+<code id="idl-def-JsonLdErrorCode.invalid-set-or-list-object">
+invalid
+set
+or
+list
+object
+</code>
+</td>
+<td>
+A
+<a class="tref internalDFN" title="set-object" href="#dfn-set-object">
+set
+object
+</a>
+or
+<a class="tref internalDFN" title="list-object" href="#dfn-list-object">
+list
+object
+</a>
+with
+disallowed
+members
+has
+been
+detected.
+</td>
+</tr>
+<tr>
+<td>
+<code id="idl-def-JsonLdErrorCode.invalid-language-map-value">
+invalid
+language
+map
+value
+</code>
+</td>
+<td>
+An
+invalid
+value
+in
+a
+<a class="tref externalDFN" title="language-map" href="http://www.w3.org/TR/2013/CR-json-ld-20130822/#dfn-language-map">
+language
+map
+</a>
+has
+been
+detected.
+It
+has
+to
+be
+a
+<a class="tref internalDFN" title="string" href="#dfn-string">
+string
+</a>
+or
+an
+<a class="tref internalDFN" title="array" href="#dfn-array">
+array
+</a>
+of
+<a class="tref internalDFN" title="string" href="#dfn-string">
+strings
+</a>.
+</td>
+</tr>
+<tr>
+<td>
+<code id="idl-def-JsonLdErrorCode.compaction-to-list-of-lists">
+compaction
+to
+list
+of
+lists
+</code>
+</td>
+<td>
+The
+compacted
+document
+contains
+a
+list
+of
+lists
+as
+multiple
+lists
+have
+been
+compacted
+to
+the
+same
+term.
+</td>
+</tr>
+<tr>
+<td>
+<code id="idl-def-JsonLdErrorCode.invalid-reverse-property-map">
+invalid
+reverse
+property
+map
+</code>
+</td>
+<td>
+An
+invalid
+reverse
+property
+map
+has
+been
+detected.
+No
+<a class="tref internalDFN" title="keyword" href="#dfn-keyword">
+keywords
+</a>
+apart
+from
+<code>
+@context
+</code>
+are
+allowed
+in
+reverse
+property
+maps.
+</td>
+</tr>
+<tr>
+<td>
+<code id="idl-def-JsonLdErrorCode.invalid--reverse-value">
+invalid
+@reverse
+value
+</code>
+</td>
+<td>
+An
+invalid
+value
+for
+an
+<code>
+@reverse
+</code>
+member
+has
+been
+detected,
+i.e.,
+the
+value
+was
+not
+a
+<a class="tref internalDFN" title="json-object" href="#dfn-json-object">
+JSON
+object
+</a>.
+</td>
+</tr>
+<tr>
+<td>
+<code id="idl-def-JsonLdErrorCode.invalid-reverse-property-value">
+invalid
+reverse
+property
+value
+</code>
+</td>
+<td>
+An
+invalid
+value
+for
+a
+reverse
+property
+has
+been
+detected.
+The
+value
+of
+an
+inverse
+property
+must
+be
+a
+<a class="tref internalDFN" title="node-object" href="#dfn-node-object">
+node
+object
+</a>.
+</td>
+</tr>
+</table>
+</section>
+</section>
+</section>
+<section class="appendix informative" id="acknowledgements">
+<h2>
+<span class="secno">
+A.
+</span>
+Acknowledgements
+</h2>
+<p>
+<em>
+This
+section
+is
+non-normative.
+</em>
+</p>
+<p>
+A
+large
+amount
+of
+thanks
+goes
+out
+to
+the
+JSON-LD
+Community
+Group
+participants
+who
+worked
+through
+many
+of
+the
+technical
+issues
+on
+the
+mailing
+list
+and
+the
+weekly
+telecons
+-
+of
+special
+mention
+are
+Niklas
+Lindström,
+François
+Daoust,
+Lin
+Clark,
+and
+Zdenko
+'Denny'
+Vrandečić.
+The
+editors
+would
+like
+to
+thank
+Mark
+Birbeck,
+who
+provided
+a
+great
+deal
+of
+the
+initial
+push
+behind
+the
+JSON-LD
+work
+via
+his
+work
+on
+RDFj.
+The
+work
+of
+Dave
+Lehn
+and
+Mike
+Johnson
+are
+appreciated
+for
+reviewing,
+and
+performing
+several
+implementations
+of
+the
+specification.
+Ian
+Davis
+is
+thanked
+for
+his
+work
+on
+RDF/JSON.
+Thanks
+also
+to
+Nathan
+Rixham,
+Bradley
+P.
+Allen,
+Kingsley
+Idehen,
+Glenn
+McDonald,
+Alexandre
+Passant,
+Danny
+Ayers,
+Ted
+Thibodeau
+Jr.,
+Olivier
+Grisel,
+Josh
+Mandel,
+Eric
+Prud'hommeaux,
+David
+Wood,
+Guus
+Schreiber,
+Pat
+Hayes,
+Sandro
+Hawke,
+<del class="diff-old">Tab
+Atkins
+Jr.,
+Anne
+van
+Kesteren,
+Robin
+Berjon,
+Marcos
+Caceres,
+Boris
+Zbarsky,
+</del>
+and
+Richard
+Cyganiak
+for
+their
+input
+on
+the
+specification.
+</p>
+</section>
+<section id="references" class="appendix" typeof="bibo:Chapter" resource="#references" rel="bibo:chapter">
+<h2>
+<span class="secno">
+B.
+</span>
+References
+</h2>
+<section id="normative-references" typeof="bibo:Chapter" resource="#normative-references" rel="bibo:chapter">
+<h3>
+<span class="secno">
+B.1
+</span>
+Normative
+references
+</h3>
+<dl class="bibliography" about="">
+<dt id="bib-DOM-WHATWG">
+[DOM-WHATWG]
+</dt>
+<dd rel="dcterms:requires">
+Anne
+van
+Kesteren,
+Aryeh
+Gregor,
+Ms2ger,
+Editors.
+<cite>
+<a href="http://dom.spec.whatwg.org/">
+DOM
+</a>.
+</cite>
+April
+2013.
+WHATWG
+Living
+Standard
+(work
+in
+progress).
+URL:
+<a href="http://dom.spec.whatwg.org/">
+http://dom.spec.whatwg.org/
+</a>
+</dd>
+<dt id="bib-IEEE-754-1985">
+[IEEE-754-1985]
+</dt>
+<dd rel="dcterms:requires">
+IEEE.
+<cite>
+IEEE
+Standard
+for
+Binary
+Floating-Point
+Arithmetic.
+</cite>
+URL:
+<a href="http://standards.ieee.org/reading/ieee/std_public/description/busarch/754-1985_desc.html">
+http://standards.ieee.org/reading/ieee/std_public/description/busarch/754-1985_desc.html
+</a>
+</dd>
+<dt id="bib-JSON-LD">
+[JSON-LD]
+</dt>
+<dd rel="dcterms:requires">
+Manu
+Sporny,
+Gregg
+Kellogg,
+Markus
+Lanthaler,
+Editors.
+<cite>
+<a href="http://json-ld.org/spec/latest/json-ld/">
+JSON-LD
+1.0
+</a>.
+</cite>
+W3C
+Editor's
+Draft
+(work
+in
+progress).
+URL:
+<a href="http://json-ld.org/spec/latest/json-ld/">
+http://json-ld.org/spec/latest/json-ld/
+</a>
+</dd>
+<dt id="bib-RDF-MT">
+[RDF-MT]
+</dt>
+<dd rel="dcterms:requires">
+Patrick
+Hayes.
+<a href="http://www.w3.org/TR/rdf-mt/">
+<cite>
+RDF
+Semantics
+</cite>
+</a>.
+10
+February
+2004.
+W3C
+Recommendation.
+URL:
+<del class="diff-old">http://www.w3.org/TR/2004/REC-rdf-mt-20040210
+</del>
+<a href="http://www.w3.org/TR/rdf-mt/">
+<ins class="diff-chg">http://www.w3.org/TR/rdf-mt/
+</ins>
+</a>
+</dd>
+<dt id="bib-RFC2119">
+[RFC2119]
+</dt>
+<dd rel="dcterms:requires">
+S.
+Bradner.
+<a href="http://www.ietf.org/rfc/rfc2119.txt">
+<cite>
+Key
+words
+for
+use
+in
+RFCs
+to
+Indicate
+Requirement
+Levels.
+</cite>
+</a>
+March
+1997.
+Internet
+RFC
+2119.
+URL:
+<a href="http://www.ietf.org/rfc/rfc2119.txt">
+http://www.ietf.org/rfc/rfc2119.txt
+</a>
+</dd>
+<dt id="bib-RFC3986">
+[RFC3986]
+</dt>
+<dd rel="dcterms:requires">
+T.
+Berners-Lee;
+R.
+Fielding;
+L.
+Masinter.
+<a href="http://www.ietf.org/rfc/rfc3986.txt">
+<cite>
+Uniform
+Resource
+Identifier
+(URI):
+Generic
+Syntax
+(RFC
+3986)
+</cite>
+</a>.
+January
+2005.
+RFC.
+URL:
+<a href="http://www.ietf.org/rfc/rfc3986.txt">
+http://www.ietf.org/rfc/rfc3986.txt
+</a>
+</dd>
+<dt id="bib-RFC3987">
+[RFC3987]
+</dt>
+<dd rel="dcterms:requires">
+M.
+Dürst;
+M.
+Suignard.
+<a href="http://www.ietf.org/rfc/rfc3987.txt">
+<cite>
+Internationalized
+Resource
+Identifiers
+(IRIs)
+<del class="diff-old">(RFC
+3987)
+</del>
+</cite>
+</a>.
+January
+2005.
+RFC.
+URL:
+<a href="http://www.ietf.org/rfc/rfc3987.txt">
+http://www.ietf.org/rfc/rfc3987.txt
+</a>
+</dd>
+<dt id="bib-RFC4627">
+[RFC4627]
+</dt>
+<dd rel="dcterms:requires">
+D.
+Crockford.
+<a href="http://www.ietf.org/rfc/rfc4627.txt">
+<cite>
+The
+application/json
+Media
+Type
+for
+JavaScript
+Object
+Notation
+(JSON)
+(RFC
+4627)
+</cite>
+</a>.
+July
+2006.
+RFC.
+URL:
+<a href="http://www.ietf.org/rfc/rfc4627.txt">
+http://www.ietf.org/rfc/rfc4627.txt
+</a>
+</dd>
+<dt id="bib-RFC5988">
+[RFC5988]
+</dt>
+<dd rel="dcterms:requires">
+M.
+Nottingham.
+<cite>
+<a href="http://www.ietf.org/rfc/rfc5988.txt">
+Web
+Linking
+</a>.
+</cite>
+October
+2010.
+Internet
+RFC
+5988.
+URL:
+<a href="http://www.ietf.org/rfc/rfc5988.txt">
+http://www.ietf.org/rfc/rfc5988.txt
+</a>
+</dd>
+<dt id="bib-WEBIDL">
+[WEBIDL]
+</dt>
+<dd rel="dcterms:requires">
+Cameron
+McCormack,
+Editor.
+<cite>
+<a href="http://www.w3.org/TR/2012/CR-WebIDL-20120419/">
+Web
+IDL.
+</a>
+</cite>
+19
+April
+2012.
+W3C
+Candidate
+Recommendation
+(work
+in
+progress).
+URL:
+<a href="http://www.w3.org/TR/2012/CR-WebIDL-20120419/">
+http://www.w3.org/TR/2012/CR-WebIDL-20120419/
+</a>.
+The
+latest
+edition
+is
+available
+at
+<a href="http://www.w3.org/TR/WebIDL/">
+http://www.w3.org/TR/WebIDL/
+</a>
+</dd>
+<dt id="bib-XMLSCHEMA11-2">
+[XMLSCHEMA11-2]
+</dt>
+<dd rel="dcterms:requires">
+<ins class="diff-new">David
+Peterson;
+Sandy
+Gao;
+Ashok
+Malhotra;
+Michael
+Sperberg-McQueen;
+</ins>
+Henry
+<del class="diff-old">S.
+Thompson
+</del>
+<ins class="diff-chg">Thompson;
+Paul
+V.
+Biron
+</ins>
+et
+al.
+<a href="http://www.w3.org/TR/xmlschema11-2/">
+<cite>
+W3C
+XML
+Schema
+Definition
+Language
+(XSD)
+1.1
+Part
+2:
+Datatypes
+</cite>
+</a>.
+5
+April
+2012.
+W3C
+Recommendation.
+URL:
+<del class="diff-old">http://www.w3.org/TR/2012/REC-xmlschema11-2-20120405/
+</del>
+<a href="http://www.w3.org/TR/xmlschema11-2/">
+<ins class="diff-chg">http://www.w3.org/TR/xmlschema11-2/
+</ins>
+</a>
+</dd>
+</dl>
+</section>
+<section id="informative-references" typeof="bibo:Chapter" resource="#informative-references" rel="bibo:chapter">
+<h3>
+<span class="secno">
+B.2
+</span>
+Informative
+references
+</h3>
+<dl class="bibliography" about="">
+<dt id="bib-BCP47">
+[BCP47]
+</dt>
+<dd rel="dcterms:references">
+A.
+Phillips;
+M.
+Davis.
+<a href="http://tools.ietf.org/html/bcp47">
+<cite>
+Tags
+for
+Identifying
+Languages
+</cite>
+</a>.
+September
+2009.
+IETF
+Best
+Current
+Practice.
+URL:
+<a href="http://tools.ietf.org/html/bcp47">
+http://tools.ietf.org/html/bcp47
+</a>
+</dd>
+<dt id="bib-ECMA-262">
+[ECMA-262]
+</dt>
+<dd rel="dcterms:references">
+<a href="http://www.ecma-international.org/publications/standards/Ecma-262.htm">
+<cite>
+ECMAScript
+Language
+Specification,
+Edition
+5.1
+</cite>
+</a>.
+June
+2011.
+URL:
+<a href="http://www.ecma-international.org/publications/standards/Ecma-262.htm">
+http://www.ecma-international.org/publications/standards/Ecma-262.htm
+</a>
+</dd>
+<dt id="bib-JSON-LD-TESTS">
+[JSON-LD-TESTS]
+</dt>
+<dd rel="dcterms:references">
+<cite>
+<a href="http://www.w3.org/2013/json-ld-tests/">
+JSON-LD
+1.0
+Test
+Suite
+</a>
+</cite>.
+W3C
+Test
+Suite
+(work
+in
+progress).
+URL:
+<a href="http://www.w3.org/2013/json-ld-tests/">
+http://www.w3.org/2013/json-ld-tests/
+</a>
+</dd>
+<dt id="bib-RDF11-CONCEPTS">
+[RDF11-CONCEPTS]
+</dt>
+<dd rel="dcterms:references">
+Richard
+Cyganiak,
+David
+Wood,
+Editors.
+<cite>
+<a href="http://www.w3.org/TR/2013/WD-rdf11-concepts-20130115/">
+RDF
+1.1
+Concepts
+and
+Abstract
+Syntax.
+</a>
+</cite>
+15
+January
+2013.
+W3C
+Working
+Draft
+(work
+in
+progress).
+URL:
+<a href="http://www.w3.org/TR/2013/WD-rdf11-concepts-20130115/">
+http://www.w3.org/TR/2013/WD-rdf11-concepts-20130115/
+</a>.
+The
+latest
+edition
+is
+available
+at
+<a href="http://www.w3.org/TR/rdf11-concepts/">
+http://www.w3.org/TR/rdf11-concepts/
+</a>
+</dd>
+<dt id="bib-RFC6839">
+<ins class="diff-new">[RFC6839]
+</ins></dt><dd rel="dcterms:references"><ins class="diff-new">
+Tony
+Hansen,
+Alexey
+Melnikov.
+</ins><cite><a href="http://www.ietf.org/rfc/rfc6839.txt"><ins class="diff-new">
+Additional
+Media
+Type
+Structured
+Syntax
+Suffixes
+</ins></a>.</cite><ins class="diff-new">
+January
+2013.
+Internet
+RFC
+6839.
+URL:
+</ins><a href="http://www.ietf.org/rfc/rfc6839.txt"><ins class="diff-new">
+http://www.ietf.org/rfc/rfc6839.txt
+</ins>
+</a>
+</dd>
+<dt id="bib-TURTLE">
+[TURTLE]
+</dt>
+<dd rel="dcterms:references">
+Eric
+Prud'hommeaux,
+Gavin
+Carothers,
+Editors.
+<cite>
+<a href="http://www.w3.org/TR/2013/CR-turtle-20130219/">
+Turtle:
+Terse
+RDF
+Triple
+Language.
+</a>
+</cite>
+19
+February
+2013.
+W3C
+Candidate
+Recommendation
+(work
+in
+progress).
+URL:
+<a href="http://www.w3.org/TR/2013/CR-turtle-20130219/">
+http://www.w3.org/TR/2013/CR-turtle-20130219/
+</a>.
+The
+latest
+edition
+is
+available
+at
+<a href="http://www.w3.org/TR/turtle/">
+http://www.w3.org/TR/turtle/
+</a>
+</dd>
+</dl>
+</section>
+</section>
+</body>
+</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/spec/CR/json-ld-api/20130822/index.html Tue Aug 13 18:54:07 2013 +0200
@@ -0,0 +1,4585 @@
+<!DOCTYPE html>
+<html lang="en" dir="ltr" prefix="bibo: http://purl.org/ontology/bibo/" typeof="bibo:Document">
+<head>
+<title>JSON-LD 1.0 Processing Algorithms and API</title>
+<meta http-equiv="content-type" content="text/html; charset=UTF-8">
+<style type="text/css">
+ .diff {
+ font-weight:bold; color:#0a3;
+ }
+ .error a {
+ color: #ff4500;
+ border-bottom: 1px dotted #ff4500;
+ text-decoration: none;
+ }
+ .atrisk-head {
+ font-style: italic;
+ }
+ ol.algorithm {
+ counter-reset: numsection;
+ list-style-type: none;
+ }
+ ol.algorithm li {
+ margin: 0.5em 0;
+ }
+ ol.algorithm li:before {
+ font-weight: bold;
+ counter-increment: numsection;
+ content: counters(numsection, ".") ") ";
+ }
+</style>
+<style>/
+/* --- INLINES --- */
+em.rfc2119 {
+ text-transform: lowercase;
+ font-variant: small-caps;
+ font-style: normal;
+ color: #900;
+}
+
+h1 acronym, h2 acronym, h3 acronym, h4 acronym, h5 acronym, h6 acronym, a acronym,
+h1 abbr, h2 abbr, h3 abbr, h4 abbr, h5 abbr, h6 abbr, a abbr {
+ border: none;
+}
+
+dfn {
+ font-weight: bold;
+}
+
+a.internalDFN {
+ color: inherit;
+ border-bottom: 1px solid #99c;
+ text-decoration: none;
+}
+
+a.externalDFN {
+ color: inherit;
+ border-bottom: 1px dotted #ccc;
+ text-decoration: none;
+}
+
+a.bibref {
+ text-decoration: none;
+}
+
+cite .bibref {
+ font-style: normal;
+}
+
+code {
+ color: #ff4500;
+}
+
+/* --- TOC --- */
+.toc a, .tof a {
+ text-decoration: none;
+}
+
+a .secno, a .figno {
+ color: #000;
+}
+
+ul.tof, ol.tof {
+ list-style: none outside none;
+}
+
+.caption {
+ margin-top: 0.5em;
+ font-style: italic;
+}
+
+/* --- TABLE --- */
+table.simple {
+ border-spacing: 0;
+ border-collapse: collapse;
+ border-bottom: 3px solid #005a9c;
+}
+
+.simple th {
+ background: #005a9c;
+ color: #fff;
+ padding: 3px 5px;
+ text-align: left;
+}
+
+.simple th[scope="row"] {
+ background: inherit;
+ color: inherit;
+ border-top: 1px solid #ddd;
+}
+
+.simple td {
+ padding: 3px 10px;
+ border-top: 1px solid #ddd;
+}
+
+.simple tr:nth-child(even) {
+ background: #f0f6ff;
+}
+
+/* --- DL --- */
+.section dd > p:first-child {
+ margin-top: 0;
+}
+
+.section dd > p:last-child {
+ margin-bottom: 0;
+}
+
+.section dd {
+ margin-bottom: 1em;
+}
+
+.section dl.attrs dd, .section dl.eldef dd {
+ margin-bottom: 0;
+}
+</style><style>/* --- EXAMPLES --- */
+div.example-title {
+ min-width: 7.5em;
+ color: #b9ab2d;
+}
+div.example-title span {
+ text-transform: uppercase;
+}
+aside.example, div.example, div.illegal-example {
+ padding: 0.5em;
+ margin: 1em 0;
+ position: relative;
+ clear: both;
+}
+div.illegal-example { color: red }
+div.illegal-example p { color: black }
+aside.example, div.example {
+ padding: .5em;
+ border-left-width: .5em;
+ border-left-style: solid;
+ border-color: #e0cb52;
+ background: #fcfaee;
+}
+
+aside.example div.example {
+ border-left-width: .1em;
+ border-color: #999;
+ background: #fff;
+}
+aside.example div.example div.example-title {
+ color: #999;
+}
+</style><style>/* --- ISSUES/NOTES --- */
+div.issue-title, div.note-title {
+ padding-right: 1em;
+ min-width: 7.5em;
+ color: #b9ab2d;
+}
+div.issue-title { color: #e05252; }
+div.note-title { color: #2b2; }
+div.issue-title span, div.note-title span {
+ text-transform: uppercase;
+}
+div.note, div.issue {
+ margin-top: 1em;
+ margin-bottom: 1em;
+}
+.note > p:first-child, .issue > p:first-child { margin-top: 0 }
+.issue, .note {
+ padding: .5em;
+ border-left-width: .5em;
+ border-left-style: solid;
+}
+div.issue, div.note {
+ padding: 1em 1.2em 0.5em;
+ margin: 1em 0;
+ position: relative;
+ clear: both;
+}
+span.note, span.issue { padding: .1em .5em .15em; }
+
+.issue {
+ border-color: #e05252;
+ background: #fbe9e9;
+}
+.note {
+ border-color: #52e052;
+ background: #e9fbe9;
+}
+
+
+</style><style>/* --- WEB IDL --- */
+pre.idl {
+ border-top: 1px solid #90b8de;
+ border-bottom: 1px solid #90b8de;
+ padding: 1em;
+ line-height: 120%;
+}
+
+pre.idl::before {
+ content: "WebIDL";
+ display: block;
+ width: 150px;
+ background: #90b8de;
+ color: #fff;
+ font-family: initial;
+ padding: 3px;
+ font-weight: bold;
+ margin: -1em 0 1em -1em;
+}
+
+.idlType {
+ color: #ff4500;
+ font-weight: bold;
+ text-decoration: none;
+}
+
+/*.idlModule*/
+/*.idlModuleID*/
+/*.idlInterface*/
+.idlInterfaceID, .idlDictionaryID, .idlCallbackID, .idlEnumID {
+ font-weight: bold;
+ color: #005a9c;
+}
+a.idlEnumItem {
+ color: #000;
+ border-bottom: 1px dotted #ccc;
+ text-decoration: none;
+}
+
+.idlSuperclass {
+ font-style: italic;
+ color: #005a9c;
+}
+
+/*.idlAttribute*/
+.idlAttrType, .idlFieldType, .idlMemberType {
+ color: #005a9c;
+}
+.idlAttrName, .idlFieldName, .idlMemberName {
+ color: #ff4500;
+}
+.idlAttrName a, .idlFieldName a, .idlMemberName a {
+ color: #ff4500;
+ border-bottom: 1px dotted #ff4500;
+ text-decoration: none;
+}
+
+/*.idlMethod*/
+.idlMethType, .idlCallbackType {
+ color: #005a9c;
+}
+.idlMethName {
+ color: #ff4500;
+}
+.idlMethName a {
+ color: #ff4500;
+ border-bottom: 1px dotted #ff4500;
+ text-decoration: none;
+}
+
+/*.idlCtor*/
+.idlCtorName {
+ color: #ff4500;
+}
+.idlCtorName a {
+ color: #ff4500;
+ border-bottom: 1px dotted #ff4500;
+ text-decoration: none;
+}
+
+/*.idlParam*/
+.idlParamType {
+ color: #005a9c;
+}
+.idlParamName, .idlDefaultValue {
+ font-style: italic;
+}
+
+.extAttr {
+ color: #666;
+}
+
+/*.idlSectionComment*/
+.idlSectionComment {
+ color: gray;
+}
+
+/*.idlConst*/
+.idlConstType {
+ color: #005a9c;
+}
+.idlConstName {
+ color: #ff4500;
+}
+.idlConstName a {
+ color: #ff4500;
+ border-bottom: 1px dotted #ff4500;
+ text-decoration: none;
+}
+
+/*.idlException*/
+.idlExceptionID {
+ font-weight: bold;
+ color: #c00;
+}
+
+.idlTypedefID, .idlTypedefType {
+ color: #005a9c;
+}
+
+.idlRaises, .idlRaises a.idlType, .idlRaises a.idlType code, .excName a, .excName a code {
+ color: #c00;
+ font-weight: normal;
+}
+
+.excName a {
+ font-family: monospace;
+}
+
+.idlRaises a.idlType, .excName a.idlType {
+ border-bottom: 1px dotted #c00;
+}
+
+.excGetSetTrue, .excGetSetFalse, .prmNullTrue, .prmNullFalse, .prmOptTrue, .prmOptFalse {
+ width: 45px;
+ text-align: center;
+}
+.excGetSetTrue, .prmNullTrue, .prmOptTrue { color: #0c0; }
+.excGetSetFalse, .prmNullFalse, .prmOptFalse { color: #c00; }
+
+.idlImplements a {
+ font-weight: bold;
+}
+
+dl.attributes, dl.methods, dl.constants, dl.constructors, dl.fields, dl.dictionary-members {
+ margin-left: 2em;
+}
+
+.attributes dt, .methods dt, .constants dt, .constructors dt, .fields dt, .dictionary-members dt {
+ font-weight: normal;
+}
+
+.attributes dt code, .methods dt code, .constants dt code, .constructors dt code, .fields dt code, .dictionary-members dt code {
+ font-weight: bold;
+ color: #000;
+ font-family: monospace;
+}
+
+.attributes dt code, .fields dt code, .dictionary-members dt code {
+ background: #ffffd2;
+}
+
+.attributes dt .idlAttrType code, .fields dt .idlFieldType code, .dictionary-members dt .idlMemberType code {
+ color: #005a9c;
+ background: transparent;
+ font-family: inherit;
+ font-weight: normal;
+ font-style: italic;
+}
+
+.methods dt code {
+ background: #d9e6f8;
+}
+
+.constants dt code {
+ background: #ddffd2;
+}
+
+.constructors dt code {
+ background: #cfc;
+}
+
+.attributes dd, .methods dd, .constants dd, .constructors dd, .fields dd, .dictionary-members dd {
+ margin-bottom: 1em;
+}
+
+table.parameters, table.exceptions {
+ border-spacing: 0;
+ border-collapse: collapse;
+ margin: 0.5em 0;
+ width: 100%;
+}
+table.parameters { border-bottom: 1px solid #90b8de; }
+table.exceptions { border-bottom: 1px solid #deb890; }
+
+.parameters th, .exceptions th {
+ color: #fff;
+ padding: 3px 5px;
+ text-align: left;
+ font-family: initial;
+ font-weight: normal;
+ text-shadow: #666 1px 1px 0;
+}
+.parameters th { background: #90b8de; }
+.exceptions th { background: #deb890; }
+
+.parameters td, .exceptions td {
+ padding: 3px 10px;
+ border-top: 1px solid #ddd;
+ vertical-align: top;
+}
+
+.parameters tr:first-child td, .exceptions tr:first-child td {
+ border-top: none;
+}
+
+.parameters td.prmName, .exceptions td.excName, .exceptions td.excCodeName {
+ width: 100px;
+}
+
+.parameters td.prmType {
+ width: 120px;
+}
+
+table.exceptions table {
+ border-spacing: 0;
+ border-collapse: collapse;
+ width: 100%;
+}
+</style><link rel="stylesheet" href="https://www.w3.org/StyleSheets/TR/W3C-CR"><!--[if lt IE 9]><script src='https://www.w3.org/2008/site/js/html5shiv.js'></script><![endif]--></head>
+
+<body class="h-entry"><div class="head">
+ <p>
+
+ <a href="http://www.w3.org/"><img width="72" height="48" src="https://www.w3.org/Icons/w3c_home" alt="W3C"></a>
+
+ </p>
+ <h1 class="title p-name" id="title">JSON-LD 1.0 Processing Algorithms and API</h1>
+
+ <h2 id="w3c-candidate-recommendation-22-august-2013"><abbr title="World Wide Web Consortium">W3C</abbr> Candidate Recommendation <time class="dt-published" datetime="2013-08-22">22 August 2013</time></h2>
+ <dl>
+
+ <dt>This version:</dt>
+ <dd><a class="u-url" href="http://www.w3.org/TR/2013/CR-json-ld-api-20130822/">http://www.w3.org/TR/2013/CR-json-ld-api-20130822/</a></dd>
+ <dt>Latest published version:</dt>
+ <dd><a href="http://www.w3.org/TR/json-ld-api/">http://www.w3.org/TR/json-ld-api/</a></dd>
+
+
+ <dt>Latest editor's draft:</dt>
+ <dd><a href="http://json-ld.org/spec/latest/json-ld-api/index.html">http://json-ld.org/spec/latest/json-ld-api/index.html</a></dd>
+
+
+ <dt>Test suite:</dt>
+ <dd><a href="http://www.w3.org/2013/json-ld-tests/">http://www.w3.org/2013/json-ld-tests/</a></dd>
+
+
+
+
+ <dt>Previous version:</dt>
+ <dd><a href="http://www.w3.org/TR/2013/WD-json-ld-api-20130516/">http://www.w3.org/TR/2013/WD-json-ld-api-20130516/</a></dd>
+
+
+ <dt>Editors:</dt>
+ <dd rel="bibo:editor" inlist=""><span typeof="foaf:Person"><a rel="foaf:homepage" property="foaf:name" content="Markus Lanthaler" href="http://www.markus-lanthaler.com/">Markus Lanthaler</a>, <a rel="foaf:workplaceHomepage" class="p-org org h-org h-card" href="http://www.tugraz.at/">Graz University of Technology</a></span>
+</dd>
+<dd rel="bibo:editor" inlist=""><span typeof="foaf:Person"><a rel="foaf:homepage" property="foaf:name" content="Gregg Kellogg" href="http://greggkellogg.net/">Gregg Kellogg</a>, <a rel="foaf:workplaceHomepage" class="p-org org h-org h-card" href="http://kellogg-assoc.com/">Kellogg Associates</a></span>
+</dd>
+<dd rel="bibo:editor" inlist=""><span typeof="foaf:Person"><a rel="foaf:homepage" property="foaf:name" content="Manu Sporny" href="http://manu.sporny.org/">Manu Sporny</a>, <a rel="foaf:workplaceHomepage" class="p-org org h-org h-card" href="http://digitalbazaar.com/">Digital Bazaar</a></span>
+</dd>
+
+
+ <dt>Authors:</dt>
+ <dd rel="dcterms:contributor"><span typeof="foaf:Person"><a rel="foaf:homepage" property="foaf:name" content="Dave Longley" href="http://digitalbazaar.com/">Dave Longley</a>, <a rel="foaf:workplaceHomepage" class="p-org org h-org h-card" href="http://digitalbazaar.com/">Digital Bazaar</a></span>
+</dd>
+<dd rel="dcterms:contributor"><span typeof="foaf:Person"><a rel="foaf:homepage" property="foaf:name" content="Gregg Kellogg" href="http://greggkellogg.net/">Gregg Kellogg</a>, <a rel="foaf:workplaceHomepage" class="p-org org h-org h-card" href="http://kellogg-assoc.com/">Kellogg Associates</a></span>
+</dd>
+<dd rel="dcterms:contributor"><span typeof="foaf:Person"><a rel="foaf:homepage" property="foaf:name" content="Markus Lanthaler" href="http://www.markus-lanthaler.com/">Markus Lanthaler</a>, <a rel="foaf:workplaceHomepage" class="p-org org h-org h-card" href="http://www.tugraz.at/">Graz University of Technology</a></span>
+</dd>
+<dd rel="dcterms:contributor"><span typeof="foaf:Person"><a rel="foaf:homepage" property="foaf:name" content="Manu Sporny" href="http://digitalbazaar.com/">Manu Sporny</a>, <a rel="foaf:workplaceHomepage" class="p-org org h-org h-card" href="http://digitalbazaar.com/">Digital Bazaar</a></span>
+</dd>
+
+
+
+ </dl>
+
+
+ <p>
+
+ This document is also available in this non-normative format:
+
+ <a rel="alternate" href="diff-20130516.html">diff to previous version</a>
+ </p>
+
+
+
+
+ <p class="copyright">
+ <a href="http://www.w3.org/Consortium/Legal/ipr-notice#Copyright">Copyright</a> ©
+ 2010-2013
+
+ <a href="http://www.w3.org/"><abbr title="World Wide Web Consortium">W3C</abbr></a><sup>®</sup>
+ (<a href="http://www.csail.mit.edu/"><abbr title="Massachusetts Institute of Technology">MIT</abbr></a>,
+ <a href="http://www.ercim.eu/"><abbr title="European Research Consortium for Informatics and Mathematics">ERCIM</abbr></a>,
+ <a href="http://www.keio.ac.jp/">Keio</a>, <a href="http://ev.buaa.edu.cn/">Beihang</a>), All Rights Reserved.
+ <abbr title="World Wide Web Consortium">W3C</abbr> <a href="http://www.w3.org/Consortium/Legal/ipr-notice#Legal_Disclaimer">liability</a>,
+ <a href="http://www.w3.org/Consortium/Legal/ipr-notice#W3C_Trademarks">trademark</a> and
+ <a href="http://www.w3.org/Consortium/Legal/copyright-documents">document use</a> rules apply.
+ </p>
+
+
+ <hr>
+</div>
+<section id="abstract" class="introductory" property="dcterms:abstract" datatype="" typeof="bibo:Chapter" resource="#abstract" rel="bibo:chapter"><h2>Abstract</h2>
+ <p>This specification defines an Application Programming Interface (API)
+ and a set of algorithms for programmatic transformations of JSON-LD
+ documents. Restructuring data according to the defined transformations
+ often dramatically simplifies its usage.</p>
+</section><section id="sotd" class="introductory" typeof="bibo:Chapter" resource="#sotd" rel="bibo:chapter"><h2>Status of This Document</h2>
+
+
+
+ <p>
+ <em>This section describes the status of this document at the time of its publication. Other
+ documents may supersede this document. A list of current <abbr title="World Wide Web Consortium">W3C</abbr> publications and the latest revision
+ of this technical report can be found in the <a href="http://www.w3.org/TR/"><abbr title="World Wide Web Consortium">W3C</abbr> technical reports
+ index</a> at http://www.w3.org/TR/.</em>
+ </p>
+
+ <p>This document has been under development for over 30 months in the
+ JSON for Linking Data Community Group. The document has recently been
+ transferred to the RDF Working Group for review, improvement, and publication
+ along the Recommendation track. The specification has undergone significant
+ development, review, and changes during the course of the last 30 months.</p>
+
+ <p>There are several independent
+ <a href="http://json-ld.org/#impl">interoperable implementations</a> of
+ this specification. There is a fairly complete test suite [<cite><a class="bibref" href="#bib-JSON-LD-TESTS">JSON-LD-TESTS</a></cite>]
+ and a <a href="http://json-ld.org/playground/">live JSON-LD editor</a>
+ that is capable of demonstrating the features described in
+ this document. While there will be continuous development on implementations,
+ the test suite, and the live editor, they are believed to be mature enough
+ to be integrated into a non-production system at this point in time. There
+ is an expectation that they could be used in a production system within the
+ next three months.</p>
+
+ <p>Changes since the
+ <a href="http://www.w3.org/TR/2013/WD-json-ld-api-20130411/">11 April 2013 Last Call Working Draft</a>:</p>
+
+ <ul>
+ <li>Use of DOM Futures instead of callbacks in the Application Programming Interface</li>
+ <li>Processing of terms that are redefined to themselves without raising an
+ <code class="error"><a href="#idl-def-JsonLdErrorCode.cyclic-IRI-mapping">cyclic <abbr title="Internationalized Resource Identifier">IRI</abbr> mapping</a></code> error</li>
+ <li>Raise an <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid-IRI-mapping">invalid <abbr title="Internationalized Resource Identifier">IRI</abbr> mapping</a></code>
+ error if relative URLs are used in term definitions</li>
+ <li>Support relative IRIs in <code>@base</code></li>
+ <li>Remove default value of <code class="idlMemberName"><a href="#idl-def-JsonLdOptions">JsonLdOption's</a></code>
+ <code class="idlMemberName"><a href="#widl-JsonLdOptions-base">base</a></code> member</li>
+ <li>Support lists of lists when serializing RDF as JSON-LD</li>
+ <li>Support for relative URLs in <code>@base</code> and documents that
+ do not have a base value</li>
+ </ul>
+
+ <p>Changes since the
+ <a href="http://www.w3.org/TR/2013/WD-json-ld-api-20130516/">16 May 2013 Last Call Working Draft</a>:</p>
+
+ <ul>
+ <li>Ensure determinism of the Deserialize JSON-LD to RDF algorithm by specifying the processing order</li>
+ <li>Change the default value of the <em>use native types</em> flag in the Serialize RDF as JSON-LD
+ algorithm to <code>false</code></li>
+ <li>Clarify that the <i>identifier map</i> and the <i>counter</i> used by the
+ Generate Blank Node Identifier algorithm are reset before running the Flattening
+ and the Deserialize JSON-LD to RDF algorithms</li>
+ <li>Raise an error if a blank node is used as data type</li>
+ <li>Clarify that blank node identifier are supported as value of <code>@vocab</code></li>
+ <li>When generating RDF, exclude <a class="tref internalDFN" title="rdf-triple" href="#dfn-rdf-triple">triples</a> containing a
+ <a class="tref internalDFN" title="blank-node" href="#dfn-blank-node">blank node</a> <a class="tref internalDFN" title="rdf-predicate" href="#dfn-rdf-predicate">predicate</a>, unless the
+ <i>produce generalized RDF</i> flag is set</li>
+ <li>Update reference to DOM Promises (have been called DOM Futures)</li>
+ <li>Fix bug in <a href="#serialize-rdf-as-json-ld-algorithm">Serialize RDF to JSON-LD algorithm</a> to
+ handle lists correctly</li>
+ <li>Support processing of documents with a <code>+json</code> media type as defined in
+ [<cite><a class="bibref" href="#bib-RFC6839">RFC6839</a></cite>]</li>
+ <li>Use the <a href="#idl-def-LoadDocumentCallback" class="idlType"><code>LoadDocumentCallback</code></a> (previously <code>LoadContextCallback</code>)
+ to retrieve remote contexts and remote documents</li>
+ <li>Allow contexts to be passed into the API directly. Previously only context documents, i.e.,
+ objects having a <code>@context</code> member were allowed.</li>
+ </ul>
+
+ <p>This document was published by the <a href="http://www.w3.org/2011/rdf-wg/">RDF Working Group</a> as a Candidate Recommendation.
+ This document is intended to become a <abbr title="World Wide Web Consortium">W3C</abbr> Recommendation.
+ If you wish to make comments regarding this document, please send them to
+ <a href="mailto:public-rdf-comments@w3.org">public-rdf-comments@w3.org</a>
+ (<a href="mailto:public-rdf-comments-request@w3.org?subject=subscribe">subscribe</a>,
+ <a href="http://lists.w3.org/Archives/Public/public-rdf-comments/">archives</a>).
+ <abbr title="World Wide Web Consortium">W3C</abbr> publishes a Candidate Recommendation to indicate that the document is believed
+ to be stable and to encourage implementation by the developer community. This
+ Candidate Recommendation is expected to advance to Proposed Recommendation no earlier than
+ 19 September 2013. All comments are welcome.</p>
+
+ <p>Publication as a Candidate Recommendation does not imply endorsement by the <abbr title="World Wide Web Consortium">W3C</abbr> Membership.
+ This is a draft document and may be updated, replaced or obsoleted by other documents at
+ any time. It is inappropriate to cite this document as other than work in progress.</p>
+
+ <p>Before this specification exits Candidate Recommendation, two or more
+ independent implementations must pass each test, although no single
+ implementation must pass each test. The working group will decide when
+ the test suite is of sufficient quality to test interoperability and will
+ produce an implementation report (hosted together with the test suite).</p>
+
+ <p>This document was produced by a group operating under the
+ <a href="http://www.w3.org/Consortium/Patent-Policy-20040205/">5 February 2004 <abbr title="World Wide Web Consortium">W3C</abbr> Patent Policy</a>.
+ <abbr title="World Wide Web Consortium">W3C</abbr> maintains a <a href="http://www.w3.org/2004/01/pp-impl/46168/status" rel="disclosure">public list of any patent disclosures</a>
+ made in connection with the deliverables of the group; that page also includes instructions for
+ disclosing a patent. An individual who has actual knowledge of a patent which the individual believes contains
+ <a href="http://www.w3.org/Consortium/Patent-Policy-20040205/#def-essential">Essential Claim(s)</a> must disclose the
+ information in accordance with <a href="http://www.w3.org/Consortium/Patent-Policy-20040205/#sec-Disclosure">section
+ 6 of the <abbr title="World Wide Web Consortium">W3C</abbr> Patent Policy</a>.</p>
+
+</section><section id="toc"><h2 class="introductory">Table of Contents</h2><ul class="toc"><li class="tocline"><a href="#introduction" class="tocxref"><span class="secno">1. </span>Introduction</a></li><li class="tocline"><a href="#features" class="tocxref"><span class="secno">2. </span>Features</a><ul class="toc"><li class="tocline"><a href="#expansion" class="tocxref"><span class="secno">2.1 </span>Expansion</a></li><li class="tocline"><a href="#compaction" class="tocxref"><span class="secno">2.2 </span>Compaction</a></li><li class="tocline"><a href="#flattening" class="tocxref"><span class="secno">2.3 </span>Flattening</a></li><li class="tocline"><a href="#rdf-serialization-deserialization" class="tocxref"><span class="secno">2.4 </span>RDF Serialization/Deserialization</a></li></ul></li><li class="tocline"><a href="#conformance" class="tocxref"><span class="secno">3. </span>Conformance</a></li><li class="tocline"><a href="#general-terminology" class="tocxref"><span class="secno">4. </span>General Terminology</a></li><li class="tocline"><a href="#algorithm-terms" class="tocxref"><span class="secno">5. </span>Algorithm Terms</a></li><li class="tocline"><a href="#context-processing-algorithms" class="tocxref"><span class="secno">6. </span>Context Processing Algorithms</a><ul class="toc"><li class="tocline"><a href="#context-processing-algorithm" class="tocxref"><span class="secno">6.1 </span>Context Processing Algorithm</a></li><li class="tocline"><a href="#create-term-definition" class="tocxref"><span class="secno">6.2 </span>Create Term Definition</a></li><li class="tocline"><a href="#iri-expansion" class="tocxref"><span class="secno">6.3 </span><abbr title="Internationalized Resource Identifier">IRI</abbr> Expansion</a></li></ul></li><li class="tocline"><a href="#expansion-algorithms" class="tocxref"><span class="secno">7. </span>Expansion Algorithms</a><ul class="toc"><li class="tocline"><a href="#expansion-algorithm" class="tocxref"><span class="secno">7.1 </span>Expansion Algorithm</a></li><li class="tocline"><a href="#value-expansion" class="tocxref"><span class="secno">7.2 </span>Value Expansion</a></li></ul></li><li class="tocline"><a href="#compaction-algorithms" class="tocxref"><span class="secno">8. </span>Compaction Algorithms</a><ul class="toc"><li class="tocline"><a href="#compaction-algorithm" class="tocxref"><span class="secno">8.1 </span>Compaction Algorithm</a></li><li class="tocline"><a href="#inverse-context-creation" class="tocxref"><span class="secno">8.2 </span>Inverse Context Creation</a></li><li class="tocline"><a href="#iri-compaction" class="tocxref"><span class="secno">8.3 </span><abbr title="Internationalized Resource Identifier">IRI</abbr> Compaction</a></li><li class="tocline"><a href="#term-selection" class="tocxref"><span class="secno">8.4 </span>Term Selection</a></li><li class="tocline"><a href="#value-compaction" class="tocxref"><span class="secno">8.5 </span>Value Compaction</a></li></ul></li><li class="tocline"><a href="#flattening-algorithms" class="tocxref"><span class="secno">9. </span>Flattening Algorithms</a><ul class="toc"><li class="tocline"><a href="#flattening-algorithm" class="tocxref"><span class="secno">9.1 </span>Flattening Algorithm</a></li><li class="tocline"><a href="#node-map-generation" class="tocxref"><span class="secno">9.2 </span>Node Map Generation</a></li><li class="tocline"><a href="#generate-blank-node-identifier" class="tocxref"><span class="secno">9.3 </span>Generate Blank Node Identifier</a></li></ul></li><li class="tocline"><a href="#rdf-serialization-deserialization-algorithms" class="tocxref"><span class="secno">10. </span>RDF Serialization/Deserialization Algorithms</a><ul class="toc"><li class="tocline"><a href="#deserialize-json-ld-to-rdf-algorithm" class="tocxref"><span class="secno">10.1 </span>Deserialize JSON-LD to RDF algorithm</a></li><li class="tocline"><a href="#object-to-rdf-conversion" class="tocxref"><span class="secno">10.2 </span>Object to RDF Conversion</a></li><li class="tocline"><a href="#list-to-rdf-conversion" class="tocxref"><span class="secno">10.3 </span>List to RDF Conversion</a></li><li class="tocline"><a href="#serialize-rdf-as-json-ld-algorithm" class="tocxref"><span class="secno">10.4 </span>Serialize RDF as JSON-LD Algorithm</a></li><li class="tocline"><a href="#rdf-to-object-conversion" class="tocxref"><span class="secno">10.5 </span>RDF to Object Conversion</a></li><li class="tocline"><a href="#data-round-tripping" class="tocxref"><span class="secno">10.6 </span>Data Round Tripping</a></li></ul></li><li class="tocline"><a href="#the-application-programming-interface" class="tocxref"><span class="secno">11. </span>The Application Programming Interface</a><ul class="toc"><li class="tocline"><a href="#the-jsonldprocessor-interface" class="tocxref"><span class="secno">11.1 </span>The <span class="formerLink"><code>JsonLdProcessor</code></span> Interface</a></li><li class="tocline"><a href="#the-jsonldoptions-type" class="tocxref"><span class="secno">11.2 </span>The <span class="formerLink"><code>JsonLdOptions</code></span> Type</a></li><li class="tocline"><a href="#remote-document-and-context-retrieval" class="tocxref"><span class="secno">11.3 </span>Remote Document and Context Retrieval</a></li><li class="tocline"><a href="#error-handling" class="tocxref"><span class="secno">11.4 </span>Error Handling</a></li></ul></li><li class="tocline"><a href="#acknowledgements" class="tocxref"><span class="secno">A. </span>Acknowledgements</a></li><li class="tocline"><a href="#references" class="tocxref"><span class="secno">B. </span>References</a><ul class="toc"><li class="tocline"><a href="#normative-references" class="tocxref"><span class="secno">B.1 </span>Normative references</a></li><li class="tocline"><a href="#informative-references" class="tocxref"><span class="secno">B.2 </span>Informative references</a></li></ul></li></ul></section>
+
+
+
+
+<section class="informative" id="introduction">
+ <!--OddPage--><h2><span class="secno">1. </span>Introduction</h2><p><em>This section is non-normative.</em></p>
+
+ <p>This document is a detailed specification for an Application Programming
+ Interface for the JSON-LD syntax. The document is primarily intended for
+ the following audiences:</p>
+
+ <ul>
+ <li>Developers who want an overview of the JSON-LD API.</li>
+ <li>Web authors and developers who want a very detailed view of how
+ a <a class="tref internalDFN" title="json-ld-processor" href="#dfn-json-ld-processor">JSON-LD Processor</a> or a <a class="tref internalDFN" title="json-ld-api-implementation" href="#dfn-json-ld-api-implementation">JSON-LD API Implementation</a>
+ operates.</li>
+ <li>Software developers who want to implement the algorithms to transform
+ JSON-LD documents.</li>
+ </ul>
+
+ <p>To understand the basics in this specification you must first be familiar with
+ JSON, which is detailed in [<cite><a class="bibref" href="#bib-RFC4627">RFC4627</a></cite>]. You must also understand the
+ JSON-LD syntax defined in [<cite><a class="bibref" href="#bib-JSON-LD">JSON-LD</a></cite>], which is the base syntax used by all
+ of the algorithms in this document. To understand the API and how it is
+ intended to operate in a programming environment, it is useful to have working
+ knowledge of the JavaScript programming language [<cite><a class="bibref" href="#bib-ECMA-262">ECMA-262</a></cite>] and
+ WebIDL [<cite><a class="bibref" href="#bib-WEBIDL">WEBIDL</a></cite>]. To understand how JSON-LD maps to RDF, it is helpful to be
+ familiar with the basic RDF concepts [<cite><a class="bibref" href="#bib-RDF11-CONCEPTS">RDF11-CONCEPTS</a></cite>].</p>
+</section> <!-- end of Introduction -->
+
+
+<section class="informative" id="features">
+ <!--OddPage--><h2><span class="secno">2. </span>Features</h2><p><em>This section is non-normative.</em></p>
+
+ <p>The JSON-LD Syntax specification [<cite><a class="bibref" href="#bib-JSON-LD">JSON-LD</a></cite>] defines a syntax to
+ express Linked Data in JSON. Because there is more than one way to
+ express Linked Data using this syntax, it is often useful to be able to
+ transform JSON-LD documents so that they may be more easily consumed by
+ specific applications.</p>
+
+ <p>JSON-LD uses <a class="tref internalDFN" title="context" href="#dfn-context">contexts</a> to allow Linked Data
+ to be expressed in a way that is specifically tailored to a particular
+ person or application. By providing a <a class="tref internalDFN" title="context" href="#dfn-context">context</a>,
+ JSON data can be expressed in a way that is a natural fit for a particular
+ person or application whilst also indicating how the data should be
+ understood at a global scale. In order for people or applications to
+ share data that was created using a <a class="tref internalDFN" title="context" href="#dfn-context">context</a> that is different
+ from their own, a JSON-LD processor must be able to transform a document
+ from one <a class="tref internalDFN" title="context" href="#dfn-context">context</a> to another. Instead of requiring JSON-LD
+ processors to write specific code for every imaginable
+ <a class="tref internalDFN" title="context" href="#dfn-context">context</a> switching scenario, it is much easier to specify a
+ single algorithm that can remove any <a class="tref internalDFN" title="context" href="#dfn-context">context</a>. Similarly,
+ another algorithm can be specified to subsequently apply any
+ <a class="tref internalDFN" title="context" href="#dfn-context">context</a>. These two algorithms represent the most basic
+ transformations of JSON-LD documents. They are referred to as
+ <a class="tref internalDFN" title="expansion" href="#dfn-expansion">expansion</a> and <a class="tref internalDFN" title="compaction" href="#dfn-compaction">compaction</a>, respectively.</p>
+
+ <p>There are four major types of transformation that are discussed in this
+ document: expansion, compaction, flattening, and RDF serialization/deserialization.</p>
+
+ <section class="informative" id="expansion">
+ <h3><span class="secno">2.1 </span>Expansion</h3><p><em>This section is non-normative.</em></p>
+
+ <p>The algorithm that removes <a class="tref internalDFN" title="context" href="#dfn-context">context</a> is
+ called <dfn title="expansion" id="dfn-expansion">expansion</dfn>. Before performing any other
+ transformations on a JSON-LD document, it is easiest to
+ remove any <a class="tref internalDFN" title="context" href="#dfn-context">context</a> from it and to make data structures
+ more regular.</p>
+
+ <p>To get an idea of how context and data structuring affects the same data,
+ here is an example of JSON-LD that uses only <a class="tref internalDFN" title="term" href="#dfn-term">terms</a>
+ and is fairly compact:</p>
+
+ <div class="example"><div class="example-title"><span>Example 1</span>: Sample JSON-LD document</div><pre class="example">{
+ "@context": {
+ "name": "http://xmlns.com/foaf/0.1/name",
+ "homepage": {
+ "@id": "http://xmlns.com/foaf/0.1/homepage",
+ "@type": "@id"
+ }
+ },
+ "@id": "http://me.markus-lanthaler.com/",
+ "name": "Markus Lanthaler",
+ "homepage": "http://www.markus-lanthaler.com/"
+}</pre></div>
+
+ <p>The next input example uses one <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a> to express a property
+ and an <a class="tref internalDFN" title="array" href="#dfn-array">array</a> to encapsulate another, but
+ leaves the rest of the information untouched.</p>
+
+ <div class="example"><div class="example-title"><span>Example 2</span>: Sample JSON-LD document using an IRI instead of a term to express a property</div><pre class="example">{
+ "@context": {
+ <span class="diff">"website": "http://xmlns.com/foaf/0.1/homepage"</span>
+ },
+ "@id": "http://me.markus-lanthaler.com/",
+ "<span class="diff">http://xmlns.com/foaf/0.1/name</span>": "Markus Lanthaler",
+ <span class="diff">"website"</span>: <span class="diff">{ "@id":</span> "http://www.markus-lanthaler.com/" <span class="diff">}</span>
+}</pre></div>
+
+ <p>Note that both inputs are valid JSON-LD and both represent the same
+ information. The difference is in their <a class="tref internalDFN" title="context" href="#dfn-context">context</a> information
+ and in the data structures used. A JSON-LD processor can remove
+ <a class="tref internalDFN" title="context" href="#dfn-context">context</a> and ensure that the data is more regular by employing
+ <a class="tref internalDFN" title="expansion" href="#dfn-expansion">expansion</a>.</p>
+
+ <p><a class="tref internalDFN" title="expansion" href="#dfn-expansion">Expansion</a> has two important goals: removing any contextual
+ information from the document, and ensuring all values are represented
+ in a regular form. These goals are accomplished by expanding all properties
+ to <a class="tref internalDFN" title="absolute-iri" href="#dfn-absolute-iri">absolute IRIs</a> and by expressing all
+ values in <a class="tref internalDFN" title="array" href="#dfn-array">arrays</a> in
+ <a class="tref internalDFN" title="expanded-form" href="#dfn-expanded-form">expanded form</a>. <a class="tref internalDFN" title="expanded-form" href="#dfn-expanded-form">Expanded form</a> is the most verbose
+ and regular way of expressing of values in JSON-LD; all contextual
+ information from the document is instead stored locally with each value.
+ Running the <a href="#expansion-algorithm">Expansion algorithm</a>
+ (<code class="idlMemberName"><a href="#widl-JsonLdProcessor-expand-Promise-any-input-JsonLdOptions-options">expand</a></code>
+ operation) against the above examples results in the following output:</p>
+
+ <div class="example"><div class="example-title"><span>Example 3</span>: Expanded sample document</div><pre class="example">[
+ {
+ "@id": "http://me.markus-lanthaler.com/",
+ "http://xmlns.com/foaf/0.1/name": [
+ { "@value": "Markus Lanthaler" }
+ ],
+ "http://xmlns.com/foaf/0.1/homepage": [
+ { "@id": "http://www.markus-lanthaler.com/" }
+ ]
+ }
+]</pre></div>
+
+ <p>Note that in the output above all <a class="tref internalDFN" title="context" href="#dfn-context">context</a> definitions have
+ been removed, all <a class="tref internalDFN" title="term" href="#dfn-term">terms</a> and
+ <a class="tref internalDFN" title="compact-iri" href="#dfn-compact-iri">compact IRIs</a> have been expanded to absolute
+ <a class="tref internalDFN" title="iri" href="#dfn-iri">IRIs</a>, and all
+ <a class="tref internalDFN" title="json-ld-value" href="#dfn-json-ld-value">JSON-LD values</a> are expressed in
+ <a class="tref internalDFN" title="array" href="#dfn-array">arrays</a> in <a class="tref internalDFN" title="expanded-form" href="#dfn-expanded-form">expanded form</a>. While the
+ output is more verbose and difficult for a human to read, it establishes a
+ baseline that makes JSON-LD processing easier because of its very regular
+ structure.</p>
+ </section> <!-- end of Expansion -->
+
+ <section class="informative" id="compaction">
+ <h3><span class="secno">2.2 </span>Compaction</h3><p><em>This section is non-normative.</em></p>
+
+ <p>While <a class="tref internalDFN" title="expansion" href="#dfn-expansion">expansion</a> removes <a class="tref internalDFN" title="context" href="#dfn-context">context</a> from a given
+ input, <a class="tref internalDFN" title="compaction" href="#dfn-compaction">compaction's</a> primary function is to
+ perform the opposite operation: to express a given input according to
+ a particular <a class="tref internalDFN" title="context" href="#dfn-context">context</a>. <dfn title="compaction" id="dfn-compaction">Compaction</dfn> applies a
+ <a class="tref internalDFN" title="context" href="#dfn-context">context</a> that specifically tailors the way information is
+ expressed for a particular person or application. This simplifies applications
+ that consume JSON or JSON-LD by expressing the data in application-specific
+ terms, and it makes the data easier to read by humans.</p>
+
+ <p><a class="tref internalDFN" title="compaction" href="#dfn-compaction">Compaction</a> uses a developer-supplied <a class="tref internalDFN" title="context" href="#dfn-context">context</a> to
+ shorten <a class="tref internalDFN" title="iri" href="#dfn-iri">IRIs</a> to <a class="tref internalDFN" title="term" href="#dfn-term">terms</a> or
+ <a class="tref internalDFN" title="compact-iri" href="#dfn-compact-iri">compact IRIs</a> and
+ <a class="tref internalDFN" title="json-ld-value" href="#dfn-json-ld-value">JSON-LD values</a> expressed in
+ <a class="tref internalDFN" title="expanded-form" href="#dfn-expanded-form">expanded form</a> to simple values such as <a class="tref internalDFN" title="string" href="#dfn-string">strings</a>
+ or <a class="tref internalDFN" title="number" href="#dfn-number">numbers</a>.</p>
+
+ <p>For example, assume the following expanded JSON-LD input document:</p>
+
+ <div class="example"><div class="example-title"><span>Example 4</span>: Expanded sample document</div><pre class="example">[
+ {
+ "@id": "http://me.markus-lanthaler.com/",
+ "http://xmlns.com/foaf/0.1/name": [
+ { "@value": "Markus Lanthaler" }
+ ],
+ "http://xmlns.com/foaf/0.1/homepage": [
+ { "@id": "http://www.markus-lanthaler.com/" }
+ ]
+ }
+]</pre></div>
+
+ <p>Additionally, assume the following developer-supplied JSON-LD
+ <a class="tref internalDFN" title="context" href="#dfn-context">context</a>:</p>
+
+ <div class="example"><div class="example-title"><span>Example 5</span>: JSON-LD context</div><pre class="example">{
+ "@context": {
+ "name": "http://xmlns.com/foaf/0.1/name",
+ "homepage": {
+ "@id": "http://xmlns.com/foaf/0.1/homepage",
+ "@type": "@id"
+ }
+ }
+}</pre></div>
+
+ <p>Running the <a href="#compaction-algorithm">Compaction Algorithm</a>
+ (<code class="idlMemberName"><a href="#widl-JsonLdProcessor-compact-Promise-any-input-JsonLdContext-context-JsonLdOptions-options">compact</a></code>
+ operation) given the context supplied above against the JSON-LD input
+ document provided above would result in the following output:</p>
+
+ <div class="example"><div class="example-title"><span>Example 6</span>: Compacted sample document</div><pre class="example">{
+ "@context": {
+ "name": "http://xmlns.com/foaf/0.1/name",
+ "homepage": {
+ "@id": "http://xmlns.com/foaf/0.1/homepage",
+ "@type": "@id"
+ }
+ },
+ "@id": "http://me.markus-lanthaler.com/",
+ "name": "Markus Lanthaler",
+ "homepage": "http://www.markus-lanthaler.com/"
+}</pre></div>
+
+ <p>Note that all <a class="tref internalDFN" title="iri" href="#dfn-iri">IRIs</a> have been compacted to
+ <a class="tref internalDFN" title="term" href="#dfn-term">terms</a> as specified in the <a class="tref internalDFN" title="context" href="#dfn-context">context</a>,
+ which has been injected into the output. While compacted output is
+ useful to humans, it is also used to generate structures that are easy to
+ program against. Compaction enables developers to map any expanded document
+ into an application-specific compacted document. While the context provided
+ above mapped <code>http://xmlns.com/foaf/0.1/name</code> to <code>name</code>, it
+ could also have been mapped to any other term provided by the developer.</p>
+ </section> <!-- end of Compaction -->
+
+ <section class="informative" id="flattening">
+ <h3><span class="secno">2.3 </span>Flattening</h3><p><em>This section is non-normative.</em></p>
+
+ <p>While expansion ensures that a document is in a uniform structure,
+ flattening goes a step further to ensure that the shape of the data
+ is deterministic. In expanded documents, the properties of a single
+ <a class="tref internalDFN" title="node" href="#dfn-node">node</a> may be spread across a number of different
+ <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON objects</a>. By flattening a
+ document, all properties of a <a class="tref internalDFN" title="node" href="#dfn-node">node</a> are collected in a single
+ <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> and all <a class="tref internalDFN" title="blank-node" href="#dfn-blank-node">blank nodes</a>
+ are labeled with a <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a>. This may drastically
+ simplify the code required to process JSON-LD data in certain applications.</p>
+
+ <p>For example, assume the following JSON-LD input document:</p>
+
+ <div class="example"><div class="example-title"><span>Example 7</span>: Sample JSON-LD document</div><pre class="example">{
+ "@context": {
+ "name": "http://xmlns.com/foaf/0.1/name",
+ "knows": "http://xmlns.com/foaf/0.1/knows"
+ },
+ "@id": "http://me.markus-lanthaler.com/",
+ "name": "Markus Lanthaler",
+ "knows": [
+ {
+ "name": "Dave Longley"
+ }
+ ]
+}</pre></div>
+
+ <p>Running the <a href="#flattening-algorithm">Flattening algorithm</a>
+ (<code class="idlMemberName"><a href="#widl-JsonLdProcessor-flatten-Promise-any-input-JsonLdContext-context-JsonLdOptions-options">flatten</a></code>
+ operation) with a context set to <a class="tref internalDFN" title="null" href="#dfn-null">null</a> to prevent compaction
+ returns the following document:</p>
+
+ <div class="example"><div class="example-title"><span>Example 8</span>: Flattened sample document in expanded form</div><pre class="example">[
+ {
+ "@id": "_:t0",
+ "http://xmlns.com/foaf/0.1/name": [
+ { "@value": "Dave Longley" }
+ ]
+ },
+ {
+ "@id": "http://me.markus-lanthaler.com/",
+ "http://xmlns.com/foaf/0.1/name": [
+ { "@value": "Markus Lanthaler" }
+ ],
+ "http://xmlns.com/foaf/0.1/knows": [
+ { "@id": "_:t0" }
+ ]
+ }
+]</pre></div>
+
+ <p>Note how in the output above all properties of a <a class="tref internalDFN" title="node" href="#dfn-node">node</a> are collected in a
+ single <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> and how the <a class="tref internalDFN" title="blank-node" href="#dfn-blank-node">blank node</a> representing
+ "Dave Longley" has been assigned the <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a>
+ <code>_:t0</code>.</p>
+
+ <p>To make it easier for humans to read or for certain applications to
+ process it, a flattened document can be compacted by passing a context. Using
+ the same context as the input document, the flattened and compacted document
+ looks as follows:</p>
+
+ <div class="example"><div class="example-title"><span>Example 9</span>: Flattened and compacted sample document</div><pre class="example">{
+ "@context": {
+ "name": "http://xmlns.com/foaf/0.1/name",
+ "knows": "http://xmlns.com/foaf/0.1/knows"
+ },
+ "@graph": [
+ {
+ "@id": "_:t0",
+ "name": "Dave Longley"
+ },
+ {
+ "@id": "http://me.markus-lanthaler.com/",
+ "name": "Markus Lanthaler",
+ "knows": { "@id": "_:t0" }
+ }
+ ]
+}</pre></div>
+
+ <p>Please note that the result of flattening and compacting a document
+ is always a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> which contains an <code>@graph</code>
+ member that represents the <a class="tref internalDFN" title="default-graph" href="#dfn-default-graph">default graph</a>.</p>
+ </section> <!-- end of Flattening -->
+
+ <section class="informative" id="rdf-serialization-deserialization">
+ <h3><span class="secno">2.4 </span>RDF Serialization/Deserialization</h3><p><em>This section is non-normative.</em></p>
+
+ <p>JSON-LD can be used to serialize RDF data as described in
+ [<cite><a class="bibref" href="#bib-RDF11-CONCEPTS">RDF11-CONCEPTS</a></cite>]. This ensures that data can be round-tripped to and from
+ any RDF syntax without any loss in fidelity.</p>
+
+ <p>For example, assume the following RDF input serialized in Turtle [<cite><a class="bibref" href="#bib-TURTLE">TURTLE</a></cite>]:</p>
+
+ <div class="example"><div class="example-title"><span>Example 10</span>: Sample Turtle document</div><pre class="example"><http://me.markus-lanthaler.com/> <http://xmlns.com/foaf/0.1/name> "Markus Lanthaler" .
+<http://me.markus-lanthaler.com/> <http://xmlns.com/foaf/0.1/homepage> <http://www.markus-lanthaler.com/> .</pre></div>
+
+ <p>Using the <a href="#serialize-rdf-as-json-ld-algorithm">Serialize RDF as JSON-LD algorithm</a>
+ a developer could transform this document into expanded JSON-LD:</p>
+
+ <div class="example"><div class="example-title"><span>Example 11</span>: Sample Turtle document converted to JSON-LD</div><pre class="example">[
+ {
+ "@id": "http://me.markus-lanthaler.com/",
+ "http://xmlns.com/foaf/0.1/name": [
+ { "@value": "Markus Lanthaler" }
+ ],
+ "http://xmlns.com/foaf/0.1/homepage": [
+ { "@id": "http://www.markus-lanthaler.com/" }
+ ]
+ }
+]</pre></div>
+
+ <p>Note that the output above could easily be compacted using the technique outlined
+ in the previous section. It is also possible to deserialize the JSON-LD document back
+ to RDF using the <a href="#deserialize-json-ld-to-rdf-algorithm">Deserialize JSON-LD to RDF algorithm</a>.</p>
+ </section> <!-- end of RDF Serialization/Deserialization -->
+</section> <!-- end of Features section -->
+
+
+<section id="conformance">
+ <!--OddPage--><h2><span class="secno">3. </span>Conformance</h2>
+
+ <p>All examples and notes as well as sections marked as non-normative in this
+ specification are non-normative. Everything else in this specification is
+ normative.</p>
+
+ <p>The keywords <em class="rfc2119" title="MUST">MUST</em>, <em class="rfc2119" title="MUST NOT">MUST NOT</em>, <em class="rfc2119" title="REQUIRED">REQUIRED</em>, <em class="rfc2119" title="SHOULD">SHOULD</em>, <em class="rfc2119" title="SHOULD NOT">SHOULD NOT</em>, <em class="rfc2119" title="RECOMMENDED">RECOMMENDED</em>,
+ <em class="rfc2119" title="MAY">MAY</em>, and <em class="rfc2119" title="OPTIONAL">OPTIONAL</em> in this specification are to be interpreted as described
+ in [<cite><a class="bibref" href="#bib-RFC2119">RFC2119</a></cite>].</p>
+
+ <p>There are three classes of products that can claim conformance to this
+ specification: <a class="tref internalDFN" title="json-ld-processor" href="#dfn-json-ld-processor">JSON-LD Processors</a>,
+ <a class="tref internalDFN" title="json-ld-api-implementation" href="#dfn-json-ld-api-implementation">JSON-LD API Implementations</a>,
+ and <a class="tref internalDFN" title="rdf-serializer/deserializer" href="#dfn-rdf-serializer/deserializer">RDF Serializers/Deserializers</a>.</p>
+
+ <p>A conforming <dfn title="json-ld-processor" id="dfn-json-ld-processor">JSON-LD Processor</dfn> is a system which can perform the
+ <a href="#expansion-algorithm">Expansion</a>, <a href="#compaction-algorithm">Compaction</a>,
+ and <a href="#flattening-algorithm">Flattening</a> operations defined in this specification.</p>
+
+ <p>A conforming <dfn title="json-ld-api-implementation" id="dfn-json-ld-api-implementation">JSON-LD API Implementation</dfn> is a conforming <a class="tref internalDFN" title="json-ld-processor" href="#dfn-json-ld-processor">JSON-LD Processor</a>
+ that exposes the <a href="#the-application-programming-interface">Application Programming Interface (API)</a>
+ defined in this specification. It <em class="rfc2119" title="MUST">MUST</em> implement the <code>json-ld-1.0</code>
+ processing mode (for further details, see the
+ <code class="idlMemberName"><a href="#widl-JsonLdOptions-processingMode">processingMode</a></code>
+ option of <a href="#idl-def-JsonLdOptions" class="idlType"><code>JsonLdOptions</code></a>).</p>
+
+ <p><a class="tref internalDFN" title="json-ld-processor" href="#dfn-json-ld-processor">JSON-LD Processors</a> and
+ <a class="tref internalDFN" title="json-ld-api-implementation" href="#dfn-json-ld-api-implementation">API Implementations</a> <em class="rfc2119" title="MUST NOT">MUST NOT</em>
+ attempt to correct malformed <a class="tref internalDFN" title="iri" href="#dfn-iri">IRIs</a> or language tags;
+ however, they <em class="rfc2119" title="MAY">MAY</em> issue validation warnings. IRIs are not modified other
+ than conversion between <a class="tref internalDFN" title="relative-iri" href="#dfn-relative-iri">relative</a> and
+ <a class="tref internalDFN" title="absolute-iri" href="#dfn-absolute-iri">absolute IRIs</a>.</p>
+
+ <p>A conforming <dfn title="rdf-serializer/deserializer" id="dfn-rdf-serializer/deserializer">RDF Serializer/Deserializer</dfn> is a system that can
+ <a href="#deserialize-json-ld-to-rdf-algorithm">deserialize JSON-LD to RDF</a> and
+ <a href="#serialize-rdf-as-json-ld-algorithm">serialize RDF as JSON-LD</a> as
+ defined in this specification.</p>
+
+ <p>The algorithms in this specification are generally written with more concern for clarity
+ than efficiency. Thus, <a class="tref internalDFN" title="json-ld-processor" href="#dfn-json-ld-processor">JSON-LD Processors</a>
+ and <a class="tref internalDFN" title="json-ld-api-implementation" href="#dfn-json-ld-api-implementation">API Implementations</a> may
+ implement the algorithms given in this specification in any way desired,
+ so long as the end result is indistinguishable from the result that would
+ be obtained by the specification's algorithms.</p>
+
+ <div class="note"><div class="note-title" role="heading" aria-level="3"><span>Note</span></div><p class="">Implementers can partially check their level of conformance to
+ this specification by successfully passing the test cases of the JSON-LD test
+ suite [<cite><a class="bibref" href="#bib-JSON-LD-TESTS">JSON-LD-TESTS</a></cite>]. Note, however, that passing all the tests in the test
+ suite does not imply complete conformance to this specification. It only implies
+ that the implementation conforms to aspects tested by the test suite.</p></div>
+</section> <!-- end of Conformance section -->
+
+
+<section id="general-terminology">
+ <!--OddPage--><h2><span class="secno">4. </span>General Terminology</h2>
+
+ <p>This document uses the following terms as defined in JSON [<cite><a class="bibref" href="#bib-RFC4627">RFC4627</a></cite>]. Refer
+ to the <em>JSON Grammar</em> section in [<cite><a class="bibref" href="#bib-RFC4627">RFC4627</a></cite>] for formal definitions.</p>
+
+ <dl>
+ <dt><dfn title="json-object" id="dfn-json-object">JSON object</dfn></dt>
+ <dd>An object structure is represented as a pair of curly brackets surrounding
+ zero or more key-value pairs. A key is a <a class="tref internalDFN" title="string" href="#dfn-string">string</a>.
+ A single colon comes after each key, separating the key from the value.
+ A single comma separates a value from a following key. In contrast to JSON,
+ in JSON-LD the keys in an object must be unique.</dd>
+ <dt><dfn title="array" id="dfn-array">array</dfn></dt>
+ <dd>An array structure is represented as square brackets surrounding zero
+ or more values. Values are separated by commas.
+ In JSON, an array is an <em>ordered</em> sequence of zero or more values.
+ While JSON-LD uses the same array representation as JSON,
+ the collection is <em>unordered</em> by default. While order is
+ preserved in regular JSON arrays, it is not in regular JSON-LD arrays
+ unless specifically defined (see
+ <cite><a href="http://www.w3.org/TR/2013/CR-json-ld-20130822/#sets-and-lists">Sets and Lists</a></cite> in
+ the JSON-LD specification [<cite><a class="bibref" href="#bib-JSON-LD">JSON-LD</a></cite>]).</dd>
+ <dt><dfn title="string" id="dfn-string">string</dfn></dt>
+ <dd>A string is a sequence of zero or more Unicode characters,
+ wrapped in double quotes, using backslash escapes (if necessary). A
+ character is represented as a single character string.</dd>
+ <dt><dfn title="number" id="dfn-number">number</dfn></dt>
+ <dd>A number is similar to that used in most programming languages, except
+ that the octal and hexadecimal formats are not used and that leading
+ zeros are not allowed.</dd>
+ <dt><dfn title="true" id="dfn-true">true</dfn> and <dfn title="false" id="dfn-false">false</dfn></dt>
+ <dd>Values that are used to express one of two possible boolean states.</dd>
+ <dt><dfn title="null" id="dfn-null">null</dfn></dt>
+ <dd>The <a class="tref internalDFN" title="null" href="#dfn-null">null</a> value. A key-value pair in the
+ <code>@context</code> where the value, or the <code>@id</code> of the
+ value, is <a class="tref internalDFN" title="null" href="#dfn-null">null</a> explicitly decouples a term's association
+ with an <abbr title="Internationalized Resource Identifier">IRI</abbr>. A key-value pair in the body of a JSON-LD document whose
+ value is <a class="tref internalDFN" title="null" href="#dfn-null">null</a> has the same meaning as if the key-value pair
+ was not defined. If <code>@value</code>, <code>@list</code>, or
+ <code>@set</code> is set to <a class="tref internalDFN" title="null" href="#dfn-null">null</a> in expanded form, then
+ the entire <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> is ignored.</dd>
+ </dl>
+
+ <p>Furthermore, the following terminology is used throughout this document:</p>
+
+ <dl>
+ <dt><dfn title="keyword" id="dfn-keyword">keyword</dfn></dt>
+ <dd>A JSON key that is specific to JSON-LD, specified in the section
+ <cite><a href="http://www.w3.org/TR/2013/CR-json-ld-20130822/#syntax-tokens-and-keywords">Syntax Tokens and Keywords</a></cite>
+ of the JSON-LD specification [<cite><a class="bibref" href="#bib-JSON-LD">JSON-LD</a></cite>].</dd>
+ <dt><dfn title="context" id="dfn-context">context</dfn></dt>
+ <dd>A set of rules for interpreting a JSON-LD document as specified in the section
+ <cite><a href="http://www.w3.org/TR/2013/CR-json-ld-20130822/#the-context">The Context</a></cite> of the JSON-LD
+ specification [<cite><a class="bibref" href="#bib-JSON-LD">JSON-LD</a></cite>].</dd>
+ <dt><dfn title="json-ld-document" id="dfn-json-ld-document">JSON-LD document</dfn></dt>
+ <dd>A <a class="tref internalDFN" title="json-ld-document" href="#dfn-json-ld-document">JSON-LD document</a> is a serialization of a collection of
+ <a class="tref internalDFN" title="graph" href="#dfn-graph">graphs</a> and comprises exactly one
+ <a class="tref internalDFN" title="default-graph" href="#dfn-default-graph">default graph</a> and zero or more <a class="tref internalDFN" title="named-graph" href="#dfn-named-graph">named graphs</a>.</dd>
+ <dt><dfn title="named-graph" id="dfn-named-graph">named graph</dfn></dt>
+ <dd>A named graph is a pair consisting of an <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a> or <a class="tref internalDFN" title="blank-node" href="#dfn-blank-node">blank node</a>
+ (the <dfn title="graph-name" id="dfn-graph-name">graph name</dfn>) and a <a class="tref internalDFN" title="graph" href="#dfn-graph">graph</a>.</dd>
+ <dt><dfn title="default-graph" id="dfn-default-graph">default graph</dfn></dt>
+ <dd>The default graph is the only graph in a JSON-LD document which has no <a class="tref internalDFN" title="graph-name" href="#dfn-graph-name">graph name</a>.</dd>
+ <dt><dfn title="graph" id="dfn-graph">Graph</dfn></dt>
+ <dd>A labeled directed graph, i.e., a set of <a class="tref internalDFN" title="node" href="#dfn-node">nodes</a>
+ connected by <a class="tref internalDFN" title="edge" href="#dfn-edge">edges</a>,
+ as specified in the <cite><a href="http://www.w3.org/TR/2013/CR-json-ld-20130822/#data-model">Data Model</a></cite>
+ section of the JSON-LD specification [<cite><a class="bibref" href="#bib-JSON-LD">JSON-LD</a></cite>].</dd>
+ <dt><dfn title="edge" id="dfn-edge">edge</dfn></dt>
+ <dd>Every <a class="tref internalDFN" title="edge" href="#dfn-edge">edge</a> has a direction associated with it and is labeled with
+ an <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a> or a <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a>. Within the JSON-LD syntax
+ these edge labels are called <dfn title="property" id="dfn-property">properties</dfn>. Whenever possible, an
+ <a class="tref internalDFN" title="edge" href="#dfn-edge">edge</a> should be labeled with an <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a>.</dd>
+ <dt><dfn title="node" id="dfn-node">node</dfn></dt>
+ <dd>Every <a class="tref internalDFN" title="node" href="#dfn-node">node</a> is an <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a>, a <a class="tref internalDFN" title="blank-node" href="#dfn-blank-node">blank node</a>,
+ a <a class="tref internalDFN" title="json-ld-value" href="#dfn-json-ld-value">JSON-LD value</a>, or a <a class="tref internalDFN" title="list" href="#dfn-list">list</a>.</dd>
+ <dt><dfn title="iri" id="dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></dfn></dt>
+ <dd>An <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a> (Internationalized Resource Identifier) is a string that conforms to the syntax
+ defined in [<cite><a class="bibref" href="#bib-RFC3987">RFC3987</a></cite>].</dd>
+ <dt><dfn title="absolute-iri" id="dfn-absolute-iri">absolute <abbr title="Internationalized Resource Identifier">IRI</abbr></dfn></dt>
+ <dd>An absolute <abbr title="Internationalized Resource Identifier">IRI</abbr> is defined in [<cite><a class="bibref" href="#bib-RFC3987">RFC3987</a></cite>] containing a <em>scheme</em> along with a <em>path</em> and
+ optional <em>query</em> and fragment segments.</dd>
+ <dt><dfn title="relative-iri" id="dfn-relative-iri">relative <abbr title="Internationalized Resource Identifier">IRI</abbr></dfn></dt>
+ <dd>A relative <abbr title="Internationalized Resource Identifier">IRI</abbr> is an <abbr title="Internationalized Resource Identifier">IRI</abbr> that is relative to some other <a class="tref internalDFN" title="absolute-iri" href="#dfn-absolute-iri">absolute <abbr title="Internationalized Resource Identifier">IRI</abbr></a>.</dd>
+ <dt><dfn title="blank-node" id="dfn-blank-node">blank node</dfn></dt>
+ <dd>A <a class="tref internalDFN" title="node" href="#dfn-node">node</a> in a <a class="tref internalDFN" title="graph" href="#dfn-graph">graph</a> that is neither an
+ <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a>, nor a <a class="tref internalDFN" title="json-ld-value" href="#dfn-json-ld-value">JSON-LD value</a>, nor a <a class="tref internalDFN" title="list" href="#dfn-list">list</a>.</dd>
+ <dt><dfn title="blank-node-identifier" id="dfn-blank-node-identifier">blank node identifier</dfn></dt>
+ <dd>A blank node identifier is a string that can be used as an identifier for a
+ <a class="tref internalDFN" title="blank-node" href="#dfn-blank-node">blank node</a> within the scope of a JSON-LD document. Blank node identifiers
+ begin with <code>_:</code>.</dd>
+ <dt><dfn title="json-ld-value" id="dfn-json-ld-value">JSON-LD value</dfn></dt>
+ <dd>A <a class="tref internalDFN" title="json-ld-value" href="#dfn-json-ld-value">JSON-LD value</a> is a <a class="tref internalDFN" title="string" href="#dfn-string">string</a>, a <a class="tref internalDFN" title="number" href="#dfn-number">number</a>,
+ <a class="tref internalDFN" title="true" href="#dfn-true">true</a> or <a class="tref internalDFN" title="false" href="#dfn-false">false</a>, a <a class="tref internalDFN" title="typed-value" href="#dfn-typed-value">typed value</a>, or a
+ <a class="tref internalDFN" title="language-tagged-string" href="#dfn-language-tagged-string">language-tagged string</a>.</dd>
+ <dt><dfn title="typed-value" id="dfn-typed-value">typed value</dfn></dt>
+ <dd>A <a class="tref internalDFN" title="typed-value" href="#dfn-typed-value">typed value</a> consists of a value, which is a string, and a type,
+ which is an <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a>.</dd>
+ <dt><dfn title="language-tagged-string" id="dfn-language-tagged-string">language-tagged string</dfn></dt>
+ <dd>A <a class="tref internalDFN" title="language-tagged-string" href="#dfn-language-tagged-string">language-tagged string</a> consists of a string and a non-empty language
+ tag as defined by [<cite><a class="bibref" href="#bib-BCP47">BCP47</a></cite>]. The language tag must be well-formed according to
+ <a href="http://tools.ietf.org/html/bcp47#section-2.2.9">section 2.2.9 Classes of Conformance</a>
+ of [<cite><a class="bibref" href="#bib-BCP47">BCP47</a></cite>], and is normalized to lowercase.</dd>
+ <dt><dfn title="list" id="dfn-list">list</dfn></dt>
+ <dd>A <a class="tref internalDFN" title="list" href="#dfn-list">list</a> is an ordered sequence of <a class="tref internalDFN" title="iri" href="#dfn-iri">IRIs</a>,
+ <a class="tref internalDFN" title="blank-node" href="#dfn-blank-node">blank nodes</a>, and
+ <a class="tref internalDFN" title="json-ld-value" href="#dfn-json-ld-value">JSON-LD values</a>.</dd>
+ </dl>
+</section> <!-- end of General Terminology section -->
+
+
+<section id="algorithm-terms">
+ <!--OddPage--><h2><span class="secno">5. </span>Algorithm Terms</h2>
+
+ <dl>
+ <dt><dfn title="active-graph" id="dfn-active-graph">active graph</dfn></dt>
+ <dd>The name of the currently active graph that the processor should use when
+ processing.</dd>
+ <dt><dfn title="active-subject" id="dfn-active-subject">active subject</dfn></dt>
+ <dd>The currently active subject that the processor should use when
+ processing.</dd>
+ <dt><dfn title="active-property" id="dfn-active-property">active property</dfn></dt>
+ <dd>The currently active <a class="tref internalDFN" title="property" href="#dfn-property">property</a> or <a class="tref internalDFN" title="keyword" href="#dfn-keyword">keyword</a> that
+ the processor should use when processing.</dd>
+ <dt><dfn title="active-context" id="dfn-active-context">active context</dfn></dt>
+ <dd>A context that is used to resolve <a class="tref internalDFN" title="term" href="#dfn-term">terms</a> while
+ the processing algorithm is running.</dd>
+ <dt><dfn title="local-context" id="dfn-local-context">local context</dfn></dt>
+ <dd>A context that is specified within a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>,
+ specified via the <code>@context</code> <a class="tref internalDFN" title="keyword" href="#dfn-keyword">keyword</a>.</dd>
+ <dt><dfn title="json-ld-input" id="dfn-json-ld-input">JSON-LD input</dfn></dt>
+ <dd>The JSON-LD data structure that is provided as input to the algorithm.</dd>
+ <dt><dfn title="term" id="dfn-term">term</dfn></dt>
+ <dd>A <a class="tref internalDFN" title="term" href="#dfn-term">term</a> is a short word defined in a context that may be expanded to
+ an <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a></dd>
+ <dt><dfn title="compact-iri" id="dfn-compact-iri">compact <abbr title="Internationalized Resource Identifier">IRI</abbr></dfn></dt>
+ <dd>A compact <abbr title="Internationalized Resource Identifier">IRI</abbr> has the form of <dfn title="prefix" id="dfn-prefix">prefix</dfn>:<em>suffix</em> and is used as a way
+ of expressing an <abbr title="Internationalized Resource Identifier">IRI</abbr> without needing to define separate <a class="tref internalDFN" title="term" href="#dfn-term">term</a> definitions for
+ each <abbr title="Internationalized Resource Identifier">IRI</abbr> contained within a common vocabulary identified by <a class="tref internalDFN" title="prefix" href="#dfn-prefix">prefix</a>.</dd>
+ <dt><dfn title="node-object" id="dfn-node-object">node object</dfn></dt>
+ <dd>A <a class="tref internalDFN" title="node-object" href="#dfn-node-object">node object</a> represents zero or more properties of a
+ <a class="tref internalDFN" title="node" href="#dfn-node">node</a> in the <a class="tref internalDFN" title="graph" href="#dfn-graph">graph</a> serialized by the
+ JSON-LD document. A <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> is a <a class="tref internalDFN" title="node-object" href="#dfn-node-object">node object</a>
+ if it exists outside of the JSON-LD <a class="tref internalDFN" title="context" href="#dfn-context">context</a> and:
+ <ul>
+ <li>it does not contain the <code>@value</code>, <code>@list</code>,
+ or <code>@set</code> keywords, or</li>
+ <li>it is not the top-most <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> in the JSON-LD document consisting
+ of no other members than <code>@graph</code> and <code>@context</code>.</li>
+ </ul>
+ </dd>
+ <dt><dfn title="value-object" id="dfn-value-object">value object</dfn></dt>
+ <dd>A <a class="tref internalDFN" title="value-object" href="#dfn-value-object">value object</a> is a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> that has an <code>@value</code>
+ member.</dd>
+ <dt><dfn title="list-object" id="dfn-list-object">list object</dfn></dt>
+ <dd>A <a class="tref internalDFN" title="list-object" href="#dfn-list-object">list object</a> is a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> that has an <code>@list</code>
+ member.</dd>
+ <dt><dfn title="set-object" id="dfn-set-object">set object</dfn></dt>
+ <dd>A <a class="tref internalDFN" title="set-object" href="#dfn-set-object">set object</a> is a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> that has an <code>@set</code>
+ member.</dd>
+ <dt><dfn title="scalar" id="dfn-scalar">scalar</dfn></dt>
+ <dd>A scalar is either a JSON <a class="tref internalDFN" title="string" href="#dfn-string">string</a>, <a class="tref internalDFN" title="number" href="#dfn-number">number</a>, <a class="tref internalDFN" title="true" href="#dfn-true">true</a>,
+ or <a class="tref internalDFN" title="false" href="#dfn-false">false</a>.</dd>
+ <dt><dfn title="rdf-subject" id="dfn-rdf-subject">RDF subject</dfn></dt>
+ <dd>A <a class="tref externalDFN" title="subject" href="http://www.w3.org/TR/rdf11-concepts/#dfn-subject">subject</a>
+ as specified by [<cite><a class="bibref" href="#bib-RDF11-CONCEPTS">RDF11-CONCEPTS</a></cite>].</dd>
+ <dt><dfn title="rdf-predicate" id="dfn-rdf-predicate">RDF predicate</dfn></dt>
+ <dd>A <a class="tref externalDFN" title="predicate" href="http://www.w3.org/TR/rdf11-concepts/#dfn-predicate">predicate</a>
+ as specified by [<cite><a class="bibref" href="#bib-RDF11-CONCEPTS">RDF11-CONCEPTS</a></cite>].</dd>
+ <dt><dfn title="rdf-object" id="dfn-rdf-object">RDF object</dfn></dt>
+ <dd>An <a class="tref externalDFN" title="object" href="http://www.w3.org/TR/rdf11-concepts/#dfn-object">object</a>
+ as specified by [<cite><a class="bibref" href="#bib-RDF11-CONCEPTS">RDF11-CONCEPTS</a></cite>].</dd>
+ <dt><dfn title="rdf-triple" id="dfn-rdf-triple">RDF triple</dfn></dt>
+ <dd>A <a class="tref externalDFN" title="triple" href="http://www.w3.org/TR/rdf11-concepts/#dfn-rdf-triple">triple</a>
+ as specified by [<cite><a class="bibref" href="#bib-RDF11-CONCEPTS">RDF11-CONCEPTS</a></cite>].</dd>
+ <dt><dfn title="rdf-dataset" id="dfn-rdf-dataset">RDF dataset</dfn></dt>
+ <dd>A <a class="tref externalDFN" title="dataset" href="http://www.w3.org/TR/rdf11-concepts/#dfn-rdf-dataset">dataset</a>
+ as specified by [<cite><a class="bibref" href="#bib-RDF11-CONCEPTS">RDF11-CONCEPTS</a></cite>] representing a collection of
+ <a class="tref externalDFN" title="rdf-graphs" href="http://www.w3.org/TR/rdf11-concepts/#dfn-rdf-graph">RDF graphs</a>.</dd>
+ </dl>
+</section> <!-- end of Algorithm Terms section -->
+
+
+<section id="context-processing-algorithms">
+ <!--OddPage--><h2><span class="secno">6. </span>Context Processing Algorithms</h2>
+
+ <section id="context-processing-algorithm">
+ <h3><span class="secno">6.1 </span>Context Processing Algorithm</h3>
+
+ <p>When processing a JSON-LD data structure, each processing rule is applied
+ using information provided by the <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>. This
+ section describes how to produce an <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>.</p>
+
+ <p>The <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> contains the active
+ <dfn title="term-definition" id="dfn-term-definition">term definitions</dfn> which specify how
+ properties and values have to be interpreted as well as the current <dfn title="base-iri" id="dfn-base-iri">base <abbr title="Internationalized Resource Identifier">IRI</abbr></dfn>,
+ the <dfn title="vocabulary-mapping" id="dfn-vocabulary-mapping">vocabulary mapping</dfn> and the <dfn title="default-language" id="dfn-default-language">default language</dfn>. Each
+ <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> consists of an <dfn title="iri-mapping" id="dfn-iri-mapping"><abbr title="Internationalized Resource Identifier">IRI</abbr> mapping</dfn>, a boolean
+ flag <dfn title="reverse-property" id="dfn-reverse-property">reverse property</dfn>, an optional <dfn title="type-mapping" id="dfn-type-mapping">type mapping</dfn>
+ or <dfn title="language-mapping" id="dfn-language-mapping">language mapping</dfn>, and an optional <dfn title="container-mapping" id="dfn-container-mapping">container mapping</dfn>.
+ A <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> can not only be used to map a <a class="tref internalDFN" title="term" href="#dfn-term">term</a>
+ to an <abbr title="Internationalized Resource Identifier">IRI</abbr>, but also to map a <a class="tref internalDFN" title="term" href="#dfn-term">term</a> to a <a class="tref internalDFN" title="keyword" href="#dfn-keyword">keyword</a>,
+ in which case it is referred to as a <dfn title="keyword-alias" id="dfn-keyword-alias">keyword alias</dfn>.</p>
+
+ <p>When processing, the <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> is initialized
+ without any <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definitions</a>,
+ <a class="tref internalDFN" title="vocabulary-mapping" href="#dfn-vocabulary-mapping">vocabulary mapping</a>, or <a class="tref internalDFN" title="default-language" href="#dfn-default-language">default language</a>.
+ If a <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a> is encountered during processing, a new
+ <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> is created by cloning the existing
+ <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>. Then the information from the
+ <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a> is merged into the new <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>.
+ Given that <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local contexts</a> may contain
+ references to remote contexts, this includes their retrieval.</p>
+
+ <section class="informative">
+ <h4 id="overview">Overview</h4><p><em>This section is non-normative.</em></p>
+
+ <p>First we prepare a new <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> <i>result</i> by cloning
+ the current <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>. Then we normalize the form of the passed
+ <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a> to an <a class="tref internalDFN" title="array" href="#dfn-array">array</a>.
+ <a class="tref internalDFN" title="local-context" href="#dfn-local-context">Local contexts</a> may be in the form of a
+ <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>, a <a class="tref internalDFN" title="string" href="#dfn-string">string</a>, or an <a class="tref internalDFN" title="array" href="#dfn-array">array</a> containing
+ a combination of the two. Finally we process each <a class="tref internalDFN" title="context" href="#dfn-context">context</a> contained
+ in the <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a> <a class="tref internalDFN" title="array" href="#dfn-array">array</a> as follows.</p>
+
+ <p>If <a class="tref internalDFN" title="context" href="#dfn-context">context</a> is a <a class="tref internalDFN" title="string" href="#dfn-string">string</a>, it represents a reference to
+ a remote context. We dereference the remote context and replace <a class="tref internalDFN" title="context" href="#dfn-context">context</a>
+ with the value of the <code>@context</code> key of the top-level object in the
+ retrieved JSON-LD document. If there's no such key, an invalid remote context has
+ been detected. Otherwise, we process <a class="tref internalDFN" title="context" href="#dfn-context">context</a> by recursively using
+ this algorithm ensuring that there is no cyclical reference.</p>
+
+ <p>If <a class="tref internalDFN" title="context" href="#dfn-context">context</a> is a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>, we first update the
+ <a class="tref internalDFN" title="base-iri" href="#dfn-base-iri">base <abbr title="Internationalized Resource Identifier">IRI</abbr></a>, the <a class="tref internalDFN" title="vocabulary-mapping" href="#dfn-vocabulary-mapping">vocabulary mapping</a>, and the
+ <a class="tref internalDFN" title="default-language" href="#dfn-default-language">default language</a> by processing three specific keywords:
+ <code>@base</code>, <code>@vocab</code>, and <code>@language</code>.
+ These are handled before any other keys in the <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a> because
+ they affect how the other keys are processed. Please note that <code>@base</code> is
+ ignored when processing remote contexts.</p>
+
+ <p>Then, for every other key in <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a>, we update
+ the <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> in <i>result</i>. Since
+ <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definitions</a> in a <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a>
+ may themselves contain <a class="tref internalDFN" title="term" href="#dfn-term">terms</a> or
+ <a class="tref internalDFN" title="compact-iri" href="#dfn-compact-iri">compact IRIs</a>, we may need to recurse.
+ When doing so, we must ensure that there is no cyclical dependency,
+ which is an error. After we have processed any
+ <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> dependencies,
+ we update the current <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a>,
+ which may be a <a class="tref internalDFN" title="keyword-alias" href="#dfn-keyword-alias">keyword alias</a>.</p>
+
+ <p>Finally, we return <i>result</i> as the new <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>.</p>
+ </section>
+
+ <section>
+ <h4 id="algorithm">Algorithm</h4>
+
+ <p>This algorithm specifies how a new <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> is updated
+ with a <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a>. The algorithm takes three input variables:
+ an <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, a <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a>, and an <a class="tref internalDFN" title="array" href="#dfn-array">array</a>
+ <i>remote contexts</i> which is used to detect cyclical context inclusions.
+ If <i>remote contexts</i> is not passed, it is initialized to an empty
+ <a class="tref internalDFN" title="array" href="#dfn-array">array</a>.</p>
+
+ <ol class="algorithm">
+ <li>Initialize <i>result</i> to the result of cloning
+ <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>.</li>
+ <li>If <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a> is not an <a class="tref internalDFN" title="array" href="#dfn-array">array</a>,
+ set it to an <a class="tref internalDFN" title="array" href="#dfn-array">array</a> containing only
+ <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a>.</li>
+ <li>
+ For each item <i>context</i> in <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a>:
+ <ol class="algorithm">
+ <li>If <i>context</i> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, set <i>result</i> to a
+ newly-initialized <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> and continue with the
+ next <i>context</i>. The <a class="tref internalDFN" title="base-iri" href="#dfn-base-iri">base <abbr title="Internationalized Resource Identifier">IRI</abbr></a> of the
+ <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> is set to the <abbr title="Internationalized Resource Identifier">IRI</abbr> of the currently being processed
+ document (which might be different from the currently being processed context),
+ if available; otherwise to <a class="tref internalDFN" title="null" href="#dfn-null">null</a>. If set, the
+ <code class="idlMemberName"><a href="#widl-JsonLdOptions-base">base</a></code>
+ option of a <a class="tref internalDFN" title="json-ld-api-implementation" href="#dfn-json-ld-api-implementation">JSON-LD API Implementation</a> overrides the <a class="tref internalDFN" title="base-iri" href="#dfn-base-iri">base <abbr title="Internationalized Resource Identifier">IRI</abbr></a>.</li>
+ <li>If <i>context</i> is a <a class="tref internalDFN" title="string" href="#dfn-string">string</a>,
+ <ol class="algorithm">
+ <li>Set <i>context</i> to the result of resolving <i>value</i> against
+ the base <abbr title="Internationalized Resource Identifier">IRI</abbr> which is established as specified in
+ <cite><a href="http://tools.ietf.org/html/rfc3986#section-5.1">section 5.1 Establishing a Base URI</a></cite>
+ of [<cite><a class="bibref" href="#bib-RFC3986">RFC3986</a></cite>]. Only the basic algorithm in
+ <cite><a href="http://tools.ietf.org/html/rfc3986#section-5.2">section 5.2</a></cite>
+ of [<cite><a class="bibref" href="#bib-RFC3986">RFC3986</a></cite>] is used; neither
+ <cite><a href="http://tools.ietf.org/html/rfc3986#section-6.2.2">Syntax-Based Normalization</a></cite> nor
+ <cite><a href="http://tools.ietf.org/html/rfc3986#section-6.2.3">Scheme-Based Normalization</a></cite>
+ are performed. Characters additionally allowed in <abbr title="Internationalized Resource Identifier">IRI</abbr>
+ references are treated in the same way that unreserved
+ characters are treated in URI references, per
+ <cite><a href="http://tools.ietf.org/html/rfc3987#section-6.5">section 6.5</a></cite>
+ of [<cite><a class="bibref" href="#bib-RFC3987">RFC3987</a></cite>].</li>
+ <li>If <i>context</i> is in the <i>remote contexts</i> array, a
+ <code class="error"><a href="#idl-def-JsonLdErrorCode.recursive-context-inclusion">recursive context inclusion</a></code>
+ error has been detected and processing is aborted;
+ otherwise, add <i>context</i> to <i>remote contexts</i>.</li>
+ <li>Dereference <i>context</i>. If <i>context</i> cannot be dereferenced, a
+ <code class="error"><a href="#idl-def-JsonLdErrorCode.loading-remote-context-failed">loading remote context failed</a></code>
+ error has been detected and processing is aborted. If the dereferenced document has no
+ top-level <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> with an <code>@context</code> member, an
+ <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid-remote-context">invalid remote context</a></code>
+ has been detected and processing is aborted; otherwise,
+ set <i>context</i> to the value of that member.</li>
+ <li>Set <i>result</i> to the result of recursively calling this algorithm,
+ passing <i>result</i> for <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>,
+ <i>context</i> for <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a>, and <i>remote contexts</i>.</li>
+ <li>Continue with the next <i>context</i>.</li>
+ </ol>
+ </li>
+ <li>If <i>context</i> is not a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>, an
+ <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid-local-context">invalid local context</a></code>
+ error has been detected and processing is aborted.</li>
+ <li>If <i>context</i> has an <code>@base</code> key and <i>remote contexts</i> is empty, i.e., the currently
+ being processed context is not a remote context:
+ <ol class="algorithm">
+ <li>Initialize <i>value</i> to the value associated with the
+ <code>@base</code> key.</li>
+ <li>If <i>value</i> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, remove the
+ <a class="tref internalDFN" title="base-iri" href="#dfn-base-iri">base <abbr title="Internationalized Resource Identifier">IRI</abbr></a> of <i>result</i>.</li>
+ <li>Otherwise, if <i>value</i> is an <a class="tref internalDFN" title="absolute-iri" href="#dfn-absolute-iri">absolute <abbr title="Internationalized Resource Identifier">IRI</abbr></a>,
+ the <a class="tref internalDFN" title="base-iri" href="#dfn-base-iri">base <abbr title="Internationalized Resource Identifier">IRI</abbr></a> of <i>result</i> is set to <i>value</i>.</li>
+ <li>Otherwise, if <i>value</i> is a <a class="tref internalDFN" title="relative-iri" href="#dfn-relative-iri">relative <abbr title="Internationalized Resource Identifier">IRI</abbr></a> and
+ the <a class="tref internalDFN" title="base-iri" href="#dfn-base-iri">base <abbr title="Internationalized Resource Identifier">IRI</abbr></a> of <i>result</i> is not <a class="tref internalDFN" title="null" href="#dfn-null">null</a>,
+ set the <a class="tref internalDFN" title="base-iri" href="#dfn-base-iri">base <abbr title="Internationalized Resource Identifier">IRI</abbr></a> of <i>result</i> to the result of
+ resolving <i>value</i> against the current <a class="tref internalDFN" title="base-iri" href="#dfn-base-iri">base <abbr title="Internationalized Resource Identifier">IRI</abbr></a>
+ of <i>result</i>.</li>
+ <li>Otherwise, an
+ <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid-base-IRI">invalid base <abbr title="Internationalized Resource Identifier">IRI</abbr></a></code>
+ error has been detected and processing is aborted.</li>
+ </ol>
+ </li>
+ <li>If <i>context</i> has an <code>@vocab</code> key:
+ <ol class="algorithm">
+ <li>Initialize <i>value</i> to the value associated with the
+ <code>@vocab</code> key.</li>
+ <li>If <i>value</i> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, remove
+ any <a class="tref internalDFN" title="vocabulary-mapping" href="#dfn-vocabulary-mapping">vocabulary mapping</a> from <i>result</i>.</li>
+ <li>Otherwise, if <i>value</i> is an <a class="tref internalDFN" title="absolute-iri" href="#dfn-absolute-iri">absolute <abbr title="Internationalized Resource Identifier">IRI</abbr></a>
+ or <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a>, the <a class="tref internalDFN" title="vocabulary-mapping" href="#dfn-vocabulary-mapping">vocabulary mapping</a>
+ of <i>result</i> is set to <i>value</i>. If it is not an
+ <a class="tref internalDFN" title="absolute-iri" href="#dfn-absolute-iri">absolute <abbr title="Internationalized Resource Identifier">IRI</abbr></a> or <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a>, an
+ <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid-vocab-mapping">invalid vocab mapping</a></code>
+ error has been detected and processing is aborted.</li>
+ </ol>
+ </li>
+ <li>If <i>context</i> has an <code>@language</code> key:
+ <ol class="algorithm">
+ <li>Initialize <i>value</i> to the value associated with the
+ <code>@language</code> key.</li>
+ <li>If <i>value</i> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, remove
+ any <a class="tref internalDFN" title="default-language" href="#dfn-default-language">default language</a> from <i>result</i>.</li>
+ <li>Otherwise, if <i>value</i> is <a class="tref internalDFN" title="string" href="#dfn-string">string</a>, the
+ <a class="tref internalDFN" title="default-language" href="#dfn-default-language">default language</a> of <i>result</i> is set to
+ lowercased <i>value</i>. If it is not a <a class="tref internalDFN" title="string" href="#dfn-string">string</a>, an
+ <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid-default-language">invalid default language</a></code>
+ error has been detected and processing is aborted.</li>
+ </ol>
+ </li>
+ <li>Create a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> <i>defined</i> to use to keep
+ track of whether or not a <a class="tref internalDFN" title="term" href="#dfn-term">term</a> has already been defined
+ or currently being defined during recursion.</li>
+ <li>For each <i>key</i>-<i>value</i> pair in <i>context</i> where
+ <i>key</i> is not <code>@base</code>, <code>@vocab</code>, or
+ <code>@language</code>, invoke the
+ <a href="#create-term-definition">Create Term Definition algorithm</a>,
+ passing <i>result</i> for <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>,
+ <i>context</i> for <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a>, <i>key</i>,
+ and <i>defined</i>.</li>
+ </ol>
+ </li>
+ <li>Return <i>result</i>.</li>
+ </ol>
+ </section>
+ </section> <!-- end of Context Processing -->
+
+ <section id="create-term-definition">
+ <h3><span class="secno">6.2 </span>Create Term Definition</h3>
+
+ <p>This algorithm is called from the
+ <a href="#context-processing-algorithm">Context Processing algorithm</a>
+ to create a <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> in the <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>
+ for a <a class="tref internalDFN" title="term" href="#dfn-term">term</a> being processed in a <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a>.</p>
+
+ <section class="informative">
+ <h4 id="overview-1">Overview</h4><p><em>This section is non-normative.</em></p>
+
+ <p><a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">Term definitions</a> are created by
+ parsing the information in the given <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a> for the
+ given <a class="tref internalDFN" title="term" href="#dfn-term">term</a>. If the given <a class="tref internalDFN" title="term" href="#dfn-term">term</a> is a
+ <a class="tref internalDFN" title="compact-iri" href="#dfn-compact-iri">compact <abbr title="Internationalized Resource Identifier">IRI</abbr></a>, it may omit an <a class="tref internalDFN" title="iri-mapping" href="#dfn-iri-mapping"><abbr title="Internationalized Resource Identifier">IRI</abbr> mapping</a> by
+ depending on its <a class="tref internalDFN" title="prefix" href="#dfn-prefix">prefix</a> having its own
+ <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a>. If the <a class="tref internalDFN" title="prefix" href="#dfn-prefix">prefix</a> is
+ a key in the <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a>, then its <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a>
+ must first be created, through recursion, before continuing. Because a
+ <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> can depend on other
+ <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definitions</a>, a mechanism must
+ be used to detect cyclical dependencies. The solution employed here
+ uses a map, <i>defined</i>, that keeps track of whether or not a
+ <a class="tref internalDFN" title="term" href="#dfn-term">term</a> has been defined or is currently in the process of
+ being defined. This map is checked before any recursion is attempted.</p>
+
+ <p>After all dependencies for a <a class="tref internalDFN" title="term" href="#dfn-term">term</a> have been defined, the rest of
+ the information in the <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a> for the given
+ <a class="tref internalDFN" title="term" href="#dfn-term">term</a> is taken into account, creating the appropriate
+ <a class="tref internalDFN" title="iri-mapping" href="#dfn-iri-mapping"><abbr title="Internationalized Resource Identifier">IRI</abbr> mapping</a>, <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mapping</a>, and
+ <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a> or <a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">language mapping</a> for the
+ <a class="tref internalDFN" title="term" href="#dfn-term">term</a>.</p>
+ </section>
+
+ <section>
+ <h4 id="algorithm-1">Algorithm</h4>
+
+ <p>The algorithm has four required inputs which are:
+ an <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, a <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a>,
+ a <i>term</i>, and a map <i>defined</i>.</p>
+
+ <ol class="algorithm">
+ <li>If <i>defined</i> contains the key <i>term</i> and the associated
+ value is <a class="tref internalDFN" title="true" href="#dfn-true">true</a> (indicating that the
+ <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> has already been created), return. Otherwise,
+ if the value is <a class="tref internalDFN" title="false" href="#dfn-false">false</a>, a
+ <code class="error"><a href="#idl-def-JsonLdErrorCode.cyclic-IRI-mapping">cyclic <abbr title="Internationalized Resource Identifier">IRI</abbr> mapping</a></code>
+ error has been detected and processing is aborted.</li>
+ <li>Set the value associated with <i>defined</i>'s <i>term</i> key to
+ <a class="tref internalDFN" title="false" href="#dfn-false">false</a>. This indicates that the <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a>
+ is now being created but is not yet complete.</li>
+ <li>Since <a class="tref internalDFN" title="keyword" href="#dfn-keyword">keywords</a> cannot be overridden,
+ <i>term</i> must not be a <a class="tref internalDFN" title="keyword" href="#dfn-keyword">keyword</a>. Otherwise, a
+ <code class="error"><a href="#idl-def-JsonLdErrorCode.keyword-redefinition">keyword redefinition</a></code>
+ error has been detected and processing is aborted.</li>
+ <li>Remove any existing <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> for <i>term</i> in
+ <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>.</li>
+ <li>Initialize <i>value</i> to a copy of the value associated with the key
+ <i>term</i> in <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a>.</li>
+ <li>If <i>value</i> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a> or <i>value</i>
+ is a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> containing the key-value pair
+ <code>@id</code>-<a class="tref internalDFN" title="null" href="#dfn-null">null</a>, set the
+ <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> in <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> to
+ <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, set the value associated with <i>defined</i>'s
+ key <i>term</i> to <a class="tref internalDFN" title="true" href="#dfn-true">true</a>, and return.</li>
+ <li>Otherwise, if <i>value</i> is a <a class="tref internalDFN" title="string" href="#dfn-string">string</a>, convert it
+ to a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> consisting of a single member whose
+ key is <code>@id</code> and whose value is <i>value</i>.</li>
+ <li>Otherwise, <i>value</i> must be a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>, if not, an
+ <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid-term-definition">invalid term definition</a></code>
+ error has been detected and processing is aborted.</li>
+ <li>Create a new <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a>, <i>definition</i>.</li>
+ <li>If <i>value</i> contains the key <code>@type</code>:
+ <ol class="algorithm">
+ <li>Initialize <i>type</i> to the value associated with the
+ <code>@type</code> key, which must be a <a class="tref internalDFN" title="string" href="#dfn-string">string</a>. Otherwise, an
+ <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid-type-mapping">invalid type mapping</a></code>
+ error has been detected and processing is aborted.</li>
+ <li>Set <i>type</i> to the result of using the
+ <a href="#iri-expansion"><abbr title="Internationalized Resource Identifier">IRI</abbr> Expansion algorithm</a>, passing
+ <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, <i>type</i> for <i>value</i>,
+ <a class="tref internalDFN" title="true" href="#dfn-true">true</a> for <i>vocab</i>,
+ <a class="tref internalDFN" title="false" href="#dfn-false">false</a> for <i>document relative</i>,
+ <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a>, and <i>defined</i>. If the expanded <i>type</i> is
+ neither <code>@id</code>, nor <code>@vocab</code>, nor an <a class="tref internalDFN" title="absolute-iri" href="#dfn-absolute-iri">absolute <abbr title="Internationalized Resource Identifier">IRI</abbr></a>, an
+ <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid-type-mapping">invalid type mapping</a></code>
+ error has been detected and processing is aborted.</li>
+ <li>Set the <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a> for <i>definition</i> to <i>type</i>.</li>
+ </ol>
+ </li>
+ <li>If <i>value</i> contains the key <code>@reverse</code>:
+ <ol class="algorithm">
+ <li>If <i>value</i> contains an <code>@id</code>, member, an
+ <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid-reverse-property">invalid reverse property</a></code>
+ error has been detected and processing is aborted.</li>
+ <li>If the value associated with the <code>@reverse</code> key
+ is not a <a class="tref internalDFN" title="string" href="#dfn-string">string</a>, an
+ <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid-IRI-mapping">invalid <abbr title="Internationalized Resource Identifier">IRI</abbr> mapping</a></code>
+ error has been detected and processing is aborted.</li>
+ <li>Otherwise, set the <a class="tref internalDFN" title="iri-mapping" href="#dfn-iri-mapping"><abbr title="Internationalized Resource Identifier">IRI</abbr> mapping</a> of <i>definition</i> to the
+ result of using the <a href="#iri-expansion"><abbr title="Internationalized Resource Identifier">IRI</abbr> Expansion algorithm</a>,
+ passing <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, the value associated with
+ the <code>@reverse</code> key for <i>value</i>, <a class="tref internalDFN" title="true" href="#dfn-true">true</a>
+ for <i>vocab</i>, <a class="tref internalDFN" title="false" href="#dfn-false">false</a> for <i>document relative</i>,
+ <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a>, and <i>defined</i>. If the result
+ is not an <a class="tref internalDFN" title="absolute-iri" href="#dfn-absolute-iri">absolute <abbr title="Internationalized Resource Identifier">IRI</abbr></a>, i.e., it contains no
+ colon (<code>:</code>), an
+ <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid-IRI-mapping">invalid <abbr title="Internationalized Resource Identifier">IRI</abbr> mapping</a></code>
+ error has been detected and processing is aborted.</li>
+ <li>If <i>value</i> contains an <code>@container</code> member,
+ set the <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mapping</a> of <i>definition</i>
+ to its value; if its value is neither <code>@set</code>, nor
+ <code>@index</code>, nor <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, an
+ <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid-reverse-property">invalid reverse property</a></code>
+ error has been detected (reverse properties only support set- and
+ index-containers) and processing is aborted.</li>
+ <li>Set the <a class="tref internalDFN" title="reverse-property" href="#dfn-reverse-property">reverse property</a> flag of <i>definition</i>
+ to <a class="tref internalDFN" title="true" href="#dfn-true">true</a>.</li>
+ <li>Set the <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> of <i>term</i> in
+ <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> to <i>definition</i> and the
+ value associated with <i>defined</i>'s key <i>term</i> to
+ <a class="tref internalDFN" title="true" href="#dfn-true">true</a> and return.</li>
+ </ol>
+ </li>
+ <li>Set the <a class="tref internalDFN" title="reverse-property" href="#dfn-reverse-property">reverse property</a> flag of <i>definition</i>
+ to <a class="tref internalDFN" title="false" href="#dfn-false">false</a>.</li>
+ <li>If <i>value</i> contains the key <code>@id</code> and its value
+ does not equal <i>term</i>:
+ <ol class="algorithm">
+ <li>If the value associated with the <code>@id</code> key is not a <a class="tref internalDFN" title="string" href="#dfn-string">string</a>, an
+ <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid-IRI-mapping">invalid <abbr title="Internationalized Resource Identifier">IRI</abbr> mapping</a></code>
+ error has been detected and processing is aborted.</li>
+ <li>Otherwise, set the <a class="tref internalDFN" title="iri-mapping" href="#dfn-iri-mapping"><abbr title="Internationalized Resource Identifier">IRI</abbr> mapping</a> of <i>definition</i> to the
+ result of using the <a href="#iri-expansion"><abbr title="Internationalized Resource Identifier">IRI</abbr> Expansion algorithm</a>, passing
+ <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, the value associated with the <code>@id</code> key for
+ <i>value</i>, <a class="tref internalDFN" title="true" href="#dfn-true">true</a> for <i>vocab</i>,
+ <a class="tref internalDFN" title="false" href="#dfn-false">false</a> for <i>document relative</i>,
+ <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a>, and <i>defined</i>. If the resulting
+ <a class="tref internalDFN" title="iri-mapping" href="#dfn-iri-mapping"><abbr title="Internationalized Resource Identifier">IRI</abbr> mapping</a> equals <code>@context</code>, an
+ <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid-keyword-alias">invalid keyword alias</a></code>
+ error has been detected and processing is aborted.</li>
+ </ol>
+ </li>
+ <li>
+ Otherwise if the <i>term</i> contains a colon (<code>:</code>):
+ <ol class="algorithm">
+ <li>If <i>term</i> is a <a class="tref internalDFN" title="compact-iri" href="#dfn-compact-iri">compact <abbr title="Internationalized Resource Identifier">IRI</abbr></a> with a
+ <a class="tref internalDFN" title="prefix" href="#dfn-prefix">prefix</a> that is a key in <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a>
+ a dependency has been found. Use this algorithm recursively passing
+ <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a>, the
+ <a class="tref internalDFN" title="prefix" href="#dfn-prefix">prefix</a> as <i>term</i>, and <i>defined</i>.</li>
+ <li>If <i>term</i>'s <a class="tref internalDFN" title="prefix" href="#dfn-prefix">prefix</a> has a
+ <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> in <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, set
+ the <a class="tref internalDFN" title="iri-mapping" href="#dfn-iri-mapping"><abbr title="Internationalized Resource Identifier">IRI</abbr> mapping</a> of <i>definition</i> to the result of
+ concatenating the value associated with the <a class="tref internalDFN" title="prefix" href="#dfn-prefix">prefix</a>'s
+ <a class="tref internalDFN" title="iri-mapping" href="#dfn-iri-mapping"><abbr title="Internationalized Resource Identifier">IRI</abbr> mapping</a> and the <i>term</i>'s <i>suffix</i>.</li>
+ <li>Otherwise, <i>term</i> is an <a class="tref internalDFN" title="absolute-iri" href="#dfn-absolute-iri">absolute <abbr title="Internationalized Resource Identifier">IRI</abbr></a>. Set the
+ <a class="tref internalDFN" title="iri-mapping" href="#dfn-iri-mapping"><abbr title="Internationalized Resource Identifier">IRI</abbr> mapping</a> of <i>definition</i> to <i>term</i>.</li>
+ </ol>
+ </li>
+ <li>Otherwise, if <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> has a
+ <a class="tref internalDFN" title="vocabulary-mapping" href="#dfn-vocabulary-mapping">vocabulary mapping</a>, the <a class="tref internalDFN" title="iri-mapping" href="#dfn-iri-mapping"><abbr title="Internationalized Resource Identifier">IRI</abbr> mapping</a>
+ of <i>definition</i> is set to the result of concatenating the value
+ associated with the <a class="tref internalDFN" title="vocabulary-mapping" href="#dfn-vocabulary-mapping">vocabulary mapping</a> and <i>term</i>.
+ If it does not have a <a class="tref internalDFN" title="vocabulary-mapping" href="#dfn-vocabulary-mapping">vocabulary mapping</a>, an
+ <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid-IRI-mapping">invalid <abbr title="Internationalized Resource Identifier">IRI</abbr> mapping</a></code>
+ error been detected and processing is aborted.</li>
+ <li>If <i>value</i> contains the key <code>@container</code>:
+ <ol class="algorithm">
+ <li>Initialize <i>container</i> to the value associated with the
+ <code>@container</code> key, which must be either
+ <code>@list</code>, <code>@set</code>, <code>@index</code>,
+ or <code>@language</code>. Otherwise, an
+ <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid-container-mapping">invalid container mapping</a></code> error
+ has been detected and processing is aborted.</li>
+ <li>Set the <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mapping</a> of <i>definition</i> to
+ <i>container</i>.</li>
+ </ol>
+ </li>
+ <li>If <i>value</i> contains the key <code>@language</code> and
+ does not contain the key <code>@type</code>:
+ <ol class="algorithm">
+ <li>Initialize <i>language</i> to the value associated with the
+ <code>@language</code> key, which must be either <a class="tref internalDFN" title="null" href="#dfn-null">null</a>
+ or a <a class="tref internalDFN" title="string" href="#dfn-string">string</a>. Otherwise, an
+ <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid-language-mapping">invalid language mapping</a></code>
+ error has been detected and processing is aborted.</li>
+ <li>If <i>language</i> is a <a class="tref internalDFN" title="string" href="#dfn-string">string</a> set it to
+ lowercased <i>language</i>. Set the <a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">language mapping</a>
+ of <i>definition</i> to <i>language</i>.</li>
+ </ol>
+ </li>
+ <li>Set the <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> of <i>term</i> in
+ <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> to <i>definition</i> and set the value
+ associated with <i>defined</i>'s key <i>term</i> to
+ <a class="tref internalDFN" title="true" href="#dfn-true">true</a>.</li>
+ </ol>
+ </section>
+ </section> <!-- end of Term Creation -->
+
+ <section id="iri-expansion">
+ <h3><span class="secno">6.3 </span><abbr title="Internationalized Resource Identifier">IRI</abbr> Expansion</h3>
+
+ <p>In JSON-LD documents, some keys and values may represent
+ <a class="tref internalDFN" title="iri" href="#dfn-iri">IRIs</a>. This section defines an algorithm for
+ transforming a <a class="tref internalDFN" title="string" href="#dfn-string">string</a> that represents an <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a> into
+ an <a class="tref internalDFN" title="absolute-iri" href="#dfn-absolute-iri">absolute <abbr title="Internationalized Resource Identifier">IRI</abbr></a> or <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a>.
+ It also covers transforming <a class="tref internalDFN" title="keyword-alias" href="#dfn-keyword-alias">keyword aliases</a>
+ into <a class="tref internalDFN" title="keyword" href="#dfn-keyword">keywords</a>.</p>
+
+ <p><a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a> expansion may occur during context processing or during
+ any of the other JSON-LD algorithms. If <abbr title="Internationalized Resource Identifier">IRI</abbr> expansion occurs during context
+ processing, then the <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a> and its related <i>defined</i>
+ map from the <a href="#context-processing-algorithm">Context Processing algorithm</a>
+ are passed to this algorithm. This allows for <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a>
+ dependencies to be processed via the
+ <a href="#create-term-definition">Create Term Definition algorithm</a>.</p>
+
+ <section class="informative">
+ <h4 id="overview-2">Overview</h4><p><em>This section is non-normative.</em></p>
+
+ <p>In order to expand <i>value</i> to an <a class="tref internalDFN" title="absolute-iri" href="#dfn-absolute-iri">absolute <abbr title="Internationalized Resource Identifier">IRI</abbr></a>, we must
+ first determine if it is <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, a <a class="tref internalDFN" title="term" href="#dfn-term">term</a>, a
+ <a class="tref internalDFN" title="keyword-alias" href="#dfn-keyword-alias">keyword alias</a>, or some form of <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a>. Based on what
+ we find, we handle the specific kind of expansion; for example, we expand
+ a <a class="tref internalDFN" title="keyword-alias" href="#dfn-keyword-alias">keyword alias</a> to a <a class="tref internalDFN" title="keyword" href="#dfn-keyword">keyword</a> and a <a class="tref internalDFN" title="term" href="#dfn-term">term</a>
+ to an <a class="tref internalDFN" title="absolute-iri" href="#dfn-absolute-iri">absolute <abbr title="Internationalized Resource Identifier">IRI</abbr></a> according to its <a class="tref internalDFN" title="iri-mapping" href="#dfn-iri-mapping"><abbr title="Internationalized Resource Identifier">IRI</abbr> mapping</a>
+ in the <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>. While inspecting <i>value</i> we
+ may also find that we need to create <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a>
+ dependencies because we're running this algorithm during context processing.
+ We can tell whether or not we're running during context processing by
+ checking <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a> against <a class="tref internalDFN" title="null" href="#dfn-null">null</a>.
+ We know we need to create a <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> in the
+ <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> when <i>value</i> is
+ a key in the <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a> and the <i>defined</i> map
+ does not have a key for <i>value</i> with an associated value of
+ <a class="tref internalDFN" title="true" href="#dfn-true">true</a>. The <i>defined</i> map is used during
+ <a href="#context-processing-algorithm">Context Processing</a> to keep track of
+ which <a class="tref internalDFN" title="term" href="#dfn-term">terms</a> have already been defined or are
+ in the process of being defined. We create a
+ <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> by using the
+ <a href="#create-term-definition">Create Term Definition algorithm</a>.</p>
+ </section>
+
+ <section>
+ <h4 id="algorithm-2">Algorithm</h4>
+
+ <p>The algorithm takes two required and four optional input variables. The
+ required inputs are an <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> and a <i>value</i>
+ to be expanded. The optional inputs are two flags,
+ <i>document relative</i> and <i>vocab</i>, that specifying
+ whether <i>value</i> can be interpreted as a <a class="tref internalDFN" title="relative-iri" href="#dfn-relative-iri">relative <abbr title="Internationalized Resource Identifier">IRI</abbr></a>
+ against the document's base <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a> or the
+ <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context's</a>
+ <a class="tref internalDFN" title="vocabulary-mapping" href="#dfn-vocabulary-mapping">vocabulary mapping</a>, respectively, and
+ a <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a> and a map <i>defined</i> to be used when
+ this algorithm is used during <a href="#context-processing-algorithm">Context Processing</a>.
+ If not passed, the two flags are set to <code>false</code> and
+ <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a> and <i>defined</i> are initialized to <a class="tref internalDFN" title="null" href="#dfn-null">null</a>.</p>
+
+ <ol class="algorithm">
+ <li>If <i>value</i> is a <a class="tref internalDFN" title="keyword" href="#dfn-keyword">keyword</a> or <a class="tref internalDFN" title="null" href="#dfn-null">null</a>,
+ return <i>value</i> as is.</li>
+ <li>If <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a> is not <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, it contains
+ a key that equals <i>value</i>, and the value associated with the key
+ that equals <i>value</i> in <i>defined</i> is not <a class="tref internalDFN" title="true" href="#dfn-true">true</a>,
+ invoke the <a href="#create-term-definition">Create Term Definition algorithm</a>,
+ passing <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a>,
+ <i>value</i> as <i>term</i>, and <i>defined</i>. This will ensure that
+ a <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> is created for <i>value</i> in
+ <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> during <a href="#context-processing-algorithm">Context Processing</a>.
+ </li>
+ <li>If <i>vocab</i> is <a class="tref internalDFN" title="true" href="#dfn-true">true</a> and the
+ <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> has a <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> for
+ <i>value</i>, return the associated <a class="tref internalDFN" title="iri-mapping" href="#dfn-iri-mapping"><abbr title="Internationalized Resource Identifier">IRI</abbr> mapping</a>.</li>
+ <li>If <i>value</i> contains a colon (<code>:</code>), it is either
+ an <a class="tref internalDFN" title="absolute-iri" href="#dfn-absolute-iri">absolute <abbr title="Internationalized Resource Identifier">IRI</abbr></a> or a <a class="tref internalDFN" title="compact-iri" href="#dfn-compact-iri">compact <abbr title="Internationalized Resource Identifier">IRI</abbr></a>:
+ <ol class="algorithm">
+ <li>Split <i>value</i> into a <a class="tref internalDFN" title="prefix" href="#dfn-prefix">prefix</a> and <i>suffix</i>
+ at the first occurrence of a colon (<code>:</code>).</li>
+ <li>If <a class="tref internalDFN" title="prefix" href="#dfn-prefix">prefix</a> is underscore (<code>_</code>)
+ or <i>suffix</i> begins with double-forward-slash
+ (<code>//</code>), return <i>value</i> as it is already an
+ <a class="tref internalDFN" title="absolute-iri" href="#dfn-absolute-iri">absolute <abbr title="Internationalized Resource Identifier">IRI</abbr></a> or a <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a>.</li>
+ <li>If <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a> is not <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, it
+ contains a key that equals <a class="tref internalDFN" title="prefix" href="#dfn-prefix">prefix</a>, and the value
+ associated with the key that equals <i>prefix</i> in <i>defined</i>
+ is not <a class="tref internalDFN" title="true" href="#dfn-true">true</a>, invoke the
+ <a href="#create-term-definition">Create Term Definition algorithm</a>,
+ passing <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>,
+ <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a>, <i>prefix</i> as <i>term</i>,
+ and <i>defined</i>. This will ensure that a
+ <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> is created for <a class="tref internalDFN" title="prefix" href="#dfn-prefix">prefix</a>
+ in <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> during
+ <a href="#context-processing-algorithm">Context Processing</a>.</li>
+ <li>If <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> contains a <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a>
+ for <a class="tref internalDFN" title="prefix" href="#dfn-prefix">prefix</a>, return the result of concatenating
+ the <a class="tref internalDFN" title="iri-mapping" href="#dfn-iri-mapping"><abbr title="Internationalized Resource Identifier">IRI</abbr> mapping</a> associated with <a class="tref internalDFN" title="prefix" href="#dfn-prefix">prefix</a> and
+ <i>suffix</i>.</li>
+ <li>Return <i>value</i> as it is already an <a class="tref internalDFN" title="absolute-iri" href="#dfn-absolute-iri">absolute <abbr title="Internationalized Resource Identifier">IRI</abbr></a>.</li>
+ </ol>
+ </li>
+ <li>If <i>vocab</i> is <a class="tref internalDFN" title="true" href="#dfn-true">true</a>, and
+ <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> has a <a class="tref internalDFN" title="vocabulary-mapping" href="#dfn-vocabulary-mapping">vocabulary mapping</a>,
+ return the result of concatenating the <a class="tref internalDFN" title="vocabulary-mapping" href="#dfn-vocabulary-mapping">vocabulary mapping</a>
+ with <i>value</i>.</li>
+ <li>Otherwise, if <i>document relative</i> is <a class="tref internalDFN" title="true" href="#dfn-true">true</a>,
+ set <i>value</i> to the result of resolving <i>value</i> against
+ the <a class="tref internalDFN" title="base-iri" href="#dfn-base-iri">base <abbr title="Internationalized Resource Identifier">IRI</abbr></a>. Only the basic algorithm in
+ <cite><a href="http://tools.ietf.org/html/rfc3986#section-5.2">section 5.2</a></cite>
+ of [<cite><a class="bibref" href="#bib-RFC3986">RFC3986</a></cite>] is used; neither
+ <cite><a href="http://tools.ietf.org/html/rfc3986#section-6.2.2">Syntax-Based Normalization</a></cite> nor
+ <cite><a href="http://tools.ietf.org/html/rfc3986#section-6.2.3">Scheme-Based Normalization</a></cite>
+ are performed. Characters additionally allowed in <abbr title="Internationalized Resource Identifier">IRI</abbr> references are treated
+ in the same way that unreserved characters are treated in URI references, per
+ <cite><a href="http://tools.ietf.org/html/rfc3987#section-6.5">section 6.5</a></cite>
+ of [<cite><a class="bibref" href="#bib-RFC3987">RFC3987</a></cite>].</li>
+ <li>If <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a> is not <a class="tref internalDFN" title="null" href="#dfn-null">null</a> and
+ <i>value</i> is not an <a class="tref internalDFN" title="absolute-iri" href="#dfn-absolute-iri">absolute <abbr title="Internationalized Resource Identifier">IRI</abbr></a>, an
+ <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid-IRI-mapping">invalid <abbr title="Internationalized Resource Identifier">IRI</abbr> mapping</a></code>
+ error has been detected and processing is aborted.</li>
+ <li>Otherwise, return <i>value</i> as is.</li>
+ </ol>
+ </section>
+ </section> <!-- end of IRI Expansion -->
+</section> <!-- end of Context Processing section -->
+
+
+<section id="expansion-algorithms">
+ <!--OddPage--><h2><span class="secno">7. </span>Expansion Algorithms</h2>
+
+ <section id="expansion-algorithm">
+ <h3><span class="secno">7.1 </span>Expansion Algorithm</h3>
+
+ <p>This algorithm expands a JSON-LD document, such that all <a class="tref internalDFN" title="context" href="#dfn-context">context</a>
+ definitions are removed, all <a class="tref internalDFN" title="term" href="#dfn-term">terms</a> and
+ <a class="tref internalDFN" title="compact-iri" href="#dfn-compact-iri">compact IRIs</a> are expanded to
+ <a class="tref internalDFN" title="absolute-iri" href="#dfn-absolute-iri">absolute IRIs</a>,
+ <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifiers</a>, or
+ <a class="tref internalDFN" title="keyword" href="#dfn-keyword">keywords</a> and all
+ <a class="tref internalDFN" title="json-ld-value" href="#dfn-json-ld-value">JSON-LD values</a> are expressed in
+ <a class="tref internalDFN" title="array" href="#dfn-array">arrays</a> in <a class="tref internalDFN" title="expanded-form" href="#dfn-expanded-form">expanded form</a>.</p>
+
+ <section class="informative">
+ <h4 id="overview-3">Overview</h4><p><em>This section is non-normative.</em></p>
+
+ <p>Starting with its root <i>element</i>, we can process the
+ JSON-LD document recursively, until we have a fully
+ <a class="tref internalDFN" title="expansion" href="#dfn-expansion">expanded</a> <i>result</i>. When
+ <a class="tref internalDFN" title="expansion" href="#dfn-expansion">expanding</a> an <i>element</i>, we can treat
+ each one differently according to its type, in order to break down the
+ problem:</p>
+
+ <ol>
+ <li>If the <i>element</i> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, there is nothing
+ to expand.</li>
+ <li>Otherwise, if <i>element</i> is a <a class="tref internalDFN" title="scalar" href="#dfn-scalar">scalar</a>, we expand it
+ according to the <a href="#value-expansion">Value Expansion algorithm</a>.</li>
+ <li>Otherwise, if the <i>element</i> is an <a class="tref internalDFN" title="array" href="#dfn-array">array</a>, then we expand
+ each of its items recursively and return them in a new
+ <a class="tref internalDFN" title="array" href="#dfn-array">array</a>.</li>
+ <li>Otherwise, <i>element</i> is a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>. We expand
+ each of its keys, adding them to our <i>result</i>, and then we expand
+ each value for each key recursively. Some of the keys will be
+ <a class="tref internalDFN" title="term" href="#dfn-term">terms</a> or
+ <a class="tref internalDFN" title="compact-iri" href="#dfn-compact-iri">compact IRIs</a> and others will be
+ <a class="tref internalDFN" title="keyword" href="#dfn-keyword">keywords</a> or simply ignored because
+ they do not have definitions in the <a class="tref internalDFN" title="context" href="#dfn-context">context</a>. Any
+ <a class="tref internalDFN" title="iri" href="#dfn-iri">IRIs</a> will be expanded using the
+ <a href="#iri-expansion"><abbr title="Internationalized Resource Identifier">IRI</abbr> Expansion algorithm</a>.
+ </li>
+ </ol>
+
+ <p>Finally, after ensuring <i>result</i> is in an <a class="tref internalDFN" title="array" href="#dfn-array">array</a>,
+ we return <i>result</i>.</p>
+ </section>
+
+ <section>
+ <h4 id="algorithm-3">Algorithm</h4>
+
+ <p>The algorithm takes three input variables: an <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>,
+ an <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>, and an <i>element</i> to be expanded.
+ To begin, the <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a> is set to <a class="tref internalDFN" title="null" href="#dfn-null">null</a>,
+ and <i>element</i> is set to the <a class="tref internalDFN" title="json-ld-input" href="#dfn-json-ld-input">JSON-LD input</a>.</p>
+
+ <ol class="algorithm">
+ <li>If <i>element</i> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, return <a class="tref internalDFN" title="null" href="#dfn-null">null</a>.</li>
+ <li>If <i>element</i> is a <a class="tref internalDFN" title="scalar" href="#dfn-scalar">scalar</a>,
+ <ol class="algorithm">
+ <li>If <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a> or <code>@graph</code>,
+ drop the free-floating <a class="tref internalDFN" title="scalar" href="#dfn-scalar">scalar</a> by returning <a class="tref internalDFN" title="null" href="#dfn-null">null</a>.</li>
+ <li>Return the result of the
+ <a href="#value-expansion">Value Expansion algorithm</a>, passing the
+ <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>, and
+ <i>element</i> as <i>value</i>.</li>
+ </ol>
+ </li>
+ <li>If <i>element</i> is an <a class="tref internalDFN" title="array" href="#dfn-array">array</a>,
+ <ol class="algorithm">
+ <li>Initialize an empty array, <i>result</i>.</li>
+ <li>For each <i>item</i> in <i>element</i>:
+ <ol class="algorithm">
+ <li>Initialize <i>expanded item</i> to the result of using this
+ algorithm recursively, passing <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>,
+ <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>, and <i>item</i> as <i>element</i>.</li>
+ <li>If the <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a> is <code>@list</code> or its
+ <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mapping</a> is set to <code>@list</code>, the
+ <i>expanded item</i> must not be an <a class="tref internalDFN" title="array" href="#dfn-array">array</a> or a
+ <a class="tref internalDFN" title="list-object" href="#dfn-list-object">list object</a>, otherwise a
+ <code class="error"><a href="#idl-def-JsonLdErrorCode.list-of-lists">list of lists</a></code>
+ error has been detected and processing is aborted.</li>
+ <li>If <i>expanded item</i> is an <a class="tref internalDFN" title="array" href="#dfn-array">array</a>, append each
+ of its items to <i>result</i>. Otherwise, if
+ <i>expanded item</i> is not null, append it to <i>result</i>.</li>
+ </ol>
+ </li>
+ <li>Return <i>result</i>.</li>
+ </ol>
+ </li>
+ <li>Otherwise <i>element</i> is a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>.</li>
+ <li>If <i>element</i> contains the key <code>@context</code>, set
+ <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> to the result of the
+ <a href="#context-processing-algorithm">Context Processing algorithm</a>,
+ passing <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> and the value of the
+ <code>@context</code> key as <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a>.</li>
+ <li>Initialize an empty <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>, <i>result</i>.</li>
+ <li>For each <i>key</i> and <i>value</i> in <i>element</i>,
+ ordered lexicographically by <i>key</i>:
+ <ol class="algorithm">
+ <li>If <i>key</i> is <code>@context</code>, continue to
+ the next <i>key</i>.</li>
+ <li>Set <i>expanded property</i> to the result of
+ using the <a href="#iri-expansion"><abbr title="Internationalized Resource Identifier">IRI</abbr> Expansion algorithm</a>,
+ passing <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, <i>key</i> for
+ <i>value</i>, and <a class="tref internalDFN" title="true" href="#dfn-true">true</a> for <i>vocab</i>.</li>
+ <li>If <i>expanded property</i> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a> or it neither
+ contains a colon (<code>:</code>) nor it is a <a class="tref internalDFN" title="keyword" href="#dfn-keyword">keyword</a>,
+ drop <i>key</i> by continuing to the next <i>key</i>.</li>
+ <li>If <i>expanded property</i> is a <a class="tref internalDFN" title="keyword" href="#dfn-keyword">keyword</a>:
+ <ol class="algorithm">
+ <li>If <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a> equals <code>@reverse</code>, an
+ <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid-reverse-property-map">invalid reverse property map</a></code>
+ error has been detected and processing is aborted.</li>
+ <li>If <i>result</i> has already an <i>expanded property</i> member, an
+ <code class="error"><a href="#idl-def-JsonLdErrorCode.colliding-keywords">colliding keywords</a></code>
+ error has been detected and processing is aborted.</li>
+ <li>If <i>expanded property</i> is <code>@id</code> and
+ <i>value</i> is not a <a class="tref internalDFN" title="string" href="#dfn-string">string</a>, an
+ <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid--id-value">invalid @id value</a></code>
+ error has been detected and processing is aborted. Otherwise,
+ set <i>expanded value</i> to the result of using the
+ <a href="#iri-expansion"><abbr title="Internationalized Resource Identifier">IRI</abbr> Expansion algorithm</a>,
+ passing <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, <i>value</i>, and <a class="tref internalDFN" title="true" href="#dfn-true">true</a>
+ for <i>document relative</i>.</li>
+ <li>If <i>expanded property</i> is <code>@type</code> and <i>value</i>
+ is neither a <a class="tref internalDFN" title="string" href="#dfn-string">string</a> nor an <a class="tref internalDFN" title="array" href="#dfn-array">array</a> of
+ <a class="tref internalDFN" title="string" href="#dfn-string">strings</a>, an
+ <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid-type-value">invalid type value</a></code>
+ error has been detected and processing is aborted. Otherwise,
+ set <i>expanded value</i> to the result of using the
+ <a href="#iri-expansion"><abbr title="Internationalized Resource Identifier">IRI</abbr> Expansion algorithm</a>, passing
+ <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, <a class="tref internalDFN" title="true" href="#dfn-true">true</a> for <i>vocab</i>,
+ and <a class="tref internalDFN" title="true" href="#dfn-true">true</a> for <i>document relative</i> to expand the <i>value</i>
+ or each of its items.</li>
+ <li>If <i>expanded property</i> is <code>@graph</code>, set
+ <i>expanded value</i> to the result of using this algorithm
+ recursively passing <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, <code>@graph</code>
+ for <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>, and <i>value</i> for <i>element</i>.</li>
+ <li>If <i>expanded property</i> is <code>@value</code> and
+ <i>value</i> is not a <a class="tref internalDFN" title="scalar" href="#dfn-scalar">scalar</a> or <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, an
+ <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid-value-object-value">invalid value object value</a></code>
+ error has been detected and processing is aborted. Otherwise,
+ set <i>expanded value</i> to <i>value</i>. If <i>expanded value</i>
+ is <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, set the <code>@value</code>
+ member of <i>result</i> to <a class="tref internalDFN" title="null" href="#dfn-null">null</a> and continue with the
+ next <i>key</i> from <i>element</i>. Null values need to be preserved
+ in this case as the meaning of an <code>@type</code> member depends
+ on the existence of an <code>@value</code> member.</li>
+ <li>If <i>expanded property</i> is <code>@language</code> and
+ <i>value</i> is not a <a class="tref internalDFN" title="string" href="#dfn-string">string</a>, an
+ <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid-language-tagged-string">invalid language-tagged string</a></code>
+ error has been detected and processing is aborted. Otherwise,
+ set <i>expanded value</i> to lowercased <i>value</i>.</li>
+ <li>If <i>expanded property</i> is <code>@index</code> and
+ <i>value</i> is not a <a class="tref internalDFN" title="string" href="#dfn-string">string</a>, an
+ <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid--index-value">invalid @index value</a></code>
+ error has been detected and processing is aborted. Otherwise,
+ set <i>expanded value</i> to <i>value</i>.</li>
+ <li>If <i>expanded property</i> is <code>@list</code>:
+ <ol class="algorithm">
+ <li>If <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a> or
+ <code>@graph</code>, continue with the next <i>key</i>
+ from <i>element</i> to remove the free-floating list.</li>
+ <li>Otherwise, initialize <i>expanded value</i> to the result of using
+ this algorithm recursively passing <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>,
+ <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>, and <i>value</i> for <i>element</i>.</li>
+ <li>If <i>expanded value</i> is a <a class="tref internalDFN" title="list-object" href="#dfn-list-object">list object</a>, a
+ <code class="error"><a href="#idl-def-JsonLdErrorCode.list-of-lists">list of lists</a></code>
+ error has been detected and processing is aborted.</li>
+ </ol>
+ </li>
+ <li>If <i>expanded property</i> is <code>@set</code>, set
+ <i>expanded value</i> to the result of using this algorithm
+ recursively, passing <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>,
+ <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>, and <i>value</i> for
+ <i>element</i>.</li>
+ <li>If <i>expanded property</i> is <code>@reverse</code> and
+ <i>value</i> is not a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>, an
+ <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid--reverse-value">invalid @reverse value</a></code>
+ error has been detected and processing is aborted. Otherwise
+ <ol class="algorithm">
+ <li>Initialize <i>expanded value</i> to the result of using this
+ algorithm recursively, passing <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>,
+ <code>@reverse</code> as <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>, and
+ <i>value</i> as <i>element</i>.</li>
+ <li>If <i>expanded value</i> contains an <code>@reverse</code> member,
+ i.e., properties that are reversed twice, execute for each of its
+ <i>property</i> and <i>item</i> the following steps:
+ <ol class="algorithm">
+ <li>If <i>result</i> does not have a <i>property</i> member, create
+ one and set its value to an empty <a class="tref internalDFN" title="array" href="#dfn-array">array</a>.</li>
+ <li>Append <i>item</i> to the value of the <i>property</i> member
+ of <i>result</i>.</li>
+ </ol>
+ </li>
+ <li>If <i>expanded value</i> contains members other than <code>@reverse</code>:
+ <ol class="algorithm">
+ <li>If <i>result</i> does not have an <code>@reverse</code> member, create
+ one and set its value to an empty <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>.</li>
+ <li>Reference the value of the <code>@reverse</code> member in <i>result</i>
+ using the variable <i>reverse map</i>.</li>
+ <li>For each <i>property</i> and <i>items</i> in <i>expanded value</i>
+ other than <code>@reverse</code>:
+ <ol class="algorithm">
+ <li>For each <i>item</i> in <i>items</i>:
+ <ol class="algorithm">
+ <li>If <i>item</i> is a <a class="tref internalDFN" title="value-object" href="#dfn-value-object">value object</a> or <a class="tref internalDFN" title="list-object" href="#dfn-list-object">list object</a>, an
+ <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid--reverse-value">invalid reverse property value</a></code>
+ has been detected and processing is aborted.</li>
+ <li>If <i>reverse map</i> has no <i>property</i> member, create one
+ and initialize its value to an empty <a class="tref internalDFN" title="array" href="#dfn-array">array</a>.</li>
+ <li>Append <i>item</i> to the value of the <i>property</i>
+ member in <i>reverse map</i>.</li>
+ </ol>
+ </li>
+ </ol>
+ </li>
+ </ol>
+ </li>
+ <li>Continue with the next <i>key</i> from <i>element</i>.</li>
+ </ol>
+ </li>
+ <li>Unless <i>expanded value</i> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, set
+ the <i>expanded property</i> member of <i>result</i> to
+ <i>expanded value</i>.</li>
+ <li>Continue with the next <i>key</i> from <i>element</i>.</li>
+ </ol>
+ </li>
+ <li>Otherwise, if <i>key</i>'s <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mapping</a> in
+ <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> is <code>@language</code> and
+ <i>value</i> is a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> then <i>value</i>
+ is expanded from a <a class="tref externalDFN" title="language-map" href="http://www.w3.org/TR/2013/CR-json-ld-20130822/#dfn-language-map">language map</a>
+ as follows:
+ <ol class="algorithm">
+ <li>Initialize <i>expanded value</i> to an empty
+ <a class="tref internalDFN" title="array" href="#dfn-array">array</a>.</li>
+ <li>For each key-value pair <i>language</i>-<i>language value</i>
+ in <i>value</i>, ordered lexicographically by <i>language</i>:
+ <ol class="algorithm">
+ <li>If <i>language value</i> is not an <a class="tref internalDFN" title="array" href="#dfn-array">array</a>
+ set it to an <a class="tref internalDFN" title="array" href="#dfn-array">array</a> containing only
+ <i>language value</i>.</li>
+ <li>For each <i>item</i> in <i>language value</i>:
+ <ol class="algorithm">
+ <li><i>item</i> must be a <a class="tref internalDFN" title="string" href="#dfn-string">string</a>,
+ otherwise an
+ <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid-language-map-value">invalid language map value</a></code>
+ error has been detected and processing is aborted.</li>
+ <li>Append a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> to
+ <i>expanded value</i> that consists of two
+ key-value pairs: (<code>@value</code>-<i>item</i>)
+ and (<code>@language</code>-lowercased
+ <i>language</i>).</li>
+ </ol>
+ </li>
+ </ol>
+ </li>
+ </ol>
+ </li>
+ <li>Otherwise, if <i>key</i>'s <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mapping</a> in
+ <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> is <code>@index</code> and
+ <i>value</i> is a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> then <i>value</i>
+ is expanded from an index map as follows:
+ <ol class="algorithm">
+ <li>Initialize <i>expanded value</i> to an empty
+ <a class="tref internalDFN" title="array" href="#dfn-array">array</a>.</li>
+ <li>For each key-value pair <i>index</i>-<i>index value</i>
+ in <i>value</i>, ordered lexicographically by <i>index</i>:
+ <ol class="algorithm">
+ <li>If <i>index value</i> is not an <a class="tref internalDFN" title="array" href="#dfn-array">array</a>
+ set it to an <a class="tref internalDFN" title="array" href="#dfn-array">array</a> containing only
+ <i>index value</i>.</li>
+ <li>Initialize <i>index value</i> to the result of
+ using this algorithm recursively, passing
+ <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>,
+ <i>key</i> as <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>,
+ and <i>index value</i> as <i>element</i>.</li>
+ <li>For each <i>item</i> in <i>index value</i>:
+ <ol class="algorithm">
+ <li>If <i>item</i> does not have the key
+ <code>@index</code>, add the key-value pair
+ (<code>@index</code>-<i>index</i>) to
+ <i>item</i>.</li>
+ <li>Append <i>item</i> to <i>expanded value</i>.</li>
+ </ol>
+ </li>
+ </ol>
+ </li>
+ </ol>
+ </li>
+ <li>Otherwise, initialize <i>expanded value</i> to the result of
+ using this algorithm recursively, passing <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>,
+ <i>key</i> for <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>, and <i>value</i>
+ for <i>element</i>.</li>
+ <li>If <i>expanded value</i> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, ignore <i>key</i>
+ by continuing to the next <i>key</i> from <i>element</i>.</li>
+ <li>If the <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mapping</a> associated to <i>key</i> in
+ <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> is <code>@list</code> and
+ <i>expanded value</i> is not already a <a class="tref internalDFN" title="list-object" href="#dfn-list-object">list object</a>,
+ convert <i>expanded value</i> to a <a class="tref internalDFN" title="list-object" href="#dfn-list-object">list object</a>
+ by first setting it to an <a class="tref internalDFN" title="array" href="#dfn-array">array</a> containing only
+ <i>expanded value</i> if it is not already an <a class="tref internalDFN" title="array" href="#dfn-array">array</a>,
+ and then by setting it to a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> containing
+ the key-value pair <code>@list</code>-<i>expanded value</i>.</li>
+ <li>Otherwise, if the <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> associated to
+ <i>key</i> indicates that it is a <a class="tref internalDFN" title="reverse-property" href="#dfn-reverse-property">reverse property</a>
+ <ol class="algorithm">
+ <li>If <i>result</i> has no <code>@reverse</code> member, create
+ one and initialize its value to an empty <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>.</li>
+ <li>Reference the value of the <code>@reverse</code> member in <i>result</i>
+ using the variable <i>reverse map</i>.</li>
+ <li>If <i>expanded value</i> is not an <a class="tref internalDFN" title="array" href="#dfn-array">array</a>, set
+ it to an <a class="tref internalDFN" title="array" href="#dfn-array">array</a> containing <i>expanded value</i>.</li>
+ <li>For each <i>item</i> in <i>expanded value</i>
+ <ol class="algorithm">
+ <li>If <i>item</i> is a <a class="tref internalDFN" title="value-object" href="#dfn-value-object">value object</a> or <a class="tref internalDFN" title="list-object" href="#dfn-list-object">list object</a>, an
+ <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid--reverse-value">invalid reverse property value</a></code>
+ has been detected and processing is aborted.</li>
+ <li>If <i>reverse map</i> has no <i>expanded property</i> member,
+ create one and initialize its value to an empty <a class="tref internalDFN" title="array" href="#dfn-array">array</a>.</li>
+ <li>Append <i>item</i> to the value of the <i>expanded property</i>
+ member of <i>reverse map</i>.</li>
+ </ol>
+ </li>
+ </ol>
+ </li>
+ <li>Otherwise, if <i>key</i> is not a <a class="tref internalDFN" title="reverse-property" href="#dfn-reverse-property">reverse property</a>:
+ <ol class="algorithm">
+ <li>If <i>result</i> does not have an <i>expanded property</i>
+ member, create one and initialize its value to an empty
+ <a class="tref internalDFN" title="array" href="#dfn-array">array</a>.</li>
+ <li>Append <i>expanded value</i> to value of the <i>expanded property</i>
+ member of <i>result</i>.</li>
+ </ol>
+ </li>
+ </ol>
+ </li>
+ <li>If <i>result</i> contains the key <code>@value</code>:
+ <ol class="algorithm">
+ <li>The <i>result</i> must not contain any keys other than
+ <code>@value</code>, <code>@language</code>, <code>@type</code>,
+ and <code>@index</code>. It must not contain both the
+ <code>@language</code> key and the <code>@type</code> key.
+ Otherwise, an
+ <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid-value-object">invalid value object</a></code>
+ error has been detected and processing is aborted.</li>
+ <li>If the value of <i>result</i>'s <code>@value</code> key is
+ <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, then set <i>result</i> to <a class="tref internalDFN" title="null" href="#dfn-null">null</a>.</li>
+ <li>Otherwise, if the value of <i>result</i>'s <code>@value</code> member
+ is not a <a class="tref internalDFN" title="string" href="#dfn-string">string</a> and <i>result</i> contains the key
+ <code>@language</code>, an
+ <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid-language-tagged-value">invalid language-tagged value</a></code>
+ error has been detected (only <a class="tref internalDFN" title="string" href="#dfn-string">strings</a>
+ can be language-tagged) and processing is aborted.</li>
+ <li>Otherwise, if the <i>result</i> has a <code>@type</code> member
+ and its value is not an <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a>, an
+ <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid-typed-value">invalid typed value</a></code>
+ error has been detected and processing is aborted.</li>
+ </ol>
+ </li>
+ <li>Otherwise, if <i>result</i> contains the key <code>@type</code>
+ and its associated value is not an <a class="tref internalDFN" title="array" href="#dfn-array">array</a>, set it to
+ an <a class="tref internalDFN" title="array" href="#dfn-array">array</a> containing only the associated value.</li>
+ <li>Otherwise, if <i>result</i> contains the key <code>@set</code>
+ or <code>@list</code>:
+ <ol class="algorithm">
+ <li>The <i>result</i> must contain at most one other key and that
+ key must be <code>@index</code>. Otherwise, an
+ <code class="error"><a href="#idl-def-JsonLdErrorCode.invalid-set-or-list-object">invalid set or list object</a></code>
+ error has been detected and processing is aborted.</li>
+ <li>If <i>result</i> contains the key <code>@set</code>, then
+ set <i>result</i> to the key's associated value.</li>
+ </ol>
+ </li>
+ <li>If <i>result</i> contains only the key
+ <code>@language</code>, set <i>result</i> to <a class="tref internalDFN" title="null" href="#dfn-null">null</a>.</li>
+ <li>If <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a> or <code>@graph</code>,
+ drop free-floating values as follows:
+ <ol class="algorithm">
+ <li>If <i>result</i> is an empty <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> or contains
+ the keys <code>@value</code> or <code>@list</code>, set <i>result</i> to
+ <a class="tref internalDFN" title="null" href="#dfn-null">null</a>.</li>
+ <li>Otherwise, if <i>result</i> is a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> whose only
+ key is <code>@id</code>, set <i>result</i> to <a class="tref internalDFN" title="null" href="#dfn-null">null</a>.</li>
+ </ol>
+ </li>
+ <li>Return <i>result</i>.</li>
+ </ol>
+
+ <p>If, after the above algorithm is run, the result is a
+ <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> that contains only an <code>@graph</code> key, set the
+ result to the value of <code>@graph</code>'s value. Otherwise, if the result
+ is <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, set it to an empty <a class="tref internalDFN" title="array" href="#dfn-array">array</a>. Finally, if
+ the result is not an <a class="tref internalDFN" title="array" href="#dfn-array">array</a>, then set the result to an
+ <a class="tref internalDFN" title="array" href="#dfn-array">array</a> containing only the result.</p>
+ </section>
+ </section> <!-- end of Expansion Algorithm -->
+
+
+ <section id="value-expansion">
+ <h3><span class="secno">7.2 </span>Value Expansion</h3>
+
+ <p>Some values in JSON-LD can be expressed in a
+ <a class="tref internalDFN" title="compacted-form" href="#dfn-compacted-form">compact form</a>. These values are required
+ to be <a class="tref internalDFN" title="expansion" href="#dfn-expansion">expanded</a> at times when processing
+ JSON-LD documents. A value is said to be in <dfn title="expanded-form" id="dfn-expanded-form">expanded form</dfn>
+ after the application of this algorithm.</p>
+
+ <section class="informative">
+ <h4 id="overview-4">Overview</h4><p><em>This section is non-normative.</em></p>
+
+ <p>If <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a> has a <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a> in the
+ <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> set to <code>@id</code> or <code>@vocab</code>,
+ a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> with a single member <code>@id</code> whose
+ value is the result of using the
+ <a href="#iri-expansion"><abbr title="Internationalized Resource Identifier">IRI</abbr> Expansion algorithm</a> on <i>value</i>
+ is returned.</p>
+
+ <p>Otherwise, the result will be a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> containing
+ an <code>@value</code> member whose value is the passed <i>value</i>.
+ Additionally, an <code>@type</code> member will be included if there is a
+ <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a> associated with the <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>
+ or an <code>@language</code> member if <i>value</i> is a
+ <a class="tref internalDFN" title="string" href="#dfn-string">string</a> and there is <a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">language mapping</a> associated
+ with the <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>.</p>
+ </section>
+
+ <section>
+ <h4 id="algorithm-4">Algorithm</h4>
+
+ <p>The algorithm takes three required inputs: an <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>,
+ an <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>, and a <i>value</i> to expand.</p>
+
+ <ol class="algorithm">
+ <li>If the <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a> has a <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a>
+ in <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> that is <code>@id</code>, return a new
+ <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> containing a single key-value pair where the
+ key is <code>@id</code> and the value is the result of using the
+ <a href="#iri-expansion"><abbr title="Internationalized Resource Identifier">IRI</abbr> Expansion algorithm</a>, passing
+ <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, <i>value</i>, and <a class="tref internalDFN" title="true" href="#dfn-true">true</a> for
+ <i>document relative</i>.</li>
+ <li>If <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a> has a <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a> in
+ <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> that is <code>@vocab</code>, return
+ a new <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> containing a single key-value pair
+ where the key is <code>@id</code> and the value is the result of
+ using the <a href="#iri-expansion"><abbr title="Internationalized Resource Identifier">IRI</abbr> Expansion algorithm</a>, passing
+ <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, <i>value</i>, <a class="tref internalDFN" title="true" href="#dfn-true">true</a> for
+ <i>vocab</i>, and <a class="tref internalDFN" title="true" href="#dfn-true">true</a> for
+ <i>document relative</i>.</li>
+ <li>Otherwise, initialize <i>result</i> to a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>
+ with an <code>@value</code> member whose value is set to
+ <i>value</i>.</li>
+ <li>If <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a> has a <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a> in
+ <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, add an <code>@type</code> member to
+ <i>result</i> and set its value to the value associated with the
+ <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a>.</li>
+ <li>Otherwise, if <i>value</i> is a <a class="tref internalDFN" title="string" href="#dfn-string">string</a>:
+ <ol class="algorithm">
+ <li>If a <a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">language mapping</a> is associated with
+ <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a> in <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>,
+ add an <code>@language</code> to <i>result</i> and set its
+ value to the language code associated with the
+ <a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">language mapping</a>; unless the
+ <a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">language mapping</a> is set to <a class="tref internalDFN" title="null" href="#dfn-null">null</a> in
+ which case no member is added.</li>
+ <li>Otherwise, if the <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> has a
+ <a class="tref internalDFN" title="default-language" href="#dfn-default-language">default language</a>, add an <code>@language</code>
+ to <i>result</i> and set its value to the
+ <a class="tref internalDFN" title="default-language" href="#dfn-default-language">default language</a>.</li>
+ </ol>
+ </li>
+ <li>Return <i>result</i>.</li>
+ </ol>
+ </section>
+ </section> <!-- end of Value Expansion -->
+
+</section> <!-- end of Expansion section -->
+
+
+<section id="compaction-algorithms">
+ <!--OddPage--><h2><span class="secno">8. </span>Compaction Algorithms</h2>
+
+ <section id="compaction-algorithm">
+ <h3><span class="secno">8.1 </span>Compaction Algorithm</h3>
+
+ <p>This algorithm compacts a JSON-LD document, such that the given
+ <a class="tref internalDFN" title="context" href="#dfn-context">context</a> is applied. This must result in shortening
+ any applicable <a class="tref internalDFN" title="iri" href="#dfn-iri">IRIs</a> to
+ <a class="tref internalDFN" title="term" href="#dfn-term">terms</a> or
+ <a class="tref internalDFN" title="compact-iri" href="#dfn-compact-iri">compact IRIs</a>, any applicable
+ <a class="tref internalDFN" title="keyword" href="#dfn-keyword">keywords</a> to
+ <a class="tref internalDFN" title="keyword-alias" href="#dfn-keyword-alias">keyword aliases</a>, and
+ any applicable <a class="tref internalDFN" title="json-ld-value" href="#dfn-json-ld-value">JSON-LD values</a>
+ expressed in <a class="tref internalDFN" title="expanded-form" href="#dfn-expanded-form">expanded form</a> to simple values such as
+ <a class="tref internalDFN" title="string" href="#dfn-string">strings</a> or
+ <a class="tref internalDFN" title="number" href="#dfn-number">numbers</a>.</p>
+
+ <section class="informative">
+ <h4 id="overview-5">Overview</h4><p><em>This section is non-normative.</em></p>
+
+ <p>Starting with its root <i>element</i>, we can process the
+ JSON-LD document recursively, until we have a fully
+ <a class="tref internalDFN" title="compaction" href="#dfn-compaction">compacted</a> <i>result</i>. When
+ <a class="tref internalDFN" title="compaction" href="#dfn-compaction">compacting</a> an <i>element</i>, we can treat
+ each one differently according to its type, in order to break down the
+ problem:</p>
+
+ <ol>
+ <li>If the <i>element</i> is a <a class="tref internalDFN" title="scalar" href="#dfn-scalar">scalar</a>, it is
+ already in <a class="tref internalDFN" title="compacted-form" href="#dfn-compacted-form">compacted form</a>, so we simply return it.</li>
+ <li>If the <i>element</i> is an <a class="tref internalDFN" title="array" href="#dfn-array">array</a>, we compact
+ each of its items recursively and return them in a new
+ <a class="tref internalDFN" title="array" href="#dfn-array">array</a>.</li>
+ <li>Otherwise <i>element</i> is a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>. The value
+ of each key in element is compacted recursively. Some of the keys will be
+ compacted, using the <a href="#iri-compaction"><abbr title="Internationalized Resource Identifier">IRI</abbr> Compaction algorithm</a>,
+ to <a class="tref internalDFN" title="term" href="#dfn-term">terms</a> or <a class="tref internalDFN" title="compact-iri" href="#dfn-compact-iri">compact IRIs</a>
+ and others will be compacted from <a class="tref internalDFN" title="keyword" href="#dfn-keyword">keywords</a> to
+ <a class="tref internalDFN" title="keyword-alias" href="#dfn-keyword-alias">keyword aliases</a> or simply left
+ unchanged because they do not have definitions in the <a class="tref internalDFN" title="context" href="#dfn-context">context</a>.
+ Values will be converted to <a class="tref internalDFN" title="compacted-form" href="#dfn-compacted-form">compacted form</a> via the
+ <a href="#value-compaction">Value Compaction algorithm</a>. Some data
+ will be reshaped based on <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mappings</a>
+ specified in the context such as <code>@index</code> or <code>@language</code>
+ maps.</li>
+ </ol>
+
+ <p>The final output is a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> with a <code>@context</code>
+ key, if a non-empty <a class="tref internalDFN" title="context" href="#dfn-context">context</a> was given, where the <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>
+ is either <i>result</i> or a wrapper for it where <i>result</i> appears
+ as the value of an (aliased) <code>@graph</code> key because <i>result</i>
+ contained two or more items in an <a class="tref internalDFN" title="array" href="#dfn-array">array</a>.</p>
+ </section>
+
+ <section>
+ <h4 id="algorithm-5">Algorithm</h4>
+
+ <p>The algorithm takes five required input variables: an <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>,
+ an <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a>, an <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>, an
+ <i>element</i> to be compacted, and a flag
+ <code class="idlMemberName"><a href="#widl-JsonLdOptions-compactArrays">compactArrays</a></code>.
+ To begin, the <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> is set to the result of
+ performing <a href="#context-processing-algorithm">Context Processing</a>
+ on the passed <a class="tref internalDFN" title="context" href="#dfn-context">context</a>, the <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a> is
+ set to the result of performing the
+ <a href="#inverse-context-creation">Inverse Context Creation algorithm</a>
+ on <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, the <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a> is
+ set to <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, <i>element</i> is set to the result of
+ performing the <a href="#expansion-algorithm">Expansion algorithm</a>
+ on the <a class="tref internalDFN" title="json-ld-input" href="#dfn-json-ld-input">JSON-LD input</a>, and, if not passed,
+ <code class="idlMemberName"><a href="#widl-JsonLdOptions-compactArrays">compactArrays</a></code>
+ is set to <a class="tref internalDFN" title="true" href="#dfn-true">true</a>.</p>
+
+ <ol class="algorithm">
+ <li>If <i>element</i> is a <a class="tref internalDFN" title="scalar" href="#dfn-scalar">scalar</a>, it is already in its most
+ compact form, so simply return <i>element</i>.</li>
+ <li>If <i>element</i> is an <a class="tref internalDFN" title="array" href="#dfn-array">array</a>:
+ <ol class="algorithm">
+ <li>Initialize <i>result</i> to an empty <a class="tref internalDFN" title="array" href="#dfn-array">array</a>.</li>
+ <li>For each <i>item</i> in <i>element</i>:
+ <ol class="algorithm">
+ <li>Initialize <i>compacted item</i> to the result of using this
+ algorithm recursively, passing <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>,
+ <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a>, <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>, and
+ <em>item</em> for <i>element</i>.</li>
+ <li>If <i>compacted item</i> is not <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, then append
+ it to <i>result</i>.</li>
+ </ol>
+ </li>
+ <li>If <i>result</i> contains only one item (it has a length of
+ <code>1</code>), <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a> has no
+ <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mapping</a> in <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, and
+ <code class="idlMemberName"><a href="#widl-JsonLdOptions-compactArrays">compactArrays</a></code>
+ is <a class="tref internalDFN" title="true" href="#dfn-true">true</a>, set <i>result</i> to its only item.</li>
+ <li>Return <i>result</i>.</li>
+ </ol>
+ </li>
+ <li>Otherwise <i>element</i> is a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>.</li>
+ <li>If <i>element</i> has an <code>@value</code> or <code>@id</code>
+ member and the result of using the
+ <a href="#value-compaction">Value Compaction algorithm</a>,
+ passing <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a>,
+ <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>,and <i>element</i> as <i>value</i> is
+ a <a class="tref internalDFN" title="scalar" href="#dfn-scalar">scalar</a>, return that result.</li>
+ <li>Initialize <i>inside reverse</i> to <a class="tref internalDFN" title="true" href="#dfn-true">true</a> if
+ <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a> equals <code>@reverse</code>,
+ otherwise to <a class="tref internalDFN" title="false" href="#dfn-false">false</a>.</li>
+ <li>Initialize <i>result</i> to an empty <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>.</li>
+ <li>For each key <i>expanded property</i> and value <i>expanded value</i>
+ in <i>element</i>, ordered lexicographically by <i>expanded property</i>:
+ <ol class="algorithm">
+ <li>If <i>expanded property</i> is <code>@id</code> or
+ <code>@type</code>:
+ <ol class="algorithm">
+ <li>If <i>expanded value</i> is a <a class="tref internalDFN" title="string" href="#dfn-string">string</a>,
+ then initialize <i>compacted value</i> to the result
+ of using the <a href="#iri-compaction"><abbr title="Internationalized Resource Identifier">IRI</abbr> Compaction algorithm</a>,
+ passing <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a>,
+ <i>expanded value</i> for <i>iri</i>,
+ and <a class="tref internalDFN" title="true" href="#dfn-true">true</a> for <i>vocab</i> if
+ <i>expanded property</i> is <code>@type</code>,
+ <a class="tref internalDFN" title="false" href="#dfn-false">false</a> otherwise.</li>
+ <li>Otherwise, <i>expanded value</i> must be a
+ <code>@type</code> <a class="tref internalDFN" title="array" href="#dfn-array">array</a>:
+ <ol class="algorithm">
+ <li>Initialize <i>compacted value</i> to an empty
+ <a class="tref internalDFN" title="array" href="#dfn-array">array</a>.</li>
+ <li>For each item <i>expanded type</i> in
+ <i>expanded value</i>, append the result of
+ of using the <a href="#iri-compaction"><abbr title="Internationalized Resource Identifier">IRI</abbr> Compaction algorithm</a>,
+ passing <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a>,
+ <i>expanded type</i> for <i>iri</i>, and
+ <a class="tref internalDFN" title="true" href="#dfn-true">true</a> for <i>vocab</i>,
+ to <i>compacted value</i>.</li>
+ <li>If <i>compacted value</i> contains only one
+ item (it has a length of <code>1</code>), then
+ set <i>compacted value</i> to its only item.</li>
+ </ol>
+ </li>
+ <li>Initialize <i>alias</i> to the result of using the
+ <a href="#iri-compaction"><abbr title="Internationalized Resource Identifier">IRI</abbr> Compaction algorithm</a>,
+ passing <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a>,
+ <i>expanded property</i> for <i>iri</i>,
+ and <a class="tref internalDFN" title="true" href="#dfn-true">true</a> for <i>vocab</i>.</li>
+ <li>Add a member <i>alias</i> to <i>result</i> whose value is
+ set to <i>compacted value</i> and continue to the next
+ <i>expanded property</i>.</li>
+ </ol>
+ </li>
+ <li>If <i>expanded property</i> is <code>@reverse</code>:
+ <ol class="algorithm">
+ <li>Initialize <i>compacted value</i> to the result of using this
+ algorithm recursively, passing <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>,
+ <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a>, <code>@reverse</code> for
+ <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>, and <i>expanded value</i>
+ for <i>element</i>.</li>
+ <li>For each <i>property</i> and <i>value</i> in <i>compacted value</i>:
+ <ol class="algorithm">
+ <li>If the <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> for <i>property</i> in the
+ <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> indicates that <i>property</i> is
+ a <a class="tref internalDFN" title="reverse-property" href="#dfn-reverse-property">reverse property</a>
+ <ol class="algorithm">
+ <li>If the <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> for <i>property</i> in
+ the <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> has a
+ <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mapping</a> of <code>@set</code> or
+ <code class="idlMemberName"><a href="#widl-JsonLdOptions-compactArrays">compactArrays</a></code>
+ is <a class="tref internalDFN" title="false" href="#dfn-false">false</a>, and <i>value</i> is not an
+ <a class="tref internalDFN" title="array" href="#dfn-array">array</a>, set <i>value</i> to a new
+ <a class="tref internalDFN" title="array" href="#dfn-array">array</a> containing only <i>value</i>.</li>
+ <li>If <i>property</i> is not a member of
+ <i>result</i>, add one and set its value to <i>value</i>.</li>
+ <li>Otherwise, if the value of the <i>property</i> member of
+ <i>result</i> is not an <a class="tref internalDFN" title="array" href="#dfn-array">array</a>, set it to a new
+ <a class="tref internalDFN" title="array" href="#dfn-array">array</a> containing only the value. Then
+ append <i>value</i> to its value if <i>value</i>
+ is not an <a class="tref internalDFN" title="array" href="#dfn-array">array</a>, otherwise append each
+ of its items.</li>
+ <li>Remove the <i>property</i> member from
+ <i>compacted value</i>.</li>
+ </ol>
+ </li>
+ </ol>
+ </li>
+ <li>If <i>compacted value</i> has some remaining members, i.e.,
+ it is not an empty <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>:
+ <ol class="algorithm">
+ <li>Initialize <i>alias</i> to the result of using the
+ <a href="#iri-compaction"><abbr title="Internationalized Resource Identifier">IRI</abbr> Compaction algorithm</a>,
+ passing <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a>,
+ <code>@reverse</code> for <i>iri</i>,
+ and <a class="tref internalDFN" title="true" href="#dfn-true">true</a> for <i>vocab</i>.</li>
+ <li>Set the value of the <i>alias</i> member of <i>result</i> to
+ <i>compacted value</i>.</li>
+ </ol>
+ </li>
+ <li>Continue with the next <i>expanded property</i> from <i>element</i>.</li>
+ </ol>
+ </li>
+ <li>If <i>expanded property</i> is <code>@index</code> and
+ <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a> has a <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mapping</a>
+ in <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> that is <code>@index</code>,
+ then the compacted result will be inside of an <code>@index</code>
+ container, drop the <code>@index</code> property by continuing
+ to the next <i>expanded property</i>.</li>
+ <li>Otherwise, if <i>expanded property</i> is <code>@index</code>,
+ <code>@value</code>, or <code>@language</code>:
+ <ol class="algorithm">
+ <li>Initialize <i>alias</i> to the result of using
+ the <a href="#iri-compaction"><abbr title="Internationalized Resource Identifier">IRI</abbr> Compaction algorithm</a>,
+ passing <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a>,
+ <i>expanded property</i> for <i>iri</i>,
+ and <a class="tref internalDFN" title="true" href="#dfn-true">true</a> for <i>vocab</i>.</li>
+ <li>Add a member <i>alias</i> to <i>result</i> whose value is
+ set to <i>expanded value</i> and continue with the next
+ <i>expanded property</i>.</li>
+ </ol>
+ </li>
+ <li>If <i>expanded value</i> is an empty <a class="tref internalDFN" title="array" href="#dfn-array">array</a>:
+ <ol class="algorithm">
+ <li>Initialize <i>item active property</i> to the result of
+ using the <a href="#iri-compaction"><abbr title="Internationalized Resource Identifier">IRI</abbr> Compaction algorithm</a>,
+ passing <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a>,
+ <i>expanded property</i> for <i>iri</i>,
+ <i>expanded value</i> for <i>value</i>,
+ <a class="tref internalDFN" title="true" href="#dfn-true">true</a> for <i>vocab</i>, and
+ <i>inside reverse</i>.</li>
+ <li>If <i>result</i> does not have the key that equals
+ <i>item active property</i>, set this key's value in
+ <i>result</i> to an empty <a class="tref internalDFN" title="array" href="#dfn-array">array</a>. Otherwise, if
+ the key's value is not an <a class="tref internalDFN" title="array" href="#dfn-array">array</a>, then set it
+ to one containing only the value.</li>
+ </ol>
+ </li>
+ <li>
+ At this point, <i>expanded value</i> must be an
+ <a class="tref internalDFN" title="array" href="#dfn-array">array</a> due to the
+ <a href="#expansion-algorithm">Expansion algorithm</a>.
+ For each item <i>expanded item</i> in <i>expanded value</i>:
+ <ol class="algorithm">
+ <li>Initialize <i>item active property</i> to the result of using
+ the <a href="#iri-compaction"><abbr title="Internationalized Resource Identifier">IRI</abbr> Compaction algorithm</a>,
+ passing <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a>,
+ <i>expanded property</i> for <i>iri</i>,
+ <i>expanded item</i> for <i>value</i>,
+ <a class="tref internalDFN" title="true" href="#dfn-true">true</a> for <i>vocab</i>, and
+ <i>inside reverse</i>.</li>
+ <li>Initialize <i>container</i> to <a class="tref internalDFN" title="null" href="#dfn-null">null</a>. If there
+ is a <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mapping</a> for
+ <i>item active property</i> in <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>,
+ set <i>container</i> to its value.</li>
+ <li>Initialize <i>compacted item</i> to the result of using
+ this algorithm recursively, passing
+ <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a>,
+ <i>item active property</i> for <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>,
+ <i>expanded item</i> for <i>element</i> if it does
+ not contain the key <code>@list</code>, otherwise pass
+ the key's associated value for <i>element</i>.</li>
+ <li>
+ If <i>expanded item</i> is a <a class="tref internalDFN" title="list-object" href="#dfn-list-object">list object</a>:
+ <ol class="algorithm">
+ <li>If <i>compacted item</i> is not an <a class="tref internalDFN" title="array" href="#dfn-array">array</a>,
+ then set it to an <a class="tref internalDFN" title="array" href="#dfn-array">array</a> containing only
+ <i>compacted item</i>.</li>
+ <li>If <i>container</i> is not <code>@list</code>:
+ <ol class="algorithm">
+ <li>Convert <i>compacted item</i> to a
+ <a class="tref internalDFN" title="list-object" href="#dfn-list-object">list object</a> by setting it to a
+ <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> containing key-value pair
+ where the key is the result of the
+ <a href="#iri-compaction"><abbr title="Internationalized Resource Identifier">IRI</abbr> Compaction algorithm</a>,
+ passing <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a>,
+ <code>@list</code> for <i>iri</i>, and <i>compacted item</i>
+ for <i>value</i>.</li>
+ <li>If <i>expanded item</i> contains the key
+ <code>@index</code>, then add a key-value pair
+ to <i>compacted item</i> where the key is the
+ result of the <a href="#iri-compaction"><abbr title="Internationalized Resource Identifier">IRI</abbr> Compaction algorithm</a>,
+ passing <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a>,
+ <code>@index</code> as <i>iri</i>, and the value associated with the
+ <code>@index</code> key in <i>expanded item</i> as <i>value</i>.</li>
+ </ol>
+ </li>
+ <li>Otherwise, <i>item active property</i> must not be a key
+ in <i>result</i> because there cannot be two
+ <a class="tref internalDFN" title="list-object" href="#dfn-list-object">list objects</a> associated
+ with an <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a> that has a
+ <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mapping</a>; a
+ <code class="error"><a href="#idl-def-JsonLdErrorCode.compaction-to-list-of-lists">compaction to list of lists</a></code>
+ error has been detected and processing is aborted.</li>
+ </ol>
+ </li>
+ <li>
+ If <i>container</i> is <code>@language</code> or
+ <code>@index</code>:
+ <ol class="algorithm">
+ <li>If <i>item active property</i> is not a key in
+ <i>result</i>, initialize it to an empty <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>.
+ Initialize <i>map object</i> to the value of <i>item active property</i>
+ in <i>result</i>.</li>
+ <li>If <i>container</i> is <code>@language</code> and
+ <i>compacted item</i> contains the key
+ <code>@value</code>, then set <i>compacted item</i>
+ to the value associated with its <code>@value</code> key.</li>
+ <li>Initialize <i>map key</i> to the value associated with
+ with the key that equals <i>container</i> in
+ <i>expanded item</i>.</li>
+ <li>If <i>map key</i> is not a key in <i>map object</i>,
+ then set this key's value in <i>map object</i>
+ to <i>compacted item</i>. Otherwise, if the value
+ is not an <a class="tref internalDFN" title="array" href="#dfn-array">array</a>, then set it to one
+ containing only the value and then append
+ <i>compacted item</i> to it.</li>
+ </ol>
+ </li>
+ <li>
+ Otherwise,
+ <ol class="algorithm">
+ <li>If
+ <code class="idlMemberName"><a href="#widl-JsonLdOptions-compactArrays">compactArrays</a></code>
+ is <a class="tref internalDFN" title="false" href="#dfn-false">false</a>, <i>container</i> is <code>@set</code> or
+ <code>@list</code>, or <i>expanded property</i> is
+ <code>@list</code> or <code>@graph</code> and
+ <i>compacted item</i> is not an <a class="tref internalDFN" title="array" href="#dfn-array">array</a>,
+ set it to a new <a class="tref internalDFN" title="array" href="#dfn-array">array</a>
+ containing only <i>compacted item</i>.</li>
+ <li>If <i>item active property</i> is not a key in
+ <i>result</i> then add the key-value pair,
+ (<i>item active property</i>-<i>compacted item</i>),
+ to <i>result</i>.</li>
+ <li>Otherwise, if the value associated with the key that
+ equals <i>item active property</i> in <i>result</i>
+ is not an <a class="tref internalDFN" title="array" href="#dfn-array">array</a>, set it to a new
+ <a class="tref internalDFN" title="array" href="#dfn-array">array</a> containing only the value. Then
+ append <i>compacted item</i> to the value if
+ <i>compacted item</i> is not an <a class="tref internalDFN" title="array" href="#dfn-array">array</a>,
+ otherwise, concatenate it.</li>
+ </ol>
+ </li>
+ </ol>
+ </li>
+ </ol>
+ </li>
+ <li>Return <i>result</i>.</li>
+ </ol>
+
+ <p>If, after the algorithm outlined above is run, the result <i>result</i>
+ is an <a class="tref internalDFN" title="array" href="#dfn-array">array</a>, replace it with a new
+ <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> with a single member whose key is the result
+ of using the <a href="#iri-compaction"><abbr title="Internationalized Resource Identifier">IRI</abbr> Compaction algorithm</a>,
+ passing <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a>, and
+ <code>@graph</code> as <i>iri</i> and whose value is the <a class="tref internalDFN" title="array" href="#dfn-array">array</a>
+ <i>result</i>. Finally, if a non-empty <i>context</i> has been passed,
+ add an <code>@context</code> member to <i>result</i> and set its value
+ to the passed <i>context</i>.</p>
+ </section>
+ </section> <!-- end of Compaction -->
+
+ <section id="inverse-context-creation">
+ <h3><span class="secno">8.2 </span>Inverse Context Creation</h3>
+
+ <p>When there is more than one <a class="tref internalDFN" title="term" href="#dfn-term">term</a> that could be chosen
+ to compact an <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a>, it has to be ensured that the <a class="tref internalDFN" title="term" href="#dfn-term">term</a>
+ selection is both deterministic and represents the most context-appropriate
+ choice whilst taking into consideration algorithmic complexity.</p>
+
+ <p>In order to make <a class="tref internalDFN" title="term" href="#dfn-term">term</a> selections, the concept of an
+ <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a> is introduced. An <dfn title="inverse-context" id="dfn-inverse-context">inverse context</dfn>
+ is essentially a reverse lookup table that maps
+ <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mappings</a>,
+ <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mappings</a>, and
+ <a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">language mappings</a> to a simple
+ <a class="tref internalDFN" title="term" href="#dfn-term">term</a> for a given <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>. A
+ <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a> only needs to be generated for an
+ <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> if it is being used for <a class="tref internalDFN" title="compaction" href="#dfn-compaction">compaction</a>.</p>
+
+ <p>To make use of an <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a>, a list of preferred
+ <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mappings</a> and the
+ <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a> or <a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">language mapping</a> are gathered
+ for a particular value associated with an <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a>. These parameters
+ are then fed to the <a href="#term-selection">Term Selection algorithm</a>,
+ which will find the <a class="tref internalDFN" title="term" href="#dfn-term">term</a> that most appropriately
+ matches the value's mappings.</p>
+
+ <section class="informative">
+ <h4 id="overview-6">Overview</h4><p><em>This section is non-normative.</em></p>
+
+ <p>To create an <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a> for a given
+ <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, each <a class="tref internalDFN" title="term" href="#dfn-term">term</a> in the
+ <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> is visited, ordered by length, shortest
+ first (ties are broken by choosing the lexicographically least
+ <a class="tref internalDFN" title="term" href="#dfn-term">term</a>). For each <a class="tref internalDFN" title="term" href="#dfn-term">term</a>, an entry is added to
+ the <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a> for each possible combination of
+ <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mapping</a> and <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a>
+ or <a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">language mapping</a> that would legally match the
+ <a class="tref internalDFN" title="term" href="#dfn-term">term</a>. Illegal matches include differences between a
+ value's <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a> or <a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">language mapping</a> and
+ that of the <a class="tref internalDFN" title="term" href="#dfn-term">term</a>. If a <a class="tref internalDFN" title="term" href="#dfn-term">term</a> has no
+ <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mapping</a>, <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a>, or
+ <a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">language mapping</a> (or some combination of these), then it
+ will have an entry in the <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a> using the special
+ key <code>@none</code>. This allows the
+ <a href="#term-selection">Term Selection algorithm</a> to fall back
+ to choosing more generic <a class="tref internalDFN" title="term" href="#dfn-term">terms</a> when a more
+ specifically-matching <a class="tref internalDFN" title="term" href="#dfn-term">term</a> is not available for a particular
+ <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a> and value combination.</p>
+ </section>
+
+ <section>
+ <h4 id="algorithm-6">Algorithm</h4>
+
+ <p>The algorithm takes one required input: the <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> that
+ the <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a> is being created for.</p>
+
+ <ol class="algorithm">
+ <li>Initialize <i>result</i> to an empty <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>.</li>
+ <li>Initialize <i>default language</i> to <code>@none</code>. If the
+ <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> has a <a class="tref internalDFN" title="default-language" href="#dfn-default-language">default language</a>,
+ set <i>default language</i> to it.</li>
+ <li>For each key <a class="tref internalDFN" title="term" href="#dfn-term">term</a> and value <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> in
+ the <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, ordered by shortest <a class="tref internalDFN" title="term" href="#dfn-term">term</a>
+ first (breaking ties by choosing the lexicographically least
+ <a class="tref internalDFN" title="term" href="#dfn-term">term</a>):
+ <ol class="algorithm">
+ <li>If the <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a>,
+ <a class="tref internalDFN" title="term" href="#dfn-term">term</a> cannot be selected during <a class="tref internalDFN" title="compaction" href="#dfn-compaction">compaction</a>,
+ so continue to the next <a class="tref internalDFN" title="term" href="#dfn-term">term</a>.</li>
+ <li>Initialize <i>container</i> to <code>@none</code>. If there
+ is a <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mapping</a> in
+ <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a>, set <i>container</i> to
+ its associated value.</li>
+ <li>Initialize <i>iri</i> to the value of the <a class="tref internalDFN" title="iri-mapping" href="#dfn-iri-mapping"><abbr title="Internationalized Resource Identifier">IRI</abbr> mapping</a>
+ for the <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a>.</li>
+ <li>If <i>iri</i> is not a key in <i>result</i>, add
+ a key-value pair where the key is <i>iri</i> and the value
+ is an empty <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> to <i>result</i>.</li>
+ <li>Reference the value associated with the <i>iri</i> member in
+ <i>result</i> using the variable <i>container map</i>.</li>
+ <li>If <i>container map</i> has no <i>container</i> member,
+ create one and set its value to a new
+ <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> with two members. The first member is
+ <code>@language</code> and its value is a new empty
+ <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>, the second member is <code>@type</code>
+ and its value is a new empty <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>.</li>
+ <li>Reference the value associated with the <i>container</i> member
+ in <i>container map</i> using the variable <i>type/language map</i>.</li>
+ <li>If the <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> indicates that the <a class="tref internalDFN" title="term" href="#dfn-term">term</a>
+ represents a <a class="tref internalDFN" title="reverse-property" href="#dfn-reverse-property">reverse property</a>:
+ <ol class="algorithm">
+ <li>Reference the value associated with the <code>@type</code>
+ member in <i>type/language map</i> using the variable
+ <i>type map</i>.</li>
+ <li>If <i>type map</i> does not have a <code>@reverse</code>
+ member, create one and set its value to the <a class="tref internalDFN" title="term" href="#dfn-term">term</a>
+ being processed.</li>
+ </ol>
+ </li>
+ <li>Otherwise, if <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> has a
+ <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a>:
+ <ol class="algorithm">
+ <li>Reference the value associated with the <code>@type</code>
+ member in <i>type/language map</i> using the variable
+ <i>type map</i>.</li>
+ <li>If <i>type map</i> does not have a member corresponding
+ to the <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a> in <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a>,
+ create one and set its value to the <a class="tref internalDFN" title="term" href="#dfn-term">term</a>
+ being processed.</li>
+ </ol>
+ </li>
+ <li>Otherwise, if <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> has a
+ <a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">language mapping</a> (might be <a class="tref internalDFN" title="null" href="#dfn-null">null</a>):
+ <ol class="algorithm">
+ <li>Reference the value associated with the <code>@language</code>
+ member in <i>type/language map</i> using the variable
+ <i>language map</i>.</li>
+ <li>If the <a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">language mapping</a> equals <a class="tref internalDFN" title="null" href="#dfn-null">null</a>,
+ set <i>language</i> to <code>@null</code>; otherwise set it
+ to the language code in <a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">language mapping</a>.</li>
+ <li>If <i>language map</i> does not have a <i>language</i> member,
+ create one and set its value to the <a class="tref internalDFN" title="term" href="#dfn-term">term</a>
+ being processed.</li>
+ </ol>
+ </li>
+ <li>Otherwise:
+ <ol class="algorithm">
+ <li>Reference the value associated with the <code>@language</code>
+ member in <i>type/language map</i> using the variable
+ <i>language map</i>.</li>
+ <li>If <i>language map</i> does not have a <i>default language</i>
+ member, create one and set its value to the <a class="tref internalDFN" title="term" href="#dfn-term">term</a>
+ being processed.</li>
+ <li>If <i>language map</i> does not have a <code>@none</code>
+ member, create one and set its value to the <a class="tref internalDFN" title="term" href="#dfn-term">term</a>
+ being processed.</li>
+ <li>Reference the value associated with the <code>@type</code>
+ member in <i>type/language map</i> using the variable
+ <i>type map</i>.</li>
+ <li>If <i>type map</i> does not have a <code>@none</code>
+ member, create one and set its value to the <a class="tref internalDFN" title="term" href="#dfn-term">term</a>
+ being processed.</li>
+ </ol>
+ </li>
+ </ol>
+ </li>
+ <li>Return <i>result</i>.</li>
+ </ol>
+ </section>
+ </section> <!-- end of Inverse Context Creation -->
+
+ <section id="iri-compaction">
+ <h3><span class="secno">8.3 </span><abbr title="Internationalized Resource Identifier">IRI</abbr> Compaction</h3>
+
+ <p>This algorithm compacts an <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a> to a <a class="tref internalDFN" title="term" href="#dfn-term">term</a> or
+ <a class="tref internalDFN" title="compact-iri" href="#dfn-compact-iri">compact <abbr title="Internationalized Resource Identifier">IRI</abbr></a>, or a <a class="tref internalDFN" title="keyword" href="#dfn-keyword">keyword</a> to a
+ <a class="tref internalDFN" title="keyword-alias" href="#dfn-keyword-alias">keyword alias</a>. A value that is associated with the
+ <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a> may be passed in order to assist in selecting the most
+ context-appropriate <a class="tref internalDFN" title="term" href="#dfn-term">term</a>.</p>
+
+ <section class="informative">
+ <h4 id="overview-7">Overview</h4><p><em>This section is non-normative.</em></p>
+
+ <p>If the passed <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, we simply
+ return <a class="tref internalDFN" title="null" href="#dfn-null">null</a>. Otherwise, we first try to find a <a class="tref internalDFN" title="term" href="#dfn-term">term</a>
+ that the <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a> or <a class="tref internalDFN" title="keyword" href="#dfn-keyword">keyword</a> can be compacted to if
+ it is relative to <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context's</a>
+ <a class="tref internalDFN" title="vocabulary-mapping" href="#dfn-vocabulary-mapping">vocabulary mapping</a>. In order to select the most appropriate
+ <a class="tref internalDFN" title="term" href="#dfn-term">term</a>, we may have to collect information about the passed
+ <i>value</i>. This information includes which
+ <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mappings</a>
+ would be preferred for expressing the <i>value</i>, and what its
+ <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a> or <a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">language mapping</a> is. For
+ <a class="tref internalDFN" title="list-object" href="#dfn-list-object">JSON-LD lists</a>, the <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a>
+ or <a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">language mapping</a> will be chosen based on the most
+ specific values that work for all items in the list. Once this
+ information is gathered, it is passed to the
+ <a href="#term-selection">Term Selection algorithm</a>, which will
+ return the most appropriate <a class="tref internalDFN" title="term" href="#dfn-term">term</a> to use.</p>
+
+ <p>If no <a class="tref internalDFN" title="term" href="#dfn-term">term</a> was found that could be used to compact the
+ <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a>, an attempt is made to compact the <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a> using the
+ <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context's</a> <a class="tref internalDFN" title="vocabulary-mapping" href="#dfn-vocabulary-mapping">vocabulary mapping</a>,
+ if there is one. If the <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a> could not be compacted, an
+ attempt is made to find a <a class="tref internalDFN" title="compact-iri" href="#dfn-compact-iri">compact <abbr title="Internationalized Resource Identifier">IRI</abbr></a>. If there is no
+ appropriate <a class="tref internalDFN" title="compact-iri" href="#dfn-compact-iri">compact <abbr title="Internationalized Resource Identifier">IRI</abbr></a>, the <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a> is
+ transformed to a <a class="tref internalDFN" title="relative-iri" href="#dfn-relative-iri">relative <abbr title="Internationalized Resource Identifier">IRI</abbr></a> using the document's
+ <a class="tref internalDFN" title="base-iri" href="#dfn-base-iri">base <abbr title="Internationalized Resource Identifier">IRI</abbr></a>. Finally, if the <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a> or
+ <a class="tref internalDFN" title="keyword" href="#dfn-keyword">keyword</a> still could not be compacted, it is returned
+ as is.</p>
+ </section>
+
+ <section>
+ <h4 id="algorithm-7">Algorithm</h4>
+
+ <p>This algorithm takes three required inputs and three optional inputs.
+ The required inputs are an <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, an <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a>,
+ and the <i>iri</i> to be compacted. The optional inputs are a <i>value</i> associated
+ with the <i>iri</i>, a <i>vocab</i> flag which specifies whether the
+ passed <i>iri</i> should be compacted using the
+ <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context's</a>
+ <a class="tref internalDFN" title="vocabulary-mapping" href="#dfn-vocabulary-mapping">vocabulary mapping</a>, and a <i>reverse</i> flag which specifies whether
+ a <a class="tref internalDFN" title="reverse-property" href="#dfn-reverse-property">reverse property</a> is being compacted. If not passed, <i>value</i> is set to
+ <a class="tref internalDFN" title="null" href="#dfn-null">null</a> and <i>vocab</i> and <i>reverse</i> are both set to
+ <code>false</code>.</p>
+
+ <ol class="algorithm">
+ <li>If <i>iri</i> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, return <a class="tref internalDFN" title="null" href="#dfn-null">null</a>.</li>
+ <li>If <i>vocab</i> is <a class="tref internalDFN" title="true" href="#dfn-true">true</a> and <i>iri</i> is a
+ key in <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a>:
+ <ol class="algorithm">
+ <li>Initialize <i>default language</i> to
+ <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context's</a>
+ <a class="tref internalDFN" title="default-language" href="#dfn-default-language">default language</a>, if it has one, otherwise to
+ <code>@none</code>.</li>
+ <li>Initialize <i>containers</i> to an empty <a class="tref internalDFN" title="array" href="#dfn-array">array</a>. This
+ <a class="tref internalDFN" title="array" href="#dfn-array">array</a> will be used to keep track of an ordered list of
+ preferred <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mappings</a>
+ for a <a class="tref internalDFN" title="term" href="#dfn-term">term</a>, based on what is compatible with
+ <i>value</i>.</li>
+ <li>Initialize <i>type/language</i> to <code>@language</code>,
+ and <i>type/language value</i> to <code>@null</code>. These two
+ variables will keep track of the preferred
+ <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a> or <a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">language mapping</a> for
+ a <a class="tref internalDFN" title="term" href="#dfn-term">term</a>, based on what is compatible with <i>value</i>.</li>
+ <li>If <i>value</i> is a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> that contains the
+ key <code>@index</code>, then append the value <code>@index</code>
+ to <i>containers</i>.</li>
+ <li>If <i>reverse</i> is <a class="tref internalDFN" title="true" href="#dfn-true">true</a>, set <i>type/language</i>
+ to <code>@type</code>, <i>type/language value</i> to
+ <code>@reverse</code>, and append <code>@set</code> to <i>containers</i>.</li>
+ <li>Otherwise, if <i>value</i> is a <a class="tref internalDFN" title="list-object" href="#dfn-list-object">list object</a>, then set
+ <i>type/language</i> and <i>type/language value</i>
+ to the most specific values that work for all items in
+ the list as follows:
+ <ol class="algorithm">
+ <li>If <code>@index</code> is a not key in <i>value</i>, then
+ append <code>@list</code> to <i>containers</i>.</li>
+ <li>Initialize <i>list</i> to the <a class="tref internalDFN" title="array" href="#dfn-array">array</a> associated
+ with the key <code>@list</code> in <i>value</i>.</li>
+ <li>Initialize <i>common type</i> and <i>common language</i> to <a class="tref internalDFN" title="null" href="#dfn-null">null</a>. If
+ <i>list</i> is empty, set <i>common language</i> to
+ <i>default language</i>.</li>
+ <li>For each <i>item</i> in <i>list</i>:
+ <ol class="algorithm">
+ <li>Initialize <i>item language</i> to <code>@none</code> and
+ <i>item type</i> to <code>@none</code>.</li>
+ <li>If <i>item</i> contains the key <code>@value</code>:
+ <ol class="algorithm">
+ <li>If <i>item</i> contains the key <code>@language</code>,
+ then set <i>item language</i> to its associated
+ value.</li>
+ <li>Otherwise, if <i>item</i> contains the key
+ <code>@type</code>, set <i>item type</i> to its
+ associated value.</li>
+ <li>Otherwise, set <i>item language</i> to
+ <code>@null</code>.</li>
+ </ol>
+ </li>
+ <li>Otherwise, set <i>item type</i> to <code>@id</code>.</li>
+ <li>If <i>common language</i> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, set it
+ to <i>item language</i>.</li>
+ <li>Otherwise, if <i>item language</i> does not equal
+ <i>common language</i> and <i>item</i> contains the
+ key <code>@value</code>, then set <i>common language</i>
+ to <code>@none</code> because list items have conflicting
+ languages.</li>
+ <li>If <i>common type</i> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, set it
+ to <i>item type</i>.</li>
+ <li>Otherwise, if <i>item type</i> does not equal
+ <i>common type</i>, then set <i>common type</i>
+ to <code>@none</code> because list items have conflicting
+ types.</li>
+ <li>If <i>common language</i> is <code>@none</code> and
+ <i>common type</i> is <code>@none</code>, then
+ stop processing items in the list because it has been
+ detected that there is no common language or type amongst
+ the items.</li>
+ </ol>
+ </li>
+ <li>If <i>common language</i> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, set it to
+ <code>@none</code>.</li>
+ <li>If <i>common type</i> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, set it to
+ <code>@none</code>.</li>
+ <li>If <i>common type</i> is not <code>@none</code> then set
+ <i>type/language</i> to <code>@type</code> and
+ <i>type/language value</i> to <i>common type</i>.</li>
+ <li>Otherwise, set <i>type/language value</i> to
+ <i>common language</i>.</li>
+ </ol>
+ </li>
+ <li>Otherwise:
+ <ol class="algorithm">
+ <li>If <i>value</i> is a <a class="tref internalDFN" title="value-object" href="#dfn-value-object">value object</a>:
+ <ol class="algorithm">
+ <li>If <i>value</i> contains the key <code>@language</code>
+ and does not contain the key <code>@index</code>,
+ then set <i>type/language value</i> to its associated
+ value and append <code>@language</code> to
+ <i>containers</i>.</li>
+ <li>Otherwise, if <i>value</i> contains the key
+ <code>@type</code>, then set <i>type/language value</i> to
+ its associated value and set <i>type/language</i> to
+ <code>@type</code>.</li>
+ </ol>
+ </li>
+ <li>Otherwise, set <i>type/language</i> to <code>@type</code>
+ and set <i>type/language value</i> to <code>@id</code>.</li>
+ <li>Append <code>@set</code> to <i>containers</i>.</li>
+ </ol>
+ </li>
+ <li>Append <code>@none</code> to <i>containers</i>. This represents
+ the non-existence of a <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mapping</a>, and it will
+ be the last <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mapping</a> value to be checked as it
+ is the most generic.</li>
+ <li>If <i>type/language value</i> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, set it to
+ <code>@null</code>. This is the key under which <a class="tref internalDFN" title="null" href="#dfn-null">null</a> values
+ are stored in the <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a> <i>entry</i>.</li>
+ <li>Initialize <i>preferred values</i> to an empty <a class="tref internalDFN" title="array" href="#dfn-array">array</a>.
+ This <a class="tref internalDFN" title="array" href="#dfn-array">array</a> will indicate, in order, the preferred values for
+ a <a class="tref internalDFN" title="term" href="#dfn-term">term's</a> <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a> or
+ <a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">language mapping</a>.</li>
+ <li>If <i>type/language value</i> is <code>@reverse</code>, append
+ <code>@reverse</code> to <i>preferred values</i>.</li>
+ <li>If <i>type/language value</i> is <code>@id</code> or <code>@reverse</code>
+ and <i>value</i> has an <code>@id</code> member:
+ <ol class="algorithm">
+ <li>If the result of using the
+ <a href="#iri-compaction"><abbr title="Internationalized Resource Identifier">IRI</abbr> compaction algorithm</a>,
+ passing <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a>,
+ the value associated with the <code>@id</code> key in <i>value</i> for
+ <i>iri</i>, <a class="tref internalDFN" title="true" href="#dfn-true">true</a> for <i>vocab</i>, and
+ <a class="tref internalDFN" title="true" href="#dfn-true">true</a> for <i>document relative</i> has a
+ <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> in the <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>
+ with an <a class="tref internalDFN" title="iri-mapping" href="#dfn-iri-mapping"><abbr title="Internationalized Resource Identifier">IRI</abbr> mapping</a> that equals the value associated
+ with the <code>@id</code> key in <i>value</i>,
+ then append <code>@vocab</code>, <code>@id</code>, and
+ <code>@none</code>, in that order, to <i>preferred values</i>.</li>
+ <li>Otherwise, append <code>@id</code>, <code>@vocab</code>, and
+ <code>@none</code>, in that order, to <i>preferred values</i>.</li>
+ </ol>
+ </li>
+ <li>Otherwise, append <i>type/language value</i> and <code>@none</code>, in
+ that order, to <i>preferred values</i>.</li>
+ <li>Initialize <i>term</i> to the result of the
+ <a href="#term-selection">Term Selection algorithm</a>, passing
+ <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a>, <i>iri</i>, <i>containers</i>,
+ <i>type/language</i>, and <i>preferred values</i>.</li>
+ <li>If <i>term</i> is not <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, return <i>term</i>.</li>
+ </ol>
+ </li>
+ <li>At this point, there is no simple <a class="tref internalDFN" title="term" href="#dfn-term">term</a> that <i>iri</i>
+ can be compacted to. If <i>vocab</i> is <a class="tref internalDFN" title="true" href="#dfn-true">true</a> and
+ <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> has a <a class="tref internalDFN" title="vocabulary-mapping" href="#dfn-vocabulary-mapping">vocabulary mapping</a>:
+ <ol class="algorithm">
+ <li>If <i>iri</i> begins with the
+ <a class="tref internalDFN" title="vocabulary-mapping" href="#dfn-vocabulary-mapping">vocabulary mapping's</a> value
+ but is longer, then initialize <i>suffix</i> to the substring
+ of <i>iri</i> that does not match. If <i>suffix</i> does not
+ have a <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> in <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>,
+ then return <i>suffix</i>.</li>
+ </ol>
+ </li>
+ <li>The <i>iri</i> could not be compacted using the
+ <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context's</a> <a class="tref internalDFN" title="vocabulary-mapping" href="#dfn-vocabulary-mapping">vocabulary mapping</a>.
+ Try to create a <a class="tref internalDFN" title="compact-iri" href="#dfn-compact-iri">compact <abbr title="Internationalized Resource Identifier">IRI</abbr></a>, starting by initializing
+ <i>compact <abbr title="Internationalized Resource Identifier">IRI</abbr></i> to <a class="tref internalDFN" title="null" href="#dfn-null">null</a>. This variable will be used to
+ tore the created <a class="tref internalDFN" title="compact-iri" href="#dfn-compact-iri">compact <abbr title="Internationalized Resource Identifier">IRI</abbr></a>, if any.</li>
+ <li>For each key <a class="tref internalDFN" title="term" href="#dfn-term">term</a> and value <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> in
+ the <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>:
+ <ol class="algorithm">
+ <li>If the <a class="tref internalDFN" title="term" href="#dfn-term">term</a> contains a colon (<code>:</code>),
+ then continue to the next <a class="tref internalDFN" title="term" href="#dfn-term">term</a> because
+ <a class="tref internalDFN" title="term" href="#dfn-term">terms</a> with colons can't be
+ used as <a class="tref internalDFN" title="prefix" href="#dfn-prefix">prefixes</a>.</li>
+ <li>If the <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a>,
+ its <a class="tref internalDFN" title="iri-mapping" href="#dfn-iri-mapping"><abbr title="Internationalized Resource Identifier">IRI</abbr> mapping</a> equals <i>iri</i>, or its
+ <a class="tref internalDFN" title="iri-mapping" href="#dfn-iri-mapping"><abbr title="Internationalized Resource Identifier">IRI</abbr> mapping</a> is not a substring at the beginning of
+ <i>iri</i>, the <a class="tref internalDFN" title="term" href="#dfn-term">term</a> cannot be used as a <a class="tref internalDFN" title="prefix" href="#dfn-prefix">prefix</a>
+ because it is not a partial match with <i>iri</i>.
+ Continue with the next <a class="tref internalDFN" title="term" href="#dfn-term">term</a>.</li>
+ <li>Initialize <i>candidate</i> by concatenating <a class="tref internalDFN" title="term" href="#dfn-term">term</a>,
+ a colon (<code>:</code>), and the substring of <i>iri</i>
+ that follows after the value of the
+ <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition's</a>
+ <a class="tref internalDFN" title="iri-mapping" href="#dfn-iri-mapping"><abbr title="Internationalized Resource Identifier">IRI</abbr> mapping</a>.</li>
+ <li>If either <i>compact <abbr title="Internationalized Resource Identifier">IRI</abbr></i> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a> or <i>candidate</i> is
+ shorter or the same length but lexicographically less than
+ <i>compact <abbr title="Internationalized Resource Identifier">IRI</abbr></i> and <i>candidate</i> does not have a
+ <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> in <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> or if the
+ <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> has an <a class="tref internalDFN" title="iri-mapping" href="#dfn-iri-mapping"><abbr title="Internationalized Resource Identifier">IRI</abbr> mapping</a>
+ that equals <i>iri</i> and <i>value</i> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a>,
+ set <i>compact <abbr title="Internationalized Resource Identifier">IRI</abbr></i> to <i>candidate</i>.</li>
+ </ol>
+ </li>
+ <li>If <i>compact <abbr title="Internationalized Resource Identifier">IRI</abbr></i> is not <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, return <i>compact <abbr title="Internationalized Resource Identifier">IRI</abbr></i>.</li>
+ <li>If <i>vocab</i> is <a class="tref internalDFN" title="false" href="#dfn-false">false</a> then
+ transform <i>iri</i> to a <a class="tref internalDFN" title="relative-iri" href="#dfn-relative-iri">relative <abbr title="Internationalized Resource Identifier">IRI</abbr></a> using
+ the document's base <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a>.</li>
+ <li>Finally, return <i>iri</i> as is.</li>
+ </ol>
+ </section>
+ </section> <!-- end of IRI Compaction -->
+
+ <section id="term-selection">
+ <h3><span class="secno">8.4 </span>Term Selection</h3>
+
+ <p>This algorithm, invoked via the <a href="#iri-compaction"><abbr title="Internationalized Resource Identifier">IRI</abbr> Compaction algorithm</a>,
+ makes use of an <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context's</a>
+ <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a> to find the <a class="tref internalDFN" title="term" href="#dfn-term">term</a> that is best
+ used to <a class="tref internalDFN" title="compaction" href="#dfn-compaction">compact</a> an <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a>. Other
+ information about a value associated with the <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a> is given,
+ including which <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mappings</a>
+ and which <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a> or <a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">language mapping</a> would
+ be best used to express the value.</p>
+
+ <section class="informative">
+ <h4 id="overview-8">Overview</h4><p><em>This section is non-normative.</em></p>
+
+ <p>The <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context's</a> entry for
+ the <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a> will be first searched according to the preferred
+ <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mappings</a>, in the order
+ that they are given. Amongst <a class="tref internalDFN" title="term" href="#dfn-term">terms</a> with a matching
+ <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mapping</a>, preference will be given to those
+ with a matching <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a> or <a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">language mapping</a>,
+ over those without a <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a> or
+ <a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">language mapping</a>. If there is no <a class="tref internalDFN" title="term" href="#dfn-term">term</a>
+ with a matching <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mapping</a> then the <a class="tref internalDFN" title="term" href="#dfn-term">term</a>
+ without a <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mapping</a> that matches the given
+ <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a> or <a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">language mapping</a> is selected. If
+ there is still no selected <a class="tref internalDFN" title="term" href="#dfn-term">term</a>, then a <a class="tref internalDFN" title="term" href="#dfn-term">term</a>
+ with no <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a> or <a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">language mapping</a> will
+ be selected if available. No <a class="tref internalDFN" title="term" href="#dfn-term">term</a> will be selected that
+ has a conflicting <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a> or <a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">language mapping</a>.
+ Ties between <a class="tref internalDFN" title="term" href="#dfn-term">terms</a> that have the same
+ mappings are resolved by first choosing the shortest terms, and then by
+ choosing the lexicographically least term. Note that these ties are
+ resolved automatically because they were previously resolved when the
+ <a href="#inverse-context-creation">Inverse Context Creation algorithm</a>
+ was used to create the <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a>.</p>
+ </section>
+
+ <section>
+ <h4 id="algorithm-8">Algorithm</h4>
+
+ <p>This algorithm has five required inputs. They are:
+ an <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a>, a <a class="tref internalDFN" title="keyword" href="#dfn-keyword">keyword</a> or <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a>
+ <i>iri</i>, an <a class="tref internalDFN" title="array" href="#dfn-array">array</a> <i>containers</i> that represents an
+ ordered list of preferred <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mappings</a>,
+ a <a class="tref internalDFN" title="string" href="#dfn-string">string</a> <i>type/language</i> that indicates whether
+ to look for a <a class="tref internalDFN" title="term" href="#dfn-term">term</a> with a matching <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a>
+ or <a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">language mapping</a>, and an <a class="tref internalDFN" title="array" href="#dfn-array">array</a> representing
+ an ordered list of <i>preferred values</i> for the <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a>
+ or <a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">language mapping</a> to look for.</p>
+
+ <ol class="algorithm">
+ <li>Initialize <i>container map</i> to the value associated with
+ <i>iri</i> in the <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a>.</li>
+ <li>For each item <i>container</i> in <i>containers</i>:
+ <ol class="algorithm">
+ <li>If <i>container</i> is not a key in <i>container map</i>, then
+ there is no <a class="tref internalDFN" title="term" href="#dfn-term">term</a> with a matching
+ <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mapping</a> for it, so continue to the next
+ <i>container</i>.</li>
+ <li>Initialize <i>type/language map</i> to the value associated
+ with the <i>container</i> member in <i>container map</i>.</li>
+ <li>Initialize <i>value map</i> to the value associated
+ with <i>type/language</i> member in <i>type/language map</i>.</li>
+ <li>For each <i>item</i> in <i>preferred values</i>:
+ <ol class="algorithm">
+ <li>If <i>item</i> is not a key in <i>value map</i>,
+ then there is no <a class="tref internalDFN" title="term" href="#dfn-term">term</a> with a matching
+ <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a> or <a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">language mapping</a>,
+ so continue to the next <i>item</i>.</li>
+ <li>Otherwise, a matching term has been found, return the value
+ associated with the <i>item</i> member in
+ <i>value map</i>.</li>
+ </ol>
+ </li>
+ </ol>
+ </li>
+ <li>No matching term has been found. Return <a class="tref internalDFN" title="null" href="#dfn-null">null</a>.</li>
+ </ol>
+ </section>
+ </section> <!-- end of Term Selection -->
+
+ <section id="value-compaction">
+ <h3><span class="secno">8.5 </span>Value Compaction</h3>
+
+ <p><a class="tref internalDFN" title="expansion" href="#dfn-expansion">Expansion</a> transforms all values into <a class="tref internalDFN" title="expanded-form" href="#dfn-expanded-form">expanded form</a>
+ in JSON-LD. This algorithm performs the opposite operation, transforming
+ a value into <dfn title="compacted-form" id="dfn-compacted-form">compacted form</dfn>. This algorithm compacts a
+ value according to the <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> in the given
+ <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> that is associated with the value's associated
+ <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>.</p>
+
+ <section class="informative">
+ <h4 id="overview-9">Overview</h4><p><em>This section is non-normative.</em></p>
+
+ <p>The <i>value</i> to compact has either an <code>@id</code> or an
+ <code>@value</code> member.</p>
+
+ <p>For the former case, if the <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a> of
+ <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a> is set to <code>@id</code> or <code>@vocab</code>
+ and <i>value</i> consists of only an <code>@id</code> member and, if
+ the <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mapping</a> of <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>
+ is set to <code>@index</code>, an <code>@index</code> member, <i>value</i>
+ can be compacted to a <a class="tref internalDFN" title="string" href="#dfn-string">string</a> by returning the result of
+ using the <a href="#iri-compaction"><abbr title="Internationalized Resource Identifier">IRI</abbr> Compaction algorithm</a>
+ to compact the value associated with the <code>@id</code> member.
+ Otherwise, <i>value</i> cannot be compacted and is returned as is.</p>
+
+ <p>For the latter case, it might be possible to compact <i>value</i>
+ just into the value associated with the <code>@value</code> member.
+ This can be done if the <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a> has a matching
+ <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a> or <a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">language mapping</a> and there
+ is either no <code>@index</code> member or the <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mapping</a>
+ of <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a> is set to <code>@index</code>. It can
+ also be done if <code>@value</code> is the only member in <i>value</i>
+ (apart an <code>@index</code> member in case the <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mapping</a>
+ of <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a> is set to <code>@index</code>) and
+ either its associated value is not a <a class="tref internalDFN" title="string" href="#dfn-string">string</a>, there is
+ no <a class="tref internalDFN" title="default-language" href="#dfn-default-language">default language</a>, or there is an explicit
+ <a class="tref internalDFN" title="null" href="#dfn-null">null</a> <a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">language mapping</a> for the
+ <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>.</p>
+ </section>
+
+ <section>
+ <h4 id="algorithm-9">Algorithm</h4>
+
+ <p>This algorithm has four required inputs: an <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, an
+ <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a>, an <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>, and a <i>value</i>
+ to be compacted.</p>
+
+ <ol class="algorithm">
+ <li>Initialize <i>number members</i> to the number of members
+ <i>value</i> contains.</li>
+ <li>If <i>value</i> has an <code>@index</code> member and the
+ <a class="tref internalDFN" title="container-mapping" href="#dfn-container-mapping">container mapping</a> associated to <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>
+ is set to <code>@index</code>, decrease <i>number members</i> by
+ <code>1</code>.</li>
+ <li>If <i>number members</i> is greater than <code>2</code>, return
+ <i>value</i> as it cannot be compacted.</li>
+ <li>If <i>value</i> has an <code>@id</code> member:
+ <ol class="algorithm">
+ <li>If <i>number members</i> is <code>1</code> and
+ the <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a> of <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>
+ is set to <code>@id</code>, return the result of using the
+ <a href="#iri-compaction"><abbr title="Internationalized Resource Identifier">IRI</abbr> compaction algorithm</a>,
+ passing <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a>,
+ and the value of the <code>@id</code> member for <i>iri</i>.</li>
+ <li>Otherwise, if <i>number members</i> is <code>1</code> and
+ the <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a> of <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>
+ is set to <code>@vocab</code>, return the result of using the
+ <a href="#iri-compaction"><abbr title="Internationalized Resource Identifier">IRI</abbr> compaction algorithm</a>,
+ passing <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>, <a class="tref internalDFN" title="inverse-context" href="#dfn-inverse-context">inverse context</a>,
+ the value of the <code>@id</code> member for <i>iri</i>, and
+ <a class="tref internalDFN" title="true" href="#dfn-true">true</a> for <i>vocab</i>.</li>
+ <li>Otherwise, return <i>value</i> as is.</li>
+ </ol>
+ </li>
+ <li>Otherwise, if <i>value</i> has an <code>@type</code> member whose
+ value matches the <a class="tref internalDFN" title="type-mapping" href="#dfn-type-mapping">type mapping</a> of <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>,
+ return the value associated with the <code>@value</code> member
+ of <i>value</i>.</li>
+ <li>Otherwise, if <i>value</i> has an <code>@language</code> member whose
+ value matches the <a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">language mapping</a> of
+ <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>, return the value associated with the
+ <code>@value</code> member of <i>value</i>.</li>
+ <li>Otherwise, if <i>number members</i> equals <code>1</code> and either
+ the value of the <code>@value</code> member is not a <a class="tref internalDFN" title="string" href="#dfn-string">string</a>,
+ or the <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> has no <a class="tref internalDFN" title="default-language" href="#dfn-default-language">default language</a>,
+ or the <a class="tref internalDFN" title="language-mapping" href="#dfn-language-mapping">language mapping</a> of <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>
+ is set to <a class="tref internalDFN" title="null" href="#dfn-null">null</a>,, return the value associated with the
+ <code>@value</code> member.</li>
+ <li>Otherwise, return <i>value</i> as is.</li>
+ </ol>
+ </section>
+ </section> <!-- end of Value Compaction algorithm -->
+</section> <!-- end of Compaction section -->
+
+
+<section id="flattening-algorithms">
+ <!--OddPage--><h2><span class="secno">9. </span>Flattening Algorithms</h2>
+
+ <section id="flattening-algorithm">
+ <h3><span class="secno">9.1 </span>Flattening Algorithm</h3>
+
+ <p>This algorithm flattens an expanded JSON-LD document by collecting all
+ properties of a <a class="tref internalDFN" title="node" href="#dfn-node">node</a> in a single <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>
+ and labeling all <a class="tref internalDFN" title="blank-node" href="#dfn-blank-node">blank nodes</a> with
+ <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifiers</a>.
+ This resulting uniform shape of the document, may drastically simplify
+ the code required to process JSON-LD data in certain applications.</p>
+
+ <section class="informative">
+ <h4 id="overview-10">Overview</h4><p><em>This section is non-normative.</em></p>
+
+ <p>First, a <i>node map</i> is generated using the
+ <a href="#node-map-generation">Node Map Generation algorithm</a>
+ which collects all properties of a <a class="tref internalDFN" title="node" href="#dfn-node">node</a> in a single
+ <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>. In the next step, the <i>node map</i> is
+ converted to a JSON-LD document in
+ <a class="tref externalDFN" title="flattened-document-form" href="http://www.w3.org/TR/2013/CR-json-ld-20130822/#flattened-document-form">flattened document form</a>.
+ Finally, if a <a class="tref internalDFN" title="context" href="#dfn-context">context</a> has been passed, the flattened document
+ is compacted using the <a href="#compaction-algorithm">Compaction algorithm</a>
+ before being returned.</p>
+ </section>
+
+ <section>
+ <h4 id="algorithm-10">Algorithm</h4>
+
+ <p>The algorithm takes two input variables, an <i>element</i> to flatten and
+ an optional <i>context</i> used to compact the flattened document. If not
+ passed, <i>context</i> is set to <a class="tref internalDFN" title="null" href="#dfn-null">null</a>.</p>
+
+ <p>This algorithm generates new <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifiers</a>
+ and relabels existing <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifiers</a>.
+ The used <a href="#generate-blank-node-identifier">Generate Blank Node Identifier algorithm</a>
+ keeps an <i>identifier map</i> and a <i>counter</i> to ensure consistent
+ relabeling and avoid collisions. Thus, before this algorithm is run,
+ the <i>identifier map</i> is reset and the <i>counter</i> is initialized
+ to <code>0</code>.</p>
+
+ <ol class="algorithm">
+ <li>Initialize <i>node map</i> to a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> consisting of
+ a single member whose key is <code>@default</code> and whose value is
+ an empty <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>.</li>
+ <li>Perform the <a href="#node-map-generation">Node Map Generation algorithm</a>, passing
+ <i>element</i> and <i>node map</i>.</li>
+ <li>Initialize <i>default graph</i> to the value of the <code>@default</code>
+ member of <i>node map</i>, which is a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> representing
+ the <a class="tref internalDFN" title="default-graph" href="#dfn-default-graph">default graph</a>.</li>
+ <li>For each key-value pair <i>graph name</i>-<i>graph</i> in <i>node map</i>
+ where <i>graph name</i> is not <code>@default</code>, perform the following steps:
+ <ol class="algorithm">
+ <li>If <i>default graph</i> does not have a <i>graph name</i> member, create
+ one and initialize its value to a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> consisting of an
+ <code>@id</code> member whose value is set to <i>graph name</i>.</li>
+ <li>Reference the value associated with the <i>graph name</i> member in
+ <i>default graph</i> using the variable <i>entry</i>.</li>
+ <li>Add an <code>@graph</code> member to <i>entry</i> and set it to an
+ empty <a class="tref internalDFN" title="array" href="#dfn-array">array</a>.</li>
+ <li>For each <i>id</i>-<i>node</i> pair in <i>graph</i> ordered by <i>id</i>,
+ add <i>node</i> to the <code>@graph</code> member of <i>entry</i>,
+ unless the only member of <i>node</i> is <code>@id</code>.</li>
+ </ol>
+ </li>
+ <li>Initialize an empty <a class="tref internalDFN" title="array" href="#dfn-array">array</a> <i>flattened</i>.</li>
+ <li>For each <i>id</i>-<i>node</i> pair in <i>default graph</i> ordered by <i>id</i>,
+ add <i>node</i> to <i>flattened</i>,
+ unless the only member of <i>node</i> is <code>@id</code>.</li>
+ <li>If <i>context</i> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, return <i>flattened</i>.</li>
+ <li>Otherwise, return the result of compacting <i>flattened</i> according the
+ <a href="#compaction-algorithm">Compaction algorithm</a> passing <i>context</i>
+ ensuring that the compaction result has only the <code>@graph</code> keyword (or its alias)
+ at the top-level other than <code>@context</code>, even if the context is empty or if there is only one element to
+ put in the <code>@graph</code> <a class="tref internalDFN" title="array" href="#dfn-array">array</a>. This ensures that the returned
+ document has a deterministic structure.</li>
+ </ol>
+ </section>
+ </section> <!-- end of Flattening Algorithm -->
+
+ <section id="node-map-generation">
+ <h3><span class="secno">9.2 </span>Node Map Generation</h3>
+
+ <p>This algorithm creates a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> <i>node map</i> holding an indexed
+ representation of the <a class="tref internalDFN" title="graph" href="#dfn-graph">graphs</a> and <a class="tref internalDFN" title="node" href="#dfn-node">nodes</a>
+ represented in the passed expanded document. All <a class="tref internalDFN" title="node" href="#dfn-node">nodes</a> that are not
+ uniquely identified by an <abbr title="Internationalized Resource Identifier">IRI</abbr> get assigned a (new) <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a>.
+ The resulting <i>node map</i> will have a member for every graph in the document whose
+ value is another object with a member for every <a class="tref internalDFN" title="node" href="#dfn-node">node</a> represented in the document.
+ The default graph is stored under the <code>@default</code> member, all other graphs are
+ stored under their <a class="tref internalDFN" title="graph-name" href="#dfn-graph-name">graph name</a>.</p>
+
+ <section class="informative">
+ <h4 id="overview-11">Overview</h4><p><em>This section is non-normative.</em></p>
+
+ <p>The algorithm recursively runs over an expanded JSON-LD document to
+ collect all <a class="tref internalDFN" title="property" href="#dfn-property">properties</a> of a <a class="tref internalDFN" title="node" href="#dfn-node">node</a>
+ in a single <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>. The algorithm constructs a
+ <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> <i>node map</i> whose keys represent the
+ <a class="tref internalDFN" title="graph-name" href="#dfn-graph-name">graph names</a> used in the document
+ (the <a class="tref internalDFN" title="default-graph" href="#dfn-default-graph">default graph</a> is stored under the key <code>@default</code>)
+ and whose associated values are <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON objects</a>
+ which index the <a class="tref internalDFN" title="node" href="#dfn-node">nodes</a> in the
+ <a class="tref internalDFN" title="graph" href="#dfn-graph">graph</a>. If a
+ <a class="tref internalDFN" title="property" href="#dfn-property">property's</a> value is a <a class="tref internalDFN" title="node-object" href="#dfn-node-object">node object</a>,
+ it is replaced by a <a class="tref internalDFN" title="node-object" href="#dfn-node-object">node object</a> consisting of only an
+ <code>@id</code> member. If a <a class="tref internalDFN" title="node-object" href="#dfn-node-object">node object</a> has no <code>@id</code>
+ member or it is identified by a <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a>,
+ a new <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a> is generated. This relabeling
+ of <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifiers</a> is
+ also done for <a class="tref internalDFN" title="property" href="#dfn-property">properties</a> and values of
+ <code>@type</code>.</p>
+ </section>
+
+ <section>
+ <h4 id="algorithm-11">Algorithm</h4>
+
+ <p>The algorithm takes as input an expanded JSON-LD document <i>element</i> and a reference to
+ a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> <i>node map</i>. Furthermore it has the optional parameters
+ <a class="tref internalDFN" title="active-graph" href="#dfn-active-graph">active graph</a> (which defaults to <code>@default</code>), an <a class="tref internalDFN" title="active-subject" href="#dfn-active-subject">active subject</a>,
+ <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>, and a reference to a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> <i>list</i>. If
+ not passed, <a class="tref internalDFN" title="active-subject" href="#dfn-active-subject">active subject</a>, <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>, and <i>list</i> are
+ set to <a class="tref internalDFN" title="null" href="#dfn-null">null</a>.</p>
+
+ <ol class="algorithm">
+ <li>If <i>element</i> is an array, process each <i>item</i> in <i>element</i>
+ as follows and then return:
+ <ol class="algorithm">
+ <li>Run this algorithm recursively by passing <i>item</i> for <i>element</i>,
+ <i>node map</i>, <a class="tref internalDFN" title="active-graph" href="#dfn-active-graph">active graph</a>, <a class="tref internalDFN" title="active-subject" href="#dfn-active-subject">active subject</a>,
+ <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>, and <i>list</i>.</li>
+ </ol>
+ </li>
+ <li>Otherwise <i>element</i> is a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>. Reference the
+ <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> which is the value of the <a class="tref internalDFN" title="active-graph" href="#dfn-active-graph">active graph</a>
+ member of <i>node map</i> using the variable <i>graph</i>. If the
+ <a class="tref internalDFN" title="active-subject" href="#dfn-active-subject">active subject</a> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, set <i>node</i> to <a class="tref internalDFN" title="null" href="#dfn-null">null</a>
+ otherwise reference the <a class="tref internalDFN" title="active-subject" href="#dfn-active-subject">active subject</a> member of <i>graph</i> using the
+ variable <i>node</i>.</li>
+ <li>If <i>element</i> has an <code>@type</code> member, perform for each
+ <i>item</i> the following steps:
+ <ol class="algorithm">
+ <li>If <i>item</i> is a <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a>, replace it with a newly
+ <a href="#generate-blank-node-identifier">generated blank node identifier</a>
+ passing <i>item</i> for <i>identifier</i>.</li>
+ </ol>
+ </li>
+ <li>If <i>element</i> has an <code>@value</code> member, perform the following steps:
+ <ol class="algorithm">
+ <li>If <i>list</i> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a>:
+ <ol class="algorithm">
+ <li>If <i>node</i> does not have an <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a> member,
+ create one and initialize its value to an <a class="tref internalDFN" title="array" href="#dfn-array">array</a>
+ containing <i>element</i>.</li>
+ <li>Otherwise, compare <i>element</i> against every item in the
+ <a class="tref internalDFN" title="array" href="#dfn-array">array</a> associated with the <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>
+ member of <i>node</i>. If there is no item equivalent to <i>element</i>,
+ append <i>element</i> to the <a class="tref internalDFN" title="array" href="#dfn-array">array</a>. Two
+ <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON objects</a> are considered
+ equal if they have equivalent key-value pairs.</li>
+ </ol>
+ </li>
+ <li>Otherwise, append <i>element</i> to the <code>@list</code> member of <i>list</i>.</li>
+ </ol>
+ </li>
+ <li>Otherwise, if <i>element</i> has an <code>@list</code> member, perform
+ the following steps:
+ <ol class="algorithm">
+ <li>Initialize a new <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> <i>result</i> consisting of a single member
+ <code>@list</code> whose value is initialized to an empty <a class="tref internalDFN" title="array" href="#dfn-array">array</a>.</li>
+ <li>Recursively call this algorithm passing the value of <i>element's</i>
+ <code>@list</code> member for <i>element</i>, <a class="tref internalDFN" title="active-graph" href="#dfn-active-graph">active graph</a>,
+ <a class="tref internalDFN" title="active-subject" href="#dfn-active-subject">active subject</a>, <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>, and
+ <i>result</i> for <i>list</i>.</li>
+ <li>Append <i>result</i> to the value of the <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a> member
+ of <i>node</i>.</li>
+ </ol>
+ </li>
+ <li>Otherwise <i>element</i> is a <a class="tref internalDFN" title="node-object" href="#dfn-node-object">node object</a>, perform
+ the following steps:
+ <ol class="algorithm">
+ <li>If <i>element</i> has an <code>@id</code> member, set <i>id</i>
+ to its value and remove the member from <i>element</i>. If <i>id</i>
+ is a <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a>, replace it with a newly
+ <a href="#generate-blank-node-identifier">generated blank node identifier</a>
+ passing <i>id</i> for <i>identifier</i>.</li>
+ <li>Otherwise, set <i>id</i> to the result of the
+ <a href="#generate-blank-node-identifier">Generate Blank Node Identifier algorithm</a>
+ passing <a class="tref internalDFN" title="null" href="#dfn-null">null</a> for <i>identifier</i>.</li>
+ <li>If <i>graph</i> does not contain a member <i>id</i>, create one and initialize
+ its value to a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> consisting of a single member <code>@id</code> whose
+ value is <i>id</i>.</li>
+ <li>If <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a> is not <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, perform the following steps:
+ <ol class="algorithm">
+ <li>Create a new <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> <i>reference</i> consisting of a single member
+ <code>@id</code> whose value is <i>id</i>.</li>
+ <li>If <i>list</i> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a>:
+ <ol class="algorithm">
+ <li>If <i>node</i> does not have an <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a> member,
+ create one and initialize its value to an <a class="tref internalDFN" title="array" href="#dfn-array">array</a>
+ containing <i>reference</i>.</li>
+ <li>Otherwise, compare <i>reference</i> against every item in the
+ <a class="tref internalDFN" title="array" href="#dfn-array">array</a> associated with the <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>
+ member of <i>node</i>. If there is no item equivalent to <i>reference</i>,
+ append <i>reference</i> to the <a class="tref internalDFN" title="array" href="#dfn-array">array</a>. Two
+ <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON objects</a> are considered
+ equal if they have equivalent key-value pairs.</li>
+ </ol>
+ </li>
+ <li>Otherwise, append <i>element</i> to the <code>@list</code> member of <i>list</i>.</li>
+ </ol>
+ </li>
+ <li>Reference the value of the <i>id</i> member of <i>graph</i> using the
+ variable <i>node</i>.</li>
+ <li>If <i>element</i> has an <code>@type</code> key, append
+ each item of its associated <a class="tref internalDFN" title="array" href="#dfn-array">array</a> to the
+ <a class="tref internalDFN" title="array" href="#dfn-array">array</a> associated with the <code>@type</code> key of
+ <i>node</i> unless it is already in that <a class="tref internalDFN" title="array" href="#dfn-array">array</a>. Finally
+ remove the <code>@type</code> member from <i>element</i>.</li>
+ <li>If <i>element</i> has an <code>@index</code> member, set the <code>@index</code>
+ member of <i>node</i> to its value. If <a class="tref internalDFN" title="node" href="#dfn-node">node</a> has already an
+ <code>@index</code> member with a different value, a
+ <code class="error"><a href="#idl-def-JsonLdErrorCode.conflicting-indexes">conflicting indexes</a></code>
+ error has been detected and processing is aborted. Otherwise, continue by
+ removing the <code>@index</code> member from <i>element</i>.</li>
+ <li>If <i>element</i> has an <code>@reverse</code> member:
+ <ol class="algorithm">
+ <li>Create a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> <i>referenced node</i> with a single member <code>@id</code> whose
+ value is <i>id</i>.</li>
+ <li>Set <i>reverse map</i> to the value of the <code>@reverse</code> member of
+ <i>element</i>.</li>
+ <li>For each key-value pair <i>property</i>-<i>values</i> in <i>reverse map</i>:
+ <ol class="algorithm">
+ <li>For each <i>value</i> of <i>values</i>:
+ <ol class="algorithm">
+ <li>If <i>value</i> has a <i>property</i> member, append <i>referenced node</i> to
+ its value; otherwise create a <i>property</i> member whose value is an
+ <a class="tref internalDFN" title="array" href="#dfn-array">array</a> containing <i>referenced node</i>.</li>
+ <li>Recursively invoke this algorithm passing <i>value</i> for
+ <i>element</i>, <i>node map</i>, and <a class="tref internalDFN" title="active-graph" href="#dfn-active-graph">active graph</a>.</li>
+ </ol>
+ </li>
+ </ol>
+ </li>
+ <li>Remove the <code>@reverse</code> member from <i>element</i>.</li>
+ </ol>
+ </li>
+ <li>If <i>element</i> has an <code>@graph</code> member, recursively invoke this
+ algorithm passing the value of the <code>@graph</code> member for <i>element</i>,
+ <i>node map</i>, and <i>id</i> for <a class="tref internalDFN" title="active-graph" href="#dfn-active-graph">active graph</a> before removing
+ the <code>@graph</code> member from <i>element</i>.</li>
+ <li>Finally, for each key-value pair <i>property</i>-<i>value</i> in <i>element</i> ordered by
+ <i>property</i> perform the following steps:
+ <ol class="algorithm">
+ <li>If <i>property</i> is a <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a>, replace it with a newly
+ <a href="#generate-blank-node-identifier">generated blank node identifier</a>
+ passing <i>property</i> for <i>identifier</i>.</li>
+ <li>If <i>node</i> does not have a <i>property</i> member, create one and initialize
+ its value to an empty <a class="tref internalDFN" title="array" href="#dfn-array">array</a>.</li>
+ <li>Recursively invoke this algorithm passing <i>value</i> for <i>element</i>,
+ <i>node map</i>, <a class="tref internalDFN" title="active-graph" href="#dfn-active-graph">active graph</a>, <i>id</i> for <a class="tref internalDFN" title="active-subject" href="#dfn-active-subject">active subject</a>,
+ and <i>property</i> for <a class="tref internalDFN" title="active-property" href="#dfn-active-property">active property</a>.</li>
+ </ol>
+ </li>
+ </ol>
+ </li>
+ </ol>
+ </section>
+ </section> <!-- end of Node Map Generation -->
+
+ <section id="generate-blank-node-identifier">
+ <h3><span class="secno">9.3 </span>Generate Blank Node Identifier</h3>
+
+ <p>This algorithm is used to generate new
+ <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifiers</a> or to
+ relabel an existing <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a> to avoid collision
+ by the introduction of new ones.</p>
+
+ <section class="informative">
+ <h4 id="overview-12">Overview</h4><p><em>This section is non-normative.</em></p>
+
+ <p>The simplest case is if there exists already a <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a>
+ in the <i>identifier map</i> for the passed <i>identifier</i>, in which
+ case it is simply returned. Otherwise, a new <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a>
+ is generated by concatenating the string <code>_:b</code> and the
+ <i>counter</i>. If the passed <i>identifier</i> is not <a class="tref internalDFN" title="null" href="#dfn-null">null</a>,
+ an entry is created in the <i>identifier map</i> associating the
+ <i>identifier</i> with the <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a>. Finally,
+ the <i>counter</i> is increased by one and the new
+ <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a> is returned.</p>
+ </section>
+
+ <section>
+ <h4 id="algorithm-12">Algorithm</h4>
+
+ <p>The algorithm takes a single input variable <i>identifier</i> which may
+ be <a class="tref internalDFN" title="null" href="#dfn-null">null</a>. Between its executions, the algorithm needs to
+ keep an <i>identifier map</i> to relabel existing
+ <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifiers</a>
+ consistently and a <i>counter</i> to generate new
+ <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifiers</a>. The
+ <i>counter</i> is initialized to <code>0</code> by default.</p>
+
+ <ol class="algorithm">
+ <li>If <i>identifier</i> is not <a class="tref internalDFN" title="null" href="#dfn-null">null</a> and has an entry in the
+ <i>identifier map</i>, return the mapped identifier.</li>
+ <li>Otherwise, generate a new <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a> by concatenating
+ the string <code>_:b</code> and <i>counter</i>.</li>
+ <li>Increment <i>counter</i> by <code>1</code>.</li>
+ <li>If <i>identifier</i> is not <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, create a new entry
+ for <i>identifier</i> in <i>identifier map</i> and set its value
+ to the new <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a>.</li>
+ <li>Return the new <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a>.</li>
+ </ol>
+ </section>
+ </section> <!-- end of Generate Blank Node Identifier -->
+</section> <!-- end of Flattening section -->
+
+
+<section id="rdf-serialization-deserialization-algorithms">
+ <!--OddPage--><h2><span class="secno">10. </span>RDF Serialization/Deserialization Algorithms</h2>
+
+ <p>This section describes algorithms to deserialize a JSON-LD document to an
+ <a class="tref internalDFN" title="rdf-dataset" href="#dfn-rdf-dataset">RDF dataset</a> and vice versa. The algorithms are designed for in-memory
+ implementations with random access to <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> elements.</p>
+
+ <p>Throughout this section, the following vocabulary
+ <a class="tref internalDFN" title="prefix" href="#dfn-prefix">prefixes</a> are used in
+ <a class="tref internalDFN" title="compact-iri" href="#dfn-compact-iri">compact IRIs</a>:</p>
+
+ <table class="simple">
+ <thead>
+ <tr><th>Prefix</th>
+ <th><abbr title="Internationalized Resource Identifier">IRI</abbr></th>
+ </tr></thead>
+ <tbody>
+ <tr>
+ <td>rdf</td>
+ <td>http://www.w3.org/1999/02/22-rdf-syntax-ns#</td>
+ </tr>
+ <tr>
+ <td>rdfs</td>
+ <td> http://www.w3.org/2000/01/rdf-schema#</td>
+ </tr>
+ <tr>
+ <td>xsd</td>
+ <td>http://www.w3.org/2001/XMLSchema#</td>
+ </tr>
+ </tbody>
+ </table>
+
+ <section id="deserialize-json-ld-to-rdf-algorithm">
+ <h3><span class="secno">10.1 </span>Deserialize JSON-LD to RDF algorithm</h3>
+
+ <p>This algorithm deserializes a JSON-LD document to an <a class="tref internalDFN" title="rdf-dataset" href="#dfn-rdf-dataset">RDF dataset</a>.
+ Please note that RDF does not allow a <a class="tref internalDFN" title="blank-node" href="#dfn-blank-node">blank node</a> to be used
+ as a <a class="tref internalDFN" title="property" href="#dfn-property">property</a>, while JSON-LD does. Therefore, by default
+ RDF triples that would have contained blank nodes as properties are
+ discarded when interpreting JSON-LD as RDF.</p>
+
+ <div class="issue atrisk"><div class="issue-title" role="heading" aria-level="4"><span>Feature at Risk 3</span>: Allow blank nodes to be used as properties</div><div class="atrisk">
+ <p class="atrisk-head">Note: This feature is
+ <a href="http://www.w3.org/2005/10/Process-20051014/tr#cfi">"at risk"</a> and
+ may be removed from this specification based on feedback. Please send feedback to
+ <a href="mailto:public-rdf-comments@w3.org">public-rdf-comments@w3.org</a>.
+ For the current status see
+ <a href="http://www.w3.org/2011/rdf-wg/wiki/JSON-LD_Features_at_Risk">features "at risk" in JSON-LD 1.0</a></p>
+ <p>RDF graphs do not allow <a class="tref internalDFN" title="blank-node" href="#dfn-blank-node">blank nodes</a> to be used
+ as an <a class="tref internalDFN" title="rdf-predicate" href="#dfn-rdf-predicate">RDF predicate</a>, while JSON-LD does.
+ Unless the <i>produce generalized RDF</i> flag is set, this algorithm will exclude
+ triples including a <a class="tref internalDFN" title="blank-node" href="#dfn-blank-node">blank node</a> <a class="tref internalDFN" title="rdf-predicate" href="#dfn-rdf-predicate">RDF predicate</a>.</p>
+ </div></div>
+
+ <section class="informative">
+ <h4 id="overview-13">Overview</h4><p><em>This section is non-normative.</em></p>
+
+ <p>The JSON-LD document is expanded and converted to a <i>node map</i> using the
+ <a href="#node-map-generation">Node Map Generation algorithm</a>.
+ This allows each graph represented within the document to be
+ extracted and flattened, making it easier to process each
+ <a class="tref internalDFN" title="node-object" href="#dfn-node-object">node object</a>. Each graph from the <i>node map</i>
+ is processed to extract <a class="tref internalDFN" title="rdf-triple" href="#dfn-rdf-triple">RDF triples</a>,
+ to which any (non-default) graph name is applied to create an
+ <a class="tref internalDFN" title="rdf-dataset" href="#dfn-rdf-dataset">RDF dataset</a>. Each <a class="tref internalDFN" title="node-object" href="#dfn-node-object">node object</a> in the
+ <i>node map</i> has an <code>@id</code> member which corresponds to the
+ <a class="tref internalDFN" title="rdf-subject" href="#dfn-rdf-subject">RDF subject</a>, the other members
+ represent <a class="tref internalDFN" title="rdf-predicate" href="#dfn-rdf-predicate">RDF predicates</a>. Each
+ member value is either an <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a> or
+ <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a> or can be transformed to an
+ <a class="tref externalDFN" title="rdf-literal" href="http://www.w3.org/TR/rdf11-concepts/#dfn-literal">RDF literal</a>
+ to generate an <a class="tref internalDFN" title="rdf-triple" href="#dfn-rdf-triple">RDF triple</a>. <a class="tref internalDFN" title="list" href="#dfn-list">Lists</a>
+ are transformed into an
+ <a class="tref externalDFN" title="rdf-collection" href="http://www.w3.org/TR/rdf-schema/#ch_collectionvocab">RDF Collection</a>
+ using the <a href="#list-to-rdf-conversion">List to RDF Conversion algorithm.</a></p>
+ </section>
+
+ <section>
+ <h4 id="algorithm-13">Algorithm</h4>
+
+ <p>The algorithm takes a JSON-LD document <i>element</i> and returns an
+ <a class="tref internalDFN" title="rdf-dataset" href="#dfn-rdf-dataset">RDF dataset</a>. Unless the <i>produce generalized RDF</i> flag
+ is set to <a class="tref internalDFN" title="true" href="#dfn-true">true</a>, <a class="tref internalDFN" title="rdf-triple" href="#dfn-rdf-triple">RDF triples</a>
+ containing a <a class="tref internalDFN" title="blank-node" href="#dfn-blank-node">blank node</a> <a class="tref internalDFN" title="rdf-predicate" href="#dfn-rdf-predicate">predicate</a>
+ are excluded from output.</p>
+
+ <p>This algorithm generates new <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifiers</a>
+ and relabels existing <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifiers</a>.
+ The used <a href="#generate-blank-node-identifier">Generate Blank Node Identifier algorithm</a>
+ keeps an <i>identifier map</i> and a <i>counter</i> to ensure consistent
+ relabeling and avoid collisions. Thus, before this algorithm is run,
+ the <i>identifier map</i> is reset and the <i>counter</i> is initialized
+ to <code>0</code>.</p>
+
+ <ol class="algorithm">
+ <li>Expand <i>element</i> according to the
+ <a href="#expansion-algorithm">Expansion algorithm</a>.</li>
+ <li>Generate a <i>node map</i> according to the
+ <a href="#node-map-generation">Node Map Generation algorithm</a>.</li>
+ <li>Initialize an empty <a class="tref internalDFN" title="rdf-dataset" href="#dfn-rdf-dataset">RDF dataset</a> <i>dataset</i>.</li>
+ <li>For each <i>graph name</i> and <i>graph</i> in <i>node map</i>
+ ordered by <i>graph name</i>:
+ <ol class="algorithm">
+ <li>Initialize <i>triples</i> as an empty <a class="tref internalDFN" title="array" href="#dfn-array">array</a>.</li>
+ <li>For each <i>subject</i> and <i>node</i> in <i>graph</i> ordered
+ by <i>subject</i>:
+ <ol class="algorithm">
+ <li>For each <i>property</i> and <i>values</i> in <i>node</i>
+ ordered by <i>property</i>:
+ <ol class="algorithm">
+ <li>If <i>property</i> is <code>@type</code>, then for each
+ <i>type</i> in <i>values</i>, append a <a class="tref internalDFN" title="triple" href="http://www.w3.org/TR/rdf11-concepts/#dfn-rdf-triple">triple</a>
+ composed of <i>subject</i>, <code>rdf:type</code>,
+ and <i>type</i> to <i>triples</i>.</li>
+ <li>Otherwise, if <i>property</i> is a <a class="tref internalDFN" title="keyword" href="#dfn-keyword">keyword</a>
+ continue to the next <i>property</i>-<i>values</i> pair.</li>
+ <li>Otherwise, if <i>property</i> is a <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a> and
+ the <i>produce generalized RDF</i> flag is not <a class="tref internalDFN" title="true" href="#dfn-true">true</a>,
+ continue to the next <i>property</i>-<i>values</i> pair.</li>
+ <li>Otherwise, <i>property</i> is an <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a> or
+ <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a>. For each <i>item</i>
+ in <i>values</i>:
+ <ol class="algorithm">
+ <li>If <i>item</i> is a <a class="tref internalDFN" title="list-object" href="#dfn-list-object">list object</a>, initialize
+ <i>list triples</i> as an empty <a class="tref internalDFN" title="array" href="#dfn-array">array</a> and
+ <i>list head</i> to the result of the <a href="#list-to-rdf-conversion">List Conversion algorithm</a>, passing
+ the value associated with the <code>@list</code> key from
+ <i>item</i> and <i>list triples</i>. Append first a
+ <a class="tref internalDFN" title="triple" href="http://www.w3.org/TR/rdf11-concepts/#dfn-rdf-triple">triple</a> composed of <i>subject</i>,
+ <i>property</i>, and <i>list head</i> to <i>triples</i> and
+ finally append all <a class="tref internalDFN" title="triple" href="http://www.w3.org/TR/rdf11-concepts/#dfn-rdf-triple">triples</a> from
+ <i>list triples</i> to <i>triples</i>.</li>
+ <li>Otherwise, <i>item</i> is a <a class="tref internalDFN" title="value-object" href="#dfn-value-object">value object</a>
+ or a <a class="tref internalDFN" title="node-object" href="#dfn-node-object">node object</a>. Append a <a class="tref internalDFN" title="triple" href="http://www.w3.org/TR/rdf11-concepts/#dfn-rdf-triple">triple</a>
+ composed of <i>subject</i>, <i>property</i>, and
+ the result of using the
+ <a href="#object-to-rdf-conversion">Object to RDF Conversion algorithm</a>
+ passing <i>item</i> to <i>triples</i>.</li>
+ </ol>
+ </li>
+ </ol>
+ </li>
+ </ol>
+ </li>
+ <li>If <i>graph name</i> is <code>@default</code>, add
+ <i>triples</i> to the <a class="tref internalDFN" title="default-graph" href="#dfn-default-graph">default graph</a> in <i>dataset</i>.</li>
+ <li>Otherwise, create a <a class="tref internalDFN" title="named-graph" href="#dfn-named-graph">named graph</a> in <i>dataset</i>
+ composed of <i>graph name</i> and add <i>triples</i>.</li>
+ </ol>
+ </li>
+ <li>Return <i>dataset</i>.</li>
+ </ol>
+ </section>
+ </section> <!-- end of Deserialize JSON-LD to RDF algorithm -->
+
+ <section id="object-to-rdf-conversion">
+ <h3><span class="secno">10.2 </span>Object to RDF Conversion</h3>
+
+ <p>This algorithm takes a <a class="tref internalDFN" title="node-object" href="#dfn-node-object">node object</a> or <a class="tref internalDFN" title="value-object" href="#dfn-value-object">value object</a>
+ and transforms it into an
+ <a class="tref externalDFN" title="rdf-resource" href="http://www.w3.org/TR/rdf11-concepts/#dfn-resource">RDF resource</a>
+ to be used as the <a class="tref internalDFN" title="object" href="http://www.w3.org/TR/rdf11-concepts/#dfn-object">object</a> of an <a class="tref internalDFN" title="rdf-triple" href="#dfn-rdf-triple">RDF triple</a>.</p>
+
+ <section class="informative">
+ <h4 id="overview-14">Overview</h4><p><em>This section is non-normative.</em></p>
+
+ <p><a class="tref internalDFN" title="value-object" href="#dfn-value-object">Value objects</a> are transformed to
+ <a class="tref internalDFN" title="rdf-literal" href="http://www.w3.org/TR/rdf11-concepts/#dfn-literal">RDF literals</a> as described in
+ <a class="sectionRef" href="#data-round-tripping">section 10.6 Data Round Tripping</a>
+ whereas <a class="tref internalDFN" title="node-object" href="#dfn-node-object">node objects</a> are transformed
+ to <a class="tref internalDFN" title="iri" href="#dfn-iri">IRIs</a> or
+ <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifiers</a>.</p>
+ </section>
+
+ <section>
+ <h4 id="algorithm-14">Algorithm</h4>
+
+ <p>The algorithm takes as its sole argument <i>item</i> which must be
+ either a <a class="tref internalDFN" title="value-object" href="#dfn-value-object">value object</a> or <a class="tref internalDFN" title="node-object" href="#dfn-node-object">node object</a>.</p>
+
+ <ol class="algorithm">
+ <li>If <i>item</i> is a <a class="tref internalDFN" title="node-object" href="#dfn-node-object">node object</a> return the
+ <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a> or <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a> associated
+ with its <code>@id</code> member.</li>
+ <li>Otherwise, <i>item</i> is a <a class="tref internalDFN" title="value-object" href="#dfn-value-object">value object</a>. Initialize
+ <i>value</i> to the value associated with the <code>@value</code>
+ member in <i>item</i>.
+ </li><li>Initialize <i>datatype</i> to the value associated with the
+ <code>@type</code> member of <i>item</i> or <a class="tref internalDFN" title="null" href="#dfn-null">null</a> if
+ <i>item</i> does not have such a member.</li>
+ <li>If <i>value</i> is <a class="tref internalDFN" title="true" href="#dfn-true">true</a> or
+ <a class="tref internalDFN" title="false" href="#dfn-false">false</a>, set <i>value</i> to the <a class="tref internalDFN" title="string" href="#dfn-string">string</a>
+ <code>true</code> or <code>false</code> which is the
+ <a class="tref internalDFN" title="canonical-lexical-form" href="#dfn-canonical-lexical-form">canonical lexical form</a> as described in
+ <a class="sectionRef" href="#data-round-tripping">section 10.6 Data Round Tripping</a>
+ If <i>datatype</i> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, set it to
+ <code>xsd:boolean</code>.</li>
+ <li>Otherwise, if <i>value</i> is a <a class="tref internalDFN" title="number" href="#dfn-number">number</a> with a non-zero fractional
+ part (the result of a modulo‑1 operation) or <i>value</i> is a <a class="tref internalDFN" title="number" href="#dfn-number">number</a>
+ and <i>datatype</i> equals <code>xsd:double</code>, convert <i>value</i> to a
+ <a class="tref internalDFN" title="string" href="#dfn-string">string</a> in <a class="tref internalDFN" title="canonical-lexical-form" href="#dfn-canonical-lexical-form">canonical lexical form</a> of
+ an <code>xsd:double</code> as defined in [<cite><a class="bibref" href="#bib-XMLSCHEMA11-2">XMLSCHEMA11-2</a></cite>]
+ and described in
+ <a class="sectionRef" href="#data-round-tripping">section 10.6 Data Round Tripping</a>.
+ If <i>datatype</i> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, set it to
+ <code>xsd:double</code>.</li>
+ <li>Otherwise, if <i>value</i> is a <a class="tref internalDFN" title="number" href="#dfn-number">number</a> with no non-zero
+ fractional part (the result of a modulo‑1 operation) or <i>value</i>
+ is a <a class="tref internalDFN" title="number" href="#dfn-number">number</a> and <i>datatype</i>
+ equals <code>xsd:integer</code>, convert <i>value</i> to a
+ <a class="tref internalDFN" title="string" href="#dfn-string">string</a> in <a class="tref internalDFN" title="canonical-lexical-form" href="#dfn-canonical-lexical-form">canonical lexical form</a> of
+ an <code>xsd:integer</code> as defined in [<cite><a class="bibref" href="#bib-XMLSCHEMA11-2">XMLSCHEMA11-2</a></cite>]
+ and described in
+ <a class="sectionRef" href="#data-round-tripping">section 10.6 Data Round Tripping</a>.
+ If <i>datatype</i> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, set it to
+ <code>xsd:integer</code>.</li>
+ <li>Otherwise, if <i>datatype</i> is <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, set it to
+ <code>xsd:string</code> or <code>rdf:langString</code>, depending on if
+ item has an <code>@language</code> member.</li>
+ <li>Initialize <i>literal</i> as an <a class="tref internalDFN" title="rdf-literal" href="http://www.w3.org/TR/rdf11-concepts/#dfn-literal">RDF literal</a> using
+ <i>value</i> and <i>datatype</i>. If <i>item</i> has an
+ <code>@language</code> member, add the value associated with the
+ <code>@language</code> key as the language tag of <i>literal</i>.</li>
+ <li>Return <i>literal</i>.</li>
+
+ </ol>
+ </section>
+ </section> <!-- end of Object to RDF Conversion -->
+
+ <section id="list-to-rdf-conversion">
+ <h3><span class="secno">10.3 </span>List to RDF Conversion</h3>
+
+ <p>List Conversion is the process of taking a <a class="tref internalDFN" title="list-object" href="#dfn-list-object">list object</a>
+ and transforming it into an
+ <a class="tref externalDFN" title="rdf-collection" href="http://www.w3.org/TR/rdf-schema/#ch_collectionvocab">RDF Collection</a>
+ as defined in RDF Semantics [<cite><a class="bibref" href="#bib-RDF-MT">RDF-MT</a></cite>].</p>
+
+ <section class="informative">
+ <h4 id="overview-15">Overview</h4><p><em>This section is non-normative.</em></p>
+
+ <p>For each element of the <a class="tref internalDFN" title="list" href="#dfn-list">list</a> a new <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a>
+ is allocated which is used to generate <code>rdf:first</code> and
+ <code>rdf:rest</code> <a class="tref internalDFN" title="rdf-triple" href="#dfn-rdf-triple">triples</a>. The
+ algorithm returns the list head, which is either the first allocated
+ <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a> or <code>rdf:nil</code> if the
+ <a class="tref internalDFN" title="list" href="#dfn-list">list</a> is empty.</p>
+ </section>
+
+ <section>
+ <h4 id="algorithm-15">Algorithm</h4>
+
+ <p>The algorithm takes two inputs: an <a class="tref internalDFN" title="array" href="#dfn-array">array</a> <i>list</i>
+ and an empty <a class="tref internalDFN" title="array" href="#dfn-array">array</a> <i>list triples</i> used for returning
+ the generated <a class="tref internalDFN" title="rdf-triple" href="#dfn-rdf-triple">triples</a>.</p>
+
+ <ol class="algorithm">
+ <li>If <i>list</i> is empty, return <code>rdf:nil</code>.</li>
+ <li>Otherwise, create an <a class="tref internalDFN" title="array" href="#dfn-array">array</a> <i>bnodes</i> composed of a
+ <a href="#generate-blank-node-identifier">newly generated blank node identifier</a>
+ for each entry in <i>list</i>.</li>
+ <li>Initialize an empty <a class="tref internalDFN" title="array" href="#dfn-array">array</a> <i>list triples</i>.</li>
+ <li>For each pair of <i>subject</i> from <i>bnodes</i> and <i>item</i> from <i>list</i>:
+ <ol class="algorithm">
+ <li>Append a <a class="tref internalDFN" title="triple" href="http://www.w3.org/TR/rdf11-concepts/#dfn-rdf-triple">triple</a> composed of <i>subject</i>,
+ <code>rdf:first</code>, and the result of using th
+ <a href="#object-to-rdf-conversion">Object to RDF Conversion algorithm</a>
+ passing <i>item</i> to <i>list triples</i>.</li>
+ <li>Set <i>rest</i> as the next entry in <i>bnodes</i>, or if that
+ does not exist, <code>rdf:nil</code>. Append a
+ <a class="tref internalDFN" title="triple" href="http://www.w3.org/TR/rdf11-concepts/#dfn-rdf-triple">triple</a> composed of <i>subject</i>,
+ <code>rdf:rest</code>, and <i>rest</i> to <i>list triples</i>.</li>
+ </ol>
+ </li>
+ <li>Return the first <a class="tref internalDFN" title="blank-node" href="#dfn-blank-node">blank node</a> from <i>bnodes</i> or
+ <code>rdf:nil</code> if <i>bnodes</i> is empty.</li>
+ </ol>
+ </section>
+ </section> <!-- end of List to RDF -->
+
+ <section id="serialize-rdf-as-json-ld-algorithm">
+ <h3><span class="secno">10.4 </span>Serialize RDF as JSON-LD Algorithm</h3>
+
+ <p>This algorithm serializes an <a class="tref internalDFN" title="rdf-dataset" href="#dfn-rdf-dataset">RDF dataset</a> consisting of a
+ <a class="tref internalDFN" title="default-graph" href="#dfn-default-graph">default graph</a> and zero or more
+ <a class="tref internalDFN" title="named-graph" href="#dfn-named-graph">named graphs</a> into a JSON-LD document.</p>
+
+ <section class="informative">
+ <h4 id="overview-16">Overview</h4><p><em>This section is non-normative.</em></p>
+
+ <p>Iterate through each graph in the dataset, converting each
+ <a class="tref internalDFN" title="rdf-collection" href="http://www.w3.org/TR/rdf-schema/#ch_collectionvocab">RDF Collection</a> into a <a class="tref internalDFN" title="list" href="#dfn-list">list</a>
+ and generating a JSON-LD document in expanded form for all
+ <a class="tref internalDFN" title="rdf-literal" href="http://www.w3.org/TR/rdf11-concepts/#dfn-literal">RDF literals</a>, <a class="tref internalDFN" title="iri" href="#dfn-iri">IRIs</a>
+ and <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifiers</a>.
+ If the <i>use native types</i> flag is set to <a class="tref internalDFN" title="true" href="#dfn-true">true</a>,
+ <a class="tref internalDFN" title="rdf-literal" href="http://www.w3.org/TR/rdf11-concepts/#dfn-literal">RDF literals</a> with a
+ <a class="tref externalDFN" title="datatype-iri" href="http://www.w3.org/TR/rdf11-concepts/#dfn-datatype-iri">datatype <abbr title="Internationalized Resource Identifier">IRI</abbr></a>
+ that equals <code>xsd:integer</code> or <code>xsd:double</code> are converted
+ to a <a class="tref internalDFN" title="number" href="#dfn-number">JSON numbers</a> and <a class="tref internalDFN" title="rdf-literal" href="http://www.w3.org/TR/rdf11-concepts/#dfn-literal">RDF literals</a>
+ with a <a class="tref externalDFN" title="datatype-iri" href="http://www.w3.org/TR/rdf11-concepts/#dfn-datatype-iri">datatype <abbr title="Internationalized Resource Identifier">IRI</abbr></a>
+ that equals <code>xsd:boolean</code> are converted to <a class="tref internalDFN" title="true" href="#dfn-true">true</a> or
+ <a class="tref internalDFN" title="false" href="#dfn-false">false</a> based on their
+ <a class="tref externalDFN" title="lexical-form" href="http://www.w3.org/TR/rdf11-concepts/#dfn-lexical-form">lexical form</a>
+ as described in
+ <a class="sectionRef" href="#data-round-tripping">section 10.6 Data Round Tripping</a>.</p>
+ </section>
+
+ <section>
+ <h4 id="algorithm-16">Algorithm</h4>
+
+ <p>The algorithm takes two required inputs: an <a class="tref internalDFN" title="rdf-dataset" href="#dfn-rdf-dataset">RDF dataset</a> and a flag
+ <i>use native types</i> that defaults to <a class="tref internalDFN" title="false" href="#dfn-false">false</a>.</p>
+
+ <ol class="algorithm">
+ <li>Initialize <i>default graph</i> to an empty <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>.</li>
+ <li>Initialize <i>graph map</i> to a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> consisting
+ of a single member <code>@default</code> whose value references
+ <i>default graph</i>.</li>
+ <li>For each <i>graph</i> in <a class="tref internalDFN" title="rdf-dataset" href="#dfn-rdf-dataset">RDF dataset</a>:
+ <ol class="algorithm">
+ <li>If <i>graph</i> is the <a class="tref internalDFN" title="default-graph" href="#dfn-default-graph">default graph</a>,
+ set <i>name</i> to <code>@default</code>, otherwise to the
+ <a class="tref internalDFN" title="graph-name" href="#dfn-graph-name">graph name</a> associated with <i>graph</i>.</li>
+ <li>If <i>graph map</i> has no <i>name</i> member, create one and set
+ its value to an empty <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>.</li>
+ <li>If <i>graph</i> is not the <a class="tref internalDFN" title="default-graph" href="#dfn-default-graph">default graph</a> and
+ <i>default graph</i> does not have a <i>name</i> member,
+ create such a member and initialize its value to a new
+ <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> with a single member <code>@id</code>
+ whose value is <i>name</i>.</li>
+ <li>Reference the value of the <i>name</i> member in <i>graph map</i>
+ using the variable <i>node map</i>.</li>
+ <li>For each <a class="tref internalDFN" title="rdf-triple" href="#dfn-rdf-triple">RDF triple</a> in <i>graph</i>
+ consisting of <i>subject</i>, <i>predicate</i>, and <i>object</i>:
+ <ol class="algorithm">
+ <li>If <i>node map</i> does not have a <i>subject</i> member,
+ create one and initialize its value to a new <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>
+ consisting of a single member <code>@id</code> whose value is
+ set to <i>subject</i>.</li>
+ <li>Reference the value of the <i>subject</i> member in <i>node map</i>
+ using the variable <i>node</i>.</li>
+ <li>If <i>object</i> is an <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a> or <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a>,
+ and <i>node map</i> does not have an <i>object</i> member,
+ create one and initialize its value to a new <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>
+ consisting of a single member <code>@id</code> whose value is
+ set to <i>object</i>.</li>
+ <li>If <i>predicate</i> equals <code>rdf:type</code>, and <i>object</i>
+ is an <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a> or <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a>,
+ append <i>object</i> to the value of the <code>@type</code>
+ member of <i>node</i>; unless such an item already exists.
+ If no such member exists, create one
+ and initialize it to an <a class="tref internalDFN" title="array" href="#dfn-array">array</a> whose only item is
+ <i>object</i>. Finally, continue to the next
+ <a class="tref internalDFN" title="rdf-triple" href="#dfn-rdf-triple">RDF triple</a>.</li>
+ <li>Set <i>value</i> to the result of using the
+ <a href="#rdf-to-object-conversion">RDF to Object Conversion algorithm</a>,
+ passing <i>object</i> and <i>use native types</i>.</li>
+ <li>If <i>node</i> does not have an <i>predicate</i> member, create one
+ and initialize its value to an empty <a class="tref internalDFN" title="array" href="#dfn-array">array</a>.</li>
+ <li>If there is no item equivalent to <i>value</i> in the <a class="tref internalDFN" title="array" href="#dfn-array">array</a>
+ associated with the <i>predicate</i> member of <i>node</i>, append a
+ reference to <i>value</i> to the <a class="tref internalDFN" title="array" href="#dfn-array">array</a>. Two JSON objects
+ are considered equal if they have equivalent key-value pairs.</li>
+ <li>If <i>object</i> is a <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a> or <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a>,
+ it might represent the list node:
+ <ol class="algorithm">
+ <li>If the <i>object</i> member of <i>node map</i> has no
+ <code>usages</code> member, create one and initialize it to
+ an empty <a class="tref internalDFN" title="array" href="#dfn-array">array</a>.</li>
+ <li>Reference the <code>usages</code> member of the <i>object</i>
+ member of <i>node map</i> using the variable <i>usages</i>.</li>
+ <li>Append a new <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> consisting of three
+ members, <code>node</code>, <code>property</code>, and <code>value</code>
+ to the <i>usages</i> <a class="tref internalDFN" title="array" href="#dfn-array">array</a>. The <code>node</code> member
+ is set to a reference to <i>node</i>, <code>property</code> to <i>predicate</i>,
+ and <code>value</code> to a reference to <i>value</i>.</li>
+ </ol>
+ </li>
+ </ol>
+ </li>
+ </ol>
+ </li>
+ <li>For each <i>name</i> and <i>graph object</i> in <i>graph map</i>:
+ <ol class="algorithm">
+ <li>If <i>graph object</i> has no <code>rdf:nil</code> member, continue
+ with the next <i>name</i>-<i>graph object</i> pair as the graph does
+ not contain any lists that need to be converted.</li>
+ <li>Initialize <i>nil</i> to the value of the <code>rdf:nil</code> member
+ of <i>graph object</i>.</li>
+ <li>For each item <i>usage</i> in the <code>usages</code> member of
+ <i>nil</i>, perform the following steps:
+ <ol class="algorithm">
+ <li>Initialize <i>node</i> to the value of the value of the
+ <code>node</code> member of <i>usage</i>, <i>property</i> to
+ the value of the <code>property</code> member of <i>usage</i>,
+ and <i>head</i> to the value of the <code>value</code> member
+ of <i>usage</i>.</li>
+ <li>Initialize two empty <a class="tref internalDFN" title="array" href="#dfn-array">arrays</a> <i>list</i>
+ and <i>list nodes</i>.</li>
+ <li>While <i>property</i> equals <code>rdf:rest</code>, the value
+ associated to the <code>usages</code> member of <i>node</i> has
+ exactly 1 entry, <i>node</i> has a <code>rdf:first</code> and
+ <code>rdf:rest</code> property, both of which have as value an
+ <a class="tref internalDFN" title="array" href="#dfn-array">array</a> consisting of a single element, and <i>node</i>
+ has no other members apart from an optional <code>@type</code>
+ member whose value is an array with a single item equal to
+ <code>rdf:List</code>, <i>node</i> represents a well-formed list
+ node. Perform the following steps to traverse the list backwards
+ towards its head:
+ <ol class="algorithm">
+ <li>Append the only item of <code>rdf:first</code> member of
+ <i>node</i> to the <i>list</i> <a class="tref internalDFN" title="array" href="#dfn-array">array</a>.</li>
+ <li>Append the value of the <code>@id</code> member of
+ <i>node</i> to the <i>list nodes</i> <a class="tref internalDFN" title="array" href="#dfn-array">array</a>.</li>
+ <li>Initialize <i>node usage</i> to the only item of the
+ <code>usages</code> member of <i>node</i>.</li>
+ <li>Set <i>node</i> to the value of the <code>node</code> member
+ of <i>node usage</i>, <i>property</i> to the value of the
+ <code>property</code> member of <i>node usage</i>, and
+ <i>head</i> to the value of the <code>value</code> member
+ of <i>node usage</i>.</li>
+ <li>If the <code>@id</code> member of <i>node</i> is an
+ <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a> instead of a <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a>,
+ exit the while loop.</li>
+ </ol>
+ </li>
+ <li>If <i>property</i> equals <code>rdf:first</code>, i.e., the
+ detected list is nested inside another list
+ <ol class="algorithm">
+ <li>and the value of the <code>@id</code> of <i>node</i> equals
+ <code>rdf:nil</code>, i.e., the detected list is empty,
+ continue with the next <i>usage</i> item. The
+ <code>rdf:nil</code> node cannot be converted to a
+ <a class="tref internalDFN" title="list-object" href="#dfn-list-object">list object</a> as it would result in a list of
+ lists, which isn't supported.</li>
+ <li>Otherwise, the list consists of at least one item. We preserve the
+ head node and transform the rest of the linked list to a
+ <a class="tref internalDFN" title="list-object" href="#dfn-list-object">list object</a>.</li>
+ <li>Set <i>head id</i> to the value of the <code>@id</code>
+ member of <i>head</i>.</li>
+ <li>Set <i>head</i> to the value of the <i>head id</i> member of
+ <i>graph object</i> so that all it's properties can be accessed.</li>
+ <li>Then, set <i>head</i> to the only item in the value of the
+ <code>rdf:rest</code> member of <i>head</i>.</li>
+ <li>Finally, remove the last item of the <i>list</i> <a class="tref internalDFN" title="array" href="#dfn-array">array</a>
+ and the last item of the <i>list nodes</i> <a class="tref internalDFN" title="array" href="#dfn-array">array</a>.</li>
+ </ol>
+ </li>
+ <li>Remove the <code>@id</code> member from <i>head</i>.</li>
+ <li>Reverse the order of the <i>list</i> <a class="tref internalDFN" title="array" href="#dfn-array">array</a>.</li>
+ <li>Add a <code>@list</code> member to <i>head</i> and initialize
+ its value to the <i>list</i> <a class="tref internalDFN" title="array" href="#dfn-array">array</a>.</li>
+ <li>For each item <i>node id</i> in <i>list nodes</i>, remove the
+ <i>node id</i> member from <i>graph object</i>.</li>
+ </ol>
+ </li>
+ </ol>
+ </li>
+ <li>Initialize an empty <a class="tref internalDFN" title="array" href="#dfn-array">array</a> <i>result</i>.</li>
+ <li>For each <i>subject</i> and <i>node</i> in <i>default graph</i>
+ ordered by <i>subject</i>:
+ <ol class="algorithm">
+ <li>If <i>graph map</i> has a <i>subject</i> member:
+ <ol class="algorithm">
+ <li>Add a <code>@graph</code> member to <i>node</i> and initialize
+ its value to an empty <a class="tref internalDFN" title="array" href="#dfn-array">array</a>.</li>
+ <li>For each key-value pair <i>s</i>-<i>n</i> in the <i>subject</i>
+ member of <i>graph map</i> ordered by <i>s</i>, append <i>n</i>
+ to the <code>@graph</code> member of <i>node</i> after
+ removing its <code>usages</code> member, unless the only
+ remaining member of <i>n</i> is <code>@id</code>.</li>
+ </ol>
+ </li>
+ <li>Append <i>node</i> to <i>result</i> after removing its
+ <code>usages</code> member, unless the only remaining member of
+ <i>node</i> is <code>@id</code>.</li>
+ </ol>
+ </li>
+ <li>Return <i>result</i>.</li>
+ </ol>
+ </section>
+ </section> <!-- end of Serialize RDF as JSON-LD Algorithm -->
+
+ <section id="rdf-to-object-conversion">
+ <h3><span class="secno">10.5 </span>RDF to Object Conversion</h3>
+
+ <p>This algorithm transforms an RDF literal to a JSON-LD <a class="tref internalDFN" title="value-object" href="#dfn-value-object">value object</a>
+ and a RDF blank node or <abbr title="Internationalized Resource Identifier">IRI</abbr> to an JSON-LD <a class="tref internalDFN" title="node-object" href="#dfn-node-object">node object</a>.</p>
+
+ <section class="informative">
+ <h4 id="overview-17">Overview</h4><p><em>This section is non-normative.</em></p>
+
+ <p><a class="tref internalDFN" title="rdf-literal" href="http://www.w3.org/TR/rdf11-concepts/#dfn-literal">RDF literals</a> are transformed to
+ <a class="tref internalDFN" title="value-object" href="#dfn-value-object">value objects</a> whereas <a class="tref internalDFN" title="iri" href="#dfn-iri">IRIs</a> and
+ <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifiers</a> are
+ transformed to <a class="tref internalDFN" title="node-object" href="#dfn-node-object">node objects</a>.
+ If the <i>use native types</i> flag is set to <a class="tref internalDFN" title="true" href="#dfn-true">true</a>,
+ <a class="tref internalDFN" title="rdf-literal" href="http://www.w3.org/TR/rdf11-concepts/#dfn-literal">RDF literals</a> with a
+ <a class="tref externalDFN" title="datatype-iri" href="http://www.w3.org/TR/rdf11-concepts/#dfn-datatype-iri">datatype <abbr title="Internationalized Resource Identifier">IRI</abbr></a>
+ that equals <code>xsd:integer</code> or <code>xsd:double</code> are converted
+ to a <a class="tref internalDFN" title="number" href="#dfn-number">JSON numbers</a> and <a class="tref internalDFN" title="rdf-literal" href="http://www.w3.org/TR/rdf11-concepts/#dfn-literal">RDF literals</a>
+ with a <a class="tref externalDFN" title="datatype-iri" href="http://www.w3.org/TR/rdf11-concepts/#dfn-datatype-iri">datatype <abbr title="Internationalized Resource Identifier">IRI</abbr></a>
+ that equals <code>xsd:boolean</code> are converted to <a class="tref internalDFN" title="true" href="#dfn-true">true</a> or
+ <a class="tref internalDFN" title="false" href="#dfn-false">false</a> based on their
+ <a class="tref externalDFN" title="lexical-form" href="http://www.w3.org/TR/rdf11-concepts/#dfn-lexical-form">lexical form</a>
+ as described in
+ <a class="sectionRef" href="#data-round-tripping">section 10.6 Data Round Tripping</a>.</p>
+ </section>
+
+ <section>
+ <h4 id="algorithm-17">Algorithm</h4>
+
+ <p>This algorithm takes two required inputs: a <i>value</i> to be converted
+ to a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> and a flag <i>use native types</i>.</p>
+
+ <ol class="algorithm">
+ <li>If <i>value</i> is an <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a> or a
+ <a class="tref internalDFN" title="blank-node-identifier" href="#dfn-blank-node-identifier">blank node identifier</a>, return a new <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>
+ consisting of a single member <code>@id</code> whose value is set to
+ <i>value</i>.</li>
+ <li>Otherwise <i>value</i> is an
+ <a class="tref externalDFN" title="rdf-literal" href="http://www.w3.org/TR/rdf11-concepts/#dfn-literal">RDF literal</a>:
+ <ol class="algorithm">
+ <li>Initialize a new empty <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> result.</li>
+ <li>Initialize <i>converted value</i> to <i>value</i>.</li>
+ <li>Initialize <i>type</i> to <a class="tref internalDFN" title="null" href="#dfn-null">null</a></li>
+ <li>If <i>use native types</i> is <a class="tref internalDFN" title="true" href="#dfn-true">true</a>
+ <ol class="algorithm">
+ <li>If the
+ <a class="tref externalDFN" title="datatype-iri" href="http://www.w3.org/TR/rdf11-concepts/#dfn-datatype-iri">datatype <abbr title="Internationalized Resource Identifier">IRI</abbr></a>
+ of <i>value</i> equals <code>xsd:string</code>, set
+ <i>converted value</i> to the
+ <a class="tref externalDFN" title="lexical-form" href="http://www.w3.org/TR/rdf11-concepts/#dfn-lexical-form">lexical form</a>
+ of <i>value</i>.</li>
+ <li>Otherwise, if the
+ <a class="tref externalDFN" title="datatype-iri" href="http://www.w3.org/TR/rdf11-concepts/#dfn-datatype-iri">datatype <abbr title="Internationalized Resource Identifier">IRI</abbr></a>
+ of <i>value</i> equals <code>xsd:boolean</code>, set
+ <i>converted value</i> to <a class="tref internalDFN" title="true" href="#dfn-true">true</a> if the
+ <a class="tref externalDFN" title="lexical-form" href="http://www.w3.org/TR/rdf11-concepts/#dfn-lexical-form">lexical form</a>
+ of <i>value</i> matches <code>true</code>, or <a class="tref internalDFN" title="false" href="#dfn-false">false</a>
+ if it matches <code>false</code>. If it matches neither,
+ set <i>type</i> to <code>xsd:boolean</code>.</li>
+ <li>Otherwise, if the
+ <a class="tref externalDFN" title="datatype-iri" href="http://www.w3.org/TR/rdf11-concepts/#dfn-datatype-iri">datatype <abbr title="Internationalized Resource Identifier">IRI</abbr></a>
+ of <i>value</i> equals <code>xsd:integer</code> or
+ <code>xsd:double</code> and its
+ <a class="tref externalDFN" title="lexical-form" href="http://www.w3.org/TR/rdf11-concepts/#dfn-lexical-form">lexical form</a>
+ is a valid <code>xsd:integer</code> or <code>xsd:double</code>
+ according [<cite><a class="bibref" href="#bib-XMLSCHEMA11-2">XMLSCHEMA11-2</a></cite>], set <i>converted value</i>
+ to the result of converting the
+ <a class="tref externalDFN" title="lexical-form" href="http://www.w3.org/TR/rdf11-concepts/#dfn-lexical-form">lexical form</a>
+ to a JSON <a class="tref internalDFN" title="number" href="#dfn-number">number</a>.</li>
+ </ol>
+ </li>
+ <li>Otherwise, if <i>value</i> is a
+ <a class="tref externalDFN" title="language-tagged-string" href="http://www.w3.org/TR/rdf11-concepts/#dfn-language-tagged-string">language-tagged string</a>
+ add a member <code>@language</code> to <i>result</i> and set its value to the
+ <a class="tref externalDFN" title="language-tag" href="http://www.w3.org/TR/rdf11-concepts/#dfn-language-tag">language tag</a>
+ of <i>value</i>.</li>
+ <li>Otherwise, set <i>type</i> to the
+ <a class="tref externalDFN" title="datatype-iri" href="http://www.w3.org/TR/rdf11-concepts/#dfn-datatype-iri">datatype <abbr title="Internationalized Resource Identifier">IRI</abbr></a>
+ of <i>value</i>, unless it equals <code>xsd:string</code> which is ignored.</li>
+ <li>Add a member <code>@value</code> to <i>result</i> whose value
+ is set to <i>converted value</i>.</li>
+ <li>If <i>type</i> is not <a class="tref internalDFN" title="null" href="#dfn-null">null</a>, add a member <code>@type</code>
+ to <i>result</i> whose value is set to <i>type</i>.</li>
+ <li>Return <i>result</i>.</li>
+ </ol>
+ </li>
+ </ol>
+ </section>
+ </section>
+
+ <section id="data-round-tripping">
+ <h3><span class="secno">10.6 </span>Data Round Tripping</h3>
+
+ <p>When <a href="#deserialize-json-ld-to-rdf-algorithm">deserializing JSON-LD to RDF</a>
+ JSON-native <a class="tref internalDFN" title="number" href="#dfn-number">numbers</a> are automatically
+ type-coerced to <code>xsd:integer</code> or <code>xsd:double</code>
+ depending on whether the <a class="tref internalDFN" title="number" href="#dfn-number">number</a> has a non-zero fractional part
+ or not (the result of a modulo‑1 operation), the boolean values
+ <a class="tref internalDFN" title="true" href="#dfn-true">true</a> and <a class="tref internalDFN" title="false" href="#dfn-false">false</a> are coerced to <code>xsd:boolean</code>,
+ and <a class="tref internalDFN" title="string" href="#dfn-string">strings</a> are coerced to <code>xsd:string</code>.
+ The numeric or boolean values themselves are converted to
+ <dfn title="canonical-lexical-form" id="dfn-canonical-lexical-form">canonical lexical form</dfn>, i.e., a deterministic string
+ representation as defined in [<cite><a class="bibref" href="#bib-XMLSCHEMA11-2">XMLSCHEMA11-2</a></cite>].</p>
+
+ <p>The <a class="tref internalDFN" title="canonical-lexical-form" href="#dfn-canonical-lexical-form">canonical lexical form</a> of an <em>integer</em>, i.e., a
+ <a class="tref internalDFN" title="number" href="#dfn-number">number</a> with no non-zero fractional part or a <a class="tref internalDFN" title="number" href="#dfn-number">number</a>
+ coerced to <code>xsd:integer</code>, is a finite-length sequence of decimal
+ digits (<code>0-9</code>) with an optional leading minus sign; leading
+ zeros are prohibited. In JavaScript, implementers can use the following
+ snippet of code to convert an integer to
+ <a class="tref internalDFN" title="canonical-lexical-form" href="#dfn-canonical-lexical-form">canonical lexical form</a>:</p>
+
+ <div class="example"><div class="example-title"><span>Example 12</span>: Sample integer serialization implementation in JavaScript</div><pre class="example">(value).toFixed(0).toString()</pre></div>
+
+ <p>The <a class="tref internalDFN" title="canonical-lexical-form" href="#dfn-canonical-lexical-form">canonical lexical form</a> of a <em>double</em>, i.e., a
+ <a class="tref internalDFN" title="number" href="#dfn-number">number</a> with a non-zero fractional part or a <a class="tref internalDFN" title="number" href="#dfn-number">number</a>
+ coerced to <code>xsd:double</code>, consists of a mantissa followed by the
+ character <code>E</code>, followed by an exponent. The mantissa is a
+ decimal number and the exponent is an integer. Leading zeros and a
+ preceding plus sign (<code>+</code>) are prohibited in the exponent.
+ If the exponent is zero, it is indicated by <code>E0</code>. For the
+ mantissa, the preceding optional plus sign is prohibited and the
+ decimal point is required. Leading and trailing zeros are prohibited
+ subject to the following: number representations must be normalized
+ such that there is a single digit which is non-zero to the left of
+ the decimal point and at least a single digit to the right of the
+ decimal point unless the value being represented is zero. The
+ canonical representation for zero is <code>0.0E0</code>.
+ <code>xsd:double</code>'s value space is defined by the IEEE
+ double-precision 64-bit floating point type [<cite><a class="bibref" href="#bib-IEEE-754-1985">IEEE-754-1985</a></cite>] whereas
+ the value space of JSON <a class="tref internalDFN" title="number" href="#dfn-number">numbers</a> is not
+ specified; when deserializing JSON-LD to RDF the mantissa is rounded to
+ 15 digits after the decimal point. In JavaScript, implementers
+ can use the following snippet of code to convert a double to
+ <a class="tref internalDFN" title="canonical-lexical-form" href="#dfn-canonical-lexical-form">canonical lexical form</a>:</p>
+
+ <div class="example"><div class="example-title"><span>Example 13</span>: Sample floating point number serialization implementation in JavaScript</div><pre class="example">(value).toExponential(15).replace(/(\d)0*e\+?/,'$1E')</pre></div>
+
+ <p>The <a class="tref internalDFN" title="canonical-lexical-form" href="#dfn-canonical-lexical-form">canonical lexical form</a> of the <em>boolean</em>
+ values <a class="tref internalDFN" title="true" href="#dfn-true">true</a> and <a class="tref internalDFN" title="false" href="#dfn-false">false</a> are the strings
+ <code>true</code> and <code>false</code>.</p>
+
+ <p>When JSON-native <a class="tref internalDFN" title="number" href="#dfn-number">numbers</a> are deserialized
+ to RDF, lossless data round-tripping cannot be guaranteed, as rounding
+ errors might occur. When
+ <a href="#serialize-rdf-as-json-ld-algorithm">serializing RDF as JSON-LD</a>,
+ similar rounding errors might occur. Furthermore, the datatype or the lexical
+ representation might be lost. An <code>xsd:double</code> with a value
+ of <code>2.0</code> will, e.g., result in an <code>xsd:integer</code>
+ with a value of <code>2</code> in <a class="tref internalDFN" title="canonical-lexical-form" href="#dfn-canonical-lexical-form">canonical lexical form</a>
+ when converted from RDF to JSON-LD and back to RDF. It is important
+ to highlight that in practice it might be impossible to losslessly
+ convert an <code>xsd:integer</code> to a <a class="tref internalDFN" title="number" href="#dfn-number">number</a> because
+ its value space is not limited. While the JSON specification [<cite><a class="bibref" href="#bib-RFC4627">RFC4627</a></cite>]
+ does not limit the value space of <a class="tref internalDFN" title="number" href="#dfn-number">numbers</a>
+ either, concrete implementations typically do have a limited value
+ space.</p>
+
+ <p>To ensure lossless round-tripping the
+ <a href="#serialize-rdf-as-json-ld-algorithm">Serialize RDF as JSON-LD algorithm</a>
+ specifies a <i>use native types</i> flag which controls whether
+ <a class="tref externalDFN" title="rdf-literals" href="http://www.w3.org/TR/rdf11-concepts/#dfn-literal">RDF literals</a>
+ with a <a class="tref externalDFN" title="datatype-iri" href="http://www.w3.org/TR/rdf11-concepts/#dfn-datatype-iri">datatype <abbr title="Internationalized Resource Identifier">IRI</abbr></a>
+ equal to <code>xsd:integer</code>, <code>xsd:double</code>, or
+ <code>xsd:boolean</code> are converted to their JSON-native
+ counterparts. If the <i>use native types</i> flag is set to
+ <a class="tref internalDFN" title="false" href="#dfn-false">false</a>, all literals remain in their original string
+ representation.</p>
+
+ <p>Some JSON serializers, such as PHP's native implementation in some versions,
+ backslash-escape the forward slash character. For example, the value
+ <code>http://example.com/</code> would be serialized as <code>http:\/\/example.com\/</code>.
+ This is problematic as other JSON parsers might not understand those escaping characters.
+ There is no need to backslash-escape forward slashes in JSON-LD. To aid
+ interoperability between JSON-LD processors, forward slashes <em class="rfc2119" title="MUST NOT">MUST NOT</em> be
+ backslash-escaped.</p>
+ </section> <!-- end of Data Round Tripping -->
+</section>
+
+
+<section id="the-application-programming-interface">
+ <!--OddPage--><h2><span class="secno">11. </span>The Application Programming Interface</h2>
+
+ <p>This API provides a clean mechanism that enables developers to convert
+ JSON-LD data into a variety of output formats that are often easier to
+ work with. A conformant <a class="tref internalDFN" title="json-ld-api-implementation" href="#dfn-json-ld-api-implementation">JSON-LD API Implementation</a> <em class="rfc2119" title="MUST">MUST</em>
+ implement the entirety of the following API.</p>
+
+ <p>The JSON-LD API uses <a class="tref internalDFN" title="promise" href="#dfn-promise">Promises</a> to represent
+ the result of the various asynchronous operations.
+ <dfn title="promise" id="dfn-promise">Promises</dfn> are defined in
+ <cite><a href="http://dom.spec.whatwg.org/#promises">section 4 Promises</a></cite>
+ of [<cite><a class="bibref" href="#bib-DOM-WHATWG">DOM-WHATWG</a></cite>].</p>
+
+ <div class="issue atrisk"><div class="issue-title" role="heading" aria-level="3"><span>Feature at Risk 8</span>: Properly referencing the DOM Promises spec</div><div class="atrisk">
+ <p class="atrisk-head">Note: This feature is
+ <a href="http://www.w3.org/2005/10/Process-20051014/tr#cfi">"at risk"</a> and may
+ be removed or modified heavily from the feature described in this specification
+ based on reviewer feedback. Please send feedback to
+ <a href="mailto:public-rdf-comments@w3.org">public-rdf-comments@w3.org</a>.
+ For the current status see
+ <a href="http://www.w3.org/2011/rdf-wg/wiki/JSON-LD_Features_at_Risk">features "at risk" in JSON-LD 1.0</a></p>
+ <p>The JSON-LD API specification currently only refers to the "Promise" interface and does not attempt to provide any details on the specific implementation of Promises. That is, it does not reference whether or not '.then()' must be specified. This is done in order to allow for some implementation flexibility in the event the DOM Promises spec changes. The editors of the WHATWG DOM specification have asserted that the Promise interface is ready to be incorporated into specifications. The issue relates to how to properly refer to a spec living in the WHATWG as a living standard as well as how to ensure that the interface provided by the spec is stable.</p>
+ </div></div>
+
+ <section id="the-jsonldprocessor-interface">
+ <h3><span class="secno">11.1 </span>The <a href="#idl-def-JsonLdProcessor" class="idlType"><code>JsonLdProcessor</code></a> Interface</h3>
+
+ <p>The <a href="#idl-def-JsonLdProcessor" class="idlType"><code>JsonLdProcessor</code></a> interface is the high-level programming structure
+ that developers use to access the JSON-LD transformation methods.</p>
+
+ <p>It is important to highlight that conformant
+ <a class="tref internalDFN" title="json-ld-api-implementation" href="#dfn-json-ld-api-implementation">JSON-LD API Implementations</a>
+ <em class="rfc2119" title="MUST NOT">MUST NOT</em> modify the input parameters. If an error is detected, the Promise is
+ rejected passing a <a href="#idl-def-JsonLdError" class="idlType"><code>JsonLdError</code></a> with the corresponding error
+ <code class="idlMemberName"><a href="#widl-JsonLdError-code">code</a></code>
+ and processing is stopped.</p>
+
+ <pre class="idl"><span class="idlInterface" id="idl-def-JsonLdProcessor">[<span class="extAttr">Constructor</span>]
+interface <span class="idlInterfaceID">JsonLdProcessor</span> {
+<span class="idlMethod"> <span class="idlMethType"><a href="#dfn-promise" class="internalDFN">Promise</a></span> <span class="idlMethName"><a href="#widl-JsonLdProcessor-compact-Promise-any-input-JsonLdContext-context-JsonLdOptions-options">compact</a></span> (<span class="idlParam"><span class="idlParamType"><a>any</a></span> <span class="idlParamName">input</span></span>, <span class="idlParam"><span class="idlParamType"><a href="#idl-def-JsonLdContext" class="idlType"><code>JsonLdContext</code></a></span> <span class="idlParamName">context</span></span>, <span class="idlParam">optional <span class="idlParamType"><a href="#idl-def-JsonLdOptions" class="idlType"><code>JsonLdOptions</code></a></span> <span class="idlParamName">options</span></span>);</span>
+<span class="idlMethod"> <span class="idlMethType"><a href="#dfn-promise" class="internalDFN">Promise</a></span> <span class="idlMethName"><a href="#widl-JsonLdProcessor-expand-Promise-any-input-JsonLdOptions-options">expand</a></span> (<span class="idlParam"><span class="idlParamType"><a>any</a></span> <span class="idlParamName">input</span></span>, <span class="idlParam">optional <span class="idlParamType"><a href="#idl-def-JsonLdOptions" class="idlType"><code>JsonLdOptions</code></a></span> <span class="idlParamName">options</span></span>);</span>
+<span class="idlMethod"> <span class="idlMethType"><a href="#dfn-promise" class="internalDFN">Promise</a></span> <span class="idlMethName"><a href="#widl-JsonLdProcessor-flatten-Promise-any-input-JsonLdContext-context-JsonLdOptions-options">flatten</a></span> (<span class="idlParam"><span class="idlParamType"><a>any</a></span> <span class="idlParamName">input</span></span>, <span class="idlParam">optional <span class="idlParamType"><a href="#idl-def-JsonLdContext" class="idlType"><code>JsonLdContext</code></a>?</span> <span class="idlParamName">context</span></span>, <span class="idlParam">optional <span class="idlParamType"><a href="#idl-def-JsonLdOptions" class="idlType"><code>JsonLdOptions</code></a></span> <span class="idlParamName">options</span></span>);</span>
+};</span></pre><section><h4 id="methods">Methods</h4><dl class="methods"><dt id="widl-JsonLdProcessor-compact-Promise-any-input-JsonLdContext-context-JsonLdOptions-options"><code>compact</code></dt><dd>
+ <p><a href="#compaction">Compacts</a> the given <i>input</i> using the
+ <i>context</i> according to the steps in the
+ <a href="#compaction-algorithm">Compaction algorithm</a>:</p>
+
+ <ol class="algorithm">
+ <li>Create a new <a class="tref internalDFN" title="promise" href="#dfn-promise">Promise</a> <i>promise</i> and return it. The
+ following steps are then executed asynchronously.</li>
+ <li>If the passed <i>input</i> is a <span class="idlParamType">DOMString</span>
+ representing the <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a> of a remote document, dereference it.
+ If the retrieved document's content type is neither <code>application/json</code>,
+ nor <code>application/ld+json</code>, nor any other media type using a
+ <code>+json</code> suffix as defined in [<cite><a class="bibref" href="#bib-RFC6839">RFC6839</a></cite>]
+ or if the document cannot be parsed as JSON, reject the <i>promise</i> passing an
+ <code class="error"><a href="#idl-def-JsonLdErrorCode.loading-document-failed">loading document failed</a></code>
+ error.</li>
+ <li>Initialize a new empty <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>. The <a class="tref internalDFN" title="base-iri" href="#dfn-base-iri">base <abbr title="Internationalized Resource Identifier">IRI</abbr></a>
+ of the <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> is set to the <abbr title="Internationalized Resource Identifier">IRI</abbr> of the currently being processed
+ document, if available; otherwise to <a class="tref internalDFN" title="null" href="#dfn-null">null</a>. If set, the
+ <code class="idlMemberName"><a href="#widl-JsonLdOptions-base">base</a></code> option
+ overrides the <a class="tref internalDFN" title="base-iri" href="#dfn-base-iri">base <abbr title="Internationalized Resource Identifier">IRI</abbr></a>.</li>
+ <li>If an
+ <code class="idlMemberName"><a href="#widl-JsonLdOptions-expandContext">expandContext</a></code>
+ has been passed, update the <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> using the
+ <a href="#context-processing-algorithm">Context Processing algorithm</a>, passing the
+ <code class="idlMemberName"><a href="#widl-JsonLdOptions-expandContext">expandContext</a></code>
+ as <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a>. If
+ <code class="idlMemberName"><a href="#widl-JsonLdOptions-expandContext">expandContext</a></code>
+ is a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> having a <code>@context</code> member, pass that member's value instead.</li>
+ <li>If the <i>input</i> has been retrieved, the response has an HTTP Link Header [<cite><a class="bibref" href="#bib-RFC5988">RFC5988</a></cite>]
+ using the <code>http://www.w3.org/ns/json-ld#context</code> link relation
+ and a content type of <code>application/json</code> or any media type
+ with a <code>+json</code> suffix as defined in [<cite><a class="bibref" href="#bib-RFC6839">RFC6839</a></cite>] except
+ <code>application/ld+json</code>, update the <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> using the
+ <a href="#context-processing-algorithm">Context Processing algorithm</a>, passing the
+ context referenced in the HTTP Link Header as <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a>. The
+ HTTP Link Header is ignored for documents served as <code>application/ld+json</code> If
+ multiple HTTP Link Headers using the <code>http://www.w3.org/ns/json-ld#context</code>
+ link relation are found, the <i>promise</i> is rejected with a <a href="#idl-def-JsonLdError" class="idlType"><code>JsonLdError</code></a> whose code is set to
+ <code class="error"><a href="#idl-def-JsonLdErrorCode.multiple-context-link-headers">multiple context link headers</a></code>
+ and processing is terminated.</li>
+ <li>Set <i>expanded</i> to the result of using the
+ <a href="#expansion-algorithm">Expansion algorithm</a>, passing the
+ <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> and <i>input</i> as <i>element</i>.</li>
+ <li>If <i>context</i> is a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> having a <code>@context</code> member, set
+ <i>context</i> to that member's value.</li>
+ <li>Set <i>compacted</i> to the result of using the
+ <a href="#compaction-algorithm">Compaction algorithm</a>, passing
+ <i>context</i>, <i>expanded</i> as <i>element</i>, and if passed, the
+ <code class="idlMemberName"><a href="#widl-JsonLdOptions-compactArrays">compactArrays</a></code>
+ flag in <i>options</i>.</li>
+ <li>Fulfill the <i>promise</i> passing <i>compacted</i>.</li>
+ </ol>
+
+
+ <table class="parameters"><tr><th>Parameter</th><th>Type</th><th>Nullable</th><th>Optional</th><th>Description</th></tr><tr><td class="prmName">input</td><td class="prmType"><code><a>any</a></code></td><td class="prmNullFalse">✘</td><td class="prmOptFalse">✘</td><td class="prmDesc">The JSON-LD object or array of JSON-LD objects to perform the compaction upon or an
+ <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a> referencing the JSON-LD document to compact.</td></tr><tr><td class="prmName">context</td><td class="prmType"><code><a href="#idl-def-JsonLdContext" class="idlType"><code>JsonLdContext</code></a></code></td><td class="prmNullFalse">✘</td><td class="prmOptFalse">✘</td><td class="prmDesc">The context to use when compacting the <code>input</code>;
+ it can be specified by using a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>, an
+ <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a>, or an array consisting of
+ <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>s and <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a>s.</td></tr><tr><td class="prmName">options</td><td class="prmType"><code><a href="#idl-def-JsonLdOptions" class="idlType"><code>JsonLdOptions</code></a></code></td><td class="prmNullFalse">✘</td><td class="prmOptTrue">✔</td><td class="prmDesc">A set of options to configure the algorithms. This allows, e.g.,
+ to set the input document's base <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a>.</td></tr></table><div><em>Return type: </em><code><a href="#dfn-promise" class="internalDFN">Promise</a></code></div></dd><dt id="widl-JsonLdProcessor-expand-Promise-any-input-JsonLdOptions-options"><code>expand</code></dt><dd>
+ <p><a href="#expansion">Expands</a> the given <i>input</i> according to
+ the steps in the <a href="#expansion-algorithm">Expansion algorithm</a>:</p>
+
+ <ol class="algorithm">
+ <li>Create a new <a class="tref internalDFN" title="promise" href="#dfn-promise">Promise</a> <i>promise</i> and return it. The
+ following steps are then executed asynchronously.</li>
+ <li>If the passed <i>input</i> is a <span class="idlParamType">DOMString</span>
+ representing the <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a> of a remote document, dereference it.
+ If the retrieved document's content type is neither <code>application/json</code>,
+ nor <code>application/ld+json</code>, nor any other media type using a
+ <code>+json</code> suffix as defined in [<cite><a class="bibref" href="#bib-RFC6839">RFC6839</a></cite>], reject the <i>promise</i> passing an
+ <code class="error"><a href="#idl-def-JsonLdErrorCode.loading-document-failed">loading document failed</a></code>
+ error.</li>
+ <li>Initialize a new empty <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>. The <a class="tref internalDFN" title="base-iri" href="#dfn-base-iri">base <abbr title="Internationalized Resource Identifier">IRI</abbr></a>
+ of the <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> is set to the <abbr title="Internationalized Resource Identifier">IRI</abbr> of the currently being processed
+ document, if available; otherwise to <a class="tref internalDFN" title="null" href="#dfn-null">null</a>. If set, the
+ <code class="idlMemberName"><a href="#widl-JsonLdOptions-base">base</a></code> option
+ overrides the <a class="tref internalDFN" title="base-iri" href="#dfn-base-iri">base <abbr title="Internationalized Resource Identifier">IRI</abbr></a>.</li>
+ <li>If an
+ <code class="idlMemberName"><a href="#widl-JsonLdOptions-expandContext">expandContext</a></code>
+ has been passed, update the <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> using the
+ <a href="#context-processing-algorithm">Context Processing algorithm</a>, passing the
+ <code class="idlMemberName"><a href="#widl-JsonLdOptions-expandContext">expandContext</a></code>
+ as <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a>. If
+ <code class="idlMemberName"><a href="#widl-JsonLdOptions-expandContext">expandContext</a></code>
+ is a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> having a <code>@context</code> member, pass that member's value instead.</li>
+ <li>If the <i>input</i> has been retrieved, the response has an HTTP Link Header [<cite><a class="bibref" href="#bib-RFC5988">RFC5988</a></cite>]
+ using the <code>http://www.w3.org/ns/json-ld#context</code> link relation
+ and a content type of <code>application/json</code> or any media type
+ with a <code>+json</code> suffix as defined in [<cite><a class="bibref" href="#bib-RFC6839">RFC6839</a></cite>] except
+ <code>application/ld+json</code>, update the <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> using the
+ <a href="#context-processing-algorithm">Context Processing algorithm</a>, passing the
+ context referenced in the HTTP Link Header as <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a>. The
+ HTTP Link Header is ignored for documents served as <code>application/ld+json</code> If
+ multiple HTTP Link Headers using the <code>http://www.w3.org/ns/json-ld#context</code>
+ link relation are found, the <i>promise</i> is rejected with a <a href="#idl-def-JsonLdError" class="idlType"><code>JsonLdError</code></a> whose code is set to
+ <code class="error"><a href="#idl-def-JsonLdErrorCode.multiple-context-link-headers">multiple context link headers</a></code>
+ and processing is terminated.</li>
+ <li>Set <i>expanded</i> to the result of using the
+ <a href="#expansion-algorithm">Expansion algorithm</a>, passing the
+ <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> and <i>input</i> as <i>element</i>.</li>
+ <li>Fulfill the <i>promise</i> passing <i>expanded</i>.</li>
+ </ol>
+
+
+ <table class="parameters"><tr><th>Parameter</th><th>Type</th><th>Nullable</th><th>Optional</th><th>Description</th></tr><tr><td class="prmName">input</td><td class="prmType"><code><a>any</a></code></td><td class="prmNullFalse">✘</td><td class="prmOptFalse">✘</td><td class="prmDesc">The JSON-LD object or array of JSON-LD objects to perform the expansion upon or an
+ <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a> referencing the JSON-LD document to expand.</td></tr><tr><td class="prmName">options</td><td class="prmType"><code><a href="#idl-def-JsonLdOptions" class="idlType"><code>JsonLdOptions</code></a></code></td><td class="prmNullFalse">✘</td><td class="prmOptTrue">✔</td><td class="prmDesc">A set of options to configure the used algorithms such. This allows, e.g.,
+ to set the input document's base <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a>.</td></tr></table><div><em>Return type: </em><code><a href="#dfn-promise" class="internalDFN">Promise</a></code></div></dd><dt id="widl-JsonLdProcessor-flatten-Promise-any-input-JsonLdContext-context-JsonLdOptions-options"><code>flatten</code></dt><dd>
+ <p><a href="#flattening">Flattens</a> the given <i>input</i> and
+ <a href="#compaction">compacts</a> it using the passed <i>context</i>
+ according to the steps in the <a href="#flattening-algorithm">Flattening algorithm</a>:</p>
+
+ <ol class="algorithm">
+ <li>Create a new <a class="tref internalDFN" title="promise" href="#dfn-promise">Promise</a> <i>promise</i> and return it. The
+ following steps are then executed asynchronously.</li>
+ <li>If the passed <i>input</i> is a <span class="idlParamType">DOMString</span>
+ representing the <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a> of a remote document, dereference it.
+ If the retrieved document's content type is neither <code>application/json</code>,
+ nor <code>application/ld+json</code>, nor any other media type using a
+ <code>+json</code> suffix as defined in [<cite><a class="bibref" href="#bib-RFC6839">RFC6839</a></cite>], reject the <i>promise</i> passing an
+ <code class="error"><a href="#idl-def-JsonLdErrorCode.loading-document-failed">loading document failed</a></code>
+ error.</li>
+ <li>Initialize a new empty <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a>. The <a class="tref internalDFN" title="base-iri" href="#dfn-base-iri">base <abbr title="Internationalized Resource Identifier">IRI</abbr></a>
+ of the <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> is set to the <abbr title="Internationalized Resource Identifier">IRI</abbr> of the currently being processed
+ document, if available; otherwise to <a class="tref internalDFN" title="null" href="#dfn-null">null</a>. If set, the
+ <code class="idlMemberName"><a href="#widl-JsonLdOptions-base">base</a></code> option
+ overrides the <a class="tref internalDFN" title="base-iri" href="#dfn-base-iri">base <abbr title="Internationalized Resource Identifier">IRI</abbr></a>.</li>
+ <li>If an
+ <code class="idlMemberName"><a href="#widl-JsonLdOptions-expandContext">expandContext</a></code>
+ has been passed, update the <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> using the
+ <a href="#context-processing-algorithm">Context Processing algorithm</a>, passing the
+ <code class="idlMemberName"><a href="#widl-JsonLdOptions-expandContext">expandContext</a></code>
+ as <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a>. If
+ <code class="idlMemberName"><a href="#widl-JsonLdOptions-expandContext">expandContext</a></code>
+ is a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> having a <code>@context</code> member, pass that member's value instead.</li>
+ <li>If the <i>input</i> has been retrieved, the response has an HTTP Link Header [<cite><a class="bibref" href="#bib-RFC5988">RFC5988</a></cite>]
+ using the <code>http://www.w3.org/ns/json-ld#context</code> link relation
+ and a content type of <code>application/json</code> or any media type
+ with a <code>+json</code> suffix as defined in [<cite><a class="bibref" href="#bib-RFC6839">RFC6839</a></cite>] except
+ <code>application/ld+json</code>, update the <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> using the
+ <a href="#context-processing-algorithm">Context Processing algorithm</a>, passing the
+ context referenced in the HTTP Link Header as <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a>. The
+ HTTP Link Header is ignored for documents served as <code>application/ld+json</code> If
+ multiple HTTP Link Headers using the <code>http://www.w3.org/ns/json-ld#context</code>
+ link relation are found, the <i>promise</i> is rejected with a <a href="#idl-def-JsonLdError" class="idlType"><code>JsonLdError</code></a> whose code is set to
+ <code class="error"><a href="#idl-def-JsonLdErrorCode.multiple-context-link-headers">multiple context link headers</a></code>
+ and processing is terminated.</li>
+ <li>Set <i>expanded</i> to the result of using the
+ <a href="#expansion-algorithm">Expansion algorithm</a>, passing the
+ <a class="tref internalDFN" title="active-context" href="#dfn-active-context">active context</a> and <i>input</i> as <i>element</i>.</li>
+ <li>If <i>context</i> is a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a> having a <code>@context</code> member, set
+ <i>context</i> to that member's value.</li>
+ <li>Initialize an empty <i>identifier map</i> and a <i>counter</i> (set to <code>0</code>)
+ to be used by the
+ <a href="#generate-blank-node-identifier">Generate Blank Node Identifier algorithm</a>.</li>
+ <li>Set <i>flattened</i> to the result of using the
+ <a href="#flattening-algorithm">Flattening algorithm</a>, passing
+ <i>expanded</i> as <i>element</i>, <i>context</i>, and if passed, the
+ <code class="idlMemberName"><a href="#widl-JsonLdOptions-compactArrays">compactArrays</a></code>
+ flag in <i>options</i> (which is internally passed to the
+ <a href="#compaction-algorithm">Compaction algorithm</a>).</li>
+ <li>Fulfill the <i>promise</i> passing <i>flattened</i>.</li>
+ </ol>
+
+
+ <table class="parameters"><tr><th>Parameter</th><th>Type</th><th>Nullable</th><th>Optional</th><th>Description</th></tr><tr><td class="prmName">input</td><td class="prmType"><code><a>any</a></code></td><td class="prmNullFalse">✘</td><td class="prmOptFalse">✘</td><td class="prmDesc">The JSON-LD object or array of JSON-LD objects or an <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a>
+ referencing the JSON-LD document to flatten.</td></tr><tr><td class="prmName">context</td><td class="prmType"><code><a href="#idl-def-JsonLdContext" class="idlType"><code>JsonLdContext</code></a></code></td><td class="prmNullTrue">✔</td><td class="prmOptTrue">✔</td><td class="prmDesc">The context to use when compacting the flattened <code>input</code>;
+ it can be specified by using a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>, an
+ <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a>, or an array consisting of <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>s
+ and <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a>s. If not
+ passed or <a class="tref internalDFN" title="null" href="#dfn-null">null</a> is passed, the result will not be compacted
+ but kept in expanded form.</td></tr><tr><td class="prmName">options</td><td class="prmType"><code><a href="#idl-def-JsonLdOptions" class="idlType"><code>JsonLdOptions</code></a></code></td><td class="prmNullFalse">✘</td><td class="prmOptTrue">✔</td><td class="prmDesc">A set of options to configure the used algorithms such. This allows, e.g.,
+ to set the input document's base <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a>.</td></tr></table><div><em>Return type: </em><code><a href="#dfn-promise" class="internalDFN">Promise</a></code></div></dd></dl></section>
+
+ <pre class="idl"><span class="idlTypedef" id="idl-def-JsonLdContext">typedef <span class="idlTypedefType">(<a>object</a> or <a>DOMString</a> or <a>(object</a> or <a>DOMString[])</a>)</span> <span class="idlTypedefID">JsonLdContext</span>;</span></pre><div class="idlTypedefDesc">
+ <p>The <a href="#idl-def-JsonLdContext" class="idlType"><code>JsonLdContext</code></a> type is used to refer to a value that
+ that may be a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>, a <a class="tref internalDFN" title="string" href="#dfn-string">string</a> representing an
+ <a class="tref internalDFN" title="iri" href="#dfn-iri"><abbr title="Internationalized Resource Identifier">IRI</abbr></a>, or an array of <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON objects</a>
+ and <a class="tref internalDFN" title="string" href="#dfn-string">strings</a>.</p>
+ </div>
+ </section> <!-- end of JsonLdProcessor -->
+
+ <section id="the-jsonldoptions-type">
+ <h3><span class="secno">11.2 </span>The <a href="#idl-def-JsonLdOptions" class="idlType"><code>JsonLdOptions</code></a> Type</h3>
+
+ <p>The <a href="#idl-def-JsonLdOptions" class="idlType"><code>JsonLdOptions</code></a> type is used to pass various options to the
+ <a href="#idl-def-JsonLdProcessor" class="idlType"><code>JsonLdProcessor</code></a> methods.</p>
+
+ <pre class="idl"><span class="idlDictionary" id="idl-def-JsonLdOptions">dictionary <span class="idlDictionaryID">JsonLdOptions</span> {
+<span class="idlMember"> <span class="idlMemberType"><a>DOMString</a>?</span> <span class="idlMemberName"><a href="#widl-JsonLdOptions-base">base</a></span>;</span>
+<span class="idlMember"> <span class="idlMemberType"><a>boolean</a></span> <span class="idlMemberName"><a href="#widl-JsonLdOptions-compactArrays">compactArrays</a></span> = <span class="idlMemberValue">true</span>;</span>
+<span class="idlMember"> <span class="idlMemberType"><a href="#idl-def-LoadDocumentCallback" class="idlType"><code>LoadDocumentCallback</code></a></span> <span class="idlMemberName"><a href="#widl-JsonLdOptions-documentLoader">documentLoader</a></span> = <span class="idlMemberValue">null</span>;</span>
+<span class="idlMember"> <span class="idlMemberType">(<a>object?</a> or <a>DOMString</a>)</span> <span class="idlMemberName"><a href="#widl-JsonLdOptions-expandContext">expandContext</a></span> = <span class="idlMemberValue">null</span>;</span>
+<span class="idlMember"> <span class="idlMemberType"><a>DOMString</a></span> <span class="idlMemberName"><a href="#widl-JsonLdOptions-processingMode">processingMode</a></span> = <span class="idlMemberValue">"json-ld-1.0"</span>;</span>
+};</span></pre><section><h4 id="dictionary-jsonldoptions-members">Dictionary <a class="idlType" href="#idl-def-JsonLdOptions"><code>JsonLdOptions</code></a> Members</h4><dl class="dictionary-members"><dt id="widl-JsonLdOptions-base"><code>base</code> of type <span class="idlMemberType"><a>DOMString</a></span>, nullable</dt><dd>The base <abbr title="Internationalized Resource Identifier">IRI</abbr> to use when expanding or compacting the document. If set, this overrides
+ the input document's <abbr title="Internationalized Resource Identifier">IRI</abbr>.</dd><dt id="widl-JsonLdOptions-compactArrays"><code>compactArrays</code> of type <span class="idlMemberType"><a>boolean</a></span>, defaulting to <code>true</code></dt><dd>If set to <code>true</code>, the JSON-LD processor replaces arrays with just
+ one element with that element during compaction. If set to <code>false</code>,
+ all arrays will remain arrays even if they have just one element.
+ </dd><dt id="widl-JsonLdOptions-documentLoader"><code>documentLoader</code> of type <span class="idlMemberType"><a href="#idl-def-LoadDocumentCallback" class="idlType"><code>LoadDocumentCallback</code></a></span>, defaulting to <code>null</code></dt><dd>The callback of the loader to be used to retrieve remote documents and contexts.
+ If specified, it <em class="rfc2119" title="MUST">MUST</em> be used to retrieve remote documents and contexts; otherwise,
+ if not specified, the processor's built-in loader <em class="rfc2119" title="MUST">MUST</em> be used.</dd><dt id="widl-JsonLdOptions-expandContext"><code>expandContext</code> of type <span class="idlMemberType"><a>(object? or DOMString)</a></span>, defaulting to <code>null</code></dt><dd>A context that is used to initialize the active context when expanding a document.</dd><dt id="widl-JsonLdOptions-processingMode"><code>processingMode</code> of type <span class="idlMemberType"><a>DOMString</a></span>, defaulting to <code>"json-ld-1.0"</code></dt><dd>If set to <code>json-ld-1.0</code>, the JSON-LD processor <em class="rfc2119" title="MUST">MUST</em> produce
+ exactly the same results as the algorithms defined in this specification.
+ If set to another value, the JSON-LD processor is allowed to extend
+ or modify the algorithms defined in this specification to enable
+ application-specific optimizations. The definition of such
+ optimizations is beyond the scope of this specification and thus
+ not defined. Consequently, different implementations <em class="rfc2119" title="MAY">MAY</em> implement
+ different optimizations. Developers <em class="rfc2119" title="MUST NOT">MUST NOT</em> define modes beginning
+ with <code>json-ld</code> as they are reserved for future versions
+ of this specification.</dd></dl></section>
+ </section> <!-- end JsonLdOptions -->
+
+ <section id="remote-document-and-context-retrieval">
+ <h3><span class="secno">11.3 </span>Remote Document and Context Retrieval</h3>
+
+ <p>Developers can utilize a callback to control how remote documents and contexts are retrieved
+ by <a class="tref internalDFN" title="json-ld-api-implementation" href="#dfn-json-ld-api-implementation">JSON-LD API Implementations</a>.
+ This section details the parameters of that callback and the data structure
+ used to return the retrieved context.</p>
+
+ <section>
+ <h4 id="loaddocumentcallback">LoadDocumentCallback</h4>
+
+ <p>The <a href="#idl-def-LoadDocumentCallback" class="idlType"><code>LoadDocumentCallback</code></a> defines a callback that custom document loaders
+ have to implement to be used to retrieve remote documents and contexts.</p>
+
+ <pre class="idl"><span class="idlCallback" id="idl-def-LoadDocumentCallback">callback <span class="idlCallbackID">LoadDocumentCallback</span> = <span class="idlCallbackType"><a href="#dfn-promise" class="internalDFN">Promise</a></span> (<span class="idlParam"><span class="idlParamType"><a>DOMString</a></span> <span class="idlParamName">url</span></span>);</span></pre><section><h5 id="callback-loaddocumentcallback-parameters">Callback <a class="idlType" href="#idl-def-LoadDocumentCallback"><code>LoadDocumentCallback</code></a> Parameters</h5><dl class="callback-members"><dt id="widl-LoadDocumentCallback-url"><code>url</code> of type <span class="idlMemberType"><a>DOMString</a></span></dt><dd>The URL of the remote document or context to load.</dd></dl></section>
+
+ <p>All errors <em class="rfc2119" title="MUST">MUST</em> result in the <a class="tref internalDFN" title="promise" href="#dfn-promise">Promise</a> being rejected with
+ a <a href="#idl-def-JsonLdError" class="idlType"><code>JsonLdError</code></a> whose code is set to
+ <code class="error"><a href="#idl-def-JsonLdErrorCode.loading-document-failed">loading document failed</a></code>
+ or <code class="error"><a href="#idl-def-JsonLdErrorCode.multiple-context-link-headers">multiple context link headers</a></code>
+ as described in the next section.</p>
+ </section>
+
+ <section>
+ <h4 id="remotedocument">RemoteDocument</h4>
+
+ <p>The <a href="#idl-def-RemoteDocument" class="idlType"><code>RemoteDocument</code></a> type is used by a <a href="#idl-def-LoadDocumentCallback" class="idlType"><code>LoadDocumentCallback</code></a>
+ to return information about a remote document or context.</p>
+
+ <pre class="idl"><span class="idlDictionary" id="idl-def-RemoteDocument">dictionary <span class="idlDictionaryID">RemoteDocument</span> {
+<span class="idlMember"> <span class="idlMemberType"><a>DOMString</a></span> <span class="idlMemberName"><a href="#widl-RemoteDocument-contextUrl">contextUrl</a></span> = <span class="idlMemberValue">null</span>;</span>
+<span class="idlMember"> <span class="idlMemberType"><a>DOMString</a></span> <span class="idlMemberName"><a href="#widl-RemoteDocument-documentUrl">documentUrl</a></span>;</span>
+<span class="idlMember"> <span class="idlMemberType"><a>any</a></span> <span class="idlMemberName"><a href="#widl-RemoteDocument-document">document</a></span>;</span>
+};</span></pre><section><h5 id="dictionary-remotedocument-members">Dictionary <a class="idlType" href="#idl-def-RemoteDocument"><code>RemoteDocument</code></a> Members</h5><dl class="dictionary-members"><dt id="widl-RemoteDocument-contextUrl"><code>contextUrl</code> of type <span class="idlMemberType"><a>DOMString</a></span>, defaulting to <code>null</code></dt><dd>If available, the value of the HTTP Link Header [<cite><a class="bibref" href="#bib-RFC5988">RFC5988</a></cite>] using the
+ <code>http://www.w3.org/ns/json-ld#context</code> link relation in the
+ response. If the response's content type is <code>application/ld+json</code>,
+ the HTTP Link Header <em class="rfc2119" title="MUST">MUST</em> be ignored. If multiple HTTP Link Headers using
+ the <code>http://www.w3.org/ns/json-ld#context</code> link relation are found,
+ the <a class="tref internalDFN" title="promise" href="#dfn-promise">Promise</a> of the <a href="#idl-def-LoadDocumentCallback" class="idlType"><code>LoadDocumentCallback</code></a> <em class="rfc2119" title="MUST">MUST</em> be rejected with
+ a <a href="#idl-def-JsonLdError" class="idlType"><code>JsonLdError</code></a> whose code is set to
+ <code class="error"><a href="#idl-def-JsonLdErrorCode.multiple-context-link-headers">multiple context link headers</a></code>.</dd><dt id="widl-RemoteDocument-document"><code>document</code> of type <span class="idlMemberType"><a>any</a></span></dt><dd>The retrieved document. This can either be the raw payload or the already
+ parsed document.</dd><dt id="widl-RemoteDocument-documentUrl"><code>documentUrl</code> of type <span class="idlMemberType"><a>DOMString</a></span></dt><dd>The final URL of the loaded document. This is important
+ to handle HTTP redirects properly.</dd></dl></section>
+ </section>
+ </section> <!-- end of Remote Document and Context Retrieval -->
+
+ <section id="error-handling">
+ <h3><span class="secno">11.4 </span>Error Handling</h3>
+
+ <p>This section describes the datatype definitions used within the
+ JSON-LD API for error handling.</p>
+
+ <section>
+ <h4 id="jsonlderror">JsonLdError</h4>
+
+ <p>The <a href="#idl-def-JsonLdError" class="idlType"><code>JsonLdError</code></a> type is used to report processing errors.</p>
+
+ <pre class="idl"><span class="idlDictionary" id="idl-def-JsonLdError">dictionary <span class="idlDictionaryID">JsonLdError</span> {
+<span class="idlMember"> <span class="idlMemberType"><a href="#idl-def-JsonLdErrorCode" class="idlType"><code>JsonLdErrorCode</code></a></span> <span class="idlMemberName"><a href="#widl-JsonLdError-code">code</a></span>;</span>
+<span class="idlMember"> <span class="idlMemberType"><a>DOMString</a>?</span> <span class="idlMemberName"><a href="#widl-JsonLdError-message">message</a></span> = <span class="idlMemberValue">null</span>;</span>
+};</span></pre><section><h5 id="dictionary-jsonlderror-members">Dictionary <a class="idlType" href="#idl-def-JsonLdError"><code>JsonLdError</code></a> Members</h5><dl class="dictionary-members"><dt id="widl-JsonLdError-code"><code>code</code> of type <span class="idlMemberType"><a href="#idl-def-JsonLdErrorCode" class="idlType"><code>JsonLdErrorCode</code></a></span></dt><dd>a string representing the particular error type, as described in
+ the various algorithms in this document.</dd><dt id="widl-JsonLdError-message"><code>message</code> of type <span class="idlMemberType"><a>DOMString</a></span>, nullable, defaulting to <code>null</code></dt><dd>an optional error message containing additional debugging information.
+ The specific contents of error messages are outside the scope of this
+ specification.</dd></dl></section>
+ </section>
+
+ <section>
+ <h4 id="jsonlderrorcode">JsonLdErrorCode</h4>
+ <p>The <a href="#idl-def-JsonLdErrorCode" class="idlType"><code>JsonLdErrorCode</code></a> represents the collection of valid JSON-LD error
+ codes.</p>
+
+ <div class="issue atrisk"><div class="issue-title" role="heading" aria-level="5"><span>Feature at Risk 4</span>: Lists of lists and partial list conversion from RDF</div><div class="atrisk">
+ <p class="atrisk-head">Note: This feature is
+ <a href="http://www.w3.org/2005/10/Process-20051014/tr#cfi">"at risk"</a> and may
+ be removed from this specification based on feedback. Please send feedback to
+ <a href="mailto:public-rdf-comments@w3.org">public-rdf-comments@w3.org</a>.
+ For the current status see
+ <a href="http://www.w3.org/2011/rdf-wg/wiki/JSON-LD_Features_at_Risk">features "at risk" in JSON-LD 1.0</a></p>
+ <p>The JSON-LD algorithms have been updated to support conversion of lists
+ of lists to <a class="tref internalDFN" title="list-object" href="#dfn-list-object">list objects</a> by preserving
+ the blank node head of the inner list. Lists of lists can, however, not be
+ represented directly in JSON-LD using the <code>@list</code> construct;
+ they have to be represented as a set of interlinked node objects using
+ RDF's rdf:first and rdf:rest properties. Implementors are asked to pay
+ particular attention to the feature and provide feedback on lists of lists
+ and partial lists. The feature may remain in the specification, or it may
+ be removed after further implementation experience has been gathered.
+ Similarly, partial list conversion in the RDF algorithms have been marked
+ as a feature at risk and may be removed from the specification based
+ on implementation feedback.</p>
+ </div></div>
+
+ <pre class="idl"><span class="idlEnum" id="idl-def-JsonLdErrorCode">enum <span class="idlEnumID">JsonLdErrorCode</span> {
+ "<a href="#idl-def-JsonLdErrorCode.loading-document-failed" class="idlEnumItem">loading document failed</a>",
+ "<a href="#idl-def-JsonLdErrorCode.list-of-lists" class="idlEnumItem">list of lists</a>",
+ "<a href="#idl-def-JsonLdErrorCode.invalid--index-value" class="idlEnumItem">invalid @index value</a>",
+ "<a href="#idl-def-JsonLdErrorCode.conflicting-indexes" class="idlEnumItem">conflicting indexes</a>",
+ "<a href="#idl-def-JsonLdErrorCode.invalid--id-value" class="idlEnumItem">invalid @id value</a>",
+ "<a href="#idl-def-JsonLdErrorCode.invalid-local-context" class="idlEnumItem">invalid local context</a>",
+ "<a href="#idl-def-JsonLdErrorCode.multiple-context-link-headers" class="idlEnumItem">multiple context link headers</a>",
+ "<a href="#idl-def-JsonLdErrorCode.loading-remote-context-failed" class="idlEnumItem">loading remote context failed</a>",
+ "<a href="#idl-def-JsonLdErrorCode.invalid-remote-context" class="idlEnumItem">invalid remote context</a>",
+ "<a href="#idl-def-JsonLdErrorCode.recursive-context-inclusion" class="idlEnumItem">recursive context inclusion</a>",
+ "<a href="#idl-def-JsonLdErrorCode.invalid-base-IRI" class="idlEnumItem">invalid base IRI</a>",
+ "<a href="#idl-def-JsonLdErrorCode.invalid-vocab-mapping" class="idlEnumItem">invalid vocab mapping</a>",
+ "<a href="#idl-def-JsonLdErrorCode.invalid-default-language" class="idlEnumItem">invalid default language</a>",
+ "<a href="#idl-def-JsonLdErrorCode.keyword-redefinition" class="idlEnumItem">keyword redefinition</a>",
+ "<a href="#idl-def-JsonLdErrorCode.invalid-term-definition" class="idlEnumItem">invalid term definition</a>",
+ "<a href="#idl-def-JsonLdErrorCode.invalid-reverse-property" class="idlEnumItem">invalid reverse property</a>",
+ "<a href="#idl-def-JsonLdErrorCode.invalid-IRI-mapping" class="idlEnumItem">invalid IRI mapping</a>",
+ "<a href="#idl-def-JsonLdErrorCode.cyclic-IRI-mapping" class="idlEnumItem">cyclic IRI mapping</a>",
+ "<a href="#idl-def-JsonLdErrorCode.invalid-keyword-alias" class="idlEnumItem">invalid keyword alias</a>",
+ "<a href="#idl-def-JsonLdErrorCode.invalid-type-mapping" class="idlEnumItem">invalid type mapping</a>",
+ "<a href="#idl-def-JsonLdErrorCode.invalid-language-mapping" class="idlEnumItem">invalid language mapping</a>",
+ "<a href="#idl-def-JsonLdErrorCode.colliding-keywords" class="idlEnumItem">colliding keywords</a>",
+ "<a href="#idl-def-JsonLdErrorCode.invalid-container-mapping" class="idlEnumItem">invalid container mapping</a>",
+ "<a href="#idl-def-JsonLdErrorCode.invalid-type-value" class="idlEnumItem">invalid type value</a>",
+ "<a href="#idl-def-JsonLdErrorCode.invalid-value-object" class="idlEnumItem">invalid value object</a>",
+ "<a href="#idl-def-JsonLdErrorCode.invalid-value-object-value" class="idlEnumItem">invalid value object value</a>",
+ "<a href="#idl-def-JsonLdErrorCode.invalid-language-tagged-string" class="idlEnumItem">invalid language-tagged string</a>",
+ "<a href="#idl-def-JsonLdErrorCode.invalid-language-tagged-value" class="idlEnumItem">invalid language-tagged value</a>",
+ "<a href="#idl-def-JsonLdErrorCode.invalid-typed-value" class="idlEnumItem">invalid typed value</a>",
+ "<a href="#idl-def-JsonLdErrorCode.invalid-set-or-list-object" class="idlEnumItem">invalid set or list object</a>",
+ "<a href="#idl-def-JsonLdErrorCode.invalid-language-map-value" class="idlEnumItem">invalid language map value</a>",
+ "<a href="#idl-def-JsonLdErrorCode.compaction-to-list-of-lists" class="idlEnumItem">compaction to list of lists</a>",
+ "<a href="#idl-def-JsonLdErrorCode.invalid-reverse-property-map" class="idlEnumItem">invalid reverse property map</a>",
+ "<a href="#idl-def-JsonLdErrorCode.invalid--reverse-value" class="idlEnumItem">invalid @reverse value</a>",
+ "<a href="#idl-def-JsonLdErrorCode.invalid-reverse-property-value" class="idlEnumItem">invalid reverse property value</a>"
+};</span></pre><table class="simple"><tr><th colspan="2">Enumeration description</th></tr><tr><td><code id="idl-def-JsonLdErrorCode.loading-document-failed">loading document failed</code></td><td>The document could not be loaded or parsed as JSON.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.list-of-lists">list of lists</code></td><td>A list of lists was detected. List of lists are not supported in
+ this version of JSON-LD due to the algorithmic complexity.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.invalid--index-value">invalid @index value</code></td><td>An <code>@index</code> member was encountered whose value was
+ not a <a class="tref internalDFN" title="string" href="#dfn-string">string</a>.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.conflicting-indexes">conflicting indexes</code></td><td>Multiple conflicting indexes have been found for the same node.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.invalid--id-value">invalid @id value</code></td><td>An <code>@id</code> member was encountered whose value was not a
+ <a class="tref internalDFN" title="string" href="#dfn-string">string</a>.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.invalid-local-context">invalid local context</code></td><td>In invalid <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a> was detected.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.multiple-context-link-headers">multiple context link headers</code></td><td>Multiple HTTP Link Headers [<cite><a class="bibref" href="#bib-RFC5988">RFC5988</a></cite>] using the
+ <code>http://www.w3.org/ns/json-ld#context</code> link relation
+ have been detected.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.loading-remote-context-failed">loading remote context failed</code></td><td>There was a problem encountered loading a remote context.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.invalid-remote-context">invalid remote context</code></td><td>No valid context document has been found for a referenced,
+ remote context.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.recursive-context-inclusion">recursive context inclusion</code></td><td>A cycle in remote context inclusions has been detected.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.invalid-base-IRI">invalid base IRI</code></td><td>An invalid <a class="tref internalDFN" title="base-iri" href="#dfn-base-iri">base <abbr title="Internationalized Resource Identifier">IRI</abbr></a> has been detected, i.e., it is
+ neither an <a class="tref internalDFN" title="absolute-iri" href="#dfn-absolute-iri">absolute <abbr title="Internationalized Resource Identifier">IRI</abbr></a> nor <a class="tref internalDFN" title="null" href="#dfn-null">null</a>.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.invalid-vocab-mapping">invalid vocab mapping</code></td><td>An invalid <a class="tref internalDFN" title="vocabulary-mapping" href="#dfn-vocabulary-mapping">vocabulary mapping</a> has been detected, i.e.,
+ it is neither an <a class="tref internalDFN" title="absolute-iri" href="#dfn-absolute-iri">absolute <abbr title="Internationalized Resource Identifier">IRI</abbr></a> nor <a class="tref internalDFN" title="null" href="#dfn-null">null</a>.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.invalid-default-language">invalid default language</code></td><td>The value of the <a class="tref internalDFN" title="default-language" href="#dfn-default-language">default language</a> is not a <a class="tref internalDFN" title="string" href="#dfn-string">string</a>
+ or <a class="tref internalDFN" title="null" href="#dfn-null">null</a> and thus invalid.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.keyword-redefinition">keyword redefinition</code></td><td>A <a class="tref internalDFN" title="keyword" href="#dfn-keyword">keyword</a> redefinition has been detected.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.invalid-term-definition">invalid term definition</code></td><td>An invalid <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a> has been detected.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.invalid-reverse-property">invalid reverse property</code></td><td>An invalid reverse property definition has been detected.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.invalid-IRI-mapping">invalid IRI mapping</code></td><td>A <a class="tref internalDFN" title="local-context" href="#dfn-local-context">local context</a> contains a <a class="tref internalDFN" title="term" href="#dfn-term">term</a> that has
+ an invalid or missing <a class="tref internalDFN" title="iri-mapping" href="#dfn-iri-mapping"><abbr title="Internationalized Resource Identifier">IRI</abbr> mapping</a>.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.cyclic-IRI-mapping">cyclic IRI mapping</code></td><td>A cycle in <a class="tref internalDFN" title="iri-mapping" href="#dfn-iri-mapping"><abbr title="Internationalized Resource Identifier">IRI</abbr> mappings</a> has been detected.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.invalid-keyword-alias">invalid keyword alias</code></td><td>An invalid <a class="tref internalDFN" title="keyword" href="#dfn-keyword">keyword</a> alias definition has been
+ encountered.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.invalid-type-mapping">invalid type mapping</code></td><td>An <code>@type</code> member in a <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a>
+ was encountered whose value could not be expanded to an
+ <a class="tref internalDFN" title="absolute-iri" href="#dfn-absolute-iri">absolute <abbr title="Internationalized Resource Identifier">IRI</abbr></a>.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.invalid-language-mapping">invalid language mapping</code></td><td>An <code>@language</code> member in a <a class="tref internalDFN" title="term-definition" href="#dfn-term-definition">term definition</a>
+ was encountered whose value was neither a <a class="tref internalDFN" title="string" href="#dfn-string">string</a> nor
+ <a class="tref internalDFN" title="null" href="#dfn-null">null</a> and thus invalid.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.colliding-keywords">colliding keywords</code></td><td>Two properties which expand to the same keyword have been detected.
+ This might occur if a <a class="tref internalDFN" title="keyword" href="#dfn-keyword">keyword</a> and an alias thereof
+ are used at the same time.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.invalid-container-mapping">invalid container mapping</code></td><td>An <code>@container</code> member was encountered whose value was
+ not one of the following <a class="tref internalDFN" title="string" href="#dfn-string">strings</a>:
+ <code>@list</code>, <code>@set</code>, or <code>@index</code>.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.invalid-type-value">invalid type value</code></td><td>An invalid value for an <code>@type</code> member has been detected,
+ i.e., the value was neither a <a class="tref internalDFN" title="string" href="#dfn-string">string</a> nor an <a class="tref internalDFN" title="array" href="#dfn-array">array</a>
+ of <a class="tref internalDFN" title="string" href="#dfn-string">strings</a>.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.invalid-value-object">invalid value object</code></td><td>A <a class="tref internalDFN" title="value-object" href="#dfn-value-object">value object</a> with disallowed members has been
+ detected.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.invalid-value-object-value">invalid value object value</code></td><td>An invalid value for the <code>@value</code> member of a
+ <a class="tref internalDFN" title="value-object" href="#dfn-value-object">value object</a> has been detected, i.e., it is neither
+ a <a class="tref internalDFN" title="scalar" href="#dfn-scalar">scalar</a> nor <a class="tref internalDFN" title="null" href="#dfn-null">null</a>.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.invalid-language-tagged-string">invalid language-tagged string</code></td><td>A <a class="tref internalDFN" title="language-tagged-string" href="http://www.w3.org/TR/rdf11-concepts/#dfn-language-tagged-string">language-tagged string</a> with an invalid language
+ value was detected.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.invalid-language-tagged-value">invalid language-tagged value</code></td><td>A <a class="tref internalDFN" title="number" href="#dfn-number">number</a>, <a class="tref internalDFN" title="true" href="#dfn-true">true</a>, or <a class="tref internalDFN" title="false" href="#dfn-false">false</a> with an
+ associated language tag was detected.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.invalid-typed-value">invalid typed value</code></td><td>A <a class="tref internalDFN" title="typed-value" href="#dfn-typed-value">typed value</a> with an invalid type was detected.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.invalid-set-or-list-object">invalid set or list object</code></td><td>A <a class="tref internalDFN" title="set-object" href="#dfn-set-object">set object</a> or <a class="tref internalDFN" title="list-object" href="#dfn-list-object">list object</a> with
+ disallowed members has been detected.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.invalid-language-map-value">invalid language map value</code></td><td>An invalid value in a <a class="tref externalDFN" title="language-map" href="http://www.w3.org/TR/2013/CR-json-ld-20130822/#dfn-language-map">language map</a>
+ has been detected. It has to be a <a class="tref internalDFN" title="string" href="#dfn-string">string</a> or an <a class="tref internalDFN" title="array" href="#dfn-array">array</a> of
+ <a class="tref internalDFN" title="string" href="#dfn-string">strings</a>.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.compaction-to-list-of-lists">compaction to list of lists</code></td><td>The compacted document contains a list of lists as multiple
+ lists have been compacted to the same term.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.invalid-reverse-property-map">invalid reverse property map</code></td><td>An invalid reverse property map has been detected. No
+ <a class="tref internalDFN" title="keyword" href="#dfn-keyword">keywords</a> apart from <code>@context</code>
+ are allowed in reverse property maps.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.invalid--reverse-value">invalid @reverse value</code></td><td>An invalid value for an <code>@reverse</code> member has been detected,
+ i.e., the value was not a <a class="tref internalDFN" title="json-object" href="#dfn-json-object">JSON object</a>.</td></tr><tr><td><code id="idl-def-JsonLdErrorCode.invalid-reverse-property-value">invalid reverse property value</code></td><td>An invalid value for a reverse property has been detected. The value of an inverse
+ property must be a <a class="tref internalDFN" title="node-object" href="#dfn-node-object">node object</a>.</td></tr></table>
+ </section>
+ </section> <!-- end of Error Handling -->
+</section> <!-- end of The Application Programming Interfaces -->
+
+<section class="appendix informative" id="acknowledgements">
+ <!--OddPage--><h2><span class="secno">A. </span>Acknowledgements</h2><p><em>This section is non-normative.</em></p>
+
+ <p>A large amount of thanks goes out to the JSON-LD Community Group
+ participants who worked through many of the technical issues on the mailing
+ list and the weekly telecons - of special mention are Niklas Lindström,
+ François Daoust, Lin Clark, and Zdenko 'Denny' Vrandečić.
+ The editors would like to thank Mark Birbeck, who provided a great deal of
+ the initial push behind the JSON-LD work via his work on RDFj.
+ The work of Dave Lehn and Mike Johnson are appreciated for reviewing,
+ and performing several implementations of the specification. Ian Davis is
+ thanked for his work on RDF/JSON. Thanks also to Nathan Rixham,
+ Bradley P. Allen, Kingsley Idehen, Glenn McDonald, Alexandre Passant,
+ Danny Ayers, Ted Thibodeau Jr., Olivier Grisel, Josh Mandel, Eric Prud'hommeaux,
+ David Wood, Guus Schreiber, Pat Hayes, Sandro Hawke, and Richard Cyganiak
+ for their input on the specification.</p>
+</section>
+
+
+
+<section id="references" class="appendix" typeof="bibo:Chapter" resource="#references" rel="bibo:chapter"><!--OddPage--><h2><span class="secno">B. </span>References</h2><section id="normative-references" typeof="bibo:Chapter" resource="#normative-references" rel="bibo:chapter"><h3><span class="secno">B.1 </span>Normative references</h3><dl class="bibliography" about=""><dt id="bib-DOM-WHATWG">[DOM-WHATWG]</dt><dd rel="dcterms:requires">Anne van Kesteren, Aryeh Gregor, Ms2ger, Editors. <cite><a href="http://dom.spec.whatwg.org/">DOM</a>.</cite> April 2013. WHATWG Living Standard (work in progress). URL: <a href="http://dom.spec.whatwg.org/">http://dom.spec.whatwg.org/</a>
+</dd><dt id="bib-IEEE-754-1985">[IEEE-754-1985]</dt><dd rel="dcterms:requires">IEEE. <cite>IEEE Standard for Binary Floating-Point Arithmetic.</cite> URL: <a href="http://standards.ieee.org/reading/ieee/std_public/description/busarch/754-1985_desc.html">http://standards.ieee.org/reading/ieee/std_public/description/busarch/754-1985_desc.html</a>
+</dd><dt id="bib-JSON-LD">[JSON-LD]</dt><dd rel="dcterms:requires">Manu Sporny, Gregg Kellogg, Markus Lanthaler, Editors. <cite><a href="http://json-ld.org/spec/latest/json-ld/">JSON-LD 1.0</a>.</cite> W3C Editor's Draft (work in progress). URL: <a href="http://json-ld.org/spec/latest/json-ld/">http://json-ld.org/spec/latest/json-ld/</a>
+</dd><dt id="bib-RDF-MT">[RDF-MT]</dt><dd rel="dcterms:requires">Patrick Hayes. <a href="http://www.w3.org/TR/rdf-mt/"><cite>RDF Semantics</cite></a>. 10 February 2004. W3C Recommendation. URL: <a href="http://www.w3.org/TR/rdf-mt/">http://www.w3.org/TR/rdf-mt/</a>
+</dd><dt id="bib-RFC2119">[RFC2119]</dt><dd rel="dcterms:requires">S. Bradner. <a href="http://www.ietf.org/rfc/rfc2119.txt"><cite>Key words for use in RFCs to Indicate Requirement Levels.</cite></a> March 1997. Internet RFC 2119. URL: <a href="http://www.ietf.org/rfc/rfc2119.txt">http://www.ietf.org/rfc/rfc2119.txt</a>
+</dd><dt id="bib-RFC3986">[RFC3986]</dt><dd rel="dcterms:requires">T. Berners-Lee; R. Fielding; L. Masinter. <a href="http://www.ietf.org/rfc/rfc3986.txt"><cite>Uniform Resource Identifier (URI): Generic Syntax (RFC 3986)</cite></a>. January 2005. RFC. URL: <a href="http://www.ietf.org/rfc/rfc3986.txt">http://www.ietf.org/rfc/rfc3986.txt</a>
+</dd><dt id="bib-RFC3987">[RFC3987]</dt><dd rel="dcterms:requires">M. Dürst; M. Suignard. <a href="http://www.ietf.org/rfc/rfc3987.txt"><cite>Internationalized Resource Identifiers (IRIs)</cite></a>. January 2005. RFC. URL: <a href="http://www.ietf.org/rfc/rfc3987.txt">http://www.ietf.org/rfc/rfc3987.txt</a>
+</dd><dt id="bib-RFC4627">[RFC4627]</dt><dd rel="dcterms:requires">D. Crockford. <a href="http://www.ietf.org/rfc/rfc4627.txt"><cite>The application/json Media Type for JavaScript Object Notation (JSON) (RFC 4627)</cite></a>. July 2006. RFC. URL: <a href="http://www.ietf.org/rfc/rfc4627.txt">http://www.ietf.org/rfc/rfc4627.txt</a>
+</dd><dt id="bib-RFC5988">[RFC5988]</dt><dd rel="dcterms:requires">M. Nottingham. <cite><a href="http://www.ietf.org/rfc/rfc5988.txt">Web Linking</a>.</cite> October 2010. Internet RFC 5988. URL: <a href="http://www.ietf.org/rfc/rfc5988.txt">http://www.ietf.org/rfc/rfc5988.txt</a>
+</dd><dt id="bib-WEBIDL">[WEBIDL]</dt><dd rel="dcterms:requires">Cameron McCormack, Editor. <cite><a href="http://www.w3.org/TR/2012/CR-WebIDL-20120419/">Web IDL.</a></cite> 19 April 2012. W3C Candidate Recommendation (work in progress). URL: <a href="http://www.w3.org/TR/2012/CR-WebIDL-20120419/">http://www.w3.org/TR/2012/CR-WebIDL-20120419/</a>. The latest edition is available at <a href="http://www.w3.org/TR/WebIDL/">http://www.w3.org/TR/WebIDL/</a>
+</dd><dt id="bib-XMLSCHEMA11-2">[XMLSCHEMA11-2]</dt><dd rel="dcterms:requires">David Peterson; Sandy Gao; Ashok Malhotra; Michael Sperberg-McQueen; Henry Thompson; Paul V. Biron et al. <a href="http://www.w3.org/TR/xmlschema11-2/"><cite>W3C XML Schema Definition Language (XSD) 1.1 Part 2: Datatypes</cite></a>. 5 April 2012. W3C Recommendation. URL: <a href="http://www.w3.org/TR/xmlschema11-2/">http://www.w3.org/TR/xmlschema11-2/</a>
+</dd></dl></section><section id="informative-references" typeof="bibo:Chapter" resource="#informative-references" rel="bibo:chapter"><h3><span class="secno">B.2 </span>Informative references</h3><dl class="bibliography" about=""><dt id="bib-BCP47">[BCP47]</dt><dd rel="dcterms:references">A. Phillips; M. Davis. <a href="http://tools.ietf.org/html/bcp47"><cite>Tags for Identifying Languages</cite></a>. September 2009. IETF Best Current Practice. URL: <a href="http://tools.ietf.org/html/bcp47">http://tools.ietf.org/html/bcp47</a>
+</dd><dt id="bib-ECMA-262">[ECMA-262]</dt><dd rel="dcterms:references"><a href="http://www.ecma-international.org/publications/standards/Ecma-262.htm"><cite>ECMAScript Language Specification, Edition 5.1</cite></a>. June 2011. URL: <a href="http://www.ecma-international.org/publications/standards/Ecma-262.htm">http://www.ecma-international.org/publications/standards/Ecma-262.htm</a>
+</dd><dt id="bib-JSON-LD-TESTS">[JSON-LD-TESTS]</dt><dd rel="dcterms:references"><cite><a href="http://www.w3.org/2013/json-ld-tests/">JSON-LD 1.0 Test Suite</a></cite>. W3C Test Suite (work in progress). URL: <a href="http://www.w3.org/2013/json-ld-tests/">http://www.w3.org/2013/json-ld-tests/</a>
+</dd><dt id="bib-RDF11-CONCEPTS">[RDF11-CONCEPTS]</dt><dd rel="dcterms:references">Richard Cyganiak, David Wood, Editors. <cite><a href="http://www.w3.org/TR/2013/WD-rdf11-concepts-20130115/">RDF 1.1 Concepts and Abstract Syntax.</a></cite> 15 January 2013. W3C Working Draft (work in progress). URL: <a href="http://www.w3.org/TR/2013/WD-rdf11-concepts-20130115/">http://www.w3.org/TR/2013/WD-rdf11-concepts-20130115/</a>. The latest edition is available at <a href="http://www.w3.org/TR/rdf11-concepts/">http://www.w3.org/TR/rdf11-concepts/</a>
+</dd><dt id="bib-RFC6839">[RFC6839]</dt><dd rel="dcterms:references">Tony Hansen, Alexey Melnikov. <cite><a href="http://www.ietf.org/rfc/rfc6839.txt">Additional Media Type Structured Syntax Suffixes</a>.</cite> January 2013. Internet RFC 6839. URL: <a href="http://www.ietf.org/rfc/rfc6839.txt">http://www.ietf.org/rfc/rfc6839.txt</a>
+</dd><dt id="bib-TURTLE">[TURTLE]</dt><dd rel="dcterms:references">Eric Prud'hommeaux, Gavin Carothers, Editors. <cite><a href="http://www.w3.org/TR/2013/CR-turtle-20130219/">Turtle: Terse RDF Triple Language.</a></cite> 19 February 2013. W3C Candidate Recommendation (work in progress). URL: <a href="http://www.w3.org/TR/2013/CR-turtle-20130219/">http://www.w3.org/TR/2013/CR-turtle-20130219/</a>. The latest edition is available at <a href="http://www.w3.org/TR/turtle/">http://www.w3.org/TR/turtle/</a>
+</dd></dl></section></section></body></html>
--- a/spec/index.php Tue Aug 13 18:28:53 2013 +0200
+++ b/spec/index.php Tue Aug 13 18:54:07 2013 +0200
@@ -1,7 +1,7 @@
<!DOCTYPE html>
<html
prefix="
- xhv: http://www.w3.org/1999/xhtml/vocab#
+ xhv: http://www.w3.org/1999/xhtml/vocab#
xsd: http://www.w3.org/2001/XMLSchema#
rdfs: http://www.w3.org/2000/01/rdf-schema#
dc: http://purl.org/dc/terms/
@@ -15,7 +15,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
- <!-- Style Sheets -->
+ <!-- Style Sheets -->
<link rel="stylesheet" type="text/css" href="../static/css/bootstrap/bootstrap.css">
<link rel="stylesheet" type="text/css" href="../static/css/bootstrap/bootstrap-responsive.css">
<link rel="stylesheet" type="text/css" href="../static/css/bootstrap/font-awesome.css">
@@ -40,11 +40,11 @@
<div class="navbar navbar-static-top">
<div class="navbar-inner">
<div class="row-fluid">
- <a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
+ <a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
- </a>
+ </a>
<a class="brand" href="../index.html"><img src="../images/json-ld-data-24.png" alt="JSON-LD logo"> JSON-LD</a>
<div class="nav-collapse">
<ul class="nav">
@@ -101,6 +101,7 @@
$ed = @scandir('ED/' . $spec);
$fcgs = @scandir('FCGS/' . $spec);
$wd = @scandir('WD/' . $spec);
+ $cr = @scandir('CR/' . $spec);
$all = array();
@@ -135,6 +136,16 @@
}
}
+ if ($cr) {
+ foreach ($cr as $date) {
+ if ('.' === $date[0]) {
+ continue;
+ }
+
+ $all[$date] = 'CR/' . $spec . $date;
+ }
+ }
+
// Sort drafts in descending order
krsort($all);
@@ -219,9 +230,9 @@
</div> <!-- /container -->
<!-- script tags -->
- <script type="text/javascript" src="../static/js/bootstrap/bootstrap.js"></script>
+ <script type="text/javascript" src="../static/js/bootstrap/bootstrap.js"></script>
<script type="text/javascript">
- $('#markup,#context,#frame').bind('keyup', function() {
+ $('#markup,#context,#frame').bind('keyup', function() {
$('.btn-group > .btn').each(function () {
$(this).removeClass('active')
});