From 53c2f320c6b8a25febc0fe7af815d8cdb34cff64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martynas=20Jusevi=C4=8Dius?= Date: Fri, 28 Aug 2026 17:22:53 +0200 Subject: [PATCH 1/4] Display "Orders handled by this employee" view in table mode Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01C17WzuUXBuyAxZ3nQASCNg --- demo/northwind-traders/admin/model/ns.ttl | 2 ++ 1 file changed, 2 insertions(+) diff --git a/demo/northwind-traders/admin/model/ns.ttl b/demo/northwind-traders/admin/model/ns.ttl index c46c722..3f5e351 100644 --- a/demo/northwind-traders/admin/model/ns.ttl +++ b/demo/northwind-traders/admin/model/ns.ttl @@ -1,5 +1,6 @@ @prefix : <#> . @prefix ldh: . +@prefix ac: . @prefix rdfs: . @prefix owl: . @prefix sp: . @@ -263,6 +264,7 @@ schema:broker ldh:inverseView :OrdersHandledByEmployee . :OrdersHandledByEmployee a ldh:View ; dct:title "Orders handled by this employee" ; spin:query :SelectOrdersHandledByEmployee ; + ac:mode ac:TableMode ; rdfs:isDefinedBy : . :SelectOrdersHandledByEmployee a sp:Select ; From cd753a0a8f1d1390e351a64b9ad9e3f8b00453a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martynas=20Jusevi=C4=8Dius?= Date: Sun, 30 Aug 2026 22:20:20 +0200 Subject: [PATCH 2/4] SKOS stylesheet cleanup --- demo/unesco-thesaurus/layout.xsl | 61 -------------------------------- packages/skos/layout.xsl | 6 ---- 2 files changed, 67 deletions(-) delete mode 100644 demo/unesco-thesaurus/layout.xsl diff --git a/demo/unesco-thesaurus/layout.xsl b/demo/unesco-thesaurus/layout.xsl deleted file mode 100644 index bea9ee2..0000000 --- a/demo/unesco-thesaurus/layout.xsl +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - - -]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/packages/skos/layout.xsl b/packages/skos/layout.xsl index bea9ee2..94c1fc6 100644 --- a/packages/skos/layout.xsl +++ b/packages/skos/layout.xsl @@ -50,12 +50,6 @@ exclude-result-prefixes="#all"> - - - - - - \ No newline at end of file From 85c22795d1f23587b85c0ed4182b4388132eefb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martynas=20Jusevi=C4=8Dius?= Date: Sun, 30 Aug 2026 22:58:57 +0200 Subject: [PATCH 3/4] Document the ldh CLI, declarative packages and admin subdomain MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - command-line-interface: rewritten for the ldh executable — build and PATH setup, PKCS12 keystore auth, LDH_* environment defaults, stdout and exit code conventions, the command table (#scripts is now #commands) and a deprecation note for the bin/ HTTP API scripts - every page that invoked a script now invokes a command: upload-file, create-documents, create-content (--fragment is --uri), import-csv/rdf, change-model (create-construct.sh etc. never existed — they are ldh admin ontologies add-constructor/add-class/add-property-constraint) and the data-model CLI tables - manage-packages / administration/packages: packages are installed by declaring one ldh:import triple, composed at request time; drop the Actions dropdown, the packages/install endpoints and the docker-compose restart step - http-api: drop the removed package endpoints, document the settings endpoint, and correct the container hierarchy predicate to sioc:has_parent - admin app URLs use the admin. subdomain, not an /admin path; examples use localhost:4443 and a single example agent URI throughout - get-an-account: the CLI reads the .p12 keystore directly, PEM is only needed for curl Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_014Tgf5DjbYiX3SPnCFSgCzd --- docs/get-started/get-an-account.ttl | 4 +- docs/reference/administration/packages.ttl | 85 ++---- docs/reference/command-line-interface.ttl | 268 ++++++++++++------ docs/reference/data-model/blocks/objects.ttl | 6 +- docs/reference/data-model/blocks/xhtml.ttl | 6 +- .../data-model/documents/containers.ttl | 12 +- docs/reference/data-model/documents/items.ttl | 12 +- docs/reference/data-model/resources.ttl | 18 +- docs/reference/http-api.ttl | 36 ++- docs/user-guide/build-apps.ttl | 2 +- docs/user-guide/change-model.ttl | 36 +-- .../user-guide/create-data/create-content.ttl | 17 +- .../create-data/create-documents.ttl | 4 +- .../import-data/import-csv-data.ttl | 21 +- .../import-data/import-rdf-data.ttl | 40 ++- docs/user-guide/manage-packages.ttl | 107 +++---- docs/user-guide/upload-file.ttl | 27 +- 17 files changed, 403 insertions(+), 298 deletions(-) diff --git a/docs/get-started/get-an-account.ttl b/docs/get-started/get-an-account.ttl index bd5cf59..34421a0 100644 --- a/docs/get-started/get-an-account.ttl +++ b/docs/get-started/get-an-account.ttl @@ -49,8 +49,8 @@ -

You'll need a PEM version of the certificate for use with the command line interface scripts. During setup, it is stored under - ssl/owner/cert.pem. If you got the certificate by email, you need to convert the PKCS12 file to PEM using OpenSSL.

+

The command line interface reads the PKCS12 (.p12) file directly, so no conversion is needed. During setup it is stored under ssl/owner/keystore.p12. + curl wants a PEM version instead — it is stored under ssl/owner/cert.pem, and a certificate received by email can be converted from PKCS12 to PEM using OpenSSL.

Unlike most LinkedDataHub resources, your WebID profile will have public access as required by the protocol. Your email address will be hidden however.

