Sophie

Sophie

distrib > Fedora > 14 > x86_64 > media > updates > by-pkgid > 71d40963b505df4524269198e237b3e3 > files > 977

virtuoso-opensource-doc-6.1.4-2.fc14.noarch.rpm

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
 <head profile="http://internetalchemy.org/2003/02/profile">
  <link rel="foaf" type="application/rdf+xml" title="FOAF" href="http://www.openlinksw.com/dataspace/uda/about.rdf" />
  <link rel="schema.dc" href="http://purl.org/dc/elements/1.1/" />
  <meta name="dc.title" content="14. RDF Data Access and Data Management" />
  <meta name="dc.subject" content="14. RDF Data Access and Data Management" />
  <meta name="dc.creator" content="OpenLink Software Documentation Team ;&#10;" />
  <meta name="dc.copyright" content="OpenLink Software, 1999 - 2009" />
  <link rel="top" href="index.html" title="OpenLink Virtuoso Universal Server: Documentation" />
  <link rel="search" href="/doc/adv_search.vspx" title="Search OpenLink Virtuoso Universal Server: Documentation" />
  <link rel="parent" href="rdfandsparql.html" title="Chapter Contents" />
  <link rel="prev" href="virtuosospongerfacetinstall.html" title="Virtuoso Faceted Browser Installation and configuration" />
  <link rel="next" href="rdfiridereferencing.html" title="Linked Data" />
  <link rel="shortcut icon" href="../images/misc/favicon.ico" type="image/x-icon" />
  <link rel="stylesheet" type="text/css" href="doc.css" />
  <link rel="stylesheet" type="text/css" href="/doc/translation.css" />
  <title>14. RDF Data Access and Data Management</title>
  <meta http-equiv="Content-Type" content="text/xhtml; charset=UTF-8" />
  <meta name="author" content="OpenLink Software Documentation Team ;&#10;" />
  <meta name="copyright" content="OpenLink Software, 1999 - 2009" />
  <meta name="keywords" content="" />
  <meta name="GENERATOR" content="OpenLink XSLT Team" />
 </head>
 <body>
  <div id="header">
    <a name="virtuosospongerfacent" />
    <img src="../images/misc/logo.jpg" alt="" />
    <h1>14. RDF Data Access and Data Management</h1>
  </div>
  <div id="navbartop">
   <div>
      <a class="link" href="rdfandsparql.html">Chapter Contents</a> | <a class="link" href="virtuosospongerfacetinstall.html" title="Virtuoso Faceted Browser Installation and configuration">Prev</a> | <a class="link" href="rdfiridereferencing.html" title="Linked Data">Next</a>
   </div>
  </div>
  <div id="currenttoc">
   <form method="post" action="/doc/adv_search.vspx">
    <div class="search">Keyword Search: <br />
        <input type="text" name="q" /> <input type="submit" name="go" value="Go" />
    </div>
   </form>
   <div>
      <a href="http://www.openlinksw.com/">www.openlinksw.com</a>
   </div>
   <div>
      <a href="http://docs.openlinksw.com/">docs.openlinksw.com</a>
   </div>
    <br />
   <div>
      <a href="index.html">Book Home</a>
   </div>
    <br />
   <div>
      <a href="contents.html">Contents</a>
   </div>
   <div>
      <a href="preface.html">Preface</a>
   </div>
    <br />
   <div class="selected">
      <a href="rdfandsparql.html">RDF Data Access and Data Management</a>
   </div>
    <br />
   <div>
      <a href="rdfdatarepresentation.html">Data Representation</a>
   </div>
   <div>
      <a href="rdfsparql.html">SPARQL</a>
   </div>
   <div>
      <a href="sparqlextensions.html">Extensions</a>
   </div>
   <div>
      <a href="rdfgraphsecurity.html">RDF Graphs Security</a>
   </div>
   <div>
      <a href="rdfviews.html">Linked Data Views over RDBMS Data Source</a>
   </div>
   <div>
      <a href="rdfrdfviewgnr.html">Automated Generation of RDF Views over Relational Data Sources</a>
   </div>
   <div>
      <a href="rdfviewsenterpr.html">Examples of Linked Data Views</a>
   </div>
   <div>
      <a href="rdfinsertmethods.html">RDF Insert Methods in Virtuoso</a>
   </div>
   <div>
      <a href="virtuososponger.html">RDFizer Middleware (Sponger)</a>
   </div>
   <div>
      <a href="virtuosospongerfacetinstall.html">Virtuoso Faceted Browser Installation and configuration</a>
   </div>
   <div class="selected">
      <a href="virtuosospongerfacent.html">Virtuoso Faceted Web Service</a>
    <div>
        <a href="#virtuosospongerfacentcust" title="Customizing">Customizing</a>
        <a href="#virtuosospongerfacentexamples" title="Examples">Examples</a>
        <a href="#virtuosospongerfacentui" title="WebService Interface">WebService Interface</a>
    </div>
   </div>
   <div>
      <a href="rdfiridereferencing.html">Linked Data</a>
   </div>
   <div>
      <a href="rdfsparqlrule.html">Inference Rules &amp; Reasoning</a>
   </div>
   <div>
      <a href="rdfsparqlgeospat.html">RDF and Geometry</a>
   </div>
   <div>
      <a href="rdfperformancetuning.html">RDF Performance Tuning</a>
   </div>
   <div>
      <a href="rdfnativestorageproviders.html">RDF Data Access Providers (Drivers)</a>
   </div>
   <div>
      <a href="rdfgraphreplication.html">RDF Graph Replication</a>
   </div>
    <br />
  </div>
  <div id="text">
<a name="virtuosospongerfacent" />
    <h2>14.11. Virtuoso Faceted Web Service</h2>
<p>The Virtuoso Faceted web service is a general purpose RDF query facility for facet based browsing.
It takes an XML description of the view desired and generates the reply as an XML tree containing the
requested data. The user agent or a local web page can use XSLT for rendering this for the end user.
The selection of facets and values is represented as an XML tree. The rationale for this is the fact
that such a representation is easier to process in an application than the SPARQL source text or a
parse tree of SPARQL and more compactly captures the specific subset of SPARQL needed for faceted
browsing. The web service returns the SPARQL source text also, thus this can serve as a basis for
and-crafted queries.</p>
<p>The top element of the tree is &lt;query&gt;, it must be in namespace
&quot;http://openlinksw.com/services/facets/1.0/&quot;.</p>
<p>This has the following attributes:</p>
<ul>
  <li>graph=&quot;graph_iri&quot; - default is search in all graphs but system defaults may override this</li>
  <li>timeout=&quot;no_of_msec&quot; - default is no timeout, but system defaults may override this</li>
  <li>inference=&quot;name&quot; where name is a name of an inference context declared with rdfs_rule_set.</li>
  <li>same-as=&quot;boolean&quot; - If &quot;boolean&quot; is &quot;yes&quot;, then owl:sameAs links will be considered in the query evaluation.</li>
