You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by gi...@apache.org on 2022/08/20 11:06:46 UTC

[jena-site] branch asf-staging updated: Staged site from main-next (b22a26fc053962f8e2ce50f58056a879b799a32a)

This is an automated email from the ASF dual-hosted git repository.

git-site-role pushed a commit to branch asf-staging
in repository https://gitbox.apache.org/repos/asf/jena-site.git


The following commit(s) were added to refs/heads/asf-staging by this push:
     new 8f524230a Staged site from main-next (b22a26fc053962f8e2ce50f58056a879b799a32a)
8f524230a is described below

commit 8f524230ad95b279713dcde33202dd9ec04ac71e
Author: jenkins <bu...@apache.org>
AuthorDate: Sat Aug 20 11:06:43 2022 +0000

    Staged site from main-next (b22a26fc053962f8e2ce50f58056a879b799a32a)
---
 content/about_jena/contributions.html              |  11 +-
 .../fuseki2/fuseki-server-protocol.html            |   3 +-
 content/documentation/index.xml                    |  17 +-
 content/documentation/io/rdf-input.html            |   2 +-
 ...unctions.html => custom_service_executors.html} | 186 +++++++--------------
 content/documentation/query/index.html             |  47 ++----
 .../documentation/query/javascript-functions.html  |  21 ++-
 content/documentation/rdfconnection/index.html     |  27 +--
 content/documentation/tdb2/tdb2_admin.html         |   5 +-
 content/documentation/tdb2/tdb2_cmds.html          |   5 +
 content/documentation/tools/index.html             |   2 +-
 content/getting_involved/index.html                |   2 +-
 content/index.xml                                  |  17 +-
 content/sitemap.xml                                |  37 ++--
 14 files changed, 172 insertions(+), 210 deletions(-)

diff --git a/content/about_jena/contributions.html b/content/about_jena/contributions.html
index a2af2018d..ae64ddbfa 100644
--- a/content/about_jena/contributions.html
+++ b/content/about_jena/contributions.html
@@ -205,7 +205,7 @@ Jira issue with the details to be published.</p>
 <td>HTTP server application compliant with the GeoSPARQL standard using GeoSPARQL Jena library and Apache Jena Fuseki server</td>
 <td>Apache 2.0</td>
 <td>Greg Albiston</td>
-<td><a href="https://github.com/galbiston/geosparql-fuskei">geosparql-fuseki at GitHub</a></td>
+<td><a href="https://github.com/galbiston/geosparql-fuseki">geosparql-fuseki at GitHub</a></td>
 </tr>
 <tr>
 <td>Jastor</td>
@@ -310,14 +310,7 @@ Jira issue with the details to be published.</p>
 <td>JDBC 4 SPARQL is a type 4 JDBC Driver that uses a SPARQL endpoint (or Jena Model) as the data store.  Presents graph data as relational data to tools that understand SQL and utilize JDBC</td>
 <td>Apache 2.0 (Some components GNU LGPL V3.0)</td>
 <td>Claude Warren</td>
-<td>[jdbc4sparql at</td>
-</tr>
-<tr>
-<td>GitHub](<a href="https://github.com/Claudenw/jdbc4sparql">https://github.com/Claudenw/jdbc4sparql</a>)</td>
-<td></td>
-<td></td>
-<td></td>
-<td></td>
+<td><a href="https://github.com/Claudenw/jdbc4sparql">jdbc4sparql at GitHub</a></td>
 </tr>
 </tbody>
 </table>
diff --git a/content/documentation/fuseki2/fuseki-server-protocol.html b/content/documentation/fuseki2/fuseki-server-protocol.html
index e47a1b06c..f04cd3ac5 100644
--- a/content/documentation/fuseki2/fuseki-server-protocol.html
+++ b/content/documentation/fuseki2/fuseki-server-protocol.html
@@ -311,7 +311,7 @@ Further operations may be added within this naming scheme.</p>
 </tr>
 <tr>
 <td><tt>POST</tt></td>
-<td><code>/$/compact/{name}</code></td>
+<td><code>/$/compact/{name}?deleteOld=true</code></td>
 <td></td>
 </tr>
 <tr>
@@ -435,6 +435,7 @@ a list of file names.</p>
 <h3 id="compact">Compact</h3>
 <p>Pattern: <code>/$/compact/{name}</code></p>
 <p>This operations initiates a database compaction task and returns a JSON object with the task Id in it.</p>
+<p>The optional parameter and value <code>deleteOld=true</code> deletes the database which currently is compacted after compacting completion.</p>
 <p>Compaction <strong>ONLY</strong> applies to TDB2 datasets, see <a href="../tdb2/tdb2_admin.html#compaction">TDB2 Database Administration</a>
 for more details of this operation.</p>
 <p>You can monitor the status of the task via the Tasks portion of the API.  A successful compaction will have
diff --git a/content/documentation/index.xml b/content/documentation/index.xml
index 19f61aab0..c1b03ef98 100644
--- a/content/documentation/index.xml
+++ b/content/documentation/index.xml
@@ -297,6 +297,17 @@ In order to eliminate this limitation, Jena ARQ extends the grammar of the CONST
 See jena-examples:arq/examples/aggregates.</description>
     </item>
     
+    <item>
+      <title>ARQ - Custom Service Executors</title>
+      <link>https://jena.apache.org/documentation/query/custom_service_executors.html</link>
+      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
+      
+      <guid>https://jena.apache.org/documentation/query/custom_service_executors.html</guid>
+      <description>Since Jena 4.2.0, ARQ features a plugin system for custom service executors. The relevant classes are located in the package org.apache.jena.sparql.service and are summarized as follows:
+  ServiceExecutorRegistry: A registry that holds a list of service executors. When Jena starts up, it configures a default registry to handle SERVICE requests against HTTP SPARQL endpoints and registers it with the global ARQ context accessible under ARQ.getContext().
+  ServiceExecutorFactory: This is the main interface for custom SERVICE handler implementations:</description>
+    </item>
+    
     <item>
       <title>ARQ - Extending Query Execution</title>
       <link>https://jena.apache.org/documentation/query/arq-query-eval.html</link>
@@ -357,9 +368,9 @@ ARQ consists of the following parts:
       <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
       
       <guid>https://jena.apache.org/documentation/query/javascript-functions.html</guid>
-      <description>ARQ supports (Jena v3.7.0 onwards) writing custom SPARQL functions in JavaScript. These functions can be used in FILTERs and for calculating values to assign with AS in BIND and SELECT expressions.
+      <description>ARQ supports writing custom SPARQL functions in JavaScript. These functions can be used in FILTERs and for calculating values to assign with AS in BIND and SELECT expressions.
 XSD datatypes for strings, numbers and booleans are converted to the native JavaScript datatypes. RDFterms that do not fit easily into JavaScript datatypes are handled with a object class NV.
-Loading JavaScript functions JavaScript is loaded from an external file using the context setting &amp;ldquo;http://jena.</description>
+Requirements ARQ requires a javascript engine such as GraalVM to be added to the classpath.</description>
     </item>
     
     <item>
@@ -1855,7 +1866,7 @@ Compared to TDB1:
       <description>TDB2 is not compatible with TDB1
 Do not run TDB1 tools on a TDB2 database, nor run TDB2 tools on a TDB1 database.
 These scripts are available jena binary distribution.
- tdb2.tdbbackup tdb2.tdbdump tdb2.tdbcompact tdb2.tdbloader tdb2.tdbquery tdb2.tdbupdate  On MS Windows, these commands are called tdb2_tdbquery etc.
+ tdb2.tdbbackup tdb2.tdbdump tdb2.tdbcompact tdb2.tdbloader tdb2.tdbquery tdb2.tdbupdate tdb2.tdbstats  On MS Windows, these commands are called tdb2_tdbquery etc.
 Example usage:
 tdb2.tdbloader --loc &amp;lt;DB location&amp;gt; file1 file2 ... Note:
 tdbloader2 is a TDB1 command tool.
diff --git a/content/documentation/io/rdf-input.html b/content/documentation/io/rdf-input.html
index 1d5f81106..3d02a168b 100644
--- a/content/documentation/io/rdf-input.html
+++ b/content/documentation/io/rdf-input.html
@@ -407,7 +407,7 @@ copies of import http resources).</p>
 <h3 id="configuring-a-locationmapper">Configuring a <code>LocationMapper</code></h3>
 <p>Location mapping files are RDF, usually written in Turtle although
 an RDF syntax can be used.</p>
