diff --git a/.github/workflows/check-docs.yml b/.github/workflows/check-docs.yml new file mode 100644 index 0000000..24e1f84 --- /dev/null +++ b/.github/workflows/check-docs.yml @@ -0,0 +1,21 @@ +name: Check Docs + +on: + push: + pull_request: + workflow_dispatch: + +jobs: + check-docs: + name: Check documentation + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: RDF syntax check + uses: AtomGraph/RDF-syntax-check@v1.0.5 + + - name: Check links + run: ./check-links.sh diff --git a/check-links.sh b/check-links.sh new file mode 100755 index 0000000..9912349 --- /dev/null +++ b/check-links.sh @@ -0,0 +1,40 @@ +#!/usr/bin/env bash +set -euo pipefail + +REPO_DIR="$(cd "$(dirname "$0")" && pwd)" +EXIT_CODE=0 + +resolve_url() { + python3 -c " +import urllib.parse, sys +base = 'http://x/' + sys.argv[1] +result = urllib.parse.urljoin(base, sys.argv[2]) +print(result[len('http://x/'):]) +" "$1" "$2" +} + +while IFS= read -r -d '' ttl_file; do + rel="${ttl_file#"$REPO_DIR"/}" + url_path="${rel%.ttl}/" + + while IFS= read -r url; do + [[ "$url" =~ ^https?:// ]] && continue + [[ "$url" =~ ^# ]] && continue + [[ "$url" =~ (^|/)uploads/ ]] && continue + [[ -z "$url" ]] && continue + + path="${url%%#*}" + [[ -z "$path" ]] && continue + [[ "$path" =~ \.[a-zA-Z]+$ ]] && continue # skip links to files (e.g. .xsl) + + resolved="$(resolve_url "$url_path" "$path")" + target_file="$REPO_DIR/${resolved%/}.ttl" + + if [[ ! -f "$target_file" ]]; then + echo "BROKEN: $rel → $url (resolves to ${resolved%/}.ttl)" + EXIT_CODE=1 + fi + done < <(grep -oE '(href|src|data)="[^"]*"' "$ttl_file" | sed 's/^[^"]*"//;s/"$//' || true) +done < <(find "$REPO_DIR" -name "*.ttl" -print0) + +exit "$EXIT_CODE" diff --git a/demo/copenhagen/parking-facilities.ttl b/demo/copenhagen/parking-facilities.ttl index 0796176..7d5272f 100644 --- a/demo/copenhagen/parking-facilities.ttl +++ b/demo/copenhagen/parking-facilities.ttl @@ -9,10 +9,13 @@ # Main container document <> a dh:Container ; dct:title "Parking facilities" ; - rdf:_1 <#largest-parkings> ; + rdf:_1 <#largest-parkings-block> ; rdf:_2 <#select-children> . -# Chart block +# Chart block (wrapped in ldh:Object per ContentMode contract) +<#largest-parkings-block> a ldh:Object ; + rdf:value <#largest-parkings> . + <#largest-parkings> a ldh:ResultSetChart ; dct:title "Largest parking facilities" ; spin:query <#parking-by-spaces-query> ; diff --git a/demo/copenhagen/root.ttl b/demo/copenhagen/root.ttl index e1e4e1d..775f2e5 100644 --- a/demo/copenhagen/root.ttl +++ b/demo/copenhagen/root.ttl @@ -16,7 +16,7 @@ dct:description "Geospatial and other open data about cities, imported by transforming CSV files to RDF" ; rdf:_1 <#page-header> ; rdf:_2 <#city-intro> ; - rdf:_3 <#facilities-overview> ; + rdf:_3 <#facilities-overview-block> ; rdf:_4 <#main-library> ; rdf:_5 <#charts> ; rdf:_6 <#largest-parkings> ; @@ -42,6 +42,9 @@ This dataset includes libraries, schools, parking facilities, sports centers, playgrounds, and more.