</ul>
<p>The result is a tree of the form:</p>
<div>
      <pre class="programlisting">
&lt;facets xmlns=&quot;http://openlinksw.com/services/facets/1.0/&quot;&gt;
&lt;result&gt;&lt;row&gt;&lt;column datatype=&quot;...&quot; shortform=&quot;...&quot; xml:lang=&quot;..&quot;&gt;...&lt;/column&gt;&lt;/row&gt;&lt;/result&gt;
&lt;time&gt;msecs&lt;/time&gt;
&lt;complete&gt;yes or no&lt;/complete&gt;
&lt;db-activity&gt;resource use string&lt;/db-activity&gt;
&lt;sparql&gt;sparql statement text&lt;/sparql&gt;
&lt;/facets&gt;
</pre>
    </div>
<p>By convention, the first column is the subject selected by the view element, typically a URI, the second a label of the URI
and the third, if present, is either a count or a search summary.</p>
<p>The first column&#39;s text child is the text form of the value. The column element has the following attributes
qualifying this further:</p>
        <ul>
  <li>datatype - The xsd type of the value. If this is a URI, the datatype is &quot;uri&quot; </li>
  <li>shortform - If the value is a URI, this is an abbreviated form where known namespaces are replaced with
their prefixes and very long URI&#39;s are truncated preserving start and end. </li>
  <li>xml:lang - if the value is a language tagged string, this is the language</li>
        </ul>
<p>The query has the top level element &lt;query&gt;. The child elements of this represent conditions
pertaining to a single subject. A join is expressed with the property or property-of element. This has
in turn children which state conditions on a property of the first subject. property and property-of
elements can be nested to an arbitrary depth and many can occur inside one containing element. In this way,
tree-shaped structures of joins can be expressed.</p>
<p>Expressing more complex relationships, such as intermediate grouping, subqueries, arithmetic or
such requires writing the query in SPARQL. The XML format is a shorthand for easy automatic composition
of queries needed for showing facets, not a replacement for SPARQL.</p>
<p>A facet query contains a single view element. This specifies which subject of the joined
subjects is shown. Its attributes specify the manner of viewing, e.g. list of distinct values, distinct
values with occurrence counts, properties or classes of the selected subjects etc.</p>
<p>The top query element or any property or property-of element can have the following types of children:</p>
<div>
      <pre class="programlisting">
&lt;text property=&quot;iri&quot;&gt;text pattern&lt;/text&gt;
</pre>
    </div>
<p>The subject has an O that matches the text pattern. If property is given, the text pattern must
occur in a value of this property. If not specified, any property will do. The value &quot;none&quot; for property
is the same as not specifying a property. This is restricted to occurring directly under the top level
query element.</p>
<div>
      <pre class="programlisting">
&lt;class iri=&quot;iri&quot; inference=&quot;ctx_name&quot; /&gt;
</pre>
    </div>
<p>The S must be an instance of this class. If inference is specified then option (input:inference
&quot;ctx_name&quot; is added and applies to this pattern alone.</p>
<div>
      <pre class="programlisting">
&lt;property iri=&quot;iri&quot; same_as=&quot;yes&quot; inference=&quot;ctx_name&quot;&gt;</pre>
    </div>
<p>The child elements of this are conditions that apply to the value of this property of the S that
is in scope in the enclosing &lt;query&gt; or &lt;property&gt; element. If same_as is present, then
option (input:same-as &quot;yes&quot;) is added to the triple pattern which specifies this property. If inference
is present, then option (input:inference &quot;ctx_name&quot;) is added to the triple pattern for the property.</p>
<div>
      <pre class="programlisting">
&lt;property-of iri=&quot;iri&quot; same_as=&quot;yes&quot; inference=&quot;ctx_name&quot; &gt;
</pre>
    </div>
<p>The child elements of this are conditions that apply to an S which has property &quot;iri&quot; whose object
is the S in scope in the enclosing &lt;query&gt; or &lt;property&gt; element. The options are otherwise
the same as with property.</p>
<div>
      <pre class="programlisting">
&lt;value datatype=&quot;type&quot; xml:lang=&quot;lng&quot; op=&quot;= | &lt; | &gt; | &gt;= | &lt;=&quot;&gt;value &lt;/value&gt;
</pre>
    </div>
<p>When this occurs inside &lt;property&gt; or &lt;property-of&gt; this means that the property in
scope has the specified relation to the value. type and language can be used for XML typed or language
tagged literals. The &quot;uri&quot; type means that the value is a qualified name of a URI. If this occurs
directly under the &lt;query&gt; element, this means that the query starts with a fixed subject.
If this is so, then there must be property or propertyof elements or the view element must specify
properties or classes, list is not allowed as a view type. This is so because the query must have
at least one triple pattern.</p>
<div>
      <pre class="programlisting">
&lt;view type=&quot;view&quot; limit=&quot;n&quot; offset=&quot;n&quot; &gt;
</pre>
    </div>
<p>This may occur once inside a &lt;query&gt; element but may occur either at top level or inside
property or property-of elements. This specifies what which subject is presented in the result set.</p>
<p>The type can be:</p>
    <ul>
  <li>&quot;properties&quot;
<div>
          <pre class="programlisting">
SPARQL
SELECT ?p count (*) { ?this_s ?p ?any_o ...}
GROUP BY ?p
ORDER BY DESC 2
LIMIT l OFFSET 0
</pre>
        </div>
  </li>
  <li>&quot;properties-in&quot;
<div>
          <pre class="programlisting">
SPARQL
SELECT ?p count (*) { ?any_s ?p ?this_s ... }
GROUP BY ?p
ORDER BY DESC 2
LIMIT L OFFSET 0
</pre>
        </div>
  </li>
  <li>&quot;classes&quot;
<div>
          <pre class="programlisting">
SPARQL
SELECT ?c count (*)
WHERE { ?xx a ?c ... }
GROUP BY ?c
ORDER BY DESC 2
LIMIT l OFFSET 0
</pre>
        </div>
  </li>
  <li>&quot;text&quot;
<div>
          <pre class="programlisting">
SPARQL
SELECT DISTINCT ?s (bif:search_excerpt (sql:search_terms (&quot;&quot;pattern&quot;), ?o)) ...
LIMIT l OFFSET 0
</pre>
        </div>
  </li>
  <li>&quot;list&quot;
<div>
          <pre class="programlisting">
SPARQL
SELECT DISTINCT ?s long::sql:fct_label (?s) ...
LIMIT l OFFSET 0
</pre>
        </div>
  </li>
  <li />
  <li>&quot;list-count&quot;
<div>
          <pre class="programlisting">
SPARQL
SELECT ?s COUNT (*) ....
GROUP BY ?s
ORDER BY DESC 2
</pre>
        </div>
  </li>
  <li>&quot;alphabet&quot;
<div>
          <pre class="programlisting">
SPARQL
SELECT (sql:subseq (?s, 0, 1)) count (*) ...
GROUP BY (sql:subseq (?s, 0, 1))
ORDER BY 1
</pre>
        </div>
  </li>
  <li>&quot;geo&quot;
<div>
          <pre class="programlisting">
SPARQL
SELECT DISTINCT ?lat ?long ?s
WHERE ?s geo:lat ?lat . ?s geo:long ?long . ... }
</pre>
        </div>
  </li>
  <li>&quot;years&quot;
