<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>18.4. ORE Model for Derived Data Packages — Metacat 2.8.1 documentation</title> <link rel="stylesheet" href="_static/bootstrap.min.css" type="text/css" /> <link rel="stylesheet" href="_static/font-awesome/css/font-awesome.min.css" type="text/css" /> <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> <link rel="stylesheet" href="_static/metacatui.css" type="text/css" /> <script type="text/javascript"> var DOCUMENTATION_OPTIONS = { URL_ROOT: './', VERSION: '2.8.1', COLLAPSE_MODINDEX: false, FILE_SUFFIX: '.html', HAS_SOURCE: true }; </script> <script type="text/javascript" src="_static/jquery.js"></script> <script type="text/javascript" src="_static/underscore.js"></script> <script type="text/javascript" src="_static/doctools.js"></script> <link rel="top" title="Metacat 2.8.1 documentation" href="index.html" /> <link rel="up" title="18. Appendix: Development Issues" href="development.html" /> <link rel="prev" title="18.3. Metacat Usage Statistics Service" href="statistics-service.html" /> </head> <body> <div id="metacatDocs"> <div class="banner"> <a href="index.html"><img class="logo" src="_static/metacat-logo-white.png" /></a> <a href="index.html"><h1 class="title">Metacat: Metadata and Data Management Server</h1></a> <img class="logo-right" src="_static/nceas-logo-white.png" /> </div> <div class="related"> <h3>Navigation</h3> <ul> <li class="right"> <span id="searchbox" style="display: none;"> <form class="search" action="search.html" method="get"> <input type="text" name="q" size="18" /> <input type="submit" value="Go" class="icon-search"/> <input type="hidden" name="check_keywords" value="yes" /> <input type="hidden" name="area" value="default" /> </form> </span> </li> <script type="text/javascript">$('#searchbox').show(0);</script> <li class="right"> <a href="genindex.html" title="General Index" accesskey="I">index</a> </li> <li class="right"> <a href="statistics-service.html" title="18.3. Metacat Usage Statistics Service" accesskey="P">previous</a> </li> <li class="breadcrumb first"><a href="index.html">Metacat 2.8.1 documentation</a> »</li> <li class="breadcrumb"><a href="development.html" accesskey="U">18. Appendix: Development Issues</a> »</li> </ul> </div> <div class="document"> <div class="documentwrapper"> <div class="bodywrapper"> <div class="body"> <div class="section" id="ore-model-for-derived-data-packages"> <h1>18.4. ORE Model for Derived Data Packages<a class="headerlink" href="#ore-model-for-derived-data-packages" title="Permalink to this headline">¶</a></h1> <span class="target" id="index-0"></span><dl class="docutils" id="index-1"> <dt>Author</dt> <dd>Lauren Walker</dd> <dt>Date</dt> <dd><ul class="first last simple"> <li>20140513 Initial draft of ORE model expansion for derived data packages</li> </ul> </dd> <dt>Goal</dt> <dd>Accurately describe the relationships of resources that are derived from other resources.</dd> <dt>Summary</dt> <dd>This proposed expansion of the Metacat ORE model uses the <a class="reference external" href="http://www.w3.org/TR/prov-overview/">PROV ontology</a> to describe the relationships between generated or derived resources and the resources used to generate them.</dd> </dl> <div class="section" id="overview"> <h2>18.4.1. Overview<a class="headerlink" href="#overview" title="Permalink to this headline">¶</a></h2> <p>There are two main concepts that are being introduced to Metacat - derived data resources and the activities that create them.</p> <p>A derived resource is defined as a entity, usually a data file, that is produced by transforming one entity into another or is the production of an activity that generates a new entity from an existing one. In Metacat, derived data could be a data table that was composed from analyzing one or more existing data tables. It could also be a visualization of another resource, such as a graph, chart, or map.</p> <p>Because derived data is the product of a transformation activity, Metacat’s ORE model will need to have the capability to store information on these activities. These activities could be a script (e.g. an R script) that is used to create a visualization from a data table or to compose a new data table from one or more existing data tables.</p> <p>These new resources will be documented by metadata, most likely EML.</p> </div> <div class="section" id="ontology-and-model"> <h2>18.4.2. Ontology and Model<a class="headerlink" href="#ontology-and-model" title="Permalink to this headline">¶</a></h2> <dl class="docutils"> <dt>The <a class="reference external" href="http://www.w3.org/TR/prov-overview/">PROV ontology</a> will be used to describe the following relationships:</dt> <dd><ul class="first last simple"> <li>Derived resources and the original resources used to create them</li> <li>Derived resources and the activities used to create them</li> </ul> </dd> </dl> <div class="figure" id="id2"> <img alt="_images/PROV-simple-diagram.png" src="_images/PROV-simple-diagram.png" /> <p class="caption"><span class="caption-text">Figure 1. A simple diagram illustrating the PROV ontology Metacat will use</span></p> </div> <p>This model will allow the original data file to remain unchanged as all assertions made about the derived data can be described in the derived data RDF.</p> <dl class="docutils"> <dt>The terms from the PROV ontology that will be introduced to Metacat to describe these relationships:</dt> <dd><ul class="first last simple"> <li><a class="reference external" href="http://www.w3.org/ns/prov#wasGeneratedBy">wasGeneratedBy</a> : Generation is the completion of production of a new entity by an activity. This entity did not exist before generation and becomes available for usage after this generation.</li> <li><a class="reference external" href="http://www.w3.org/ns/prov#generated">generated</a> : Generation is the completion of production of a new entity by an activity. This entity did not exist before generation and becomes available for usage after this generation.</li> <li><a class="reference external" href="http://www.w3.org/ns/prov#wasDerivedFrom">wasDerivedFrom</a> : A derivation is a transformation of an entity into another, an update of an entity resulting in a new one, or the construction of a new entity based on a pre-existing entity.</li> <li><a class="reference external" href="http://www.w3.org/ns/prov#used">used</a> : Usage is the beginning of utilizing an entity by an activity. Before usage, the activity had not begun to utilize this entity and could not have been affected by the entity.</li> <li><a class="reference external" href="http://www.w3.org/ns/prov#wasInformedBy">wasInformedBy</a> : Communication is the exchange of an entity by two activities, one activity using the entity generated by the other.</li> </ul> </dd> </dl> <p>The following diagram fully represents the new model for derived resources. New terms and resources are highlighted in purple.</p> <div class="figure" id="id3"> <img alt="_images/Derived-data-packages-model.png" src="_images/Derived-data-packages-model.png" /> <p class="caption"><span class="caption-text">Figure 2. The model for derived data sets with new terms highlighted in purple.</span></p> </div> </div> <div class="section" id="examples"> <h2>18.4.3. Examples<a class="headerlink" href="#examples" title="Permalink to this headline">¶</a></h2> <div class="section" id="derived-data-using-scripts"> <h3>18.4.3.1. Derived data using scripts<a class="headerlink" href="#derived-data-using-scripts" title="Permalink to this headline">¶</a></h3> <p>John Smith is a scientist who has uploaded two data tables and an EML file to a Metacat repository. His package of data is represented below.</p> <div class="figure" id="id4"> <img alt="_images/derived-data-smith-package.png" src="_images/derived-data-smith-package.png" /> <p class="caption"><span class="caption-text">Figure 3. Smith’s original data package using the ORE model Metacat has now</span></p> </div> <p>Jessica Couture is an analyst who wants to create a graph of John’s Smith data. She creates an R script that grabs the data files smith_data.1.1 and smith_data.2.1, performs some sort of analysis on them and transforms them into a single data file, couture_data.1.1. She then creates another R script to visualize this composed data into a chart. She describes her process and the data in an EML file and uploads all five files to Metacat. Below is the model that describes Couture’s new data package:</p> <div class="figure" id="id5"> <img alt="_images/Derived-data-example.png" src="_images/Derived-data-example.png" /> <p class="caption"><span class="caption-text">Figure 4. Couture’s derived data package with the existing Metacat ORE notation in blue and the new PROV notation in purple.</span></p> </div> </div> <div class="section" id="derived-data-without-scripts"> <h3>18.4.3.2. Derived data without scripts<a class="headerlink" href="#derived-data-without-scripts" title="Permalink to this headline">¶</a></h3> <p>Not all derived data will be produced from a script that can be stored in Metacat. An analyst may create a composed data table through a more manual process, such as transforming values in a spreadsheet program like MS Excel. Or a scientist may create a simple graph of their data with MS Excel or an online graphing tool.</p> <p>Let’s say John Smith decides to create a time series chart using the data from one of his data files, smith_data.1.1. He adds this image file to the original data package and edits the metadata to explain his process and the chart. His data package will essentially be using the PROV model without the activity concept. Smith has the option of creating a new data package with the image and an EML file so that his metadata ID does not have to change.</p> <div class="figure" id="id6"> <img alt="_images/PROV-simple-diagram-without-activity.png" src="_images/PROV-simple-diagram-without-activity.png" /> <p class="caption"><span class="caption-text">Figure 4. The PROV model without an activity</span></p> </div> <div class="figure" id="id7"> <img alt="_images/derived-data-smith-package-with-img.png" src="_images/derived-data-smith-package-with-img.png" /> <p class="caption"><span class="caption-text">Figure 5. Smith’s new data package with a data visualization. Note that the resource map and metadata have new revisions.</span></p> </div> </div> </div> <div class="section" id="sample-rdf"> <h2>18.4.4. Sample RDF<a class="headerlink" href="#sample-rdf" title="Permalink to this headline">¶</a></h2> <p>A sample RDF notation for our above Couture and Smith example (Figure 4) can be <a class="reference download internal" href="_downloads/resourceMap_couture.1.1.rdf"><code class="xref download docutils literal"><span class="pre">downloaded</span></code></a> or viewed below. Note that the primary data resource will need to be described in the RDFs for its derivations so that an RDF for a derived dataset will have all the information it needs to relate the primary resource to the derived resource. This way, a SparQL query can be run within a derived dataset RDF to make the assertion that derived_metadata wasDerivedFrom primary_metadata.</p> <div class="highlight-python"><div class="highlight"><pre><rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:foaf="http://xmlns.com/foaf/0.1/" xmlns:owl="http://www.w3.org/2002/07/owl#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:ore="http://www.openarchives.org/ore/terms/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:j.0="http://purl.org/spar/cito/" xmlns:prov="http://www.w3.org/ns/prov#"> <rdf:Description rdf:about="https://cn.dataone.org/cn/v1/resolve/couture_data.1.1"> <ore:isAggregatedBy>https://cn.dataone.org/cn/v1/resolve/resourceMap_couture.1.1#aggregation</ore:isAggregatedBy> <dcterms:identifier rdf:datatype="http://www.w3.org/2001/XMLSchema#string">couture_data.1.1</dcterms:identifier> <j.0:isDocumentedBy rdf:resource="https://cn.dataone.org/cn/v1/resolve/couture_metadata.1.1"/> <prov:wasGeneratedBy rdf:resource="https://cn.dataone.org/cn/v1/resolve/couture_composeScript.1.1"/> <prov:wasDerivedFrom rdf:resource="https://cn.dataone.org/cn/v1/resolve/smith_data.1.1"/> <prov:wasDerivedFrom rdf:resource="https://cn.dataone.org/cn/v1/resolve/smith_data.2.1"/> </rdf:Description> <rdf:Description rdf:about="https://cn.dataone.org/cn/v1/resolve/smith_data.1.1"> <ore:isAggregatedBy>https://cn.dataone.org/cn/v1/resolve/resourceMap_smith .1.1#aggregation</ore:isAggregatedBy> <dcterms:identifier rdf:datatype="http://www.w3.org/2001/XMLSchema#string">smith_data.1.1</dcterms:identifier> <j.0:isDocumentedBy rdf:resource="https://cn.dataone.org/cn/v1/resolve/smith_metadata.1.1"/> </rdf:Description> <rdf:Description rdf:about="https://cn.dataone.org/cn/v1/resolve/resourceMap_couture.1.1#aggregation"> <rdf:type rdf:resource="http://www.openarchives.org/ore/terms/Aggregation"/> <ore:isDescribedBy rdf:resource="https://cn.dataone.org/cn/v1/resolve/resourceMap_couture.1.1"/> <dc:title>DataONE Aggregation</dc:title> <ore:aggregates rdf:resource="https://cn.dataone.org/cn/v1/resolve/couture_data.1.1"/> <ore:aggregates rdf:resource="https://cn.dataone.org/cn/v1/resolve/couture_metadata.1.1"/> <ore:aggregates rdf:resource="https://cn.dataone.org/cn/v1/resolve/couture_img.1.1"/> <ore:aggregates rdf:resource="https://cn.dataone.org/cn/v1/resolve/couture_script.1.1"/> <ore:aggregates rdf:resource="https://cn.dataone.org/cn/v1/resolve/couture_composeScript.1.1"/> </rdf:Description> <rdf:Description rdf:nodeID="A0"> <foaf:name rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Java libclient</foaf:name> <rdf:type rdf:resource="http://purl.org/dc/terms/Agent"/> </rdf:Description> <rdf:Description rdf:about="https://cn.dataone.org/cn/v1/resolve/resourceMap_couture.1.1"> <dcterms:modified rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">2013-09-03T09:54:06.392-07:00</dcterms:modified> <ore:describes rdf:resource="https://cn.dataone.org/cn/v1/resolve/resourceMap_couture.1.1#aggregation"/> <rdf:type rdf:resource="http://www.openarchives.org/ore/terms/ResourceMap"/> <dc:creator rdf:nodeID="A0"/> <dcterms:identifier rdf:datatype="http://www.w3.org/2001/XMLSchema#string">resourceMap_couture.1.1</dcterms:identifier> </rdf:Description> <rdf:Description rdf:about="https://cn.dataone.org/cn/v1/resolve/couture_metadata.1.1"> <ore:isAggregatedBy>https://cn.dataone.org/cn/v1/resolve/resourceMap_couture.1.1#aggregation</ore:isAggregatedBy> <dcterms:identifier rdf:datatype="http://www.w3.org/2001/XMLSchema#string">couture_metadata.1.1</dcterms:identifier> <j.0:documents rdf:resource="https://cn.dataone.org/cn/v1/resolve/couture_data.1.1"/> <j.0:documents rdf:resource="https://cn.dataone.org/cn/v1/resolve/couture_img.1.1"/> <j.0:documents rdf:resource="https://cn.dataone.org/cn/v1/resolve/couture_script.1.1"/> <j.0:documents rdf:resource="https://cn.dataone.org/cn/v1/resolve/couture_composeScript.1.1"/> </rdf:Description> <rdf:Description rdf:about="https://cn.dataone.org/cn/v1/resolve/couture_img.1.1"> <ore:isAggregatedBy>https://cn.dataone.org/cn/v1/resolve/resourceMap_couture.1.1#aggregation</ore:isAggregatedBy> <dcterms:identifier rdf:datatype="http://www.w3.org/2001/XMLSchema#string">couture_img.1.1</dcterms:identifier> <j.0:isDocumentedBy rdf:resource="https://cn.dataone.org/cn/v1/resolve/couture_metadata.1.1"/> <prov:wasDerivedFrom rdf:resource="https://cn.dataone.org/cn/v1/resolve/couture_data.1.1"/> <prov:wasGeneratedBy rdf:resource="https://cn.dataone.org/cn/v1/resolve/couture_script.1.1"/> </rdf:Description> <rdf:Description rdf:about="https://cn.dataone.org/cn/v1/resolve/couture_script.1.1"> <ore:isAggregatedBy>https://cn.dataone.org/cn/v1/resolve/resourceMap_couture.1.1#aggregation</ore:isAggregatedBy> <dcterms:identifier rdf:datatype="http://www.w3.org/2001/XMLSchema#string">couture_script.1.1</dcterms:identifier> <j.0:isDocumentedBy rdf:resource="https://cn.dataone.org/cn/v1/resolve/couture_metadata.1.1"/> <prov:used rdf:resource="https://cn.dataone.org/cn/v1/resolve/couture_data.1.1"/> <prov:generated rdf:resource="https://cn.dataone.org/cn/v1/resolve/couture_img.1.1"/> <prov:wasInformedby rdf:resource="https://cn.dataone.org/cn/v1/resolve/couture_composeScript.1.1" /> </rdf:Description> <rdf:Description rdf:about="https://cn.dataone.org/cn/v1/resolve/couture_composeScript.1.1"> <ore:isAggregatedBy>https://cn.dataone.org/cn/v1/resolve/resourceMap_couture.1.1#aggregation</ore:isAggregatedBy> <dcterms:identifier rdf:datatype="http://www.w3.org/2001/XMLSchema#string">couture_composeScript.1.1</dcterms:identifier> <j.0:isDocumentedBy rdf:resource="https://cn.dataone.org/cn/v1/resolve/couture_metadata.1.1"/> <prov:used rdf:resource="https://cn.dataone.org/cn/v1/resolve/smith_data.1.1"/> <prov:used rdf:resource="https://cn.dataone.org/cn/v1/resolve/smith_data.2.1"/> <prov:generated rdf:resource="https://cn.dataone.org/cn/v1/resolve/couture_data.1.1"/> </rdf:Description> </rdf:RDF> </pre></div> </div> </div> <div class="section" id="indexing"> <h2>18.4.5. Indexing<a class="headerlink" href="#indexing" title="Permalink to this headline">¶</a></h2> <p>The Metacat Index will index some of these relationships mainly to inform MetacatUI.</p> <dl class="docutils"> <dt>New Index Fields</dt> <dd><ul class="first last simple"> <li><code class="docutils literal"><span class="pre">wasGeneratedBy</span></code></li> <li><code class="docutils literal"><span class="pre">generated</span></code></li> <li><code class="docutils literal"><span class="pre">used</span></code></li> <li><code class="docutils literal"><span class="pre">wasDerivedFrom</span></code></li> <li><code class="docutils literal"><span class="pre">wasInformedBy</span></code></li> <li><code class="docutils literal"><span class="pre">hadDerivation</span></code></li> </ul> </dd> </dl> <p>All of these fields are taken directly from the PROV ontology, except for <code class="docutils literal"><span class="pre">hadDerivation</span></code>. Because MetacatUI navigation is metadata-centric (i.e. metadata are retrieved and listed as search results and details on datasets are viewed via the metadata view [/#view]), it is helpful to use SparQL to infer relationships between metadata so that it isn’t necessary to send multiple queries to the index to retrieve information about derived datasets.</p> <p>SparQL will infer that the derived metadata wasDerivedFrom the primary source metadata and the Metacat index will index both this relationship and it’s inverse, hadDerivation, for easier querying. The SparQL query used to determine the derived metadata for a primary metadata would look like:</p> <div class="highlight-python"><div class="highlight"><pre>SELECT ?primary_metadata_pid ?derived_metadata_pid WHERE { ?primary_data ore:isDocumentedBy ?primary_metadata . ?primary_metadata dcterms:identifier ?primary_metadata_pid . ?derived_data prov:wasDerivedFrom ?primary_data . ?derived_data ore:isDocumentedBy ?derived_metadata . ?derived_metadata dcterms:identifier ?derived_metadata_pid . } </pre></div> </div> <p>More information about inverses in PROV-O and in particular, <code class="docutils literal"><span class="pre">hadDerivation</span></code>, see <a class="reference external" href="http://www.w3.org/TR/prov-o/#inverse-names">section B of the PROV documentation</a>.</p> <div class="section" id="example"> <h3>18.4.5.1. Example<a class="headerlink" href="#example" title="Permalink to this headline">¶</a></h3> <p>Using the above Couture and Smith example (Figure 4), the following fields and values from the PROV relationships would be indexed.</p> <table border="1" class="docutils"> <colgroup> <col width="28%" /> <col width="17%" /> <col width="22%" /> <col width="33%" /> </colgroup> <thead valign="bottom"> <tr class="row-odd"><th class="head">Object</th> <th class="head">Field Name</th> <th class="head">Field Type</th> <th class="head">Value</th> </tr> </thead> <tbody valign="top"> <tr class="row-even"><td>couture_metadata.1.1</td> <td>wasDerivedFrom</td> <td>string, multivalued</td> <td>smith_metadata.1.1</td> </tr> <tr class="row-odd"><td>smith_metadata.1.1</td> <td>hadDerivation</td> <td>string, multivalued</td> <td>couture_metadata.1.1</td> </tr> <tr class="row-even"><td>couture_img.1.1</td> <td>wasGeneratedby</td> <td>string, multivalued</td> <td>couture_script.1.1</td> </tr> <tr class="row-odd"><td>couture_img.1.1</td> <td>wasDerivedFrom</td> <td>string, multivalued</td> <td>couture_data.1.1</td> </tr> <tr class="row-even"><td>couture_script.1.1</td> <td>used</td> <td>string, multivalued</td> <td>couture_data.1.1</td> </tr> <tr class="row-odd"><td>couture_script.1.1</td> <td>wasInformedBy</td> <td>string, multivalued</td> <td>couture_composeScript.1.1</td> </tr> <tr class="row-even"><td>couture_script.1.1</td> <td>generated</td> <td>string, multivalued</td> <td>couture_img.1.1</td> </tr> <tr class="row-odd"><td>couture_data.1.1</td> <td>wasGeneratedBy</td> <td>string, multivalued</td> <td>couture_composeScript.1.1</td> </tr> <tr class="row-even"><td>couture_data.1.1</td> <td>wasDerivedFrom</td> <td>string, multivalued</td> <td>smith_data.1.1, smith_data.2.1</td> </tr> <tr class="row-odd"><td>couture_composeScript.1.1</td> <td>used</td> <td>string, multivalued</td> <td>smith_data.1.1, smith_data.2.1</td> </tr> <tr class="row-even"><td>couture_composeScript.1.1</td> <td>generated</td> <td>string, multivalued</td> <td>couture_data.1.1</td> </tr> </tbody> </table> </div> <div class="section" id="queries"> <h3>18.4.5.2. Queries<a class="headerlink" href="#queries" title="Permalink to this headline">¶</a></h3> <p>These indexed fields will be used primarily by MetacatUI to determine relationships between resources. An example use case is the MetacatUI metadata view (/#view/{pid}). When a user navigates to the metadata view for a primary resource, such as smith_metadata.1.1 from the above example, MetacatUI can send a query to the index to look for derived resources that the user might be interested in. Some pseduocode to describe this logic:</p> <div class="highlight-python"><div class="highlight"><pre>if(this_metadata.hadDerivation){ hadDerivation = this_metadata.hadDerivation; sendQuery("q=isDocumentedBy:" + hadDerivation + "+-obsoletedBy:*&fl=id"); } </pre></div> </div> <p>This query would retrieve the IDs of objects which are documented by metadata that is derived from the metadata currently being viewed. In the above Amith and Couture example (Figure 4), the following IDs would be returned from this query:</p> <ul class="simple"> <li><code class="docutils literal"><span class="pre">couture_composeScript.1.1</span></code></li> <li><code class="docutils literal"><span class="pre">couture_script.1.1</span></code></li> <li><code class="docutils literal"><span class="pre">couture_data.1.1</span></code></li> <li><code class="docutils literal"><span class="pre">couture_img.1.1</span></code></li> </ul> </div> </div> </div> </div> </div> </div> <div class="clearer"></div> </div> <div class="footer"> <div class="footerNav"> <div class="related"> <h3>Navigation</h3> <ul> <li class="right"> <span id="searchbox" style="display: none;"> <form class="search" action="search.html" method="get"> <input type="text" name="q" size="18" /> <input type="submit" value="Go" class="icon-search"/> <input type="hidden" name="check_keywords" value="yes" /> <input type="hidden" name="area" value="default" /> </form> </span> </li> <script type="text/javascript">$('#searchbox').show(0);</script> <li class="right"> <a href="genindex.html" title="General Index" >index</a> </li> <li class="right"> <a href="statistics-service.html" title="18.3. Metacat Usage Statistics Service" >previous</a> </li> <li class="breadcrumb first"><a href="index.html">Metacat 2.8.1 documentation</a> »</li> <li class="breadcrumb"><a href="development.html" >18. Appendix: Development Issues</a> »</li> </ul> </div> </div> <div class="small-print"> © Copyright 2012, Regents of the University of California. Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.3.1. </div> </div> </div> </body> </html>