Merge
authorGavin Carothers <gavin@carothers.name>
Tue, 15 May 2012 11:33:17 -0700
changeset 382 fa935fb1c3c0
parent 381 7496e2a2024c (current diff)
parent 380 14359ee3080c (diff)
child 384 c9292e539063
Merge
rdf-concepts/Graph-ex.gif
rdf-turtle/index.html
Binary file rdf-concepts/Graph-ex.gif has changed
--- a/rdf-concepts/index.html	Wed May 09 19:37:57 2012 -0700
+++ b/rdf-concepts/index.html	Tue May 15 11:33:17 2012 -0700
@@ -4,8 +4,9 @@
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     <title>RDF 1.1 Concepts and Abstract Syntax</title>
     <style type="text/css">
-.figure { font-weight: bold; text-align: center; }
-table.xsd-types td, table.xsd-types th { border: 1px solid #ddd; padding: 0.1em 0.5em; }
+.figure { text-align: center; }
+.figure a[href]:hover { background: transparent; }
+table td, table th { border: 1px solid #ddd; padding: 0.2em 0.5em; }
     </style>
     <script src='../ReSpec.js/js/respec.js' class='remove'></script>
     <script class='remove'>
@@ -173,7 +174,7 @@
     node-arc-node link; hence the term “graph”.</p>
 
     <div class="figure">
-      <img src="Graph-ex.gif" alt="image of the RDF triple comprising (subject, predicate, object)" />
+      <a href="rdf-graph.png"><img src="rdf-graph.svg" alt="An RDF graph with two nodes (Subject and Object) and a triple connecting them (Predicate)" /></a>
     </div>
 
     <p>There may be three kinds of <a title="node">nodes</a> in an
@@ -246,12 +247,18 @@
     <code>http://www.w3.org/2000/01/rdf-schema#</code>.</li>
 
     <li>A good way of communicating the intended referent to the world
-    is to set up the IRI so that it resolves to such a document.</li>
+    is to set up the IRI so that it
+    <a href="http://www.w3.org/TR/webarch/#uri-dereference">dereferences</a>
+    [[WEBARCH]] to such a document.</li>
 
     <li>Such a document can, in fact, be an <a>RDF document</a>
     that describes the denoted resource by means of
     <a title="RDF statement">RDF statements</a>.</li>
     </ul>
+</section>
+
+<section id="vocabularies">
+    <h3>RDF Vocabularies and Namespace IRIs</h3>
 
     <p>An <dfn>RDF vocabulary</dfn> is a collection of <a title="IRI">IRIs</a>
     with clearly established <a title="referent">referents</a>
@@ -261,9 +268,35 @@
     RDF vocabularies. Some such vocabularies are mentioned in the
     Primer [[RDF-PRIMER]].</p>
 
-    <p class="issue">It has been suggested that this specification should
-    also define terms such as “<dfn>namespace</dfn>”, “<dfn>namespace IRI</dfn>”,
-    and “<dfn>namespace prefix</dfn>”.</p>
+    <p class="issue">The material below may be moved to the new
+    <em>RDF 1.1 Primer</em> document once it becomes available.</p>
+
+    <p>The <a title="IRI">IRIs</a> in an <a>RDF vocabulary</a> often share
+    a common substring known as a <dfn>namespace IRI</dfn>.
+    Some namespace IRIs are associated by convention with a short name
+    known as a <dfn>namespace prefix</dfn>. Some examples:
+
+    <table rules="all" summary="Some example namespace prefixes and IRIs">
+      <tr><th>Namespace prefix</th><th>Namespace IRI</th><th>RDF vocabulary</th></tr>
+      <tr><td>rdf</td><td><a href="http://www.w3.org/1999/02/22-rdf-syntax-ns#"><code>http://www.w3.org/1999/02/22-rdf-syntax-ns#</code></a></td><td>The RDF built-in vocabulary [[RDF-SCHEMA]]</td></tr>
+      <tr><td>rdfs</td><td><a href="http://www.w3.org/2000/01/rdf-schema#"><code>http://www.w3.org/2000/01/rdf-schema#</code></a></td><td>The RDF Schema vocabulary [[RDF-SCHEMA]]</td></tr>
+      <tr><td>xsd</td><td><a href="http://www.w3.org/2001/XMLSchema#"><code>http://www.w3.org/2001/XMLSchema#</code></a></td><td>The <a>RDF-compatible XSD types</a></td></tr>
+    </table>
+
+    <p>In some contexts it is common to abbreviate <a title="IRI">IRIs</a>
+    that start with <a title="namespace IRI">namespace IRIs</a> by using the
+    associated <a>namespace prefix</a>. For example, the IRI
+    <code>http://www.w3.org/1999/02/22-rdf-syntax-ns#XMLLiteral</code>
+    would be abbreviated as <code>rdf:XMLLiteral</code>.
+    Note however that these abbreviations are <em>not</em> valid IRIs,
+    and MUST NOT be used in contexts where IRIs are expected.
+    Namespace IRIs and namespace prefixes are <em>not</em> a formal part of the
+    RDF data model. They are merely a syntactic convenience for
+    abbreviating IRIs.</p>
+
+    <p>The term “<dfn>namespace</dfn>” on its own does not have a
+    well-defined meaning in the context of RDF, but is sometimes informally
+    used to mean “<a>namespace IRI</a>” or “<a>RDF vocabulary</a>”.</p>
 </section>
 
 
@@ -300,12 +333,23 @@
 
 
 <section id="conformance">
-    <p>Implementations are free to represent <a title="RDF graph">RDF graphs</a> in
-    any other equivalent form.</p>
+    <p>This specification, <em>RDF 1.1 Concepts and Abstract Syntax</em>,
+    defines a data model and related terminology for use in
+    other specifications, such as
+    <a title="concrete RDF syntax">concrete RDF syntaxes</a>,
+    API specifications, and query languages.
+    Implementations cannot directly conform to
+    <em>RDF 1.1 Concepts and Abstract Syntax</em>,
+    but can conform to such other specifications that are based on the
+    RDF data model.</p>
 
-    <p class="issue">This section needs to explain what kind of artefact
-    can conform to this specification, and what is required in order to
-    conform.</p>
+    <p>Another specification conforms to
+    <em>RDF 1.1 Concepts and Abstract Syntax</em> if it defines operations
+    in terms of <a title="RDF graph">RDF graphs</a>
+    or <a title="RDF dataset">RDF datasets</a>, and if any use of
+    terminology defined in normative sections of
+    <em>RDF 1.1 Concepts and Abstract Syntax</em>
+    is consistent with its definitions and conformance requirements.</p>
 </section>
 
 
@@ -695,8 +739,7 @@
     <p>The <a title="literal">literals</a> that can be defined using this
     datatype are:</p>
 
-    <table border="1" cellpadding="5" summary=
-    "This table lists the literals of type xsd:boolean.">
+    <table rules="all" summary="This table lists the literals of type xsd:boolean.">
       <tr>
         <th>Literal</th>
         <th>Value</th>
@@ -732,7 +775,7 @@
     listed in the following table are the
     <dfn>RDF-compatible XSD types</dfn>. Their use is RECOMMENDED.</p>
  
-    <table class="xsd-types" rules="all">
+    <table rules="all" summary="A list of the RDF-compatible XSD types, with short descriptions">
     <tr><th></th><th>Datatype</th><th>Value space (informative)</th></tr>
 
     <tr><th rowspan="4">Core types</th><td><a href="http://www.w3.org/TR/xmlschema11-2/#string"><code>xsd:string</code></a></td><td>Character strings</td></tr>
@@ -830,9 +873,7 @@
     <p>RDF provides for XML content as a possible <a>literal value</a>.
     Such content is indicated in an <a>RDF graph</a> using a <a>literal</a>
     whose <a>datatype</a> is a special built-in datatype
-    <code>rdf:XMLLiteral</code>.</p>
-
-    <p><code><dfn>rdf:XMLLiteral</dfn></code> is defined as follows.</p>
+    <code><dfn>rdf:XMLLiteral</dfn></code>, which is defined as follows:</p>
    
     <dl>
       <dt><a name="XMLLiteral-uri" id="XMLLiteral-uri">An IRI denoting
@@ -863,22 +904,11 @@
 
       <dt><a name="XMLLiteral-mapping" id="XMLLiteral-mapping">The lexical-to-value mapping</a></dt>
 
-      <dd>is defined as follows:
-      <ul>
-      <li>Let <code>xmldoc</code> be the literal's lexical form,
-      wrapped between an arbitrary XML start-tag and matching end-tag</li>
-      <li>Let <code>domdoc</code> be a DOM
-      <a href="http://www.w3.org/TR/DOM-Level-3-Core/core.html#i-Document"><code>Document</code></a>
-      object [[!DOM-LEVEL-3-CORE]] corresponding to <code>xmldoc</code></li>
+      <dd><ul>
       <li>Let <code>domfrag</code> be a DOM
       <a href="http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-B63ED1A3"><code>DocumentFragment</code></a>
-      whose
-      <a href="http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-1451460987"><code>childNodes</code></a>
-      attribute is equal to the
-      <a href="http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-1451460987"><code>childNodes</code></a>
-      attribute of <code>domdoc</code>'s
-      <a href="http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-87CD092"><code>documentElement</code></a>
-      attribute</li>
+      node [[!DOM-LEVEL-3-CORE]] corresponding to the literal's
+      <a>lexical form</a></li>
       <li>Return <code>domfrag.<a href="http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-normalize">normalize</a>()</code></li>
       </ul></dd>
 
@@ -1107,6 +1137,10 @@
   <h2>Changes from RDF 2004</h2>
 
   <ul>
+    <li>2012-05-14: Replaced the example graph diagram in <a href="#data-model">Section 1.1</a> with a re-drawn SVG version, with support from Dominik Tomaszuk</li>
+    <li>2012-05-10: New <a href="#conformance">Conformance section</a> to explain that this specification is not implemented directly, but through other specifications that use our definitions</li>
+    <li>2012-05-10: Simplified <code><a>rdf:XMLLiteral</a></code>'s new value space slightly after feedback from Ivan Herman and Arnaud Le Hors.</li>
+    <li>2012-05-10: Added an informative subsection on <a href="#vocabularies">RDF vocabularies and namespace IRIs</a>.</li>
     <li>2012-05-09: Removed an example from the conformance section that didn't make sense any more with the modified <code>rdf:XMLLiteral</code>. Added some new issue boxes.</li>
     <li>2012-05-09: <code><a>rdf:XMLLiteral</a></code> no longer requires lexical forms to be canonicalized, and the value space is now defined in terms of [[DOM-LEVEL-3-CORE]] (<a href="https://www.w3.org/2011/rdf-wg/track/issues/13">ISSUE-13</a>)</li>
     <li>2012-05-09: Removed Section 3 <em>RDF Vocabulary IRI and Namespace</em>; its contents will be folded into the RDF Schema document</li>
Binary file rdf-concepts/rdf-graph.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rdf-concepts/rdf-graph.svg	Tue May 15 11:33:17 2012 -0700
@@ -0,0 +1,19 @@
+<svg viewBox="0 -20.5 329 41" width="329" height="41" xmlns="http://www.w3.org/2000/svg">
+  <style type="text/css">
+ellipse, polyline { stroke-width: 1; stroke: black; }
+ellipse { fill: white; }
+polyline { fill: none; }
+text { fill: black; text-anchor: middle; font-family: Helvetica, sans-serif; }
+  </style>
+  <g transform="translate(55 0)">
+    <ellipse rx="54" ry="20"/><text y="5" font-size="16">Subject</text>
+  </g>
+  <g transform="translate(274 0)">
+    <ellipse rx="54" ry="20"/><text y="5" font-size="16">Object</text>
+  </g>
+  <g transform="translate(109 0)">
+    <text x="52" y="-5" font-size="16">Predicate</text>
+    <polyline points="0,0 109,0"/>
+    <polyline points="98,-5 110,0 98,5"/>
+  </g>
+</svg>
--- a/rdf-spaces/index.html	Wed May 09 19:37:57 2012 -0700
+++ b/rdf-spaces/index.html	Tue May 15 11:33:17 2012 -0700
@@ -2,7 +2,7 @@
 <html lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-    <title>RDF Spaces</title>
+    <title>RDF Spaces and Datasets</title>
     <style type="text/css">
 .figure { font-weight: bold; text-align: center; }
 table.xsd-types td, table.xsd-types th { border: 1px solid #ddd; padding: 0.1em 0.5em; }
@@ -33,7 +33,7 @@
 //          previousMaturity:  "REC",
 
           // if there a publicly available Editor's Draft, this is the link
-//@@@
+//
           edDraftURI:           "http://dvcs.w3.org/hg/rdf/raw-file/default/rdf-spaces/index.html",
 
           // if this is a LCWD, uncomment and set the end of its review period
@@ -93,8 +93,61 @@
           doRDFa: true,
       };
 
-// @@@ A number of references have been patched into the local berjon.biblio and need to be added to the global biblio in CVS:
+//  A number of references have been patched into the local berjon.biblio and need to be added to the global biblio in CVS:
     </script>
+
+    
+    <style type="text/css">
+
+     .alert {
+         padding: 1em; 
+         margin: 0em; 
+         margin-bottom: 2em; 
+
+         border:2px solid blue; 
+
+         box-shadow: 10px 10px 5px #888;
+         -moz-box-shadow: 10px 10px 5px #888;
+         -webkit-box-shadow: 10px 10px 5px #888;
+
+         -moz-border-radius: 5px;
+         -webkit-border-radius: 5px;
+         -khtml-border-radius: 5px;
+         border-radius: 5px;
+     }
+
+    .separated thead tr th { border:1px solid black; padding: .2em; }
+    .separated tbody tr td { border:1px solid black; text-align: center; }
+    .separated tbody tr td.r { text-align: right; padding: .5em; }
+    .grammar td { font-family: monospace;}
+    .grammar-literal { color: gray;}
+    
+    .example-def { border:1px solid black; padding: 1em; }
+
+    /* --- borrowed from  EXAMPLES --- */
+.exvoc {
+    border: 1px solid #90A0B0;
+    padding:    1em;
+    margin-top: 1em;
+}
+
+.exvoc::before {
+    content:    "Vocabulary Defined For This Example";
+    display:    block;
+    width:      450px;
+    background: #90A0B0;
+    color:  #fff;
+    font-family:    initial;
+    padding:    3px;
+    font-weight:    bold;
+    margin: -1em 0 1em -1em;
+}
+
+.schema {
+   color: #8090A0;
+}
+    </style> 
+	
   </head>
 
   <body>
@@ -102,35 +155,306 @@
 <section id="abstract">
   <p>This specification introduces the notion of RDF
   <a>space</a>s&mdash;places to store RDF triples&mdash;and defines a
-  set of languages for expressing information about them.  Examples of
-  RDF spaces include: an HTML page with embedded RDFa or microdata, a
-  file containing RDF/XML or Turtle data, and a SQL database viewable
-  as RDF using R2RML.  RDF spaces are a generalization of SPARQL's
-  <a>named graph</a>s, providing a standard model with formal
-  semantics for systems which manage multiple collections of RDF data. </p>
+  set of mechanisms expressing and manipulating information about
+  them.  Examples of RDF spaces include: an HTML page with embedded
+  RDFa or microdata, a file containing RDF/XML or Turtle data, and a
+  SQL database viewable as RDF using R2RML.  RDF spaces are a
+  generalization of SPARQL's <a>named graph</a>s, providing a standard
+  model with formal semantics for systems which manage multiple
+  collections of RDF data. </p>
 </section>
 
+<section id="sotd">
+  <div class="alert">
+    <h2>Editor's Draft Status</h2>
+    
+    <p>Closing in on FPWD IMHO, but not there yet.  The
+    "@@@" flags mark the places where I'm pretty sure something is
+    needed before FPWD.</p>
+
+    <p>This text might be re-factored into other the other RDF
+    documents.  The Use Cases and Example would probably end up in a
+    WG Note.</p>
+
+  </div>
+</section>
 
 <section class="informative">
     <h2>Introduction</h2>
 
-    <p>@@@ background, context, and general motivation ... </p>
+
+    <p>The <a href="http://www.w3.org/TR/rdf11-concepts/">Resource
+    Description Framework (RDF)</a> provides a simple declarative way
+    to store and transmit information.  It also provides a trivial but
+    effective way to combine information from multiple sources, with
+    graph merging.  This allows information from different people,
+    different organizations, different units within an organization,
+    different servers, different algorithms, etc, to all be combined
+    and used together, without any special processing or understanding
+    of the relationships among the providers.</p>
+
+    <p>For some applications, the basic RDF merge operation is overly
+    simplistic, as extra processing and an understanding of the
+    relationships among the providers may be useful.  This document
+    specifies a way to conveniently handle information coming from
+    multiple sources, by modeling each one as a separate
+    <em>space</em>, and using RDF to express information about these
+    spaces.  In addition to this important concept, we provide a pair
+    of languages&mdash;extensions to existing RDF syntaxes&mdash;
+    which can be used to store or transmit in one document the
+    contents of multiple spaces as well as information about them.
+
+    <p>This approach allows for a variety of use cases (immediately
+    below) to be addressed in a straightforward manner, as shown in <a
+    href="#detailed-example" class="sectionRef"></a>.</p>
 
 </section>
 
 <section>
+  <h2>Use Cases</h2>
+
+  <p>Each of these use cases is initally described in terms of the
+  following scenario.  Details of how each use case might be addressed
+  using the technologies specified in this document are in <a
+  href="#detailed-example" class="sectionRef"></a>.</p>
+
+  <blockquote style="font-style: italic">
+
+    <p>The Example Foundation is a large organization with more than
+    ten thousand employees and volunteers, spread out over five
+    continents.  It has branches in <b>25 different countries</b>, and
+    those divisions have considerable autonomy; they are only loosely
+    controlled by the parent organization (called "headquarters" or
+    "HQ") in Geneva.</p>
+
+    <p>HQ wants to help the divisions work together better.  It
+    decides a first step is to provide a simple but complete directory
+    of all the Example personnel.  Until now, each division has
+    maintained its own directory, using its own technology.  HQ wants to gather them all together, building a <b>federated phonebook</b>.  They want
+    to be able to find someone's phone number, mailing address,
+    and job title, knowing only their name or email addresses.  Later,
+    they hope to extend the system to allow finding people based on
+    their areas of interest and expertise.</p>
+
+    <p>HQ understands that people will want access to the phonebook in
+    many different computing environments and with different
+    languages, social norms, and application styles.  Users are going
+    to want at least one Web based user interface (UI), but they will
+    also want mobile UIs for different platforms, desktop UIs for
+    different platforms, and even to look up information via text
+    messaging.  HQ does not have the resources to build all of these,
+    so they intend to provide <b>direct access to the data</b> so that the
+    divisions can do it themselves as needed.</p>
+
+  </blockquote>
+  
+  <p>Each of the sections below, after the first, contains a new
+  requirement, something additional that users in this scenario want
+  the system to do.  Each of these will motivate the features of the
+  technologies specified in this rest of document.</p>
+
+  <section id="uc-start">
+    <h2>Baseline Solution (Just Triples)</h2>
+
+    <blockquote style="font-style: italic">
+
+      <p>As a starting point, HQ needs to gather data from each
+      division and re-publish it, in one place, for use by the
+      different UIs.</p>
+
+    </blockquote>
+    
+    <p>This is a general use case for RDF, with no specific need for
+    using <a>space</a>s or <a>dataset</a>s.  It simply involves
+    divisions pubishing RDF data on the web (with some common
+    vocabulary and with access control), then HQ merging it and
+    putting it on their website (with access control).</p>
+
+    <p>For an example of how this baseline could be implemented, see
+    <a href="#example-start" class="sectionRef"></a></p>
+
+  </section>
+
+  <section id="uc-web">
+    <h2>Showing Provenance</h2>
+
+    <blockquote style="font-style: italic">
+
+      <p>A user says: I'm looking at an incorrect phonebook entry.  It
+      has the name of the person I'm looking for, but it's missing
+      most of the record.  I can't even tell which division the person
+      works for.  I need to know who is responsible for this
+      information, so I can get it corrected.
+      </p>
+
+      <p>While this might be address by including a "report-errors-to"
+      field in each phonebook entry, HQ is looking ahead to the day
+      when other information is in the phonebook &mdash; like which
+      projects the person has worked on &mdash; which might be come
+      from a variety of others sources, possibly other divisions.</p>
+
+    </blockquote>
+    
+    <p>For a discussion of how this use case could be addressed, see
+    <a href="#example-web" class="sectionRef"></a></p>
+
+  </section>
+
+  <section id="uc-process">
+    <h2>Maintaining Derived Data</h2>
+
+    <blockquote style="font-style: italic">
+
+      <p>It turns out different divisions are using somewhat different
+      vocabularies for publishing their data.  HQ writes a program to
+      translate, but they need the output of that program to be
+      correctly attributed, in case it turns out to be wrong.
+      </p>
+
+    </blockquote>
+    
+    <p>This use case motivates sharing of blank nodes between named
+    graphs, as seen in the example.</p>
+
+    <p>For a discussion of how this use case could be addressed, see
+    <a href="#example-process" class="sectionRef"></a></p>
+
+  </section>
+
+
+  <section id="uc-reported">
+    <h2>Distributed Harvesting</h2>
+
+    <blockquote style="font-style: italic">
+
+      <p>It turns out some divisions do not have centralized
+      phonebooks.  Division 3 has twelve different departments, each
+      with its own phonebook.  Divsion 3 can do the harvesting from
+      its departments, but it does not want to be in the loop for
+      corrections; it wants those to go straight back to the relevant
+      department.
+      </p>
+
+    </blockquote>
+    
+    <p>For a discussion of how this use case could be addressed, see
+    <a href="#example-reported" class="sectionRef"></a></p>
+
+  </section>
+
+
+  <section id="uc-untrusted">
+    <h2>Loading Untrusted Datasets</h2>
+
+    <blockquote style="font-style: italic">
+
+      <p>A user reports: There's information here that says it's from
+      our department, but it's not.  Somehow your provenance
+      information is wrong.  We need to see the provenance of the
+      provenance!</p>
+
+    </blockquote>
+    
+    <p>For a discussion of how this use case could be addressed, see
+    <a href="#example-untrusted" class="sectionRef"></a></p>
+
+  </section>
+
+
+  <section id="uc-transtime">
+    <h2>Showing Revision History</h2>
+
+    <blockquote style="font-style: italic">
+
+      <p>Division 14's legal department says: "We're doing an
+      investigation and we need to be able to connect people's names
+      and phone numbers as they used to be.  Can you include archival
+      data in the data feed, so we we can search the phonebook as it
+      was on each day of September, last year?"
+      </p>
+
+    </blockquote>
+    
+    <p>For a discussion of how this use case could be addressed, see
+    <a href="#example-transtime" class="sectionRef"></a></p>
+
+  </section>
+
+
+  <section id="uc-validtime">
+    <h2>Expressing Past or Future States</h2>
+
+    <blockquote style="font-style: italic">
+
+      <p>Division 5 says: "We're planning a major move in three
+      months, to a neighboring city.  Everybody's office and phone
+      number will have to change.  Can we start putting that
+      information in the phonebook now, but mark it as not effective
+      until 20 July?  After the move, we'll also need to see the old
+      (no-longer-in-effect) data for a while, until we get everything
+      straightened out.</p>
+
+    </blockquote>
+    
+    <p>This use case, contrasted with the previous one, shows the
+    difference between <em>Transaction Time</em> and <em>Valid
+    Time</em> in bitemporal databases.  After Division 5's move, the
+    "old" phone numbers are not just the old state of the database;
+    they reflect the old state of the world.  It is possible that some
+    time after the move, an error in the pre-move data might need to
+    be corrected.  This would require a new transaction time, even
+    though the valid-time has already ended.</p>
+
+    <p>Use case sightings:</p>
+    <ul>
+      <li><a href="http://www.jenitennison.com/blog/node/101">Temporal Scope for RDF Triples</a>, Jeni Tennison's report of attempting to solve this problem in UK Government data.
+      </li>
+      <li><a
+    href="http://lists.w3.org/Archives/Public/public-rdf-wg/2012May/0099.html">Vocab
+    terms for owner, validFrom and validUntil</a>, Manu Sporny
+    reports PaySwarm wants to record ownership information for
+    particular time ranges.</li>
+    </ul>
+
+    <p>For a discussion of how this use case could be addressed, see
+    <a href="#example-validtime" class="sectionRef"></a></p>
+
+  </section>
+
+
+  <section>
+    <h2>Vendor-Neutral SPARQL Backup</h2>
+
+    <blockquote style="font-style: italic">
+
+      <p>
+      </p>
+
+    </blockquote>
+    
+
+
+    <p>@@@ we want to be able to dump the database and load it in a different system</p>
+
+    <p>@@@ This doesn't seem to belong here.   Maybe we have Federated Phonebook use cases, and *other* ones, too?</p>
+  </section>
+
+
+</section>
+
+
+
+<section>
   <h2>Concepts</h2>
 
+
   <section>
     <h2>Space</h2>
 
-    <p class="issue">The term "Space" is a placeholder.  The final
-    term has not yet been selected by the Working Group.  Other
-    candidates include "G-Box", "(Data) Surface", "(Data) Layer", "Sheet", "(Data) Page".  The
-    Editors do not consider <a
-    href="http://www.w3.org/2011/rdf-wg/meeting/2011-10-12#resolution_1">F2F2
-    Resolultion 1</a> still binding, given the degree to which the concept
-    and its role has shifted since that meeting.</p>
+    <p class="issue">The term "space" might change.  The final
+    terminology has not yet been selected by the Working Group.  Other
+    candidates include "g-box", "data space", "graph space", "(data)
+    surface", "(data) layer", "sheet", and "(data) page".</p>
 
     <p>An RDF <dfn>space</dfn> is anything that can reasonably be said
     to explicitly contain zero or more RDF triples and has an identity distinct
@@ -180,14 +504,34 @@
       well-defined set of triples at any given point in time.  For
       example: a Web Service which returns RDF data including the
       client's IP address, or a site which customizes the data
-      presented based on client login cookies.  See <a
-      href="#hyperspaces">Hyperspaces.</a></li>
+      presented based on client login cookies.  Such resources might
+      be called "hyperspaces".</li>
 
     </ul>
 
   </section>
 
   <section>
+    <h2>Quad and Quadset</h2>
+
+    <p>We define an RDF <dfn>quad</dfn> as the 4-tuple
+    (<i>subject</i>, <i>predicate</i>, <i>object</i>,
+    <i>space</i>).</p>
+
+    <p>Informally, a quad should be understood as a statement that the
+    RDF triple (<i>subject</i>, <i>predicate</i>, <i>object</i>) is in
+    the <a>space</a> <i>space</i>.</p>
+
+    <p>We define an RDF <dfn>quadset</dfn> as a set containing (zero
+    or more) RDF Quads and (zero or more) RDF Triples.  A quadset is
+    thus an extension to the concept of an RDF Graph (a set containing
+    zero or more RDF triples) to also potentially include statements
+    about triples being in particular spaces.</p>
+
+  </section>
+
+
+  <section>
     <h2>Dataset</h2>
 
     <p>A <dfn>dataset</dfn> is defined by <a
@@ -208,10 +552,11 @@
     each query is performed against the information in a specific
     dataset.</p>
     
-    <p>A dataset is a pure mathematical structure, like an RDF Graph
-    or a set of integers, with no identity apart from its contents.
-    Two datasets with the same contents are in fact the same dataset,
-    and one dataset cannot change over time.</p>
+    <p>Although the term is sometimes used more loosely, a dataset is
+    a pure mathematical structure, like an RDF Graph or a set of
+    integers, with no identity apart from its contents.  Two datasets
+    with the same contents are in fact the same dataset, and one
+    dataset cannot change over time.</p>
 
     <p>The word <strong>"default"</strong> in the term "default graph"
     refers to the fact that in SPARQL, this is the graph a server uses
@@ -223,6 +568,80 @@
   </section>
 
   <section>
+    <h2>Named Graph</h2>
+
+    <p>SPARQL formally defines a <em>named graph</em>
+    following <b>[Carroll]</b>, to be any of the (name, graph) pairs in a
+    <a>dataset</a>.</p>
+
+    <p>In practice, the term is often used to refer to the graph part
+    of those pairs.  This is the usage we follow in this document,
+    saying that a graph is a <dfn>named graph</dfn> in some dataset if
+    and only if it appears as the graph part of a (name, graph) pair
+    in that dataset.  Note that "named graph" is a relation, not a
+    class: we say that something is a named graph <em>of a
+    dataset</em>, not simply that it is a named graph.</p>
+
+    <p>The term is also sometimes used to refer to the slot part of
+    the (name, slot) pairs in a <a>graph store</a>.  For example, the
+    text of <a
+    href="http://www.w3.org/TR/2012/WD-sparql11-update-20120105/">SPARQL
+    1.1 Update</a> says, "This example copies triples from one named
+    graph to another named graph".  For clarity, we avoid calling
+    these "named graphs" and instead call them "named slots" of the
+    graph store.</p>
+
+  </section>
+
+    
+  <section id="qdmap">
+    <h2>Quadset/Dataset Relationship</h2>
+
+    <p>A <dfn>quad-equivalent dataset</dfn> is a <a>dataset</a> with
+    no empty named graphs.  A <dfn>non-quad-equivalent dataset</dfn>
+    is a dataset in which one or more of its named graphs is empty.
+    Every non-quad-equivalent dataset has a corresponding
+    quad-equivalent dataset formed by removing the (name, graph) pairs
+    where the graph is empty.</p>
+
+    <p><a>Quadset</a>s and quad-equivalent datasets are isomorphic,
+    and given identical declarative semantics in <a href="#semantics"
+    class="sectionRef"></a>.  The isomorphism is:</p>
+
+    <ul>
+
+      <li>the triples in the quadset correspond to the triples in default
+     graph of the dataset;</li>
+
+     <li>each quad corresponds to a triple in named graph: the quad (S
+     P O Sp) corresponds to the triple (S P O) in the graph paired
+     with the name Sp.</li>
+
+    </ul>
+
+    <p>The phrasing <dfn>quads in a dataset</dfn> is thus shorthand
+    for: quads in some quadset which is isomorphic to a given dataset.
+    If the dataset is a <a>non-quad-equivalent dataset</a>, then the
+    isomorphism is to the dataset produced by removing all its empty
+    named graphs.</p>
+
+    <p>In order to promote interoperability and flexibility in
+    implementation techniques &mdash; to allow datasets and quadsets
+    to be used interchangably &mdash; systems which handle datasets
+    SHOULD NOT give significance to empty named graphs.</p>
+
+    <p class="issue">
+      Can we take a stronger stand against non-quad-equivalent
+      datasets?  Maybe we can use the terms "proper" and "improper",
+      or something like that.  Improper datasets might also include
+      ones which use the same name in more than one pair.  Combining
+      these, like removing empty named graphs, is how you convert an
+      improper dataset to a proper one.
+    </p>
+
+  </section>
+
+  <section>
     <h2>Graph Store</h2>
     
     <p>SPARQL 1.1 Update defines a mutable (time-dependent) structure
@@ -246,81 +665,213 @@
 
   </section>
 
-  <section>
-    <h2>Named Graph</h2>
-
-    <p>SPARQL formally defines a <dfn>named graph</dfn>,
-    following <b>[Carroll]</b>, to be any of the (name, graph) pairs in a
-    <a>dataset</a>.</p>
-
-    <p>In practice, the term is often used more loosely to refer to
-    the graph part of those pairs or to the slot part of the pairs in
-    a <a>graph store</a>.  For example, the text of <a
-    href="http://www.w3.org/TR/2012/WD-sparql11-update-20120105/">SPARQL
-    1.1 Update</a> says, "This example copies triples from one named
-    graph to another named graph".</p>
 
-    <div class="note">
-
-    <p>For clarity in this document, we call graph store slots
-    "spaces", not "named graphs", so we might write: "This example
-    copies triples from one of the graph store's spaces to another".
-    (@@ should we call them "named spaces" in this context?)</p>
+  <section>
+    <h2>Merge and Union</h2>
 
-    <p>We only use the term "named graph" to refer to the graph part
-    of a (name, graph) pair in a dataset.  It will always have an
-    associated dataset.  Like the term "second-place finisher", which
-    means little without knowing which competition the second-place
-    finish was in, the term "named graph" means little without knowing
-    which dataset it is in.</p>
+    <p>RDF graphs are usually combined in one of two ways:</p>
 
-    </div>
+    <ul>
+      <li>The <dfn>union</dfn> of two graphs is the set-union of the set of triples in each graph.</li>
+      <li>The <dfn>merge</dfn> of two graphs is the set-union of the set of triples in each graph, after any blank nodes that occur in both graphs are "renamed apart".</li>
+    </ul>
+
+    <p>This difference is not noticable when graphs are being
+    expressed in an orginary RDF syntax, like RDF/XML, RDFa, or
+    Turtle, because they provide no mechanism for transmitted two
+    graphs which have a blank node in common.  The difference can
+    appear, however, in systems and languages which handle datasets or
+    in APIs which allow blank nodes to be shared between graphs.</p>
+
+    <p>We define a <dfn>union dataset</dfn> to be a <a>dataset</a> in
+    which its <a>default graph</a> is the <a>union</a> of all its
+    <a>named graph</a>s.  Some systems provide special, simplified
+    handling of union datasets.</p>
+
+    <p>We define a <dfn>merge dataset</dfn> to be a <a>dataset</a> in
+    which its <a>default graph</a> is the <a>merge</a> of all its
+    <a>named graph</a>s.</p>
+
+    <p>We define the union and merge of quadsets (and thus datasets)
+    as the set merge of their constituent triples and quads; in the
+    case of a merge, it is after any shared blank nodes have been
+    renamed apart.</p>
 
   </section>
 
-  <section>
-    <h2>Quad</h2>
 
-    <p>We define an RDF <dfn>quad</dfn> as the 4-tuple
-    (<i>subject</i>, <i>predicate</i>, <i>object</i>,
-    <i>space</i>).</p>
+  <section>
+    <h2>Untrusting Merge</h2>
 
-    <p>Informally, a quad should be understand as a statement that the
-    RDF triple (<i>subject</i>, <i>predicate</i>, <i>object</i>) is in
-    the <a>space</a> <i>space</i>.</p>
+    <p>The act of <dfn>renaming the graphs</dfn> in a dataset is to
+    create another dataset which differs from the first only in that
+    all the IRIs used as graph names are replace by fresh "Skolem"
+    IRIs.  This replacement occurs in the name slot of the
+    (name,graph) pairs, and in the triples in the default graph, but
+    <em>not</em> in the triples in the named graphs.</p>
+
+    <p>Logically, this operation is equivalent to partially
+    un-labeling an RDF Graph (turning some IRIs into blank nodes),
+    then Skolemizing those blank nodes.  As an operation, it discards
+    some of the information and adds more true information; it is a
+    sound but not complete reasoning step.  It can be made complete by
+    <dfn>recording</dfn> the relationship between the old graph names
+    and the new ones, using some vocabulary such as owl:sameAs.</p>
+
+    <p>For example, a recording graph_rename operation might take as input:</p>
+    <pre>@prefix : &lt;http://example.com/>
+:g1 { :a :b :c }
+:d :e :f</pre>
+    <p>and produce:</p>
+    <pre>@prefix : &lt;http://example.com/>
+:fe2b9765-ba1d-4644-a335-80a8c3786c8d { :a :b :c }
+:d :e :f
+:fe2b9765-ba1d-4644-a335-80a8c3786c8d owl:sameAs :g1
+</pre>
+
+    <p>Given the semantics of datasets, informally described above and
+    formally stated in <a href="#semantics" class="sectionRef"></a>,
+    and the semantics of OWL, where { ?a owl:sameAs ?b } means that
+    the terms ?a and ?b both denote the same thing, the second dataset
+    above entails the first and includes only additional information
+    that is known to be true.  (Slight caveat: the new information is
+    only true if the assumptions of the name-generation function are
+    correct, that the name is previously unused and this naming agent
+    has the right to claim it.)</p>
+
+    <p>A relatated operation, <dfn>sequestering</dfn> the default
+    graph, is to create a new dataset which differs from the first
+    only in that the the triples in the default graph of the input
+    appear instead in a new, freshly-named, <a>named graph</a> of the
+    output.  Sequestering returns both the new dataset and the name
+    generated for the new graph: <code>sequester(D1) -> (D2,
+    generatedIRI)</code>.</p>
+
+    <p>Used together, the operations of <a>renaming the graphs</a>,
+    <a>sequestering</a> the default graphs, and then <a>merging
+    datasets</a>, constitutes an <dfn>untrusting merge</dfn> of
+    datasets.  This operation provides the functionality required for
+    addressing the use case described in <a href="#uc-untrusted"
+    class="sectionRef"></a> and is illustrated in <a
+    href="#example-untrusted" class="sectionRef"></a>.  It uses quads
+    to address some&mdash;perhaps all&mdash;of the need for quints
+    or nested graphs.</p>
+
+    <p>More precisely:</p>
+    
+    <div style="margin-left: 2em;">
+      <pre>function untrusted_merge(D1, ... Dn):
+   for i in 1..n:
+      RDi = rename_graphs(Di)
+      (SRDi, DGNi) = sequester(RDi)
+   return (merge(SRD1, ... SRDn), (DGN1, ... DGNn))</pre>
+    </div>
+
+   <p>Here, <tt>untrusted_merge</tt> returns a single dataset and a list of
+   the names of the graphs (in that dataset) which contain the triples
+   that were in the default graphs, possibly augmented with
+   <a>recording</a> triples.  Whether recording is done or not is
+   hidden inside the rename_graphs function, and is
+   application-dependent.</p>
 
   </section>
 
-  <section>
-    <h2>Quadset</h2>
-
-    <p>We define an RDF <dfn>quadset</dfn> as a set containing (zero or more) RDF Quads and (zero or more) RDF Triples.</p>
-
-    <p>Quadsets and <a>dataset</a>s are isomorphic and semantically
-    equivalent:</p>
-
-    <ul>
-
-      <li>the triples in the quadset correspond to the triples in default
-     graph of the dataset;</li>
-
-     <li>each quad corresponds to a triple in a named graph: the quad (S P
-     O Sp) corresponds to the triple (S P O) in the graph with the name
-     Sp.</li>
-
-    </ul>
-
-    <p>Datasets and quadsets can thus be used interchangeably, with
-    the more appropriate one being use in any particular context.</p>
-
-  </section>
-
+  
 </section>
 
 <section>
-  <h2>Use Cases</h2>
+  <h2>Semantics</h2>
 
-  <p>TBD.  See <a href="#detailed-example" class="sectionRef"></a> for now.</p>
+  <p>This section specifies a declarative semantics for <a>quad</a>s,
+  <a>quadset</a>s, and <a>dataset</a>s, allowing them to be used to
+  express knowledge, especially knowledge about spaces.  This makes
+  the languages defined in <a href="#syntax"
+  class="sectionRef"></a> suitable for conveying knowledge about
+  spaces and providing a foundation for addressing the challenges
+  described in <a href="#use-cases" class="sectionRef"></a>.</p>
+
+  <p>@@@ the section needs some revision by someone with a good ear
+  for formal semantics, and probably some references to the old and/or new versions of RDF Semantics.</p>
+
+  <p>The fundamental notion of RDF spaces is that they can contain
+  triples.  This is formalized with the relation CT(S, T) which is
+  informally understood to hold true for any triple T and space S such
+  that S explicitely contains T.</p>
+
+  <p>The basic declarative meaning (that is, the truth condition) of
+  RDF quads is this:</p>
+
+  <div style="padding: 1em; border: 1px solid blue;">
+
+    <p>The RDF <a>quad</a> (s, p, o, sp) is true in I if and only if CT(I(sp), triple(s, p, o)).</p>
+
+  </div>
+
+  <p>The declarative meaning of a quadset is to simply read the
+  quadset as a conjunction of its quads and its triples.  Given <a
+  href="#qdmap">the structural mapping between quadsets and
+  datasets</a>, the truth condition for datasets follows:</p>
+
+  <div style="padding: 1em; border: 1px solid blue;">
+
+    <p>The RDF <a>dataset</a> (DG, (N1,G1),... (Ni,Gi), ...(Nn,Gn)) is
+    true in I if and only if:</p>
+
+    <ol>
+    <li>DG is true in I, and</li>
+    <li>For every (Ni,Gi) (1&lt;=i&lt;=n):
+    <ul>
+      <li>For every triple T in Gi:
+      <ul>
+	<li>CT(I(Ni),T)</li>
+      </ul>
+      </li>
+    </ul>
+    </li>
+    </ol>
+
+  </div>
+
+  <p>Some implications of these truth conditions: </p>
+
+  <ul>
+
+    <li><p>A dataset with no named graphs has the same declarative
+    meaning as its default graph.  A quadset with no quads has the
+    same declarative meaning as the RDF graph consisting of the
+    triples in the quadset.  </p><p>This fits the intuition that datasets and
+    quadsets are extensions of RDF Graphs and applies to the syntax as
+    well: a Trig document without any named graphs is syntactically
+    and semantically a Turtle document; an N-QUads document without
+    any quads is syntactically and semantically an N-Triples
+    document.</p></li>
+
+    <li>
+    <p>The empty named graphs in a <a>non-quad-equivalent dataset</a>
+    have no effect on its meaning.  Replacing such a dataset with its
+    equivalent without the empty named graphs does not change its
+    meaning.</p>
+    </li>
+
+  </ul>
+
+  <p class="note">
+    We say nothing here about the fact that the truth value of a quad
+    is likely to change over time.  Time is orthogonal to RDF
+    semantics, and quads present no fundamentally different issue
+    here.  When the world changes state, the truth value of RDF
+    triples or quads might change.  This occurs when a triple is put
+    in or taken out of a space, but it also occurs with "normal" RDF
+    when, for instance, someone changes their address and different
+    vcard triples about them become true.  Some approaches to handling
+    change-over-time are discussed in <a href="#example-valid-time"
+    class="sectionRef"></a> and <a href="#example-transaction-time"
+    class="sectionRef"></a>.
+  </p>
+
+  <p>@@@ explain why we use partial-graph semantics, and how in most
+  applications its bad to drop information, but sometimes it's
+  necessary, and sometimes you only have incomplete information.</p>
 
 </section>
 
@@ -329,481 +880,523 @@
   <h2>Dataset Languages</h2>
 
   <p>This section contains specifications of languages for serializing
-  datasets.  N-Quads documents and TriG documents have identical
-  semantics, since they each are just serializations of the datasets
-  and therefore follow <a href="#semantics"
+  <a>quad-equivalent dataset</a>s.  N-Quads documents and Trig
+  documents have identical semantics, since they each serialize the
+  same structure and follow <a href="#semantics"
   class="sectionRef"></a>.</p>
 
+  <p>Dataset information may also be conveyed and manipulated using
+  SPARQL or using RDF triple-based tools and languages as per <a
+  href="#folding" class="sectionRef"></a>.</p>
+
   <section>
     <h3>N-Quads</h3>
 
     <p>The syntax of N-Quads is the same as the syntax of N-Triples,
     except that a fourth term, identifying an RDF space, may
-    optionally included on each line, after the "object" term.</p>
+    optionally be included on each line, after the "object" term.</p>
+
+    <p>Formally, the N-Quads grammar is <a href="http://dvcs.w3.org/hg/rdf/raw-file/default/rdf-turtle/index.html#n-triple-grammar">the N-Triples
+    Grammar</a> modified by removing productions [1] and [2], and
+    adding the following productions:</p>
+
+<div style="margin: 1em; margin-top: 0; padding: 1em; border: 1px solid gray;">
+    
+<table border="0" class="grammar">
+
+<tbody class="prod">
+<tr valign="baseline">
+<td><a id="prod-sandro-nquads-nquadsDoc" name="prod-sandro-nquads-nquadsDoc"></a>[<span class="prodNo">1q</span>]&nbsp;&nbsp;&nbsp;</td>
+<td><code class="production prod">nquadsDoc</code></td>
+<td>&nbsp;&nbsp;&nbsp;::=&nbsp;&nbsp;&nbsp;</td>
+<td><code class="content"><span class="prod"><a class="grammarRef" href="#prod-sandro-nquads-statement">statement</a></span>? (<span class="prod"><a class="grammarRef" href="#prod-sandro-nquads-EOL">EOL</a></span> <span class="prod"><a class="grammarRef" href="#prod-sandro-nquads-statement">statement</a></span>)* <span class="prod"><a class="grammarRef" href="#prod-sandro-nquads-EOL">EOL</a></span>?</code></td>
+</tr>
+</tbody>
+
+<tbody class="prod">
+<tr valign="baseline">
+<td><a id="prod-sandro-nquads-statement" name="prod-sandro-nquads-statement"></a>[<span class="prodNo">2q</span>]&nbsp;&nbsp;&nbsp;</td>
+<td><code class="production prod">statement</code></td>
+<td>&nbsp;&nbsp;&nbsp;::=&nbsp;&nbsp;&nbsp;</td>
+<td><code class="content"><span class="prod"><a class="grammarRef" href="#prod-sandro-nquads-subject">subject</a></span> <span class="prod"><a class="grammarRef" href="#prod-sandro-nquads-predicate">predicate</a></span> <span class="prod"><a class="grammarRef" href="#prod-sandro-nquads-object">object</a></span> <span class="prod"><a class="grammarRef" href="#prod-sandro-nquads-space">space</a></span>? <span class="grammar-literal">"."</span></code></td>
+</tr>
+</tbody>
+
+<tbody class="prod">
+<tr valign="baseline">
+<td><a id="prod-sandro-nquads-space" name="prod-sandro-nquads-space"></a>[<span class="prodNo">3q</span>]&nbsp;&nbsp;&nbsp;</td>
+<td><code class="production prod">space</code></td>
+<td>&nbsp;&nbsp;&nbsp;::=&nbsp;&nbsp;&nbsp;</td>
+<td><code class="content"><span class="prod"><a class="grammarRef" href="#prod-sandro-nquads-IRIREF">IRIREF</a></span></code></td>
+</tr>
+</tbody>
+
+</table>
+
+<p>The grammar symbols 
+<code class="production prod" id="prod-sandro-nquads-EOL">EOL</code>,
+<code class="production prod" id="prod-sandro-nquads-subject">subject</code>
+<code class="production prod" id="prod-sandro-nquads-predicate">predicate</code>
+<code class="production prod" id="prod-sandro-nquads-object">object</code>, and 
+<code class="production prod" id="prod-sandro-nquads-IRIREF">IRIREF</code> are defined in the <a
+href="http://dvcs.w3.org/hg/rdf/raw-file/default/rdf-turtle/index.html#n-triple-grammar">the
+N-Triples Grammar</a></p>
+
+</div>
+
+    <p>The following example shows a <a>quadset</a> consisting of two
+    triples and two <a>quads</a>.  The quads both use the same triple,
+    but express the fact that it is in two spaces, "space1" and
+    "space2".</p>
 
     <pre class="example">&lt;http://example.org/subject> &lt;http://example.org/predicate> &lt;http://example.org/object1>.
 &lt;http://example.org/subject> &lt;http://example.org/predicate> &lt;http://example.org/object2>.
-&lt;http://example.org/subject> &lt;http://example.org/predicate> &lt;http://example.org/object1> &lt;http://example.org/space1> .
+&lt;http://example.org/subject> &lt;http://example.org/predicate> &lt;http://example.org/object1> &lt;http://example.org/space1>.
 &lt;http://example.org/subject> &lt;http://example.org/predicate> &lt;http://example.org/object1> &lt;http://example.org/space2>.</pre>
 
-    <p>This example shows a <a>quadset</a> consisting of two triples
-    and two <a>quads</a>.  The quads both use the same triple, but
-    express the fact that is is in two spaces, "space1" and
-    "space2".</p>
-
-    <p>@@@ grammar, etc, based of Turtle spec</p>
-
   </section>
 
 
   <section>
-    <h3>TriG</h3>
+    <h3>Trig</h3>
 
-    <p>The syntax of TriG is the same as the syntax of Turtle except
-    that (name, graph) pairs can be specified by giving an option
-    GRAPH keyword, a "name" term, and a nested Turtle graph expression
+    <p>The syntax of Trig is the same as the syntax of Turtle except
+    that (name, graph) pairs can be specified by giving an optional
+    <tt>GRAPH</tt> keyword, a "name" term, and a nested Turtle graph expression
     in curly braces.</p>
 
-    <pre class="example">@prefix :eg &lt;http://example.org/>.
-eg:subject eg:predicate eg:object1.
-eg:subject eg:predicate eg:object2.
-eg:space1 { eg:subject eg:predicate eg:object1. }
-eg:space2 { eg:subject eg:predicate eg:object1. }</pre>
-
-    <p>This example shows the same dataset as the N-Quads example.</p>
-
-    <p class="issue">Are braces around default-graph triples required,
-    optional, or disallowed?    Assuming "optional" for now.
-    </p>
 
-    <p class="issue">Is the name prefixed by a keyword?  If so, is the
-    keyword "@graph" or "GRAPH"?   Assuming optional "GRAPH" for now.
-    </p>
+    <p>Formally, the Trig grammar is <a
+    href="http://dvcs.w3.org/hg/rdf/raw-file/default/rdf-turtle/index.html#sec-grammar-grammar">the
+    Turtle Grammar</a> modified by removing productions [1] and [2],
+    and adding the following productions:</p>
 
-    <p class="issue">Are blank node labels scoped to the document, the
+    <div style="margin: 1em; margin-top: 0; padding: 1em; border: 1px solid gray;">
+    <table border="0">
+
+<tbody class="prod">
+<tr valign="baseline">
+<td><a id="prod-trig-trigDoc" name="prod-trig-trigDoc"></a>[<span class="prodNo">1g</span>]&nbsp;&nbsp;&nbsp;</td>
+<td><code class="production prod">trigDoc</code></td>
+<td>&nbsp;&nbsp;&nbsp;::=&nbsp;&nbsp;&nbsp;</td>
+<td><code class="content"><span class="prod"><a class="grammarRef" href="#prod-trig-statement">statement</a></span>*</code></td>
+</tr>
+</tbody>
+
+<tbody class="prod">
+<tr valign="baseline">
+<td><a id="prod-trig-statement" name="prod-trig-statement"></a>[<span class="prodNo">2g</span>]&nbsp;&nbsp;&nbsp;</td>
+<td><code class="production prod">statement</code></td>
+<td>&nbsp;&nbsp;&nbsp;::=&nbsp;&nbsp;&nbsp;</td>
+<td><code class="content"><span class="prod"><a class="grammarRef" href="#prod-trig-directive">directive</a></span> <span class="grammar-literal">"."</span> | <span class="prod"><a class="grammarRef" href="#prod-trig-triples">triples</a></span> <span class="grammar-literal">"."</span> | <span class="prod"><a class="grammarRef" href="#prod-trig-naming">naming</a></span> | <span class="prod"><a class="grammarRef" href="#prod-trig-wrappedDefault">wrappedDefault</a></span></code></td>
+</tr>
+</tbody>
+
+<tbody class="prod">
+<tr valign="baseline">
+<td><a id="prod-trig-naming" name="prod-trig-naming"></a>[<span class="prodNo">3g</span>]&nbsp;&nbsp;&nbsp;</td>
+<td><code class="production prod">naming</code></td>
+<td>&nbsp;&nbsp;&nbsp;::=&nbsp;&nbsp;&nbsp;</td>
+<td><code class="content">
+  <span class="grammar-literal">"GRAPH"</span>? 
+  <span class="prod"><a class="grammarRef" href="#prod-trig-spaceName">spaceName</a></span> 
+<!--  (  -->
+  ( <span class="grammar-literal">"," </span>
+  <span class="prod"><a class="grammarRef" href="#prod-trig-spaceName">spaceName</a></span> 
+  )* <span class="grammar-literal">"{"</span>
+  <span class="prod"><a class="grammarRef" href="#prod-trig-triples">triples</a></span> 
+  <span class="grammar-literal">"."</span>? 
+  <span class="grammar-literal">"}"</span>  <!--) 
+  |
+  ( "{" 
+  <span class="prod"><a class="grammarRef" href="#prod-trig-triples">triples</a></span> 
+  <span class="grammar-literal">"."</span>? "}" 
+  ( <span class="grammar-literal">";"</span> 
+  <span class="prod"><a class="grammarRef" href="#prod-trig-verb">verb</a></span>
+  <span class="prod"><a class="grammarRef" href="#prod-trig-objectList">objectList</a></span>
+  )? ) -->
+</code></td>
+</tr>
+</tbody>
+
+<tbody class="prod">
+<tr valign="baseline">
+<td><a id="prod-trig-spaceName"></a>[<span class="prodNo">4g</span>]&nbsp;&nbsp;&nbsp;</td>
+<td><code class="production prod">spaceName</code></td>
+<td>&nbsp;&nbsp;&nbsp;::=&nbsp;&nbsp;&nbsp;</td>
+<td><code class="content"> 
+    <span class="prod"><a class="grammarRef" href="#prod-trig-iri">iri</a></span>
+    | <span class="grammar-literal">"DEFAULT"</span>
+</code></td>
+</tr>
+</tbody>
+
+<tbody class="prod">
+<tr valign="baseline">
+<td><a id="prod-trig-wrappedDefault" name="prod-trig-wrappedDefault"></a>[<span class="prodNo">5g</span>]&nbsp;&nbsp;&nbsp;</td>
+<td><code class="production prod">wrappedDefault</code></td>
+<td>&nbsp;&nbsp;&nbsp;::=&nbsp;&nbsp;&nbsp;</td>
+<td><code class="content">
+<span class="grammar-literal">"{"</span> <span class="prod"><a class="grammarRef" href="#prod-trig-triples">triples</a></span> <span class="grammar-literal">"."</span>? <span class="grammar-literal">"}"</span></code></td>
+</tr>
+</tbody>
+
+
+    </table>
+
+
+<p>The grammar symbols 
+
+<code class="production prod" id="prod-trig-directive">directive</code>,
+<code class="production prod" id="prod-trig-triples">triples</code>, and
+<code class="production prod" id="prod-trig-iri">iri</code>
+<!--
+<code class="production prod" id="prod-trig-verb">verb</code>, and
+<code class="production prod" id="prod-trig-objectList">objectList</code>
+-->
+are defined in <a
+href="http://dvcs.w3.org/hg/rdf/raw-file/default/rdf-turtle/index.html#sec-grammar-grammar">the
+Turtle Grammar</a>
+</p>
+
+
+    </div>
+
+
+    <p>Parsing a Trig document is like parsing a Turtle document
+    except:</p>
+    <ol>
+
+      <li>The result is a <a>dataset</a>, not an RDF Graph</li>
+
+      <li>The triples generated during parsing of the <code
+      class="prod production">naming</code> production go into each
+      <a>named graph</a> and/or the default graph as given in the
+      <code class="prod production">spaceName</code> productions.</li>
+
+      <li>The triples generated during other parsing go into the
+      default graph.</li>
+
+    </ol>
+      
+    <p>
+    <p>Note that the grammar forbids directives between curly braces
+    and empty curly-brace expressions.  Also, note that blank node
+    processing is not affected by curly braces, so conceptually blank
+    node identifiers are scoped to the entire document.</p>
+
+    <p>There is no requirement that <a>named graph</a> names be unique
+    in a document, or that triples in the default graph be
+    continguous. For example, these two Trig document parse to exactly
+    the same Dataset:</p>
+
+    <pre class="example"># Trig Example 1
+    @prefix : &lt;http://example.org/>.
+    :a :b 1.
+    :s1 { :a :b 10 }
+    :s2 { :a :b 20 }
+    :s1 { :a :b 11 }
+    :s2 { :a :b 21 }
+    :a :b 2.
+</pre>
+
+    <pre class="example"># Trig Example 2
+    @prefix : &lt;http://example.org/>.
+    :a :b 1,2.
+    :s1 { :a :b 10,11. }
+    :s2 { :a :b 20,21. }
+</pre>
+
+    <p>The same dataset could be expressed in N-Quads as:</p>
+
+    <pre style="overflow-x:scroll; width:800px;" class="example"># N-Quads for TriG Example 1 and 2
+&lt;http://example/org/a> &lt;http://example/org/b> "1"^^&lt;http://www.w3.org/2001/XMLSchema#integer>.
+&lt;http://example/org/a> &lt;http://example/org/b> "2"^^&lt;http://www.w3.org/2001/XMLSchema#integer>.
+&lt;http://example/org/a> &lt;http://example/org/b> "10"^^&lt;http://www.w3.org/2001/XMLSchema#integer> &lt;http://example/org/s1>.
+&lt;http://example/org/a> &lt;http://example/org/b> "11"^^&lt;http://www.w3.org/2001/XMLSchema#integer> &lt;http://example/org/s1>.
+&lt;http://example/org/a> &lt;http://example/org/b> "20"^^&lt;http://www.w3.org/2001/XMLSchema#integer> &lt;http://example/org/s2>.
+&lt;http://example/org/a> &lt;http://example/org/b> "21"^^&lt;http://www.w3.org/2001/XMLSchema#integer> &lt;http://example/org/s2>.
+</pre>
+
+    <div class="issue">
+      <p>There are several open issues concernting Trig syntax:</p>
+      <ul>
+	<li>Should we call this something other than Trig, since it's a bit different?   Qurtle?  Mugr (multi-graph-rdf)?   Turtle2?  </li>
+	<li>Are braces around default-graph triples required,
+    optional, or disallowed?    Assuming "optional" for now.</li>
+        <li>Is the name prefixed by a keyword?  If so, is the
+    keyword "@graph" or "GRAPH"?   Assuming optional "GRAPH" for now.</li>
+        <li>     Are blank node labels scoped to the document, the
     curly-brace expression, or the graph name?  Assuming
-    document-scope for now.   This is <a href="http://www.w3.org/2011/rdf-wg/track/issues/21">Issue-21</a>.
-    </p>
+    document-scope for now.   This is <a href="http://www.w3.org/2011/rdf-wg/track/issues/21">Issue-21</a>.</li>
+    <li>Can blank node labels be used as space names?
+    Assuming not, for now.</li>
+    <li>Can we provide a way to say a graph is in multiple spaces without repeating it?  Something like [GRAPH] g1, g2, DEFAULT { ... } (where default is a keyword stand-in for the default graph; assuming yes.</li>
+    <li>Can we allow allow people to re-use subject, like:  g1 { ... }; :lastModified .... ?  assuming no; it interacts a bit confusingly with repeated spaceName, and it's not clear what it means for spaceName DEFAULT.</li>
+      </ul>
+    </div>
 
-    <p class="issue">Can blank node labels be used as space names?
-    Assuming not, for now.</p>
-
-    <p>@@@ grammar, etc, based of Turtle spec</p>
 
   </section>
 </section>
 
-<section>
-  <h2>Semantics</h2>
-
-  <p>@@@ formalize what's been said above.</p>
-
-  <p class="note">
-    We say nothing here about the fact that the truth value of a quad
-    is likely to change over time.  Time is orthogonal to RDF
-    semantics, and quads present no fundamentally different challenge
-    here than vcard, since people change addresses just like triples
-    are added to and removed from spaces.  Some approaches to handling
-    change-over-time are discussed in @@@example?  @@@temporal-rdf
-    note?
-  </p>
-
-  <p>We now give <a>dataset</a>s declarative semantics, allowing
-  dataset to be used as logical statements (like RDF Graphs).  We
-  define a dataset as being true if and only if (1) its default graph
-  is true, and (2) for every (<i>name</i>, <i>graph</i>) pair in the
-  dataset, the space denoted by <i>name</i> contains every triple in
-  <i>graph</i>.</p>
-
-  <p class="issue">Do the named graphs in a dataset include all the
-  triples in the spaces with those names, or only some of them?  Aka
-  partial-graph or complete-graph semantics.</p>
-
-</section>
-
 <section>   <!-- I don't like what respec does with id=conformance -->
   <h2>Conformance</h2>
 
-  <p>Something like: If a space has a URL, and you get a 200 response
-  dereferencing that URL, the the response MUST be a serialization of
-  the triples on that space, give or take synchronization (caching)
-  issues. </p>
-
-  <p>What else?</p>
+  <p>@@@ what to say here?  What kind of think might conform or not
+  conform to this spec?</p>
 
 </section>
 
-<section class="informative">
+<section class="informative appendix">
+
   <h2>Detailed Example</h2>
 
-  <p>This section presents a design for using spaces in constructing a
+  <p>This section presents a design for using <a>space</a>s in constructing a
   federated information system.  It is intended to help explain and
-  motivate RDF <a>data space</a>s.</p>
-
-  <section>
-    <h3>A Federated Phonebook</h3>
-
-    <p>As a first example of how to use spaces, consider an
-    organization which has 25 different divisions around the world,
-    each with its own system for managing the list of its employees
-    and their phone numbers.  The parent organization wants to create
-    a unified "HQ" directory with all this information.  With their HQ
-    directory, they will be able to look up an employee's phone number
-    without first knowing the employee's division. </p>
-
-    <p>They decide to use RDF spaces.  Each division is asked to
-    publish its phonebook on an internal website, in a W3C-Recommended
-    RDF syntax, using <a href="http://www.w3.org/TR/vcard-rdf/">the
-    vcard-rdf vocabulary</a>.  Each division submits the URL at which
-    this file will appear.  For example, the uswest division might
-    publish the RDF version of its phonebook at
-    <tt>http://uswest.internal.example.com/employees.rdf</tt> and the
-    Japan division might publish theirs at
-    <tt>http://ja.example.com/hr/data/export371</tt>.  The URL itself
-    doesn't matter, but the division must be able to maintain the
-    content served there and HQ must be able to easily fetch the
-    content. </p>
-
-    <p>The HQ staff assembles this list of 25 feed URLs and puts them
-    into the default graph of a SPARQL database, so the database looks
-    like this: </p>
-
-<pre>   @prefix hq: &lt;<a href="http://example.com/hq-vocab#">http://example.com/hq-vocab#</a>&gt;.
-   # default graph
-   {
-      hq:parentCo hq:division hq:div1, hq:div2, hq:div3, ...
-      &lt;<a href="http://uswest.internal.example.com/employees.rdf">http://uswest.internal.example.com/employees.rdf</a>&gt; 
-         hq:feedFrom hq:div1.
-      &lt;<a href="http://ja.example.com/hr/data/export371">http://ja.example.com/hr/data/export371</a>&gt;
-         hq:feedFrom hq:div2.
-      ...
-   }
-</pre>
-<p>Then they write a simple Web client which looks in the database for
-those feed URLs, dereferences them, and parses the RDF.  It then puts
-the parse-result into the database in a space whose name is the same as the
-name of the feed.  This makes sense, because in this deployment each
-feed is considered to be a space; the name of the feed is the same as
-the name of the space.  The HQ client is copying data about the space
-from the division databases to the HQ database, but it's still the
-same information about the same spaces.
-</p>
-
-<p>For performance reasons, the client is designed to use HTTP
-caching information.  This will allow it to efficiently re-fetch the
-information only when it has changed.  To make this work, the client will need
-to store the value of the "Last-Modified" HTTP header and also store
-(or compute, in some configurations) the value of the "Expires" header.
-</p>
+  help motivate the designs specified in this document.</p>
 
-<p>In the end, the database looks something like this:
-</p>
-<pre> @prefix hq: &lt;<a href="http://example.com/hq-vocab#">http://example.com/hq-vocab#</a>&gt;.
- @prefix v:  &lt;<a href="http://www.w3.org/2006/vcard/ns#">http://www.w3.org/2006/vcard/ns#</a>&gt;.
- @prefix ht: &lt;<a href="http://example.org/http-vocab#">http://example.org/http-vocab#</a>&gt;.
- &lt;<a href="http://uswest.internal.example.com/employees.rdf">http://uswest.internal.example.com/employees.rdf</a>&gt; {
-    # an employee
-    [ a v:VCard
-      v:fn "John Wayne"&nbsp;;
-      v:email "[email protected]" .
-      v:tel [ a v:Work, v:Pref&nbsp;;
-              rdf:value "+213 555 5555" ]
-    ]
-    # another employee
-    ...
- }
- &lt;<a href="http://ja.example.com/hr/data/export371">http://ja.example.com/hr/data/export371</a>&gt; {
-    # an employee
-    [ a v:VCard
-      v:fn "Toshiro Mifune"&nbsp;;
-      v:email "[email protected]" .
-      v:tel [ a v:Work, v:Pref&nbsp;;
-              rdf:value "+81 75 555 5555" ]
-    ]
-    # another employee
-    ...
- }
- ...    other divisions
- # default graph, with all our metadata
- {
-   hq:parentCo hq:division hq:div1, hq:div2, hq:div3, ...
-   # stuff we need to know the efficiently keep our copy in sync
-   &lt;<a href="http://uswest.internal.example.com/employees.rdf">http://uswest.internal.example.com/employees.rdf</a>&gt; 
-     hq:feedFrom hq:div1;
-     ht:last-modified "2012-03-14T02:22:10"^^xs:datetime;
-     ht:expires "2012-04-29T00:15:00"^^xs:datetime.
-   &lt;http://ja.example.com/hr/data/export371&gt; 
-     hq:feedFrom hq:div2;
-     ht:last-modified "2012-04-01T22:00:00"^^xs:datetime;
-     ht:expires "2012-04-29T00:35:00"^^xs:datetime.
- }
-</pre>
-<p>The URL of each space appears in four different roles in this example:
-</p>
+  <p>The example covers the same federated phonebook scenario used in
+  <a href="#use-cases" class="sectionRef"></a>, with each specific use
+  case having an example here.</p>
 
-<p>1.  It is used as a label for a graph.  Here, it says which space the
-triples in that graph are in.  That is, the triples about employee
-"John Wayne" are in the space named
-"http://uswest.internal.example.com/employees.rdf".  Information about
-what triples are in that space originates in the master database for
-each division, then is copied to the slave database at HQ.
-</p>
-
-<p>2.  It is used as the subject of an hq:feedFrom triple.  This
-information is manually maintained (or maintained through a corporate
-WebApp) and used to help guide the HQ fetching client.  Because in
-this deployment we are equating spaces and feeds, the name of the
-space is also the URL of the feed.
-</p>
+  <div class="alert">
+    <p>@@@ An obsolete but complete version was in the <a
+  href="http://dvcs.w3.org/hg/rdf/raw-file/ee60c6dc8ad4/rdf-spaces/index.html#">May 10 Version</a>.
+  </p>
+  </div>
 
-<p>3.  It is used as the subject of an ht:last-modified triple.  The
-information in this triples comes from the HTTP Last-Modified header.
-The meaning of this header in HTTP lines up well with its intuitive
-meaning here: this is the most recent time the set of triples in this
-space changed.  (This header can be used during a refresh, with the
-If-Modified-Since headers, to make a client refresh operation very
-simple and fast if the data has not changed.)
-</p>
 
-<p>4.  It is used as the subject of an ht:expires triple.  This
-information also comes from HTTP headers, although some computation
-may be needed to turn it into the absolute datetime form used here.
-Strictly speaking, what is expiring at that time is this copy of the
-information about the space, not the space itself.  This slight
-conflation seems like a useful and unproblematic simplification.
-</p>
+  <section id="example-start">
+    <h2>Showing Triples (v1)</h2>
 
-<p>Given this design, it is straightforward to write SPARQL queries to
-find the phone number of an employee, no matter what their division.
-It is also easy to find out which space is about to
-expire or has expired and should be refreshed soon.  
-</p>
-
-<p>Some alternative designs:
-</p>
-<ul><li> Divisions could push their data, instead of waiting to be polled.  That is, the divisions could be given write access to the HQ database and do SPARQL UPDATE operations to their own spaces.  This is simpler in some ways but may require more expertise from people in each division.  It also requires trusting people in each division or having a SPARQL server that can be configure to grant certain users write access to only certain spaces.   This also turns HQ into more of a bottleneck and single-point of failure.  With the polling approach, other systems could be given the list of feed URLs and then offer an alternative combined directory, or use the same data for other purposes, without any involvement from the divisions.
-</li></ul>
-<ul><li> The HQ client could fetch or query all the divisions at query time, rather that gathering the data in advance.  This might use the <a href="http://www.w3.org/TR/sparql11-federated-query/">SPARQL 1.1 Federated Query</a> features.  Which approach is superior will depend on the particulars of the situation, including how large the data is, how often it changes, and the frequency of queries which need data from different divisions.  Federated Query would probably not be ideal for the situation described here, but should be considered by people building systems like this.
-</li></ul>
+    <p>@@@ Shows the baseline in <a href="#uc-start" class="sectionRef"></a></p>
 
   </section>
-  <section>
-    <h3>Cache Management Using HTTP</h3>
 
-    <p class="note">Factor out the Last-Modified and Expires stuff,
-    from the previous section, and put it here.</p>
 
-    <p class="note">Show that instead of expires like this, it could
-    be done with [an Expiration; inDataset &lt;>; atTime ...;
-    ofSpace]</p>
+  <section id="example-web">
+    <h2>Showing Web Provenance (v2)</h2>
+
+    <p>@@@ Shows how to address<a href="#uc-web" class="sectionRef"></a></p>
+
+  </section>
+
+
+
+  <section id="example-process">
+    <h2>Showing Process Provenance(v3)</h2>
+
+    <p>@@@ Shows how to address <a href="#uc-process" class="sectionRef"></a></p>
+
+  </section>
+
+
+
+  <section id="example-reported">
+    <h2>Showing Reported Provenance (v4)</h2>
+
+    <p>@@@ Shows how to address <a href="#uc-reported" class="sectionRef"></a></p>
+
+  </section>
+
+
+
+  <section id="example-untrusted">
+    <h2>Showing Untrusted Quads(v5)</h2>
+
+    <p>@@@ Show how to address <a href="#uc-untrusted" class="sectionRef"></a></p>
+    <p>@@@ uses <a>renaming the graphs</a>.</p>
 
 
   </section>
 
 
-  <section>
-    <h3>Keeping Derived Information Separate</h3>
-
-    <p>The Federated Phonebook example shows several features of
-    spaces, but leaves out a few.  In this example we will show the
-    use of privately-named spaces and of sharing blank nodes between
-    spaces.</p>
-
-    <p>The scenario is this: some divisions use only vcard:n to
-    provide structured name information (keeping given-name and
-    family-name separate), while others use only vcard:fn to provide a
-    formatted-name (with both parts combined).  The politics of the
-    organization make it impractical to tell the divisions to all use
-    vcard:n or all use vcard:fn, or both.  Meanwhile, several
-    different tools are being written to use this employee directory,
-    including a WebApp, a command-line app, and apps for several
-    different mobile platforms.  Does each app have to be written to
-    understand both vcard:n and vcard:fn? </p>
-
-    <p>HQ decides the solution is for them to run a single process
-    (which they call "namefill") to normalize the data, making
-    sure that every entry has both vcard:n and vcard:fn data, no
-    matter what the division provided.  The process is fairly simple;
-    after any space is reloaded, a program runs which looks at that
-    space and fills in the missing name data. </p>
 
-    <p>Because of the tricky politics of the situation, however, HQ
-    decides it would be best to keep this "filled in" data separate.
-    In some cases their program might not fill in the data properly.
-    For example, how can a program tell from the formatted name
-    "Hillary Rodham Clinton" that "Rodham Clinton" is the family-name?
-    The solution is to keep the output of the program in a separate
-    space, so clients (and people trying to debug the system) can tell
-    this filled-in data did not come from the division itself. </p>
+  <section id="example-transtime">
+    <h2>Showing Change History (v6)</h2>
 
-    <p>The result is a dataset like this:
-    </p>
+    <p>To keep versions, as required by <a href="#uc-transtime"
+    class="sectionRef"></a>, we simply copy the old data into a new
+    named graph and record some metadata about it.</p>
 
-    <pre class="example">@prefix hq: &lt;http://example.com/hq-vocab#>.
+    <p>In this example, we handle this by defining the following vocabulary:</p>
+
+    <div class="exvoc">
+
+      @@@ tdb   can we define each property separately with any sense, or just the block, together?
+
+    </div>
+      
+    <p>If Marvin changes, rather absurdly, changes his email address
+    every day, to include the date, we might have a dataset like
+    this:</p>
+
+    <pre class="example">@prefix transt: &lt;http://example.org/ns/transaction-time>.
[email protected] hq: &lt;http://example.org/ns/phonebook>.
 @prefix v:  &lt;http://www.w3.org/2006/vcard/ns#>.
[email protected] ht: &lt;http://example.org/http-vocab#>.
- &lt;http://uswest.internal.example.com/employees.rdf> {
-    # an employee
-    _:u331 a v:VCard
-           v:fn "John Wayne"&nbsp;;
-           v:email "[email protected]" .
-           v:tel [ a v:Work, v:Pref&nbsp;;
-                   rdf:value "+213 555 5555" ].
-    ...
- }
- hq:namefill602 {
-    _:u331 v:n [
-           v:family-name "Wayne";
-           v:given-name "John"
-    ]
- }
- ...
- # default graph has metadata
- {
-   hq:parentCo hq:division hq:div1, hq:div2, hq:div3, ...
-   &lt;http://uswest.internal.example.com/employees.rdf>; 
-     hq:feedFrom hq:div1;
-     hq:namefillSpace hq:namefill602
-  ...
- } 
[email protected] : &lt;>.
+
+:g32201 {  
+   #... various data, then:
+   [] a v:VCard
+      v:fn "Marvin Mover" ;
+      v:email "[email protected]". 
+   #... more data from other people
+}
+[] a transt:Snapshot;
+   transt:source &lt;http://div14.example.org/phonefeed>;
+   transt:result :g32201;
+   transt:starts "2012-01-01T00:00:00"^^xs:dateTime;
+   transt:ends "2012-01-02T00:00:00"^^xs:dateTime.
+
+:g32202 {  
+   #... various data, then:
+   [] a v:VCard
+      v:fn "Marvin Mover" ;
+      v:email "[email protected]". 
+   #... more data from other people
+}
+[] a transt:Snapshot;
+   transt:source &lt;http://div14.example.org/phonefeed>;
+   transt:result :g32202;
+   transt:starts "2012-01-02T00:00:00"^^xs:dateTime;
+   transt:ends "2012-01-03T00:00:00"^^xs:dateTime.
+
+# the current data
+&lt;http://div14.example.org/phonefeed> {
+   #... various data, then:
+   [] a v:VCard
+      v:fn "Marvin Mover" ;
+      v:email "[email protected]". 
+   #... more data from other people
+}
+
 </pre>
 
