blob: 0f2e0431a9dc84123016d2a4af55ad1f0de2c64b [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<title>Apache Jena - TDB Java API</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/tdb/java_api.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/tdb'>TDB</a></li>
<li class="active">JAVA API</li>
</ol>
</div>
<h1 class="title">TDB Java API</h1>
<p>All the operations of the
Jena API including the
<a href="../query/">SPARQL query and SPARQL Update</a> are supported.
The application obtains a model or RDF datasets from TDB then uses
it as for any other model or dataset.</p>
<h2 id="contents">Contents</h2>
<ul>
<li><a href="#constructing-a-model-or-dataset">Constructing a model or dataset</a>
<ul>
<li><a href="#using-a-directory-name">Using a directory name</a></li>
<li><a href="#using-an-assembler-file">Using an assembler file</a></li>
</ul>
</li>
<li><a href="#bulkloader">Bulkloader</a></li>
<li><a href="#concurrency">Concurrency</a></li>
<li><a href="#caching-and-synchronization">Caching and synchronization</a></li>
</ul>
<p>TDB also supports <a href="tdb_transactions.html">transactions</a>.</p>
<h2 id="constructing-a-model-or-dataset">Constructing a model or dataset</h2>
<p>The class <code>TDBFactory</code> contains the static factory methods for
creating and connecting to a TDB-backed graph or an RDF dataset.
Models and datasets should be closed after use.</p>
<p>An application can specify the model or dataset by:</p>
<ol>
<li>Giving a directory name</li>
<li>Giving an assembler file</li>
</ol>
<p>If a directory is empty, the TDB files for indexes and node table
are created. If the directory contains files from a previous
application run, TDB connects to the data already there.</p>
<p>Closing the model or dataset is important. Any updates made are
forced to disk if they have not been written already.</p>
<h3 id="using-a-directory-name">Using a directory name</h3>
<pre><code> // Make a TDB-backed dataset
String directory = &quot;MyDatabases/Dataset1&quot; ;
Dataset dataset = TDBFactory.createDataset(directory) ;
...
dataset.begin(ReadWrite.READ) ;
// Get model inside the transaction
Model model = dataset.getDefaultModel() ;
dataset.end() ;
...
dataset.begin(ReadWrite.WRITE) ;
model = dataset.getDefaultModel() ;
dataset.end() ;
...
</code></pre>
<h3 id="using-an-assembler-file">Using an assembler file</h3>
<pre><code> // Assembler way: Make a TDB-back Jena model in the named directory.
// This way, you can change the model being used without changing the code.
// The assembler file is a configuration file.
// The same assembler description will work in Fuseki.
String assemblerFile = &quot;Store/tdb-assembler.ttl&quot; ;
Dataset dataset = TDBFactory.assembleDataset(assemblerFile) ;
...
dataset.begin(ReadWrite.READ) ;
// Get model inside the transaction
Model model = dataset.getDefaultModel() ;
dataset.end() ;
...
</code></pre>
<p>See
<a href="assembler.html">the TDB assembler documentation</a>
for details.</p>
<h2 id="bulkloader">Bulkloader</h2>
<p>The bulkloader is a faster way to load data into an empty dataset
than just using the Jena update operations.</p>
<p>It is accessed through the command line utility <code>tdbloader</code>.</p>
<h2 id="concurrency">Concurrency</h2>
<p>TDB support <a href="tdb_transactions.html">transactions</a>, which is the preferred
way to work. It is possible to act directly on the dataset without transaction
with a Multiple Reader or Single Writer (MRSW) policy for
concurrency access. Applications are expected to adhere to this
policy - it is not automatically checked.</p>
<p>One gotcha is Java iterators. An iterator that is moving over the
database is making read operations and no updates to the dataset
are possible while an iterator is being used.</p>
<h2 id="caching-and-synchronization">Caching and synchronization</h2>
<p>If used non-transactionally, then the application must be aware of
the caching and synchronization used by TDB. TDB employs caching at
various levels, from RDF terms to disk
blocks. It is important to flush all caches to make the file state
consistent with the cached states because some caches are
write-behind so unwritten changes may be held in-memory.</p>
<p>TDB provides an explicit call dataset objects for
synchronization with disk:</p>
<pre><code> Dataset dataset = ...  ;
TDB.sync(dataset ) ;
</code></pre>
<p>Any dataset or model can be passed to these functions - if they are
not backed by TDB then no action is taken and the call merely
returns without error.</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>