Update RDF conversion algorithm.
authorGregg Kellogg <gregg@kellogg-assoc.com>
Thu, 04 Aug 2011 16:39:59 -0700
changeset 112 d4a5b886170f
parent 111 946f1d25e6b9
child 113 463676c3cd26
Update RDF conversion algorithm.
spec/latest/index.html
--- a/spec/latest/index.html	Thu Aug 04 15:42:56 2011 -0700
+++ b/spec/latest/index.html	Thu Aug 04 16:39:59 2011 -0700
@@ -334,6 +334,16 @@
 knowledge of the JavaScript programming language [[ECMA-262]] and 
 WebIDL [[!WEBIDL]]. To understand how JSON-LD maps to RDF, it is helpful to be 
 familiar with the basic RDF concepts [[!RDF-CONCEPTS]].</p>
+
+<p>
+  Examples may contain references to existing vocabularies and use abbreviations in CURIEs and source code. The following is a list of all vocabularies and their abbreviations, as used in this document:
+</p>
+<ul>
+  <li>The <a href="http://www.w3.org/1999/02/22-rdf-syntax-ns#">RDF</a>
+  vocabulary (abbreviation: <code>rdf</code>, e.g., <code>rdf:type</code>)</li>
+  <li>The <a href="http://www.w3.org/2001/XMLSchema#">XSD</a>
+  vocabulary (abbreviation: <code>xsd</code>, e.g., <code>xsd:integer</code>)</li>
+</ul>
 </section>
 
 <section>
@@ -589,7 +599,7 @@
 </pre>
 
 <p>A JSON-LD context document is a simple mapping from <tref>term</tref>s and
-<tref>prefix</tref>es to IRIs. Contexts may also contain datatype information
+<tref>prefix</tref>es to expanded values such as IRIs or keywords. Contexts may also contain datatype information
 for certain <tref>term</tref>s as well as other processing instructions for
 the JSON-LD processor.
 </p>
@@ -657,10 +667,10 @@
 
 <ol>
   <li>In general, <tref>term</tref>s in the key position in 
-    an associative array that have a mapping to an IRI in the context are
+    an associative array that have a mapping to an IRI or another key in the context are
     expanded to an IRI by JSON-LD processors. There are special rules for 
     processing keys in <code>@context</code> and when dealing with keys that 
-    start with the <code>@</code> character.</li>
+    start with the <code>@subject</code> character.</li>
   <li>An IRI is generated for the value specified using <code>@subject</code>, 
     if it is a string.</li>
   <li>An IRI is generated for the value specified using <code>@type</code>.</li>
@@ -1517,7 +1527,7 @@
 
 <p>Notice how all of the <tref>term</tref>s have been expanded and sorted in
 alphabetical order. Also, notice how the <tref>subject</tref> has been 
-labeled with a blank node identifier. Normalization ensures that any arbitrary
+labeled with a <tref>blank node identifier</tref>. Normalization ensures that any arbitrary
 graph containing exactly the same information would be normalized to exactly
 the same form shown above.</p>
 
@@ -1550,7 +1560,7 @@
   <dt><code>@datatype</code></dt><dd>Used to specify the datatype for a literal.</dd>
   <dt><code>:</code></dt><dd>The separator for CURIEs when used in JSON keys or JSON values.</dd>
   <dt><code>@subject</code></dt><dd>Sets the active subjects.</dd>
-  <dt><code>@type</code></dt><dd>Used to set the rdf:type of the active subjects. This token may be conferred as syntactic sugar for rdf:type.</dd>
+  <dt><code>@type</code></dt><dd>Used to set the type of the active subjects.</dd>
   </dl>
 </section>
 
@@ -1622,8 +1632,9 @@
     of a list (see <span a="#list-processing">List Processing</span>)).
   </p>
   <p>
-    A <tref>local context</tref> is identified within an associative array having a key of <code>@context</code>
-    with string or an associative array value. When processing a <tref>local context</tref>, special processing rules apply:
+    A <tref>local context</tref> is identified within an associative array having a key of
+    <code>@context</code> with string or an associative array value. When processing a <tref>local
+    context</tref>, special processing rules apply:
   </p>
   <ol class="algorithm">
     <li>Create a new, empty <tref>local context</tref>.</li>
@@ -1634,25 +1645,27 @@
     <li>If the value is an associative array, perform the following steps:
       <ol class="algorithm">
         <li>
-          If the associative array has a <code>@base</code> key, MUST have a value of a simple string with the
-          lexical form of an absolute IRI. Add the base mapping to the <tref>local context</tref>. <p
-          class="issue">Turtle allows @base to be relative. If we did this, we would have to add
-          <a href="#iri-expansion">IRI Expansion</a>.</p>
+          If the associative array has a <code>@base</code> key, it MUST have a value of a simple
+          string with the lexical form of an absolute IRI. Add the base mapping to the <tref>local
+          context</tref>. <p class="issue">Turtle allows @base to be relative. If we did this, we
+          would have to add <a href="#iri-expansion">IRI Expansion</a>.</p>
         </li>
         <li>