diff --git a/docs/reference/administration/packages.ttl b/docs/reference/administration/packages.ttl index b014acc..f5bcc9d 100644 --- a/docs/reference/administration/packages.ttl +++ b/docs/reference/administration/packages.ttl @@ -12,10 +12,10 @@ rdf:value """

Packages are reusable bundles of ontologies and stylesheets that provide vocabulary support with custom rendering for specific RDF vocabularies.

-

Version: Packages were introduced in LinkedDataHub 5.2.

+

Version: Packages were introduced in LinkedDataHub 5.2. Since 5.10 an application installs one by declaring a single ldh:import triple in its settings, replacing the packages/install and packages/uninstall endpoints and the file system mutations they performed.

-

Note: Packages are declarative only (RDF + XSLT). They contain no Java code and integrate at installation-time, not runtime.

+

Note: Packages are declarative only (RDF + XSLT). They contain no Java code, and they are composed into the application at request time rather than copied into it.

What are packages?

@@ -109,65 +109,37 @@ ns:SelectNarrowerConcepts a sp:Select ;

Installing packages

-

Installation requires Control access to the administration application. See the step-by-step installation guide for detailed instructions.

-

Installation will fail if these files do not exist.

-

Installation process

-

When you install a package, the system performs the following steps:

+

An application imports a package with a single triple in its settings:

+
<urn:linkeddatahub:apps/end-user> ldh:import <https://packages.linkeddatahub.com/skos/#this> .
+

That declaration is the installation — nothing is copied into the dataspace or onto the file system. Packages are installed into the end-user application of a dataspace, and writing the triple requires write access to its settings document. See the step-by-step installation guide for the user interface and command line instructions.

+

What the declaration does

+

From the next request onwards, the server resolves the declaration:

    -
  1. Fetches package metadata from the package URI
  2. -
  3. Hashes the package ontology URI using SHA-1 to create a unique document slug
  4. -
  5. Downloads package ontology (ns.ttl) and PUTs it as a document to ${admin_base}ontologies/{hash}/ where {hash} is the SHA-1 hash of the ontology URI
  6. -
  7. Adds owl:imports from the namespace ontology to the package ontology in the namespace graph (${admin_base}ontologies/namespace/)
  8. -
  9. Clears and reloads the namespace ontology from cache to pick up the new imports
  10. -
  11. Downloads package stylesheet (layout.xsl) and saves it to /static/{package-path}/layout.xsl where {package-path} is derived from the package URI (e.g., com/linkeddatahub/packages/skos/ for https://packages.linkeddatahub.com/skos/)
  12. -
  13. Updates master stylesheet at /static/xsl/layout.xsl by adding import: -
    <xsl:import href="../com/atomgraph/linkeddatahub/xsl/bootstrap/2.3.2/layout.xsl"/>  <!-- System -->
    -<xsl:import href="../com/linkeddatahub/packages/skos/layout.xsl"/>  <!-- Package (added) -->
    -
  14. +
  15. Resolves the package description from the package URI. Bundled descriptions and cached graphs are read from the graph repository, other URIs are dereferenced over HTTP.
  16. +
  17. Adds the package ontology (ldt:ontology) to the application's ontology imports closure, so the package's classes, constructors, constraints and views become available on the ns endpoint and in the UI.
  18. +
  19. Composes the package stylesheet (ac:stylesheet) into the application stylesheet by appending an xsl:import after the existing imports, so package templates override the system ones.
-
-

Important: After installing or uninstalling a package, you must restart the Docker service for XSLT stylesheet changes to take effect:

-
docker-compose restart linkeddatahub
-

Do not use --force-recreate as that would overwrite the stylesheet file changes.

-
+

Packages are applied in the order of their URIs. A package carrying only an ontology or only a stylesheet is applied in that respect alone, and one whose description cannot be resolved is skipped. If the composed stylesheet fails to compile — an unreachable package stylesheet URL, for instance — the application falls back to its own stylesheet.

Uninstalling packages

-

Packages can be safely uninstalled, which removes:

-
    -
  • Package ontology imports from the application
  • -
  • Package-specific data and resources
  • -
  • Associated queries and stylesheets
  • -
+

Removing the ldh:import triple uninstalls the package: from the next request onwards its ontology is out of the imports closure and its stylesheet is no longer composed in.

-

Note: Uninstalling a package does not remove user-created data that uses the package's vocabulary.

+

Note: Uninstalling a package does not remove user-created data that uses the package's vocabulary. That data stays in the dataspace but may not display or function correctly without the package.

Architecture

-

Installation-time vs runtime

-

Packages use installation-time composition, NOT runtime composition:

+

Runtime composition

+

Packages are composed at request time out of the declaration, not integrated into the application ahead of it:

    -
  • ✅ Package content is integrated during installation (via JAX-RS endpoints)
  • -
  • ✅ Ontology and XSLT are pre-composed before being loaded
  • -
  • ✅ No runtime overhead
  • -
  • ❌ No dynamic package loading at request time
  • +
  • The dataspace settings hold one ldh:import triple per package and nothing else
  • +
  • The ontology closure and the stylesheet imports are assembled from the resolved package descriptions
  • +
  • Installing and uninstalling take effect on the next request — no restart, no file system mutation
-

HTTP endpoints

-

Package installation and uninstallation is performed via system endpoints on the admin application. See packages/install and packages/uninstall in the HTTP API reference.

-

File system structure

-

After installing the SKOS package:

-
webapp/
-├── static/
-│   ├── com/
-│   │   └── linkeddatahub/
-│   │       └── packages/
-│   │           └── skos/
-│   │               └── layout.xsl          # Package stylesheet
-│   └── xsl/
-│       ├── layout.xsl                      # End-user master stylesheet
-│       └── admin/
-│           └── layout.xsl                  # Admin master stylesheet
+
+

Packages installed with releases before 5.10 were webapp file mutations and do not carry over. Re-declare them with ldh:import.

+

Creating custom packages

@@ -202,12 +174,17 @@ schema:knows ldh:view :PersonKnows . ac:stylesheet <https://raw.githubusercontent.com/you/repo/master/packages/schema.org/layout.xsl> .

Ensure the metadata contains ldt:ontology and ac:stylesheet properties pointing to the package resources.

Test installation

-

Use the CLI to test your package installation:

-
install-package.sh \\
-  -b "https://localhost:4443/" \\
-  -f ssl/owner/cert.pem \\
+    

Use the CLI to test your package installation — declaring the ldh:import triple in the application's settings document is the installation:

+
ldh patch \\
+  -f ssl/owner/keystore.p12 \\
   -p "$cert_password" \\
-  --package "https://packages.linkeddatahub.com/schema.org/#this"
+ "https://localhost:4443/settings" <<EOF +INSERT +{ + <urn:linkeddatahub:apps/end-user> <https://w3id.org/atomgraph/linkeddatahub#import> <https://packages.linkeddatahub.com/schema.org/#this> . +} +WHERE {} +EOF

Available packages

diff --git a/docs/reference/command-line-interface.ttl b/docs/reference/command-line-interface.ttl index def280c..2cd02af 100644 --- a/docs/reference/command-line-interface.ttl +++ b/docs/reference/command-line-interface.ttl @@ -5,29 +5,49 @@ <> a dh:Item ; dct:title "Command line interface" ; - dct:description "CLI scripts can be used perform all actions available in the UI" ; + dct:description "The ldh CLI can be used to perform all actions available in the UI" ; rdf:_1 <#content> . <#content> a ldh:XHTML ; rdf:value """
-

CLI scripts can be used perform all actions available in the UI

-

LinkedDataHub CLI wraps the HTTP API into a set of shell scripts with convenient parameters. The scripts should run on any Unix-based system. - They can be used for testing, automation, scheduled execution and such. It is usually much quicker to perform actions using CLI rather than the +

The ldh CLI can be used to perform all actions available in the UI

+

