<?xml version="1.0" encoding="ASCII"?><?xml-stylesheet type="text/xsl" href="../../../mathml/pmathml.xsl"?><html xmlns="http://www.w3.org/1999/xhtml" xmlns:mml="http://www.w3.org/1998/Math/MathML" xml:space="preserve">
   <head>
      <meta http-equiv="Content-Type" content="text/html; utf-8"/>
      <title>Proceedings of Extreme Markup Languages&#174;</title>
      <link rel="stylesheet" href="../../../extreme-proceedings.css" type="text/css"/>
   </head>
   <body>
      <div id="head">
         <div class="inner">
            <img class="right" src="../../../icons/ExtremeNoDates.jpg"/>
            <h2>
               <i>Proceedings of Extreme Markup Languages<sup>&#174;</sup>
               </i>
            </h2>
         </div>
      </div>
      <div id="nav">
         <table width="100%" cellspacing="5">
            <tr height="29">
               <td class="button" width="20%" align="center">
                  <a title="Master Bibliography" href="../../../biblio.html">Master Bibliography</a>
               </td>
               <td class="button" width="20%" align="center">
                  <a title="Author Index" href="../../../authors.html">Author Index</a>
               </td>
               <td class="button" width="20%" align="center">
                  <a title="Topic Index" href="../../../topics.html">Topic Index</a>
               </td>
               <td class="button" width="20%" align="center">
                  <a title="Date Index" href="../../../dates.html">Date Index</a>
               </td>
               <td class="button" width="20%" align="center">
                  <a title="Proceedings Home" href="../../../index.html">Proceedings Home</a>
               </td>
            </tr>
         </table>
      </div>
      <div id="left1">
         <div class="inner">
            <h4>Network-Oriented Document Abstraction Language: Structure and Reference for the Rest of the Web</h4>
            <address>Lee Iverson <br class="br"/>
               <a href="mailto:leei@ece.ubc.ca" class="mailto">leei@ece.ubc.ca</a>
            </address>
            <div class="abstract">
               <h4>Abstract</h4>
               <p class="first">The Web has amply demonstrated the benefits of an infrastructure that makes publishing
 and reference of semi-structured information easily accessible, but in many cases reference and
 reuse of such information is only at the level of complete files.
 The potential for greater benefits
 that may derive from sub-document structure and reference is currently being explored, but this exploration is
 limited by the fact that such references can only be used with a portion of the Web's content
 (i.e. that encoded in XML).
 We have developed a system, the Network-Oriented Document
 Abstraction Language (NODAL), that is designed to provide a common data model, schema language
 and sub-document reference system for web-accessible documents or databases
 encoded in any format (e.g. images, PDF or Word documents etc.).
 This system thus provides a common reference and access
 environment for all structured, semi-structured and unstructured data.
 In this paper, we describe the data model, schema language and URI-based reference
 language for NODAL and compare it with XML and other systems.
 Finally, we outline a number of
 ways that this system can be extended to allow for composition, synchronization and reuse of
 documents and databases and can thus form a hypertextual foundation for
 interactive application development without inhibiting interoperability with existing systems.
 In essence, with NODAL we can bring the benefits of markup and hypertext to all data formats.</p>
            </div>
            <p class="keywords">
               <b style="font-size:85%">Keywords:</b> 
               <a href="../../../topics/Publishing.html">Publishing</a>; <a href="../../../topics/Modeling.html">Modeling</a>
            </p>
            <div class="contents">
               <h4>Table of Contents</h4>
               <dl>
                  <dt>
                     <a href="#t1">Overview</a>
                  </dt>
                  <dt>
                     <a href="#t2">The Problem: Granular Reference, Content Reuse and Annotation</a>
                  </dt>
                  <dt>
                     <a href="#t3">The NODAL Solution: Document Data Modeling and Reference</a>
                  </dt>
                  <dt>
                     <a href="#t4">The NODAL Data Model</a>
                  </dt>
                  <dl>
                     <dt>
                        <a href="#sec-literals">Literal Data Types</a>
                     </dt>
                     <dt>
                        <a href="#sec-nodes">Structured Data: Collections as Nodes</a>
                     </dt>
                     <dl>
                        <dt>
                           <a href="#t4-2-1">Map</a>
                        </dt>
                        <dt>
                           <a href="#t4-2-2">Set</a>
                        </dt>
                        <dt>
                           <a href="#t4-2-3">Sequence</a>
                        </dt>
                        <dt>
                           <a href="#t4-2-4">Record</a>
                        </dt>
                        <dt>
                           <a href="#t4-2-5">Node Identity and Metadata</a>
                        </dt>
                        <dt>
                           <a href="#t4-2-6">Literal Structures</a>
                        </dt>
                        <dt>
                           <a href="#t4-2-7">Restriction Types</a>
                        </dt>
                     </dl>
                     <dt>
                        <a href="#sec-documents">Documents and Node Graphs</a>
                     </dt>
                  </dl>
                  <dt>
                     <a href="#t5">The NODAL Path Language</a>
                  </dt>
                  <dl>
                     <dt>
                        <a href="#t5-1">Anchors</a>
                     </dt>
                  </dl>
                  <dt>
                     <a href="#t6">The NODAL Architecture</a>
                  </dt>
                  <dt>
                     <a href="#t7">Future Directions and Potential</a>
                  </dt>
               </dl>
            </div>
            <div class="authorBio">
               <h4>Lee Iverson</h4>
               <p class="first">Lee Iverson is an Assistant Professor in the Department of Electrical and Computer Engineering's
        Software Engineering Program.
  His main research interests are in Knowledge Management, collaboration, digital libraries and museums and usable security and privacy systems.</p>
            </div>
         </div>
      </div>
      <div id="paperLinks">
         <table width="100%" cellspacing="5">
            <tr height="18">
               <td class="button" width="25%" align="center">
                  <a title="XML Source" href="../../../xml/2005/Iverson01/EML2005Iverson01.xml">XML&#160;Source</a>
               </td>
               <td class="button" width="25%" align="center">
                  <a title="PDF Version" href="../../../xslfo-pdf/2005/Iverson01/EML2005Iverson01.pdf">PDF&#160;(for&#160;print)</a>
               </td>
               <td class="nobutton" width="25%" align="center">
                  <span class="nolink">Author&#160;Package</span>
               </td>
               <td class="nobutton" width="25%" align="center">
                  <span class="nolink">Typeset&#160;PDF</span>
               </td>
            </tr>
         </table>
      </div>
      <div id="right1">
         <div class="inner">
            <div class="front">
               <h1 class="title">Network-Oriented Document Abstraction Language: Structure and Reference for the Rest of the Web</h1>
               <address>Lee Iverson [University of British Columbia]</address>
               <h3 class="conference">Extreme Markup Languages 2005&#174; (Montr&#233;al, Qu&#233;bec)</h3>
               <h4>
                  <i>Copyright &#169; 2005 Lee Iverson. Reproduced with permission.</i>
               </h4>
            </div>
            <div class="mathml-warning">
               <p>
                  <i>
                     <b>Note:</b>
                  </i> This paper contains <a href="http://www.w3.org/Math/">W3C MathML</a>,
          which is not equally well supported in all browsers. If you have reason to think 
          that mathematical expressions are not displaying properly, consult the 
          <a href="../../../xslfo-pdf/2005/Iverson01/EML2005Iverson01.pdf">PDF version</a> (or try a different browser).</p>
            </div>
            <div class="section">
               <h2>
                  <a name="t1"/>Overview</h2>
               <p>