-<p>In serializing this, we needed to introduce a blank node label
-("_:u331"), because that blank node (representing the employee) occurs
-in two different spaces.
-</p>
-
-<p>The example also shows the creation of a new space name
-(hq:namefill602) for the space filled in by our namefill program.  We
-use one new space for each feed, instead of one space for all the
-output of the namefill program, so we have less work to do when a
-single feed space is reloaded.
-</p>
-
-<p>The techniques in this example apply equally well to information that
-is derived as part of logical inference, such as done by an RDFS, OWL,
-or RIF reasoner.  In these more general cases, it may be that one
-space can be used for all derived information, or, at the other end of
-the granularity spectrum, that a new space is used for the triples
-derived in each step of the process.
-</p>
+<p>@@@ or should we put the data directly into a genid graph, so that
+metadata about it is less likely to change or be wrong...?  On the other hand, there's ALSO some nice potential for metadata about the feed space.</p>
 
   </section>
-  <section>
-    <h3>Archiving Data With Static Spaces</h3>
-
-    <p>One more variation on the federated phonebook scenario: what if
-    HQ wants to be able to look up old information?  For instance,
-    what happens when an employee leaves and is no longer listed in a
-    division phonebook?  It could be nice if the search client could
-    report that the employee is gone, rather than leaving people
-    wondering it they've made a mistake with the name. </p>
-
-    <p>To address this, HQ's data-loading client will not simply
-    delete a space before reloading it.  Instead, it will first copy
-    the data to a new, archival space.  After three reloads, the
-    database might look something like this: </p>
 