LinkedDataHub CLI wraps the HTTP API into a single executable with convenient parameters. + It can be used for testing, automation, scheduled execution and such. It is usually much quicker to perform actions using the CLI rather than the user interface, as well as easier to reproduce.

-

Some scripts correspond to a single request to LinkedDataHub, others combine others into tasks with multiple interdependent requests, such as the CSV import.

-

You will need to supply a .pem file of your WebID certificate as well as its password as script arguments, among others.

-
-

The CLI scripts live in the bin folder and need to be added to the $PATH environmental variable. For example:

-
export PATH="$(find bin -type d -exec realpath {} \\; | tr '\n' ':')$PATH"
-

They also use the Jena's CLI commands internally, so make sure to have them on $PATH before running the scripts.

+

Some commands correspond to a single request to LinkedDataHub, others combine several into tasks with multiple interdependent requests, such as the CSV import.

+

You will need a .p12 keystore of your WebID certificate as well as its password, among other arguments.

+
+

Install

+

The CLI lives in the cli folder of the LinkedDataHub repository. Building it requires Java 21 and Maven. The build produces a self-contained target/ldh.jar which the cli/bin/ldh launcher runs:

+
cd cli
+mvn package
+export PATH="$PWD/bin:$PATH"
+cd ..
+
+ldh --help
+

If you will be using the CLI regularly, add the export line to your shell profile. Shell completion for bash and zsh is generated by the CLI itself:

+
source <(ldh generate-completion)
+
+

The CLI talks to the HTTP API directly and embeds Apache Jena. Unlike the shell scripts it replaces, it needs no curl, python or Jena command line tools on $PATH.

+
+
+
+

Authentication

+

Commands authenticate with a WebID client certificate read from a PKCS12 (.p12) keystore — the format produced by bin/webid-keygen.sh and shipped as ssl/owner/keystore.p12 for the owner agent:

+
ldh get \\
+  -f ./ssl/owner/keystore.p12 \\
+  -p "$owner_cert_password" \\
+  --accept text/turtle \\
+  "https://localhost:4443/"
+

Server certificates are not validated, so self-signed development instances work out of the box.

Parameters

-

Common parameters used by most scripts include:

+

Common parameters used by most commands include:

-f
-
--cert-pem-file
-
.pem file with the WebID certificate of the agent
+
--cert-file
+
.p12 (PKCS12) keystore with the WebID certificate of the agent
-p
--cert-password
Password of the WebID certificate
@@ -38,46 +58,92 @@
The host this request will be proxied through (optional)
It can be used with port 5443 for which the client certificate authentication is always enabled, for example --proxy https://localhost:5443/
-

Other parameters are script-specific.

+

Other parameters are command-specific. Most commands take the URI of the document they act on as a default (positional) parameter.

+

Environment variables

+

The repeated parameters can be set once in the environment instead of being passed to every command:

+ + + + + + + + + + + + + + + + + + + + + + + + + +
VariableParameter
LDH_CERT_FILE-f, --cert-file
LDH_CERT_PASSWORD-p, --cert-password
LDH_BASE-b, --base
LDH_PROXY--proxy
+
export LDH_CERT_FILE=./ssl/owner/keystore.p12
+export LDH_CERT_PASSWORD="$owner_cert_password"
+export LDH_BASE=https://localhost:4443/
+
+ldh create-container --parent "$LDH_BASE" --title "Concepts" --slug concepts
+
+
+

Output

+

Commands that create or append to a document print its URL as the only line on standard output, so they compose in shell pipelines. All diagnostics go to standard error.

+
item=$(ldh create-item --container "$LDH_BASE" --title "Example" --slug example)
+

Exit codes are 0 on success, 1 on an HTTP error status or runtime failure (the message goes to standard error, a stack trace with --verbose), and 2 on a usage error.

Usage

-

A usage message with parameters of a script is printed when the scripted is run without any arguments. There can be named parameters and default parameters, both of those can be optional. For example:

-
$ add-select.sh
-Creates a SPARQL SELECT query.
-
-Usage:  add-select.sh options
-
-Options:
-  -f, --cert-pem-file CERT_FILE        .pem file with the WebID certificate of the agent
-  -p, --cert-password CERT_PASSWORD    Password of the WebID certificate
-  -b, --base BASE_URI                  Base URI of the application
-  --proxy PROXY_URL                    The host this request will be proxied through (optional)
-
-  --title TITLE                        Title of the chart
-  --description DESCRIPTION            Description of the chart (optional)
-  --uri URI                            URI of the query (optional)
-
-  --query-file ABS_PATH                Absolute path to the text file with the SPARQL query string
-  --service SERVICE_URI                URI of the SPARQL service specific to this query (optional)
-

The optional parameters are marked with (Optional). In this case there is no default argument, but some scripts require document (named graph) URI as the default parameter, e.g. ontology document URL.

-

This is how an add-select.sh invocation would look like:

-
add-select.sh \\
+        

A usage message with the parameters of a command is printed when the command is run without required arguments, or with --help. There can be named parameters and default parameters, both of those can be optional. For example:

+
$ ldh add-select
+Missing required options and parameters: '--title=TITLE', '--query-file=ABS_PATH', 'TARGET_URI'
+Usage: ldh add-select [--verbose] [-b=BASE_URI] [--description=DESCRIPTION]
+                      [-f=CERT_FILE] [-p=CERT_PASSWORD] [--proxy=PROXY_URL]
+                      --query-file=ABS_PATH [--service=SERVICE_URI]
+                      --title=TITLE [--uri=URI] TARGET_URI
+Adds a SELECT query to a document.
+      TARGET_URI            URI of the document
+  -b, --base=BASE_URI       Base URI of the application (env: LDH_BASE)
+      --description=DESCRIPTION
+                            Description of the query (optional)
+  -f, --cert-file=CERT_FILE .p12 (PKCS12) keystore with the WebID certificate
+                              of the agent (env: LDH_CERT_FILE)
+  -p, --cert-password=CERT_PASSWORD
+                            Password of the WebID certificate (env:
+                              LDH_CERT_PASSWORD)
+      --proxy=PROXY_URL     The host this request will be proxied through
+                              (optional) (env: LDH_PROXY)
+      --query-file=ABS_PATH Path to the file with the query string
+      --service=SERVICE_URI URI of the SPARQL service (optional)
+      --title=TITLE         Title of the query
+      --uri=URI             URI of the query (optional, blank node if not set)
+      --verbose             Print stack traces of errors
+

The optional parameters are marked with (optional). In this case the default parameter is the URI of the document the query is appended to.

+

This is how an add-select invocation would look like:

+
ldh add-select \\
   -b "$base" \\
-  -f ./ssl/owner/cert.pem \\
+  -f ./ssl/owner/keystore.p12 \\
   -p "$owner_cert_password" \\
   --proxy "$proxy" \\
   --title "Select concepts" \\