-          If the associative array has a <code>@vocab</code> key, MUST have a value of a simple string with the
-          lexical form of an absolute IRI. Add the vocabulary mapping to the <tref>local context</tref> after
-          performing <a href="#iri-expansion">IRI Expansion</a> on the associated value.
+          If the associative array has a <code>@vocab</code> key, it MUST have a value of a simple
+          string with the lexical form of an absolute IRI. Add the vocabulary mapping to the
+          <tref>local context</tref> after performing <a href="#iri-expansion">IRI Expansion</a> on
+          the associated value.
         </li>
         <li>
-          The key <code>@coerce</code> MUST have a value of an associative array. Add the
-          <code>@coerce</code> mapping to the <tref>local context</tref>.
+          If the associative array has a <code>@coerce</code> key, it MUST have a value of an
+          associative array. Add the <code>@coerce</code> mapping to the <tref>local context</tref>
+          performing <a href="#iri-expansion">IRI Expansion</a> on the associated value(s).
         </li>
         <li>
-          Otherwise, the key MUST have the lexical form of
-          <cite><a href="http://www.w3.org/TR/2009/REC-xml-names-20091208/#NT-NCName">NCName</a></cite>
-          and MUST have the value of a simple string with the lexical form of IRI.
-          Merge the key-value pair into the <tref>local context</tref>.
+          Otherwise, the key MUST have the lexical form of <cite><a
+          href="http://www.w3.org/TR/2009/REC-xml-names-20091208/#NT-NCName">NCName</a></cite> and
+          MUST have the value of a simple string with the lexical form of IRI. Merge the key-value
+          pair into the <tref>local context</tref>.
         </li>
       </ol>
     </li>
@@ -1753,7 +1766,7 @@
         matched IRI in the <tref>local context</tref> concatenated with a 
         colon (:) character and the unmatched part of the string. If there is
         more than one compacted IRI produced, the final value is the 
-        lexographically least value of the entire set of compacted IRIs.</li>
+        lexicographically least value of the entire set of compacted IRIs.</li>
     </ol>
   </p>
 </section>
@@ -2081,13 +2094,12 @@
 
 <section>
   <h3>RDF Conversion Algorithm</h3>
-
   <p>
     The algorithm below is designed for in-memory implementations with random access to associative
     array elements.
   </p>
   <p>
-    A conforming JSON-LD processor MUST implement a
+    A conforming JSON-LD processor implementing RDF conversion MUST implement a
     processing algorithm that results in the same <tref>default graph</tref> that the following
     algorithm generates:
   </p>
@@ -2107,10 +2119,17 @@
           described in <a href="#context">Context</a>.
         </li>
         <li>
+          Create a new associative array by mapping the keys from the current associative array using the
+          <tref>active context</tref> to new keys using the associated value from the current associative array.
+          Repeat the mapping until no entry is found within the <tref>active context</tref> for the key. Use the new
+          associative array in subsequent steps.
+        </li>
+        <li>
           If the associative array has an <code>@iri</code> key, set the <tref>active object</tref> by
           performing <a href="#iri-expansion">IRI Expansion</a> on the associated value. Generate a
           triple representing the <tref>active subject</tref>, the <tref>active property</tref> and the
           <tref>active object</tref>. Return the <tref>active object</tref> to the calling location.
+          <p class="issue"><code>@iri</code> really just behaves the same as <code>@subject</code>, consider consolidating them.</p>
         </li>
         <li>
           If the associative array has a <code>@literal</code> key, set the <tref>active object</tref>
@@ -2128,7 +2147,7 @@
           Generate a triple representing the <tref>active subject</tref>, the <tref>active
           property</tref> and the <tref>active object</tref>. Return the <tref>active object</tref> to the calling location.
         </li>
-        <li>If the associative array has a <code>@</code> key:
+        <li>If the associative array has a <code>@subject</code> key:
           <ol class="algorithm">
             <li>
               If the value is a string, set the <tref>active object</tref> to the result of performing
@@ -2145,8 +2164,8 @@
           </ol>
         </li>
         <li>
-          If the associative array does not have a <code>@</code> key, set the <tref>active
-          object</tref> to newly generated <tref>blank node identifier</tref>. Generate a triple
+          If the associative array does not have a <code>@subject</code> key, set the <tref>active
+          object</tref> to newly generated <tdef>blank node identifier</tdef>. Generate a triple
           representing the <tref>active subject</tref>, the <tref>active property</tref> and the
           <tref>active object</tref>. Set the <tref>active subject</tref> to the <tref>active
           object</tref>.
@@ -2155,8 +2174,9 @@
           For each key in the associative array that has not already been processed, perform
           the following steps:
           <ol class="algorithm">