The Web has created an unprecedented ability to publish and distribute documents and other
 data and to augment this content with hypertextual references.  However, the granularity of these
 references is, for the most part, limited to the file level. The combination of a need to
 reuse and/or quote sources smaller than a whole document (e.g. Nelson's
 transclusion       <b>
                     <span style="font-size:85%">
                        <a href="#nelson99" name="fromnelson99">[Nel99]</a>
                     </span>
                  </b>
) and
 the advent of new technologies built on
 hypertextual reference (e.g. RDF       <b>
                     <span style="font-size:85%">
                        <a href="#rdf" name="fromrdf">[RDF98]</a>
                     </span>
                  </b>
and
 the Semantic Web       <b>
                     <span style="font-size:85%">
                        <a href="#bernerslee98semantic" name="frombernerslee98semantic">[SemWeb98]</a>
                     </span>
                  </b>
has stimulated a desire to provide
 a means of referencing only parts of a document. In traditional HTML this was accomplished with
 named anchors, but was thus limited to only those        <i>points</i>
in a document anticipated by the
 author. XPointer       <b>
                     <span style="font-size:85%">
                        <a href="#xpointer" name="fromxpointer">[XPointer]</a>
                     </span>
                  </b>
, XPath       <b>
                     <span style="font-size:85%">
                        <a href="#xpath" name="fromxpath">[XPath]</a>
                     </span>
                  </b>
and XLink       <b>
                     <span style="font-size:85%">
                        <a href="#xlink" name="fromxlink">[XLink]</a>
                     </span>
                  </b>
provide sub-document linking
 for XML documents but as yet only a small
 fraction of the Web is available as XML.     </p>
               <p>Instead of restricting sub-document reference to markup languages, we have designed NODAL,
 the Network-Oriented Document Abstraction Language, as a simple middleware layer that provides
 a means of defining URI-referenceable structure for all document formats and other structured
 data sources.  It achieves this by defining a simple data model and schema language that can then
 be used to define sub-document structure for any document type.  An extensible, plugin architecture
 is used to
 associate format encoder/decoder pairs with MIME types that in turn
 identify particular document formats and schemas.
 This system thus defines a common language for referencing and accessing the structured
 contents of arbitrary document formats at arbitrary granularity.  Moreover, it can be used in
 conjunction with other sub-document reference schemes without interference.</p>
               <p>Finally, the system provides a base for future development and research towards new software
 architectures and development paradigms that allow for a much more seamless interconnection
 between data and documents across applications, formats, database structures and distribution
 protocols.</p>
            </div>
            <div class="section">
               <h2>
                  <a name="t2"/>The Problem: Granular Reference, Content Reuse and Annotation</h2>
               <p>
Consider an engineering student working on a class project.
 The course has a website that contains notes
 from classroom sessions as well as a set of links to online resources to learn more about
 certain subjects.  The student exchanges email with other students about his
 project and asks questions on an online forum and mailing list that help him successfully
 complete his project.  At the end, he has a design document, a project report and an artifact that
 is a combination of a software system and some hardware described in a CAD model.  Through
 this entire project, he has used a few dozen sources of information (most online),
 at least half a dozen different software systems, and between his
 project notes and reports he has written a few thousand lines of text to
 describe and justify his design.  How then is this information structured to facilitate the work
 itself and to communicate its products?  If he was using broadly accepted practices then his
 working environment consists of
 a project directory on his desktop system, project and class folders in his email client,
 and a set of bookmarks for selected information sources in his browser.
 But how are they connected?  Where is the justification for a particular design feature in the
 CAD model?  Where is the connection between his project document and the
 email conversation and forum entries in which some critical issues were explained?
      </p>
               <p>
This kind of scenario is familiar to most hypertext researchers and some of these issues are
 well described by Ted Nelson in a recent paper <b>
                     <span style="font-size:85%">
                        <a href="#nelson99" name="fromnelson99">[Nel99]</a>
                     </span>
                  </b>
summarizing his goals and motivations of the past 40 years and a prescription for
&#8220;Xanalogical structure&#8221;.  Unfortunately,
like many hypertext systems of the past (e.g. Microcosm <b>
                     <span style="font-size:85%">
                        <a href="#fountain90microcosm" name="fromfountain90microcosm">[Mcsm90]</a>
                     </span>
                  </b>
and
 Intermedia <b>
                     <span style="font-size:85%">
                        <a href="#yankelovich88intermedia" name="fromyankelovich88intermedia">[Imed88]</a>
                     </span>
                  </b>), he
 suggests that the solution lies in an incompatible,
 new system and data model that will only act as its own kind of
 information silo.  Instead we suggest that the only way that this can be made to work (and have
 any possibility of wide uptake) is if we strive to develop a system that interoperates seamlessly
 with existing environments and applications (e.g. as in Chimera <b>
                     <span style="font-size:85%">
                        <a href="#anderson00chimera" name="fromanderson00chimera">[Chim00]</a>
                     </span>
                  </b>).
 </p>
               <p>
In a separate paper<b>
                     <span style="font-size:85%">
                        <a href="#iverson05dkc" name="fromiverson05dkc">[DKC05]</a>
                     </span>
                  </b>, we have analyzed this general class of issues and
various kinds of "information silos" (e.g. applications, data formats, operating systems, database systems).
 We suggested that a change to the assumed application architecture would allow for the deep
 linking, content reuse and general annotation facilities necessary to build general personal
 (and group) information management environments.
 This application architecture (the DKC Model) contains
 a persistent storage layer at its base (the <i>Data</i> Layer) that forms the basis for sharing,
 linking, reuse and versioning of data and structure.
 A <i>Knowledge</i> layer that can be used to imbue
 this data with semantic meaning, and then a final, independent layer of
 <i>Context</i> that manages user
 interface, interaction and modelling.
 By advocating the independence of view and
 storage (in the Context and Data layers), we
 suggest that this model will not only allow personal and group information management to finally
 begin to deal with cross-platform, cross-application issues but that we will enable greater
 innovation and adaptation in the user- and task-oriented spaces often considered by HCI
 and Hypertext researchers.
 </p>
            </div>
            <div class="section">
               <h2>
                  <a name="t3"/>The NODAL Solution: Document Data Modeling and Reference</h2>
               <p>
The approach we advocate is to separate data structure from syntax (just as pure XML
 approaches separate representation and presentation) by designing a system around
 a data model that can represent the data structures internal to a wide variety of file formats.
 In essence, we represent each data format as an encoding of a structured container and
 develop a schema language and system architecture to provide a standard
 means of referencing, querying, reusing and navigating through those data structures.
 When we combine these schemas with plugins to decode and encode data streams in a wide variety of formats
 we have a complete system that can enable general markup-like capabilities for any data format.
 This is similar to the approach of Abiteboul in <b>
                     <span style="font-size:85%">
                        <a href="#abiteboul93" name="fromabiteboul93">[Abit93]</a>
                     </span>
                  </b>
and <b>
                     <span style="font-size:85%">
                        <a href="#abiteboul95" name="fromabiteboul95">[Abit95]</a>
                     </span>
                  </b> which provided a relation database-inspired query and update model
for structured files.
It can also be traced directly back to Hytime <b>
                     <span style="font-size:85%">
                        <a href="#ison1920" name="fromison1920">[ISON1920]</a>
                     </span>
                  </b> and its &#8220;groves&#8221;
 data model, which was defined in order to provide a reference architecture for the contents of multimedia files.
 Unfortunately, we believe that the Hytime groves' data model was better matched to representing
 markup-like files than other data formats,
 and was sometimes as unnatural to manipulate as relational data is in typical programming languages.
 Instead, with NODAL, we hope to demonstrate that we can derive and implement a simple data model that naturally
 represents the data structures and formats of modern programming languages and yet can still form a basis for
 granular reference and annotation inside of existing file formats.
 Moreover, we have designed our system around the standard URI document/fragment model for reference and query.
 This emphasis on generality, simplicity and compatibility in the NODAL design
 is intended to provide the basis for the development of a standard model for data integration and reference.
 </p>
               <p>
The design requirements for the NODAL data model and path language can be
 largely taken completely from those defined for the XML Schema Language <b>
                     <span style="font-size:85%">
                        <a href="#xml-schema-req" name="fromxml-schema-req">[XSchReq]</a>
                     </span>
                  </b>
and XPointer <b>
                     <span style="font-size:85%">
                        <a href="#xptr-req" name="fromxptr-req">[XPtrReq]</a>
                     </span>
                  </b>
, without assuming an XML framework.
 It must be able to represent unstructured, semi-structured, and structured data in as wide a variety
 of formats as possible and provide a simple, natural path language that can be easily translated
 into fragment URIs.
 The NODAL system thus defines a data model that can be applied to modeling document
 formats in such a way as to provide a basis for a URI-based fragment references for
 any kind of modeled document.
 It is also a superset of the relational model with  object-relational (O/R) extensions
 (making such common data structures as sequences and dictionaries explicit)
 so it can also be used to provide a direct (and indirect)
 reference and integration architecture that encompasses both
 database and document-based information repositories.
 Moreover, we will show
 how this approach can also be extended to a wide variety of data access protocols, some
 database-like and some filesystem-like.      </p>
            </div>
            <div class="section">
               <h2>
                  <a name="t4"/>The NODAL Data Model</h2>
               <p>The challenges are to develop or adapt a data model that has clear application to distributed
 storage systems,
 provides a framework for both absolute and relative URI-based reference, and
 maps naturally to document formats, database schemata and application-level APIs.
 Moreover, for some of the more advanced functionality we will discuss later, it is important to
 distinguish which units of data will have metadata associated with them.</p>
               <p>The fundamental design constraints we settled on are summarized as
follows:</p>
               <ul>
                  <li>Use a type system to model the structural and value constraints that characterize the
data encoded in a particular format.  This means that each data
format or database schema should be expressable in the NODAL data modelling language
with a new schema or via reference to an existing schema.</li>
                  <li>Clearly separate data modeling from syntax.  A common data model for a
variety of data formats requires this independence, although there are certainly situations in
which there must be a standard syntax for certain uses of the model (e.g. in coding references
as URIs).</li>
                  <li>Don't invent new data types or structures.  Compatibility of this model with existing programming
languages and data storage models is a primary concern.  We are primarily interested in providing
a minimally sufficient model that can be adapted for a wide range of purposes using <i>existing</i>
data sources.</li>
                  <li>Encourage standardization and reuse of schemas by designing a language
that encourages granular reuse and composition of schemas.</li>
                  <li>Distinguish between <i>immutable</i>
and<i>mutable</i> types.
We need both, but immutable objects are more easily distributable (reference equals copying).
The only objects that
may need metadata such as change history and access control are the mutable ones. </li>
                  <li>Ensure that all objects have a simple, natural serialization to readable text.
This way, the translation to URI references will be more natural.</li>
               </ul>
               <p>We believe that these constraints follow naturally from both programming language and data
modeling experience and from the overwhelming need for both backward compatibility
and extensibility.  If we ignore  these requirements, our goal of providing a model
that can be the basis for seamless information integration will fail.</p>
               <div class="subsec1">
                  <h3>
                     <a name="sec-literals"/>Literal Data Types</h3>
                  <p>
The literal, immutable data types were chosen by combining the type systems of
XML Schema: Part 2          <b>
                        <span style="font-size:85%">
                           <a href="#xmlSchema2" name="fromxmlSchema2">[XSchema2]</a>
                        </span>
                     </b>
, the SQL99 standard          <b>
                        <span style="font-size:85%">
                           <a href="#SQL99" name="fromSQL99">[SQL99]</a>
                        </span>
                     </b>
,
and modern programming languages.
No significant explanation should be required to justify the set of literal data types shown in
the table below.
Where appropriate, a reference is provided to a standard that describes
the storage format and textual expression of each type.
The Name type is the only one of these that may need explanation.  It is an immutable sequence of
characters with an optional namespace (specified by a URI as in XML namespaces). This type
is distinguished from the mutable String type (a Sequence of characters).       </p>
                  <div class="table">
                     <h5>Table 1: Literal data types for NODAL data model</h5>
                     <table summary="Literal data types for NODAL data model" border="1" width="85%">
                        <colgroup>
                           <col/>
                           <col/>
                           <col/>
                        </colgroup>
                        <thead>
                           <tr>
                              <th>Type Name</th>
                              <th>Description</th>
                              <th>Standard</th>
                           </tr>
                        </thead>
                        <tbody>
              
                           <tr>
                              <td>Boolean</td>
                              <td>A true or false value</td>
                              <td>&#160;</td>
                           </tr>
              
                           <tr>
                              <td>Character</td>
                              <td>A single character</td>
                              <td>ISO 10646</td>
                           </tr>
              
                           <tr>
                              <td>Octet</td>
                              <td>An 8-bit unsigned integral value (0-255)</td>
                              <td>&#160;</td>
                           </tr>
              
                           <tr>
                              <td>Short</td>
                              <td>A 16-bit signed integral value</td>
                              <td>&#160;</td>
                           </tr>
              
                           <tr>
                              <td>Integer</td>
                              <td>A 32-bit signed integral value</td>
                              <td>&#160;</td>
                           </tr>
              
                           <tr>
                              <td>Long</td>
                              <td>A 64-bit signed integral value</td>
                              <td>&#160;</td>
                           </tr>
              
                           <tr>
                              <td>Float</td>
                              <td>A 32-bit floating point value</td>
                              <td>
IEEE 754                  <b>
                                    <span style="font-size:85%">
                                       <a href="#ieee754" name="fromieee754">[IEEE754]</a>
                                    </span>
                                 </b>
                
                              </td>
                           </tr>
              
                           <tr>
                              <td>Double</td>
                              <td>A 64-bit floating point value</td>
                              <td>
IEEE 754                  <b>
                                    <span style="font-size:85%">
                                       <a href="#ieee754" name="fromieee754">[IEEE754]</a>
                                    </span>
                                 </b>
                
                              </td>
                           </tr>
              
                           <tr>
                              <td>Name</td>
                              <td>An immutable character string with optional namespace</td>
                              <td>&#160;</td>
                           </tr>
              
                           <tr>
                              <td>Timestamp</td>
                              <td>A single moment in time</td>
                              <td>
ISO 8601                  <b>
                                    <span style="font-size:85%">
                                       <a href="#iso8601" name="fromiso8601">[ISO8601]</a>
                                    </span>
                                 </b>
                
                              </td>
                           </tr>
            
                        </tbody>
                     </table>
                  </div>
                  <p>One characteristic of these literal types is that their identity is completely described
by their content.  This combination of content-defined identity and immutability is usually described as
a "value" type in computer language design. Their advantages for distributed computing applications
are well known: they are inherently distributable, since all copies
are identical.</p>
               </div>
               <div class="subsec1">
                  <h3>
                     <a name="sec-nodes"/>Structured Data: Collections as Nodes</h3>
                  <p>
However, recalling the Abiteboul approach
(which actually addresses the issues of database update for structured files <b>
                        <span style="font-size:85%">
                           <a href="#abiteboul95" name="fromabiteboul95">[Abit95]</a>
                        </span>
                     </b>),
we do not wish to restrict ourselves to simply static data and structures.
To support dynamic, structured data, we then add to these literals a system of structured, modifiable
types that we refer to as <i>Nodes</i>.
We define the node types
<span style="font-family: 'Lucida Sans Unicode'">
                        <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
            
                           <mml:mi>N</mml:mi>
          
                        </mml:math>
                     </span>
such that for
<span style="font-family: 'Lucida Sans Unicode'">
                        <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
            
                           <mml:mi>t</mml:mi>
             
                           <mml:mo>&#8712;</mml:mo>
            
                           <mml:mi>N</mml:mi>
          
                        </mml:math>
                     </span>
we have           <span style="font-family: 'Lucida Sans Unicode'">
                        <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                           <mml:mi>t</mml:mi>
    
                           <mml:mo>=</mml:mo>
    
                           <mml:mfenced close="}" open="{">
      
                              <mml:mfenced>
        
                                 <mml:msub>
          
                                    <mml:mi>a</mml:mi>
          
                                    <mml:mi>i</mml:mi>
        
                                 </mml:msub>
        
                                 <mml:msub>
          
                                    <mml:mi>v</mml:mi>
          
                                    <mml:mi>i</mml:mi>
        
                                 </mml:msub>
      
                              </mml:mfenced>
    
                           </mml:mfenced>
  
                        </mml:math>
                     </span>,
a finite set of attribute/value pairs where
<span style="font-family: 'Lucida Sans Unicode'">
                        <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                           <mml:msub>
      
                              <mml:mi>a</mml:mi>
      
                              <mml:mi>i</mml:mi>
    
                           </mml:msub>
    
                           <mml:mo>&#8712;</mml:mo>
    
                           <mml:mi>A</mml:mi>
    
                           <mml:mo>&#8289;</mml:mo>
    
                           <mml:mfenced>
      
                              <mml:mi>N</mml:mi>
    
                           </mml:mfenced>
  
                        </mml:math>
                     </span>
and   <span style="font-family: 'Lucida Sans Unicode'">
                        <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                           <mml:msub>
      
                              <mml:mi>v</mml:mi>
      
                              <mml:mi>i</mml:mi>
    
                           </mml:msub>
    
                           <mml:mo>&#8712;</mml:mo>
    
                           <mml:msub>
      
                              <mml:mi>V</mml:mi>
      
                              <mml:mi>i</mml:mi>
    
                           </mml:msub>
    
                           <mml:mfenced>
      
                              <mml:mi>N</mml:mi>
    
                           </mml:mfenced>
  
                        </mml:math>
                     </span>.
Thus, for any node type   <span style="font-family: 'Lucida Sans Unicode'">
                        <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                           <mml:mi>N</mml:mi>
  
                        </mml:math>
                     </span>, we have a domain   <span style="font-family: 'Lucida Sans Unicode'">
                        <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                           <mml:mi>A</mml:mi>
    
                           <mml:mo>&#8289;</mml:mo>
    
                           <mml:mfenced>
      
                              <mml:mi>N</mml:mi>
    
                           </mml:mfenced>
  
                        </mml:math>
                     </span>
that constrains the attributes of   <span style="font-family: 'Lucida Sans Unicode'">
                        <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                           <mml:mi>t</mml:mi>
    
                           <mml:mo>&#8712;</mml:mo>
    
                           <mml:mi>N</mml:mi>
  
                        </mml:math>
                     </span>
and a domain   <span style="font-family: 'Lucida Sans Unicode'">
                        <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                           <mml:msub>
      
                              <mml:mi>V</mml:mi>
      
                              <mml:mi>i</mml:mi>
    
                           </mml:msub>
    
                           <mml:mfenced>
      
                              <mml:mi>N</mml:mi>
    
                           </mml:mfenced>
  
                        </mml:math>
                     </span> that constrains
the values   <span style="font-family: 'Lucida Sans Unicode'">
                        <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                           <mml:msub>
      
                              <mml:mi>v</mml:mi>
      
                              <mml:mi>i</mml:mi>
    
                           </mml:msub>
  
                        </mml:math>
                     </span>
that may be associated with attribute   <span style="font-family: 'Lucida Sans Unicode'">
                        <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                           <mml:msub>
      
                              <mml:mi>a</mml:mi>
      
                              <mml:mi>i</mml:mi>
    
                           </mml:msub>
    
                           <mml:mo>&#8712;</mml:mo>
    
                           <mml:mi>A</mml:mi>
    
                           <mml:mo>&#8289;</mml:mo>
    
                           <mml:mfenced>
      
                              <mml:mi>N</mml:mi>
    
                           </mml:mfenced>
  
                        </mml:math>
                     </span>.
By varying the constraints on   <span style="font-family: 'Lucida Sans Unicode'">
                        <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                           <mml:mi>A</mml:mi>
    
                           <mml:mo>&#8289;</mml:mo>
    
                           <mml:mfenced>
      
                              <mml:mi>N</mml:mi>
    
                           </mml:mfenced>
  
                        </mml:math>
                     </span>
and   <span style="font-family: 'Lucida Sans Unicode'">
                        <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                           <mml:msub>
      
                              <mml:mi>V</mml:mi>
      
                              <mml:mi>i</mml:mi>
    
                           </mml:msub>
    
                           <mml:mfenced>
      
                              <mml:mi>N</mml:mi>
    
                           </mml:mfenced>
  
                        </mml:math>
                     </span>
we can define a variety of different classes of
node types, while still maintaining this common attribute/value model (in essence, we have defined a
data type hierarchy that generalizes to Hytime's property sets <b>
                        <span style="font-size:85%">
                           <a href="#ison1920" name="fromison1920">[ISON1920]</a>
                        </span>
                     </b>
and specializes to common data type building blocks).
Below, we describe these constraints with set functions that compose new domains (node
types) using existing domains (types).
See also the UML diagram in Fig. <a href="#fig-data-model">1</a>.
</p>
                  <div class="figure">
                     <a name="fig-data-model"/>
                     <h5>Figure 1</h5>
                     <img src="eml2005iver060401.png" border="0"/>
                     <h5>[Link to <a href="eml2005iver060401.png" target="eml2005iver060401.png">open this graphic in a separate page</a>]</h5>
                     <div style="font-size:85%">
                        <p class="first">NODAL Data Model. UML inheritance diagram of basic NODAL type system.</p>
                     </div>
                  </div>
                  <div class="subsec2">
                     <h4>
                        <a name="t4-2-1"/>Map</h4>
                     <p>
The simplest of these is the map   <span style="font-family: 'Lucida Sans Unicode'">
                           <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                              <mml:mi>M</mml:mi>
    
                              <mml:mo>&#8289;</mml:mo>
    
                              <mml:mfenced>
      
                                 <mml:mi>A</mml:mi>
      
                                 <mml:mi>V</mml:mi>
    
                              </mml:mfenced>
  
                           </mml:math>
                        </span>
for two domains   <span style="font-family: 'Lucida Sans Unicode'">
                           <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                              <mml:mi>A</mml:mi>
    
                              <mml:mo>&#8834;</mml:mo>
    
                              <mml:mi>T</mml:mi>
  
                           </mml:math>
                        </span>
and   <span style="font-family: 'Lucida Sans Unicode'">
                           <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                              <mml:mi>V</mml:mi>
    
                              <mml:mo>&#8834;</mml:mo>
    
                              <mml:mi>T</mml:mi>
  
                           </mml:math>
                        </span>
whose instances associate any attribute   <span style="font-family: 'Lucida Sans Unicode'">
                           <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                              <mml:mi>a</mml:mi>
    
                              <mml:mo>&#8712;</mml:mo>
    
                              <mml:mi>A</mml:mi>
  
                           </mml:math>
                        </span>
with a value   <span style="font-family: 'Lucida Sans Unicode'">
                           <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                              <mml:mi>v</mml:mi>
    
                              <mml:mo>&#8712;</mml:mo>
    
                              <mml:mi>V</mml:mi>
  
                           </mml:math>
                        </span>.
</p>
                  </div>
                  <div class="subsec2">
                     <h4>
                        <a name="t4-2-2"/>Set</h4>
                     <p>In this formulation, a set   <span style="font-family: 'Lucida Sans Unicode'">
                           <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                              <mml:mrow>
      
                                 <mml:mi>S</mml:mi>
      
                                 <mml:mi>t</mml:mi>
    
                              </mml:mrow>
    
                              <mml:mfenced>
      
                                 <mml:mi>A</mml:mi>
    
                              </mml:mfenced>
  
                           </mml:math>
                        </span>
is a kind of map for which   <span style="font-family: 'Lucida Sans Unicode'">
                           <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                              <mml:mi>A</mml:mi>
    
                              <mml:mo>=</mml:mo>
    
                              <mml:mi>V</mml:mi>
  
                           </mml:math>
                        </span>
and
for which   <span style="font-family: 'Lucida Sans Unicode'">
                           <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                              <mml:mi>t</mml:mi>
    
                              <mml:mo>&#8712;</mml:mo>
    
                              <mml:mrow>
      
                                 <mml:mi>S</mml:mi>
      
                                 <mml:mi>t</mml:mi>
    
                              </mml:mrow>
    
                              <mml:mfenced>
      
                                 <mml:mi>A</mml:mi>
    
                              </mml:mfenced>
    
                              <mml:mo>&#8594;</mml:mo>
    
                              <mml:mfenced close=")" open="(" separators="">
      
                                 <mml:mo>&#8704;</mml:mo>
      
                                 <mml:mfenced>
        
                                    <mml:msub>
          
                                       <mml:mi>a</mml:mi>
          
                                       <mml:mi>i</mml:mi>
        
                                    </mml:msub>
        
                                    <mml:msub>
          
                                       <mml:mi>v</mml:mi>
          
                                       <mml:mi>i</mml:mi>
        
                                    </mml:msub>
      
                                 </mml:mfenced>
      
                                 <mml:mo>&#8712;</mml:mo>
      
                                 <mml:mi>t</mml:mi>
      
                                 <mml:mi>:</mml:mi>
      
                                 <mml:msub>
        
                                    <mml:mi>a</mml:mi>
        
                                    <mml:mi>i</mml:mi>
      
                                 </mml:msub>
      
                                 <mml:mo>=</mml:mo>
      
                                 <mml:msub>
        
                                    <mml:mi>v</mml:mi>
        
                                    <mml:mi>i</mml:mi>
      
                                 </mml:msub>
    
                              </mml:mfenced>
  
                           </mml:math>
                        </span>.
In other words, if we define a kind of map for which the attributes and values are always identical,
then we can use this as a set.
</p>
                  </div>
                  <div class="subsec2">
                     <h4>
                        <a name="t4-2-3"/>Sequence</h4>
                     <p>A sequence   <span style="font-family: 'Lucida Sans Unicode'">
                           <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                              <mml:mrow>
      
                                 <mml:mi>S</mml:mi>
      
                                 <mml:mi>q</mml:mi>
    
                              </mml:mrow>
    
                              <mml:mfenced>
      
                                 <mml:mi>V</mml:mi>
    
                              </mml:mfenced>
  
                           </mml:math>
                        </span>
where the attributes   <span style="font-family: 'Lucida Sans Unicode'">
                           <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                              <mml:mi>A</mml:mi>
    
                              <mml:mo>&#8289;</mml:mo>
    
                              <mml:mfenced separators="">
      
                                 <mml:mrow>
        
                                    <mml:mi>S</mml:mi>
        
                                    <mml:mi>q</mml:mi>
      
                                 </mml:mrow>
      
                                 <mml:mfenced>
        
                                    <mml:mi>V</mml:mi>
      
                                 </mml:mfenced>
    
                              </mml:mfenced>
    
                              <mml:mo>=</mml:mo>
    
                              <mml:mfenced close="]" open="[">
      
                                 <mml:mn>0</mml:mn>
      
                                 <mml:mi>...</mml:mi>
      
                                 <mml:mi>n</mml:mi>
    
                              </mml:mfenced>
  
                           </mml:math>
                        </span>
form an interval and all values are in the domain   <span style="font-family: 'Lucida Sans Unicode'">
                           <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                              <mml:mi>V</mml:mi>
    
                              <mml:mo>&#8834;</mml:mo>
    
                              <mml:mi>T</mml:mi>
  
                           </mml:math>
                        </span>.
</p>
                  </div>
                  <div class="subsec2">
                     <h4>
                        <a name="t4-2-4"/>Record</h4>
                     <p>
A record   <span style="font-family: 'Lucida Sans Unicode'">
                           <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                              <mml:mi>R</mml:mi>
    
                              <mml:mo>=</mml:mo>
    
                              <mml:mi>R</mml:mi>
    
                              <mml:mo>&#8289;</mml:mo>
    
                              <mml:mfenced>
      
                                 <mml:mi>A</mml:mi>
      
                                 <mml:mo>&#8289;</mml:mo>
      
                                 <mml:mfenced close="}" open="{">
        
                                    <mml:msub>
          
                                       <mml:mi>V</mml:mi>
          
                                       <mml:mi>i</mml:mi>
        
                                    </mml:msub>
      
                                 </mml:mfenced>
    
                              </mml:mfenced>
  
                           </mml:math>
                        </span>
is defined by
a fixed set of names   <span style="font-family: 'Lucida Sans Unicode'">
                           <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                              <mml:mi>A</mml:mi>
    
                              <mml:mo>&#8289;</mml:mo>
    
                              <mml:mfenced>
      
                                 <mml:mi>R</mml:mi>
    
                              </mml:mfenced>
    
                              <mml:mo>=</mml:mo>
    
                              <mml:mfenced close="}" open="{" separators="">
      
                                 <mml:msub>
        
                                    <mml:mi>a</mml:mi>
        
                                    <mml:mi>i</mml:mi>
      
                                 </mml:msub>
      
                                 <mml:mo>&#8712;</mml:mo>
      
                                 <mml:mi mathvariant="sans-serif">name</mml:mi>
    
                              </mml:mfenced>
  
                           </mml:math>
                        </span>
and the domains of the values associated with each name
  <span style="font-family: 'Lucida Sans Unicode'">
                           <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                              <mml:msub>
      
                                 <mml:mi>V</mml:mi>
      
                                 <mml:mi>i</mml:mi>
    
                              </mml:msub>
    
                              <mml:mfenced>
      
                                 <mml:mi>R</mml:mi>
    
                              </mml:mfenced>
    
                              <mml:mo>&#8834;</mml:mo>
    
                              <mml:mi>T</mml:mi>
  
                           </mml:math>
                        </span>.
We refer to the
names   <span style="font-family: 'Lucida Sans Unicode'">
                           <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                              <mml:msub>
      
                                 <mml:mi>a</mml:mi>
      
                                 <mml:mi>i</mml:mi>
    
                              </mml:msub>
  
                           </mml:math>
                        </span>
as <i>fields</i> of the record   <span style="font-family: 'Lucida Sans Unicode'">
                           <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                              <mml:mi>R</mml:mi>
  
                           </mml:math>
                        </span>
and the domain   <span style="font-family: 'Lucida Sans Unicode'">
                           <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                              <mml:msub>
      
                                 <mml:mi>V</mml:mi>
      
                                 <mml:mi>i</mml:mi>
    
                              </mml:msub>
    
                              <mml:mfenced>
      
                                 <mml:mi>R</mml:mi>
    
                              </mml:mfenced>
  
                           </mml:math>
                        </span>
is the <i>field type</i>
of field   <span style="font-family: 'Lucida Sans Unicode'">
                           <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                              <mml:msub>
      
                                 <mml:mi>a</mml:mi>
      
                                 <mml:mi>i</mml:mi>
    
                              </mml:msub>
  
                           </mml:math>
                        </span>
in   <span style="font-family: 'Lucida Sans Unicode'">
                           <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                              <mml:mi>R</mml:mi>
  
                           </mml:math>
                        </span>.
This is clearly compatible with
the existing relational model as outlined in
<b>
                           <span style="font-size:85%">
                              <a href="#ramadb" name="fromramadb">[Rama03]</a>
                           </span>
                        </b>, with our record mapping to a relation.
</p>
                     <p>
We further define an inheritance relationship for record types such that if
  <span style="font-family: 'Lucida Sans Unicode'">
                           <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                              <mml:mi>a</mml:mi>
    
                              <mml:mo>&#8712;</mml:mo>
    
                              <mml:mi>A</mml:mi>
    
                              <mml:mo>&#8289;</mml:mo>
    
                              <mml:mfenced separators="">
      
                                 <mml:mi>R</mml:mi>
      
                                 <mml:mi>'</mml:mi>
    
                              </mml:mfenced>
    
                              <mml:mo>&#8594;</mml:mo>
    
                              <mml:mi>a</mml:mi>
    
                              <mml:mo>&#8712;</mml:mo>
    
                              <mml:mi>A</mml:mi>
    
                              <mml:mo>&#8289;</mml:mo>
    
                              <mml:mfenced>
      
                                 <mml:mi>R</mml:mi>
    
                              </mml:mfenced>
  
                           </mml:math>
                        </span>
and
  <span style="font-family: 'Lucida Sans Unicode'">
                           <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                              <mml:mi>a</mml:mi>
    
                              <mml:mo>&#8712;</mml:mo>
    
                              <mml:mi>A</mml:mi>
    
                              <mml:mo>&#8289;</mml:mo>
    
                              <mml:mfenced separators="">
      
                                 <mml:mi>R</mml:mi>
      
                                 <mml:mi>'</mml:mi>
    
                              </mml:mfenced>
    
                              <mml:mo>&#8594;</mml:mo>
    
                              <mml:mi>V</mml:mi>
    
                              <mml:mo>&#8289;</mml:mo>
    
                              <mml:mfenced>
      
                                 <mml:mi>R</mml:mi>
      
                                 <mml:mi>a</mml:mi>
    
                              </mml:mfenced>
    
                              <mml:mo>&#8834;</mml:mo>
    
                              <mml:mi>V</mml:mi>
    
                              <mml:mo>&#8289;</mml:mo>
    
                              <mml:mfenced separators="">
      
                                 <mml:mi>R</mml:mi>
      
                                 <mml:mi>'</mml:mi>
      
                                 <mml:mi>,</mml:mi>
      
                                 <mml:mi>a</mml:mi>
    
                              </mml:mfenced>
  
                           </mml:math>
                        </span>
then we
say that   <span style="font-family: 'Lucida Sans Unicode'">
                           <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                              <mml:mi>R</mml:mi>
  
                           </mml:math>
                        </span>
is derived from   <span style="font-family: 'Lucida Sans Unicode'">
                           <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                              <mml:mi>R</mml:mi>
    
                              <mml:mi>'</mml:mi>
  
                           </mml:math>
                        </span>.
Clearly, these conditions ensure that   <span style="font-family: 'Lucida Sans Unicode'">
                           <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                              <mml:mi>R</mml:mi>
    
                              <mml:mo>&#8834;</mml:mo>
    
                              <mml:mi>R</mml:mi>
    
                              <mml:mi>'</mml:mi>
  
                           </mml:math>
                        </span>
even if   <span style="font-family: 'Lucida Sans Unicode'">
                           <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                              <mml:mi>R</mml:mi>
  
                           </mml:math>
                        </span>
has extra fields   <span style="font-family: 'Lucida Sans Unicode'">
                           <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                              <mml:mi>a</mml:mi>
    
                              <mml:mo>&#8712;</mml:mo>
    
                              <mml:mi>A</mml:mi>
    
                              <mml:mo>&#8289;</mml:mo>
    
                              <mml:mfenced>
      
                                 <mml:mi>R</mml:mi>
    
                              </mml:mfenced>
  
                           </mml:math>
                        </span>
such that
  <span style="font-family: 'Lucida Sans Unicode'">
                           <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                              <mml:mi>a</mml:mi>
    
                              <mml:mo>&#8713;</mml:mo>
    
                              <mml:mi>A</mml:mi>
    
                              <mml:mo>&#8289;</mml:mo>
    
                              <mml:mfenced separators="">
      
                                 <mml:mi>R</mml:mi>
      
                                 <mml:mi>'</mml:mi>
    
                              </mml:mfenced>
  
                           </mml:math>
                        </span>.
We consider this model to capture the kind of
data structure inheritance available in O/R systems such as PostgreSQL <b>
                           <span style="font-size:85%">
                              <a href="#postgres-datamodel" name="frompostgres-datamodel">[Post87]</a>
                           </span>
                        </b>
and object-oriented languages such as Java and C++.
</p>
                     <p>
In essence then an inherited record is a restriction of its ancestors, possibly with new fields.
To continue this inheritance as restriction model, we allow a
property's value type to be redefined in an inherited record,
as long as the newly defined type is a restriction of the inherited type.
For example, a <tt class="code">Document</tt>
record has a field <tt class="code">mime-type</tt> for the MIME-type of document that
is a Name that matches a particular regular expression.
The record type for <tt class="code">XMLDocument</tt>
includes an override of the <tt class="code">mime-type</tt> field to a fixed value: "text/xml".
Thus the Record types can be used to form an object inheritance hierarchy where kind-of
restrictions can be maintained. And example of the declaration of Record types and field
shadowing is shown in Fig. <a href="#fig-sampleSchema">2</a>
, an excerpt from the standard NODAL data
model for the basic NODAL types.
</p>
                     <div class="figure">
                        <a name="fig-sampleSchema"/>
                        <h5>Figure 2</h5>
                        <pre>

 ...
  &lt;!--
  The Document type, an encapsulation of a graph of Nodes
  --&gt;
  &lt;record name="Document"&gt;
    &lt;field name="mimeType" type="Name"/&gt;
    &lt;field name="root" type="Node"/&gt;
  &lt;/record&gt;

  &lt;!--
  The Directory type, a Document that is simply a mapping of names to
  Documents.
  --&gt;
  &lt;record name="Directory" extends="Document"&gt;
    &lt;field name="root"&gt;
      &lt;map keyType="Name" valueType="Document"/&gt;
    &lt;/field&gt;
  &lt;/record&gt;
  ...

</pre>
                        <div style="font-size:85%">
                           <p class="first">An excerpt from the <tt class="code">baseTypes.nls</tt> schema that defines the basic standard data
types in the system.  An example of type restriction by record inheritance and field shadowing is
shown, with a Directory a kind of Document that contains a mapping from Name to Document.</p>
                        </div>
                     </div>
                  </div>
                  <div class="subsec2">
                     <h4>
                        <a name="t4-2-5"/>Node Identity and Metadata</h4>
                     <p>Since the node types are modifiable (and thus not uniquely identified with their contents), we require
some sort of external identity to be able to maintain stable references to nodes.  These node IDs can
be anything unique within an identifiable context (e.g. a database table, a file, a repository).
For example, in a native NODAL repository, it is likely that we will have simple node IDs that are
unique within the entire repository.
In a traditional filesystem-based repository it is more natural to have node IDs uniquely determined
within the context of the containing document or file.
In a relational database mapping, we can simply use the primary keys of each database table as the
unique node ID.
The flexibility of this requirement should allow us to find such a system of unique IDs for any of the
different kinds of data sources we have proposed supporting within this framework.
Finally, given that these nodes are the minimal
units of modification, it is also natural to suggest that these nodes be the minimal units for recording
change history and access control.</p>
                  </div>
                  <div class="subsec2">
                     <h4>
                        <a name="t4-2-6"/>Literal Structures</h4>
                     <p>In order to support a lightweight, compound literal type, we also provide
a means of defining record-like literals, which we call a <i>structures</i>:
  <span style="font-family: 'Lucida Sans Unicode'">
                           <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                              <mml:mrow>
      
                                 <mml:mi>S</mml:mi>
      
                                 <mml:mi>t</mml:mi>
      
                                 <mml:mi>r</mml:mi>
    
                              </mml:mrow>
    
                              <mml:mfenced>
      
                                 <mml:mi>A</mml:mi>
      
                                 <mml:mo>&#8289;</mml:mo>
      
                                 <mml:mfenced close="}" open="{">
        
                                    <mml:msub>
          
                                       <mml:mi>V</mml:mi>
          
                                       <mml:mi>i</mml:mi>
        
                                    </mml:msub>
      
                                 </mml:mfenced>
    
                              </mml:mfenced>
  
                           </mml:math>
                        </span>.
Interpreted
exactly as a record type of the same form (with the additional restriction that all of the   <span style="font-family: 'Lucida Sans Unicode'">
                           <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                              <mml:msub>
      
                                 <mml:mi>V</mml:mi>
      
                                 <mml:mi>i</mml:mi>
    
                              </mml:msub>
  
                           </mml:math>
                        </span>
types
must be literals),  these are extremely useful for modelling data that have natural <i>value</i>
semantics but are still decomposable into meaningful components (e.g. RGB pixels in an image).
In these Struct types, a set of field names are defined and associated with value types in exactly
the same way as with Record types, except that the objects created are immutable and have
identity associated with their contents.</p>
                  </div>
                  <div class="subsec2">
                     <h4>
                        <a name="t4-2-7"/>Restriction Types</h4>
                     <p>
One way of specify the constraints on a particular type is to use a restriction language
to define a new type as having a limited value space with respect to an existing type.  This is a very
powerful concept and is the foundation for the XML Schema type system           <b>
                           <span style="font-size:85%">
                              <a href="#xmlSchema2" name="fromxmlSchema2">[XSchema2]</a>
                           </span>
                        </b>
and the
ISO standard type system from which it is derived           <b>
                           <span style="font-size:85%">
                              <a href="#iso11404" name="fromiso11404">[ISO11404]</a>
                           </span>
                        </b>
.
To this end, we provide just such a type <i>restriction</i> facility for atomic types based on a set of
matching functions applied to a base type.  Some of the restrictions available are:
regular expressions for Name and String types; inclusive and exclusive minima and maxima for
any ordered type; a namespace restriction for Name objects; and an enumeration list for any
atomic type (including the single-valued enumeration or fixed value).         </p>
                  </div>
               </div>
               <div class="subsec1">
                  <h3>
                     <a name="sec-documents"/>Documents and Node Graphs</h3>
                  <p>
Given these building blocks, a          <i>schema</i>
, or set of types, can be considered as a model of
the constraints on a set of interconnected, structured values.
Since this model is clearly a superset of the relational model, it can obviously be used to describe
structured data stored in a relational database.
How then is it also useful for modelling documents in a filesystem?
Simply by associating a particular document format with a root node type in some schema that models
the structure of the data contained within those documents.  In the Web-based NODAL system, this is
done by associating a MIME type         <b>
                        <span style="font-size:85%">
                           <a href="#rfc2045" name="fromrfc2045">[RFC2045]</a>
                        </span>
                     </b>
that identifies the format with a <tt class="code">DocumentFormat</tt>
class that defines the type of the root node and encoder and decoder methods that translate
between a bitstream and instances of an associated schema (see Fig.         <a href="#fig-sampleSchema">2</a>
).
A file then corresponds to
the graph of the nodes reachable from the root node.  In this way, we can integrate document and
database accesses with a common API and, given the reference architecture we describe next, a
common reference language.        </p>
                  <p>
The choice of the term Node for these collection objects should now be clear.
A document in this kind of model
consists of set of Node objects with properties that are either literal or references to other Node
objects.  These Node-Node properties can be considered to be the labelled edges of a graph
that we refer to as the         <i>document graph</i>
.  Unlike XML though, this graph is not restricted to
being a hierarchy.  Parent-child relations are one-way, although a structural query can be used
to recover the many possible parents (and document containments) of a particular Node.        </p>
               </div>
            </div>
            <div class="section">
               <h2>
                  <a name="t5"/>The NODAL Path Language</h2>
               <p>
In order to provide an external reference system for this data model, we adopt the path language
approach of XPath       <b>
                     <span style="font-size:85%">
                        <a href="#xpath" name="fromxpath">[XPath]</a>
                     </span>
                  </b>
and define URI references based on
a navigational path through a document graph.
A path   <span style="font-family: 'Lucida Sans Unicode'">
                     <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                        <mml:mi mathvariant="bold">p</mml:mi>
    
                        <mml:mo>&#8712;</mml:mo>
    
                        <mml:mi mathvariant="bold">P</mml:mi>
  
                     </mml:math>
                  </span>
in NODAL is a chain of path components   <span style="font-family: 'Lucida Sans Unicode'">
                     <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                        <mml:mi mathvariant="bold">p</mml:mi>
    
                        <mml:mo>=</mml:mo>
    
                        <mml:mfenced close="]" open="[">
      
                           <mml:msub>
        
                              <mml:mi>p</mml:mi>
        
                              <mml:mn>1</mml:mn>
      
                           </mml:msub>
      
                           <mml:mi>...</mml:mi>
      
                           <mml:msub>
        
                              <mml:mi>p</mml:mi>
        
                              <mml:mi>n</mml:mi>
      
                           </mml:msub>
    
                        </mml:mfenced>
  
                     </mml:math>
                  </span>.
Using the <i>concatenation</i> operator
<span style="font-family: 'Lucida Sans Unicode'">
                     <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                        <mml:mi mathvariant="bold">p</mml:mi>
    
                        <mml:mo>=</mml:mo>
    
                        <mml:mi mathvariant="bold">p</mml:mi>
    
                        <mml:mi>'</mml:mi>
    
                        <mml:mo>/</mml:mo>
    
                        <mml:msub>
      
                           <mml:mi>p</mml:mi>
      
                           <mml:mi>n</mml:mi>
    
                        </mml:msub>
    
                        <mml:mo>=</mml:mo>
    
                        <mml:mfenced close="]" open="[">
      
                           <mml:msub>
        
                              <mml:mi>p</mml:mi>
        
                              <mml:mn>1</mml:mn>
      
                           </mml:msub>
      
                           <mml:mi>...</mml:mi>




                           <mml:msub>

                              <mml:mi>p</mml:mi>

                              <mml:mrow>

                                 <mml:mi>n</mml:mi>

                                 <mml:mo>-</mml:mo>

                                 <mml:mn>1</mml:mn>

                              </mml:mrow>

                           </mml:msub>



    
                        </mml:mfenced>
    
                        <mml:mo>/</mml:mo>
    
                        <mml:msub>
      
                           <mml:mi>p</mml:mi>
      
                           <mml:mi>n</mml:mi>
    
                        </mml:msub>
  
                     </mml:math>
                  </span>, we can define
the <i>tail</i> of a path   <span style="font-family: 'Lucida Sans Unicode'">
                     <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                        <mml:mi mathvariant="bold">p</mml:mi>
  
                     </mml:math>
                  </span>
as the final component   <span style="font-family: 'Lucida Sans Unicode'">
                     <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                        <mml:msup>
      
                           <mml:mi mathvariant="bold">p</mml:mi>
      
                           <mml:mo>*</mml:mo>
    
                        </mml:msup>
    
                        <mml:mo>=</mml:mo>
    
                        <mml:msub>
      
                           <mml:mi>p</mml:mi>
      
                           <mml:mi>n</mml:mi>
    
                        </mml:msub>
  
                     </mml:math>
                  </span>
and the <i>parent</i> of a path   <span style="font-family: 'Lucida Sans Unicode'">
                     <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                        <mml:mi mathvariant="bold">p</mml:mi>
  
                     </mml:math>
                  </span>
as the path   <span style="font-family: 'Lucida Sans Unicode'">
                     <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                        <mml:mi mathvariant="bold">p</mml:mi>
    
                        <mml:mi>'</mml:mi>
  
                     </mml:math>
                  </span>
such that
<span style="font-family: 'Lucida Sans Unicode'">
                     <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                        <mml:mi mathvariant="bold">p</mml:mi>
    
                        <mml:mo>=</mml:mo>
    
                        <mml:mi mathvariant="bold">p</mml:mi>
    
                        <mml:mi>'</mml:mi>
    
                        <mml:mo>/</mml:mo>
    
                        <mml:msup>
      
                           <mml:mi mathvariant="bold">p</mml:mi>
      
                           <mml:mo>*</mml:mo>
    
                        </mml:msup>
  
                     </mml:math>
                  </span>.
Note that neither of these exist if   <span style="font-family: 'Lucida Sans Unicode'">
                     <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                        <mml:mi mathvariant="bold">p</mml:mi>
  
                     </mml:math>
                  </span>
is the empty path   <span style="font-family: 'Lucida Sans Unicode'">
                     <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                        <mml:mfenced close="]" open="[" separators=""/>
  
                     </mml:math>
                  </span>,
but that the parent of a single-component path is the empty path.
</p>
               <p>To interpret paths, we need some way of interpreting the path components individually and
then in sequence.  In this formulation, a path component has two aspects, its path normalization
function and its binding function.
Each of the components   <span style="font-family: 'Lucida Sans Unicode'">
                     <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                        <mml:mi>p</mml:mi>
    
                        <mml:mo>&#8712;</mml:mo>
    
                        <mml:mi>P</mml:mi>
  
                     </mml:math>
                  </span>
has a path normalization function   <span style="font-family: 'Lucida Sans Unicode'">
                     <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                        <mml:msub>
      
                           <mml:mi mathvariant="normal">N</mml:mi>
      
                           <mml:mi>p</mml:mi>
    
                        </mml:msub>
    
                        <mml:mi>:</mml:mi>
    
                        <mml:mi mathvariant="bold">P</mml:mi>
    
                        <mml:mo>&#8594;</mml:mo>
    
                        <mml:mi mathvariant="bold">P</mml:mi>
  
                     </mml:math>
                  </span>
that
takes a path and produces a <i>normalized</i> path   <span style="font-family: 'Lucida Sans Unicode'">
                     <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                        <mml:mi mathvariant="bold">p</mml:mi>
  
                     </mml:math>
                  </span>
for which
  <span style="font-family: 'Lucida Sans Unicode'">
                     <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                        <mml:mi>p</mml:mi>
    
                        <mml:mo>=</mml:mo>
    
                        <mml:msup>
      
                           <mml:mi mathvariant="bold">p</mml:mi>
      
                           <mml:mo>*</mml:mo>
    
                        </mml:msup>
    
                        <mml:mo>&#8594;</mml:mo>
    
                        <mml:msub>
      
                           <mml:mi mathvariant="normal">N</mml:mi>
      
                           <mml:mi>p</mml:mi>
    
                        </mml:msub>
    
                        <mml:mfenced separators="">
      
                           <mml:mi mathvariant="bold">p</mml:mi>
      
                           <mml:mi>'</mml:mi>
    
                        </mml:mfenced>
    
                        <mml:mo>=</mml:mo>
    
                        <mml:mi mathvariant="bold">p</mml:mi>
  
                     </mml:math>
                  </span>.
Thus, any path component   <span style="font-family: 'Lucida Sans Unicode'">
                     <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                        <mml:mi>p</mml:mi>
  
                     </mml:math>
                  </span>
that appears as the tail of a normalized path has the property
that   <span style="font-family: 'Lucida Sans Unicode'">
                     <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                        <mml:msub>
      
                           <mml:mi mathvariant="normal">N</mml:mi>
      
                           <mml:mi>p</mml:mi>
    
                        </mml:msub>
    
                        <mml:mfenced>
      
                           <mml:mi mathvariant="bold">p</mml:mi>
    
                        </mml:mfenced>
    
                        <mml:mo>=</mml:mo>
    
                        <mml:mi mathvariant="bold">p</mml:mi>
    
                        <mml:mo>/</mml:mo>
    
                        <mml:mi>p</mml:mi>
  
                     </mml:math>
                  </span>,
Thus concatenation is the standard normalizing function.
An example of a component that does not always concatenate is the
<i>parent</i> operator <tt class="code">..</tt> that extracts the parent path.
The normalizing function for the <tt class="code">parent</tt> component is
<span style="font-family: 'Lucida Sans Unicode'">
                     <mml:math display="block" style="font:Lucida Sans Unicode" overflow="scroll">
    
                        <mml:msub>
      
                           <mml:mi mathvariant="normal">N</mml:mi>
      
                           <mml:mi mathvariant="sans-serif">..</mml:mi>
    
                        </mml:msub>
    
                        <mml:mfenced>
      
                           <mml:mi mathvariant="bold">p</mml:mi>
    
                        </mml:mfenced>
    
                        <mml:mo>=</mml:mo>
    
                        <mml:mrow>
      
                           <mml:mo stretchy="true">{</mml:mo>
      
                           <mml:mtable columnalign="left" columnspacing="2em">
        
                              <mml:mtr>
          
                                 <mml:mtd>
            
                                    <mml:mfenced close="]" open="[">
              
                                       <mml:mi mathvariant="sans-serif">..</mml:mi>
            
                                    </mml:mfenced>
          
                                 </mml:mtd>
          
                                 <mml:mtd>
            
                                    <mml:mstyle mathvariant="normal">
              
                                       <mml:mi>if</mml:mi>
              
                                       <mml:mrow>
                
                                          <mml:mi mathvariant="bold">p</mml:mi>
                
                                          <mml:mo>=</mml:mo>
                
                                          <mml:mo>&#8709;</mml:mo>
              
                                       </mml:mrow>
            
                                    </mml:mstyle>
            
                                    <mml:mi>,</mml:mi>
          
                                 </mml:mtd>
        
                              </mml:mtr>
        
                              <mml:mtr>
          
                                 <mml:mtd>
            
                                    <mml:mi mathvariant="bold">p</mml:mi>
            
                                    <mml:mi>'</mml:mi>
          
                                 </mml:mtd>
          
                                 <mml:mtd>
            
                                    <mml:mi mathvariant="normal">otherwise</mml:mi>
            
                                    <mml:mi>.</mml:mi>
          
                                 </mml:mtd>
        
                              </mml:mtr>
      
                           </mml:mtable>
    
                        </mml:mrow>
  
                     </mml:math>
                  </span>
So, the parent operator can only appear as the first component of a normalized path.
</p>
               <p>But paths are defined to provide a means of accessing values within a node graph, so we
need a means to determine the target value of a path   <span style="font-family: 'Lucida Sans Unicode'">
                     <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                        <mml:msub>
      
                           <mml:mi mathvariant="normal">V</mml:mi>
      
                           <mml:mi mathvariant="bold">p</mml:mi>
    
                        </mml:msub>
  
                     </mml:math>
                  </span>.
To evaluate this target value, we consider another aspect of a
a path component, its <i>binding function</i>
  
                  <span style="font-family: 'Lucida Sans Unicode'">
                     <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                        <mml:msub>
      
                           <mml:mi mathvariant="normal">V</mml:mi>
      
                           <mml:mi>p</mml:mi>
    
                        </mml:msub>
    
                        <mml:mi>:</mml:mi>
    
                        <mml:mi mathvariant="bold">P</mml:mi>
    
                        <mml:mo>&#8594;</mml:mo>
    
                        <mml:mi>T</mml:mi>
  
                     </mml:math>
                  </span>,
which returns the value that a path with   <span style="font-family: 'Lucida Sans Unicode'">
                     <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                        <mml:mi>p</mml:mi>
  
                     </mml:math>
                  </span>
at its tail refers to.
We then define the target of a path with respect to its tail as:
<span style="font-family: 'Lucida Sans Unicode'">
                     <mml:math display="block" style="font:Lucida Sans Unicode" overflow="scroll">
    
                        <mml:msub>
      
                           <mml:mi mathvariant="normal">V</mml:mi>
      
                           <mml:mi mathvariant="bold">p</mml:mi>
    
                        </mml:msub>
    
                        <mml:mo>=</mml:mo>
    
                        <mml:msub>
      
                           <mml:mi mathvariant="normal">V</mml:mi>
      
                           <mml:msup>
        
                              <mml:mi mathvariant="bold">p</mml:mi>
        
                              <mml:mo>*</mml:mo>
      
                           </mml:msup>
    
                        </mml:msub>
    
                        <mml:mfenced>
      
                           <mml:mi mathvariant="bold">p</mml:mi>
    
                        </mml:mfenced>
    
                        <mml:mi>.</mml:mi>
  
                     </mml:math>
                  </span>
We distinguish two kinds of path components, the <i>absolute</i> components have values that
are independent of the containing path   <span style="font-family: 'Lucida Sans Unicode'">
                     <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                        <mml:mi mathvariant="bold">p</mml:mi>
  
                     </mml:math>
                  </span>, while the <i>relative</i> components have
dependent values.
A relative path is then a path that contains only relative path components,
whereas an absolute path contains at least one absolute component.
To reduce path
redundancy we require that the normalization function of every absolute path
component produce a single component path containing itself:
<span style="font-family: 'Lucida Sans Unicode'">
                     <mml:math display="block" style="font:Lucida Sans Unicode" overflow="scroll">
    
                        <mml:mi mathvariant="normal">if</mml:mi>
    
                        <mml:mi>p</mml:mi>
    
                        <mml:mstyle mathvariant="normal">
      
                           <mml:mi>is absolute then</mml:mi>
    
                        </mml:mstyle>
    
                        <mml:msub>
      
                           <mml:mi mathvariant="normal">N</mml:mi>
      
                           <mml:mi>p</mml:mi>
    
                        </mml:msub>
    
                        <mml:mfenced>
      
                           <mml:mi mathvariant="bold">p</mml:mi>
    
                        </mml:mfenced>
    
                        <mml:mo>=</mml:mo>
    
                        <mml:mfenced close="]" open="[">
      
                           <mml:mi>p</mml:mi>
    
                        </mml:mfenced>
    
                        <mml:mi>,</mml:mi>
  
                     </mml:math>
                  </span>
Thus an absolute path has exactly one absolute component at its head. Examples of some of
the available components are show in "NODAL Path Components".</p>
               <div class="table">
                  <h5>Table 2: NODAL Path Components</h5>
                  <table summary="NODAL Path Components" border="1" width="85%">
                     <colgroup>
                        <col/>
                        <col/>
                        <col/>
                        <col/>
                        <col/>
                     </colgroup>
                     <thead>
                        <tr>
                           <th>  
                              <span style="font-family: 'Lucida Sans Unicode'">
                                 <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                                    <mml:mi>p</mml:mi>
  
                                 </mml:math>
                              </span>

                           </th>
                           <th>  
                              <span style="font-family: 'Lucida Sans Unicode'">
                                 <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                                    <mml:msub>
      
                                       <mml:mi mathvariant="normal">N</mml:mi>
      
                                       <mml:mi>p</mml:mi>
    
                                    </mml:msub>
  
                                 </mml:math>
                              </span>

                           </th>
                           <th>  
                              <span style="font-family: 'Lucida Sans Unicode'">
                                 <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                                    <mml:msub>
      
                                       <mml:mi mathvariant="normal">V</mml:mi>
      
                                       <mml:mi>p</mml:mi>
    
                                    </mml:msub>
  
                                 </mml:math>
                              </span>

                           </th>
                           <th>Functional Form</th>
                           <th>Shorthand</th>
                        </tr>
                     </thead>
                     <tbody>
            
                        <tr>
                           <td>document   <span style="font-family: 'Lucida Sans Unicode'">
                                 <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                                    <mml:mi>d</mml:mi>
    
                                    <mml:mi>o</mml:mi>
    
                                    <mml:mi>c</mml:mi>
  
                                 </mml:math>
                              </span>

                           </td>
                           <td>  
                              <span style="font-family: 'Lucida Sans Unicode'">
                                 <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                                    <mml:mi mathvariant="bold">p</mml:mi>
    
                                    <mml:mo>&#8658;</mml:mo>
    
                                    <mml:mfenced close="]" open="[" separators="">
      
                                       <mml:mi>d</mml:mi>
      
                                       <mml:mi>o</mml:mi>
      
                                       <mml:mi>c</mml:mi>
    
                                    </mml:mfenced>
  
                                 </mml:math>
                              </span>

                           </td>
                           <td>  
                              <span style="font-family: 'Lucida Sans Unicode'">
                                 <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                                    <mml:msub>
      
                                       <mml:mi mathvariant="normal">V</mml:mi>
      
                                       <mml:mrow>
        
                                          <mml:mi>d</mml:mi>
        
                                          <mml:mi>o</mml:mi>
        
                                          <mml:mi>c</mml:mi>
      
                                       </mml:mrow>
    
                                    </mml:msub>
  
                                 </mml:math>
                              </span>

                           </td>
                           <td>&#160;</td>
                           <td>  
                              <span style="font-family: 'Lucida Sans Unicode'">
                                 <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                                    <mml:mi>d</mml:mi>
    
                                    <mml:mi>o</mml:mi>
    
                                    <mml:mi>c</mml:mi>
  
                                 </mml:math>
                              </span>
URI</td>
                        </tr>
            
                        <tr>
                           <td>node   <span style="font-family: 'Lucida Sans Unicode'">
                                 <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                                    <mml:mi>id</mml:mi>
  
                                 </mml:math>
                              </span>

                           </td>
                           <td>  
                              <span style="font-family: 'Lucida Sans Unicode'">
                                 <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                                    <mml:mi mathvariant="bold">p</mml:mi>
    
                                    <mml:mo>&#8658;</mml:mo>
    
                                    <mml:mfenced close="]" open="[">
      
                                       <mml:mi>id</mml:mi>
    
                                    </mml:mfenced>
  
                                 </mml:math>
                              </span>

                           </td>
                           <td>  
                              <span style="font-family: 'Lucida Sans Unicode'">
                                 <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                                    <mml:msub>
      
                                       <mml:mi mathvariant="normal">node</mml:mi>
      
                                       <mml:mi>id</mml:mi>
    
                                    </mml:msub>
  
                                 </mml:math>
                              </span>

                           </td>
                           <td>nid(  <span style="font-family: 'Lucida Sans Unicode'">
                                 <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                                    <mml:mi>id</mml:mi>
  
                                 </mml:math>
                              </span>)</td>
                           <td>&#160;</td>
                        </tr>
            
                        <tr>
                           <td>parent</td>
                           <td>  
                              <span style="font-family: 'Lucida Sans Unicode'">
                                 <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                                    <mml:mi mathvariant="bold">p</mml:mi>
    
                                    <mml:mo>&#8658;</mml:mo>
    
                                    <mml:mi mathvariant="bold">p</mml:mi>
    
                                    <mml:mi>'</mml:mi>
  
                                 </mml:math>
                              </span>

                           </td>
                           <td>none</td>
                           <td>
                              <tt class="code">parent()</tt>
                           </td>
                           <td>
                              <tt class="code">..</tt>
                           </td>
                        </tr>
            
                        <tr>
                           <td>fragment root</td>
                           <td>  
                              <span style="font-family: 'Lucida Sans Unicode'">
                                 <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                                    <mml:mfenced close="]" open="[" separators="">
      
                                       <mml:mi>d</mml:mi>
      
                                       <mml:mi>o</mml:mi>
      
                                       <mml:mi>c</mml:mi>
    
                                    </mml:mfenced>
    
                                    <mml:mo>/</mml:mo>
    
                                    <mml:mi mathvariant="bold">p</mml:mi>
    
                                    <mml:mo>&#8658;</mml:mo>
    
                                    <mml:mfenced close="]" open="[" separators="">
      
                                       <mml:mi>d</mml:mi>
      
                                       <mml:mi>o</mml:mi>
      
                                       <mml:mi>c</mml:mi>
    
                                    </mml:mfenced>
    
                                    <mml:mo>/</mml:mo>
    
                                    <mml:mi>p</mml:mi>
  
                                 </mml:math>
                              </span>

                           </td>
                           <td>  
                              <span style="font-family: 'Lucida Sans Unicode'">
                                 <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                                    <mml:msub>
      
                                       <mml:mi mathvariant="normal">V</mml:mi>
      
                                       <mml:mrow>
        
                                          <mml:mi>d</mml:mi>
        
                                          <mml:mi>o</mml:mi>
        
                                          <mml:mi>c</mml:mi>
      
                                       </mml:mrow>
    
                                    </mml:msub>
    
                                    <mml:mi>.root</mml:mi>
  
                                 </mml:math>
                              </span>

                           </td>
                           <td>
                              <tt class="code">root()</tt>
                           </td>
                           <td>
                              <tt class="code">\#/</tt>
                           </td>
                        </tr>
            
                        <tr>
                           <td>property   <span style="font-family: 'Lucida Sans Unicode'">
                                 <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                                    <mml:mi>g</mml:mi>
  
                                 </mml:math>
                              </span>

                           </td>
                           <td>  
                              <span style="font-family: 'Lucida Sans Unicode'">
                                 <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                                    <mml:mi mathvariant="bold">p</mml:mi>
    
                                    <mml:mo>&#8658;</mml:mo>
    
                                    <mml:mi mathvariant="bold">p</mml:mi>
    
                                    <mml:mo>/</mml:mo>
    
                                    <mml:mi>p</mml:mi>
  
                                 </mml:math>
                              </span>

                           </td>
                           <td>  
                              <span style="font-family: 'Lucida Sans Unicode'">
                                 <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                                    <mml:msub>
      
                                       <mml:mi mathvariant="normal">V</mml:mi>
      
                                       <mml:mi>p</mml:mi>
    
                                    </mml:msub>
    
                                    <mml:mi>.g</mml:mi>
  
                                 </mml:math>
                              </span>

                           </td>
                           <td>property
              (  <span style="font-family: 'Lucida Sans Unicode'">
                                 <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                                    <mml:mi>g</mml:mi>
  
                                 </mml:math>
                              </span>)</td>
                           <td>  
                              <span style="font-family: 'Lucida Sans Unicode'">
                                 <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                                    <mml:mi>g</mml:mi>
  
                                 </mml:math>
                              </span>

                           </td>
                        </tr>
            
                        <tr>
                           <td>range of   <span style="font-family: 'Lucida Sans Unicode'">
                                 <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                                    <mml:mi>i</mml:mi>
  
                                 </mml:math>
                              </span>
to   <span style="font-family: 'Lucida Sans Unicode'">
                                 <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                                    <mml:mi>j</mml:mi>
  
                                 </mml:math>
                              </span>

                           </td>
                           <td>  
                              <span style="font-family: 'Lucida Sans Unicode'">
                                 <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                                    <mml:mi mathvariant="bold">p</mml:mi>
    
                                    <mml:mo>&#8658;</mml:mo>
    
                                    <mml:mi mathvariant="bold">p</mml:mi>
    
                                    <mml:mo>/</mml:mo>
    
                                    <mml:mi>p</mml:mi>
  
                                 </mml:math>
                              </span>

                           </td>
                           <td>  
                              <span style="font-family: 'Lucida Sans Unicode'">
                                 <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                                    <mml:msub>
      
                                       <mml:mi mathvariant="normal">V</mml:mi>
      
                                       <mml:mi>p</mml:mi>
    
                                    </mml:msub>
    
                                    <mml:mi>. range</mml:mi>
    
                                    <mml:mfenced>
      
                                       <mml:mi>i</mml:mi>
      
                                       <mml:mi>j</mml:mi>
    
                                    </mml:mfenced>
  
                                 </mml:math>
                              </span>

                           </td>
                           <td>
                              <tt class="code">
              range(</tt>  
                              <span style="font-family: 'Lucida Sans Unicode'">
                                 <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                                    <mml:mi>i</mml:mi>
  
                                 </mml:math>
                              </span>,  <span style="font-family: 'Lucida Sans Unicode'">
                                 <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                                    <mml:mi>j</mml:mi>
  
                                 </mml:math>
                              </span>
                              <tt class="code">)
  </tt>
                           </td>
                           <td>&#160;</td>
                        </tr>
          
                     </tbody>
                  </table>
               </div>
               <p>
So far, these paths are independent of the data model outlined above.
To provide some grounding,
it will be useful to consider paths within documents.
Remember that a document is modelled as the graph of nodes reachable from a root node.
(see Sec. <a href="#sec-documents">&#8220;Documents and Node Graphs&#8221;</a>).
Thus, a reference to a document determines the starting point for navigation
within the node graph.
An absolute path thus has two parts, the document part and the fragment part. If the document part
is not empty, then the fragment part is evaluated relative to the specified document's root node.

We can now appreciate one of the main advantages of the
unification of the node/collection data model in terms of attribute/value
pairs: a homogenization of the standard component for selecting a value in a collection, namely

property(  <span style="font-family: 'Lucida Sans Unicode'">
                     <mml:math display="inline" style="font:Lucida Sans Unicode" overflow="scroll">
    
                        <mml:mi>g</mml:mi>
  
                     </mml:math>
                  </span>).

From a single absolute root path, we can create paths to all reachable nodes
and values with only chains of these <tt class="code">property</tt> components.
The property component is thus the fundamental building block of the relative reference
mechanisms in the NODAL path language.      </p>
               <p>
Finally, each path component is expressible as a function or shorthand in text,
and a path URI is simply
the concatenation of these component expressions with an appropriate separator (in the fragment
part of a path, the <tt class="code">`/'</tt> character is used as a separator). As with XPointer <b>
                     <span style="font-size:85%">
                        <a href="#xpointer" name="fromxpointer">[XPointer]</a>
                     </span>
                  </b>
fragment URIs, we use a context frame <tt class="code">\#ndl(...)</tt> to enclose NODAL fragment expressions.

Other fragment expressions are passed to the plugin responsible for the MIME type of the document addressed.
Thus, HTML and XML documents can properly handle <tt class="code">\#id</tt> fragment ids and even
<tt class="code">xpointer(...)</tt> expressions without interfering with the NODAL references.     </p>
               <p>So, given the components described in NODAL Path Components table above
(a subset of the component operators available in NODAL)
we can describe a number of NODAL path expressions as examples:</p>
               <div class="table">
                  <h5>Table 3: NODAL Path Examples</h5>
                  <table summary="NODAL Path Examples" border="1" width="85%">
                     <colgroup>
                        <col/>
                        <col/>
                     </colgroup>
                     <thead>
                        <tr>
                           <th>URI</th>
                           <th>Description</th>
                        </tr>
                     </thead>
                     <tbody>
            
                        <tr>
                           <td>
                              <tt class="code">http://sf.net/index.html\#ndl(/)</tt>
                           </td>
                           <td>The root node of the document <tt class="code">http://sf.net/index.html</tt>
                           </td>
                        </tr>
            
                        <tr>
                           <td>
                              <tt class="code">\#ndl(../foo)</tt>
                           </td>
                           <td>The property named <tt class="code">foo</tt> of the node that is the parent of the path to be applied to.</td>
                        </tr>
            
                        <tr>
                           <td>
                              <tt class="code">file:/doc.txt\#ndl(15/range(4,16))</tt>
                           </td>
                           <td>The characters between index 4 and 16 on line 15 of the local text file <tt class="code">/doc.txt</tt>
                           </td>
                        </tr>
          
                     </tbody>
                  </table>
               </div>
               <div class="subsec1">
                  <h3>
                     <a name="t5-1"/>Anchors</h3>
                  <p>
As in HTML and the Dexter Reference Model         <b>
                        <span style="font-size:85%">
                           <a href="#halasz94dexter" name="fromhalasz94dexter">[Dxtr94]</a>
                        </span>
                     </b>
,
indirect references to Nodes in other
documents or repositories are enabled by the creation of a special kind of Node, the Anchor.
An Anchor is essentially a proxy for another node, and is completely specified by a <i>path</i>.
When the Anchor is encountered, it evaluates the binding of the Anchor's path in the context of
the path <i>to</i> the Anchor (to handle relative references) and then acts as the
node bound to this path.
These anchors are thus of the style of Nelson's transclusion operators         <b>
                        <span style="font-size:85%">
                           <a href="#nelson99" name="fromnelson99">[Nel99]</a>
                        </span>
                     </b>
.
We also provide a facility (as a path operator) to interpret any String or Name as a
path URI and then extract the binding.  This is how we implement HTML-style hyperlinks.       </p>
               </div>
            </div>
            <div class="section">
               <h2>
                  <a name="t6"/>The NODAL Architecture</h2>
               <p>
This data model and path language are, of course, only useful in the context of a system to
interpret them.  The NODAL prototype is a Java middleware implementation of the data model and
path language with a small set of proof-of-concept format plugins (text, HTML, XML,
the NODAL schema language).  This prototype is currently able to interact with data access
protocols <tt class="code">file:</tt>, <tt class="code">http:</tt> and <tt class="code">imap:</tt>.  All of these provide documents as bitstreams
and thus need to pass through document decoders in the format plugins before being presented
via access APIs. (see Fig.        <a href="#fig-nodal-arch">3</a>
).      </p>
               <div class="figure">
                  <a name="fig-nodal-arch"/>
                  <h5>Figure 3</h5>
                  <img src="eml2005iver060402.png" border="0" width="100%"/>
                  <h5>[Link to <a href="eml2005iver060402.png" target="eml2005iver060402.png">open this graphic in a separate page</a>]</h5>
                  <div style="font-size:85%">
                     <p class="first">The NODAL system architecture.  Note that the API presents <i>nodal</i> database
view of the information whether it is coming in from a database or a filesystem source.  The
connection between the database and filesystem(s) is via a set of data format plugins that
encode and decode a variety of data formats.</p>
                  </div>
               </div>
            </div>
            <div class="section">
               <h2>
                  <a name="t7"/>Future Directions and Potential</h2>
               <p>We are currently testing the system in this data consumption mode
and formulating a number of pilot projects to assess the ability to
build working applications on top of the NODAL APIs.  The NODAL type system is
already implemented based on an interpretation of the data model described in the
<tt class="code">baseTypes.nls</tt> schema excerpted in Fig. <a href="#fig-sampleSchema">2</a>.
One of the most interesting possibilities is to create a personal information management
environment that can operate by building semantic indices not only to local and remote files
but also to their contents to provide granular annotation.</p>
               <p>Future work is planned on the following items:</p>
               <ul>
                  <li>Database interaction: Automatically extracting database schema and allowing the
  NODAL APIs to access relational and object database systems was one of the design goals
  and must now be implemented and tested.</li>
                  <li>Read/write functionality for all data sources: Currently we can consume and reference data
  from a wide variety of sources but can as yet only write to local file systems.</li>
                  <li>Query: It is important to provide mechanisms for data discovery that go beyond the simple
  exploratory metaphor provided by filesystem and link following.  We must be able to search data
  based on content and structure.</li>
                  <li>Versioning: As was stated above, the best unit for attaching metadata and managing
  version control is the Node.  Each node has a specific structure and a limited number of possible
  changes. We can already generate change records and associate node versions
  with each transaction.  The difficulty comes layering this functionality on top of
  inextensible data stores such as local filesystems.</li>
                  <li>Access control: If versioning is best done at the node level, then perhaps access control is
  too.</li>
                  <li>
Synchronization: Once a version management is available, then it should be possible to
  enable CVS-like           <b>
                        <span style="font-size:85%">
                           <a href="#berliner90cvs" name="fromberliner90cvs">[CVS90]</a>
                        </span>
                     </b>
synchronization between local copies and remote repositories.
  We suggest that it will be easier to automatically extract difference charts between local and remote
  modifications, since most of the node types have a very simple set of modification operators.  In fact,
  the Simias Collection Store           <b>
                        <span style="font-size:85%">
                           <a href="#ifolder-simias" name="fromifolder-simias">[Sim04]</a>
                        </span>
                     </b>
being used by the iFolder project has a very similar structure to this
  one and it is completely designed for synchronization.          </li>
               </ul>
               <p>With the NODAL data model and path language, we have demonstrated a new paradigm for
opening up <i>all</i> Web-accessible content (not just HTML and XML)
to the advantages of hypertextual information
management. We hope to extend it so that it can become a generic Data layer that can be the
foundation for a next-generation of fully interoperable, collaborative end-user applications.</p>
            </div>
            <hr class="hr"/>
            <h3>
               <i>Bibliography</i>
            </h3>
            <p>
               <b>
                  <a name="abiteboul93" href="#fromabiteboul93">[Abit93] </a>
               </b> Abiteboul, S., Cluet, S., Milo, T.:
Querying and updating the file.
In: Proceedings of the 19th International Conference on Very Large
  Data Bases, San Francisco, CA, USA, Morgan Kaufmann Publishers Inc. (1993)
  73--84</p>
            <p>
               <b>
                  <a name="abiteboul95" href="#fromabiteboul95">[Abit95] </a>
               </b> Abiteboul, S., Cluet, S., Milo, T.:
A database interface for file update.
In: SIGMOD '95: Proceedings of the 1995 ACM SIGMOD international
  conference on Management of data. Volume~24., New York, NY, USA, ACM Press
  (1995)  386--397</p>
            <p>
               <b>
                  <a name="anderson00chimera" href="#fromanderson00chimera">[Chim00] </a>
               </b> 
Anderson, K., Taylor, R., Whitehead, E.:
Chimera: Hypermedia for heterogeneous software development
  environments.
ACM Transactions on Information Systems         <b>18</b>
(2000)  211--245        </p>
            <p>
               <b>
                  <a name="berliner90cvs" href="#fromberliner90cvs">[CVS90] </a>
               </b> Berliner, B.:
CVS II: Parallelizing software development.
In: Proceedings of the USENIX Winter 1990 Technical Conference,
  Berkeley, CA, USENIX Association (1990)  341--352</p>
            <p>
               <b>
                  <a name="iverson05dkc" href="#fromiverson05dkc">[DKC05] </a>
               </b> Iverson, L.:
Data-Knowledge-Context: An Application Model for Collaborative Work.
In: Proceedings of the IEEE International Conference on Information Reuse and Integration,
  Las Vegas, NV,  (2005)</p>
            <p>
               <b>
                  <a name="halasz94dexter" href="#fromhalasz94dexter">[Dxtr94] </a>
               </b> 
Halasz, F., Schwartz, M.:
The Dexter hypertext reference model.
Communications of the ACM         <b>37</b>
(1994)  30--39        </p>
            <p>
               <b>
                  <a name="ieee754" href="#fromieee754">[IEEE754] </a>
               </b> IEEE Standard 754-1985:
Binary Floating-Point Arithmetic.
IEEE Computer Society (1985)</p>
            <p>
               <b>
                  <a name="yankelovich88intermedia" href="#fromyankelovich88intermedia">[Imed88] </a>
               </b> 
Yankelovich, N., Haan, J.B., Meyrowitz, N., Drucker, S.:
Intermedia: The concept and the construction of a seamless
  information environment.
IEEE Computer         <b>21</b>
(1988)  81--96        </p>
            <p>
               <b>
                  <a name="iso11404" href="#fromiso11404">[ISO11404] </a>
               </b> ISO/IEC 11404:1996:
Language-independent Datatypes.
International Organization for Standardization (1996)</p>
            <p>
               <b>
                  <a name="iso8601" href="#fromiso8601">[ISO8601] </a>
               </b> ISO/IEC 8601:2000:
Representations of Dates and Times.
International Organization for Standardization (2000)</p>
            <p>
               <b>
                  <a name="ison1920" href="#fromison1920">[ISON1920] </a>
               </b> ISO/IEC JTC1/SC18/WG8 N1920:1997:
Hypermedia/Time-based Structuring Language (HyTime).
International Organization for Standardization (1997)</p>
            <p>
               <b>
                  <a name="fountain90microcosm" href="#fromfountain90microcosm">[Mcsm90] </a>
               </b> Fountain, A.M., Hall, W., Heath, I., Davis, H.:
MICROCOSM: An open model for hypermedia with dynamic linking.
In: European Conference on Hypertext. (1990)  298--311</p>
            <p>
               <b>
                  <a name="nelson99" href="#fromnelson99">[Nel99] </a>
               </b> 
Nelson, T.H.:
Xanalogical structure: Needed now more than ever: Parallel documents,
  deep links to content, deep versioning, and deep re-use.
ACM Computing Surveys         <b>31</b>
(1999)        </p>
            <p>
               <b>
                  <a name="postgres-datamodel" href="#frompostgres-datamodel">[Post87] </a>
               </b> Rowe, L.A., Stonebraker, M.:
The POSTGRES data model.
In: The 13th VLDB Conference, Brighton, UK (1987)</p>
            <p>
               <b>
                  <a name="ramadb" href="#fromramadb">[Rama03] </a>
               </b> Ramakrishnan, R., Gehrke, J.:
Database Management Systems. 3rd edn.
McGraw-Hill (2003)</p>
            <p>
               <b>
                  <a name="rdf" href="#fromrdf">[RDF98] </a>
               </b> 
Lassila, O., Swick, R.:
Resource description framework (RDF) model and syntax
  specification.
The World Wide Web Consortium         <a href="http://www.w3.org/TR/WD-rdf-syntax" target="_blank">http://www.w3.org/TR/WD-rdf-syntax</a>
(1998)        </p>
            <p>
               <b>
                  <a name="rfc2045" href="#fromrfc2045">[RFC2045] </a>
               </b> 
Freed, N., Borenstein, N.:
Multipurpose Internet Mail Extensions (MIME) Part One: Format of
  Internet Message Bodies.
The Internet Society  (1996)          <a href="http://www.ietf.org/rfc/rfc2045.txt" target="_blank">http://www.ietf.org/rfc/rfc2045.txt</a>
        
            </p>
            <p>
               <b>
                  <a name="bernerslee98semantic" href="#frombernerslee98semantic">[SemWeb98] </a>
               </b> 
Berners-Lee, T.:
The semantic web roadmap.         <a href="http://www.w3.org/DesignIssues/Semantic.html" target="_blank">http://www.w3.org/DesignIssues/Semantic.html</a>
(1998)        </p>
            <p>
               <b>
                  <a name="ifolder-simias" href="#fromifolder-simias">[Sim04] </a>
               </b> 
Lasky, M.:
The Simias collection store model.
Novell Corporation          <a href="http://forge.novell.com/modules/xfmod/docman/?group_id=1372" target="_blank">http://forge.novell.com/modules/xfmod/docman/?group_id=1372</a>
(2004)        </p>
            <p>
               <b>
                  <a name="SQL99" href="#fromSQL99">[SQL99] </a>
               </b> ISO/IEC 9075:1999(E):
Information technology - Database languages - SQL.
International Organization for Standardization (1999)</p>
            <p>
               <b>
                  <a name="xlink" href="#fromxlink">[XLink] </a>
               </b> 
DeRose, S., Maler, E., Orchard, D.:
XML path language (XPath).
The World Wide Web Consortium         <a href="http://www.w3.org/TR/xpath" target="_blank">http://www.w3.org/TR/xpath</a>
(2001)        </p>
            <p>
               <b>
                  <a name="xpath" href="#fromxpath">[XPath] </a>
               </b> 
Clark, J., DeRose, S.:
XML linking language (XLink).
The World Wide Web Consortium         <a href="http://www.w3.org/TR/xlink" target="_blank">http://www.w3.org/TR/xlink</a>
(1999)        </p>
            <p>
               <b>
                  <a name="xpointer" href="#fromxpointer">[XPointer] </a>
               </b> 
DeRose, S., Maler, E., Jr., R.D.:
XML pointer language (XPointer).
The World Wide Web Consortium         <a href="http://www.w3.org/TR/WD-xptr" target="_blank">http://www.w3.org/TR/WD-xptr</a>
(2000)        </p>
            <p>
               <b>
                  <a name="xptr-req" href="#fromxptr-req">[XPtrReq] </a>
               </b> 
DeRose, S.:
XML XPointer Requirements.
The World Wide Web Consortium (1999)          <a href="http://www.w3.org/TR/NOTE-xptr-req" target="_blank">http://www.w3.org/TR/NOTE-xptr-req</a>
        
            </p>
            <p>
               <b>
                  <a name="xmlSchema2" href="#fromxmlSchema2">[XSchema2] </a>
               </b> 
Biron, P.V., Malhotra, A.:
XML Schema part 2: Datatypes.
The World Wide Web Consortium         <a href="http://www.w3.org/TR/xmlschema-2/" target="_blank">http://www.w3.org/TR/xmlschema-2/</a>
(2001)        </p>
            <p>
               <b>
                  <a name="xml-schema-req" href="#fromxml-schema-req">[XSchReq] </a>
               </b> 
Malhotra, A.,
Maloney, M.:
XML Schema Requirements.
The World Wide Web Consortium (1999)          <a href="http://www.w3.org/TR/NOTE-xml-schema-req" target="_blank">http://www.w3.org/TR/NOTE-xml-schema-req</a>
        
            </p>
            <hr class="hr"/>
            <hr class="hr"/>
            <p class="footertitle">Network-Oriented Document Abstraction Language: Structure and Reference for the Rest of the Web</p>
            <address>Lee Iverson [University of British Columbia]<br class="br"/>
               <a href="mailto:leei@ece.ubc.ca" class="mailto">leei@ece.ubc.ca</a>
            </address>
            <hr class="hr"/>
         </div>
      </div>
   </body>
</html>