-  --query-file "$pwd/queries/select-concepts.rq"
+ --query-file "$pwd/queries/select-concepts.rq" \\ + "${base}queries/"
-

Scripts

-

Currently supported:

+

Commands

+

The subcommand groups admin, content and imports mirror the folder structure of the deprecated scripts. Currently supported:

- + @@ -86,23 +152,23 @@ Options: - + - + - + - + - + @@ -111,11 +177,11 @@ Options: - + - + @@ -125,15 +191,15 @@ Options: - + - + - + @@ -143,19 +209,19 @@ Options: - + - + - + - + @@ -164,27 +230,27 @@ Options: - + - + - + - + - + - + @@ -193,11 +259,11 @@ Options: - + - + @@ -206,19 +272,19 @@ Options: - + - + - + - + @@ -227,57 +293,73 @@ Options: - + - + - + - + - + - + - - - - - - - - - - - - - - +
PurposeScriptCommand
GET requestget.shldh get
POST requestpost.shldh post
PUT requestput.shldh put
PATCH requestpatch.shldh patch
DELETE requestdelete.shldh delete
Create container documentcreate-container.shldh create-container
Create item documentcreate-item.shldh create-item
Append object block (instance of ldh:Object) to documentcontent/add-object-block.shldh content add-object-block
Append XHTML block (instance of ldh:XHTML) to documentcontent/add-xhtml-block.shldh content add-xhtml-block
Remove block from documentcontent/remove-block.shldh content remove-block
Append service (instance of ldh:GenericService) to documentadd-generic-service.shldh add-generic-service
Append result set chart (instance of ldh:ResultSetChart) to documentadd-result-set-chart.shldh add-result-set-chart
Append SELECT query (instance of sp:Select) to documentadd-select.shldh add-select
Append SPARQL view (instance of ldh:View) to documentadd-view.shldh add-view
Create fileadd-file.shldh add-file
Create CONSTRUCT queryadd-construct.shldh add-construct
Create CSV importimports/add-csv-import.shldh imports add-csv-import
Import CSV dataimports/import-csv.shldh imports import-csv
Create RDF importimports/add-rdf-import.shldh imports add-rdf-import
Import RDF dataimports/import-rdf.shldh imports import-rdf
Add owl:import to ontologyadmin/add-ontology-import.shldh admin add-ontology-import
Clear and reload ontologyadmin/clear-ontology.shldh admin clear-ontology
Add agent to groupadmin/acl/add-agent-to-group.shldh admin acl add-agent-to-group
Create authorizationadmin/acl/create-authorization.shldh admin acl create-authorization
Create groupadmin/acl/create-group.shldh admin acl create-group
Make application publicly readable to any agentadmin/acl/make-public.shldh admin acl make-public
Add classadmin/ontologies/add-class.shldh admin ontologies add-class
Add CONSTRUCT queryadmin/ontologies/add-constructor.shldh admin ontologies add-constructor
Create ontologyadmin/ontologies/create-ontology.shldh admin ontologies create-ontology
Add property constraintadmin/ontologies/add-property-constraint.shldh admin ontologies add-property-constraint
Add restrictionadmin/ontologies/add-restriction.shldh admin ontologies add-restriction
Add SELECT queryadmin/ontologies/add-select.shldh admin ontologies add-select
Import ontologyadmin/ontologies/import-ontology.sh
Packages
Install packageadmin/packages/install-package.sh
Uninstall packageadmin/packages/uninstall-package.shldh admin ontologies import-ontology
-

Usage example:

-
add-file.sh \\
-  -b "https://localhost:4443/" \\
-  -f ./ssl/owner/cert.pem \\
+        

Usage example — a file is uploaded to the document that will hold it, so the document is created first:

+
base="https://localhost:4443/"
+
+doc=$(ldh create-item \\
+  -b "$base" \\
+  -f ./ssl/owner/keystore.p12 \\
+  -p "$owner_cert_password" \\
+  --title "Friends" \\
+  --container "$base")
+
+ldh add-file \\
+  -b "$base" \\
+  -f ./ssl/owner/keystore.p12 \\
   -p "$owner_cert_password" \\
   --title "Friends" \\
   --file friends.csv \\
-  --content-type text/csv
+ --content-type text/csv \\ + "$doc"
+

add-file prints the content-addressed URI of the upload ({base}uploads/{sha1}) rather than the document URI.

See also the data import user guides.

+

Packages

+

Packages have no command of their own: an application imports a package with a single ldh:import triple, so patching the application's settings document is the whole interface.

+
ldh patch \\
+  -f ./ssl/owner/keystore.p12 \\
+  -p "$owner_cert_password" \\
+  "${base}settings" <<EOF
+INSERT
+{
+    <urn:linkeddatahub:apps/end-user> <https://w3id.org/atomgraph/linkeddatahub#import> <https://packages.linkeddatahub.com/skos/#this> .
+}
+WHERE {}
+EOF
+

The subject is the URI of the application the package is installed into, as declared in config/system.trig. Uninstalling is the same update with DELETE in place of INSERT.

+
+
+

Deprecated shell scripts

+

The HTTP API shell scripts in the bin folder that ldh replaces are deprecated. The certificate and WebID tooling (webid-keygen.sh, webid-keygen-pem.sh, webid-uri.sh, webid-modulus.sh, server-cert-gen.sh) talks to no API and is not deprecated.

+

Migrating from a script to its command means dropping the .sh suffix, prefixing the invocation with ldh (subfolders become subcommand groups, e.g. admin/acl/create-group.sh becomes ldh admin acl create-group), and passing the .p12 keystore to -f instead of the .pem certificate.

-

Find the CLI scripts on GitHub or check out the - demo apps that use them.

+

Find the CLI on GitHub or check out the + demo apps that use it.