"""^^rdf:XMLLiteral . +<#facilities-overview-block> a ldh:Object ; + rdf:value <#facilities-overview> . + <#facilities-overview> a ldh:ResultSetChart ; dct:title "Facilities by type" ; spin:query <#facilities-by-type-query> ; diff --git a/demo/northwind-traders/admin/model/ns.ttl b/demo/northwind-traders/admin/model/ns.ttl index 04825d0..8f27aa0 100644 --- a/demo/northwind-traders/admin/model/ns.ttl +++ b/demo/northwind-traders/admin/model/ns.ttl @@ -27,6 +27,34 @@ schema:PostalAddress a owl:Class ; rdfs:label "Postal address" ; rdfs:isDefinedBy : . +schema:ProductGroup a owl:Class ; + rdfs:label "Product group" ; + rdfs:isDefinedBy : . + +schema:Corporation a owl:Class ; + rdfs:label "Corporation" ; + rdfs:isDefinedBy : . + +schema:ContactPoint a owl:Class ; + rdfs:label "Contact point" ; + rdfs:isDefinedBy : . + +schema:ParcelDelivery a owl:Class ; + rdfs:label "Parcel delivery" ; + rdfs:isDefinedBy : . + +schema:OrderItem a owl:Class ; + rdfs:label "Order item" ; + rdfs:isDefinedBy : . + +schema:Product a owl:Class ; + rdfs:label "Product" ; + rdfs:isDefinedBy : . + +schema:Place a owl:Class ; + rdfs:label "Place" ; + rdfs:isDefinedBy : . + # properties schema:broker a owl:ObjectProperty ; @@ -47,6 +75,170 @@ schema:address a owl:ObjectProperty ; rdfs:range schema:PostalAddress ; rdfs:isDefinedBy : . +schema:contactPoint a owl:ObjectProperty ; + rdfs:label "Contact point" ; + rdfs:domain schema:Corporation ; + rdfs:range schema:ContactPoint ; + rdfs:isDefinedBy : . + +schema:employee a owl:ObjectProperty ; + rdfs:label "Employee" ; + rdfs:domain schema:Corporation ; + rdfs:range schema:Person ; + rdfs:isDefinedBy : . + +schema:customer a owl:ObjectProperty ; + rdfs:label "Customer" ; + rdfs:domain schema:Order ; + rdfs:range schema:Corporation ; + rdfs:isDefinedBy : . + +schema:orderDelivery a owl:ObjectProperty ; + rdfs:label "Order delivery" ; + rdfs:domain schema:Order ; + rdfs:range schema:ParcelDelivery ; + rdfs:isDefinedBy : . + +schema:deliveryAddress a owl:ObjectProperty ; + rdfs:label "Delivery address" ; + rdfs:domain schema:ParcelDelivery ; + rdfs:range schema:PostalAddress ; + rdfs:isDefinedBy : . + +schema:provider a owl:ObjectProperty ; + rdfs:label "Provider" ; + rdfs:range schema:Corporation ; + rdfs:isDefinedBy : . + +schema:category a owl:ObjectProperty ; + rdfs:label "Category" ; + rdfs:domain schema:Product ; + rdfs:range schema:ProductGroup ; + rdfs:isDefinedBy : . + +schema:containedInPlace a owl:ObjectProperty ; + rdfs:label "Contained in place" ; + rdfs:domain schema:City ; + rdfs:range schema:Place ; + rdfs:isDefinedBy : . + +schema:sponsor a owl:ObjectProperty ; + rdfs:label "Sponsor" ; + rdfs:domain schema:Person ; + rdfs:range schema:Person ; + rdfs:isDefinedBy : . + +schema:orderedItem a owl:ObjectProperty ; + rdfs:label "Ordered item" ; + rdfs:isDefinedBy : . + +schema:name a owl:DatatypeProperty ; + rdfs:label "Name" ; + rdfs:isDefinedBy : . + +schema:identifier a owl:DatatypeProperty ; + rdfs:label "Identifier" ; + rdfs:isDefinedBy : . + +schema:description a owl:DatatypeProperty ; + rdfs:label "Description" ; + rdfs:isDefinedBy : . + +schema:legalName a owl:DatatypeProperty ; + rdfs:label "Legal name" ; + rdfs:domain schema:Corporation ; + rdfs:isDefinedBy : . + +schema:telephone a owl:DatatypeProperty ; + rdfs:label "Telephone" ; + rdfs:isDefinedBy : . + +schema:faxNumber a owl:DatatypeProperty ; + rdfs:label "Fax number" ; + rdfs:isDefinedBy : . + +schema:jobTitle a owl:DatatypeProperty ; + rdfs:label "Job title" ; + rdfs:domain schema:Person ; + rdfs:isDefinedBy : . + +schema:addressCountry a owl:DatatypeProperty ; + rdfs:label "Address country" ; + rdfs:domain schema:PostalAddress ; + rdfs:isDefinedBy : . + +schema:addressLocality a owl:DatatypeProperty ; + rdfs:label "Address locality" ; + rdfs:domain schema:PostalAddress ; + rdfs:isDefinedBy : . + +schema:postalCode a owl:DatatypeProperty ; + rdfs:label "Postal code" ; + rdfs:domain schema:PostalAddress ; + rdfs:isDefinedBy : . + +schema:streetAddress a owl:DatatypeProperty ; + rdfs:label "Street address" ; + rdfs:domain schema:PostalAddress ; + rdfs:isDefinedBy : . + +schema:addressRegion a owl:DatatypeProperty ; + rdfs:label "Address region" ; + rdfs:domain schema:PostalAddress ; + rdfs:isDefinedBy : . + +schema:givenName a owl:DatatypeProperty ; + rdfs:label "Given name" ; + rdfs:domain schema:Person ; + rdfs:isDefinedBy : . + +schema:familyName a owl:DatatypeProperty ; + rdfs:label "Family name" ; + rdfs:domain schema:Person ; + rdfs:isDefinedBy : . + +schema:honorificPrefix a owl:DatatypeProperty ; + rdfs:label "Honorific prefix" ; + rdfs:domain schema:Person ; + rdfs:isDefinedBy : . + +schema:birthDate a owl:DatatypeProperty ; + rdfs:label "Birth date" ; + rdfs:domain schema:Person ; + rdfs:isDefinedBy : . + +schema:orderQuantity a owl:DatatypeProperty ; + rdfs:label "Order quantity" ; + rdfs:domain schema:OrderItem ; + rdfs:isDefinedBy : . + +schema:discount a owl:DatatypeProperty ; + rdfs:label "Discount" ; + rdfs:domain schema:OrderItem ; + rdfs:isDefinedBy : . + +schema:price a owl:DatatypeProperty ; + rdfs:label "Price" ; + rdfs:isDefinedBy : . + +schema:orderDate a owl:DatatypeProperty ; + rdfs:label "Order date" ; + rdfs:domain schema:Order ; + rdfs:isDefinedBy : . + +schema:expectedArrivalUntil a owl:DatatypeProperty ; + rdfs:label "Expected arrival until" ; + rdfs:domain schema:ParcelDelivery ; + rdfs:isDefinedBy : . + +schema:url a owl:DatatypeProperty ; + rdfs:label "URL" ; + rdfs:isDefinedBy : . + +schema:location a owl:ObjectProperty ; + rdfs:label "Location" ; + rdfs:isDefinedBy : . + # restrictions [] a owl:Restriction ; diff --git a/demo/northwind-traders/categories.ttl b/demo/northwind-traders/categories.ttl index 781ba81..04e071d 100644 --- a/demo/northwind-traders/categories.ttl +++ b/demo/northwind-traders/categories.ttl @@ -10,9 +10,9 @@ <> a dh:Container ; dct:title "Categories" ; rdf:_1 <#category-intro> ; - rdf:_2 <#category-revenue> ; + rdf:_2 <#category-revenue-block> ; rdf:_3 <#category-distribution> ; - rdf:_4 <#products-per-category> ; + rdf:_4 <#products-per-category-block> ; rdf:_5 <#select-categories> . # Intro XHTML @@ -23,7 +23,10 @@ Analyzing category-level metrics helps identify portfolio strengths, diversification opportunities, and inventory priorities.

"""^^rdf:XMLLiteral . - # Category revenue chart + # Category revenue chart (wrapped in ldh:Object per ContentMode contract) + <#category-revenue-block> a ldh:Object ; + rdf:value <#category-revenue> . + <#category-revenue> a ldh:ResultSetChart ; dct:title "Revenue by category" ; spin:query <#category-revenue-query> ; @@ -62,7 +65,10 @@ ORDER BY DESC(?revenue)""" . Categories with more products may indicate core competencies or simply broader product lines.

