blob: 38c08288d8187c0a2ec9fa6fbbc3e083b1c3d1b4 [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<title>Apache Jena - The DatasetGraph hierarchy.</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="/css/bootstrap.min.css" rel="stylesheet" media="screen">
<link href="/css/bootstrap-extension.css" rel="stylesheet" type="text/css">
<link href="/css/jena.css" rel="stylesheet" type="text/css">
<link rel="shortcut icon" href="/images/favicon.ico" />
<script src="https://code.jquery.com/jquery-2.2.4.min.js"
integrity="sha256-BbhdlvQf/xTY9gja0Dq3HiwQF8LaCRTXxZKRutelT44="
crossorigin="anonymous"></script>
<script src="/js/jena-navigation.js" type="text/javascript"></script>
<script src="/js/bootstrap.min.js" type="text/javascript"></script>
<script src="/js/improve.js" type="text/javascript"></script>
</head>
<body>
<nav class="navbar navbar-default" role="navigation">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-ex1-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="/index.html">
<img class="logo-menu" src="/images/jena-logo/jena-logo-notext-small.png" alt="jena logo">Apache Jena</a>
</div>
<div class="collapse navbar-collapse navbar-ex1-collapse">
<ul class="nav navbar-nav">
<li id="homepage"><a href="/index.html"><span class="glyphicon glyphicon-home"></span> Home</a></li>
<li id="download"><a href="/download/index.cgi"><span class="glyphicon glyphicon-download-alt"></span> Download</a></li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown"><span class="glyphicon glyphicon-book"></span> Learn <b class="caret"></b></a>
<ul class="dropdown-menu">
<li class="dropdown-header">Tutorials</li>
<li><a href="/tutorials/index.html">Overview</a></li>
<li><a href="/documentation/fuseki2/index.html">Fuseki Triplestore</a></li>
<li><a href="/documentation/notes/index.html">How-To's</a></li>
<li><a href="/documentation/query/manipulating_sparql_using_arq.html">Manipulating SPARQL using ARQ</a></li>
<li><a href="/tutorials/rdf_api.html">RDF core API tutorial</a></li>
<li><a href="/tutorials/sparql.html">SPARQL tutorial</a></li>
<li><a href="/tutorials/using_jena_with_eclipse.html">Using Jena with Eclipse</a></li>
<li class="divider"></li>
<li class="dropdown-header">References</li>
<li><a href="/documentation/index.html">Overview</a></li>
<li><a href="/documentation/query/index.html">ARQ (SPARQL)</a></li>
<li><a href="/documentation/assembler/index.html">Assembler</a></li>
<li><a href="/documentation/tools/index.html">Command-line tools</a></li>
<li><a href="/documentation/rdfs/">Data with RDFS Inferencing</a></li>
<li><a href="/documentation/geosparql/index.html">GeoSPARQL</a></li>
<li><a href="/documentation/inference/index.html">Inference API</a></li>
<li><a href="/documentation/javadoc.html">Javadoc</a></li>
<li><a href="/documentation/ontology/">Ontology API</a></li>
<li><a href="/documentation/permissions/index.html">Permissions</a></li>
<li><a href="/documentation/extras/querybuilder/index.html">Query Builder</a></li>
<li><a href="/documentation/rdf/index.html">RDF API</a></li>
<li><a href="/documentation/rdfconnection/">RDF Connection - SPARQL API</a></li>
<li><a href="/documentation/io/">RDF I/O</a></li>
<li><a href="/documentation/rdfstar/index.html">RDF-star</a></li>
<li><a href="/documentation/shacl/index.html">SHACL</a></li>
<li><a href="/documentation/shex/index.html">ShEx</a></li>
<li><a href="/documentation/jdbc/index.html">SPARQL over JDBC</a></li>
<li><a href="/documentation/tdb/index.html">TDB</a></li>
<li><a href="/documentation/tdb2/index.html">TDB2</a></li>
<li><a href="/documentation/query/text-query.html">Text Search</a></li>
</ul>
</li>
<li class="drop down">
<a href="#" class="dropdown-toggle" data-toggle="dropdown"><span class="glyphicon glyphicon-book"></span> Javadoc <b class="caret"></b></a>
<ul class="dropdown-menu">
<li><a href="/documentation/javadoc.html">All Javadoc</a></li>
<li><a href="/documentation/javadoc/arq/">ARQ</a></li>
<li><a href="/documentation/javadoc_elephas.html">Elephas</a></li>
<li><a href="/documentation/javadoc/fuseki2/">Fuseki</a></li>
<li><a href="/documentation/javadoc/geosparql/">GeoSPARQL</a></li>
<li><a href="/documentation/javadoc/jdbc/">JDBC</a></li>
<li><a href="/documentation/javadoc/jena/">Jena Core</a></li>
<li><a href="/documentation/javadoc/permissions/">Permissions</a></li>
<li><a href="/documentation/javadoc/extras/querybuilder/">Query Builder</a></li>
<li><a href="/documentation/javadoc/shacl/">SHACL</a></li>
<li><a href="/documentation/javadoc/tdb/">TDB</a></li>
<li><a href="/documentation/javadoc/text/">Text Search</a></li>
</ul>
</li>
<li id="ask"><a href="/help_and_support/index.html"><span class="glyphicon glyphicon-question-sign"></span> Ask</a></li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown"><span class="glyphicon glyphicon-bullhorn"></span> Get involved <b class="caret"></b></a>
<ul class="dropdown-menu">
<li><a href="/getting_involved/index.html">Contribute</a></li>
<li><a href="/help_and_support/bugs_and_suggestions.html">Report a bug</a></li>
<li class="divider"></li>
<li class="dropdown-header">Project</li>
<li><a href="/about_jena/about.html">About Jena</a></li>
<li><a href="/about_jena/architecture.html">Architecture</a></li>
<li><a href="/about_jena/citing.html">Citing</a></li>
<li><a href="/about_jena/team.html">Project team</a></li>
<li><a href="/about_jena/contributions.html">Related projects</a></li>
<li><a href="/about_jena/roadmap.html">Roadmap</a></li>
<li class="divider"></li>
<li class="dropdown-header">ASF</li>
<li><a href="http://www.apache.org/">Apache Software Foundation</a></li>
<li><a href="http://www.apache.org/foundation/sponsorship.html">Become a Sponsor</a></li>
<li><a href="http://www.apache.org/licenses/LICENSE-2.0">License</a></li>
<li><a href="http://www.apache.org/security/">Security</a></li>
<li><a href="http://www.apache.org/foundation/thanks.html">Thanks</a></li>
</ul>
</li>
<li id="edit"><a href="https://github.com/apache/jena-site/edit/main/source/documentation/notes/datasetgraph.md" title="Edit this page on GitHub"><span class="glyphicon glyphicon-pencil"></span> Edit this page</a></li>
</ul>
</div>
</div>
</nav>
<div class="container">
<div class="row">
<div class="col-md-12">
<div id="breadcrumbs">
<ol class="breadcrumb">
<li><a href='/documentation'>DOCUMENTATION</a></li>
<li><a href='/documentation/notes'>NOTES</a></li>
<li class="active">DATASETGRAPH</li>
</ol>
</div>
<h1 class="title">The DatasetGraph hierarchy.</h1>
<p><em>These notes were written February 2016.</em></p>
<p><code>DatasetGraph</code> forms the basic of storage as
<a href="https://www.w3.org/TR/rdf11-concepts/#section-dataset">RDFDataset</a>. There
is a class hierarchy to make implementation a matter of choosing the style
of implementation and adding specific functionality.</p>
<p>The hierarchy of the significant classes is:
(there are others adding special features)</p>
<pre><code>DatasetGraph - the interface
DatasetGraphBase
DatasetGraphBaseFind
DatasetGraphCollection
DatasetGraphMapLink - ad hoc collection of graphs
DatasetGraphOne
DatasetGraphTriplesQuads
DatasetGraphInMemory - fully transactional in-memory.
DatasetGraphMap
DatasetGraphQuads
DatasetGraphTrackActive - transaction support
DatasetGraphTransaction - This is the main TDB dataset.
DatasetGraphWithLock - MRSW support
DatasetGraphWrapper
DatasetGraphTxn - TDB usage
DatasetGraphViewGraphs
</code></pre>
<p>Other important classes:</p>
<pre><code>GraphView
</code></pre>
<h3 id="datasetgraph">DatasetGraph</h3>
<p>This is the interface. Includes <code>Transactional</code> operations.</p>
<p>There are two markers for transaction features supported.</p>
<p>If <code>begin</code>, <code>commit</code> and <code>end</code> are supported (which is normally the case)
<code>supportsTransactions</code> returns true.</p>
<p>If, further, <code>abort</code> is supported, then <code>supportsTransactionAbort</code> is true.</p>
<h3 id="general-hierarchy">General hierarchy</h3>
<p><strong>DatasetGraphBase</strong></p>
<p>This provides some basic machinery and provides implementations of
operations that have alternative styles. It converts <code>add(G,S,P,O)</code> to
<code>add(quad)</code> and <code>delete(G,S,P,O)</code> to <code>delete(quad)</code> and converts
<code>find(quad)</code> to <code>find(G,S,P,O)</code>.</p>
<p>It provides basic implementations of <code>deleteAny(?,?,?,?)</code> and <code>clear()</code>.</p>
<p>It provides a Lock (LockMRSW) and the Context.</p>
<p>From here on down, the storage aspect of the hierarchy splits depending on
implementation style.</p>
<p><strong>DatasetGraphBaseFind</strong></p>
<p>This is the beginning of the hierarchy for DSGs that store using different units for default graph and named graphs.
This class splits find/4 into the following variants:</p>
<pre><code> findInDftGraph
findInUnionGraph
findQuadsInUnionGraph
findUnionGraphTriples
findInSpecificNamedGraph
findInAnyNamedGraphs
</code></pre><p><strong>DatasetGraphTriplesQuads</strong></p>
<p>This is the beginning of the hierarchy for DSGs implemented as a set of triples for the default graph and a set of quads for all the named graphs.</p>
<p>It splits add(Quad) and delete(Quad) into:</p>
<pre><code>addToDftGraph
addToNamedGraph
deleteFromDftGraph
deleteFromNamedGraph
</code></pre>
<p>and makes</p>
<pre><code>setDefaultGraph
addGraph
removeGraph
</code></pre>
<p>copy-in operations - triples are copied into the graph or removed from the
graph, rather than the graph being shared.</p>
<p>** DatasetGraphInMemory**</p>
<p>The main in-memory implementation, providing full transactions (serializable isolation, abort).</p>
<p>Use this one!</p>
<p>This class backs <code>DatasetFactory.createTxnMem()</code>.</p>
<p><strong>DatasetGraphMap</strong></p>
<p>The in-memory implementation using in-memory Graphs as the storage for Triples.
It provides MRSW-transactions (serializable isolation, no real abort).
Use this if a single threaded application.</p>
<p>This class backs <code>DatasetFactory.create()</code>.</p>
<p><strong>DatasetGraphCollection</strong></p>
<p>Operations split into operations on a collection of Graphs, one for the default graph, and a map of (Node,Graph) for the named graphs.
It provides MRSW-transactions (serializable isolation, no real abort).</p>
<p><strong>DatasetGraphMapLink</strong></p>
<p>This implementation is manages Graphs provided by the application.</p>
<p>It provides MRSW-transactions (serializable isolation, no real abort).
Applications need to be careful when modifying the Graphs directly and also
modifying them via the DatasetGraph interface.</p>
<p>This class backs <code>DatasetFactory.createGeneral()</code>.</p>
<p><strong>DatasetGraphWrapper</strong></p>
<p>Indirection to another <code>DatasetGraph</code>.</p>
<p>Surprisingly useful.</p>
<p><strong>DatasetGraphViewGraphs</strong></p>
<p>A small class that provides the &ldquo;get a graph&rdquo; operations over a
<code>DatasetGraph</code> using <code>GraphView</code>.</p>
<p>Not used because subclasses usually want to inherit from a different part
fo the hierarchy but the idea of implementing <code>getDefaultGraph()</code> and
<code>getGraph(Node)</code> as calls to <code>GraphView</code> is used elsewhere.</p>
<p>Do not use with an implementations that store using graph
(e.g. <code>DatasetGraphMap</code>, <code>DatasetGraphMapLink</code>) because it goes into an
infinite recursion if they use GraphView internally.</p>
<p><strong>GraphView</strong></p>
<p>Implementation of the Graph interface as a view of a DatasetGraph including
providing a basic implementation of the union graph. Subclasses can, and do,
provide a better mechanisms for the union graph based on their internal
indexes.</p>
<p><strong>DatasetGraphOne</strong></p>
<p>An implement that only provides a default graph, given at creation time.
This is a fixed - the app can&rsquo;t add named graphs.</p>
<p>Cuts through all the machinery to be a simple, direct implementation.</p>
<p>Backs up <code>DatasetGraphFactory.createOneGraph</code> but not
<code>DatasetFactory.create(Model)</code> which provided are adding named graphs.</p>
<p><strong>DatasetGraphQuads</strong></p>
<p>Root for implementations based on just quad storage, no special triples in
the default graph (e.g. the default graph is always the calculated union of
named graphs).</p>
<p>Not used currently.</p>
<p><strong>DatasetGraphTrackActive</strong></p>
<p>Framework for implementing transactions. Provides checking.</p>
<p><strong>DatasetGraphWithLock</strong></p>
<p>Provides transactions, without abort by default, using a lock. If the lock
is LockMRSW, we get multiple-readers or a single writer at any given moment
in time. As most datastructures are multi-thread reader safe, this style
works over systems that do not themselves provide transactions.</p>
<p>Abort requires work to be undone. Jena may in the future provide reverse
replay abort (do the adds and deletes in reverse operation, reverse order)
but this is partial. It does not protect against the DatasetGraph
implementation throwing exceptions nor JVM or machine crash (if any
persistence). It still needs MRSW to archive isolation.</p>
<p>Read-committed needs synchronization safe datastructures -including
co-ordinated changes to several places at once (ConcurrentHashMap isn&rsquo;t
enough - need to update 2 or more ConcurrentHashMaps together).</p>
<h3 id="tdb">TDB</h3>
<p><strong>DatasetGraphTDB</strong></p>
<p><code>DatasetGraphTDB</code> is concerned with the storage
historical and not used directly by applications.</p>
<p><strong>DatasetGraphTransaction</strong></p>
<p>This is the class returned by <code>TDBFactory</code>, wrapped in <code>DatasetImpl</code>.</p>
<p>Different in TDB2 - DatasetGraphTransaction not used, DatasetGraphTDB is transactional.</p>
<p><strong>DatasetGraphTxn</strong></p>
<p>This is the TDB per-transaction <code>DatasetGraph</code> using the transaction view
of indexes. For the application, it is held in the transactions
<code>ThreadLocal</code> in <code>DatasetGraphTransaction</code>.</p>
<p>Internally, each read transaction for the same generation of the data uses
the same <code>DatasetGraphTransaction</code>.</p>
</div>
</div>
</div>
<footer class="footer">
<div class="container" style="font-size:80%" >
<p>
Copyright &copy; 2011&ndash;2022 The Apache Software Foundation, Licensed under the
<a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.
</p>
<p>
Apache Jena, Jena, the Apache Jena project logo, Apache and the Apache feather logos are trademarks of
The Apache Software Foundation.
<br/>
<a href="https://privacy.apache.org/policies/privacy-policy-public.html"
>Apache Software Foundation Privacy Policy</a>.
</p>
</div>
</footer>
<script type="text/javascript">
var link = $('a[href="' + this.location.pathname + '"]');
if (link != undefined)
link.parents('li,ul').addClass('active');
</script>
</body>
</html>