"""^^rdf:XMLLiteral . diff --git a/docs/reference/data-model/blocks/objects.ttl b/docs/reference/data-model/blocks/objects.ttl index 0ef9be8..21058de 100644 --- a/docs/reference/data-model/blocks/objects.ttl +++ b/docs/reference/data-model/blocks/objects.ttl @@ -58,13 +58,13 @@ Action - CLI script + CLI command Create - content/add-object-block.sh + ldh content add-object-block Update @@ -72,7 +72,7 @@ Delete - + ldh content remove-block diff --git a/docs/reference/data-model/blocks/xhtml.ttl b/docs/reference/data-model/blocks/xhtml.ttl index 13563f2..05f0436 100644 --- a/docs/reference/data-model/blocks/xhtml.ttl +++ b/docs/reference/data-model/blocks/xhtml.ttl @@ -55,13 +55,13 @@ Action - CLI script + CLI command Create - content/add-xhtml-block.sh + ldh content add-xhtml-block Update @@ -69,7 +69,7 @@ Delete - + ldh content remove-block diff --git a/docs/reference/data-model/documents/containers.ttl b/docs/reference/data-model/documents/containers.ttl index ee326f0..b51a241 100644 --- a/docs/reference/data-model/documents/containers.ttl +++ b/docs/reference/data-model/documents/containers.ttl @@ -26,10 +26,10 @@ a dh:Container ; rdf:_1 <https://localhost:4443/concepts/#select-children> ; dct:created "2025-06-02T19:12:26.533Z"^^xsd:dateTime ; - dct:creator <https://localhost:4443/admin/acl/agents/865c2431-8436-4ae8-b300-2a531a013cd0/#this> ; + dct:creator <https://admin.localhost:4443/acl/agents/865c2431-8436-4ae8-b300-2a531a013cd0/#this> ; dct:title "Concepts" ; sioc:has_parent <https://localhost:4443/concepts/> ; - acl:owner <https://localhost:4443/admin/acl/agents/865c2431-8436-4ae8-b300-2a531a013cd0/#this> . + acl:owner <https://admin.localhost:4443/acl/agents/865c2431-8436-4ae8-b300-2a531a013cd0/#this> . <https://localhost:4443/concepts/#select-children> a ldh:Object ; @@ -68,21 +68,21 @@ Action - CLI script + CLI command Create - create-container.sh + ldh create-container Update - put.sh + ldh put Delete - delete.sh + ldh delete diff --git a/docs/reference/data-model/documents/items.ttl b/docs/reference/data-model/documents/items.ttl index 4403901..002262d 100644 --- a/docs/reference/data-model/documents/items.ttl +++ b/docs/reference/data-model/documents/items.ttl @@ -28,10 +28,10 @@ rdf:_1 <https://localhost:4443/concepts/example/#xhtml-block> ; rdf:_2 <https://localhost:4443/concepts/example/#object-block> ; dct:created "2025-06-02T19:49:48.126Z"^^xsd:dateTime ; - dct:creator <https://localhost:4443/admin/acl/agents/865c2431-8436-4ae8-b300-2a531a013cd0/#this> ; + dct:creator <https://admin.localhost:4443/acl/agents/865c2431-8436-4ae8-b300-2a531a013cd0/#this> ; dct:title "Example" ; sioc:has_container <https://localhost:4443/concepts/> ; - acl:owner <https://localhost:4443/admin/acl/agents/865c2431-8436-4ae8-b300-2a531a013cd0/#this> . + acl:owner <https://admin.localhost:4443/acl/agents/865c2431-8436-4ae8-b300-2a531a013cd0/#this> . <https://localhost:4443/concepts/example/#xhtml-block> a ldh:XHTML ; @@ -75,21 +75,21 @@ Action - CLI script + CLI command Create - create-item.sh + ldh create-item Update - put.sh + ldh put Delete - delete.sh + ldh delete diff --git a/docs/reference/data-model/resources.ttl b/docs/reference/data-model/resources.ttl index 16e37fe..1b177dc 100644 --- a/docs/reference/data-model/resources.ttl +++ b/docs/reference/data-model/resources.ttl @@ -125,7 +125,7 @@ Type Action - CLI script + CLI command @@ -142,17 +142,17 @@ CONSTRUCT Create - admin/ontologies/add-construct.sh + ldh add-construct CSV import Create - imports/add-csv-import.sh + ldh imports add-csv-import File Create - add-file.sh + ldh add-file Graph chart @@ -162,27 +162,27 @@ RDF import Create - imports/add-rdf-import.sh + ldh imports add-rdf-import Result set chart Create - add-result-set-chart.sh + ldh add-result-set-chart Select Create - add-select.sh + ldh add-select Service Create - add-generic-service.sh + ldh add-generic-service View Create - add-view.sh + ldh add-view diff --git a/docs/reference/http-api.ttl b/docs/reference/http-api.ttl index 550a004..2f6f212 100644 --- a/docs/reference/http-api.ttl +++ b/docs/reference/http-api.ttl @@ -24,7 +24,7 @@

See how those authentication methods can be configured or how to get an account on LinkedDataHub.

-

HTTP API access using CLI scripts or curl currently does not support the OIDC method.

+

HTTP API access using the CLI or curl currently does not support the OIDC method.

@@ -135,11 +135,11 @@

Document metadata

Unlike earlier versions, LinkedDataHub 5.x manages the document hierarchy automatically.

-

By default, LinkedDataHub treats an RDF document as an item by giving it the dh:Item type and attaching it to the parent container using sioc:has_container. If the client wants to create a container instead, it has to explicitly add the dh:Container type on the document resource; the new container will be attached to its parent using sioc:has_container. In either case, the URI of the new document's will be relative to its parent's.

+

By default, LinkedDataHub treats an RDF document as an item by giving it the dh:Item type and attaching it to the parent container using sioc:has_container. If the client wants to create a container instead, it has to explicitly add the dh:Container type on the document resource; the new container will be attached to its parent using sioc:has_parent. In either case, the URI of the new document will be relative to its parent's.

LinkedDataHub will also manage additional document metadata, such as its owner and creation/modification timestamps.

For example, this HTTP request to create a new container (Turtle syntax):

-
PUT /namedgraph/new-container/ HTTP/1.1
-Host: linkeddatahub.com
+            
PUT /new-container/ HTTP/1.1
+Host: localhost:4443
 Content-Type: text/turtle
 
 @prefix dh:     <https://www.w3.org/ns/ldt/document-hierarchy#> .
@@ -154,30 +154,30 @@ Content-Type: text/turtle
 @prefix sioc:   <http://rdfs.org/sioc/ns#> .
 @prefix acl:    <http://www.w3.org/ns/auth/acl#> .
 
-<https://linkeddatahub.com/namedgraph/new-container/>
+<https://localhost:4443/new-container/>
     a dh:Container ;
     dct:created "2025-03-31T21:46:21.984Z"^^xsd:dateTime ;
-    dct:creator <https://linkeddatahub.com/namedgraph/admin/acl/agents/fda0009e-191b-4f07-838c-5daf2a74b35f/#this> ;
+    dct:creator <https://admin.localhost:4443/acl/agents/865c2431-8436-4ae8-b300-2a531a013cd0/#this> ;
     dct:title "New container" ;
-    sioc:has_parent <https://linkeddatahub.com/namedgraph/> ;
-    acl:owner <https://linkeddatahub.com/namedgraph/admin/acl/agents/fda0009e-191b-4f07-838c-5daf2a74b35f/#this> .
+ sioc:has_parent <https://localhost:4443/> ; + acl:owner <https://admin.localhost:4443/acl/agents/865c2431-8436-4ae8-b300-2a531a013cd0/#this> .

The HTTP request to produce a new item can be empty:

-
PUT /namedgraph/new-container/ HTTP/1.1
-Host: linkeddatahub.com
+            
PUT /new-item/ HTTP/1.1
+Host: localhost:4443
 Content-Type: text/turtle

It will create an item document with the following triples:

-
@prefix dh:    <https://www.w3.org/ns/ldt/document-hierarchy#> .
+            
@prefix dh:     <https://www.w3.org/ns/ldt/document-hierarchy#> .
 @prefix dct:    <http://purl.org/dc/terms/> .
 @prefix xsd:    <http://www.w3.org/2001/XMLSchema#> .
 @prefix sioc:   <http://rdfs.org/sioc/ns#> .
 @prefix acl:    <http://www.w3.org/ns/auth/acl#> .
 
-<https://linkeddatahub.com/namedgraph/new-item/>
+<https://localhost:4443/new-item/>
     a dh:Item ;
     dct:created "2025-03-31T20:45:42.802Z"^^xsd:dateTime ;
-    dct:creator <https://linkeddatahub.com/acl/agents/d47e1f9b-c8d0-4546-840f-5d9fbb479da2/#id9d3814f2-53bc-42e9-b1ab-46cbc9a94263> ;
-    sioc:has_container <https://linkeddatahub.com/namedgraph/> ;
-    acl:owner <https://linkeddatahub.com/admin/acl/agents/d47e1f9b-c8d0-4546-840f-5d9fbb479da2/#id9d3814f2-53bc-42e9-b1ab-46cbc9a94263> .
+ dct:creator <https://admin.localhost:4443/acl/agents/865c2431-8436-4ae8-b300-2a531a013cd0/#this> ; + sioc:has_container <https://localhost:4443/> ; + acl:owner <https://admin.localhost:4443/acl/agents/865c2431-8436-4ae8-b300-2a531a013cd0/#this> .

Built-in constraints

@@ -207,6 +207,8 @@ Content-Type: text/turtle
ns
In-memory namespace ontology as well as its SPARQL endpoint
+
settings
+
The application's own description in the dataspace configuration. PATCH with a SPARQL update edits it — this is how packages are installed and uninstalled. Editing is restricted to end-user applications: a PATCH on an admin application's settings answers 422 Unprocessable Entity

Admin app only

@@ -226,10 +228,6 @@ Content-Type: text/turtle
OpenID Connect with ORCID callback
admin/clear
Clears the specified ontology from memory cache and reloads it from the admin SPARQL endpoint
-
packages/install
-
Installs a package. Requires owner/admin authentication
-
packages/uninstall
-
Uninstalls a package. Requires owner/admin authentication
diff --git a/docs/user-guide/build-apps.ttl b/docs/user-guide/build-apps.ttl index a2a1012..85ed76e 100644 --- a/docs/user-guide/build-apps.ttl +++ b/docs/user-guide/build-apps.ttl @@ -108,7 +108,7 @@ COPY files/style.css /usr/local/tomcat/webapps/ROOT/static/com/example/myapp/cs

RDF

You can modify or extend the default RDF datasets used by LinkedDataHub. However, a better practice is to use the - CLI scripts to create documents and to import CSV and RDF data.

+ CLI to create documents and to import CSV and RDF data.

See the LinkedDataHub app repository for more examples.

"""^^rdf:XMLLiteral . \ No newline at end of file diff --git a/docs/user-guide/change-model.ttl b/docs/user-guide/change-model.ttl index 3c44600..28ffd4f 100644 --- a/docs/user-guide/change-model.ttl +++ b/docs/user-guide/change-model.ttl @@ -85,16 +85,18 @@ WHERE {}
pwd=$(realpath -s $PWD)
+base="https://localhost:4443/"
+admin_base="https://admin.localhost:4443/"
 