"""^^rdf:XMLLiteral . - # Products per category chart + # Products per category chart (wrapped in ldh:Object per ContentMode contract) + <#products-per-category-block> a ldh:Object ; + rdf:value <#products-per-category> . + <#products-per-category> a ldh:ResultSetChart ; dct:title "Products per category" ; spin:query <#products-per-category-query> ; diff --git a/demo/northwind-traders/customers.ttl b/demo/northwind-traders/customers.ttl index 05518c5..27e421f 100644 --- a/demo/northwind-traders/customers.ttl +++ b/demo/northwind-traders/customers.ttl @@ -10,9 +10,9 @@ <> a dh:Container ; dct:title "Customers" ; rdf:_1 <#customers-intro> ; - rdf:_2 <#top-customers> ; + rdf:_2 <#top-customers-block> ; rdf:_3 <#geographic-distribution> ; - rdf:_4 <#customers-by-country> ; + rdf:_4 <#customers-by-country-block> ; rdf:_5 <#customer-insights> ; rdf:_6 <#select-customers> . @@ -24,7 +24,10 @@ and market concentration helps prioritize account management and target growth strategies.

"""^^rdf:XMLLiteral . - # Top customers chart + # Top customers chart (wrapped in ldh:Object per ContentMode contract) + <#top-customers-block> a ldh:Object ; + rdf:value <#top-customers> . + <#top-customers> a ldh:ResultSetChart ; dct:title "Top 10 customers by revenue" ; spin:query <#top-customers-query> ; @@ -61,7 +64,10 @@ LIMIT 10""" . Understanding geographic concentration helps guide expansion efforts and resource allocation.