<div>
          <pre class="programlisting">
SPARQL
SELECT sql::year (?s) count (*) ...
GROUP BY (bif:year (?s))
ORDER BY 1
OFFSET 0 LIMIT l
</pre>
        </div>
  </li>
  <li>&quot;months&quot;
<div>
          <pre class="programlisting">
SPARQL
SELECT sql::round_month (?s) count (*) ...
GROUP BY (sql:round_month (?s))
ORDER BY 1 OFFSET 0 LIMIT l
</pre>
        </div>
  </li>
  <li>&quot;weeks&quot;
<div>
          <pre class="programlisting">
SPARQL
SELECT sql::round_week (?s) COUNT (*) ...
GROUP BY (sql:round_week (?s))
ORDER BY 1 OFFSET 0 LIMIT l
</pre>
        </div>
  </li>
  <li>&quot;describe&quot;
<div>
          <pre class="programlisting">
SPARQL describe ?s ... OFFSET 0 LIMIT l
</pre>
        </div>
  </li>
    </ul>

  <a name="virtuosospongerfacentcust" />
    <h3>14.11.1. Customizing</h3>
  <p>The following types of customization will be generally useful:</p>
  <ul>
    <li>Resource accounting and limitations, managing access and login</li>
    <li>Localization, choice of labels shown with class/property/instance URI&#39;s</li>
    <li>Adding types of views, for example timelines, map or business graphics </li>
    <li>Controlling navigation, for example choosing what type of view is initially presented when opening a given property.</li>
    <li>Page layout, captions, help texts, etc.</li>
  </ul>
  <p>The source code is divided in two SQL files and a number of XSLT sheets. The file facet.sql has the code for the web service. The
facet_view.sql file contains the procedures for the sample HTML interface.</p>
<br />

  <a name="virtuosospongerfacentexamples" />
    <h3>14.11.2. Examples</h3>
<p>Note: in all examples the default namespace xmlns=&quot;http://openlinksw.com/services/facets/1.0/&quot; is omitted for brevity.</p>
<p>For people called Mike:</p>
<div>
      <pre class="programlisting">
&lt;query&gt;
  &lt;text&gt;Mike&lt;/text&gt;
  &lt;view type=&quot;text&quot;/&gt;
&lt;/query&gt;
</pre>
    </div>
<p>To open the list of people who Mike knows:</p>
<div>
      <pre class="programlisting">
&lt;query&gt;
  &lt;text&gt;Mike&lt;/text&gt;
  &lt;view type=&quot;properties&quot;/&gt;
&lt;/query&gt;
</pre>
    </div>
<p>To show the list of subjects Mike knows:</p>
<div>
      <pre class="programlisting">
&lt;query&gt;
  &lt;text&gt;Mike&lt;/text&gt;
  &lt;property iri=&quot;foaf:knows&gt;
    &lt;view type=&quot;list&quot; /&gt;
  &lt;/property&gt;
&lt;/query&gt;
</pre>
    </div>
<p>To show the properties of people Mike knows:</p>
<div>
      <pre class="programlisting">
&lt;query&gt;
  &lt;text&gt;Mike&lt;/text&gt;
  &lt;property iri=&quot;foaf:knows&gt;
    &lt;view type=&quot;properties&quot; /&gt;
  &lt;/property&gt;
&lt;/query&gt;
</pre>
    </div>
<p>To show the names:</p>
<div>
      <pre class="programlisting">
&lt;query&gt;
  &lt;text&gt;Mike&lt;/text&gt;
  &lt;property iri=&quot;foaf:knows&gt;
    &lt;property iri=&quot;foaf:name&gt;
      &lt;view type=&quot;list&quot; /&gt;
    &lt;/property&gt;
  &lt;/property&gt;
&lt;/query&gt;
</pre>
    </div>
<p>To specify one named Joe:</p>
<div>
      <pre class="programlisting">
&lt;query&gt;
  &lt;text&gt;Mike&lt;/text&gt;
  &lt;property iri=&quot;foaf:knows&gt;
     &lt;property iri=&quot;foaf:name&gt;
        &lt;value&gt;Joe&lt;/value&gt;
     &lt;/property&gt;
    &lt;view type=&quot;properties&quot; /&gt;
  &lt;/property&gt;
&lt;/query&gt;
</pre>
    </div>
<p>This lists the properties of the friends of Mike that are called Joe.</p>
<p>To show the Mikes that know a Joe, one would change the shown variable in the navigation and get:</p>
<div>
      <pre class="programlisting">
&lt;query&gt;
  &lt;text&gt;Mike&lt;/text&gt;
  &lt;property iri=&quot;foaf:knows&gt;
    &lt;property iri=&quot;foaf:name&gt;
      &lt;value&gt;Joe&lt;/value&gt;
    &lt;/property&gt;
   &lt;/property&gt;
   &lt;view type=&quot;text&quot; /&gt;
&lt;/query&gt;
</pre>
    </div>
<p>This would be the search summaries of subjects with Mike in some field that know a subject with name Joe.</p>
<p>Now to specify that Mike must be a member of a discussion board:</p>
<div>
      <pre class="programlisting">
