blob: bfbeb31885f5d7abf2916cce20735bce3dd8cf24 [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<title>Apache Jena - RDF Patch</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-icons.css" rel="stylesheet" media="screen"><link rel="stylesheet" type="text/css" href="https://jena.apache.org/sass/jena.1b17c39a117e22b46db4c66f6395dc27c134a60377d87d2d5745b8600eb69722.css" integrity="sha256-GxfDmhF&#43;IrRttMZvY5XcJ8E0pgN32H0tV0W4YA62lyI=">
<link rel="shortcut icon" href="/images/favicon.ico" />
</head>
<body>
<nav class="navbar navbar-expand-lg bg-body-tertiary" role="navigation">
<div class="container">
<div class="navbar-header">
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></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" id="navbarNav">
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
<li id="homepage" class="nav-item"><a class="nav-link" href="/index.html"><span class="bi-house"></span> Home</a></li>
<li id="download" class="nav-item"><a class="nav-link" href="/download/index.cgi"><span class="bi-download"></span> Download</a></li>
<li class="nav-item dropdown">
<a href="#" class="nav-link dropdown-toggle" role="button" data-bs-toggle="dropdown" aria-expanded="false"><span class="bi-journal"></span> Learn <b class="caret"></b></a>
<ul class="dropdown-menu">
<li class="dropdown-header">Tutorials</li>
<li><a class="dropdown-item" href="/tutorials/index.html">Overview</a></li>
<li><a class="dropdown-item" href="/documentation/fuseki2/index.html">Fuseki Triplestore</a></li>
<li><a class="dropdown-item" href="/documentation/notes/index.html">How-To's</a></li>
<li><a class="dropdown-item" href="/documentation/query/manipulating_sparql_using_arq.html">Manipulating SPARQL using ARQ</a></li>
<li><a class="dropdown-item" href="/tutorials/rdf_api.html">RDF core API tutorial</a></li>
<li><a class="dropdown-item" href="/tutorials/sparql.html">SPARQL tutorial</a></li>
<li><a class="dropdown-item" href="/tutorials/using_jena_with_eclipse.html">Using Jena with Eclipse</a></li>
<li class="dropdown-divider"></li>
<li class="dropdown-header">References</li>
<li><a class="dropdown-item" href="/documentation/index.html">Overview</a></li>
<li><a class="dropdown-item" href="/documentation/query/index.html">ARQ (SPARQL)</a></li>
<li><a class="dropdown-item" href="/documentation/io/">RDF I/O</a></li>
<li><a class="dropdown-item" href="/documentation/assembler/index.html">Assembler</a></li>
<li><a class="dropdown-item" href="/documentation/tools/index.html">Command-line tools</a></li>
<li><a class="dropdown-item" href="/documentation/rdfs/">Data with RDFS Inferencing</a></li>
<li><a class="dropdown-item" href="/documentation/geosparql/index.html">GeoSPARQL</a></li>
<li><a class="dropdown-item" href="/documentation/inference/index.html">Inference API</a></li>
<li><a class="dropdown-item" href="/documentation/ontology/">Ontology API</a></li>
<li><a class="dropdown-item" href="/documentation/permissions/index.html">Permissions</a></li>
<li><a class="dropdown-item" href="/documentation/extras/querybuilder/index.html">Query Builder</a></li>
<li><a class="dropdown-item" href="/documentation/rdf/index.html">RDF API</a></li>
<li><a class="dropdown-item" href="/documentation/rdfconnection/">RDF Connection - SPARQL API</a></li>
<li><a class="dropdown-item" href="/documentation/rdfstar/index.html">RDF-star</a></li>
<li><a class="dropdown-item" href="/documentation/shacl/index.html">SHACL</a></li>
<li><a class="dropdown-item" href="/documentation/shex/index.html">ShEx</a></li>
<li><a class="dropdown-item" href="/documentation/tdb/index.html">TDB</a></li>
<li><a class="dropdown-item" href="/documentation/tdb2/index.html">TDB2</a></li>
<li><a class="dropdown-item" href="/documentation/query/text-query.html">Text Search</a></li>
</ul>
</li>
<li class="nav-item dropdown">
<a href="#" class="nav-link dropdown-toggle" role="button" data-bs-toggle="dropdown" aria-expanded="false"><span class="bi-journal-code"></span> Javadoc <b class="caret"></b></a>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="/documentation/javadoc.html">All Javadoc</a></li>
<li><a class="dropdown-item" href="/documentation/javadoc/arq/">ARQ</a></li>
<li><a class="dropdown-item" href="/documentation/javadoc/fuseki2/">Fuseki</a></li>
<li><a class="dropdown-item" href="/documentation/javadoc/geosparql/">GeoSPARQL</a></li>
<li><a class="dropdown-item" href="/documentation/javadoc/jena/">Jena Core</a></li>
<li><a class="dropdown-item" href="/documentation/javadoc/permissions/">Permissions</a></li>
<li><a class="dropdown-item" href="/documentation/javadoc/extras/querybuilder/">Query Builder</a></li>
<li><a class="dropdown-item" href="/documentation/javadoc/shacl/">SHACL</a></li>
<li><a class="dropdown-item" href="/documentation/javadoc/tdb/">TDB</a></li>
<li><a class="dropdown-item" href="/documentation/javadoc/text/">Text Search</a></li>
</ul>
</li>
</ul>
<form class="d-flex" role="search" action="/search" method="GET">
<div class="input-group">
<input class="form-control border-end-0 border m-0" type="search" name="q" id="search-query" placeholder="Search...." aria-label="Search" style="width: 10rem;">
<button class="btn btn-outline-secondary border-start-0 border" type="submit">
<i class="bi-search"></i>
</button>
</div>
</form>
<ul class="navbar-nav">
<li id="ask" class="nav-item"><a class="nav-link" href="/help_and_support/index.html" title="Ask"><span class="bi-patch-question"></span><span class="text-body d-none d-xxl-inline"> Ask</span></a></li>
<li class="nav-item dropdown">
<a href="#" title="Get involved" class="nav-link dropdown-toggle" role="button" data-bs-toggle="dropdown" aria-expanded="false"><span class="bi-megaphone"></span><span class="text-body d-none d-xxl-inline"> Get involved </span><b class="caret"></b></a>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="/getting_involved/index.html">Contribute</a></li>
<li><a class="dropdown-item" href="/help_and_support/bugs_and_suggestions.html">Report a bug</a></li>
<li class="dropdown-divider"></li>
<li class="dropdown-header">Project</li>
<li><a class="dropdown-item" href="/about_jena/about.html">About Jena</a></li>
<li><a class="dropdown-item" href="/about_jena/architecture.html">Architecture</a></li>
<li><a class="dropdown-item" href="/about_jena/citing.html">Citing</a></li>
<li><a class="dropdown-item" href="/about_jena/team.html">Project team</a></li>
<li><a class="dropdown-item" href="/about_jena/contributions.html">Related projects</a></li>
<li><a class="dropdown-item" href="/about_jena/roadmap.html">Roadmap</a></li>
<li><a class="dropdown-item" href="/about_jena/security-advisories.html">Security Advisories</a></li>
<li class="dropdown-divider"></li>
<li class="dropdown-header">ASF</li>
<li><a class="dropdown-item" href="https://www.apache.org/">Apache Software Foundation</a></li>
<li><a class="dropdown-item" href="https://www.apache.org/foundation/sponsorship.html">Become a Sponsor</a></li>
<li><a class="dropdown-item" href="https://www.apache.org/licenses/LICENSE-2.0">License</a></li>
<li><a class="dropdown-item" href="https://www.apache.org/security/">Security</a></li>
<li><a class="dropdown-item" href="https://www.apache.org/foundation/thanks.html">Thanks</a></li>
</ul>
</li>
<li class="nav-item" id="edit"><a class="nav-link" href="https://github.com/apache/jena-site/edit/main/source/documentation/rdf-patch/__index.md" title="Edit this page on GitHub"><span class="bi-pencil-square"></span><span class="text-body d-none d-xxl-inline"> Edit this page</span></a></li>
</ul>
</div>
</div>
</nav>
<div class="container">
<div class="row">
<div class="col-md-12">
<div id="breadcrumbs">
<ol class="breadcrumb mt-4 p-2 bg-body-tertiary">
<li class="breadcrumb-item"><a href='/documentation'>DOCUMENTATION</a></li>
<li class="breadcrumb-item active">RDF PATCH</li>
</ol>
</div>
<h1 class="title">RDF Patch</h1>
<main class="d-flex flex-xl-row flex-column">
<aside class="text-muted align-self-start mb-3 p-0 d-xl-none d-block">
<h2 class="h6 sticky-top m-0 p-2 bg-body-tertiary">On this page</h2>
<nav id="TableOfContents">
<ul>
<li><a href="#example">Example</a></li>
<li><a href="#structure">Structure</a>
<ul>
<li><a href="#header">Header</a></li>
<li><a href="#transactions">Transactions</a></li>
<li><a href="#changes">Changes</a>
<ul>
<li><a href="#prefixes">Prefixes</a></li>
<li><a href="#quads-and-triples">Quads and Triples</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#blank-nodes">Blank nodes</a></li>
<li><a href="#preferred-style">Preferred Style</a></li>
</ul>
</nav>
</aside>
<article class="flex-column me-lg-4">
<p>This page describes RDF Patch. An RDF Patch is a set of changes to an
<a href="https://www.w3.org/TR/rdf11-concepts/#section-dataset">RDF dataset</a>.
The change are for triples, quads and prefixes.</p>
<p>Changes to triples involving blank nodes are handled by using their system
identifier which uniquely identifies a blank node. Unlike RDF syntaxes, blank
nodes are not generated afresh each time the document is parsed.</p>
<h2 id="example">Example</h2>
<p>This example ensures certain prefixes are in the dataset and adds some
basic triples for a new subclass of <code>&lt;http://example/SUPER_CLASS&gt;</code>.</p>
<pre tabindex="0"><code>TX .
PA &#34;rdf&#34; &#34;http://www.w3.org/1999/02/22-rdf-syntax-ns#&#34; .
PA &#34;owl&#34; &#34;http://www.w3.org/2002/07/owl#&#34; .
PA &#34;rdfs&#34; &#34;http://www.w3.org/2000/01/rdf-schema#&#34; .
A &lt;http://example/SubClass&gt; &lt;http://www.w3.org/1999/02/22-rdf-syntax-ns#type&gt; &lt;http://www.w3.org/2002/07/owl#Class&gt; .
A &lt;http://example/SubClass&gt; &lt;http://www.w3.org/2000/01/rdf-schema#subClassOf&gt; &lt;http://example/SUPER_CLASS&gt; .
A &lt;http://example/SubClass&gt; &lt;http://www.w3.org/2000/01/rdf-schema#label&gt; &#34;SubClass&#34; .
TC .
</code></pre><h2 id="structure">Structure</h2>
<p>The text format for an RDF Patch is N-Triples-like: it is a series of
rows, each row ends with a <code>.</code> (DOT). The tokens on a row are keywords,
URIs, blank nodes, writen with their label (see below) or RDF Literals,
in N-triples syntax. A keyword follows the same rules as
Turtle prefix declarations without a trailing <code>:</code>.</p>
<p>A line has an operation code, then some number of items depending on
the operation.</p>
<table>
<thead>
<tr>
<th>Operation</th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td><code>H</code></td>
<td>Header</td>
</tr>
<tr>
<td><code>TX</code><br/><code>TC</code><br/><code>TA</code></td>
<td>Change block: transactions</td>
</tr>
<tr>
<td><code>PA</code><br/><code>PD</code><br/></td>
<td>Change: Prefix add and delete</td>
</tr>
<tr>
<td><code>A</code><br/><code>D</code></td>
<td>Change: Add and delete triples and quads</td>
</tr>
</tbody>
</table>
<p>The general structure of an RDF patch is a header (possible empty), then a
number of change blocks.</p>
<p>Each change block is a transaction. Transactions can be explicit recorded (&lsquo;TX&rsquo;
start, <code>TC</code> commit) to include multiple transaction in one patch. They are not
required. If not present, the patch should be applied atomically to the data.</p>
<pre tabindex="0"><code>header
TX
Quad, triple or prefix changes
TC or TA
</code></pre><p>Multiple transaction blocks are allowed for multiple sets of changes in one
patch.</p>
<p>A binary version based on <a href="../io/rdf-binary/">RDF Thrift</a> is provided.
Parsing binary compared to text for N-triples achieves a x3-x4 increase in
throughput.</p>
<h3 id="header">Header</h3>
<p>The header provides for basic information about patch. It is a series of
(key, value) pairs.</p>
<p>It is better to put complex metadata in a separate file and link to it
from the header, but certain information is best kept with the patch. If
patches are given an identifier, and als refer to the exp[ected previous patch,
it create a log and patches can be applied in the right order.</p>
<p>A header section can be used to provide additional information. In this example
a patch has an identifier and refers to a previous patch. This might be used to
create a log of patches, a log being a sequnce of chnages to apply in-order.</p>
<pre tabindex="0"><code>H id &lt;uuid:0686c69d-8f89-4496-acb5-744f0157a8db&gt; .
H prev &lt;uuid:3ee0eca0-6d5f-4b4d-85db-f69ab1167eb1&gt; .
TX .
PA &#34;rdf&#34; &#34;http://www.w3.org/1999/02/22-rdf-syntax-ns#&#34; .
PA &#34;owl&#34; &#34;http://www.w3.org/2002/07/owl#&#34; .
PA &#34;rdfs&#34; &#34;http://www.w3.org/2000/01/rdf-schema#&#34; .
A &lt;http://example/SubClass&gt; &lt;http://www.w3.org/1999/02/22-rdf-syntax-ns#type&gt; &lt;http://www.w3.org/2002/07/owl#Class&gt; .
A &lt;http://example/SubClass&gt; &lt;http://www.w3.org/2000/01/rdf-schema#subClassOf&gt; &lt;http://example/SUPER_CLASS&gt; .
A &lt;http://example/SubClass&gt; &lt;http://www.w3.org/2000/01/rdf-schema#label&gt; &#34;SubClass&#34; .
TC .
</code></pre><p>Header format:</p>
<pre tabindex="0"><code>H word RDFTerm .
</code></pre><p>where <code>word</code> is a string in quotes, or an unquoted string (no spaces, starts with a letter,
same as a prefix without the colon).</p>
<p>The header is ended by the first non <code>H</code> line or the end of the patch.</p>
<h3 id="transactions">Transactions</h3>
<pre tabindex="0"><code>TX .
TC .
</code></pre><p>These delimit a block of quad, triple and prefix changes.</p>
<p>Abort, <code>TA</code> is provided so that changes can be streamed, not obliging the
application to buffer change and wait to confirm the action is
committed.</p>
<p>Transactions should be applied atomically when a patch is applied.</p>
<h3 id="changes">Changes</h3>
<p>A change is an add or delete of a quad or a prefix.</p>
<h4 id="prefixes">Prefixes</h4>
<p>Prefixes do not apply to the data of the patch. They are
changes to the data the patch is applied to.</p>
<p>The prefix name is without the trailing colon. It can be given as a
quoted string or unquoted string (keyword) with the same limitations as
Turtle on the prefix name.</p>
<pre tabindex="0"><code>PA rdf &lt;http://www.w3.org/1999/02/22-rdf-syntax-ns#&gt; .
</code></pre><p><code>PA</code> is adding a prefix, <code>PD</code> is deleting a prefix.</p>
<h4 id="quads-and-triples">Quads and Triples</h4>
<p>Triples and quads are written like N-Quads, 3 or 4 RDF terms,
with the addition of an initial <code>A</code> or <code>D</code> for &ldquo;add&rdquo; or &ldquo;delete&rdquo;.
Triples are in the order S-P-O, quads are S-P-O-G.</p>
<p>Add a triple:</p>
<pre tabindex="0"><code>A &lt;http://example/SubClass&gt; &lt;http://www.w3.org/1999/02/22-rdf-syntax-ns#type&gt; &lt;http://www.w3.org/2002/07/owl#Class&gt; .
</code></pre><h2 id="blank-nodes">Blank nodes</h2>
<p>In order to synchronize datasets, changes involving blank nodes may need
to refer to a blank node already in the data. RDF Patch deals with this
by making blank node labels refer to the &ldquo;system identifier&rdquo; for the
blank node.</p>
<p>In this way, RDF Patch is not an &ldquo;RDF Format&rdquo;. In all syntaxes for RDF
(Turtle, TriG, RDF/XML etc), blank nodes are &ldquo;document scoped&rdquo; meaning
that the blank node is unique to that one time reading of the document.
A new blank node is generated every time the file is read into a graph
or dataset, and that blank node does not appear in the existing data.</p>
<p>In practice, most RDF triplestores have some kind of internal
identifier that identifies the blank node. RDF Patch requires a &ldquo;system
identifier&rdquo; for blank nodes so that change can refer to an existing
blank node in the data.</p>
<p>These can be written as <code>_:label</code> or <code>&lt;_:label&gt;</code> (the latter provides a
wider set of permissible characters in the label). Note that <code>_</code> is
illegal as an IRI scheme to highlight the fact this is not, strictly, an
IRI.</p>
<p>RDF 1.1 describes
<a href="https://www.w3.org/TR/rdf11-concepts/#section-skolemization"><em>skolemization</em></a>
where blank nodes are replaced by a URI. A system could use those for
RDF Patch if it also meets the additional requirements to be able to
receive and reverse the mapping back to the internal blank node object
and also that all system generating patches can safely generate new,
fresh skolem IRIs that will become new blank nodes in the RDF dataset
then a patch is applied to it.</p>
<h2 id="preferred-style">Preferred Style</h2>
<p>The preferred style is to write patch rows on a single line, single
space between tokens on a row and a single space before the terminal
<code>.</code>. No comments should be included (comments start <code>#</code> and run to end of
line).</p>
<p>Headers should be placed before the item they refer to; for information
used by an RDF Patch Log, the metadata is about the whole patch and
should be at the start of the file, before any <code>TX</code>.</p>
</article>
<aside class="text-muted align-self-start mb-3 mb-xl-5 p-0 d-none d-xl-flex flex-column sticky-top">
<h2 class="h6 sticky-top m-0 p-2 bg-body-tertiary">On this page</h2>
<nav id="TableOfContents">
<ul>
<li><a href="#example">Example</a></li>
<li><a href="#structure">Structure</a>
<ul>
<li><a href="#header">Header</a></li>
<li><a href="#transactions">Transactions</a></li>
<li><a href="#changes">Changes</a>
<ul>
<li><a href="#prefixes">Prefixes</a></li>
<li><a href="#quads-and-triples">Quads and Triples</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#blank-nodes">Blank nodes</a></li>
<li><a href="#preferred-style">Preferred Style</a></li>
</ul>
</nav>
</aside>
</main>
</div>
</div>
</div>
<footer class="bd-footer py-4 py-md-5 mt-4 mt-lg-5 bg-body-tertiary">
<div class="container" style="font-size:80%" >
<p>
Copyright &copy; 2011&ndash;2024 The Apache Software Foundation, Licensed under the
<a href="https://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 src="/js/popper.min.js.js" type="text/javascript"></script>
<script src="/js/bootstrap.min.js" type="text/javascript"></script>
<script src="/js/improve.js" type="text/javascript"></script>
<script type="text/javascript">
(function() {
'use strict'
const links = document.querySelectorAll(`a[href="${window.location.pathname}"]`)
if (links !== undefined && links !== null) {
for (const link of links) {
link.classList.add('active')
let parentElement = link.parentElement
let count = 0
const levelsLimit = 4
while (['UL', 'LI'].includes(parentElement.tagName) && count <= levelsLimit) {
if (parentElement.tagName === 'LI') {
parentElement.querySelector('a:first-child').classList.add('active')
}
parentElement = parentElement.parentElement
count++
}
}
}
})()
</script>
</body>
</html>