"""^^rdf:XMLLiteral . - # Customers by country chart + # Customers by country chart (wrapped in ldh:Object per ContentMode contract) + <#customers-by-country-block> a ldh:Object ; + rdf:value <#customers-by-country> . + <#customers-by-country> a ldh:ResultSetChart ; dct:title "Customers by country" ; spin:query <#customers-by-country-query> ; diff --git a/demo/northwind-traders/employees.ttl b/demo/northwind-traders/employees.ttl index 435baff..ec672cc 100644 --- a/demo/northwind-traders/employees.ttl +++ b/demo/northwind-traders/employees.ttl @@ -10,7 +10,7 @@ <> a dh:Container ; dct:title "Employees" ; rdf:_1 <#employee-intro> ; - rdf:_2 <#sales-by-employee> ; + rdf:_2 <#sales-by-employee-block> ; rdf:_3 <#select-employees> . # Intro XHTML @@ -21,7 +21,10 @@ contributions helps recognize top performers, identify coaching opportunities, and optimize territory assignments.

"""^^rdf:XMLLiteral . - # Sales by employee chart + # Sales by employee chart (wrapped in ldh:Object per ContentMode contract) + <#sales-by-employee-block> a ldh:Object ; + rdf:value <#sales-by-employee> . + <#sales-by-employee> a ldh:ResultSetChart ; dct:title "Sales by employee" ; spin:query <#sales-by-employee-query> ; diff --git a/demo/northwind-traders/orders.ttl b/demo/northwind-traders/orders.ttl index 5fbd569..e9f32e5 100644 --- a/demo/northwind-traders/orders.ttl +++ b/demo/northwind-traders/orders.ttl @@ -10,11 +10,11 @@ <> a dh:Container ; dct:title "Orders" ; rdf:_1 <#orders-intro> ; - rdf:_2 <#orders-over-time> ; + rdf:_2 <#orders-over-time-block> ; rdf:_3 <#geographic-intro> ; - rdf:_4 <#orders-by-country> ; + rdf:_4 <#orders-by-country-block> ; rdf:_5 <#order-trends-summary> ; - rdf:_6 <#sales-by-region-per-year> ; + rdf:_6 <#sales-by-region-per-year-block> ; rdf:_7 <#select-orders> . # Object block (references the view) @@ -51,7 +51,10 @@ helps optimize inventory, predict demand, and identify growth opportunities across different markets.

"""^^rdf:XMLLiteral . - # Orders over time chart + # Orders over time chart (wrapped in ldh:Object per ContentMode contract) + <#orders-over-time-block> a ldh:Object ; + rdf:value <#orders-over-time> . + <#orders-over-time> a ldh:ResultSetChart ; dct:title "Orders per month" ; spin:query <#orders-by-month-query> ; @@ -82,7 +85,10 @@ ORDER BY ?month""" . and helps identify expansion opportunities or regional challenges.

"""^^rdf:XMLLiteral . - # Orders by country chart + # Orders by country chart (wrapped in ldh:Object per ContentMode contract) + <#orders-by-country-block> a ldh:Object ; + rdf:value <#orders-by-country> . + <#orders-by-country> a ldh:ResultSetChart ; dct:title "Orders by country" ; spin:query <#orders-by-country-query> ; @@ -106,7 +112,10 @@ GROUP BY ?country ORDER BY DESC(?orderCount) LIMIT 10""" . - # Chart block + # Chart block (wrapped in ldh:Object per ContentMode contract) + <#sales-by-region-per-year-block> a ldh:Object ; + rdf:value <#sales-by-region-per-year> . + <#sales-by-region-per-year> a ldh:ResultSetChart ; dct:title "Sales by region per year" ; spin:query <#sales-by-regions-by-year-query> ; diff --git a/demo/northwind-traders/products.ttl b/demo/northwind-traders/products.ttl index 9dba6a2..84ba577 100644 --- a/demo/northwind-traders/products.ttl +++ b/demo/northwind-traders/products.ttl @@ -10,10 +10,10 @@ <> a dh:Container ; dct:title "Products" ; rdf:_1 <#products-intro> ; - rdf:_2 <#top-selling-products> ; + rdf:_2 <#top-selling-products-block> ; rdf:_3 <#category-analysis-intro> ; - rdf:_4 <#revenue-by-category> ; - rdf:_5 <#products-by-supplier> ; + rdf:_4 <#revenue-by-category-block> ; + rdf:_5 <#products-by-supplier-block> ; rdf:_6 <#supplier-context> ; rdf:_7 <#select-products> . @@ -26,7 +26,10 @@ each with unique pricing and inventory characteristics.

"""^^rdf:XMLLiteral . - # Chart block + # Chart block (wrapped in ldh:Object per ContentMode contract) + <#top-selling-products-block> a ldh:Object ; + rdf:value <#top-selling-products> . + <#top-selling-products> a ldh:ResultSetChart ; dct:title "Top selling products" ; spin:query <#products-by-sales-query> ; @@ -63,7 +66,10 @@ LIMIT 5""" . market strengths and opportunities. The following charts break down revenue and product count by category.