&lt;query&gt;
  &lt;text&gt;Mike&lt;/text&gt;
  &lt;property iri=&quot;foaf:knows&gt;
    &lt;property iri=&quot;foaf:name&gt;
     &lt;value&gt;Joe&lt;/value&gt;
   &lt;/property&gt;
  &lt;/property&gt;
  &lt;view type=&quot;property-in&quot; /&gt;
&lt;/query&gt;
</pre>
    </div>
<p>This lists the properties of triples whom object is Mike. Pick sioc:member_of</p>
<div>
      <pre class="programlisting">
&lt;query&gt;
  &lt;text&gt;Mike&lt;/text&gt;
  &lt;property iri=&quot;foaf:knows&gt;
    &lt;property iri=&quot;foaf:name&gt;
      &lt;value&gt;Joe&lt;/value&gt;
    &lt;/property&gt;
  &lt;/property&gt;
  &lt;property-of iri=&quot;sioc:member_of&gt;
    &lt;view type=&quot;list&quot; /&gt;
  &lt;/property-of&gt;
&lt;/query&gt;
</pre>
    </div>
<p>This would show things where Mike is a member. To specify that the thing must be a forum:</p>
<div>
      <pre class="programlisting">
&lt;query&gt;
  &lt;text&gt;Mike&lt;/text&gt;
  &lt;property iri=&quot;foaf:knows&gt;
    &lt;property iri=&quot;foaf:name&gt;
      &lt;value&gt;Joe&lt;/value&gt;
    &lt;/property&gt;
  &lt;/property&gt;
  &lt;property-of iri=&quot;sioc:member_of&gt;
    &lt;view type=&quot;classes&quot; /&gt;
  &lt;/property-of&gt;
&lt;/query&gt;
</pre>
    </div>
<p>This shows classes of things where Mike is a member Clicking on sioc:Forum gives:</p>
<div>
      <pre class="programlisting">
&lt;query&gt;
  &lt;text&gt;Mike&lt;/text&gt;
  &lt;property iri=&quot;foaf:knows&gt;
    &lt;property iri=&quot;foaf:name&gt;
      &lt;value&gt;Joe&lt;/value&gt;
    &lt;/property&gt;
  &lt;/property&gt;
  &lt;property-of iri=&quot;sioc:member_of&gt;
    &lt;class iri=&quot;sioc:Forum&quot; /&gt;
    &lt;view type=&quot;classes&quot;/&gt;
  &lt;/property-of&gt;
&lt;/query&gt;
</pre>
    </div>
<p>The view stays with classes, but now scoped
to the classes of things where Mike is a member that are instances of sioc:Forum.</p>
<p>To go look at the list of Mikes with the added
restriction, click the shown variable in the navigation and set it to s1.</p>
<div>
      <pre class="programlisting">
&lt;query&gt;
  &lt;text&gt;Mike&lt;/text&gt;
  &lt;property iri=&quot;foaf:knows&gt;
    &lt;property iri=&quot;foaf:name&gt;
      &lt;value&gt;Joe&lt;/value&gt;
    &lt;/property&gt;
  &lt;/property&gt;
  &lt;property-of iri=&quot;sioc:member_of&gt;
   &lt;class iri=&quot;sioc:Forum&quot; /&gt;
  &lt;/property-of&gt;
  &lt;view type=&quot;list&quot;/&gt;
&lt;/query&gt;
</pre>
    </div>
<p>To say that Joe must also have a geekCode, One clicks the shown variable and sets it to s2 and the view to properties.</p>
<div>
      <pre class="programlisting">
&lt;query&gt;
  &lt;text&gt;Mike&lt;/text&gt;
  &lt;property iri=&quot;foaf:knows&gt;
    &lt;property iri=&quot;foaf:name&gt;
      &lt;value&gt;Joe&lt;/value&gt;
    &lt;/property&gt;
    &lt;view type=&quot;properties&quot;/&gt;
  &lt;/property&gt;
  &lt;property-of iri=&quot;sioc:member_of&gt;
    &lt;class iri=&quot;sioc:Forum&quot; /&gt;
   &lt;/property-of&gt;
&lt;/query&gt;
</pre>
    </div>
<p>Pick geekCode</p>
<div>
      <pre class="programlisting">
&lt;query&gt;
  &lt;text&gt;Mike&lt;/text&gt;
  &lt;property iri=&quot;foaf:knows&gt;
    &lt;property iri=&quot;foaf:name&gt;
      &lt;value&gt;Joe&lt;/value&gt;
    &lt;/property&gt;
    &lt;property iri=&quot;geekCode&quot;&gt;
      &lt;view type=&quot;list&quot;/&gt;
    &lt;/property&gt;
  &lt;/property&gt;
  &lt;property-of iri=&quot;sioc:member_of&gt;
    &lt;class iri=&quot;sioc:Forum&quot; /&gt;
  &lt;/property-of&gt;
&lt;/query&gt;
</pre>
    </div>
<p>We specify no restriction on the geekCode. Click the shown variable to take the focus back to Mike.</p>
<div>
      <pre class="programlisting">
&lt;query&gt;
  &lt;text&gt;Mike&lt;/text&gt;
  &lt;property iri=&quot;foaf:knows&gt;
    &lt;property iri=&quot;foaf:name&gt;
      &lt;value&gt;Joe&lt;/value&gt;
    &lt;/property&gt;
    &lt;property iri=&quot;geekCode&quot;&gt;&lt;/property&gt;
  &lt;/property&gt;
  &lt;property-of iri=&quot;sioc:member_of&gt;
    &lt;class iri=&quot;sioc:Forum&quot; /&gt;
  &lt;/property-of&gt;
  &lt;view type=&quot;text&quot;/&gt;
&lt;/query&gt;
</pre>
    </div>
<br />

  <a name="virtuosospongerfacentui" />
    <h3>14.11.3. WebService Interface</h3>

  <a name="virtuosospongerfacentuirest" />
    <h4>14.11.3.1. REST interface</h4>
  <p>The Virtuoso Faceted web service provide following REST interface:</p>
  <p>Service description:</p>
      <ul>
  <li>Endpoint: http://&lt;cname&gt;/fct/service for ex. http://lod.openlinksw.com/fct/service </li>
  <li>HTTP method: POST</li>
  <li>Content-Type: MUST be &#39;text/xml&#39;</li>
  <li>The entity body must be XML document with top element &#39;query&#39; as described above.</li>
  <li>The request response namespace MUST be &quot;http://openlinksw.com/services/facets/1.0&quot;</li>
      </ul>
  <p>Error conditions:</p>
  <p>The all error conditions are reported via &#39;Error explanation&#39;</p>
  <p>Files:</p>
  <p>The facet_svc.sql contains web service code and virtual directory mapping, and it uses