-create-construct.sh \\
-  -b "${base}admin/" \\
-  -f ./ssl/owner/cert.pem \\
+ldh admin ontologies add-constructor \\
+  -b "$admin_base" \\
+  -f ./ssl/owner/keystore.p12 \\
   -p "$owner_cert_password" \\
   --uri "${base}ns#ConstructConcept" \\
   --label "Construct concept" \\
-  --slug construct-concept \\
   --query-file "${pwd}/queries/construct-concept.rq" \\
-  "${base}admin/model/ontologies/namespace/"
+ "${admin_base}ontologies/namespace/" +

The model lives in the administration application, whose origin is the dataspace origin with an admin. prefix — so -b and the target document URL both use $admin_base, while the ontology terms being defined keep the end-user origin.

@@ -134,15 +136,14 @@ create-construct.sh \\
-
create-property-constraint.sh \\
-  -b "$base" \\
-  -f ./ssl/owner/cert.pem \\
+                        
ldh admin ontologies add-property-constraint \\
+  -b "$admin_base" \\
+  -f ./ssl/owner/keystore.p12 \\
   -p "$owner_cert_password" \\
-  --uri "https://localhost:4443/ns#MissingPrefLabel" \\
+  --uri "${base}ns#MissingPrefLabel" \\
   --label "Missing skos:prefLabel" \\
-  --slug missing-pref-label \\
   --property "http://www.w3.org/2004/02/skos/core#prefLabel" \\
-  "${base}admin/model/ontologies/namespace/"
+ "${admin_base}ontologies/namespace/"
@@ -180,16 +181,15 @@ create-construct.sh \\
-
create-class.sh \\
-  -b "$base" \\
-  -f ./ssl/owner/cert.pem \\
+                        
ldh admin ontologies add-class \\
+  -b "$admin_base" \\
+  -f ./ssl/owner/keystore.p12 \\
   -p "$owner_cert_password" \\
   --uri "http://www.w3.org/2004/02/skos/core#Concept" \\
   --label "Concept" \\
-  --slug concept \\
-  --constructor "{$base}ns#ConstructConcept" \\
-  --constraint "{$base}ns#MissingPrefLabel" \\
-  "${base}admin/model/ontologies/namespace/"
+ --constructor "${base}ns#ConstructConcept" \\ + --constraint "${base}ns#MissingPrefLabel" \\ + "${admin_base}ontologies/namespace/"
diff --git a/docs/user-guide/create-data/create-content.ttl b/docs/user-guide/create-data/create-content.ttl index 7201683..2f1a001 100644 --- a/docs/user-guide/create-data/create-content.ttl +++ b/docs/user-guide/create-data/create-content.ttl @@ -69,13 +69,13 @@

To add a new XHTML block with the value <p>A paragraph</p>, replace owner_cert_password with the value of the corresponding secret and execute the following command:

-
content/add-xhtml-block.sh \\
-    -b "https://localhost:4443/" \\
-    -f ./ssl/owner/cert.pem \\
+                        
ldh content add-xhtml-block \\
+    -f ./ssl/owner/keystore.p12 \\
     -p "$owner_cert_password" \\