"""^^rdf:XMLLiteral . - # Revenue by category chart + # Revenue by category chart (wrapped in ldh:Object per ContentMode contract) + <#revenue-by-category-block> a ldh:Object ; + rdf:value <#revenue-by-category> . + <#revenue-by-category> a ldh:ResultSetChart ; dct:title "Revenue by category" ; spin:query <#category-revenue-query> ; @@ -94,7 +100,10 @@ WHERE { GROUP BY ?category ?categoryName ORDER BY DESC(?revenue)""" . - # Products by supplier chart + # Products by supplier chart (wrapped in ldh:Object per ContentMode contract) + <#products-by-supplier-block> a ldh:Object ; + rdf:value <#products-by-supplier> . + <#products-by-supplier> a ldh:ResultSetChart ; dct:title "Products by supplier" ; spin:query <#supplier-product-count-query> ; diff --git a/demo/northwind-traders/root.ttl b/demo/northwind-traders/root.ttl index 3046e19..4bb26a9 100644 --- a/demo/northwind-traders/root.ttl +++ b/demo/northwind-traders/root.ttl @@ -14,8 +14,8 @@ dct:description "Knowledge Graph representation of the Northwind Traders sample database" ; rdf:_1 <#page-header> ; rdf:_2 <#overview-intro> ; - rdf:_3 <#sales-trend> ; - rdf:_4 <#revenue-by-country> ; + rdf:_3 <#sales-trend-block> ; + rdf:_4 <#revenue-by-country-block> ; rdf:_5 <#top-selling-products> ; rdf:_6 <#top-manager-header> ; rdf:_7 <#top-manager> ; @@ -40,6 +40,9 @@

Explore key business metrics including sales trends, geographic distribution, and product performance. All visualizations are generated from live SPARQL queries over the RDF Knowledge Graph.

"""^^rdf:XMLLiteral . +<#sales-trend-block> a ldh:Object ; + rdf:value <#sales-trend> . + <#sales-trend> a ldh:ResultSetChart ; dct:title "Monthly sales trend" ; spin:query <#sales-by-month-query> ; @@ -66,6 +69,9 @@ WHERE { GROUP BY ?month ORDER BY ?month""" . +<#revenue-by-country-block> a ldh:Object ; + rdf:value <#revenue-by-country> . + <#revenue-by-country> a ldh:ResultSetChart ; dct:title "Revenue by country" ; spin:query <#revenue-by-country-query> ; diff --git a/demo/unesco-thesaurus/install.sh b/demo/unesco-thesaurus/install.sh index 3e5510b..5e20424 100755 --- a/demo/unesco-thesaurus/install.sh +++ b/demo/unesco-thesaurus/install.sh @@ -47,7 +47,7 @@ fi printf "\n### Installing SKOS package\n\n" -install-package.sh -b "$base" -f "$cert_pem_file" -p "$cert_password" --proxy "$proxy" --package "https://packages.linkeddatahub.com/skos/#this" +#install-package.sh -b "$base" -f "$cert_pem_file" -p "$cert_password" --proxy "$proxy" --package "https://packages.linkeddatahub.com/skos/#this" printf "\n### Importing SKOS vocabulary\n\n" diff --git a/demo/unesco-thesaurus/root.ttl b/demo/unesco-thesaurus/root.ttl index 5fa9187..410541e 100644 --- a/demo/unesco-thesaurus/root.ttl +++ b/demo/unesco-thesaurus/root.ttl @@ -15,7 +15,7 @@ dct:description "SKOS-based editor of thesauri, lexicons, vocabularies, taxonomies, and classification schemes" ; rdf:_1 <#page-header> ; rdf:_2 <#overview-intro> ; - rdf:_3 <#vocabulary-stats> ; + rdf:_3 <#vocabulary-stats-block> ; rdf:_4 <#explore-prompt> ; rdf:_5 <#select-children> . @@ -52,6 +52,9 @@ thousands of concepts organized into hierarchical and associative relationships.

"""^^rdf:XMLLiteral . +<#vocabulary-stats-block> a ldh:Object ; + rdf:value <#vocabulary-stats> . + <#vocabulary-stats> a ldh:ResultSetChart ; dct:title "Vocabulary statistics" ; spin:query <#vocabulary-stats-query> ; diff --git a/docs/Makefile b/docs/Makefile index f1e7c70..c6adcb5 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -25,5 +25,8 @@ install: validate: ./validate-documents.sh +check-links: + ../check-links.sh + ttl-to-html: ./ttl-to-html.sh diff --git a/docs/get-started/get-an-account.ttl b/docs/get-started/get-an-account.ttl index 50d7421..478e1f8 100644 --- a/docs/get-started/get-an-account.ttl +++ b/docs/get-started/get-an-account.ttl @@ -7,108 +7,95 @@ dct:title "Get an account" ; dct:description "How to get login to LinkedDataHub" ; rdf:_1 <#content> . - + <#content> a ldh:XHTML ; rdf:value """

This guide describes how to login to LinkedDataHub.

+
+

In order to authenticate as the owner of a LinkedDataHub instance, you need to use the WebID authentication method.

+
-
-

In order to authenticate as the owner of a LinkedDataHub instance, you need to use the WebID authentication method.

-
-
- -
-
-
-

Get certificate

-

LinkedDataHub uses WebID as the Single sign-on (SSO) - protocol for distributed applications, which is based on authentication using TLS client certficates. Using WebID, you will be able to authenticate with every LinkedDataHub application. - Read more about WebID.

-

There are two ways to get a LinkedDataHub WebID: setup and signup.

-
- -
-
-

Complete the setup and run own an instance of LinkedDataHub.

-

The ssl/owner/keystore.p12 file is your WebID certificate. The password is the owner_cert_password Docker secret value.