-            <li>If the key is <code>a</code>, set the <tref>active property</tref> 
-            to <code>rdf:type</code>.
+            <li>
+              If the key is <code>@type</code>, set the <tref>active property</tref> 
+              to <code>rdf:type</code>.
             </li>
             <li>Otherwise, set the <tref>active property</tref> to the result of performing
             <a href="#iri-expansion">IRI Expansion</a> on the key.</li>
@@ -2190,31 +2210,49 @@
             </li>
             <li>
               Otherwise, generate a triple using using the <tref>active subject</tref>, <tref>active property</tref>
-              and a newly generated BNode identified as <em>first bnode</em>.
+              and a newly generated BNode identified as <em>first <tdef>blank node identifier</tdef></em>.
             </li>
             <li>
               For each element other than the last element in the list:
               <ol class="algorithm">
-                <li>Create a processor state using the active context, <em>first bnode</em> as the <tref>active subject</tref>, and <code>rdf:first</code> as the <tref>active property</tref>.</li>
-                <li>Unless this is the last element in the list, generate a new BNode identified as <em>rest bnode</em>, otherwise use <code>rdf:nil</code>.</li>
-                <li>Generate a new triple using <em>first bnode</em>, <code>rdf:rest</code> and <em>rest bnode</em>.</li>
-                <li>Set <em>first bnode</em> to <em>rest bnode</em>.</li>
+                <li>Create a processor state using the active context, <em>first <tdef>blank node identifier</tdef></em> as the <tref>active subject</tref>, and <code>rdf:first</code> as the <tref>active property</tref>.</li>
+                <li>Unless this is the last element in the list, generate a new BNode identified as <em>rest <tdef>blank node identifier</tdef></em>, otherwise use <code>rdf:nil</code>.</li>
+                <li>Generate a new triple using <em>first <tdef>blank node identifier</tdef></em>, <code>rdf:rest</code> and <em>rest <tdef>blank node identifier</tdef></em>.</li>
+                <li>Set <em>first <tdef>blank node identifier</tdef></em> to <em>rest <tdef>blank node identifier</tdef></em>.</li>
               </ol>
             </li>
           </ol>
         </li>
         <li>
-          Otherwise, create a new <tref>processor state</tref> copies of the <tref>active context</tref>,
-          <tref>active subject</tref> and <tref>active property</tref> and process the value
-          starting at <a href="#processing-step-associative">Step 2</a> and proceed using the
-          previous <tref>processor state</tref>.
+          Otherwise, create a new <tref>processor state</tref> using copies of the <tref>active
+          context</tref>, <tref>active subject</tref> and <tref>active property</tref> and process the value
+          starting at <a href="#processing-step-associative">Step 2</a> then proceed using the previous
+          <tref>processor state</tref>.
         </li>
       </ol>
     </li>
     
     <li>
-      If a string is detected, generate a triple using the <tref>active subject</tref>, <tref>active object</tref>
-      and a <tref>plain literal</tref> value created from the string.
+      If a string is detected:
+      <ol class="algorithm">
+        <li>
+          If the <tref>active property</tref> is the target of a <code>@iri</code> coercion,
+          set the <tref>active object</tref> by
+          performing <a href="#iri-expansion">IRI Expansion</a> on the string.
+        </li>
+        <li>
+          Otherwise, if the <tref>active property</tref> is the target of coercion,
+          set the <tref>active object</tref> by creating a <tref>typed literal</tref> using
+          the string and the coercion key as the datatype IRI.
+        </li>
+        <li>
+          Otherwise, set the <tref>active object</tref> to a <tref>plain literal</tref> value created from
+          the string.
+        </li>
+      </ol>
+      Generate a
+      triple representing the <tref>active subject</tref>, the <tref>active property</tref> and the
+      <tref>active object</tref>.
     </li>
     
     <li>
@@ -2222,12 +2260,12 @@
       the value with datatype set to either <code>xsd:integer</code> or
       <code>xsd:double</code>, depending on if the value contains a
       fractional and/or an exponential component. Generate a triple using the <tref>active
-      subject</tref>, <tref>active object</tref> and the generated typed literal.
+      subject</tref>, <tref>active property</tref> and the generated typed literal.
     </li>
     
     <li>
       Otherwise, if <strong>true</strong> or <strong>false</strong> is detected,
-      generate a triple using the <tref>active subject</tref>, <tref>active object</tref>
+      generate a triple using the <tref>active subject</tref>, <tref>active property</tref>
       and a <tref>typed literal</tref> value created from the string representation of the
       value with datatype set to <code>xsd:boolean</code>.
     </li>
@@ -2669,7 +2707,7 @@
 <pre class="example" data-transform="updateExample">
 <!--
 {
-  "****rdf:type****": "****foaf:Person****",
+  "****@type****": "****foaf:Person****",
   "****foaf:name****": "Manu Sporny",
   "****foaf:homepage****": "http://manu.sporny.org/",
   "****sioc:avatar****": "http://twitter.com/account/profile_image/manusporny"