-<pre><code>@prefix lm: &lt;http://jena.hpl.hp.com/2004/08/location-mapping#&gt;
+<pre><code>@prefix lm: &lt;http://jena.hpl.hp.com/2004/08/location-mapping#&gt; .
 
 [] lm:mapping
    [ lm:name &quot;file:foo.ttl&quot; ;      lm:altName &quot;file:etc/foo.ttl&quot; ] ,
diff --git a/content/documentation/query/javascript-functions.html b/content/documentation/query/custom_service_executors.html
similarity index 50%
copy from content/documentation/query/javascript-functions.html
copy to content/documentation/query/custom_service_executors.html
index 646804458..06573ec17 100644
--- a/content/documentation/query/javascript-functions.html
+++ b/content/documentation/query/custom_service_executors.html
@@ -3,7 +3,7 @@
 <head>
     
 
-    <title>Apache Jena - ARQ - JavaScript SPARQL Functions</title>
+    <title>Apache Jena - ARQ - Custom Service Executors</title>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
 
@@ -124,7 +124,7 @@
 
     
 
-                <li id="edit"><a href="https://github.com/apache/jena-site/edit/main/source/documentation/query/javascript-functions.md" title="Edit this page on GitHub"><span class="glyphicon glyphicon-pencil"></span> Edit this page</a></li>
+                <li id="edit"><a href="https://github.com/apache/jena-site/edit/main/source/documentation/query/custom_service_executors.md" title="Edit this page on GitHub"><span class="glyphicon glyphicon-pencil"></span> Edit this page</a></li>
             </ul>
         </div>
     </div>
@@ -167,7 +167,7 @@
         
         
             
-                <li class="active">JAVASCRIPT FUNCTIONS</li>
+                <li class="active">CUSTOM SERVICE EXECUTORS</li>
             
             
         
@@ -179,129 +179,65 @@
 
                 
             </div>
-            <h1 class="title">ARQ - JavaScript SPARQL Functions</h1>
+            <h1 class="title">ARQ - Custom Service Executors</h1>
             