-
-
-

Sign up to an existing instance of LinkedDataHub. Click the Sign up button and fill out the form with your - details to get a WebID, as shown below.

-

- Signup -

-

You will get an email with a .p12 file attached, which is your WebID certificate. The certificate's password is the one you entered in the signup form.

-
-
-
-

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.

-
-

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

-
-
-
-

Install certificate

-

The final step is to install the client certificate into your web browser. It is done by importing the .p12 - file using the browser's certificate manager and providing the password that you supplied during signup. The - manager dialog can be opened following the steps below, depending on which browser you use:

-
-
Google Chrome
-
Settings > Advanced > Manage Certificates > Import...
-
Mozilla Firefox
-
Options > Privacy & Security > View Certificates... > Import...
-
Apple Safari
-
The file is installed directly into the operating system. Open the file and import it using the - Keychain Access - tool. Drag the .p12 file to the login section.
-
Microsoft Edge
-
Does not support certificate management, you need to install the file into Windows. - Read more here.
-
-

You need to install the certificate on all devices/browsers that you are using to access LinkedDataHub.

+
+

Get certificate

+

LinkedDataHub uses WebID as the Single sign-on (SSO) + protocol for distributed applications, which is based on authentication using TLS client certficates. Using WebID, you will be able to authenticate with every LinkedDataHub application. + Read more about WebID.

+

There are two ways to get a LinkedDataHub WebID: setup and signup.

+
+ +
+
+

Complete the setup and run own an instance of LinkedDataHub.

+

The ssl/owner/keystore.p12 file is your WebID certificate. The password is the owner_cert_password Docker secret value.

-
-

Log in

-

Open the URL of the LinkedDataHub instance in the web browser (that you installed the WebID certificate into). Using a local setup, it runs on https://localhost:4443/ by default.

-

With the certificate installed, there is no login procedure — you are automatically authenticated on all - LinkedDataHub applications. This is known as Single sign-on (SSO).

-

Applications can provide public access to some or all documents, meaning you can freely browse their public resources - and perform actions that are allowed for public access. In order to access protected (non-public) resources, as well - as to access administration application, users have to be authenticated as well authorized (authorizations - can be requested).

-
-

Authenticated agents are not guaranteed to have access to all resources. Different access levels for - different agents can be specified by the application administrators.

-
+
+

Sign up to an existing instance of LinkedDataHub. Click the Sign up button and fill out the form with your + details to get a WebID, as shown below.

+

+ Signup +

+

You will get an email with a .p12 file attached, which is your WebID certificate. The certificate's password is the one you entered in the signup form.

-
-
-

Click the Login with Google button in the navbar to authenticate with your Google account.

-

If the email address of your Google account matches the dataspace owner's email address that was specified during setup, you will be authenticated as the owner with full control access rights.

-
-

Login with Google is only enabled if LinkedDataHub was configured with social login.

-
-
-
+
+
+

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.

+
+

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

+
+
+
+

Install certificate

+

The final step is to install the client certificate into your web browser. It is done by importing the .p12 + file using the browser's certificate manager and providing the password that you supplied during signup. The + manager dialog can be opened following the steps below, depending on which browser you use:

+
+
Google Chrome
+
Settings > Advanced > Manage Certificates > Import...
+
Mozilla Firefox
+
Options > Privacy & Security > View Certificates... > Import...
+
Apple Safari
+
The file is installed directly into the operating system. Open the file and import it using the + Keychain Access + tool. Drag the .p12 file to the login section.
+
Microsoft Edge
+
Does not support certificate management, you need to install the file into Windows. + Read more here.
+
+

You need to install the certificate on all devices/browsers that you are using to access LinkedDataHub.

+
+
+

Log in

+

Open the URL of the LinkedDataHub instance in the web browser (that you installed the WebID certificate into). Using a local setup, it runs on https://localhost:4443/ by default.

+

With the certificate installed, there is no login procedure — you are automatically authenticated on all + LinkedDataHub applications. This is known as Single sign-on (SSO).

+

Applications can provide public access to some or all documents, meaning you can freely browse their public resources + and perform actions that are allowed for public access. In order to access protected (non-public) resources, as well + as to access administration application, users have to be authenticated as well authorized (authorizations + can be requested).

+
+

Authenticated agents are not guaranteed to have access to all resources. Different access levels for + different agents can be specified by the application administrators.

+
+
+
+
+

Click the Login with Google button in the navbar to authenticate with your Google account.

+

If the email address of your Google account matches the dataspace owner's email address that was specified during setup, you will be authenticated as the owner with full control access rights.

+
+

Login with Google is only enabled if LinkedDataHub was configured with social login.

-
-
-

To sign in, click on the Login with Google button. A unique agent URI will be assigned to you and used to authenticate you with the applications on the platform.

-
+
diff --git a/docs/get-started/setup.ttl b/docs/get-started/setup.ttl index 123e173..77b6a2a 100644 --- a/docs/get-started/setup.ttl +++ b/docs/get-started/setup.ttl @@ -15,29 +15,21 @@