-<pre class="example">@prefix hq: &lt;http://example.com/hq-vocab#&gt;.
[email protected] hqa: &lt;http://example.com/hq/archive/&gt;
[email protected] v:  &lt;http://www.w3.org/2006/vcard/ns#&gt;.
[email protected] ht: &lt;http://example.org/http-vocab#&gt;.
-hqa:0001 {
-    ... oldest version
-}
-hqa:0002 {
-   ... middle version
+
+
+  <section id="example-validtime">
+    <h2>Showing Past and Future States (v7)</h2>
+
+
+    <p>The challenge expressed in <a href="#uc-validtime"
+    class="sectionRef"></a> is to segregate some of the triples,
+    marking them as being in-effect only at certain times.  The study
+    of how to do this is part of the field of temporal databases.</p>
+
+    <p>In this example, we handle this by defining the following vocabulary:</p>
+
+    <div class="exvoc">
+      
+      <p>This "valid-time" vocabulary allows a data publisher to
+      express a time range during which the triples in some space are
+      considered valid.  This acts like a time-dependent version of
+      owl:import, where the import is only made during the given time
+      range.</p>
+
+      <dl>
+	<dt><span class="schema">(rdf:space Sp)</span> vt:starts <span class="schema">(xs:dateTime T1)</span></dt>
+	<dd>Claims that all the triples in Sp are valid starting at T1, ending at some unspecified period of time.</dd>
+	<dt><span class="schema">(rdf:space Sp)</span> vt:end <span class="schema">(xs:dateTime T2)</span></dt>
+	<dd>Claims that all the triples in Sp are valid until just before T2, starting at some unspecified time.</dd>
+      </dl>
+
+      <p>In general, these two predicates need to be used together,
+      providing both vt:starts and vt:ends values for a space.  In
+      this case, { ?sp vt:starts ?t1; vt:ends ?t2 } claims that all
+      the triples in ?sp are in effect for all points in time t such
+      that t1 &lt;= t &lt; t2.  A consumer who only knows one of the
+      two times is unable to make use of data; there are no
+      default values.</p>
+
+      <p>These predicates say nothing about the validity (or "truth") of
+      the triples in Sp outside of the valid-time range.  Each of the
+      triples might or might not hold outside of the range &mdash;
+      these vt triples simply make no claim about them.</p>
+
+    </div>
+
+    <p>Given this definition, it is almost trivial for Division 5 to share their "before" and "after phonebooks:</p>
+
+    <pre class="example">@prefix vt: &lt;http://example.org/ns/valid-time>.
[email protected] hq: &lt;http://example.org/ns/phonebook>.
[email protected] : &lt;>.
+
+:pre-move {  
+    # all the pre-move data  
+    ...
 }
-&lt;http://uswest.internal.example.com/employees.rdf&gt; {
-    ... current version
+:post-move {
+    # all the post-move data  
+    ...
 }
-# default graph
-{
-   hqa:0001 hq:startValidTime ...time... &nbsp;;
-            hq:endValidTime  ...time... .
-   hqa:0002 hq:startValidTime ...time... &nbsp;;
-            hq:endValidTime  ...time... .
-   &lt;http://uswest.internal.example.com/employees.rdf&gt; 
-       hq:snapshot hqa:0001, hqa:0002.
-   ....
-}
+
+:pre-move  vt:starts "2010-01-01T00:00:00"^^xs:dateTime;
+           vt:ends   "2012-07-12T00:00:00"^^xs:dateTime.
+:post-move vt:starts "2012-07-12T00:00:00"^^xs:dateTime;
+           vt:ends   "2020-01-01T00:00:00"^^xs:dateTime.
+
 </pre>
 
-<p>This model uses static spaces, whose contents are never supposed to
-change.  (They are still different from RDF Graphs in that they retain
-their own identity; two static spaces containing the same triples can
-have different metadata.)  For each static space, we record the time
-interval for which it was current (its
-<a href="http://en.wikipedia.org/wiki/Valid_time">valid time</a>) and what it is a
-snapshot of.
-</p>
+     <p>This design requires every client to be modified to understand
+     and use the valid-time vocabulary.  There may be designs that do
+     not require this.</p>
 
-<p>The URL for each static space is generated by incrementing a sequence
-counter.  To follow Linked Data principles, HQ should provide RDF
-serializations of the contents of each space in response to
-dereferences of these URLs.  (When the state of spaces is
-obtained like this, with separate HTTP responses for each one, a blank
-node appearing on multiple spaces will appear as multiple blank nodes.
-For blank node sharing to work, the dataset which serializes the
-contents of all the relevant spaces must be transmitted or queried as
-a unit.)
-</p>
 
-<p>There is nothing about this architecture that prevents the archival
-data from being modified. The people maintaining the system simply agree
-not to change it.  If this is not sufficient, other approaches could
-be designed, such as generating the URL using a cryptographic hash of
-the space contents.
-</p>
+  </section>
 
-<p>Another variant on this design is to put the feed data directly into
-an archival space, instead of having the current data in a the same
-space as the feed..  If the data is likely to grow stale (not be kept
-in sync with the feed master data), this may be a better approach,
-reducing the possibility of people unknowingly using outdated
-information.
-</p>
 
-</section>
+
+
 </section>
 
 
-
-  <section class="appendix">
-    <h2>Reflection Vocabulary</h2>
-
-    <p class="note">This section is entirely novel/experimental at
-    this time.</p>
+  <section class="appendix" id="folding">
+    <h2>Folding</h2>
 
-    <p>This section specifies an RDF vocabulary for conveying datasets
-    in RDF Graphs.  This is done by describing&mdash;in RDF
-    triples&mdash;the specific structures occuring in a given dataset.
-    This technique is sometimes called <dfn>reflection</dfn> or
-    <dfn>reification</dfn>.  This vocabulary is distinct from the
-    1999/2004 RDF reification vocabulary; we prefer to use the term
-    "reflection" to help maintain the separation.</p>
+    <p class="note">This section is experimental.</p>
 
-    <p>This vocabulary allows systems to convey datasets using normal
-    triple-based RDF machinery, including RDF/XML, Turtle, and RDFa,
-    when necessary.  In general, in systems where languages and APIs
-    are available which directly support datasets, this vocabulary is
-    not useful.</p>
+    <p>This section specifies a mechanism and an RDF vocabulary for
+    conveying <a>quad</a>s/<a>dataset</a>s using ordinary RDF Graphs
+    instead of special syntaxes and/or interfaces.  The mechanism is
+    somewhat similar to reflection or reification.  The idea is to
+    express each quad using a set of triples using a specialized
+    vocabulary.</p>
 
-    <p>As an example, the quad [ eg:subject eg:predicate eg:object1
-    eg:space1 ] can be expressed in Turtle using this vocabulary:</p>
+    <p>Folding allows quads and thus datasets to be conveyed and
+    manipulated using normal triple-based RDF machinery, including
+    RDF/XML, Turtle, and RDFa, but at the cost of some complexity,
+    storage space, and performance.  In general, in systems where
+    languages or APIs are available which directly support datasets,
+    folding is neither required nor useful.</p>
+
+    <p>As an example, the dataset 
+
+    <pre class="example">
[email protected] : &lt;http://example.org/>.
+:space { eg:subject eg:predicate eg:object }
+    </pre>
+
+    would fold to these triples:
 
     <pre class="example">@prefix : &lt;http://example.org/>.
-[] a rdf:Triple;
+:space rdf:containsTriple [   
+   a rdf:Triple;
    rdf:subjectIRI "http://example.org/subject";
    rdf:predicateIRI "http://example.org/predicate";
-   rdf:objectIRI "http://example.org/object1";
-   rdf:inSpace :space1.</pre>
+   rdf:objectIRI "http://example.org/object";</pre>
 
    <p>The terms in the triple are encoded (turned into literal
    strings, in this example), to provide referential opacity.  In the
-   semantics of quads, it does not follow from [a b c d] and a=aa that
-   [aa b c d].  Without this term-encoding, that conclusion <em>would</em>
-   follow from the reflection.</p>
+   semantics of quads, it does not follow from (a b c d) and a=aa that
+   (aa b c d).  Without this encoding of terms as strings, that
+   conclusion would erroneously follow from the folded quad..</p>
 
    <p>Terms in this vocabulary:</p>
 
@@ -849,56 +1442,63 @@
      object term, when the object term is literal.  The value is the
      value which serves as the object-term part of the triple.</dd>
 
-     <dt>rdf:inSpace</dt>
-     <dd>A predicate expressing the relationship between an a triple
-     and an RDF space which contains it.</dd>
+     <dt>rdf:containsTriple</dt>
+     <dd>A predicate expressing the relationship between an RDF
+     <a>space</a> and a triple which it contains.</dd>
 
    </dl>
 
    <p>This vocabulary is used in a specific template form, always
    matching this SPARQL graph pattern: </p>   
 
-   <pre>[] a rdf:Triple;
+   <pre>?sp rdf:containsTriple [ 
+   a rdf:Triple;
    rdf:subjectIRI|rdf:subjectNode ?s;
    rdf:predicateIRI ?p;
-   rdf:objectIRI|rdf:objectNode|rdf:objectValue ?o;
-   rdf:inSpace ?sp</pre>
+   rdf:objectIRI|rdf:objectNode|rdf:objectValue ?o 
+]</pre>
 
    <p>This one template uses SPARQL 1.1 property paths, with
    alternation using the "|" character.  It could also be expressed as
-   six different SPARQL 1.0 graph patterns.</p>
+   six different SPARQL 1.0 (non-property-path) graph patterns.</p>
 
    <p>The terms in this vocabulary only have fully-defined meaning
    when they occur in the template pattern.  When they do, the set of
    triples matching the template has the same meaning as the
    <a>quad</a> [ ?s ?p ?o ?sp ].</p>
 
-   <p><dfn>Reflecting a dataset</dfn> is the act of completely
+   <p><dfn>Folding a dataset</dfn> is the act of completely
    conveying the facts in a dataset in RDF triples, using this
-   reflection vocabulary.  The procedure is: (1) check for occurances
-   of the reflection template in the default graph -- if they occur,
-   abort, since reflection is not defined for this dataset; (2) copy
+   vocabulary.  The procedure is: (1) check for occurances
+   of the fold template in the default graph -- if they occur,
+   abort, since folding is not defined for this dataset; (2) copy
    the triples in the default graph of the input to the output; (3)
    for each quad in the input, generate a matching instance of the
-   reflection template and put the resulting five triples in the
+   fold template and put the resulting five triples in the
    output.</p>
 
-   <p><dfn>Unreflecting a dataset</dfn> is the act of turning an RDF
-   graph into a dataset, using this reflection vocabulary.  The
+   <p><dfn>Unfolding a dataset</dfn> is the act of turning an RDF
+   graph into a dataset, using this vocabulary.  The
    procedure is: (1) make a mutable copy of the input graph, (2) for
-   each match of the reflection template, add the resulting quad to the
+   each match of the fold template, add the resulting quad to the
    output dataset and delete the five triples which matched the
    template, (3) copy the remaining triples to the output as the
    default graph of the dataset.</p>
 
-   <p>The reflect and unreflect functions are inverses of each other.
-   That is, for all datasets D on which reflect is defined, D =
-   unreflect(reflect(D)) and for all graphs G, G =
-   (reflect(unreflect(G)).  The functions are also essentially
-   idempotent.  If we align their domains and ranges by considering a
-   graph to be dataset which has only its default graph, then
-   reflect(D) = reflect(reflect(D)) and unreflect(G) =
-   unreflect(unreflect(G))</p>
+   <p>The fold and unfold functions are inverses of each other.
+   That is, for all datasets D on which fold is defined, D =
+   unfold(fold(D)) and for all graphs G, G =
+   (fold(unfold(G)).</p>
+
+   <p>The functions cannot be composed with themselves (called
+   recursively), since for each of them the domain and range are
+   disjoint.  If we were to implicitely convert graphs to datasets
+   (with the graph as the default graph), then fold(fold(D)) would
+   either be an error (if D had any named graphs) or be the same as
+   fold(D).  If we were to define unfold2 as an unfold operating on
+   datasets using their default graphs, unfold2(D) = union(D,
+   unfold(default_graph(D)), then unfold2 would be idempotent:
+   unfold2(D) = unfold2(unfold2(D)).</p>
 
 </section>
 
@@ -909,11 +1509,17 @@
 
 
 <section id="references">
+<p>@@@ tbd</p>
 </section>
 
 <section class="appendix informative" id="changes">
   <h2>Changes</h2>
   <ul>
+    <li>2012-05-15: Added section on "Untrusting Merge".</li>
+    <li>2012-05-14: Fill in the use cases, removing some of the text that was there and which can go into the example.  Redid the trig grammar, adding spaceName, changing formatting.  Added valid-time example.  Added some of transaction-time example.</li>
+    <li>2012-05-13: Fill in the example's skeleton, add a few issues/ideas on trig</li>
+    <li>2012-05-11: Rewriting and reorganizing Concepts; some more work on Usecases and Example; removed the Detailed Example since it needs to be so re-written; renamed 'reflection' to 'folding'; reworked the Semanics</li>
+    <li>2012-05-10: Wrote a short intro.  Started writing the Use Cases section for real.   Added grammar for N-Quads and Trig.  Did a first draft of the semantics.</li>
     <li>2012-05-09: Renamed "layers" as "spaces"; some word-smithing in Concepts and the Abstract; removed "Turtle in HTML" as a dataset syntax; added some text about trig and nquads; added a note about change-over-time; added an appendix with a reflection vocabulary</li>
     <li>2012-05-02: Removed obsolete text from the introduction, removed the section on datasets borrowed from RDF Concepts, and added many entries to Concepts (and renamed it from Terminology).</li>
     <li>2012-05-01: Starting with a little text from RDF Concepts, a few ideas, and the text from <a href="http://www.w3.org/2011/rdf-wg/wiki/Layers">Layers</a></li>
@@ -922,6 +1528,6 @@
 
 
 
-  </body>
+</body>
 </html>
 
--- a/rdf-turtle/index.html	Wed May 09 19:37:57 2012 -0700
+++ b/rdf-turtle/index.html	Tue May 15 11:33:17 2012 -0700
@@ -466,7 +466,7 @@
 				    Both of these may appear in the <a href="#grammar-production-subject">subject</a> or <a href="#grammar-production-object">object</a> position of a triple (see the Turtle Grammar).
 				    That subject or object is a fresh RDF blank node.
 				    This blank node also serves as the subject of the triples produced by matching the <a href="#grammar-production-predicateObjectList">predicateObjectList</a> production embedded in a blankNodePropertyList.
-				    The generation of these triples is described below in <a href="#groups">Predicate Object Lists in Turtle</a>.
+				    The generation of these triples is described in <a href="#predicate-lists">Predicate  Lists</a>.
 				    Blank nodes are also allocated for <a href="#collections">Collections in Turtle</a> (below).
 				  </p>
 				  <pre class="example"><script type="text/turtle">@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@@ -1083,6 +1083,10 @@
 
         <section>
         	<h3>Summary of diffrences in N-Triples and Turtle</h3>
+        	<section>
+        		<h4>Triples</h4>
+        		<p>N-Triples only allows for <a href="#simple-triples">simple triple</a> statements which MUST NOT contain new lines. A single triple is always a single line of the document.</p>
+        	</section>
 		<section id="iri-summary">
 		  <h3>IRI Representations</h3>
 
--- a/rdf-turtle/n-prime-bnf.html	Wed May 09 19:37:57 2012 -0700
+++ b/rdf-turtle/n-prime-bnf.html	Tue May 15 11:33:17 2012 -0700
@@ -1,98 +1,104 @@
-<table class="grammar">
+<table id="n-triples" class="grammar">
     <tbody class="grammar-productions">
-            <tr id="grammar-production-ntriplesDoc" data-grammar-original="[1]  ntriplesDoc        ::= triple? (EOL triple)* EOL?" data-grammar-expression="(&#x27;,&#x27;, [(&#x27;?&#x27;, (&#x27;id&#x27;, &#x27;triple&#x27;)), (&#x27;*&#x27;, (&#x27;,&#x27;, [(&#x27;id&#x27;, &#x27;EOL&#x27;), (&#x27;id&#x27;, &#x27;triple&#x27;)])), (&#x27;?&#x27;, (&#x27;id&#x27;, &#x27;EOL&#x27;))])" >
+            <tr id="n-triples-grammar-production-ntriplesDoc" data-grammar-original="[1]  ntriplesDoc        ::= triple? (EOL triple)* EOL?" data-grammar-expression="(&#x27;,&#x27;, [(&#x27;?&#x27;, (&#x27;id&#x27;, &#x27;triple&#x27;)), (&#x27;*&#x27;, (&#x27;,&#x27;, [(&#x27;id&#x27;, &#x27;EOL&#x27;), (&#x27;id&#x27;, &#x27;triple&#x27;)])), (&#x27;?&#x27;, (&#x27;id&#x27;, &#x27;EOL&#x27;))])" >
     <td>[1]<td>
     <td><code>ntriplesDoc</code><td>
     <td>::=</td>
-    <td>(<a href='#grammar-production-triple'>triple</a>)? (<a href='#grammar-production-EOL'>EOL</a> <a href='#grammar-production-triple'>triple</a>)<code class='grammar-star'>*</code> (<a href='#grammar-production-EOL'>EOL</a>)?</td>
+    <td>(<a href='#n-triples-grammar-production-triple'>triple</a>)? (<a href='#n-triples-grammar-production-EOL'>EOL</a> <a href='#n-triples-grammar-production-triple'>triple</a>)<code class='grammar-star'>*</code> (<a href='#n-triples-grammar-production-EOL'>EOL</a>)?</td>
 </tr>
-            <tr id="grammar-production-triple" data-grammar-original="[2]  triple             ::= subject predicate object &#x27;.&#x27;" data-grammar-expression="(&#x27;,&#x27;, [(&#x27;id&#x27;, &#x27;subject&#x27;), (&#x27;id&#x27;, &#x27;predicate&#x27;), (&#x27;id&#x27;, &#x27;object&#x27;), (&quot;&#x27;&quot;, &#x27;.&#x27;)])" >
+            <tr id="n-triples-grammar-production-triple" data-grammar-original="[2]  triple             ::= subject predicate object &#x27;.&#x27;" data-grammar-expression="(&#x27;,&#x27;, [(&#x27;id&#x27;, &#x27;subject&#x27;), (&#x27;id&#x27;, &#x27;predicate&#x27;), (&#x27;id&#x27;, &#x27;object&#x27;), (&quot;&#x27;&quot;, &#x27;.&#x27;)])" >
     <td>[2]<td>
     <td><code>triple</code><td>
     <td>::=</td>
-    <td><a href='#grammar-production-subject'>subject</a> <a href='#grammar-production-predicate'>predicate</a> <a href='#grammar-production-object'>object</a> '<code class='grammar-literal'>.</code>'</td>
+    <td><a href='#n-triples-grammar-production-subject'>subject</a> <a href='#n-triples-grammar-production-predicate'>predicate</a> <a href='#n-triples-grammar-production-object'>object</a> '<code class='grammar-literal'>.</code>'</td>
 </tr>
-            <tr id="grammar-production-subject" data-grammar-original="[3]  subject           ::= IRIREF | BLANK_NODE_LABEL" data-grammar-expression="(&#x27;|&#x27;, [(&#x27;id&#x27;, &#x27;IRIREF&#x27;), (&#x27;id&#x27;, &#x27;BLANK_NODE_LABEL&#x27;)])" >
+            <tr id="n-triples-grammar-production-subject" data-grammar-original="[3]  subject           ::= IRIREF | BLANK_NODE_LABEL" data-grammar-expression="(&#x27;|&#x27;, [(&#x27;id&#x27;, &#x27;IRIREF&#x27;), (&#x27;id&#x27;, &#x27;BLANK_NODE_LABEL&#x27;)])" >
     <td>[3]<td>
     <td><code>subject</code><td>
     <td>::=</td>
-    <td>(<a href='#grammar-production-IRIREF'>IRIREF</a> <code>|</code> <a href='#grammar-production-BLANK_NODE_LABEL'>BLANK_NODE_LABEL</a>)</td>
+    <td>(<a href='#n-triples-grammar-production-IRIREF'>IRIREF</a> <code>|</code> <a href='#n-triples-grammar-production-BLANK_NODE_LABEL'>BLANK_NODE_LABEL</a>)</td>
 </tr>
-            <tr id="grammar-production-predicate" data-grammar-original="[4]  predicate          ::= IRIREF" data-grammar-expression="(&#x27;id&#x27;, &#x27;IRIREF&#x27;)" >
+            <tr id="n-triples-grammar-production-predicate" data-grammar-original="[4]  predicate          ::= IRIREF" data-grammar-expression="(&#x27;id&#x27;, &#x27;IRIREF&#x27;)" >
     <td>[4]<td>
     <td><code>predicate</code><td>
     <td>::=</td>
-    <td><a href='#grammar-production-IRIREF'>IRIREF</a></td>
+    <td><a href='#n-triples-grammar-production-IRIREF'>IRIREF</a></td>
 </tr>
-            <tr id="grammar-production-object" data-grammar-original="[5]  object             ::= IRIREF | BLANK_NODE_LABEL | literal" data-grammar-expression="(&#x27;|&#x27;, [(&#x27;id&#x27;, &#x27;IRIREF&#x27;), (&#x27;id&#x27;, &#x27;BLANK_NODE_LABEL&#x27;), (&#x27;id&#x27;, &#x27;literal&#x27;)])" >
+            <tr id="n-triples-grammar-production-object" data-grammar-original="[5]  object             ::= IRIREF | BLANK_NODE_LABEL | literal" data-grammar-expression="(&#x27;|&#x27;, [(&#x27;id&#x27;, &#x27;IRIREF&#x27;), (&#x27;id&#x27;, &#x27;BLANK_NODE_LABEL&#x27;), (&#x27;id&#x27;, &#x27;literal&#x27;)])" >
     <td>[5]<td>
     <td><code>object</code><td>
     <td>::=</td>
-    <td>(<a href='#grammar-production-IRIREF'>IRIREF</a> <code>|</code> <a href='#grammar-production-BLANK_NODE_LABEL'>BLANK_NODE_LABEL</a> <code>|</code> <a href='#grammar-production-literal'>literal</a>)</td>
+    <td>(<a href='#n-triples-grammar-production-IRIREF'>IRIREF</a> <code>|</code> <a href='#n-triples-grammar-production-BLANK_NODE_LABEL'>BLANK_NODE_LABEL</a> <code>|</code> <a href='#n-triples-grammar-production-literal'>literal</a>)</td>
 </tr>
-            <tr id="grammar-production-literal" data-grammar-original="[6]  literal            ::= STRING_LITERAL2 (&#x27;^^&#x27; IRIREF | (&#x27;@&#x27; LANG) )?" data-grammar-expression="(&#x27;,&#x27;, [(&#x27;id&#x27;, &#x27;STRING_LITERAL2&#x27;), (&#x27;?&#x27;, (&#x27;|&#x27;, [(&#x27;,&#x27;, [(&quot;&#x27;&quot;, &#x27;^^&#x27;), (&#x27;id&#x27;, &#x27;IRIREF&#x27;)]), (&#x27;,&#x27;, [(&quot;&#x27;&quot;, &#x27;@&#x27;), (&#x27;id&#x27;, &#x27;LANG&#x27;)])]))])" >
+            <tr id="n-triples-grammar-production-literal" data-grammar-original="[6]  literal            ::= STRING_LITERAL2 (&#x27;^^&#x27; IRIREF | (&#x27;@&#x27; LANG) )?" data-grammar-expression="(&#x27;,&#x27;, [(&#x27;id&#x27;, &#x27;STRING_LITERAL2&#x27;), (&#x27;?&#x27;, (&#x27;|&#x27;, [(&#x27;,&#x27;, [(&quot;&#x27;&quot;, &#x27;^^&#x27;), (&#x27;id&#x27;, &#x27;IRIREF&#x27;)]), (&#x27;,&#x27;, [(&quot;&#x27;&quot;, &#x27;@&#x27;), (&#x27;id&#x27;, &#x27;LANG&#x27;)])]))])" >
     <td>[6]<td>
     <td><code>literal</code><td>
     <td>::=</td>
-    <td><a href='#grammar-production-STRING_LITERAL2'>STRING_LITERAL2</a> (('<code class='grammar-literal'>^^</code>' <a href='#grammar-production-IRIREF'>IRIREF</a> <code>|</code> '<code class='grammar-literal'>@</code>' <a href='#grammar-production-LANG'>LANG</a>))?</td>
+    <td><a href='#n-triples-grammar-production-STRING_LITERAL2'>STRING_LITERAL2</a> (('<code class='grammar-literal'>^^</code>' <a href='#n-triples-grammar-production-IRIREF'>IRIREF</a> <code>|</code> '<code class='grammar-literal'>@</code>' <a href='#n-triples-grammar-production-LANG'>LANG</a>))?</td>
 </tr>
     </tbody>
     <tbody class="grammar-terminals">
-            <tr id="grammar-production-LANG" data-grammar-original="[7]  LANG               ::= [a-zA-Z]+ ( &quot;-&quot; [a-zA-Z0-9]+ )*" data-grammar-expression="(&#x27;,&#x27;, [(&#x27;+&#x27;, (&#x27;[&#x27;, &#x27;a-zA-Z&#x27;)), (&#x27;*&#x27;, (&#x27;,&#x27;, [(&quot;&#x27;&quot;, &#x27;-&#x27;), (&#x27;+&#x27;, (&#x27;[&#x27;, &#x27;a-zA-Z0-9&#x27;))]))])" class='grammar-token'>
+            <tr id="n-triples-grammar-production-LANG" data-grammar-original="[7]  LANG               ::= [a-zA-Z]+ ( &quot;-&quot; [a-zA-Z0-9]+ )*" data-grammar-expression="(&#x27;,&#x27;, [(&#x27;+&#x27;, (&#x27;[&#x27;, &#x27;a-zA-Z&#x27;)), (&#x27;*&#x27;, (&#x27;,&#x27;, [(&quot;&#x27;&quot;, &#x27;-&#x27;), (&#x27;+&#x27;, (&#x27;[&#x27;, &#x27;a-zA-Z0-9&#x27;))]))])" class='grammar-token'>
     <td>[7]<td>
     <td><code>LANG</code><td>
     <td>::=</td>
     <td>([<code class='grammar-chars'>a-zA-Z</code>])<code class='grammar-plus'>+</code> ('<code class='grammar-literal'>-</code>' ([<code class='grammar-chars'>a-zA-Z0-9</code>])<code class='grammar-plus'>+</code>)<code class='grammar-star'>*</code></td>
 </tr>
-            <tr id="grammar-production-EOL" data-grammar-original="[8]  EOL                ::= [\r\n]+" data-grammar-expression="(&#x27;+&#x27;, (&#x27;[&#x27;, &#x27;\\r\\n&#x27;))" class='grammar-token'>
+            <tr id="n-triples-grammar-production-EOL" data-grammar-original="[8]  EOL                ::= [\r\n]+" data-grammar-expression="(&#x27;+&#x27;, (&#x27;[&#x27;, &#x27;\\r\\n&#x27;))" class='grammar-token'>
     <td>[8]<td>
     <td><code>EOL</code><td>
     <td>::=</td>
     <td>([<code class='grammar-chars'>\r\n</code>])<code class='grammar-plus'>+</code></td>
 </tr>
-            <tr id="grammar-production-IRIREF" data-grammar-original="[132s] IRIREF           ::= &#x27;&lt;&#x27; ([^&lt;&gt;&quot;{}|^`\]-[#x00-#x20])* | UCHAR &#x27;&gt;&#x27;" data-grammar-expression="(&#x27;|&#x27;, [(&#x27;,&#x27;, [(&quot;&#x27;&quot;, &#x27;&lt;&#x27;), (&#x27;*&#x27;, (&#x27;-&#x27;, [(&#x27;[&#x27;, &#x27;^&lt;&gt;&quot;{}|^`\\&#x27;), (&#x27;[&#x27;, &#x27;#x00-#x20&#x27;)]))]), (&#x27;,&#x27;, [(&#x27;id&#x27;, &#x27;UCHAR&#x27;), (&quot;&#x27;&quot;, &#x27;&gt;&#x27;)])])" class='grammar-token'>
+            <tr id="n-triples-grammar-production-IRIREF" data-grammar-original="[132s] IRIREF           ::= &#x27;&lt;&#x27; ([^&lt;&gt;&quot;{}|^`\]-[#x00-#x20])* | UCHAR &#x27;&gt;&#x27;" data-grammar-expression="(&#x27;|&#x27;, [(&#x27;,&#x27;, [(&quot;&#x27;&quot;, &#x27;&lt;&#x27;), (&#x27;*&#x27;, (&#x27;-&#x27;, [(&#x27;[&#x27;, &#x27;^&lt;&gt;&quot;{}|^`\\&#x27;), (&#x27;[&#x27;, &#x27;#x00-#x20&#x27;)]))]), (&#x27;,&#x27;, [(&#x27;id&#x27;, &#x27;UCHAR&#x27;), (&quot;&#x27;&quot;, &#x27;&gt;&#x27;)])])" class='grammar-token'>
     <td>[132s]<td>
     <td><code>IRIREF</code><td>
     <td>::=</td>
-    <td>('<code class='grammar-literal'>&lt;</code>' ([<code class='grammar-chars'>^<>"{}|^`\</code>]<code class='grammar-diff'>-</code>[<code class='grammar-chars'>#x00-#x20</code>])<code class='grammar-star'>*</code> <code>|</code> <a href='#grammar-production-UCHAR'>UCHAR</a> '<code class='grammar-literal'>&gt;</code>')</td>
+    <td>('<code class='grammar-literal'>&lt;</code>' ([<code class='grammar-chars'>^<>"{}|^`\</code>]<code class='grammar-diff'>-</code>[<code class='grammar-chars'>#x00-#x20</code>])<code class='grammar-star'>*</code> <code>|</code> <a href='#n-triples-grammar-production-UCHAR'>UCHAR</a> '<code class='grammar-literal'>&gt;</code>')</td>
 </tr>
-            <tr id="grammar-production-BLANK_NODE_LABEL" data-grammar-original="[135s] BLANK_NODE_LABEL ::= &#x27;_:&#x27; ( PN_CHARS_U | [0-9] ) ((PN_CHARS|&#x27;.&#x27;)* PN_CHARS)?" data-grammar-expression="(&#x27;,&#x27;, [(&quot;&#x27;&quot;, &#x27;_:&#x27;), (&#x27;|&#x27;, [(&#x27;id&#x27;, &#x27;PN_CHARS_U&#x27;), (&#x27;[&#x27;, &#x27;0-9&#x27;)]), (&#x27;?&#x27;, (&#x27;,&#x27;, [(&#x27;*&#x27;, (&#x27;|&#x27;, [(&#x27;id&#x27;, &#x27;PN_CHARS&#x27;), (&quot;&#x27;&quot;, &#x27;.&#x27;)])), (&#x27;id&#x27;, &#x27;PN_CHARS&#x27;)]))])" class='grammar-token'>
+            <tr id="n-triples-grammar-production-BLANK_NODE_LABEL" data-grammar-original="[135s] BLANK_NODE_LABEL ::= &#x27;_:&#x27; ( PN_CHARS_U | [0-9] ) ((PN_CHARS|&#x27;.&#x27;)* PN_CHARS)?" data-grammar-expression="(&#x27;,&#x27;, [(&quot;&#x27;&quot;, &#x27;_:&#x27;), (&#x27;|&#x27;, [(&#x27;id&#x27;, &#x27;PN_CHARS_U&#x27;), (&#x27;[&#x27;, &#x27;0-9&#x27;)]), (&#x27;?&#x27;, (&#x27;,&#x27;, [(&#x27;*&#x27;, (&#x27;|&#x27;, [(&#x27;id&#x27;, &#x27;PN_CHARS&#x27;), (&quot;&#x27;&quot;, &#x27;.&#x27;)])), (&#x27;id&#x27;, &#x27;PN_CHARS&#x27;)]))])" class='grammar-token'>
     <td>[135s]<td>
     <td><code>BLANK_NODE_LABEL</code><td>
     <td>::=</td>
-    <td>'<code class='grammar-literal'>_:</code>' (<a href='#grammar-production-PN_CHARS_U'>PN_CHARS_U</a> <code>|</code> [<code class='grammar-chars'>0-9</code>]) (((<a href='#grammar-production-PN_CHARS'>PN_CHARS</a> <code>|</code> '<code class='grammar-literal'>.</code>'))<code class='grammar-star'>*</code> <a href='#grammar-production-PN_CHARS'>PN_CHARS</a>)?</td>
+    <td>'<code class='grammar-literal'>_:</code>' (<a href='#n-triples-grammar-production-PN_CHARS_U'>PN_CHARS_U</a> <code>|</code> [<code class='grammar-chars'>0-9</code>]) (((<a href='#n-triples-grammar-production-PN_CHARS'>PN_CHARS</a> <code>|</code> '<code class='grammar-literal'>.</code>'))<code class='grammar-star'>*</code> <a href='#n-triples-grammar-production-PN_CHARS'>PN_CHARS</a>)?</td>
 </tr>
-            <tr id="grammar-production-STRING_LITERAL2" data-grammar-original="[150s] STRING_LITERAL2  ::= &#x27;&quot;&#x27; ( ( [^#x22#x5C#xA#xD]) | ECHAR | UCHAR )* &#x27;&quot;&#x27;" data-grammar-expression="(&#x27;,&#x27;, [(&quot;&#x27;&quot;, &#x27;&quot;&#x27;), (&#x27;*&#x27;, (&#x27;|&#x27;, [(&#x27;[&#x27;, &#x27;^#x22#x5C#xA#xD&#x27;), (&#x27;id&#x27;, &#x27;ECHAR&#x27;), (&#x27;id&#x27;, &#x27;UCHAR&#x27;)])), (&quot;&#x27;&quot;, &#x27;&quot;&#x27;)])" class='grammar-token'>
+            <tr id="n-triples-grammar-production-STRING_LITERAL2" data-grammar-original="[150s] STRING_LITERAL2  ::= &#x27;&quot;&#x27; ( ( [^#x22#x5C#xA#xD]) | ECHAR | UCHAR )* &#x27;&quot;&#x27;" data-grammar-expression="(&#x27;,&#x27;, [(&quot;&#x27;&quot;, &#x27;&quot;&#x27;), (&#x27;*&#x27;, (&#x27;|&#x27;, [(&#x27;[&#x27;, &#x27;^#x22#x5C#xA#xD&#x27;), (&#x27;id&#x27;, &#x27;ECHAR&#x27;), (&#x27;id&#x27;, &#x27;UCHAR&#x27;)])), (&quot;&#x27;&quot;, &#x27;&quot;&#x27;)])" class='grammar-token'>
     <td>[150s]<td>
     <td><code>STRING_LITERAL2</code><td>
     <td>::=</td>
-    <td>'<code class='grammar-literal'>&quot;</code>' (([<code class='grammar-chars'>^#x22#x5C#xA#xD</code>] <code>|</code> <a href='#grammar-production-ECHAR'>ECHAR</a> <code>|</code> <a href='#grammar-production-UCHAR'>UCHAR</a>))<code class='grammar-star'>*</code> '<code class='grammar-literal'>&quot;</code>'</td>
+    <td>'<code class='grammar-literal'>&quot;</code>' (([<code class='grammar-chars'>^#x22#x5C#xA#xD</code>] <code>|</code> <a href='#n-triples-grammar-production-ECHAR'>ECHAR</a> <code>|</code> <a href='#n-triples-grammar-production-UCHAR'>UCHAR</a>))<code class='grammar-star'>*</code> '<code class='grammar-literal'>&quot;</code>'</td>
 </tr>
-            <tr id="grammar-production-UCHAR" data-grammar-original="[19] UCHAR ::= ( &quot;\u&quot; HEX HEX HEX HEX )| ( &quot;\U&quot; HEX HEX HEX HEX HEX HEX HEX HEX )" data-grammar-expression="(&#x27;|&#x27;, [(&#x27;,&#x27;, [(&quot;&#x27;&quot;, &#x27;\\u&#x27;), (&#x27;id&#x27;, &#x27;HEX&#x27;), (&#x27;id&#x27;, &#x27;HEX&#x27;), (&#x27;id&#x27;, &#x27;HEX&#x27;), (&#x27;id&#x27;, &#x27;HEX&#x27;)]), (&#x27;,&#x27;, [(&quot;&#x27;&quot;, &#x27;\\U&#x27;), (&#x27;id&#x27;, &#x27;HEX&#x27;), (&#x27;id&#x27;, &#x27;HEX&#x27;), (&#x27;id&#x27;, &#x27;HEX&#x27;), (&#x27;id&#x27;, &#x27;HEX&#x27;), (&#x27;id&#x27;, &#x27;HEX&#x27;), (&#x27;id&#x27;, &#x27;HEX&#x27;), (&#x27;id&#x27;, &#x27;HEX&#x27;), (&#x27;id&#x27;, &#x27;HEX&#x27;)])])" class='grammar-token'>
+            <tr id="n-triples-grammar-production-UCHAR" data-grammar-original="[19] UCHAR ::= ( &quot;\u&quot; HEX HEX HEX HEX )| ( &quot;\U&quot; HEX HEX HEX HEX HEX HEX HEX HEX )" data-grammar-expression="(&#x27;|&#x27;, [(&#x27;,&#x27;, [(&quot;&#x27;&quot;, &#x27;\\u&#x27;), (&#x27;id&#x27;, &#x27;HEX&#x27;), (&#x27;id&#x27;, &#x27;HEX&#x27;), (&#x27;id&#x27;, &#x27;HEX&#x27;), (&#x27;id&#x27;, &#x27;HEX&#x27;)]), (&#x27;,&#x27;, [(&quot;&#x27;&quot;, &#x27;\\U&#x27;), (&#x27;id&#x27;, &#x27;HEX&#x27;), (&#x27;id&#x27;, &#x27;HEX&#x27;), (&#x27;id&#x27;, &#x27;HEX&#x27;), (&#x27;id&#x27;, &#x27;HEX&#x27;), (&#x27;id&#x27;, &#x27;HEX&#x27;), (&#x27;id&#x27;, &#x27;HEX&#x27;), (&#x27;id&#x27;, &#x27;HEX&#x27;), (&#x27;id&#x27;, &#x27;HEX&#x27;)])])" class='grammar-token'>
     <td>[19]<td>
     <td><code>UCHAR</code><td>
     <td>::=</td>
-    <td>('<code class='grammar-literal'>\u</code>' <a href='#grammar-production-HEX'>HEX</a> <a href='#grammar-production-HEX'>HEX</a> <a href='#grammar-production-HEX'>HEX</a> <a href='#grammar-production-HEX'>HEX</a> <code>|</code> '<code class='grammar-literal'>\U</code>' <a href='#grammar-production-HEX'>HEX</a> <a href='#grammar-production-HEX'>HEX</a> <a href='#grammar-production-HEX'>HEX</a> <a href='#grammar-production-HEX'>HEX</a> <a href='#grammar-production-HEX'>HEX</a> <a href='#grammar-production-HEX'>HEX</a> <a href='#grammar-production-HEX'>HEX</a> <a href='#grammar-production-HEX'>HEX</a>)</td>
+    <td>('<code class='grammar-literal'>\u</code>' <a href='#n-triples-grammar-production-HEX'>HEX</a> <a href='#n-triples-grammar-production-HEX'>HEX</a> <a href='#n-triples-grammar-production-HEX'>HEX</a> <a href='#n-triples-grammar-production-HEX'>HEX</a> <code>|</code> '<code class='grammar-literal'>\U</code>' <a href='#n-triples-grammar-production-HEX'>HEX</a> <a href='#n-triples-grammar-production-HEX'>HEX</a> <a href='#n-triples-grammar-production-HEX'>HEX</a> <a href='#n-triples-grammar-production-HEX'>HEX</a> <a href='#n-triples-grammar-production-HEX'>HEX</a> <a href='#n-triples-grammar-production-HEX'>HEX</a> <a href='#n-triples-grammar-production-HEX'>HEX</a> <a href='#n-triples-grammar-production-HEX'>HEX</a>)</td>
 </tr>
-            <tr id="grammar-production-ECHAR" data-grammar-original="[153s] ECHAR ::= &quot;\&quot; [tbnrf\&quot;&#x27;]" data-grammar-expression="(&#x27;,&#x27;, [(&quot;&#x27;&quot;, &#x27;\\&#x27;), (&#x27;[&#x27;, &#x27;tbnrf\\&quot;\&#x27;&#x27;)])" class='grammar-token'>
+            <tr id="n-triples-grammar-production-ECHAR" data-grammar-original="[153s] ECHAR ::= &quot;\&quot; [tbnrf\&quot;&#x27;]" data-grammar-expression="(&#x27;,&#x27;, [(&quot;&#x27;&quot;, &#x27;\\&#x27;), (&#x27;[&#x27;, &#x27;tbnrf\\&quot;\&#x27;&#x27;)])" class='grammar-token'>
     <td>[153s]<td>
     <td><code>ECHAR</code><td>
     <td>::=</td>
     <td>'<code class='grammar-literal'>\</code>' [<code class='grammar-chars'>tbnrf\"'</code>]</td>
 </tr>
-            <tr id="grammar-production-PN_CHARS_BASE" data-grammar-original="[157s] PN_CHARS_BASE    ::= [A-Z]| [a-z]| [#00C0-#00D6]| [#00D8-#00F6]| [#00F8-#02FF]| [#0370-#037D]| [#037F-#1FFF]| [#200C-#200D]| [#2070-#218F]| [#2C00-#2FEF]| [#3001-#D7FF]| [#F900-#FDCF]| [#FDF0-#FFFD]| [#10000-#EFFFF]" data-grammar-expression="(&#x27;|&#x27;, [(&#x27;[&#x27;, &#x27;A-Z&#x27;), (&#x27;[&#x27;, &#x27;a-z&#x27;), (&#x27;[&#x27;, &#x27;#00C0-#00D6&#x27;), (&#x27;[&#x27;, &#x27;#00D8-#00F6&#x27;), (&#x27;[&#x27;, &#x27;#00F8-#02FF&#x27;), (&#x27;[&#x27;, &#x27;#0370-#037D&#x27;), (&#x27;[&#x27;, &#x27;#037F-#1FFF&#x27;), (&#x27;[&#x27;, &#x27;#200C-#200D&#x27;), (&#x27;[&#x27;, &#x27;#2070-#218F&#x27;), (&#x27;[&#x27;, &#x27;#2C00-#2FEF&#x27;), (&#x27;[&#x27;, &#x27;#3001-#D7FF&#x27;), (&#x27;[&#x27;, &#x27;#F900-#FDCF&#x27;), (&#x27;[&#x27;, &#x27;#FDF0-#FFFD&#x27;), (&#x27;[&#x27;, &#x27;#10000-#EFFFF&#x27;)])" class='grammar-token'>
+            <tr id="n-triples-grammar-production-PN_CHARS_BASE" data-grammar-original="[157s] PN_CHARS_BASE    ::= [A-Z]| [a-z]| [#00C0-#00D6]| [#00D8-#00F6]| [#00F8-#02FF]| [#0370-#037D]| [#037F-#1FFF]| [#200C-#200D]| [#2070-#218F]| [#2C00-#2FEF]| [#3001-#D7FF]| [#F900-#FDCF]| [#FDF0-#FFFD]| [#10000-#EFFFF]" data-grammar-expression="(&#x27;|&#x27;, [(&#x27;[&#x27;, &#x27;A-Z&#x27;), (&#x27;[&#x27;, &#x27;a-z&#x27;), (&#x27;[&#x27;, &#x27;#00C0-#00D6&#x27;), (&#x27;[&#x27;, &#x27;#00D8-#00F6&#x27;), (&#x27;[&#x27;, &#x27;#00F8-#02FF&#x27;), (&#x27;[&#x27;, &#x27;#0370-#037D&#x27;), (&#x27;[&#x27;, &#x27;#037F-#1FFF&#x27;), (&#x27;[&#x27;, &#x27;#200C-#200D&#x27;), (&#x27;[&#x27;, &#x27;#2070-#218F&#x27;), (&#x27;[&#x27;, &#x27;#2C00-#2FEF&#x27;), (&#x27;[&#x27;, &#x27;#3001-#D7FF&#x27;), (&#x27;[&#x27;, &#x27;#F900-#FDCF&#x27;), (&#x27;[&#x27;, &#x27;#FDF0-#FFFD&#x27;), (&#x27;[&#x27;, &#x27;#10000-#EFFFF&#x27;)])" class='grammar-token'>
     <td>[157s]<td>
     <td><code>PN_CHARS_BASE</code><td>
     <td>::=</td>
     <td>([<code class='grammar-chars'>A-Z</code>] <code>|</code> [<code class='grammar-chars'>a-z</code>] <code>|</code> [<code class='grammar-chars'>#00C0-#00D6</code>] <code>|</code> [<code class='grammar-chars'>#00D8-#00F6</code>] <code>|</code> [<code class='grammar-chars'>#00F8-#02FF</code>] <code>|</code> [<code class='grammar-chars'>#0370-#037D</code>] <code>|</code> [<code class='grammar-chars'>#037F-#1FFF</code>] <code>|</code> [<code class='grammar-chars'>#200C-#200D</code>] <code>|</code> [<code class='grammar-chars'>#2070-#218F</code>] <code>|</code> [<code class='grammar-chars'>#2C00-#2FEF</code>] <code>|</code> [<code class='grammar-chars'>#3001-#D7FF</code>] <code>|</code> [<code class='grammar-chars'>#F900-#FDCF</code>] <code>|</code> [<code class='grammar-chars'>#FDF0-#FFFD</code>] <code>|</code> [<code class='grammar-chars'>#10000-#EFFFF</code>])</td>
 </tr>
-            <tr id="grammar-production-PN_CHARS" data-grammar-original="[160s] PN_CHARS         ::= PN_CHARS_U| &quot;-&quot;| [0-9]| #00B7| [#0300-#036F]| [#203F-#2040]" data-grammar-expression="(&#x27;|&#x27;, [(&#x27;id&#x27;, &#x27;PN_CHARS_U&#x27;), (&quot;&#x27;&quot;, &#x27;-&#x27;), (&#x27;[&#x27;, &#x27;0-9&#x27;), (&#x27;#&#x27;, &#x27;#00B7&#x27;), (&#x27;[&#x27;, &#x27;#0300-#036F&#x27;), (&#x27;[&#x27;, &#x27;#203F-#2040&#x27;)])" class='grammar-token'>
+            <tr id="n-triples-grammar-production-PN_CHARS_U" data-grammar-original="[158s] PN_CHARS_U       ::=  PN_CHARS_BASE| &#x27;_&#x27;| &#x27;:&#x27;" data-grammar-expression="(&#x27;|&#x27;, [(&#x27;id&#x27;, &#x27;PN_CHARS_BASE&#x27;), (&quot;&#x27;&quot;, &#x27;_&#x27;), (&quot;&#x27;&quot;, &#x27;:&#x27;)])" class='grammar-token'>
+    <td>[158s]<td>
+    <td><code>PN_CHARS_U</code><td>
+    <td>::=</td>
+    <td>(<a href='#n-triples-grammar-production-PN_CHARS_BASE'>PN_CHARS_BASE</a> <code>|</code> '<code class='grammar-literal'>_</code>' <code>|</code> '<code class='grammar-literal'>:</code>')</td>
+</tr>
+            <tr id="n-triples-grammar-production-PN_CHARS" data-grammar-original="[160s] PN_CHARS         ::= PN_CHARS_U| &quot;-&quot;| [0-9]| #00B7| [#0300-#036F]| [#203F-#2040]" data-grammar-expression="(&#x27;|&#x27;, [(&#x27;id&#x27;, &#x27;PN_CHARS_U&#x27;), (&quot;&#x27;&quot;, &#x27;-&#x27;), (&#x27;[&#x27;, &#x27;0-9&#x27;), (&#x27;#&#x27;, &#x27;#00B7&#x27;), (&#x27;[&#x27;, &#x27;#0300-#036F&#x27;), (&#x27;[&#x27;, &#x27;#203F-#2040&#x27;)])" class='grammar-token'>
     <td>[160s]<td>
     <td><code>PN_CHARS</code><td>
     <td>::=</td>
-    <td>(<a href='#grammar-production-PN_CHARS_U'>PN_CHARS_U</a> <code>|</code> '<code class='grammar-literal'>-</code>' <code>|</code> [<code class='grammar-chars'>0-9</code>] <code>|</code> <code class='grammar-char-escape'>#00B7</code> <code>|</code> [<code class='grammar-chars'>#0300-#036F</code>] <code>|</code> [<code class='grammar-chars'>#203F-#2040</code>])</td>
+    <td>(<a href='#n-triples-grammar-production-PN_CHARS_U'>PN_CHARS_U</a> <code>|</code> '<code class='grammar-literal'>-</code>' <code>|</code> [<code class='grammar-chars'>0-9</code>] <code>|</code> <code class='grammar-char-escape'>#00B7</code> <code>|</code> [<code class='grammar-chars'>#0300-#036F</code>] <code>|</code> [<code class='grammar-chars'>#203F-#2040</code>])</td>
 </tr>
-            <tr id="grammar-production-HEX" data-grammar-original="[162s] HEX              ::= [0-9] | [A-F] | [a-f]" data-grammar-expression="(&#x27;|&#x27;, [(&#x27;[&#x27;, &#x27;0-9&#x27;), (&#x27;[&#x27;, &#x27;A-F&#x27;), (&#x27;[&#x27;, &#x27;a-f&#x27;)])" class='grammar-token'>
+            <tr id="n-triples-grammar-production-HEX" data-grammar-original="[162s] HEX              ::= [0-9] | [A-F] | [a-f]" data-grammar-expression="(&#x27;|&#x27;, [(&#x27;[&#x27;, &#x27;0-9&#x27;), (&#x27;[&#x27;, &#x27;A-F&#x27;), (&#x27;[&#x27;, &#x27;a-f&#x27;)])" class='grammar-token'>
     <td>[162s]<td>
     <td><code>HEX</code><td>
     <td>::=</td>
--- a/rdf-turtle/n-prime.bnf	Wed May 09 19:37:57 2012 -0700
+++ b/rdf-turtle/n-prime.bnf	Tue May 15 11:33:17 2012 -0700
@@ -30,6 +30,9 @@
                         | [#F900-#FDCF] 
                         | [#FDF0-#FFFD] 
                         | [#10000-#EFFFF] 
+[158s] PN_CHARS_U       ::=  PN_CHARS_BASE 
+                        | '_' 
+                        | ':'
 [160s] PN_CHARS         ::= PN_CHARS_U 
                         | "-" 
                         | [0-9] 
--- a/rdf-turtle/turtle-bnf.html	Wed May 09 19:37:57 2012 -0700
+++ b/rdf-turtle/turtle-bnf.html	Tue May 15 11:33:17 2012 -0700
@@ -1,4 +1,4 @@
-<table class="grammar">
+<table  class="grammar">
     <tbody class="grammar-productions">
             <tr id="grammar-production-turtleDoc" data-grammar-original="[1] turtleDoc ::= (statement)*" data-grammar-expression="(&#x27;*&#x27;, (&#x27;id&#x27;, &#x27;statement&#x27;))" >
     <td>[1]<td>
@@ -18,23 +18,23 @@
     <td>::=</td>
     <td>(<a href='#grammar-production-prefixID'>prefixID</a> <code>|</code> <a href='#grammar-production-base'>base</a>)</td>
 </tr>
-            <tr id="grammar-production-prefixID" data-grammar-original="[4] prefixID ::= PREFIX PNAME_NS IRIREF" data-grammar-expression="(&#x27;,&#x27;, [(&#x27;id&#x27;, &#x27;PREFIX&#x27;), (&#x27;id&#x27;, &#x27;PNAME_NS&#x27;), (&#x27;id&#x27;, &#x27;IRIREF&#x27;)])" >
+            <tr id="grammar-production-prefixID" data-grammar-original="[4] prefixID ::= &#x27;@prefix&#x27; ws+ PNAME_NS IRIREF" data-grammar-expression="(&#x27;,&#x27;, [(&quot;&#x27;&quot;, &#x27;@prefix&#x27;), (&#x27;+&#x27;, (&#x27;id&#x27;, &#x27;ws&#x27;)), (&#x27;id&#x27;, &#x27;PNAME_NS&#x27;), (&#x27;id&#x27;, &#x27;IRIREF&#x27;)])" >
     <td>[4]<td>
     <td><code>prefixID</code><td>
     <td>::=</td>
-    <td><a href='#grammar-production-PREFIX'>PREFIX</a> <a href='#grammar-production-PNAME_NS'>PNAME_NS</a> <a href='#grammar-production-IRIREF'>IRIREF</a></td>
+    <td>'<code class='grammar-literal'>@prefix</code>' (<a href='#grammar-production-ws'>ws</a>)<code class='grammar-plus'>+</code> <a href='#grammar-production-PNAME_NS'>PNAME_NS</a> <a href='#grammar-production-IRIREF'>IRIREF</a></td>
 </tr>
-            <tr id="grammar-production-base" data-grammar-original="[5] base ::= BASE IRIREF" data-grammar-expression="(&#x27;,&#x27;, [(&#x27;id&#x27;, &#x27;BASE&#x27;), (&#x27;id&#x27;, &#x27;IRIREF&#x27;)])" >
+            <tr id="grammar-production-base" data-grammar-original="[5] base ::= &#x27;@base&#x27; ws+ IRIREF" data-grammar-expression="(&#x27;,&#x27;, [(&quot;&#x27;&quot;, &#x27;@base&#x27;), (&#x27;+&#x27;, (&#x27;id&#x27;, &#x27;ws&#x27;)), (&#x27;id&#x27;, &#x27;IRIREF&#x27;)])" >
     <td>[5]<td>
     <td><code>base</code><td>
     <td>::=</td>
-    <td><a href='#grammar-production-BASE'>BASE</a> <a href='#grammar-production-IRIREF'>IRIREF</a></td>
+    <td>'<code class='grammar-literal'>@base</code>' (<a href='#grammar-production-ws'>ws</a>)<code class='grammar-plus'>+</code> <a href='#grammar-production-IRIREF'>IRIREF</a></td>
 </tr>
-            <tr id="grammar-production-triples" data-grammar-original="[6] triples ::= subject predicateObjectList" data-grammar-expression="(&#x27;,&#x27;, [(&#x27;id&#x27;, &#x27;subject&#x27;), (&#x27;id&#x27;, &#x27;predicateObjectList&#x27;)])" >
+            <tr id="grammar-production-triples" data-grammar-original="[6] triples ::= (subject predicateObjectList) |(blankNodePropertyList predicateObjectList?)" data-grammar-expression="(&#x27;|&#x27;, [(&#x27;,&#x27;, [(&#x27;id&#x27;, &#x27;subject&#x27;), (&#x27;id&#x27;, &#x27;predicateObjectList&#x27;)]), (&#x27;,&#x27;, [(&#x27;id&#x27;, &#x27;blankNodePropertyList&#x27;), (&#x27;?&#x27;, (&#x27;id&#x27;, &#x27;predicateObjectList&#x27;))])])" >
     <td>[6]<td>
     <td><code>triples</code><td>
     <td>::=</td>
-    <td><a href='#grammar-production-subject'>subject</a> <a href='#grammar-production-predicateObjectList'>predicateObjectList</a></td>
+    <td>(<a href='#grammar-production-subject'>subject</a> <a href='#grammar-production-predicateObjectList'>predicateObjectList</a> <code>|</code> <a href='#grammar-production-blankNodePropertyList'>blankNodePropertyList</a> (<a href='#grammar-production-predicateObjectList'>predicateObjectList</a>)?)</td>
 </tr>
             <tr id="grammar-production-predicateObjectList" data-grammar-original="[7] predicateObjectList ::= verb objectList ( &quot;;&quot; verb objectList )* (&quot;;&quot;)?" data-grammar-expression="(&#x27;,&#x27;, [(&#x27;id&#x27;, &#x27;verb&#x27;), (&#x27;id&#x27;, &#x27;objectList&#x27;), (&#x27;*&#x27;, (&#x27;,&#x27;, [(&quot;&#x27;&quot;, &#x27;;&#x27;), (&#x27;id&#x27;, &#x27;verb&#x27;), (&#x27;id&#x27;, &#x27;objectList&#x27;)])), (&#x27;?&#x27;, (&quot;&#x27;&quot;, &#x27;;&#x27;))])" >
     <td>[7]<td>
@@ -54,11 +54,11 @@
     <td>::=</td>
     <td>(<a href='#grammar-production-predicate'>predicate</a> <code>|</code> '<code class='grammar-literal'>a</code>')</td>
 </tr>
-            <tr id="grammar-production-subject" data-grammar-original="[10] subject ::= iri| blank" data-grammar-expression="(&#x27;|&#x27;, [(&#x27;id&#x27;, &#x27;iri&#x27;), (&#x27;id&#x27;, &#x27;blank&#x27;)])" >
+            <tr id="grammar-production-subject" data-grammar-original="[10] subject ::= iri| ANON" data-grammar-expression="(&#x27;|&#x27;, [(&#x27;id&#x27;, &#x27;iri&#x27;), (&#x27;id&#x27;, &#x27;ANON&#x27;)])" >
     <td>[10]<td>
     <td><code>subject</code><td>
     <td>::=</td>
-    <td>(<a href='#grammar-production-iri'>iri</a> <code>|</code> <a href='#grammar-production-blank'>blank</a>)</td>
+    <td>(<a href='#grammar-production-iri'>iri</a> <code>|</code> <a href='#grammar-production-ANON'>ANON</a>)</td>
 </tr>
             <tr id="grammar-production-predicate" data-grammar-original="[11] predicate ::= iri" data-grammar-expression="(&#x27;id&#x27;, &#x27;iri&#x27;)" >
     <td>[11]<td>
@@ -158,18 +158,6 @@
 </tr>
     </tbody>
     <tbody class="grammar-terminals">
-            <tr id="grammar-production-BASE" data-grammar-original="[17] BASE ::= &quot;@base&quot;" data-grammar-expression="(&quot;&#x27;&quot;, &#x27;@base&#x27;)" class='grammar-token'>
-    <td>[17]<td>
-    <td><code>BASE</code><td>
-    <td>::=</td>
-    <td>'<code class='grammar-literal'>@base</code>'</td>
-</tr>
-            <tr id="grammar-production-PREFIX" data-grammar-original="[18] PREFIX ::= &quot;@prefix&quot;" data-grammar-expression="(&quot;&#x27;&quot;, &#x27;@prefix&#x27;)" class='grammar-token'>
-    <td>[18]<td>
-    <td><code>PREFIX</code><td>
-    <td>::=</td>
-    <td>'<code class='grammar-literal'>@prefix</code>'</td>
-</tr>
             <tr id="grammar-production-IRIREF" data-grammar-original="[132s] IRIREF ::= &#x27;&lt;&#x27; ([^&lt;&gt;&quot;{}|^`\]-[#x00-#x20])* | UCHAR &#x27;&gt;&#x27;" data-grammar-expression="(&#x27;|&#x27;, [(&#x27;,&#x27;, [(&quot;&#x27;&quot;, &#x27;&lt;&#x27;), (&#x27;*&#x27;, (&#x27;-&#x27;, [(&#x27;[&#x27;, &#x27;^&lt;&gt;&quot;{}|^`\\&#x27;), (&#x27;[&#x27;, &#x27;#x00-#x20&#x27;)]))]), (&#x27;,&#x27;, [(&#x27;id&#x27;, &#x27;UCHAR&#x27;), (&quot;&#x27;&quot;, &#x27;&gt;&#x27;)])])" class='grammar-token'>
     <td>[132s]<td>
     <td><code>IRIREF</code><td>
@@ -194,11 +182,11 @@
     <td>::=</td>
     <td>'<code class='grammar-literal'>_:</code>' (<a href='#grammar-production-PN_CHARS_U'>PN_CHARS_U</a> <code>|</code> [<code class='grammar-chars'>0-9</code>]) (((<a href='#grammar-production-PN_CHARS'>PN_CHARS</a> <code>|</code> '<code class='grammar-literal'>.</code>'))<code class='grammar-star'>*</code> <a href='#grammar-production-PN_CHARS'>PN_CHARS</a>)?</td>
 </tr>
-            <tr id="grammar-production-LANGTAG" data-grammar-original="[19] LANGTAG ::= BASE| PREFIX| &quot;@&quot; [a-zA-Z]+ ( &quot;-&quot; [a-zA-Z0-9]+ )*" data-grammar-expression="(&#x27;|&#x27;, [(&#x27;id&#x27;, &#x27;BASE&#x27;), (&#x27;id&#x27;, &#x27;PREFIX&#x27;), (&#x27;,&#x27;, [(&quot;&#x27;&quot;, &#x27;@&#x27;), (&#x27;+&#x27;, (&#x27;[&#x27;, &#x27;a-zA-Z&#x27;)), (&#x27;*&#x27;, (&#x27;,&#x27;, [(&quot;&#x27;&quot;, &#x27;-&#x27;), (&#x27;+&#x27;, (&#x27;[&#x27;, &#x27;a-zA-Z0-9&#x27;))]))])])" class='grammar-token'>
+            <tr id="grammar-production-LANGTAG" data-grammar-original="[19] LANGTAG ::= &quot;@&quot; [a-zA-Z]+ ( &quot;-&quot; [a-zA-Z0-9]+ )*" data-grammar-expression="(&#x27;,&#x27;, [(&quot;&#x27;&quot;, &#x27;@&#x27;), (&#x27;+&#x27;, (&#x27;[&#x27;, &#x27;a-zA-Z&#x27;)), (&#x27;*&#x27;, (&#x27;,&#x27;, [(&quot;&#x27;&quot;, &#x27;-&#x27;), (&#x27;+&#x27;, (&#x27;[&#x27;, &#x27;a-zA-Z0-9&#x27;))]))])" class='grammar-token'>
     <td>[19]<td>
     <td><code>LANGTAG</code><td>
     <td>::=</td>
-    <td>(<a href='#grammar-production-BASE'>BASE</a> <code>|</code> <a href='#grammar-production-PREFIX'>PREFIX</a> <code>|</code> '<code class='grammar-literal'>@</code>' ([<code class='grammar-chars'>a-zA-Z</code>])<code class='grammar-plus'>+</code> ('<code class='grammar-literal'>-</code>' ([<code class='grammar-chars'>a-zA-Z0-9</code>])<code class='grammar-plus'>+</code>)<code class='grammar-star'>*</code>)</td>
+    <td>'<code class='grammar-literal'>@</code>' ([<code class='grammar-chars'>a-zA-Z</code>])<code class='grammar-plus'>+</code> ('<code class='grammar-literal'>-</code>' ([<code class='grammar-chars'>a-zA-Z0-9</code>])<code class='grammar-plus'>+</code>)<code class='grammar-star'>*</code></td>
 </tr>
             <tr id="grammar-production-INTEGER" data-grammar-original="[20] INTEGER ::= [+-]? [0-9]+" data-grammar-expression="(&#x27;,&#x27;, [(&#x27;?&#x27;, (&#x27;[&#x27;, &#x27;+-&#x27;)), (&#x27;+&#x27;, (&#x27;[&#x27;, &#x27;0-9&#x27;))])" class='grammar-token'>
     <td>[20]<td>
--- a/rdf-turtle/turtle.bnf	Wed May 09 19:37:57 2012 -0700
+++ b/rdf-turtle/turtle.bnf	Tue May 15 11:33:17 2012 -0700
@@ -4,11 +4,12 @@
  | triples "." 
 [3] directive ::= prefixID 
  | base 
-[4] prefixID ::= PREFIX PNAME_NS IRIREF 
+[4] prefixID ::= '@prefix' ws+ PNAME_NS IRIREF 
  
-[5] base ::= BASE IRIREF 
+[5] base ::= '@base' ws+ IRIREF 
  
-[6] triples ::= subject predicateObjectList 
+[6] triples ::= (subject predicateObjectList) |
+(blankNodePropertyList predicateObjectList?) 
  
 [7] predicateObjectList ::= verb objectList ( ";" verb objectList )* (";")? 
  
@@ -17,7 +18,7 @@
 [9] verb ::= predicate 
  | "a" 
 [10] subject ::= iri 
- | blank 
+ | ANON 
 [11] predicate ::= iri 
  
 [12] object ::= iri 
@@ -62,10 +63,6 @@
 
 @terminals
 
-[17] BASE ::= "@base" 
- 
-[18] PREFIX ::= "@prefix" 
-
 [132s] IRIREF ::= '<' ([^<>"{}|^`\]-[#x00-#x20])* | UCHAR '>'
  
 [133s] PNAME_NS ::= PN_PREFIX? ":" 
@@ -74,9 +71,7 @@
  
 [135s] BLANK_NODE_LABEL ::= '_:' ( PN_CHARS_U | [0-9] ) ((PN_CHARS|'.')* PN_CHARS)?
  
-[19] LANGTAG ::= BASE 
- | PREFIX 
- | "@" [a-zA-Z]+ ( "-" [a-zA-Z0-9]+ )* 
+[19] LANGTAG ::= "@" [a-zA-Z]+ ( "-" [a-zA-Z0-9]+ )* 
 [20] INTEGER ::= [+-]? [0-9]+
  
 [21] DECIMAL ::= [+-]? [0-9]+ "." [0-9]+