fct_req.xsl &amp; fct_resp.xsl as request &amp; response filters.</p>
  <p>Example:</p>
  <p>Using CURL program</p>
<div>
      <pre class="programlisting">
curl -H &quot;Content-Type: text/xml&quot; -d @post.xml  http://lod.openlinksw.com/fct/service
</pre>
    </div>
  <p>Where &#39;post.xml&#39; document contains query document:</p>
<div>
      <pre class="programlisting">
&lt;?xml version=&quot;1.0&quot;?&gt;
&lt;query xmlns=&quot;http://openlinksw.com/services/facets/1.0&quot; inference=&quot;&quot; same-as=&quot;&quot;&gt;
  &lt;text&gt; Seattle Mariners traveled all the way to Japan to watch&lt;/text&gt;
  &lt;view type=&quot;text&quot; limit=&quot;20&quot; offset=&quot;&quot;/&gt;
&lt;/query&gt;
</pre>
    </div>
  <p>Produces following response:</p>
<div>
      <pre class="programlisting">
&lt;fct:facets xmlns:fct=&quot;http://openlinksw.com/services/facets/1.0/&quot;&gt;
&lt;fct:sparql&gt;   SELECT distinct ?s1 as ?c1, (bif:search_excerpt (bif:vector (&#39;THE&#39;, &#39;MARINERS&#39;, &#39;WAY&#39;, &#39;SEATTLE&#39;, &#39;WATCH&#39;, &#39;ALL&#39;, &#39;TO&#39;, &#39;JAPAN&#39;, &#39;TRAVELED&#39;), ?o1)) as ?c2  WHERE { ?s1 ?s1textp ?o1 . FILTER (bif:contains (?o1, &#39;(THE AND MARINERS AND WAY AND SEATTLE AND WATCH AND ALL AND TO AND JAPAN AND TRAVELED)&#39;)) . } LIMIT 20  OFFSET 0 &lt;/fct:sparql&gt;
&lt;fct:time&gt;116&lt;/fct:time&gt;
&lt;fct:complete&gt;yes&lt;/fct:complete&gt;
&lt;fct:db-activity&gt;   134R rnd  9.488KR seq      0P disk  8.966MB /    602 messages&lt;/fct:db-activity&gt;
 &lt;fct:result&gt;
  &lt;fct:row&gt;
    &lt;fct:column datatype=&quot;url&quot; shortform=&quot;http://bobdupuy.mlbl...ld_baseball__6.html&quot;&gt;http://bobdupuy.mlblogs.com/bobdupuy/2006/03/world_baseball__6.html&gt;&lt;/fct:column&gt;
    &lt;fct:column /&gt;
    &lt;fct:column&gt;&lt;span class=&quot;srch_xerpt&quot;&gt;... While Chuck Armstrong president of &lt;b&gt;the&lt;/b&gt; &lt;b&gt;Seattle&lt;/b&gt; &lt;b&gt;Mariners&lt;/b&gt; &lt;b&gt;traveled&lt;/b&gt; &lt;b&gt;all&lt;/b&gt; &lt;b&gt;the&lt;/b&gt; &lt;b&gt;way&lt;/b&gt; &lt;b&gt;to&lt;/b&gt; &lt;b&gt;Japan&lt;/b&gt; &lt;b&gt;to&lt;/b&gt; &lt;b&gt;watch&lt;/b&gt; Ichiro... for &lt;b&gt;the&lt;/b&gt; advancing &lt;b&gt;Japan&lt;/b&gt; team last week &lt;b&gt;the&lt;/b&gt; star from &lt;b&gt;the&lt;/b&gt; &lt;b&gt;Seattle&lt;/b&gt; roster so far in Round 1 has without a doubt... leading &lt;b&gt;the&lt;/b&gt; Dominican &lt;b&gt;to&lt;/b&gt; its...&lt;/span&gt;&lt;/fct:column&gt;
  &lt;/fct:row&gt;
  &lt;fct:row&gt;
    &lt;fct:column datatype=&quot;url&quot; shortform=&quot;http://bobdupuy.mlbl...ld_baseball__6.html&quot;&gt;http://bobdupuy.mlblogs.com/bobdupuy/2006/03/world_baseball__6.html&gt;&lt;/fct:column&gt;
    &lt;fct:column /&gt;
    &lt;fct:column&gt;&lt;span class=&quot;srch_xerpt&quot;&gt;Orlando While Chuck Armstrong president of &lt;b&gt;the&lt;/b&gt; &lt;b&gt;Seattle&lt;/b&gt; &lt;b&gt;Mariners&lt;/b&gt; &lt;b&gt;traveled&lt;/b&gt; &lt;b&gt;all&lt;/b&gt; &lt;b&gt;the&lt;/b&gt; &lt;b&gt;way&lt;/b&gt; &lt;b&gt;to&lt;/b&gt; &lt;b&gt;Japan&lt;/b&gt; &lt;b&gt;to&lt;/b&gt; &lt;b&gt;watch&lt;/b&gt;... perform for &lt;b&gt;the&lt;/b&gt; advancing &lt;b&gt;Japan&lt;/b&gt; team last week &lt;b&gt;the&lt;/b&gt; star from &lt;b&gt;the&lt;/b&gt; &lt;b&gt;Seattle&lt;/b&gt; roster so far in Round 1 has without...&lt;/span&gt;&lt;/fct:column&gt;
  &lt;/fct:row&gt;
 &lt;/fct:result&gt;
&lt;/fct:facets&gt;
</pre>
    </div>
<br />

  <a name="virtuosospongerfacentuirestapi" />
    <h4>14.11.3.2. Virtuoso APIs for Faceted REST services</h4>
<p>The Virtuoso APIs for FCT REST services are Virtuoso Stored Procedures that enable faceted browsing
over Linked Data hosted in the RDF Quad Store. This also includes Linked Data that is progressively
added to the Quad Store via URI de-referencing.
</p>
<p>They enable the use Virtuoso&#39;s VSP/VSPX technology to produce (X)HTML-based Linked Data explorer
pages that are endowed with high-performance (in-process) faceted browsing capability.
</p>
<p>You can use this API with Virtuoso SQL calls that provide data to your VSP/VSPX, ASP.NET, PHP,
etc., -based interfaces using ODBC, JDBC, ADO.NET, or XMLA connectivity (SPASQL) to Virtuoso.
</p>
  
    <a name="virtuosospongerfacentuirestapidef" />
    <h5>14.11.3.2.1. API Definition</h5>
<div>
      <pre class="programlisting">
CREATE PROCEDURE
fct_exec
  (
    IN  tree     ANY ,
    IN  timeout  INT
  )
{
  DECLARE  start_time,
           view3,
           inx,
           n_rows      INT     ;
  DECLARE  sqls,
           msg,
           qr,
           qr2,
           act,
           query       VARCHAR ;
  DECLARE  md,
           res,
           results,
           more        ANY     ;
  DECLARE  tmp         ANY     ;
  DECLARE  offs,
           lim         INT     ;

  SET result_timeout = _min
                         (
                           timeout,
                           ATOI
                             (
                               registry_get (&#39;fct_timeout_max&#39;)
                             )
                         )
  ;

  offs := xpath_eval (&#39;//query/view/@offset&#39;, tree);
  lim := xpath_eval (&#39;//query/view/@limit&#39;, tree);

  -- db_activity ();

  results := vector (null, null, null);
  more := vector ();

  IF
    (
      xpath_eval
        (
          &#39;//query[@view3=&quot;yes&quot;]//view[@type=&quot;text&quot;]&#39;,
          tree
        )
      IS NOT NULL
    )
      {
      more := VECTOR (&#39;classes&#39;, &#39;properties&#39;);
  }

  sqls := &#39;00000&#39;;
  qr := fct_query
          (
            xpath_eval (&#39;//query&#39;, tree, 1)
          )
  ;
  query := qr;
--  dbg_obj_print (qr);
  qr2 := fct_xml_wrap (tree, qr);
  start_time := msec_time ();

  dbg_printf(&#39;query: %s&#39;, qr2);

  EXEC
    (
      qr2,
      sqls,
      msg,
      vector (),
      0,
      md,
      res
    )
  ;
  n_rows := row_count ();
  act := db_activity ();
  SET result_timeout = 0;
  IF (
       sqls &lt;&gt; &#39;00000&#39;
       AND
       sqls &lt;&gt; &#39;S1TAT&#39;
     )
    SIGNAL (sqls, msg);
  IF (
       NOT ISARRAY (res)
       OR
       0 = length (res)
       OR
       NOT ISARRAY (res[0])
       OR
       0 = length (res[0])
     )
    results[0] := xtree_doc (&#39;&lt;result/&gt;&#39;);
  ELSE
    results[0] := res[0][0];

  inx := 1;

  FOREACH (VARCHAR tp IN more) DO
    {
      tree := XMLUpdate (
                          tree,
                          &#39;/query/view/@type&#39;,
                          tp,
                          &#39;/query/view/@limit&#39;,
                          &#39;40&#39;,
                          &#39;/query/view/@offset&#39;,
                          &#39;0&#39;
                        )
      ;
      qr := fct_query (xpath_eval (&#39;//query&#39;, tree, 1));
      qr2 := fct_xml_wrap (tree, qr);
      sqls := &#39;00000&#39;;
      SET result_timeout = _min (
                                  timeout,
                                  ATOI
                                    (
                                      registry_get (&#39;fct_timeout_max&#39;)
                                    )
                                )
      ;
      EXEC (
             qr2,
             sqls,
             msg,
             vector (),
             0,
             md,
             res
           );
      n_rows := row_count ();
      act := db_activity ();
      SET result_timeout = 0;
      IF ( sqls &lt;&gt; &#39;00000&#39;
           AND
           sqls &lt;&gt; &#39;S1TAT&#39;
         )
    SIGNAL (sqls, msg);
      IF (
           ISARRAY (res)
           AND
           LENGTH (res)
           AND
           ISARRAY (res[0])
           AND
           LENGTH (res[0])
         )
    {
      tmp := res[0][0];
      tmp := XMLUpdate (tmp, &#39;/result/@type&#39;, tp);
      results[inx] := tmp;
    }
      inx := inx + 1;
    }



  res := XMLELEMENT
           (
             &quot;facets&quot;,
             XMLELEMENT
               ( &quot;sparql&quot;, query ),
             XMLELEMENT
               ( &quot;time&quot;, msec_time () - start_time ),
             XMLELEMENT
               (
                 &quot;complete&quot;,
                 CASE WHEN sqls = &#39;S1TAT&#39;
                      THEN &#39;no&#39;
                      ELSE &#39;yes&#39;
                  END
                ),
             XMLELEMENT
               (
                 &quot;timeout&quot;,
                 _min
                   (
                     timeout * 2,
                     ATOI
                       (
                         registry_get
                           ( &#39;fct_timeout_max&#39; )
                       )
                   )
               ),
             XMLELEMENT
               (&quot;db-activity&quot;, act),
             XMLELEMENT
               (&quot;processed&quot;, n_rows),
             XMLELEMENT
               (
                 &quot;view&quot;,
                 XMLATTRIBUTES
                   (
                     offs AS &quot;offset&quot;,
                     lim AS &quot;limit&quot;
                   )
               ),
             results[0],
             results[1],
             results[2]
           );

---- for debugging:
--string_to_file (&#39;ret.xml&#39;, serialize_to_UTF8_xml (res), -2);
--  dbg_obj_print (res);

  RETURN res;
}
;
</pre>
    </div>
   <br />
   
     <a name="virtuosospongerfacentuirestapiexmp" />
    <h5>14.11.3.2.2. Example</h5>
<p>
The following example shows how to use the fct_exec APi in vsp page to perform a &quot;text&quot; search for the
word &quot;Mike&quot; assuming this exists in your Virtuoso RDF store (if not amend the query in the fct_example.vsp
code sample below to search for text known to exist).
</p>
<ol>
      <li>The service can be used in the following sample fct_example.vsp:
<div>
          <pre class="programlisting">
&lt;?vsp

declare txt, reply, tree any;
declare timeout int;

tree := xtree_doc (&#39;
  &lt;query&gt;
    &lt;text&gt;Mike&lt;/text&gt;
    &lt;view type=&quot;text&quot;/&gt;
  &lt;/query&gt;
&#39;);

timeout := 3000;
reply := fct_exec (tree, timeout);

txt := string_output ();

http_value (xslt (&#39;virt://WS.WS.SYS_DAV_RES.RES_FULL_PATH.RES_CONTENT:/DAV/fct_example.xsl&#39;,
                 reply,
   	         vector ()),
	         null, txt);

http (txt);
?&gt;
</pre>
        </div>
</li>
      <li>The xsl:
<div>
          <pre class="programlisting">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;xsl:stylesheet version=&quot;1.0&quot; xmlns:xsl=&quot;http://www.w3.org/1999/XSL/Transform&quot;&gt;
  &lt;xsl:output method=&quot;html&quot; encoding=&quot;ISO-8859-1&quot;/&gt;
  &lt;xsl:variable name=&quot;rowcnt&quot; select=&quot;count(/facets/result/row)&quot;/&gt;
  &lt;xsl:template match=&quot;facets&quot;&gt;
    &lt;div id=&quot;res&quot;&gt;
      &lt;xsl:if test=&quot;/facets/complete = &#39;yes&#39; and /facets/processed = 0 and $rowcnt = 0&quot;&gt;
        &lt;div class=&quot;empty_result&quot;&gt;
          Nothing found.
        &lt;/div&gt;
      &lt;/xsl:if&gt;
      &lt;xsl:for-each select=&quot;/facets/result&quot;&gt;
        &lt;xsl:call-template name=&quot;render-result&quot;/&gt;
      &lt;/xsl:for-each&gt;
    &lt;/div&gt;
    &lt;!-- #res --&gt;
    &lt;/xsl:template&gt;
  &lt;xsl:template name=&quot;render-result&quot;&gt;
    &lt;table class=&quot;result&quot; border=&quot;1&quot;&gt;
      &lt;thead&gt;
        &lt;tr&gt;
          &lt;th&gt;Entity&lt;/th&gt;
          &lt;th&gt;Title&lt;/th&gt;
          &lt;th&gt;Text excerpt&lt;/th&gt;
        &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
        &lt;xsl:for-each select=&quot;row&quot;&gt;
          &lt;tr&gt;
            &lt;td class=&quot;rnk&quot;&gt;
              &lt;xsl:for-each select=&quot;column[@datatype=&#39;trank&#39; or @datatype=&#39;erank&#39;]&quot;&gt;
		&lt;xsl:choose&gt;
                  &lt;xsl:when test=&quot;./@datatype=&#39;trank&#39;&quot;&gt;Text Rank:&lt;/xsl:when&gt;
                  &lt;xsl:when test=&quot;./@datatype=&#39;erank&#39;&quot;&gt;Entity Rank:&lt;/xsl:when&gt;
                &lt;/xsl:choose&gt;
                &lt;xsl:value-of select=&quot;.&quot;/&gt;
                &lt;br/&gt;
              &lt;/xsl:for-each&gt;
            &lt;/td&gt;
            &lt;xsl:for-each select=&quot;column&quot;&gt;
              &lt;xsl:choose&gt;
                &lt;xsl:when test=&quot;&#39;url&#39; = ./@datatype&quot;&gt;
                  &lt;td&gt;
                    &lt;a&gt;
                      &lt;xsl:attribute name=&quot;href&quot;&gt;http://lod.openlinksw.com/describe/?url=&lt;xsl:value-of select=&quot;urlify (.)&quot;/&gt;&lt;/xsl:attribute&gt;
                      &lt;xsl:attribute name=&quot;title&quot;&gt;&lt;xsl:value-of select=&quot;.&quot;/&gt;&lt;/xsl:attribute&gt;
                      &lt;xsl:choose&gt;
                        &lt;xsl:when test=&quot;&#39;&#39; != ./@shortform&quot;&gt;
                          &lt;xsl:value-of select=&quot;./@shortform&quot;/&gt;
		    &lt;/xsl:when&gt;
                        &lt;xsl:when test=&quot;&#39;erank&#39; = ./@datatype or &#39;trank&#39; = ./@datatype&quot;&gt;rank&lt;/xsl:when&gt;
		    &lt;xsl:otherwise&gt;
                          &lt;xsl:value-of select=&quot;.&quot;/&gt;
		    &lt;/xsl:otherwise&gt;
		&lt;/xsl:choose&gt;
                    &lt;/a&gt;
                  &lt;/td&gt;
                &lt;/xsl:when&gt;
                &lt;xsl:when test=&quot;&#39;erank&#39; = ./@datatype or &#39;trank&#39; = ./@datatype&quot;/&gt;
                &lt;xsl:when test=&quot;&#39;srch_xerpt&#39; = ./span/@class&quot;&gt;
                  &lt;td&gt;
                    &lt;xsl:value-of select=&quot;.&quot;/&gt;
                  &lt;/td&gt;
                &lt;/xsl:when&gt;
                &lt;xsl:otherwise/&gt;
              &lt;/xsl:choose&gt;
            &lt;/xsl:for-each&gt;
          &lt;/tr&gt;
        &lt;/xsl:for-each&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/xsl:template&gt;
  &lt;xsl:template match=&quot;@* | node()&quot;&gt;
    &lt;xsl:copy&gt;
      &lt;xsl:apply-templates select=&quot;@* | node()&quot;/&gt;
    &lt;/xsl:copy&gt;
    &lt;/xsl:template&gt;
&lt;/xsl:stylesheet&gt;
</pre>
        </div>
      </li>
      <li>The result of executing the fct_example.vsp should be:
     <table class="figure" border="0" cellpadding="0" cellspacing="0">
      <tr>
       <td>
              <img alt="Faceted API Example" src="../images/ui/fcapiex1.png" />
       </td>
      </tr>
      <tr>
            <td>Figure: 14.11.3.2.2.1. Faceted API Example</td>
      </tr>
        </table>
</li>
    </ol>
   <br />
<br />

  <a name="virtuosospongerfacentuirest" />
    <h4>14.11.3.3. SOAP interface</h4>
<p>The facet web service is also available via SOAP protocol.</p>
<p>The request message contains single element &#39;query&#39; with syntax explained earlier. Also the
SOAPAction HTTP header should be &#39;#query&#39; . After successful evaluation of the query, the service
will return a SOAP envelope containing in the Body element single &#39;facets&#39; element described above.</p>
<p>Example:</p>
<p>This example shows execution of same command as in example for REST interface here it using SOAP:</p>
<p>Request message:</p>
<div>
      <pre class="programlisting">
&lt;SOAP:Envelope xmlns:SOAP=&quot;http://schemas.xmlsoap.org/soap/envelope/&quot;&gt;
  &lt;SOAP:Body&gt;
    &lt;query xmlns=&quot;http://openlinksw.com/services/facets/1.0/&quot; inference=&quot;&quot; same-as=&quot;&quot;&gt;
      &lt;text&gt;Seattle Mariners traveled all the way to Japan to watch&lt;/text&gt;
      &lt;view type=&quot;text&quot; limit=&quot;20&quot; offset=&quot;0&quot;/&gt;
    &lt;/query&gt;
  &lt;/SOAP:Body&gt;
&lt;/SOAP:Envelope&gt;
</pre>
    </div>
<p>Response message:</p>
<div>
      <pre class="programlisting">
&lt;SOAP:Envelope xmlns:SOAP=&quot;http://schemas.xmlsoap.org/soap/envelope/&quot;&gt;
  &lt;SOAP:Body&gt;
    &lt;fct:facets xmlns:fct=&quot;http://openlinksw.com/services/facets/1.0/&quot;&gt;
      &lt;fct:sparql&gt;SELECT distinct ?s1 as ?c1, (bif:search_excerpt (bif:vector (&#39;THE&#39;, &#39;MARINERS&#39;, &#39;WAY&#39;, &#39;SEATTLE&#39;, &#39;WATCH&#39;, &#39;ALL&#39;, &#39;TO&#39;, &#39;JAPAN&#39;, &#39;TRAVELED&#39;), ?o1)) as ?c2  where { ?s1 ?s1textp ?o1 . filter (bif:contains (?o1, &#39;(THE AND MARINERS AND WAY AND SEATTLE AND WATCH AND ALL AND TO AND JAPAN AND TRAVELED)&#39;)) . } LIMIT 20  OFFSET 0&lt;/fct:sparql&gt;
      &lt;fct:time&gt;114&lt;/fct:time&gt;
      &lt;fct:complete&gt;yes&lt;/fct:complete&gt;
      &lt;fct:db-activity&gt;   134R rnd  9.488KR seq      0P disk  8.966MB /    602 messages&lt;/fct:db-activity&gt;
      &lt;fct:result&gt;
        &lt;fct:row&gt;
          &lt;fct:column datatype=&quot;url&quot; shortform=&quot;http://bobdupuy.mlbl...ld_baseball__6.html&quot;&gt;http://bobdupuy.mlblogs.com/bobdupuy/2006/03/world_baseball__6.html&lt;/fct:column&gt;
          &lt;fct:column/&gt;
          &lt;fct:column&gt;&lt;span class=&quot;srch_xerpt&quot;&gt;... While Chuck Armstrong president of &lt;b&gt;the&lt;/b&gt; &lt;b&gt;Seattle&lt;/b&gt; &lt;b&gt;Mariners&lt;/b&gt; &lt;b&gt;traveled&lt;/b&gt; &lt;b&gt;all&lt;/b&gt; &lt;b&gt;the&lt;/b&gt; &lt;b&gt;way&lt;/b&gt; &lt;b&gt;to&lt;/b&gt; &lt;b&gt;Japan&lt;/b&gt; &lt;b&gt;to&lt;/b&gt; &lt;b&gt;watch&lt;/b&gt; Ichiro... for &lt;b&gt;the&lt;/b&gt; advancing &lt;b&gt;Japan&lt;/b&gt; team last week &lt;b&gt;the&lt;/b&gt; star from &lt;b&gt;the&lt;/b&gt; &lt;b&gt;Seattle&lt;/b&gt; roster so far in Round 1 has without a doubt... leading &lt;b&gt;the&lt;/b&gt; Dominican &lt;b&gt;to&lt;/b&gt; its...&lt;/span&gt;&lt;/fct:column&gt;
        &lt;/fct:row&gt;
        &lt;fct:row&gt;
          &lt;fct:column datatype=&quot;url&quot; shortform=&quot;http://bobdupuy.mlbl...ld_baseball__6.html&quot;&gt;http://bobdupuy.mlblogs.com/bobdupuy/2006/03/world_baseball__6.html&lt;/fct:column&gt;
          &lt;fct:column/&gt;
          &lt;fct:column&gt;&lt;span class=&quot;srch_xerpt&quot;&gt;Orlando While Chuck Armstrong president of &lt;b&gt;the&lt;/b&gt; &lt;b&gt;Seattle&lt;/b&gt; &lt;b&gt;Mariners&lt;/b&gt; &lt;b&gt;traveled&lt;/b&gt; &lt;b&gt;all&lt;/b&gt; &lt;b&gt;the&lt;/b&gt; &lt;b&gt;way&lt;/b&gt; &lt;b&gt;to&lt;/b&gt; &lt;b&gt;Japan&lt;/b&gt; &lt;b&gt;to&lt;/b&gt; &lt;b&gt;watch&lt;/b&gt;... perform for &lt;b&gt;the&lt;/b&gt; advancing &lt;b&gt;Japan&lt;/b&gt; team last week &lt;b&gt;the&lt;/b&gt; star from &lt;b&gt;the&lt;/b&gt; &lt;b&gt;Seattle&lt;/b&gt; roster so far in Round 1 has without...&lt;/span&gt;&lt;/fct:column&gt;
        &lt;/fct:row&gt;
      &lt;/fct:result&gt;
    &lt;/fct:facets&gt;
  &lt;/SOAP:Body&gt;
&lt;/SOAP:Envelope&gt;
</pre>
    </div>      	
  <br />
<br />
<table border="0" width="90%" id="navbarbottom">
    <tr>
        <td align="left" width="33%">
          <a href="virtuosospongerfacetinstall.html" title="Virtuoso Faceted Browser Installation and configuration">Previous</a>
          <br />Virtuoso Faceted Browser Installation and configuration</td>
     <td align="center" width="34%">
          <a href="rdfandsparql.html">Chapter Contents</a>
     </td>
        <td align="right" width="33%">
          <a href="rdfiridereferencing.html" title="Linked Data">Next</a>
          <br />Linked Data</td>
    </tr>
    </table>
  </div>
  <div id="footer">
    <div>Copyright© 1999 - 2009 OpenLink Software All rights reserved.</div>
   <div id="validation">
    <a href="http://validator.w3.org/check/referer">
        <img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" />
    </a>
    <a href="http://jigsaw.w3.org/css-validator/">
        <img src="http://jigsaw.w3.org/css-validator/images/vcss" alt="Valid CSS!" height="31" width="88" />
    </a>
   </div>
  </div>
 </body>
</html>