-
- -
-
-
-

Start LinkedDataHub

-

This section assumes you will be running on your local machine, i.e. localhost. If you intend to run it on a different host, change the system base URI.

-

Prerequisites:

- -

Steps:

-
    -
  1. Fork the LinkedDataHub repository - and clone the fork into a folder
  2. -
  3. In the folder, create an .env file and fill out the missing values (you can use .env_sample as a template). For example: -
    COMPOSE_CONVERT_WINDOWS_PATHS=1
    +        

    Start LinkedDataHub

    +

    This section assumes you will be running on your local machine, i.e. localhost. If you intend to run it on a different host, change the system base URI.

    +

    Prerequisites:

    + +

    Steps:

    +
      +
    1. Fork the LinkedDataHub repository + and clone the fork into a folder
    2. +
    3. In the folder, create an .env file and fill out the missing values (you can use .env_sample as a template). For example: +
      COMPOSE_CONVERT_WINDOWS_PATHS=1
       COMPOSE_PROJECT_NAME=linkeddatahub
       
       PROTOCOL=https
      @@ -54,51 +46,42 @@ OWNER_ORGANIZATION=My org
       OWNER_LOCALITY=Copenhagen
       OWNER_STATE_OR_PROVINCE=Denmark
       OWNER_COUNTRY_NAME=DK
      -
    4. -
    5. Setup the server's SSL certificates by running this from command line: -
      ./bin/server-cert-gen.sh .env nginx ssl
      - The script will create an ssl/server sub-folder where the SSL certificate will be stored. -
    6. -
    7. Create the following secrets with certificate/truststore passwords: -
        -
      • secrets/client_truststore_password.txt
      • -
      • secrets/owner_cert_password.txt
      • -
      • secrets/secretary_cert_password.txt
      • -
      - The one you will need to remember in order to authenticate with LinkedDataHub using WebID client certificate is owner_cert_password. -
    8. -
    9. (Optional) If you need to configure Bearer token authentication for SPARQL services, create secrets/credentials.trig with your service credentials. See the configuration reference for details.
    10. -
    11. Run this from command line: -
      docker-compose up --build
      - LinkedDataHub will start and mount the following sub-folders: -
        -
      1. data where the backend triplestores will persist RDF data
      2. -
      3. datasets where the owner and secretary agent metadata is persisted
      4. -
      5. ssl/owner and ssl/secretary where the owner and secretary SSL certificates and WebID public keys are persisted
      6. -
      7. uploads where LinkedDataHub stores content-hashed file uploads
      8. -
      9. config where dataspace and service configurations are stored
      10. -
      -
    12. -
    -

    You are now the owner of this LinkedDataHub instance; ssl/owner/keystore.p12 is your WebID certificate. Password is the owner_cert_password secret value.

    -

    After a successful startup you should see periodic healthcheck requests being made to the https://localhost:4443/ns URL.

    -
-
-

Reset

-

If you need to start fresh and wipe the existing setup, you can do that using:

-
sudo rm -rf data datasets uploads ssl && docker-compose down -v
-
-

This will remove persisted RDF data, SSL keys, and uploaded files as well as the Docker volumes.

-
-
-

Is LinkedDataHub running? Proceed to get an account.

-
-
-

Access LinkedDataHub Cloud

-

LinkedDataHub Cloud is a managed LinkedDataHub service, meaning that you do not have to do any setup yourself.

-

Proceed to get an account to see how to login to LinkedDataHub Cloud.