-	<p>ARQ supports (Jena v3.7.0 onwards) writing
-<a href="https://www.w3.org/TR/sparql11-query/#extensionFunctions">custom SPARQL functions</a>
-in JavaScript. These functions can be used in FILTERs and for calculating
-values to assign with AS in BIND and SELECT expressions.</p>
-<p>XSD datatypes for strings, numbers and booleans are converted to the
-native JavaScript datatypes. RDFterms that do not fit easily into
-JavaScript datatypes are handled with a object class <code>NV</code>.</p>
-<h2 id="loading-javascript-functions">Loading JavaScript functions</h2>
-<p>JavaScript is loaded from an external file using the context setting
-&ldquo;<a href="http://jena.apache.org/ARQ#js-library%22">http://jena.apache.org/ARQ#js-library&quot;</a>. This can be written as
-<code>arq:js-library</code> for commands and Fuseki configuration files.</p>
-<p>Example:</p>
-<pre><code>sparql --set arq:js-library=SomeFile.js --data ... --query ...
-</code></pre>
-<p>will execute on the data with the JavaScript functions from file
-&ldquo;SomeFile.js&rdquo; available.</p>
-<p>JavScript functions can also be set from a string directly from within Java using constant
-<code>ARQ.symJavaScriptFunctions</code> (&ldquo;<a href="http://jena.apache.org/ARQ#js-functions%22)">http://jena.apache.org/ARQ#js-functions&quot;)</a>.</p>
-<h2 id="using-javascript-functions">Using JavaScript functions</h2>
-<p>SPARQL functions implemented in JavaScript are automatically called when a
-URI starting &ldquo;<a href="http://jena.apache.org/ARQ/jsFunction#%22">http://jena.apache.org/ARQ/jsFunction#&quot;</a> used.</p>
-<p>This can conveniently be abbreviated by:</p>
-<pre><code>PREFIX js: &lt;http://jena.apache.org/ARQ/jsFunction#&gt;
-</code></pre>
-<h3 id="arguments-and-function-results">Arguments and Function Results</h3>
-<p><code>xsd:string</code> (a string with no language tag), any XSD numbers (integer,
-decimal, float, double and all the derived types) and <code>xsd:boolean</code> are
-converted to JavaScript string, number and boolean respectively.</p>
-<p>SPARQL functions must return a value. When a function returns a value,
-it can be one of these JavaScript native datatypes, in which case the
-reverse conversion is applied back to XSD datatypes.  For numbers, the
-conversion is back to <code>xsd:integer</code> (if it has no fractional part) or
-<code>xsd:double</code>.</p>
-<p>The JavaScript function can also create <code>NodeValue</code> (or <code>NV</code>) objects
-for other datatypes by calling Java from within the JavaScript script
-engine of the Java runtime.</p>
-<p>URIs are passed as <code>NV</code> object and are available in JavaScript as a string.</p>
-<p>The class <code>NV</code> is used for all other RDF terms.</p>
-<p>Returning JavaScript <code>null</code> is the error indicator and a SPARQL
-expression error (<code>ExprEvalException</code>) is raised, like any other
-expression error in SPARQL. That, in turn, will cause the whole
-expression the function is part of to evaluate to an error (unless
-a special form like <code>COALESCE</code> is used). In a <code>FILTER</code> that typically
-makes the filter evaluate to &ldquo;false&rdquo;.</p>
-<h2 id="example">Example</h2>
-<p>Suppose &ldquo;functions.js&rdquo; contains code to camel case words in a string.
-For example, &ldquo;some words to process &quot; becomes &ldquo;someWordsToProcess&rdquo;.</p>
-<pre><code>// CamelCase a string
-// Words to be combined are separated by a space in the string.
-
-function toCamelCase(str) {
-    return str.split(' ')
-    .map(cc)
-    .join('');
-}
-
-function ucFirst(word)    {
-    return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();
-}
-
-function lcFirst(word)    {
-    return word.toLowerCase();
-}
-
-function cc(word,index)   {
-    return (index == 0) ? lcFirst(word) : ucFirst(word);
-}
-</code></pre>
-<p>and the query <code>Q.rq</code></p>
-<pre><code>PREFIX js: &lt;http://jena.apache.org/ARQ/jsFunction#&gt;
-
-SELECT ?input (js:toCamelCase(?input) AS ?X)
-{
-    VALUES ?input { &quot;some woRDs to PROCESS&quot; }
-}
-</code></pre>
-<p>which can be executed with:</p>
-<pre><code>sparql --set arq:js-library=functions.js --query Q.rq
-</code></pre>
-<p>and it results in:</p>
-<pre><code>--------------------------------------------------
-| input                   | X                    |
-==================================================
-| &quot;some woRDs to PROCESS&quot; | &quot;someWordsToProcess&quot; |
---------------------------------------------------
-</code></pre>
-<h2 id="use-with-fuseki">Use with Fuseki</h2>
-<p>The context setting can be provided on the command line starting the
-server, for example:</p>
-<pre><code>fuseki --set arq:js-library=functions.js --mem /ds
-</code></pre>
-<p>or it can be specified in the server configuration file <code>config.ttl</code>:</p>
-<pre><code>PREFIX :        &lt;#&gt;
-PREFIX fuseki:  &lt;http://jena.apache.org/fuseki#&gt;
-PREFIX rdf:     &lt;http://www.w3.org/1999/02/22-rdf-syntax-ns#&gt;
-PREFIX rdfs:    &lt;http://www.w3.org/2000/01/rdf-schema#&gt;
-PREFIX ja:      &lt;http://jena.hpl.hp.com/2005/11/Assembler#&gt;
-
-[] rdf:type fuseki:Server ;
-    # Set the server-wide context
-    ja:context [
-         ja:cxtName &quot;arq:js-library&quot; ;
-         ja:cxtValue &quot;/filepath/functions.js&quot;
-    ] ;
-.
-
-&lt;#service&gt; rdf:type fuseki:Service;
-    rdfs:label                   &quot;Dataset&quot;;
-    fuseki:name                  &quot;ds&quot;;
-    fuseki:serviceQuery          &quot;sparql&quot;;
-    fuseki:dataset &lt;#dataset&gt; ;
-    .
-
-&lt;#dataset&gt; rdf:type ja:DatasetTxnMem;
-    ja:data &lt;file:D.trig&gt;;
-.
-</code></pre>
-<p>and used as:</p>
-<pre><code>fuseki --conf config.ttl
-</code></pre>
-
+	<p>Since Jena 4.2.0, ARQ features a plugin system for custom service executors.
+The relevant classes are located in the package <code>org.apache.jena.sparql.service</code> and are summarized as follows:</p>
+<ul>
+<li>
+<p><code>ServiceExecutorRegistry</code>: A registry that holds a list of service executors. When Jena starts up, it configures a default registry to handle <code>SERVICE</code> requests against HTTP SPARQL endpoints and registers it with the global ARQ context accessible under <code>ARQ.getContext()</code>.</p>
+</li>
+<li>
+<p><code>ServiceExecutorFactory</code>: This is the main interface for custom SERVICE handler implementations:</p>
+</li>
+</ul>
+<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-java" data-lang="java"><span style="color:#a2f;font-weight:bold">public</span> <span style="color:#a2f;font-weight:bold">interface</span> <span style="color:#00f">ServiceExecutorFactory</span> <span style="color:#666">{</span>
+    <span style="color:#a2f;font-weight:bold">public</span> ServiceExecution <span style="color:#00a000">createExecutor</span><span style="color:#666">(</span>OpService substituted<span style="color:#666">,</span> OpService original<span style="color:#666">,</span> Binding binding<span style="color:#666">,</span> ExecutionContext execCxt<span style="color:#666">);</span>
+<span style="color:#666">}</span>
+</code></pre></div><p>The second OpService parameter represents the original <code>SERVICE</code> clause as it occurs in the query, whereas the first parameter is the OpService obtained after substitution of all mentioned variables w.r.t. the current binding.
+A <code>ServiceExecutorFactory</code> can indicate its non-applicability for handling a request simply by returning <code>null</code>. In that case, Jena will ask the next service executor factory in the registry. If a request remains unhandled then the QueryExecException <code>No SERVICE handler</code> is raised.</p>
+<ul>
+<li><code>ServiceExecution</code>: If a <code>ServiceExectorFactory</code> can handle a request then it needs to returns a <code>ServiceExecution</code> instance:</li>
+</ul>
+<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-java" data-lang="java"><span style="color:#a2f;font-weight:bold">public</span> <span style="color:#a2f;font-weight:bold">interface</span> <span style="color:#00f">ServiceExecution</span> <span style="color:#666">{</span>
+    <span style="color:#a2f;font-weight:bold">public</span> QueryIterator <span style="color:#00a000">exec</span><span style="color:#666">();</span>
+<span style="color:#666">}</span>
+</code></pre></div><p>The actual execution is started by calling the <code>exec()</code> method which returns a <code>QueryIterator</code>.
+Note, that there are uses cases where ServiceExecution instances may not have to be executed. For example, one may analyze which service executor factories among a set of them claim to be capable of handling a request. This can be useful for debugging or display in a dashboard of applicable service executors.</p>
+<h2 id="examples">Examples</h2>
+<p>A runnable example suite is located in the jena-examples module at <a href="https://github.com/apache/jena/blob/main/jena-examples/src/main/java/arq/examples/service/CustomServiceExecutor.java">CustomServiceExecutor.java</a>.</p>
+<p>In the remainder we summarize the essentials of setting up a custom service executor.
+The following snippet sets up a simple service executor factory that relays queries targeted at Wikidata to DBpedia:</p>
+<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-java" data-lang="java">Node WIKIDATA <span style="color:#666">=</span> NodeFactory<span style="color:#666">.</span><span style="color:#b44">createURI</span><span style="color:#666">(</span><span style="color:#b44">&#34;http://query.wikidata.org/sparql&#34;</span><span style="color:#666">);</span>
+Node DBPEDIA <span style="color:#666">=</span> NodeFactory<span style="color:#666">.</span><span style="color:#b44">createURI</span><span style="color:#666">(</span><span style="color:#b44">&#34;http://dbpedia.org/sparql&#34;</span><span style="color:#666">);</span>
+
+ServiceExecutorFactory myExecutorFactory <span style="color:#666">=</span> <span style="color:#666">(</span>opExecute<span style="color:#666">,</span> original<span style="color:#666">,</span> binding<span style="color:#666">,</span> execCxt<span style="color:#666">)</span> <span style="color:#666">-&gt;</span> <span style="color:#666">{</span>
+    <span style="color:#a2f;font-weight:bold">if</span> <span style="color:#666">(</span>opExecute<span style="color:#666">.</span><span style="color:#b44">getService</span><span style="color:#666">().</span><span style="color:#b44">equals</span><span style="color:#666">(</span>WIKIDATA<span style="color:#666">))</span> <span style="color:#666">{</span>
+        opExecute <span style="color:#666">=</span> <span style="color:#a2f;font-weight:bold">new</span> OpService<span style="color:#666">(</span>DBPEDIA<span style="color:#666">,</span> opExecute<span style="color:#666">.</span><span style="color:#b44">getSubOp</span><span style="color:#666">(),</span> opExecute<span style="color:#666">.</span><span style="color:#b44">getSilent</span><span style="color:#666">());</span>
+        <span style="color:#a2f;font-weight:bold">return</span> ServiceExecutorRegistry<span style="color:#666">.</span><span style="color:#b44">httpService</span><span style="color:#666">.</span><span style="color:#b44">createExecutor</span><span style="color:#666">(</span>opExecute<span style="color:#666">,</span> original<span style="color:#666">,</span> binding<span style="color:#666">,</span> execCxt<span style="color:#666">);</span>
+    <span style="color:#666">}</span>
+    <span style="color:#a2f;font-weight:bold">return</span> <span style="color:#a2f;font-weight:bold">null</span><span style="color:#666">;</span>
+<span style="color:#666">};</span>
+</code></pre></div><h3 id="global-vs-local-service-executor-registration">Global vs Local Service Executor Registration</h3>
+<p>The global registry can be accessed and modified as shown below:</p>
+<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-java" data-lang="java">ServiceExecutorRegistry globalRegistry <span style="color:#666">=</span> ServiceExecutorRegistry<span style="color:#666">.</span><span style="color:#b44">get</span><span style="color:#666">();</span>
+
+<span style="color:#080;font-style:italic">// Note: registry.add() prepends executor factories to the internal list such
+</span><span style="color:#080;font-style:italic">// that they are consulted first!
+</span><span style="color:#080;font-style:italic"></span>globalRegistry<span style="color:#666">.</span><span style="color:#b44">add</span><span style="color:#666">(</span>myExecutorFactory<span style="color:#666">);</span>
+
+</code></pre></div><p>The following snippet shows how a custom service executor can be configured locally for an individual query execution:</p>
+<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-java" data-lang="java">Context cxt <span style="color:#666">=</span> ARQ<span style="color:#666">.</span><span style="color:#b44">getContext</span><span style="color:#666">().</span><span style="color:#b44">copy</span><span style="color:#666">();</span>
+ServiceExecutorRegistry localRegistry <span style="color:#666">=</span> ServiceExecutorRegistry<span style="color:#666">().</span><span style="color:#b44">get</span><span style="color:#666">().</span><span style="color:#b44">copy</span><span style="color:#666">();</span>
+localRegistry<span style="color:#666">.</span><span style="color:#b44">add</span><span style="color:#666">(</span>myExecutorFactory<span style="color:#666">);</span>
+
+String queryStr <span style="color:#666">=</span> <span style="color:#b44">&#34;SELECT * { SERVICE &lt;http://query.wikidata.org/sparql&gt; { ?s ?p &#34;</span>Apache Jena<span style="color:#b44">&#34;@en } }&#34;</span><span style="color:#666">;</span>
+<span style="color:#a2f;font-weight:bold">try</span> <span style="color:#666">(</span>QueryExecution qe <span style="color:#666">=</span> QueryExecutionFactory<span style="color:#666">.</span><span style="color:#b44">create</span><span style="color:#666">(</span>queryStr<span style="color:#666">))</span> <span style="color:#666">{</span>
+  ServiceExecutorRegistry<span style="color:#666">.</span><span style="color:#b44">set</span><span style="color:#666">(</span>qe<span style="color:#666">.</span><span style="color:#b44">getContext</span><span style="color:#666">(),</span> registry<span style="color:#666">);</span>
+  <span style="color:#080;font-style:italic">// ...
+</span><span style="color:#080;font-style:italic"></span><span style="color:#666">}</span>
+
+</code></pre></div>
 
         </div>
     </div>
diff --git a/content/documentation/query/index.html b/content/documentation/query/index.html
index 101297549..318d1f323 100644
--- a/content/documentation/query/index.html
+++ b/content/documentation/query/index.html
@@ -221,50 +221,29 @@ application usages</li>
 </ul>
 <p>Features of ARQ that are legal SPARQL syntax</p>
 <ul>
-<li>
-<p><a href="function_forms.html">Conditions in FILTERs</a></p>
-</li>
-<li>
-<p><a href="text-query.html">Free text searches</a></p>
-</li>
-<li>
-<p><a href="rdf_lists.html">Accessing lists</a> (RDF collections)</p>
-</li>
-<li>
-<p><a href="extension.html">Extension mechanisms</a></p>
+<li><a href="function_forms.html">Conditions in FILTERs</a></li>
+<li><a href="text-query.html">Free text searches</a></li>
+<li><a href="rdf_lists.html">Accessing lists</a> (RDF collections)</li>
+<li><a href="extension.html">Extension mechanisms</a>
 <ul>
 <li><a href="extension.html#valueFunctions">Custom Expression Functions</a></li>
 <li><a href="extension.html#property-functions">Property Functions</a></li>
 </ul>
 </li>
-<li>
-<p>Library</p>
+<li>Library
 <ul>
 <li><a href="library-function.html">Expression function library</a></li>
 <li><a href="library-propfunc.html">Property function library</a></li>
 </ul>
 </li>
-<li>
-<p><a href="writing_functions.html">Writing SPARQL functions</a></p>
-</li>
-<li>
-<p><a href="javascript-functions.html">Writing SPARQL functions in JavaScript</a></p>
-</li>
-<li>
-<p><a href="programmatic.html">Constructing queries programmatically</a></p>
-</li>
-<li>
-<p><a href="parameterized-sparql-strings.html">Parameterized query strings</a></p>
-</li>
-<li>
-<p><a href="algebra.html">ARQ and the SPARQL algebra</a></p>
-</li>
-<li>
-<p><a href="arq-query-eval.html">Extending ARQ query execution and accessing different storage implementations</a></p>
-</li>
-<li>
-<p><a href="custom_aggregates.html">Custom aggregates</a></p>
-</li>
+<li><a href="writing_functions.html">Writing SPARQL functions</a></li>
+<li><a href="javascript-functions.html">Writing SPARQL functions in JavaScript</a></li>
+<li><a href="custom_service_executors.html">Custom execution of <code>SERVICE</code></a></li>
+<li><a href="programmatic.html">Constructing queries programmatically</a></li>
+<li><a href="parameterized-sparql-strings.html">Parameterized query strings</a></li>
+<li><a href="algebra.html">ARQ and the SPARQL algebra</a></li>
+<li><a href="arq-query-eval.html">Extending ARQ query execution and accessing different storage implementations</a></li>
+<li><a href="custom_aggregates.html">Custom aggregates</a></li>
 </ul>
 <h2 id="extensions">Extensions</h2>
 <p>Feature of ARQ that go beyond SPARQL syntax. The default query
diff --git a/content/documentation/query/javascript-functions.html b/content/documentation/query/javascript-functions.html
index 646804458..6ffbac151 100644
--- a/content/documentation/query/javascript-functions.html
+++ b/content/documentation/query/javascript-functions.html
@@ -181,14 +181,31 @@
             </div>
             <h1 class="title">ARQ - JavaScript SPARQL Functions</h1>
             
-	<p>ARQ supports (Jena v3.7.0 onwards) writing
+	<p>ARQ supports writing
 <a href="https://www.w3.org/TR/sparql11-query/#extensionFunctions">custom SPARQL functions</a>
 in JavaScript. These functions can be used in FILTERs and for calculating
 values to assign with AS in BIND and SELECT expressions.</p>
 <p>XSD datatypes for strings, numbers and booleans are converted to the
 native JavaScript datatypes. RDFterms that do not fit easily into
 JavaScript datatypes are handled with a object class <code>NV</code>.</p>
-<h2 id="loading-javascript-functions">Loading JavaScript functions</h2>
+<h2 id="requirements">Requirements</h2>
+<p>ARQ requires a javascript engine such as <a href="https://www.graalvm.org/">GraalVM</a> to
+be added to the classpath.</p>
+<pre><code>    &lt;properties&gt;
+      &lt;ver.graalvm&gt;....&lt;/ver.graalvm&gt;
+      ...
+</code></pre><pre><code>    &lt;dependency&gt;
+      &lt;groupId&gt;org.graalvm.js&lt;/groupId&gt;
+      &lt;artifactId&gt;js&lt;/artifactId&gt;
+      &lt;version&gt;${ver.graalvm}/version&gt;
+    &lt;/dependency&gt;
+
+    &lt;dependency&gt;
+      &lt;groupId&gt;org.graalvm.js&lt;/groupId&gt;
+      &lt;artifactId&gt;js-scriptengine&lt;/artifactId&gt;
+      &lt;version&gt;${ver.graalvm}/version&gt;
+    &lt;/dependency&gt;
+</code></pre><h2 id="loading-javascript-functions">Loading JavaScript functions</h2>
 <p>JavaScript is loaded from an external file using the context setting
 &ldquo;<a href="http://jena.apache.org/ARQ#js-library%22">http://jena.apache.org/ARQ#js-library&quot;</a>. This can be written as
 <code>arq:js-library</code> for commands and Fuseki configuration files.</p>
diff --git a/content/documentation/rdfconnection/index.html b/content/documentation/rdfconnection/index.html
index e4c34fbe6..6b41be07d 100644
--- a/content/documentation/rdfconnection/index.html
+++ b/content/documentation/rdfconnection/index.html
@@ -195,9 +195,9 @@ passing styles, as well the more basic sequence of methods calls.</p>
 some data, and one to make a query can be written as:</p>
 <pre><code>try ( RDFConnection conn = RDFConnection.connect(...) ) {
     conn.load(&quot;data.ttl&quot;) ;
-    conn.querySelect(&quot;SELECT DISTINCT ?s { ?s ?p ?o }&quot;, (qs)-&gt;
+    conn.querySelect(&quot;SELECT DISTINCT ?s { ?s ?p ?o }&quot;, (qs) -&gt; {
        Resource subject = qs.getResource(&quot;s&quot;) ;
-       System.out.println(&quot;Subject: &quot;+subject) ;
+       System.out.println(&quot;Subject: &quot; + subject) ;
     }) ;
 }
 </code></pre>
@@ -210,7 +210,7 @@ ResultSet rs = qExec.execSelect() ;
 while(rs.hasNext()) {
     QuerySolution qs = rs.next() ;
     Resource subject = qs.getResource(&quot;s&quot;) ;
-    System.out.println(&quot;Subject: &quot;+subject) ;
+    System.out.println(&quot;Subject: &quot; + subject) ;
 }
 qExec.close() ;
 conn.close() ;
@@ -224,12 +224,12 @@ to excessive overhead.</p>
 <p>The <code>Txn</code> class provides a Java8-style transaction API.  Transactions are
 code passed in the <code>Txn</code> library that handles the transaction lifecycle.</p>
 <pre><code>try ( RDFConnection conn = RDFConnection.connect(...) ) {
-    Txn.execWrite(conn, ()-&gt; {
+    Txn.execWrite(conn, () -&gt; {
         conn.load(&quot;data1.ttl&quot;) ;
         conn.load(&quot;data2.ttl&quot;) ;
-        conn.querySelect(&quot;SELECT DISTINCT ?s { ?s ?p ?o }&quot;, (qs)-&gt;
+        conn.querySelect(&quot;SELECT DISTINCT ?s { ?s ?p ?o }&quot;, (qs) -&gt;
            Resource subject = qs.getResource(&quot;s&quot;) ;
-           System.out.println(&quot;Subject: &quot;+subject) ;
+           System.out.println(&quot;Subject: &quot; + subject) ;
         }) ;
     }) ;
 }
@@ -240,9 +240,9 @@ code passed in the <code>Txn</code> library that handles the transaction lifecyc
     try {
         conn.load(&quot;data1.ttl&quot;) ;
         conn.load(&quot;data2.ttl&quot;) ;
-        conn.querySelect(&quot;SELECT DISTINCT ?s { ?s ?p ?o }&quot;, (qs)-&gt;
+        conn.querySelect(&quot;SELECT DISTINCT ?s { ?s ?p ?o }&quot;, (qs) -&gt; {
            Resource subject = qs.getResource(&quot;s&quot;) ;
-           System.out.println(&quot;Subject: &quot;+subject) ;
+           System.out.println(&quot;Subject: &quot; + subject) ;
         }) ;
         conn.commit() ;
     } finally { conn.end() ; }
@@ -299,7 +299,7 @@ add more RDF data into a graph, and delete a graph from a dataset.</p>
 <pre><code>try ( RDFConnection conn = RDFConnection.connect(...) ) {
     conn.load(&quot;data1.ttl&quot;) ;
     conn.load(&quot;data2.nt&quot;) ;
-  }
+}
 </code></pre>
 <p>The file extension is used to determine the syntax.</p>
 <p>There is also a set of scripts to help do these operations from the command
@@ -339,9 +339,9 @@ the application should create a copy which is not attached to any external syste
 with <code>ResultSetFactory.copyResults</code>.</p>
 <pre><code>  try ( RDFConnection conn = RDFConnection.connect(&quot;https://...&quot;) ) {
       ResultSet safeCopy =
-          Txn.execReadReturn(conn, ()-&gt; {
+          Txn.execReadReturn(conn, () -&gt; {
               // Process results by row:
-              conn.querySelect(&quot;SELECT DISTINCT ?s { ?s ?p ?o }&quot;, (qs)-&gt;{
+              conn.querySelect(&quot;SELECT DISTINCT ?s { ?s ?p ?o }&quot;, (qs) -&gt; {
                   Resource subject = qs.getResource(&quot;s&quot;) ;
                   System.out.println(&quot;Subject: &quot;+subject) ;
               }) ;
@@ -353,10 +353,11 @@ with <code>ResultSetFactory.copyResults</code>.</p>
 <h2 id="update-usage">Update Usage</h2>
 <p>SPARQL Update operations can be performed and mixed with other operations.</p>
 <pre><code>  try ( RDFConnection conn = RDFConnection.connect(...) ) {
-      Txn.execWrite(conn, ()-&gt; {
+      Txn.execWrite(conn, () -&gt; {
          conn.update(&quot;DELETE DATA { ... }&quot; ) ;
          conn.load(&quot;data.ttl&quot;) ;
-         }) ;
+      }) ;
+  }
 </code></pre>
 <h2 id="dataset-operations">Dataset operations</h2>
 <p>In addition to the SPARQL Graph Store Protocol, operations on whole
diff --git a/content/documentation/tdb2/tdb2_admin.html b/content/documentation/tdb2/tdb2_admin.html
index 52562e21b..143176eff 100644
--- a/content/documentation/tdb2/tdb2_admin.html
+++ b/content/documentation/tdb2/tdb2_admin.html
@@ -209,7 +209,10 @@ can be a long time for large databases.</p>
 latest view of the RDF dataset into that directory, then switch to using
 that generation of the database.</p>
 <p>There is also a command line tool <code>tdb2.tdbcompact</code> to run the
-compaction process on a database not in use.</p>
+compaction process on a database not in use. The command line
+option  <code>--deleteOld</code> removes the last database after compaction.</p>
+<p>Compaction can also be called from <a href="/documentation/fuseki2/fuseki-server-protocol.html#compact">the Fuseki HTTP Administration Protocol</a>
+for live <a href="/documentation/fuseki2/fuseki-webapp.html">Fuseki webapps</a>.</p>
 <h2 id="backup">Backup</h2>
 <p>A TDB2 database can be backed up by calling:</p>
 <pre><code>DatabaseMgr.backup(dataset.asDatasetGraph());
diff --git a/content/documentation/tdb2/tdb2_cmds.html b/content/documentation/tdb2/tdb2_cmds.html
index a684959ce..d4f2df2af 100644
--- a/content/documentation/tdb2/tdb2_cmds.html
+++ b/content/documentation/tdb2/tdb2_cmds.html
@@ -191,6 +191,7 @@
 <li><code>tdb2.tdbloader</code></li>
 <li><code>tdb2.tdbquery</code></li>
 <li><code>tdb2.tdbupdate</code></li>
+<li><code>tdb2.tdbstats</code></li>
 </ul>
 <p>On MS Windows, these commands are called <code>tdb2_tdbquery</code> etc.</p>
 <p>Example usage:</p>
@@ -256,6 +257,10 @@ and then 2 threads in parallel for building the other indexes.</p>
 performance providing enough RAM is available and the persistent storage
 is SSD. It can consume all hardware resources, greatly impacting
 any other applications running.</p>
+<h2 id="tdb2tdbstats"><code>tdb2.tdbstats</code></h2>
+<p>Produce statistics for the dataset, which can be used for optimization rules. See the
+<a href="../tdb/optimizer.html#statistics-rule-file">TDB Optimizer description.</a>.</p>
+<p>For TDB2 the statistic files is read and placed in the <code>Data-NNNN</code> directory (<code>Data-0001/stats.opt</code>).</p>
 
 
         </div>
diff --git a/content/documentation/tools/index.html b/content/documentation/tools/index.html
index c1feaa31c..7dc42ceb2 100644
--- a/content/documentation/tools/index.html
+++ b/content/documentation/tools/index.html
@@ -290,7 +290,7 @@ pages describe these further.</p>
 <p><strong><code>tdbbackup</code></strong>, <strong><code>tdb2.tdbbackup</code></strong>: create a gzipped copy of the Fuseki dataset&rsquo;s triples.</p>
 </li>
 <li>
-<p><strong><code>tdbcompact</code></strong>, <strong><code>tdb2.tdbcompact</code></strong>: reduce the size of the Fuseki dataset.</p>
+<p><strong>not implemented for TDB1</strong>, <strong><code>tdb2.tdbcompact</code></strong>: reduce the size of the Fuseki dataset.</p>
 </li>
 </ul>
 <h4 id="other-handy-command-line-tools">Other Handy Command Line Tools</h4>
diff --git a/content/getting_involved/index.html b/content/getting_involved/index.html
index 61a770e69..a303de078 100644
--- a/content/getting_involved/index.html
+++ b/content/getting_involved/index.html
@@ -199,7 +199,7 @@ cd jena-site
 <p>See also how to <a href="/download/maven.html">use Jena with Maven</a>.</p>
 <p>If you have problems with any of our SNAPSHOTs, <a href="/help_and_support/">let us know</a>.</p>
 <p>You can check the state of each Jena development builds
-on the <a href="https://builds.apache.org/pview/?match=Jena_.*">Apache Jenkins continuous integration server</a>.</p>
+on the <a href="https://builds.apache.org/job/Jena/">Apache Jenkins continuous integration server</a>.</p>
 <h3 id="git-repository">Git repository</h3>
 <p>You can find the Jena source code in the Apache git repository:
 <a href="https://gitbox.apache.org/repos/asf/jena.git">https://gitbox.apache.org/repos/asf/jena.git</a></p>
diff --git a/content/index.xml b/content/index.xml
index 6bd65ed52..1308e6003 100644
--- a/content/index.xml
+++ b/content/index.xml
@@ -340,6 +340,17 @@ In order to eliminate this limitation, Jena ARQ extends the grammar of the CONST
 See jena-examples:arq/examples/aggregates.</description>
     </item>
     
+    <item>
+      <title>ARQ - Custom Service Executors</title>
+      <link>https://jena.apache.org/documentation/query/custom_service_executors.html</link>
+      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
+      
+      <guid>https://jena.apache.org/documentation/query/custom_service_executors.html</guid>
+      <description>Since Jena 4.2.0, ARQ features a plugin system for custom service executors. The relevant classes are located in the package org.apache.jena.sparql.service and are summarized as follows:
+  ServiceExecutorRegistry: A registry that holds a list of service executors. When Jena starts up, it configures a default registry to handle SERVICE requests against HTTP SPARQL endpoints and registers it with the global ARQ context accessible under ARQ.getContext().
+  ServiceExecutorFactory: This is the main interface for custom SERVICE handler implementations:</description>
+    </item>
+    
     <item>
       <title>ARQ - Extending Query Execution</title>
       <link>https://jena.apache.org/documentation/query/arq-query-eval.html</link>
@@ -400,9 +411,9 @@ ARQ consists of the following parts:
       <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
       
       <guid>https://jena.apache.org/documentation/query/javascript-functions.html</guid>
-      <description>ARQ supports (Jena v3.7.0 onwards) writing custom SPARQL functions in JavaScript. These functions can be used in FILTERs and for calculating values to assign with AS in BIND and SELECT expressions.
+      <description>ARQ supports writing custom SPARQL functions in JavaScript. These functions can be used in FILTERs and for calculating values to assign with AS in BIND and SELECT expressions.
 XSD datatypes for strings, numbers and booleans are converted to the native JavaScript datatypes. RDFterms that do not fit easily into JavaScript datatypes are handled with a object class NV.
-Loading JavaScript functions JavaScript is loaded from an external file using the context setting &amp;ldquo;http://jena.</description>
+Requirements ARQ requires a javascript engine such as GraalVM to be added to the classpath.</description>
     </item>
     
     <item>
@@ -2138,7 +2149,7 @@ Compared to TDB1:
       <description>TDB2 is not compatible with TDB1
 Do not run TDB1 tools on a TDB2 database, nor run TDB2 tools on a TDB1 database.
 These scripts are available jena binary distribution.
- tdb2.tdbbackup tdb2.tdbdump tdb2.tdbcompact tdb2.tdbloader tdb2.tdbquery tdb2.tdbupdate  On MS Windows, these commands are called tdb2_tdbquery etc.
+ tdb2.tdbbackup tdb2.tdbdump tdb2.tdbcompact tdb2.tdbloader tdb2.tdbquery tdb2.tdbupdate tdb2.tdbstats  On MS Windows, these commands are called tdb2_tdbquery etc.
 Example usage:
 tdb2.tdbloader --loc &amp;lt;DB location&amp;gt; file1 file2 ... Note:
 tdbloader2 is a TDB1 command tool.
diff --git a/content/sitemap.xml b/content/sitemap.xml
index 8df679150..f55e6dc61 100644
--- a/content/sitemap.xml
+++ b/content/sitemap.xml
@@ -9,7 +9,7 @@
   
   <url>
     <loc>https://jena.apache.org/about_jena.html</loc>
-    <lastmod>2022-01-21T20:55:23+00:00</lastmod>
+    <lastmod>2022-07-16T22:27:24+02:00</lastmod>
   </url>
   
   <url>
@@ -104,12 +104,12 @@
   
   <url>
     <loc>https://jena.apache.org/documentation/sparql-apis/</loc>
-    <lastmod>2022-06-24T14:57:51+01:00</lastmod>
+    <lastmod>2022-08-20T12:05:43+01:00</lastmod>
   </url>
   
   <url>
     <loc>https://jena.apache.org/documentation/query/</loc>
-    <lastmod>2021-11-05T16:04:36+00:00</lastmod>
+    <lastmod>2022-05-31T09:58:44+01:00</lastmod>
   </url>
   
   <url>
@@ -129,7 +129,7 @@
   
   <url>
     <loc>https://jena.apache.org/documentation/query/service.html</loc>
-    <lastmod>2022-06-24T14:57:51+01:00</lastmod>
+    <lastmod>2022-08-20T12:05:43+01:00</lastmod>
   </url>
   
   <url>
@@ -157,6 +157,11 @@
     <lastmod>2021-11-15T19:40:46+00:00</lastmod>
   </url>
   
+  <url>
+    <loc>https://jena.apache.org/documentation/query/custom_service_executors.html</loc>
+    <lastmod>2022-05-31T09:58:44+01:00</lastmod>
+  </url>
+  
   <url>
     <loc>https://jena.apache.org/documentation/query/arq-query-eval.html</loc>
     <lastmod>2021-11-15T19:40:46+00:00</lastmod>
@@ -184,7 +189,7 @@
   
   <url>
     <loc>https://jena.apache.org/documentation/query/javascript-functions.html</loc>
-    <lastmod>2020-08-10T23:07:00+12:00</lastmod>
+    <lastmod>2022-06-16T20:53:40+01:00</lastmod>
   </url>
   
   <url>
@@ -269,7 +274,7 @@
   
   <url>
     <loc>https://jena.apache.org/documentation/tools/</loc>
-    <lastmod>2021-09-04T18:49:14+01:00</lastmod>
+    <lastmod>2022-07-27T16:28:14+02:00</lastmod>
   </url>
   
   <url>
@@ -324,7 +329,7 @@
   
   <url>
     <loc>https://jena.apache.org/documentation.html</loc>
-    <lastmod>2022-06-24T14:57:51+01:00</lastmod>
+    <lastmod>2022-08-20T12:05:43+01:00</lastmod>
   </url>
   
   <url>
@@ -394,7 +399,7 @@
   
   <url>
     <loc>https://jena.apache.org/documentation/fuseki2/fuseki-server-protocol.html</loc>
-    <lastmod>2021-03-29T09:48:59+01:00</lastmod>
+    <lastmod>2022-07-27T16:28:14+02:00</lastmod>
   </url>
   
   <url>
@@ -454,7 +459,7 @@
   
   <url>
     <loc>https://jena.apache.org/getting_involved/</loc>
-    <lastmod>2021-06-26T10:19:21+01:00</lastmod>
+    <lastmod>2022-07-16T22:27:24+02:00</lastmod>
   </url>
   
   <url>
@@ -464,7 +469,7 @@
   
   <url>
     <loc>https://jena.apache.org/getting_involved.html</loc>
-    <lastmod>2021-06-26T10:19:21+01:00</lastmod>
+    <lastmod>2022-07-16T22:27:24+02:00</lastmod>
   </url>
   
   <url>
@@ -484,7 +489,7 @@
   
   <url>
     <loc>https://jena.apache.org/documentation/sparql-apis/http-auth.html</loc>
-    <lastmod>2022-05-24T13:22:20+01:00</lastmod>
+    <lastmod>2022-08-20T12:04:21+01:00</lastmod>
   </url>
   
   <url>
@@ -614,7 +619,7 @@
   
   <url>
     <loc>https://jena.apache.org/about_jena/contributions.html</loc>
-    <lastmod>2020-02-28T13:09:12+01:00</lastmod>
+    <lastmod>2022-07-16T22:27:24+02:00</lastmod>
   </url>
   
   <url>
@@ -674,7 +679,7 @@
   
   <url>
     <loc>https://jena.apache.org/documentation/rdfconnection/</loc>
-    <lastmod>2021-11-15T19:40:46+00:00</lastmod>
+    <lastmod>2022-06-15T14:52:32+02:00</lastmod>
   </url>
   
   <url>
@@ -694,7 +699,7 @@
   
   <url>
     <loc>https://jena.apache.org/documentation/io/rdf-input.html</loc>
-    <lastmod>2022-03-02T23:34:42+00:00</lastmod>
+    <lastmod>2022-07-19T19:17:05+02:00</lastmod>
   </url>
   
   <url>
@@ -1014,12 +1019,12 @@
   
   <url>
     <loc>https://jena.apache.org/documentation/tdb2/tdb2_cmds.html</loc>
-    <lastmod>2021-06-18T18:11:15+02:00</lastmod>
+    <lastmod>2022-07-27T16:28:14+02:00</lastmod>
   </url>
   
   <url>
     <loc>https://jena.apache.org/documentation/tdb2/tdb2_admin.html</loc>
-    <lastmod>2020-02-28T13:09:12+01:00</lastmod>
+    <lastmod>2022-07-27T16:28:14+02:00</lastmod>
   </url>
   
   <url>