-    --fragment "xhtml-block" \\
-    --value "<div xmlns=\\\\\\"http://www.w3.org/1999/xhtml\\\\\\"><p>A paragraph</p></div>" \\
+    --uri "#xhtml-block" \\
+    --value '<div xmlns="http://www.w3.org/1999/xhtml"><p>A paragraph</p></div>' \\
     "https://localhost:4443/concepts/example/"
+

--uri is resolved against the document URI, so #xhtml-block identifies the block within it. Leave it out to let the block be a blank node.

@@ -129,11 +129,10 @@

To add a new object block with the value http://dbpedia.org/resource/Copenhagen, replace $owner_cert_password with the value of the corresponding secret and execute the following command:

-
content/add-object-block.sh \\
-    -b "https://localhost:4443/" \\
-    -f ./ssl/owner/cert.pem \\
+                        
ldh content add-object-block \\
+    -f ./ssl/owner/keystore.p12 \\
     -p "$owner_cert_password" \\
-    --fragment "object-block" \\
+    --uri "#object-block" \\
     --value "http://dbpedia.org/resource/Copenhagen" \\
     "https://localhost:4443/concepts/example/"
diff --git a/docs/user-guide/create-data/create-documents.ttl b/docs/user-guide/create-data/create-documents.ttl index 897aad1..58d900e 100644 --- a/docs/user-guide/create-data/create-documents.ttl +++ b/docs/user-guide/create-data/create-documents.ttl @@ -44,9 +44,9 @@

Replace owner_cert_password with the value of the corresponding secret and execute the following command:

-
create-container.sh \\
+                    
ldh create-container \\
   -b "https://localhost:4443/" \\
-  -f ./ssl/owner/cert.pem \\
+  -f ./ssl/owner/keystore.p12 \\
   -p "$owner_cert_password" \\
   --title "Concepts" \\
   --slug "concepts" \\
diff --git a/docs/user-guide/import-data/import-csv-data.ttl b/docs/user-guide/import-data/import-csv-data.ttl
index 95e1c9a..9d95490 100644
--- a/docs/user-guide/import-data/import-csv-data.ttl
+++ b/docs/user-guide/import-data/import-csv-data.ttl
@@ -89,14 +89,25 @@
             
-

Checkout the Command line interface (CLI) scripts into a folder on your machine. Provide a list of arguments to the import-csv script and execute it. For example:

-
import-csv.sh \\
-    -b "https://localhost:4443/" \\
-    -f ./ssl/owner/cert.pem \\
+                    

Build the command line interface (CLI) and put it on your $PATH. The import is described by a document, which the command takes as its last argument, so create that document first. For example:

+
base="https://localhost:4443/"
+
+doc=$(ldh create-item \\
+    -b "$base" \\
+    -f ./ssl/owner/keystore.p12 \\
+    -p "$owner_cert_password" \\
+    --title "Places" \\
+    --container "$base")
+
+ldh imports import-csv \\
+    -b "$base" \\
+    -f ./ssl/owner/keystore.p12 \\
     -p "$owner_cert_password" \\
     --title "Places" \\
     --query-file places.rq \\
-    --csv-file places.csv
+ --csv-file places.csv \\ + "$doc"
+

--delimiter defaults to , and can be set to another character.

diff --git a/docs/user-guide/import-data/import-rdf-data.ttl b/docs/user-guide/import-data/import-rdf-data.ttl index f23331a..6b0bab9 100644 --- a/docs/user-guide/import-data/import-rdf-data.ttl +++ b/docs/user-guide/import-data/import-rdf-data.ttl @@ -79,15 +79,25 @@
-

Checkout the Command line interface (CLI) scripts into a folder on your machine. Provide a list of arguments to the import-rdf script and execute it. For example:

-
import-rdf.sh \\
-    -b "https://localhost:4443/" \\
-    -f ./ssl/owner/cert.pem \\
+                        

Build the command line interface (CLI) and put it on your $PATH. The import is described by a document, which the command takes as its last argument, so create that document first. For example:

+
base="https://localhost:4443/"
+
+doc=$(ldh create-item \\
+    -b "$base" \\
+    -f ./ssl/owner/keystore.p12 \\
+    -p "$owner_cert_password" \\
+    --title "Concepts" \\
+    --container "$base")
+
+ldh imports import-rdf \\
+    -b "$base" \\
+    -f ./ssl/owner/keystore.p12 \\
     -p "$owner_cert_password" \\
     --title "Concepts" \\
     --rdf-file concepts.ttl \\
     --content-type "text/turtle" \\
-    --graph "${base}skos/"
+ --graph "${base}skos/" \\ + "$doc"
@@ -159,15 +169,25 @@
-

Checkout the Command line interface (CLI) scripts into a folder on your machine. Provide a list of arguments to the import-rdf script and execute it. For example:

-
import-rdf.sh \\
-    -b "https://localhost:4443/" \\
-    -f ./ssl/owner/cert.pem \\
+                        

Build the command line interface (CLI) and put it on your $PATH. The import is described by a document, which the command takes as its last argument, so create that document first. For example:

+
base="https://localhost:4443/"
+
+doc=$(ldh create-item \\
+    -b "$base" \\
+    -f ./ssl/owner/keystore.p12 \\
+    -p "$owner_cert_password" \\
+    --title "Concepts" \\
+    --container "$base")
+
+ldh imports import-rdf \\
+    -b "$base" \\
+    -f ./ssl/owner/keystore.p12 \\
     -p "$owner_cert_password" \\
     --title "Concepts" \\
     --rdf-file concepts.ttl \\
     --content-type "text/turtle" \\
