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.
-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.
-
-
-
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.
-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:
-You need to install the certificate on all devices/browsers that you are using to access LinkedDataHub.
+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.
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.
+
+
+
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.
+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:
+You need to install the certificate on all devices/browsers that you are using to access LinkedDataHub.
+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.
-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:
-$PATH.Steps:
-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:
+
$PATH.Steps:
+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-
./bin/server-cert-gen.sh .env nginx ssl- The script will create an ssl/server sub-folder where the SSL certificate will be stored. -
docker-compose up --build- LinkedDataHub will start and mount the following sub-folders: -
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.
-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.
-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.
-./bin/server-cert-gen.sh .env nginx ssl+ The script will create an ssl/server sub-folder where the SSL certificate will be stored. +
docker-compose up --build+ LinkedDataHub will start and mount the following sub-folders: +
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.
+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.
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.
ns.ttl — Package ontologyowl: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 stylesheetbs2:* (Bootstrap 2.3.2 components) and xhtml:* (XHTML elements). See Stylesheets reference for details on XSLT customization.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
\"\"\" .
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 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 @@Step by step guide to creating a new dataspace backed by SPARQL services
-