-
-
+ +
  • Setup the server's SSL certificates by running this from command line: +
    ./bin/server-cert-gen.sh .env nginx ssl
    + The script will create an ssl/server sub-folder where the SSL certificate will be stored. +
  • +
  • Create the following secrets with certificate/truststore passwords: +
      +
    • secrets/client_truststore_password.txt
    • +
    • secrets/owner_cert_password.txt
    • +
    • secrets/secretary_cert_password.txt
    • +
    + The one you will need to remember in order to authenticate with LinkedDataHub using WebID client certificate is owner_cert_password. +
  • +
  • (Optional) If you need to configure Bearer token authentication for SPARQL services, create secrets/credentials.trig with your service credentials. See the configuration reference for details.
  • +
  • Run this from command line: +
    docker-compose up --build
    + LinkedDataHub will start and mount the following sub-folders: +
      +
    1. data where the backend triplestores will persist RDF data
    2. +
    3. datasets where the owner and secretary agent metadata is persisted
    4. +
    5. ssl/owner and ssl/secretary where the owner and secretary SSL certificates and WebID public keys are persisted
    6. +
    7. uploads where LinkedDataHub stores content-hashed file uploads
    8. +
    9. config where dataspace and service configurations are stored
    10. +
    +
  • + +

    You are now the owner of this LinkedDataHub instance; ssl/owner/keystore.p12 is your WebID certificate. Password is the owner_cert_password secret value.

    +

    After a successful startup you should see periodic healthcheck requests being made to the https://localhost:4443/ns URL.

    +
    +
    +

    Reset

    +

    If you need to start fresh and wipe the existing setup, you can do that using:

    +
    sudo rm -rf data datasets uploads ssl && docker-compose down -v
    +
    +

    This will remove persisted RDF data, SSL keys, and uploaded files as well as the Docker volumes.

    +

    Is LinkedDataHub running? Proceed to get an account.

    """^^rdf:XMLLiteral . diff --git a/docs/reference/administration/acl.ttl b/docs/reference/administration/acl.ttl index 31b5e79..86ddbf3 100644 --- a/docs/reference/administration/acl.ttl +++ b/docs/reference/administration/acl.ttl @@ -61,7 +61,7 @@

    User accounts

    User account is a subclass of the sioc:UserAccount class. An account is the actual instance that performs actions on the application - (manages documents, imports data etc.). An + (manages documents, imports data etc.). An account always belongs to an agent.

    --> diff --git a/docs/reference/administration/packages.ttl b/docs/reference/administration/packages.ttl index 406fa47..b014acc 100644 --- a/docs/reference/administration/packages.ttl +++ b/docs/reference/administration/packages.ttl @@ -34,7 +34,7 @@
    ns.ttl — Package ontology
    An RDF ontology file that imports the external vocabulary using owl:imports and attaches blocks to properties using ldh:view (forward relationships) or ldh:inverseView (inverse relationships). Blocks are typically ldh:View resources with SPARQL queries that render related data for property values.
    layout.xsl — XSLT stylesheet
    -
    XSLT transformation file with templates that override default rendering using system modes like bs2:* (Bootstrap 2.3.2 components) and xhtml:* (XHTML elements). See Stylesheets reference for details on XSLT customization.
    +
    XSLT transformation file with templates that override default rendering using system modes like bs2:* (Bootstrap 2.3.2 components) and xhtml:* (XHTML elements). See Stylesheets reference for details on XSLT customization.

    Package files are organized in the LinkedDataHub-Apps repository:

    packages/
    @@ -191,7 +191,7 @@ schema:knows ldh:view :PersonKnows .
         ORDER BY ?person
         \"\"\" .

    Write XSLT stylesheet

    -

    Create layout.xsl with XSLT templates using system modes like bs2:* and xhtml:*. See the Stylesheets reference for template customization patterns.

    +

    Create layout.xsl with XSLT templates using system modes like bs2:* and xhtml:*. See the Stylesheets reference for template customization patterns.

    <xsl:template match="schema:knows" mode="bs2:PropertyList"/>

    Publish package metadata

    Publish package metadata as Linked Data at your package URI:

    diff --git a/docs/user-guide/create-data/create-content.ttl b/docs/user-guide/create-data/create-content.ttl index 4731c69..7201683 100644 --- a/docs/user-guide/create-data/create-content.ttl +++ b/docs/user-guide/create-data/create-content.ttl @@ -19,7 +19,7 @@
    XHTML
    A fragment of XHTML that is embedded onto the page
    Object
    -
    RDF URI resources that get transcluded into the page. Built-in resource examples: +
    RDF URI resources that get transcluded into the page. Built-in resource examples:
    Linked Data resource
    Any URI that resolves to RDF data
    diff --git a/docs/user-guide/import-data/import-csv-data.ttl b/docs/user-guide/import-data/import-csv-data.ttl index b05881d..05ea75e 100644 --- a/docs/user-guide/import-data/import-csv-data.ttl +++ b/docs/user-guide/import-data/import-csv-data.ttl @@ -65,7 +65,7 @@
  • Once all the fields have been filled in click Save. You can find this saved under - Queries container in left navigation.
  • + Queries container in left navigation.
  • Click on the Create dropdown button at the top left-hand corner and select CSV Import. This will open a new form.
  • Fill out Item fields
  • diff --git a/docs/user-guide/import-data/import-rdf-data.ttl b/docs/user-guide/import-data/import-rdf-data.ttl index b2d27b5..0409103 100644 --- a/docs/user-guide/import-data/import-rdf-data.ttl +++ b/docs/user-guide/import-data/import-rdf-data.ttl @@ -136,7 +136,7 @@
  • Once all the fields have been filled in click Save. You can find this saved under - Queries container in left navigation.
  • + Queries container in left navigation.
  • Click on the Create dropdown button at the top left-hand corner and select RDF Import. This will open a new form.
  • Fill out Item fields
  • diff --git a/docs/user-guide/manage-dataspaces.ttl b/docs/user-guide/manage-dataspaces.ttl index 715981f..b43cb95 100644 --- a/docs/user-guide/manage-dataspaces.ttl +++ b/docs/user-guide/manage-dataspaces.ttl @@ -2,163 +2,55 @@ @prefix rdf: . @prefix dh: . @prefix dct: . - + <> a dh:Item ; dct:title "Manage dataspaces" ; dct:description "Create or change a dataspace, configure SPARQL services and XSLT stylesheets" ; rdf:_1 <#content> . - + <#content> a ldh:XHTML ; rdf:value """

    Step by step guide to creating a new dataspace backed by SPARQL services

    -
    -