-    --query-file concepts.rq
+ --query-file concepts.rq \\ + "$doc"
diff --git a/docs/user-guide/manage-packages.ttl b/docs/user-guide/manage-packages.ttl index 8e49902..a17dff1 100644 --- a/docs/user-guide/manage-packages.ttl +++ b/docs/user-guide/manage-packages.ttl @@ -12,20 +12,18 @@ rdf:value """

Step by step guide to installing and uninstalling packages in your LinkedDataHub dataspace.

-

Version: Packages were introduced in LinkedDataHub 5.2.

+

Version: Packages were introduced in LinkedDataHub 5.2. Since 5.10 they are installed declaratively: an application imports a package with a single ldh:import triple in its settings. The dedicated install/uninstall endpoints and the package Actions menu they were driven from are gone.

-

Package management requires Control access to the administration application. Only users with administrative privileges can install or uninstall packages.

+

Package management requires write access to the application's settings document, which in practice means the owner of the dataspace.

Read more about how packages work.

-
-

Important: After installing or uninstalling a package, you must restart the Docker service for XSLT stylesheet changes to take effect:

-
docker-compose restart linkeddatahub
-

Do not use --force-recreate as that would overwrite the stylesheet file changes.

+
+

Installing or uninstalling a package takes effect on the next request — the package ontology joins the application's imports closure and its stylesheet is composed into the application stylesheet. No restart is needed.

Install a package

-

Installing a package adds new functionality to your dataspace by importing ontologies, data, and resources.

+

Installing a package adds new functionality to your dataspace by importing its ontology and stylesheet.

Uninstall a package

-

Uninstalling a package removes its ontologies and resources from your dataspace. User-created data that uses the package vocabulary will remain but may not function correctly.

+

Uninstalling a package removes its ontology and stylesheet from your dataspace. Data you created using the package vocabulary remains but may not display or function correctly without the package.

Verify package installation

-

After installing a package, verify that it was installed correctly:

+

After installing a package, verify that it was applied:

    -
  1. Navigate to the administration application
  2. -
  3. Click on Ontologies in the left navigation menu
  4. -
  5. Verify that the package ontology appears in the list of imported ontologies
  6. -
  7. In the end-user application, check that package-specific classes and properties are available when creating new resources
  8. -
  9. If the package includes stylesheets, verify that custom UI elements are rendering correctly
  10. +
  11. Reopen the Application settings modal and check that the package's Installed checkbox is ticked
  12. +
  13. Check that the package ontology joined the application's imports closure by querying the ns endpoint. For the SKOS package, its constructor for skos:Concept becomes visible there: +
    curl -k -G \\
    +  -E ./ssl/owner/cert.pem:"$owner_cert_password" \\
    +  -H "Accept: application/sparql-results+xml" \\
    +  "https://localhost:4443/ns" \\
    +  --data-urlencode 'query=SELECT ?text WHERE { <http://www.w3.org/2004/02/skos/core#Concept> <http://spinrdf.org/spin#constructor> ?constructor . ?constructor <http://spinrdf.org/sp#text> ?text . }'
    +
  14. +
  15. In the end-user application, check that package-specific classes are offered by the Create dropdown
  16. +
  17. If the package includes a stylesheet, verify that its custom UI elements are rendering
@@ -122,19 +130,18 @@

Troubleshooting

Installation fails

-

If package installation fails:

+

If the Save or the ldh patch is rejected:

    -
  • Verify you have Control access to the administration application
  • -
  • Check that all package dependencies are met
  • -
  • Review the error message for specific issues
  • -
  • Ensure the package files are valid and well-formed
  • +
  • Verify you are logged in with an agent that has write access to the application's settings
  • +
  • Verify the package URI is correct and dereferenceable, and that its metadata declares ldt:ontology and ac:stylesheet
  • +
  • Review the error message — a rejected settings update reports the constraint violation that caused it

Package functionality not visible

If installed package features are not visible:

    -
  • Refresh your browser to reload the application
  • +
  • Reload the page — the stylesheet is composed on the next request, but the browser may still hold the previous one
  • Clear the browser cache if stylesheets are not updating
  • -
  • Verify the package ontology is imported in the Ontologies section
  • +
  • Verify the package ontology is in the imports closure by querying the ns endpoint as shown above
  • Check that you have appropriate permissions to view package resources
diff --git a/docs/user-guide/upload-file.ttl b/docs/user-guide/upload-file.ttl index f3347fd..6682779 100644 --- a/docs/user-guide/upload-file.ttl +++ b/docs/user-guide/upload-file.ttl @@ -40,14 +40,25 @@
-

Replace owner_cert_password with its value from the .env file and execute the following command:

-
add-file.sh \\
--b "https://localhost:4443/" \\
--f ./ssl/owner/cert.pem \\
--p "$owner_cert_password" \\
---title "$title" \\
---file "$filename" \\
---content-type "$content_type"
+

A file is uploaded to the document that will hold it, so create that document first. Replace owner_cert_password with the value of the corresponding secret and execute the following commands:

+
base="https://localhost:4443/"
+
+doc=$(ldh create-item \\
+  -b "$base" \\
+  -f ./ssl/owner/keystore.p12 \\
+  -p "$owner_cert_password" \\
+  --title "$title" \\
+  --container "$base")
+
+ldh add-file \\
+  -b "$base" \\
+  -f ./ssl/owner/keystore.p12 \\
+  -p "$owner_cert_password" \\
+  --title "$title" \\
+  --file "$filename" \\
+  --content-type "$content_type" \\
+  "$doc"
+

The command prints the content-addressed URI of the upload. --content-type is optional — the media type is detected from the file when it is not given.

From 4e9403b4f3e926cc9b76ebfa71d1ef96b895668e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martynas=20Jusevi=C4=8Dius?= Date: Sun, 30 Aug 2026 23:27:33 +0200 Subject: [PATCH 4/4] Update the app build examples to the current release The multi-stage Docker example built the WAR overlay on maven:3.8.4-openjdk-17, which cannot compile against a Java 21 platform - and the same page already told you to target Java 21 ten lines further down. The build stage now matches the platform's own Dockerfile. The pinned versions were stale in the same way: the base image at 5.3.2 and the overlay dependency at 5.5.3, both now 5.9.1, the current release. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_014Tgf5DjbYiX3SPnCFSgCzd --- docs/user-guide/build-apps.ttl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/user-guide/build-apps.ttl b/docs/user-guide/build-apps.ttl index 85ed76e..1e169dd 100644 --- a/docs/user-guide/build-apps.ttl +++ b/docs/user-guide/build-apps.ttl @@ -18,7 +18,7 @@

Docker

You can go a long way just by mounting files (e.g. config files, ontologies, stylesheets) into LinkedDataHub's default Docker setup. But you may also want to build a dedicated Docker image for your app using LinkedDataHub as the base. Usually this is done to COPY files inside the image or RUN additional commands.

The recommended approach is a multi-stage Docker build: the first stage uses Maven to compile your WAR overlay, and the second stage copies it into the LinkedDataHub base image alongside any static files:

-
FROM maven:3.8.4-openjdk-17 AS maven
+        
FROM maven:3.9-eclipse-temurin-21 AS maven
 
 WORKDIR /usr/src/myapp
 
@@ -29,7 +29,7 @@ RUN mvn clean install
 
 # =================
 
-FROM atomgraph/linkeddatahub:5.3.2
+FROM atomgraph/linkeddatahub:5.9.1
 
 WORKDIR $CATALINA_HOME
 
@@ -50,13 +50,13 @@ COPY files/style.css  /usr/local/tomcat/webapps/ROOT/static/com/example/myapp/cs
     <dependency>
         <groupId>com.atomgraph</groupId>
         <artifactId>linkeddatahub</artifactId>
-        <version>5.5.3</version>
+        <version>5.9.1</version>
         <classifier>classes</classifier>
     </dependency>
     <dependency>
         <groupId>com.atomgraph</groupId>
         <artifactId>linkeddatahub</artifactId>
-        <version>5.5.3</version>
+        <version>5.9.1</version>
         <type>war</type>
     </dependency>
 </dependencies>