<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=\"lead\">Requirements and configuration for using alternative SPARQL triplestores with LinkedDataHub</p>\n    <p>LinkedDataHub is designed to work with any SPARQL 1.1-compatible triplestore that supports the required protocols. While Apache Jena Fuseki is the default backend, you can use alternative triplestores by adding them as services in <code>docker-compose.override.yml</code> (without modifying the default <code>docker-compose.yml</code>). Browse available triplestore products at <a href=\"https://kgdev.net/products/\" target=\"_blank\">kgdev.net/products/</a>.</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 class=\"table\">\n            <thead>\n                <tr>\n                    <th>Feature</th>\n                    <th>Required</th>\n                    <th>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 Apache 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.</p>\n        <dl>\n            <dt><code>sd:endpoint</code></dt>\n            <dd>The SPARQL Protocol endpoint URI (for SPARQL Query and Update operations)</dd>\n            <dd>Example: <code>&lt;http://qlever-host:7001/&gt;</code></dd>\n            <dt><code>a:graphStore</code></dt>\n            <dd>The Graph Store Protocol endpoint URI (for graph-scoped CRUD operations)</dd>\n            <dd>Example: <code>&lt;http://qlever-host:7001/&gt;</code></dd>\n            <dd>Required for all triplestores</dd>\n            <dt><code>a:quadStore</code></dt>\n            <dd>The quad store endpoint URI (for dataset-level CRUD operations)</dd>\n            <dd>Optional — if omitted, LinkedDataHub will use graph-scoped GSP fallback</dd>\n            <dd>Example: <code>&lt;http://fuseki-host:3030/ds/&gt;</code> (Fuseki-specific)</dd>\n        </dl>\n        <div class=\"alert alert-info\">\n            <h4>GSP fallback mode</h4>\n            <p>When <code>a:quadStore</code> is not provided, LinkedDataHub automatically uses graph-scoped Graph Store Protocol operations instead. This mode:</p>\n            <ul>\n                <li>Works with triplestores that don't 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        <h2 id=\"authentication\">Authentication</h2>\n        <p>LinkedDataHub supports two authentication methods for SPARQL services, both configured in <samp>secrets/credentials.trig</samp>. See the <a href=\"../configuration/#secrets\">configuration reference</a> for the <code>credentials</code> secret entry.</p>\n        <div>\n            <h3 id=\"http-basic\">HTTP basic authentication</h3>\n            <p>Configure username and password using the <code>a:authUser</code> and <code>a:authPwd</code> properties:</p>\n            <pre><code>@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}</code></pre>\n        </div>\n        <div>\n            <h3 id=\"bearer-token\">Bearer token authentication</h3>\n            <p>For triplestores that require Bearer token authentication (like QLever), configure the token using the <code>a:authToken</code> property:</p>\n            <pre><code>@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}</code></pre>\n            <p>This file is mounted as a Docker secret and is NOT committed to git (the <samp>/secrets</samp> folder is gitignored).</p>\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. Here's how 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><code>@prefix lapp: &lt;https://w3id.org/atomgraph/linkeddatahub/apps#&gt; .\n@prefix a:    &lt;https://w3id.org/atomgraph/core#&gt; .\n@prefix ldt:  &lt;https://www.w3.org/ns/ldt#&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 + service binding\n\n&lt;urn:linkeddatahub:apps/admin&gt;\n{\n    &lt;urn:linkeddatahub:apps/admin&gt; a lapp:AdminApplication ;\n        ldt: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:graphStore &lt;http://qlever-host:7001/&gt; .\n        # Note: a:quadStore omitted - QLever uses GSP fallback mode\n}\n\n# End-user app - type + service binding\n\n&lt;urn:linkeddatahub:apps/end-user&gt;\n{\n    &lt;urn:linkeddatahub:apps/end-user&gt; a lapp:EndUserApplication ;\n        ldt: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:graphStore &lt;http://qlever-host:7001/&gt; .\n        # Note: a:quadStore omitted - QLever uses GSP fallback mode\n}</code></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><code>@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}</code></pre>\n                    <p>See <a href=\"#bearer-token\">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><code>services:\n  linkeddatahub:\n    secrets:\n      # ... other secrets ...\n      - credentials  # Uncomment this line</code></pre>\n                </li>\n                <li>\n                    <p><strong>Start LinkedDataHub:</strong></p>\n                    <pre>docker-compose up --build</pre>\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 doesn't 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 more details, see <a href=\"https://github.com/AtomGraph/LinkedDataHub/issues/272\" target=\"_blank\">GitHub issue #272</a> which documents the QLever integration process.</p>\n    </div>\n</div>"^^<http://www.w3.org/1999/02/22-rdf-syntax-ns#XMLLiteral> .

<https://docs.linkeddatahub.com/reference/triplestores/>
        a       <https://www.w3.org/ns/ldt/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-06-16T20:33:55.172Z"^^<http://www.w3.org/2001/XMLSchema#dateTime>;
        <http://purl.org/dc/terms/creator>
                <https://admin.linkeddatahub.com/acl/agents/0ab4a0f7-1ab0-4d0c-8efc-63a79a2e9a10/#this>;
        <http://purl.org/dc/terms/description>
                "Requirements and configuration for using alternative SPARQL triplestores with LinkedDataHub";
        <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/0ab4a0f7-1ab0-4d0c-8efc-63a79a2e9a10/#this> .
