<https://docs.linkeddatahub.com/reference/triplestores/#content>
        a       <https://w3id.org/atomgraph/linkeddatahub#XHTML>;
        <http://www.w3.org/1999/02/22-rdf-syntax-ns#value>
                "<div xmlns=\"http://www.w3.org/1999/xhtml\">\n    <p class=\"ldh-body-lg\">Requirements and configuration for alternative SPARQL backends</p>\n    <p>LinkedDataHub is designed to work with any SPARQL 1.1-compatible triplestore that supports the required protocols. While <a href=\"https://jena.apache.org/documentation/fuseki2/\" target=\"_blank\">Apache Jena Fuseki</a> is the default backend, you can use alternative triplestores by adding them as services in <samp>docker-compose.override.yml</samp> (without modifying the default <samp>docker-compose.yml</samp>).</p>\n    <div>\n        <h2 id=\"requirements\">Requirements</h2>\n        <p>For a triplestore to work with LinkedDataHub, it must support the following:</p>\n        <table>\n            <caption class=\"ac-vh\">Triplestore features and whether they are required</caption>\n            <thead>\n                <tr>\n                    <th scope=\"col\">Feature</th>\n                    <th scope=\"col\">Required</th>\n                    <th scope=\"col\">Description</th>\n                </tr>\n            </thead>\n            <tbody>\n                <tr>\n                    <td><a href=\"https://www.w3.org/TR/sparql11-query/\" target=\"_blank\">SPARQL 1.1 Query</a></td>\n                    <td>Yes</td>\n                    <td>The triplestore must implement the SPARQL 1.1 Query specification.</td>\n                </tr>\n                <tr>\n                    <td><a href=\"https://www.w3.org/TR/sparql11-update/\" target=\"_blank\">SPARQL 1.1 Update</a></td>\n                    <td>Yes</td>\n                    <td>The triplestore must implement the SPARQL 1.1 Update specification for data modifications.</td>\n                </tr>\n                <tr>\n                    <td><a href=\"https://www.w3.org/TR/sparql11-http-rdf-update/\" target=\"_blank\">Graph Store Protocol (GSP)</a></td>\n                    <td>Yes</td>\n                    <td>The triplestore must support the SPARQL 1.1 Graph Store HTTP Protocol for graph-scoped operations.</td>\n                </tr>\n                <tr>\n                    <td>Dataset-level CRUD protocol</td>\n                    <td>No</td>\n                    <td>Support for RDF dataset-scoped CRUD operations, supported by stores such as Fuseki. If not available, LinkedDataHub will fall back to graph-scoped GSP operations (slower but functional).</td>\n                </tr>\n                <tr>\n                    <td><a href=\"#authentication\">Authentication</a></td>\n                    <td>No</td>\n                    <td>Either HTTP Basic authentication or Bearer token authentication (or both). See <a href=\"#authentication\">authentication</a> below for configuration details.</td>\n                </tr>\n            </tbody>\n        </table>\n    </div>\n    <div>\n        <h2 id=\"service-configuration\">Service configuration</h2>\n        <p>Services are configured in <samp>config/system.trig</samp> using three key properties. See the <a href=\"../dataspace/#services\">dataspace reference</a> for the full list of service properties and the default Fuseki service declaration — the configuration you start with. The sections below walk through configuring an alternative backend (QLever) instead.</p>\n        <table>\n            <caption class=\"ac-vh\">Service properties, whether each is required, and an example value</caption>\n            <thead>\n                <tr>\n                    <th scope=\"col\">Property</th>\n                    <th scope=\"col\">Endpoint</th>\n                    <th scope=\"col\">Required</th>\n                    <th scope=\"col\">Example</th>\n                </tr>\n            </thead>\n            <tbody>\n                <tr>\n                    <th scope=\"row\"><code>sd:endpoint</code></th>\n                    <td>SPARQL Protocol, for Query and Update</td>\n                    <td>Yes</td>\n                    <td><code>&lt;http://qlever-host:7001/&gt;</code></td>\n                </tr>\n                <tr>\n                    <th scope=\"row\"><code>a:graphStore</code></th>\n                    <td>Graph Store Protocol, for graph-scoped CRUD</td>\n                    <td>Yes</td>\n                    <td><code>&lt;http://qlever-host:7001/&gt;</code> — QLever serves both protocols on the same URL</td>\n                </tr>\n                <tr>\n                    <th scope=\"row\"><code>a:quadStore</code></th>\n                    <td>Quad store, for dataset-level CRUD</td>\n                    <td>No — omitting it falls back to graph-scoped GSP</td>\n                    <td><code>&lt;http://fuseki:3030/end-user/&gt;</code>, which is Fuseki-specific</td>\n                </tr>\n            </tbody>\n        </table>\n        <div class=\"ac-alert va-informative\" role=\"status\">\n            <span class=\"ac-alert-ic\"><span aria-hidden=\"true\" class=\"msi outline\">info</span></span>\n            <div class=\"ac-alert-body\">\n                <span class=\"ac-alert-title\">GSP fallback mode</span>\n                <p class=\"ac-alert-text\">When <code>a:quadStore</code> is not provided, LinkedDataHub automatically uses graph-scoped Graph Store Protocol operations instead. This mode:</p>\n                <ul class=\"ac-alert-text\">\n                    <li>Works with triplestores that do not support dataset-level TriG/N-Quads uploads</li>\n                    <li>Loads data graph-by-graph rather than as a complete dataset</li>\n                    <li>Takes longer during bootstrap (more HTTP requests) but is functionally equivalent</li>\n                    <li>Is required for QLever, Tentris, and other GSP-only triplestores</li>\n                </ul>\n            </div>\n        </div>\n    </div>\n    <div>\n        <h2 id=\"authentication\">Authentication</h2>\n        <p>LinkedDataHub supports two authentication methods for SPARQL services, both configured in <samp>secrets/credentials.trig</samp>. The file is mounted as a Docker secret and is not committed to version control (the <samp>/secrets</samp> folder is gitignored). See the <a href=\"../configuration/#secrets\">configuration reference</a> for the <code>credentials</code> secret entry.</p>\n        <div class=\"ac-tabs or-horizontal\">\n            <div class=\"ac-tablist sz-md va-line\" role=\"tablist\">\n                <button aria-controls=\"http-basic-pane\" aria-selected=\"true\" class=\"ac-tab is-on\" id=\"http-basic-tab\" role=\"tab\" type=\"button\"><span class=\"ac-tab-lbl\">HTTP Basic authentication</span></button>\n                <button aria-controls=\"bearer-token-auth-pane\" aria-selected=\"false\" class=\"ac-tab\" id=\"bearer-token-auth-tab\" role=\"tab\" type=\"button\"><span class=\"ac-tab-lbl\">Bearer token authentication</span></button>\n            </div>\n            <div aria-labelledby=\"http-basic-tab\" class=\"ac-tabpanel\" id=\"http-basic-pane\" role=\"tabpanel\">\n            <p>Configure username and password using the <code>a:authUser</code> and <code>a:authPwd</code> properties:</p>\n            <pre>@prefix a: &lt;https://w3id.org/atomgraph/core#&gt; .\n\n&lt;urn:linkeddatahub:services/end-user&gt;\n{\n    &lt;urn:linkeddatahub:services/end-user&gt; a:authUser \"username\" ;\n        a:authPwd \"password\" .\n}\n\n&lt;urn:linkeddatahub:services/admin&gt;\n{\n    &lt;urn:linkeddatahub:services/admin&gt; a:authUser \"username\" ;\n        a:authPwd \"password\" .\n}</pre>\n            </div>\n            <div aria-labelledby=\"bearer-token-auth-tab\" class=\"ac-tabpanel\" hidden=\"hidden\" id=\"bearer-token-auth-pane\" role=\"tabpanel\">\n            <p>For triplestores that require Bearer token authentication (like QLever), configure the token using the <code>a:authToken</code> property:</p>\n            <pre>@prefix a: &lt;https://w3id.org/atomgraph/core#&gt; .\n\n&lt;urn:linkeddatahub:services/end-user&gt;\n{\n    &lt;urn:linkeddatahub:services/end-user&gt; a:authToken \"your-bearer-token\" .\n}\n\n&lt;urn:linkeddatahub:services/admin&gt;\n{\n    &lt;urn:linkeddatahub:services/admin&gt; a:authToken \"your-bearer-token\" .\n}</pre>\n            </div>\n        </div>\n    </div>\n    <div>\n        <h2 id=\"qlever-example\">QLever configuration example</h2>\n        <p>QLever is a high-performance triplestore optimized for text search. To configure LinkedDataHub to use QLever:</p>\n        <ol>\n            <li>\n                <p><strong>Update <samp>config/system.trig</samp></strong> to point to your QLever instance:</p>\n                <pre>@prefix lds: &lt;https://w3id.org/atomgraph/linkeddatahub/dataspaces#&gt; .\n@prefix a:    &lt;https://w3id.org/atomgraph/core#&gt; .\n@prefix sd:   &lt;http://www.w3.org/ns/sparql-service-description#&gt; .\n@prefix dct:  &lt;http://purl.org/dc/terms/&gt; .\n\n# Admin app: type and service binding\n\n&lt;urn:linkeddatahub:apps/admin&gt;\n{\n    &lt;urn:linkeddatahub:apps/admin&gt; a lds:AdminDataspace ;\n        lds:service &lt;urn:linkeddatahub:services/admin&gt; .\n}\n\n# Admin service: QLever\n\n&lt;urn:linkeddatahub:services/admin&gt;\n{\n    &lt;urn:linkeddatahub:services/admin&gt; a sd:Service ;\n        dct:title \"LinkedDataHub admin service (QLever)\" ;\n        sd:supportedLanguage sd:SPARQL11Query, sd:SPARQL11Update ;\n        sd:endpoint &lt;http://qlever-host:7001/&gt; ;\n        # a:quadStore omitted: QLever uses GSP fallback mode\n        a:graphStore &lt;http://qlever-host:7001/&gt; .\n}\n\n# End-user app: type and service binding\n\n&lt;urn:linkeddatahub:apps/end-user&gt;\n{\n    &lt;urn:linkeddatahub:apps/end-user&gt; a lds:EndUserDataspace ;\n        lds:service &lt;urn:linkeddatahub:services/end-user&gt; .\n}\n\n# End-user service: QLever\n\n&lt;urn:linkeddatahub:services/end-user&gt;\n{\n    &lt;urn:linkeddatahub:services/end-user&gt; a sd:Service ;\n        dct:title \"LinkedDataHub service (QLever)\" ;\n        sd:supportedLanguage sd:SPARQL11Query, sd:SPARQL11Update ;\n        sd:endpoint &lt;http://qlever-host:7001/&gt; ;\n        # a:quadStore omitted: QLever uses GSP fallback mode\n        a:graphStore &lt;http://qlever-host:7001/&gt; .\n}</pre>\n                <p>The <code>a:quadStore</code> property is omitted because QLever does not support dataset-level TriG/N-Quads uploads. LinkedDataHub will automatically fall back to using graph-scoped Graph Store Protocol operations (see <a href=\"#service-configuration\">service configuration</a>).</p>\n            </li>\n            <li>\n                <p><strong>Configure Bearer token authentication</strong> (QLever requires this for write operations):</p>\n                <p>Create <samp>secrets/credentials.trig</samp> with your QLever access token:</p>\n                <pre>@prefix a: &lt;https://w3id.org/atomgraph/core#&gt; .\n\n&lt;urn:linkeddatahub:services/end-user&gt;\n{\n    &lt;urn:linkeddatahub:services/end-user&gt; a:authToken \"your-qlever-bearer-token\" .\n}\n\n&lt;urn:linkeddatahub:services/admin&gt;\n{\n    &lt;urn:linkeddatahub:services/admin&gt; a:authToken \"your-qlever-bearer-token\" .\n}</pre>\n                <p>See <a href=\"#authentication\">bearer token authentication</a> for details.</p>\n            </li>\n            <li>\n                <p><strong>Uncomment the credentials secret</strong> in <samp>docker-compose.yml</samp>:</p>\n                <pre>services:\n  linkeddatahub:\n    secrets:\n      # ... other secrets ...\n      # - credentials  # uncomment this line</pre>\n            </li>\n            <li>\n                <p><strong>Start LinkedDataHub:</strong></p>\n                <pre>make up -- --build</pre>\n                <p>The <samp>--</samp> makes <samp>make</samp> forward the flags that follow it to <samp>docker-compose</samp>.</p>\n                <p>During bootstrap, LinkedDataHub will load the default datasets using graph-scoped GSP operations. This takes longer than quad store mode but is functionally equivalent.</p>\n            </li>\n        </ol>\n    </div>\n    <div>\n        <h2 id=\"troubleshooting\">Troubleshooting</h2>\n        <dl>\n            <dt>Bootstrap fails with HTTP 400 \"application/trig not supported\"</dt>\n            <dd>Your triplestore does not support dataset-level uploads. Remove the <code>a:quadStore</code> property from your service configuration to use GSP fallback mode.</dd>\n            <dt>Bootstrap fails with HTTP 401 or 403</dt>\n            <dd>Check your authentication configuration. Both Bearer token and HTTP Basic auth are configured in <samp>secrets/credentials.trig</samp>. See <a href=\"#authentication\">authentication</a> for details.</dd>\n            <dt>Queries work but data import fails</dt>\n            <dd>Ensure your triplestore supports SPARQL 1.1 Update and Graph Store Protocol, not just Query. Check the <a href=\"#requirements\">triplestore requirements</a>.</dd>\n            <dt>Connection refused errors</dt>\n            <dd>Check that the endpoint URLs are reachable from the LinkedDataHub Docker container. If running QLever in Kubernetes, use port-forwarding or set up proper networking.</dd>\n        </dl>\n        <p>For background discussion of the QLever integration, see <a href=\"https://github.com/AtomGraph/LinkedDataHub/issues/272\" target=\"_blank\">GitHub issue #272</a>.</p>\n        <p>Browse available triplestore products at <a href=\"https://kgdev.net/products/\" target=\"_blank\">kgdev.net/products/</a>.</p>\n    </div>\n    <p class=\"ldh-body-lg\">To create dataspaces on your chosen backend, follow the <a href=\"../../user-guide/manage-dataspaces/\">Manage dataspaces</a> guide.</p>\n</div>"^^<http://www.w3.org/1999/02/22-rdf-syntax-ns#XMLLiteral> .

<https://docs.linkeddatahub.com/reference/triplestores/>
        a       <https://w3id.org/atomgraph/linkeddatahub/document-hierarchy#Item>;
        <http://www.w3.org/1999/02/22-rdf-syntax-ns#_1>
                <https://docs.linkeddatahub.com/reference/triplestores/#content>;
        <http://purl.org/dc/terms/created>
                "2026-09-29T09:52:25.334Z"^^<http://www.w3.org/2001/XMLSchema#dateTime>;
        <http://purl.org/dc/terms/creator>
                <https://admin.linkeddatahub.com/acl/agents/5ba81960-d511-4a3b-8b9a-cb5bb278dd95/#this>;
        <http://purl.org/dc/terms/description>
                "Requirements and configuration for alternative SPARQL backends";
        <http://purl.org/dc/terms/title>
                "Triplestores";
        <http://rdfs.org/sioc/ns#has_container>
                <https://docs.linkeddatahub.com/reference/>;
        <http://www.w3.org/ns/auth/acl#owner>
                <https://admin.linkeddatahub.com/acl/agents/5ba81960-d511-4a3b-8b9a-cb5bb278dd95/#this> .
