From e49e2cde3a49026db8aa3d13932edba9477d72f6 Mon Sep 17 00:00:00 2001 From: seakayone Date: Wed, 20 Nov 2024 17:36:38 +0000 Subject: [PATCH] Deployed f9dcd9868 with MkDocs version: 1.5.3 --- .nojekyll | 0 01-introduction/example-project/index.html | 3425 ++ 01-introduction/file-formats/index.html | 2941 ++ 01-introduction/standoff-rdf/index.html | 2932 ++ 01-introduction/what-is-dsp/index.html | 3163 ++ 02-dsp-ontologies/introduction-fig1.dot | 10 + 02-dsp-ontologies/introduction-fig1.dot.png | Bin 0 -> 9160 bytes 02-dsp-ontologies/introduction-fig2.dot | 42 + 02-dsp-ontologies/introduction-fig2.dot.png | Bin 0 -> 38200 bytes 02-dsp-ontologies/introduction-fig3.dot | 23 + 02-dsp-ontologies/introduction-fig3.dot.png | Bin 0 -> 22506 bytes 02-dsp-ontologies/introduction/index.html | 3029 ++ 02-dsp-ontologies/knora-base-fig1.dot | 33 + 02-dsp-ontologies/knora-base-fig1.dot.png | Bin 0 -> 36499 bytes 02-dsp-ontologies/knora-base-fig2.dot | 47 + 02-dsp-ontologies/knora-base-fig2.dot.png | Bin 0 -> 65507 bytes 02-dsp-ontologies/knora-base-fig3.dot | 57 + 02-dsp-ontologies/knora-base-fig3.dot.png | Bin 0 -> 59160 bytes 02-dsp-ontologies/knora-base/index.html | 5024 +++ 02-dsp-ontologies/salsah-gui/index.html | 3554 ++ 03-endpoints/api-admin/groups/index.html | 3210 ++ 03-endpoints/api-admin/index.html | 28496 ++++++++++++++++ .../api-admin/introduction/index.html | 3092 ++ 03-endpoints/api-admin/lists/index.html | 3574 ++ 03-endpoints/api-admin/overview/index.html | 2902 ++ 03-endpoints/api-admin/permissions/index.html | 3433 ++ 03-endpoints/api-admin/projects/index.html | 4132 +++ 03-endpoints/api-admin/stores/index.html | 2892 ++ 03-endpoints/api-admin/users/index.html | 3580 ++ 03-endpoints/api-util/version/index.html | 2983 ++ 03-endpoints/api-v2/authentication/index.html | 3008 ++ .../api-v2/editing-resources/index.html | 3416 ++ 03-endpoints/api-v2/editing-values/index.html | 3803 +++ 03-endpoints/api-v2/getting-lists/index.html | 2977 ++ 03-endpoints/api-v2/introduction/index.html | 3149 ++ 03-endpoints/api-v2/knora-iris/index.html | 3234 ++ .../api-v2/ontology-information/index.html | 5402 +++ 03-endpoints/api-v2/permalinks/index.html | 3178 ++ 03-endpoints/api-v2/query-language/index.html | 4731 +++ .../index.html | 3815 +++ .../reading-user-permissions/index.html | 2903 ++ .../api-v2/text/custom-standoff/index.html | 3520 ++ 03-endpoints/api-v2/text/overview/index.html | 3109 ++ .../api-v2/text/standard-standoff/index.html | 2932 ++ 03-endpoints/api-v2/text/tei-xml/index.html | 3391 ++ .../generated-openapi/openapi-admin-api.yml | 6164 ++++ .../generated-openapi/openapi-management.yml | 203 + .../generated-openapi/openapi-shacl.yml | 150 + 03-endpoints/generated-openapi/openapi-v2.yml | 1705 + .../instrumentation/health/index.html | 2974 ++ .../instrumentation/introduction/index.html | 2897 ++ .../instrumentation/metrics/index.html | 3040 ++ .../configuration/index.html | 3197 ++ .../publishing/index.html | 2906 ++ .../index.html | 3005 ++ .../index.html | 3008 ++ .../index.html | 3007 ++ .../index.html | 3010 ++ .../index.html | 3012 ++ .../adr/ADR-0006-use-zio-http/index.html | 3011 ++ .../index.html | 3307 ++ .../index.html | 3030 ++ .../design/api-admin/administration-fig1.dot | 30 + .../api-admin/administration-fig1.dot.png | Bin 0 -> 96541 bytes .../design/api-admin/administration-fig2.dot | 18 + .../api-admin/administration-fig2.dot.png | Bin 0 -> 45517 bytes .../design/api-admin/administration-fig3.dot | 14 + .../api-admin/administration-fig3.dot.png | Bin 0 -> 37474 bytes .../design/api-admin/administration-fig4.dot | 12 + .../api-admin/administration-fig4.dot.png | Bin 0 -> 35591 bytes .../design/api-admin/administration-fig5.dot | 12 + .../api-admin/administration-fig5.dot.png | Bin 0 -> 41817 bytes .../design/api-admin/administration-fig6.dot | 16 + .../api-admin/administration-fig6.dot.png | Bin 0 -> 74379 bytes .../api-admin/administration/index.html | 3769 ++ 05-internals/design/api-v2/ark/index.html | 3121 ++ .../design/api-v2/content-wrappers/index.html | 2941 ++ .../design/api-v2/figures/query_graph.png | Bin 0 -> 45468 bytes .../design/api-v2/gravsearch/index.html | 3576 ++ .../api-v2/how-to-add-a-route/index.html | 3035 ++ 05-internals/design/api-v2/json-ld/index.html | 3184 ++ .../api-v2/ontology-management/index.html | 2924 ++ .../design/api-v2/ontology-schemas/index.html | 3149 ++ .../design/api-v2/overview/index.html | 3257 ++ .../design/api-v2/query-design/index.html | 3055 ++ 05-internals/design/api-v2/sipi/index.html | 3191 ++ .../design/api-v2/smart-iris/index.html | 3031 ++ .../design/api-v2/standoff/index.html | 3055 ++ .../class-and-property-hierarchies/index.html | 3775 ++ .../domain-entities-and-relations/index.html | 3204 ++ .../design/domain/system-instances/index.html | 3042 ++ .../principles/authentication/index.html | 3003 ++ .../consistency-checking/index.html | 3346 ++ .../principles/design-overview/index.html | 3162 ++ .../design/principles/rdf-api/index.html | 3096 ++ .../design/principles/store-module/index.html | 3021 ++ .../principles/triplestore-updates/index.html | 3667 ++ .../building-and-running/index.html | 3247 ++ .../development/docker-cheat-sheet/index.html | 3083 ++ .../development/docker-compose/index.html | 2895 ++ .../development/figures/DockerLog.png | Bin 0 -> 219426 bytes .../development/figures/dockerDashboard.png | Bin 0 -> 69875 bytes .../development/figures/dockerDesktop.png | Bin 0 -> 148671 bytes .../development/figures/dockerPreferences.png | Bin 0 -> 122789 bytes .../development/figures/vscode-docker.png | Bin 0 -> 315339 bytes .../figures/vscode-metals-test-codelens.png | Bin 0 -> 71768 bytes .../figures/vscode-metals-test.png | Bin 0 -> 206400 bytes 05-internals/development/overview/index.html | 3091 ++ 05-internals/development/testing/index.html | 3017 ++ .../development/third-party/index.html | 3036 ++ .../updating-repositories/index.html | 3122 ++ .../development/vscode-config/index.html | 3000 ++ 06-sipi/index.html | 2896 ++ 06-sipi/sipi-and-dsp-api/index.html | 3065 ++ .../lucene-query-parser-syntax/index.html | 2948 ++ 08-faq/faq-fig1.dot | 11 + 08-faq/faq-fig1.dot.png | Bin 0 -> 7167 bytes 08-faq/faq-fig2.dot | 15 + 08-faq/faq-fig2.dot.png | Bin 0 -> 13302 bytes 08-faq/index.html | 3264 ++ 09-release-notes/index.html | 2877 ++ 10-migration-guides/index.html | 3052 ++ 404.html | 2823 ++ Makefile | 20 + Readme/index.html | 2913 ++ .../http-request-flow-with-events/index.html | 2921 ++ .../docs/http-request-flow/index.html | 2905 ++ architecture/index.html | 2899 ++ architecture/users.dsl | 8 + architecture/workspace.dsl | 178 + assets/css/mkdocsoad-v1.0.2.css | 1614 + assets/css/theme.css | 28 + assets/icons/logo_bw.svg | 96 + assets/images/favicon.png | Bin 0 -> 1870 bytes assets/javascripts/bundle.1e8ae164.min.js | 29 + assets/javascripts/bundle.1e8ae164.min.js.map | 7 + assets/javascripts/lunr/min/lunr.ar.min.js | 1 + assets/javascripts/lunr/min/lunr.da.min.js | 18 + assets/javascripts/lunr/min/lunr.de.min.js | 18 + assets/javascripts/lunr/min/lunr.du.min.js | 18 + assets/javascripts/lunr/min/lunr.el.min.js | 1 + assets/javascripts/lunr/min/lunr.es.min.js | 18 + assets/javascripts/lunr/min/lunr.fi.min.js | 18 + assets/javascripts/lunr/min/lunr.fr.min.js | 18 + assets/javascripts/lunr/min/lunr.he.min.js | 1 + assets/javascripts/lunr/min/lunr.hi.min.js | 1 + assets/javascripts/lunr/min/lunr.hu.min.js | 18 + assets/javascripts/lunr/min/lunr.hy.min.js | 1 + assets/javascripts/lunr/min/lunr.it.min.js | 18 + assets/javascripts/lunr/min/lunr.ja.min.js | 1 + assets/javascripts/lunr/min/lunr.jp.min.js | 1 + assets/javascripts/lunr/min/lunr.kn.min.js | 1 + assets/javascripts/lunr/min/lunr.ko.min.js | 1 + assets/javascripts/lunr/min/lunr.multi.min.js | 1 + assets/javascripts/lunr/min/lunr.nl.min.js | 18 + assets/javascripts/lunr/min/lunr.no.min.js | 18 + assets/javascripts/lunr/min/lunr.pt.min.js | 18 + assets/javascripts/lunr/min/lunr.ro.min.js | 18 + assets/javascripts/lunr/min/lunr.ru.min.js | 18 + assets/javascripts/lunr/min/lunr.sa.min.js | 1 + .../lunr/min/lunr.stemmer.support.min.js | 1 + assets/javascripts/lunr/min/lunr.sv.min.js | 18 + assets/javascripts/lunr/min/lunr.ta.min.js | 1 + assets/javascripts/lunr/min/lunr.te.min.js | 1 + assets/javascripts/lunr/min/lunr.th.min.js | 1 + assets/javascripts/lunr/min/lunr.tr.min.js | 18 + assets/javascripts/lunr/min/lunr.vi.min.js | 1 + assets/javascripts/lunr/min/lunr.zh.min.js | 1 + assets/javascripts/lunr/tinyseg.js | 206 + assets/javascripts/lunr/wordcut.js | 6708 ++++ .../workers/search.b8dbb3d2.min.js | 42 + .../workers/search.b8dbb3d2.min.js.map | 7 + assets/stylesheets/main.bcfcd587.min.css | 1 + assets/stylesheets/main.bcfcd587.min.css.map | 1 + assets/stylesheets/palette.06af60db.min.css | 1 + .../stylesheets/palette.06af60db.min.css.map | 1 + index.html | 2885 ++ requirements.txt | 5 + search/search_index.json | 1 + sitemap.xml | 3 + sitemap.xml.gz | Bin 0 -> 127 bytes 181 files changed, 322682 insertions(+) create mode 100644 .nojekyll create mode 100644 01-introduction/example-project/index.html create mode 100644 01-introduction/file-formats/index.html create mode 100644 01-introduction/standoff-rdf/index.html create mode 100644 01-introduction/what-is-dsp/index.html create mode 100644 02-dsp-ontologies/introduction-fig1.dot create mode 100644 02-dsp-ontologies/introduction-fig1.dot.png create mode 100644 02-dsp-ontologies/introduction-fig2.dot create mode 100644 02-dsp-ontologies/introduction-fig2.dot.png create mode 100644 02-dsp-ontologies/introduction-fig3.dot create mode 100644 02-dsp-ontologies/introduction-fig3.dot.png create mode 100644 02-dsp-ontologies/introduction/index.html create mode 100644 02-dsp-ontologies/knora-base-fig1.dot create mode 100644 02-dsp-ontologies/knora-base-fig1.dot.png create mode 100644 02-dsp-ontologies/knora-base-fig2.dot create mode 100644 02-dsp-ontologies/knora-base-fig2.dot.png create mode 100644 02-dsp-ontologies/knora-base-fig3.dot create mode 100644 02-dsp-ontologies/knora-base-fig3.dot.png create mode 100644 02-dsp-ontologies/knora-base/index.html create mode 100644 02-dsp-ontologies/salsah-gui/index.html create mode 100644 03-endpoints/api-admin/groups/index.html create mode 100644 03-endpoints/api-admin/index.html create mode 100644 03-endpoints/api-admin/introduction/index.html create mode 100644 03-endpoints/api-admin/lists/index.html create mode 100644 03-endpoints/api-admin/overview/index.html create mode 100644 03-endpoints/api-admin/permissions/index.html create mode 100644 03-endpoints/api-admin/projects/index.html create mode 100644 03-endpoints/api-admin/stores/index.html create mode 100644 03-endpoints/api-admin/users/index.html create mode 100644 03-endpoints/api-util/version/index.html create mode 100644 03-endpoints/api-v2/authentication/index.html create mode 100644 03-endpoints/api-v2/editing-resources/index.html create mode 100644 03-endpoints/api-v2/editing-values/index.html create mode 100644 03-endpoints/api-v2/getting-lists/index.html create mode 100644 03-endpoints/api-v2/introduction/index.html create mode 100644 03-endpoints/api-v2/knora-iris/index.html create mode 100644 03-endpoints/api-v2/ontology-information/index.html create mode 100644 03-endpoints/api-v2/permalinks/index.html create mode 100644 03-endpoints/api-v2/query-language/index.html create mode 100644 03-endpoints/api-v2/reading-and-searching-resources/index.html create mode 100644 03-endpoints/api-v2/reading-user-permissions/index.html create mode 100644 03-endpoints/api-v2/text/custom-standoff/index.html create mode 100644 03-endpoints/api-v2/text/overview/index.html create mode 100644 03-endpoints/api-v2/text/standard-standoff/index.html create mode 100644 03-endpoints/api-v2/text/tei-xml/index.html create mode 100644 03-endpoints/generated-openapi/openapi-admin-api.yml create mode 100644 03-endpoints/generated-openapi/openapi-management.yml create mode 100644 03-endpoints/generated-openapi/openapi-shacl.yml create mode 100644 03-endpoints/generated-openapi/openapi-v2.yml create mode 100644 03-endpoints/instrumentation/health/index.html create mode 100644 03-endpoints/instrumentation/introduction/index.html create mode 100644 03-endpoints/instrumentation/metrics/index.html create mode 100644 04-publishing-deployment/configuration/index.html create mode 100644 04-publishing-deployment/publishing/index.html create mode 100644 05-internals/design/adr/ADR-0001-record-architecture-decisions/index.html create mode 100644 05-internals/design/adr/ADR-0002-change-cache-service-manager-from-akka-actor-to-zlayer/index.html create mode 100644 05-internals/design/adr/ADR-0003-change-iiif-service-manager-and-sipi-implementation-to-zlayer/index.html create mode 100644 05-internals/design/adr/ADR-0004-change-triplestore-service-manager-and-fuseki-implementation-to-zlayer/index.html create mode 100644 05-internals/design/adr/ADR-0005-change-respondermanager-to-a-simple-case-class/index.html create mode 100644 05-internals/design/adr/ADR-0006-use-zio-http/index.html create mode 100644 05-internals/design/adr/ADR-0007-zio-fication-of-responders/index.html create mode 100644 05-internals/design/adr/ADR-0008-replace-akka-with-pekko/index.html create mode 100644 05-internals/design/api-admin/administration-fig1.dot create mode 100644 05-internals/design/api-admin/administration-fig1.dot.png create mode 100644 05-internals/design/api-admin/administration-fig2.dot create mode 100644 05-internals/design/api-admin/administration-fig2.dot.png create mode 100644 05-internals/design/api-admin/administration-fig3.dot create mode 100644 05-internals/design/api-admin/administration-fig3.dot.png create mode 100644 05-internals/design/api-admin/administration-fig4.dot create mode 100644 05-internals/design/api-admin/administration-fig4.dot.png create mode 100644 05-internals/design/api-admin/administration-fig5.dot create mode 100644 05-internals/design/api-admin/administration-fig5.dot.png create mode 100644 05-internals/design/api-admin/administration-fig6.dot create mode 100644 05-internals/design/api-admin/administration-fig6.dot.png create mode 100644 05-internals/design/api-admin/administration/index.html create mode 100644 05-internals/design/api-v2/ark/index.html create mode 100644 05-internals/design/api-v2/content-wrappers/index.html create mode 100644 05-internals/design/api-v2/figures/query_graph.png create mode 100644 05-internals/design/api-v2/gravsearch/index.html create mode 100644 05-internals/design/api-v2/how-to-add-a-route/index.html create mode 100644 05-internals/design/api-v2/json-ld/index.html create mode 100644 05-internals/design/api-v2/ontology-management/index.html create mode 100644 05-internals/design/api-v2/ontology-schemas/index.html create mode 100644 05-internals/design/api-v2/overview/index.html create mode 100644 05-internals/design/api-v2/query-design/index.html create mode 100644 05-internals/design/api-v2/sipi/index.html create mode 100644 05-internals/design/api-v2/smart-iris/index.html create mode 100644 05-internals/design/api-v2/standoff/index.html create mode 100644 05-internals/design/domain/class-and-property-hierarchies/index.html create mode 100644 05-internals/design/domain/domain-entities-and-relations/index.html create mode 100644 05-internals/design/domain/system-instances/index.html create mode 100644 05-internals/design/principles/authentication/index.html create mode 100644 05-internals/design/principles/consistency-checking/index.html create mode 100644 05-internals/design/principles/design-overview/index.html create mode 100644 05-internals/design/principles/rdf-api/index.html create mode 100644 05-internals/design/principles/store-module/index.html create mode 100644 05-internals/design/principles/triplestore-updates/index.html create mode 100644 05-internals/development/building-and-running/index.html create mode 100644 05-internals/development/docker-cheat-sheet/index.html create mode 100644 05-internals/development/docker-compose/index.html create mode 100644 05-internals/development/figures/DockerLog.png create mode 100644 05-internals/development/figures/dockerDashboard.png create mode 100644 05-internals/development/figures/dockerDesktop.png create mode 100644 05-internals/development/figures/dockerPreferences.png create mode 100644 05-internals/development/figures/vscode-docker.png create mode 100644 05-internals/development/figures/vscode-metals-test-codelens.png create mode 100644 05-internals/development/figures/vscode-metals-test.png create mode 100644 05-internals/development/overview/index.html create mode 100644 05-internals/development/testing/index.html create mode 100644 05-internals/development/third-party/index.html create mode 100644 05-internals/development/updating-repositories/index.html create mode 100644 05-internals/development/vscode-config/index.html create mode 100644 06-sipi/index.html create mode 100644 06-sipi/sipi-and-dsp-api/index.html create mode 100644 07-lucene/lucene-query-parser-syntax/index.html create mode 100644 08-faq/faq-fig1.dot create mode 100644 08-faq/faq-fig1.dot.png create mode 100644 08-faq/faq-fig2.dot create mode 100644 08-faq/faq-fig2.dot.png create mode 100644 08-faq/index.html create mode 100644 09-release-notes/index.html create mode 100644 10-migration-guides/index.html create mode 100644 404.html create mode 100644 Makefile create mode 100644 Readme/index.html create mode 100644 architecture/docs/http-request-flow-with-events/index.html create mode 100644 architecture/docs/http-request-flow/index.html create mode 100644 architecture/index.html create mode 100644 architecture/users.dsl create mode 100644 architecture/workspace.dsl create mode 100644 assets/css/mkdocsoad-v1.0.2.css create mode 100644 assets/css/theme.css create mode 100644 assets/icons/logo_bw.svg create mode 100644 assets/images/favicon.png create mode 100644 assets/javascripts/bundle.1e8ae164.min.js create mode 100644 assets/javascripts/bundle.1e8ae164.min.js.map create mode 100644 assets/javascripts/lunr/min/lunr.ar.min.js create mode 100644 assets/javascripts/lunr/min/lunr.da.min.js create mode 100644 assets/javascripts/lunr/min/lunr.de.min.js create mode 100644 assets/javascripts/lunr/min/lunr.du.min.js create mode 100644 assets/javascripts/lunr/min/lunr.el.min.js create mode 100644 assets/javascripts/lunr/min/lunr.es.min.js create mode 100644 assets/javascripts/lunr/min/lunr.fi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.fr.min.js create mode 100644 assets/javascripts/lunr/min/lunr.he.min.js create mode 100644 assets/javascripts/lunr/min/lunr.hi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.hu.min.js create mode 100644 assets/javascripts/lunr/min/lunr.hy.min.js create mode 100644 assets/javascripts/lunr/min/lunr.it.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ja.min.js create mode 100644 assets/javascripts/lunr/min/lunr.jp.min.js create mode 100644 assets/javascripts/lunr/min/lunr.kn.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ko.min.js create mode 100644 assets/javascripts/lunr/min/lunr.multi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.nl.min.js create mode 100644 assets/javascripts/lunr/min/lunr.no.min.js create mode 100644 assets/javascripts/lunr/min/lunr.pt.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ro.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ru.min.js create mode 100644 assets/javascripts/lunr/min/lunr.sa.min.js create mode 100644 assets/javascripts/lunr/min/lunr.stemmer.support.min.js create mode 100644 assets/javascripts/lunr/min/lunr.sv.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ta.min.js create mode 100644 assets/javascripts/lunr/min/lunr.te.min.js create mode 100644 assets/javascripts/lunr/min/lunr.th.min.js create mode 100644 assets/javascripts/lunr/min/lunr.tr.min.js create mode 100644 assets/javascripts/lunr/min/lunr.vi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.zh.min.js create mode 100644 assets/javascripts/lunr/tinyseg.js create mode 100644 assets/javascripts/lunr/wordcut.js create mode 100644 assets/javascripts/workers/search.b8dbb3d2.min.js create mode 100644 assets/javascripts/workers/search.b8dbb3d2.min.js.map create mode 100644 assets/stylesheets/main.bcfcd587.min.css create mode 100644 assets/stylesheets/main.bcfcd587.min.css.map create mode 100644 assets/stylesheets/palette.06af60db.min.css create mode 100644 assets/stylesheets/palette.06af60db.min.css.map create mode 100644 index.html create mode 100644 requirements.txt create mode 100644 search/search_index.json create mode 100644 sitemap.xml create mode 100644 sitemap.xml.gz diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000000..e69de29bb2 diff --git a/01-introduction/example-project/index.html b/01-introduction/example-project/index.html new file mode 100644 index 0000000000..d1227f4f56 --- /dev/null +++ b/01-introduction/example-project/index.html @@ -0,0 +1,3425 @@ + + + + + + + + + + + + + + + + + + + + + + + An Example Project - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + +

An Example Project

+

This section introduces some of the basic concepts involved in creating +ontologies for DSP projects, by means of a relatively simple example +project. Before reading this document, it will be helpful to have some +familiarity with the basic concepts explained in knora-base.

+

DSP-API comes with two example projects, called incunabula and +images-demo. Here we will consider the incunabula example, which is +a reduced version of a real research project on early printed books. It +is designed to store an image of each page of each book, as well as RDF +data about books, pages, their contents, and relationships between them.

+

The Incunabula Ontology

+

Here we will just focus on some of the main aspects of the ontology. An +ontology file typically begins by defining prefixes for the IRIs of +other ontologies that will be referred to. First there are some prefixes +for ontologies that are very commonly used in RDF:

+
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
+@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
+@prefix owl: <http://www.w3.org/2002/07/owl#> .
+@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
+@prefix foaf: <http://xmlns.com/foaf/0.1/> .
+@prefix dcterms: <http://purl.org/dc/terms/> .
+
+

The rdf, rdfs, and owl ontologies contain basic properties that +are used to define ontology entities. The xsd ontology contains +definitions of literal data types such as string and integer. (For +more information about these ontologies, see the references in +knora-base.) The foaf ontology contains classes and properties for +representing people. The dcterms ontology represents Dublin +Core metadata.

+

Then we define prefixes for DSP ontologies:

+
@prefix knora-base: <http://www.knora.org/ontology/knora-base#> .
+@prefix salsah-gui: <http://www.knora.org/ontology/salsah-gui#> .
+
+

The knora-base ontology contains DSP-API's core abstractions, and is +described in knora-base. The salsah-gui ontology includes properties +that DSP projects must use to enable SALSAH, DSP-API's generic virtual +research environment.

+

For convenience, we can use the empty prefix to refer to the +incunabula ontology itself:

+
@prefix : <http://www.knora.org/ontology/0803/incunabula#> .
+
+

However, outside the ontology file, it would make more sense to define +an incunabula prefix to refer to the incunabula ontology.

+

Properties

+

All the content produced by a DSP project must be stored in Knora +resources (see incunabula-resource-classes). Resources have properties +that point to different parts of their contents; for example, the +incunabula project contains books, which have properties like title. +Every property that poitns to a DSP value must be a subproperty of +knora-base:hasValue, and every property that points to another Knora +resource must be a subproperty of knora-base:hasLinkTo.

+

Here is the definition of the incunabula:title property:

+
:title rdf:type owl:ObjectProperty ;
+
+  rdfs:subPropertyOf knora-base:hasValue, dcterms:title ;
+
+  rdfs:label "Titel"@de ,
+    "Titre"@fr ,
+    "Titolo"@it ,
+    "Title"@en ;
+
+  knora-base:subjectClassConstraint :book ;
+
+  knora-base:objectClassConstraint knora-base:TextValue ;
+
+  salsah-gui:guiElement salsah-gui:SimpleText ;
+
+  salsah-gui:guiAttribute "size=80" ,
+    "maxlength=255" .
+
+

The definition of incunabula:title consists of a list of triples, all +of which have :title as their subject. To avoid repeating :title for +each triple, Turtle syntax allows us to use a semicolon (;) to +separate triples that have the same subject. Moreover, some triples also +have the same predicate; a comma (,) is used to avoid repeating the +predicate. The definition of :title says:

+
    +
  • rdf:type owl:ObjectProperty: It is an owl:ObjectProperty. There are + two kinds of OWL properties: object properties and datatype properties. + Object properties point to objects, which have IRIs and + can have their own properties. Datatype properties point to literal + values, such as strings and integers.
  • +
  • rdfs:subPropertyOf knora-base:hasValue, dcterms:title: It is a + subproperty of knora-base:hasValue and dcterms:title. Since the + objects of this property will be Knora values, it must be a + subproperty of knora-base:hasValue. To facilitate searches, we + have also chosen to make it a subproperty of dcterms:title. In the + DSP-API v2, if you do a search for resources that have a certain + dcterms:title, and there is a resource with a matching + incunabula:title, the search results could include that resource.
  • +
  • rdfs:label "Titel"@de, etc.: It has the specified labels in + various languages. These are needed, for example, by user + interfaces, to prompt the user to enter a value.
  • +
  • knora-base:subjectClassConstraint :book: The subject of the + property must be an incunabula:book.
  • +
  • knora-base:objectClassConstraint knora-base:TextValue: The object + of this property must be a knora-base:TextValue (which is a + subclass of knora-base:Value).
  • +
  • salsah-gui:guiElement salsah-gui:SimpleText: When SALSAH asks a + user to enter a value for this property, it should use a simple text + field.
  • +
  • salsah-gui:guiAttribute "size=80" , "maxlength=255": The SALSAH + text field for entering a value for this property should be 80 + characters wide, and should accept at most 255 characters.
  • +
+

The incunabula ontology contains several other property definitions +that are basically similar. Note that different subclasses of Value +are used. For example, incunabula:pubdate, which represents the +publication date of a book, points to a knora-base:DateValue. The +DateValue class stores a date range, with a specified degree of +precision and a preferred calendar system for display.

+

A property can point to a Knora resource instead of to a Knora value. +For example, in the incunabula ontology, there are resources +representing pages and books, and each page is part of some book. This +relationship is expressed using the property incunabula:partOf:

+
:partOf rdf:type owl:ObjectProperty ;
+
+  rdfs:subPropertyOf knora-base:isPartOf ;
+
+  rdfs:label "ist ein Teil von"@de ,
+    "est un part de"@fr ,
+    "e una parte di"@it ,
+    "is a part of"@en ;
+
+  rdfs:comment """Diese Property bezeichnet eine Verbindung zu einer anderen Resource, in dem ausgesagt wird, dass die vorliegende Resource ein integraler Teil der anderen Resource ist. Zum Beispiel ist eine Buchseite ein integraler Bestandteil genau eines Buches."""@de ;
+
+  knora-base:subjectClassConstraint :page ;
+
+  knora-base:objectClassConstraint :book ;
+
+  salsah-gui:guiElement salsah-gui:Searchbox .
+
+

The key things to notice here are:

+
    +
  • rdfs:subPropertyOf knora-base:isPartOf: The knora-base ontology provides a generic isPartOf property to express + part-whole relationships. A project may use knora-base:isPartOf directly, however creating a subproperty such as + incunabula:partOf will allow to customize the property further, e.g. by giving it a more descriptive label.
    + It is important to note that knora-base:isPartOf is a subproperty of knora-base:hasLinkTo. Any property that + points to a knora-base:Resource must be a subproperty of knora-base:hasLinkTo. Such a + property is called a link property.
  • +
  • knora-base:objectClassConstraint :book: The object of this property must be a member of the class incunabula:book, + which, as we will see below, is a subclass of knora-base:Resource.
  • +
  • salsah-gui:guiElement salsah-gui:Searchbox: When SALSAH prompts a user to select the book that a page is part of, it + should provide a search box enabling the user to find the desired book.
  • +
+

Because incunabula:partOf is a link property, it must always +accompanied by a link value property, which enables Knora to store +metadata about each link that is created with the link property. This +metadata includes the date and time when the link was created, its +owner, the permissions it grants, and whether it has been deleted. +Storing this metadata allows Knora to authorise users to see or modify +the link, as well as to query a previous state of a repository in which +a deleted link had not yet been deleted. (The ability to query previous +states of a repository is planned for DSP-API version 2.)

+

The name of a link property and its link value property must be related +by the following naming convention: to determine the name of the link +value property, add the word Value to the name of the link property. +Hence, the incunabula ontology defines the property partOfValue:

+
:partOfValue rdf:type owl:ObjectProperty ;
+
+  rdfs:subPropertyOf knora-base:isPartOfValue ;
+
+  knora-base:subjectClassConstraint :page ;
+
+  knora-base:objectClassConstraint knora-base:LinkValue .
+
+

As a link value property, incunabula:partOfValue must point to a +knora-base:LinkValue. The LinkValue class is an RDF reification of +a triple (in this case, the triple that links a page to a book). For +more details about this, see knora-base-linkvalue.

+

Note that the property incunabula:hasAuthor points to a +knora-base:TextValue, because the incunabula project represents +authors simply by their names. A more complex project could represent +each author as a resource, in which case incunabula:hasAuthor would +need to be a subproperty of knora-base:hasLinkTo.

+

Resource Classes

+

The two main resource classes in the incunabula ontology are book +and page. Here is incunabula:book:

+
:book rdf:type owl:Class ;
+
+  rdfs:subClassOf knora-base:Resource , [
+    rdf:type owl:Restriction ;
+    owl:onProperty :title ;
+    owl:minCardinality "1"^^xsd:nonNegativeInteger ;
+    salsah-gui:guiOrder "1"^^xsd:nonNegativeInteger
+  ] , [
+    rdf:type owl:Restriction ;
+    owl:onProperty :hasAuthor ;
+    owl:minCardinality "0"^^xsd:nonNegativeInteger ;
+    salsah-gui:guiOrder "2"^^xsd:nonNegativeInteger
+  ] , [
+    rdf:type owl:Restriction ;
+    owl:onProperty :publisher ;
+    owl:minCardinality "0"^^xsd:nonNegativeInteger ;
+    salsah-gui:guiOrder "3"^^xsd:nonNegativeInteger
+  ] , [
+    rdf:type owl:Restriction ;
+    owl:onProperty :publoc ;
+    owl:maxCardinality "1"^^xsd:nonNegativeInteger ;
+    salsah-gui:guiOrder "4"^^xsd:nonNegativeInteger
+  ] , [
+    rdf:type owl:Restriction ;
+    owl:onProperty :pubdate ;
+    owl:maxCardinality "1"^^xsd:nonNegativeInteger ;
+    salsah-gui:guiOrder "5"^^xsd:nonNegativeInteger
+  ] , [
+    rdf:type owl:Restriction ;
+    owl:onProperty :location ;
+    owl:maxCardinality "1"^^xsd:nonNegativeInteger ;
+    salsah-gui:guiOrder "6"^^xsd:nonNegativeInteger
+  ] , [
+    rdf:type owl:Restriction ;
+    owl:onProperty :url ;
+    owl:maxCardinality "1"^^xsd:nonNegativeInteger ;
+    salsah-gui:guiOrder "7"^^xsd:nonNegativeInteger
+  ] , [
+    rdf:type owl:Restriction ;
+    owl:onProperty :description ;
+    owl:maxCardinality "1"^^xsd:nonNegativeInteger ;
+    salsah-gui:guiOrder "2"^^xsd:nonNegativeInteger
+  ] , [
+    rdf:type owl:Restriction ;
+    owl:onProperty :physical_desc ;
+    owl:maxCardinality "1"^^xsd:nonNegativeInteger ;
+    salsah-gui:guiOrder "9"^^xsd:nonNegativeInteger
+  ] , [
+    rdf:type owl:Restriction ;
+    owl:onProperty :note ;
+    owl:minCardinality "0"^^xsd:nonNegativeInteger ;
+    salsah-gui:guiOrder "10"^^xsd:nonNegativeInteger
+  ] , [
+    rdf:type owl:Restriction ;
+    owl:onProperty :citation ;
+    owl:minCardinality "0"^^xsd:nonNegativeInteger ;
+    salsah-gui:guiOrder "5"^^xsd:nonNegativeInteger
+  ] , [
+    rdf:type owl:Restriction ;
+    owl:onProperty :book_comment ;
+    owl:minCardinality "0"^^xsd:nonNegativeInteger ;
+    salsah-gui:guiOrder "12"^^xsd:nonNegativeInteger
+  ] ;
+
+  knora-base:resourceIcon "book.gif" ;
+
+  rdfs:label "Buch"@de ,
+    "Livre"@fr ,
+    "Libro"@it ,
+    "Book"@en ;
+
+  rdfs:comment """Diese Resource-Klasse beschreibt ein Buch"""@de .
+
+

Like every Knora resource class, incunabula:book is a subclass of +knora-base:Resource. It is also a subclass of a number of other +classes of type owl:Restriction, which are defined in square brackets, +using Turtle's syntax for anonymous blank nodes. Each owl:Restriction +specifies a cardinality for a property that is allowed in resources of +type incunabula:book. A cardinality is indeed a kind of restriction: +it means that a resource of this type may have, or must have, a certain +number of instances of the specified property. For example, +incunabula:book has cardinalities saying that a book must have at +least one title and at most one publication date. In the DSP-API +version 1, the word 'occurrence' is used instead of 'cardinality'.

+

The OWL cardinalities supported by Knora are described in +OWL Cardinalities.

+

Note that incunabula:book specifies a cardinality of +owl:minCardinality 0 on the property incunabula:hasAuthor. At first +glance, this might seem as if it serves no purpose, since it says that +the property is optional and can have any number of instances. You may +be wondering whether this cardinality could simply be omitted from the +definition of incunabula:book. However, Knora requires every property +of a resource to have some cardinality in the resource's class. This is +because Knora uses the cardinalities to determine which properties are +possible for instances of the class, and the DSP-API relies on this +information. If there was no cardinality for incunabula:hasAuthor, +Knora would not allow a book to have an author.

+

Each owl:Restriction specifying a cardinality can include the predicate +salsah-gui:guiOrder, which tells the SALSAH GUI the order the properties +should be displayed in.

+

Here is the definition of incunabula:page:

+
:page rdf:type owl:Class ;
+
+  rdfs:subClassOf knora-base:StillImageRepresentation , [
+    rdf:type owl:Restriction ;
+    owl:onProperty :pagenum ;
+    owl:maxCardinality "1"^^xsd:nonNegativeInteger ;
+    salsah-gui:guiOrder "1"^^xsd:nonNegativeInteger
+  ] , [
+    rdf:type owl:Restriction ;
+    owl:onProperty :partOfValue ;
+    owl:cardinality "1"^^xsd:nonNegativeInteger ;
+    salsah-gui:guiOrder "2"^^xsd:nonNegativeInteger
+  ] , [
+    rdf:type owl:Restriction ;
+    owl:onProperty :partOf ;
+    owl:cardinality "1"^^xsd:nonNegativeInteger ;
+    salsah-gui:guiOrder "2"^^xsd:nonNegativeInteger
+  ] , [
+    rdf:type owl:Restriction ;
+    owl:onProperty :seqnum ;
+    owl:maxCardinality "1"^^xsd:nonNegativeInteger ;
+    salsah-gui:guiOrder "3"^^xsd:nonNegativeInteger
+  ] , [
+    rdf:type owl:Restriction ;
+    owl:onProperty :description ;
+    owl:maxCardinality "1"^^xsd:nonNegativeInteger ;
+    salsah-gui:guiOrder "2"^^xsd:nonNegativeInteger
+  ] , [
+    rdf:type owl:Restriction ;
+    owl:onProperty :citation ;
+    owl:minCardinality "0"^^xsd:nonNegativeInteger ;
+    salsah-gui:guiOrder "5"^^xsd:nonNegativeInteger
+  ] , [
+    rdf:type owl:Restriction ;
+    owl:onProperty :page_comment ;
+    owl:minCardinality "0"^^xsd:nonNegativeInteger ;
+    salsah-gui:guiOrder "6"^^xsd:nonNegativeInteger
+  ] , [
+    rdf:type owl:Restriction ;
+    owl:onProperty :origname ;
+    owl:cardinality "1"^^xsd:nonNegativeInteger ;
+    salsah-gui:guiOrder "7"^^xsd:nonNegativeInteger
+  ] , [
+    rdf:type owl:Restriction ;
+    owl:onProperty :hasLeftSidebandValue ;
+    owl:maxCardinality "1"^^xsd:nonNegativeInteger ;
+    salsah-gui:guiOrder "10"^^xsd:nonNegativeInteger
+  ] , [
+    rdf:type owl:Restriction ;
+    owl:onProperty :hasLeftSideband ;
+    owl:maxCardinality "1"^^xsd:nonNegativeInteger ;
+    salsah-gui:guiOrder "10"^^xsd:nonNegativeInteger
+  ] , [
+    rdf:type owl:Restriction ;
+    owl:onProperty :hasRightSidebandValue ;
+    owl:maxCardinality "1"^^xsd:nonNegativeInteger ;
+    salsah-gui:guiOrder "11"^^xsd:nonNegativeInteger
+  ] , [
+    rdf:type owl:Restriction ;
+    owl:onProperty :hasRightSideband ;
+    owl:maxCardinality "1"^^xsd:nonNegativeInteger ;
+    salsah-gui:guiOrder "11"^^xsd:nonNegativeInteger
+  ] , [
+    rdf:type owl:Restriction ;
+    owl:onProperty :transcription ;
+    owl:minCardinality "0"^^xsd:nonNegativeInteger ;
+    salsah-gui:guiOrder "12"^^xsd:nonNegativeInteger
+  ] ;
+
+  knora-base:resourceIcon "page.gif" ;
+
+  rdfs:label "Seite"@de ,
+    "Page"@fr ,
+    "Page"@en ;
+
+  rdfs:comment """Eine Seite ist ein Teil eines Buchs"""@de ,
+    """Une page est une partie d'un livre"""@fr ,
+    """A page is a part of a book"""@en .
+
+

The incunabula:page class is a subclass of +knora-base:StillImageRepresentation, which is a subclass of +knora-base:Representation, which is a subclass of +knora-base:Resource. The class knora-base:Representation is used for +resources that contain metadata about files stored by Knora. Each It has +different subclasses that can hold different types of files, including +still images, audio, and video files. A given Representation can store +metadata about several different files, as long as they are of the same +type and are semantically equivalent, e.g. are different versions of the +same image with different colorspaces, so that coordinates in one file +will work in the other files.

+

In Knora, a subclass inherits the cardinalities defined in its +superclasses. Let's look at the class hierarchy of incunabula:page, +starting with knora-base:Representation:

+
:Representation rdf:type owl:Class ;
+
+  rdfs:subClassOf :Resource , [
+    rdf:type owl:Restriction ;
+    owl:onProperty :hasFileValue ;
+    owl:minCardinality "1"^^xsd:nonNegativeInteger
+  ] ;
+
+  rdfs:comment "A resource that can store one or more FileValues"@en .
+
+

This says that a Representation must have at least one instance of the +property hasFileValue, which is defined like this:

+
:hasFileValue rdf:type owl:ObjectProperty ;
+
+  rdfs:subPropertyOf :hasValue ;
+
+  :subjectClassConstraint :Representation ;
+
+  :objectClassConstraint :FileValue .              
+
+

The subject of hasFileValue must be a Representation, and its object +must be a FileValue. There are different subclasses of FileValue for +different kinds of files, but we'll skip the details here.

+

This is the definition of knora-base:StillImageRepresentation:

+
:StillImageRepresentation rdf:type owl:Class ;
+
+  rdfs:subClassOf :Representation , [
+    rdf:type owl:Restriction ;
+    owl:onProperty :hasStillImageFileValue ;
+    owl:minCardinality "1"^^xsd:nonNegativeInteger
+  ] ;
+
+  rdfs:comment "A resource that can contain two-dimensional still image files"@en .
+
+

It must have at least one instance of the property +hasStillImageFileValue, which is defined as follows:

+
:hasStillImageFileValue rdf:type owl:ObjectProperty ;
+
+  rdfs:subPropertyOf :hasFileValue ;
+
+  :subjectClassConstraint :StillImageRepresentation ;
+
+  :objectClassConstraint :AbstractStillImageFileValue .              
+
+

Because hasStillImageFileValue is a subproperty of hasFileValue, the +cardinality on hasStillImageFileValue, defined in the subclass +StillImageRepresentation, overrides the cardinality on hasFileValue, +defined in the superclass Representation. In other words, the more +general cardinality in the superclass is replaced by a more specific +cardinality in the base class. Since incunabula:page is a subclass of +StillImageRepresentation, it inherits the cardinality on +hasStillImageFileValue. As a result, a page must have at least one +image file value attached to it.

+

Here's another example of cardinality inheritance. The class +knora-base:Resource has a cardinality for knora-base:seqnum. The +idea is that resources of any type could be arranged in some sort of +sequence. As we saw above, incunabula:page is a subclass of +knora-base:Resource. But incunabula:page has its own cardinality for +incunabula:seqnum, which is a subproperty of knora-base:seqnum. Once +again, the subclass's cardinality on the subproperty replaces the +superclass's cardinality on the superproperty: a page is allowed to have +an incunabula:seqnum, but it is not allowed to have a +knora-base:seqnum.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/01-introduction/file-formats/index.html b/01-introduction/file-formats/index.html new file mode 100644 index 0000000000..2cd7c9b011 --- /dev/null +++ b/01-introduction/file-formats/index.html @@ -0,0 +1,2941 @@ + + + + + + + + + + + + + + + + + + + + + + + File Formats in DSP-API - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + +

File Formats in DSP-API

+

Currently, only a limited number of file formats is accepted to be uploaded onto DSP. +Some metadata is extracted from the files during the ingest but the file formats are not validated. +Only image file formats are currently migrated into another format. +Both, the migrated version of the file and the original are kept.

+

The following table shows the accepted file formats:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CategoryAccepted formatConverted during ingest?
Text, XML *)JSON, ODD, RNG, TXT, XML, XSD, XSLNo
TablesCSV, XLS, XLSXNo
2D ImagesJPG, JPEG, JP2, PNG, TIF, TIFFYes, converted to JPEG 2000 by Sipi
AudioMPEG (MP3), WAVNo
VideoMP4No
OfficePDF, DOC, DOCX, PPT, PPTXNo
ArchivesZIP, TAR, GZ, Z, TAR.GZ, TGZ, GZIP, 7ZNo
+

*) If your XML files represent text with markup (e.g. TEI/XML), +it is possible to store it as Standoff/RDF, +as described here.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/01-introduction/standoff-rdf/index.html b/01-introduction/standoff-rdf/index.html new file mode 100644 index 0000000000..cfa515b590 --- /dev/null +++ b/01-introduction/standoff-rdf/index.html @@ -0,0 +1,2932 @@ + + + + + + + + + + + + + + + + + + + + + + + Standoff/RDF Text Markup - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + +

Standoff/RDF Text Markup

+

Standoff markup +is text markup that is stored separately from the content it describes. DSP-API's +Standoff/RDF markup stores content as a simple Unicode string, and represents markup +separately as RDF data. This approach has some advantages over commonly used markup systems +such as XML:

+

First, XML and other hierarchical markup systems assume that a document is a hierarchy, and +have difficulty representing non-hierarchical structures +or multiple overlapping hierarchies. Standoff markup can easily represent these structures.

+

Second, markup languages are typically designed to be used in text files. But there is no +standard system for searching and linking together many different text files containing +markup. It is possible to do this in a non-standard way by using an XML database +such as eXist, but this still does not allow for queries that include +text as well as non-textual data not stored in XML.

+

By storing markup as RDF, DSP-API can search for markup structures in the same way as it +searches for any RDF data structure. This makes it possible to do searches that combine +text-related criteria with other sorts of criteria. For example, if persons and events are +represented as resources, and texts are represented in Standoff/RDF, a text can contain +tags representing links to persons or events. You could then search for a text that mentions a +person who lived in the same city as another person who is the author of a text that mentions an +event that occurred during a certain time period.

+

In DSP-API's Standoff/RDF, a tag is an RDF entity that is linked to a +text value. Each tag points to a substring +of the text, and has semantic properties of its own. You can define your own tag classes +in your ontology by making subclasses of knora-base:StandoffTag, and attach your own +properties to them. You can then search for those properties using DSP-API's search language, +Gravsearch.

+

The built-in knora-base and standoff ontologies +provide some basic tags that can be reused or extended. These include tags that represent +DSP-API data types. For example, knora-base:StandoffDateTag represents a date in exactly the +same way as a date value, i.e. as a +calendar-independent astronomical date. You can use this tag as-is, or extend it by making +a subclass, to represent dates in texts. Gravsearch includes built-in functionality for +searching for these data type tags. For example, you can search for text containing a date that +falls within a certain date range.

+

DSP-API supports automatic conversion between XML and Standoff/RDF. To make this work, +Standoff/RDF stores the order of tags and their hierarchical relationships. You must define an +XML-to-Standoff Mapping for your standoff tag classes and properties. +Then you can import an XML document into DSP-API, which will store it as Standoff/RDF. The text and markup +can then be searched using Gravsearch. When you retrieve the document, DSP-API converts it back to the +original XML.

+

To represent overlapping or non-hierarchical markup in exported and imported XML, DSP-API supports +CLIX tags.

+

As XML-to-Standoff has proved to be complicated and not very well performing, +the use of standoff with custom mappings is discouraged. +Improved integration of text with XML mark up, particularly TEI-XML, is in planning.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/01-introduction/what-is-dsp/index.html b/01-introduction/what-is-dsp/index.html new file mode 100644 index 0000000000..1c1ab36cf6 --- /dev/null +++ b/01-introduction/what-is-dsp/index.html @@ -0,0 +1,3163 @@ + + + + + + + + + + + + + + + + + + + + + + + What is DSP? - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + + + + + +
+
+ + + + + + +

What is DSP and DSP-API?

+

The DaSCH Service Platform (DSP) is +a content management system for the long-term preservation and reuse of +humanities data. It is designed to accommodate data with a complex internal +structure, including data that could be stored in relational databases.

+

DSP aims to solve key problems in the long-term preservation and reuse +of humanities data:

+

First, traditional archives preserve data, but do not facilitate reuse. Typically, +only metadata can be searched, not the data itself. You have to first identify +an information package that might be of interest, then download it, and only +then can you find out what's really in it. This is time-consuming, and +makes it impractical to reuse data from many different sources.

+

DSP solves this problem by keeping the data alive. You can query all the data +in a DSP repository, not just the metadata. You can import thousands of databases into +DSP, and run queries that search through all of them at once.

+

Another problem is that researchers use a multitude of different file formats, many of +which are proprietary and quickly become obsolete. It is not practical to maintain +all the programs that were used to create and read old files, or even +all the operating systems that these programs ran on. Therefore, DSP only accepts a +certain number of file formats.

+
    +
  • Non-binary data is stored as + RDF, in a dedicated + database called a triplestore. RDF is an open, vendor-independent standard + that can express any data structure.
  • +
  • Binary media files (images, audio, and video) are converted to a few specialised + archival file formats and stored by Sipi, + with metadata stored in the triplestore.
  • +
+

DSP makes this data available for reuse via its generic, standards-based +application programming interface DSP-API. A virtual research environment +(VRE) can use DSP-API to query, link, and add to data +from different research projects in a unified way.

+

Humanities-Focused Data Storage

+

Each project creates its own data model (or ontology), describing the types of +items it wishes to store, using basic data types defined in Knora's +base ontology. +This gives projects the freedom to describe their data in a way that makes +sense to them, while allowing DSP to support searching and linking across projects.

+

DSP has built-in support for data structures that are commonly needed in +humanities data, and that present unique challenges for any type of database storage.

+

Calendar-Independent Dates

+

In the humanities, a date could be based on any sort of calendar (e.g. +Gregorian, Julian, Islamic, or Hebrew). The DSP stores dates using a calendar-independent, +astronomical representation, and converts between calendars as needed. This makes +it possible to search for a date in one calendar, and get search results in other calendars.

+

Flexible, Searchable Text Markup

+

Commonly used text markup systems, such as TEI/XML, +have to represent a text as a hierarchy, and therefore have trouble supporting +overlapping markup. DSP supports Standoff/RDF markup: the markup is stored +as RDF data, separately from the text, allowing for overlapping markup. The DSP +can import any XML document (including TEI/XML) for storage as standoff/RDF, +and can regenerate the original XML document at any time.

+

Powerful Searches

+

DSP-API provides a search language, Gravsearch, +that is designed to meet the needs of humanities researchers. Gravsearch supports DSP-API's +humanities-focused data structures, including calendar-independent dates and standoff markup, as well +as fast full-text searches. This allows searches to combine text-related criteria with any other +criteria. For example, you could search for a text that contains a certain word +and also mentions a person who lived in the same city as another person who is the +author of a text that mentions an event that occurred during a certain time period.

+

Access Control

+

The RDF standards do not include any concept of permissions. DSP-API's permission +system allows project administrators and users to determine who can see or +modify each item of data. DSP-API filters search results according to each +user's permissions.

+

Data History

+

RDF does not have a concept of data history. DSP-API maintains all previous +versions of each item of data. Ordinary searches return only the latest version, +but you can +obtain +and +cite +an item as it was at any point in the past.

+

Data Consistency

+

RDF triplestores do not implement a standardised way of ensuring the consistency +of data in a repository. DSP-API ensures that all data is consistent, conforms +the project-specific data models, and meets DSP-API's minimum requirements +for interoperability and reusability of data.

+

Linked Open Data

+

DSP-API supports publishing data online as Linked Open Data, +using open standards to allow interoperability between different repositories +on the web.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/02-dsp-ontologies/introduction-fig1.dot b/02-dsp-ontologies/introduction-fig1.dot new file mode 100644 index 0000000000..5347734e9b --- /dev/null +++ b/02-dsp-ontologies/introduction-fig1.dot @@ -0,0 +1,10 @@ +digraph { + rankdir = LR + + node [style = filled, fontcolor = white] + + subject [color = navy, fillcolor = slateblue4] + object [color = tomato3, fillcolor = tomato2] + + subject -> object [label = "predicate", fontsize = 11, color = cyan4] +} diff --git a/02-dsp-ontologies/introduction-fig1.dot.png b/02-dsp-ontologies/introduction-fig1.dot.png new file mode 100644 index 0000000000000000000000000000000000000000..86044582f29f9f2ff30d965f6eec9b16f792a73c GIT binary patch literal 9160 zcmXw9byQrv)5eMvmjcDDxVtaz?(SNoxI47S;$Ea!k>c*KxVy{Z?(X*O`#a~$J@;n* zNpA8?@?&TH9;#qr0LJ;SEmV99_`=aeULm!ok)2(Gk zT5?;=grW6mh=lm~_?(pgU%R*xPNi#Tz|paw zt7+kq;cL(`AWPgo`I&}@a$O7YuY}NkhSFhV_h>^(8x>QCPD#gSpiXiIv9sF9Xn@e? z)q}SyMbN{iU;?1(o$#4-yemE@hFR2UzcY_UXb~ok$KvdXd9;eyJS|!Rakkn8(fRnk z5eXYe1$2fNNHg$yj47TcuwNs$C#S$W`HI=-^^WuDRj@M`|6bxHJX;-{YOF}|ILnun zi^_M<$NTq>&F!2he13&O`CqVTXuc2l(G?wwo>!@aHAlr1IuH9P>~m~hD}#!kk(**g zTONOWIk!bIvbsIY{%&JBb`mR1<3Lt=Sc9VPSVf{J2Ek?o0s59$Y%H%+ZgPeG&F~1n z==~oGk8}R+_qRf?4pS&9*)GSV>hw<*s)J^@teIUFSP9=)hhb_NO%mZGRHajuH@GA* z|8h9yo9^9Slol1(@tc0a`O*^=n}0}Ks>EB4jd(;`Dk1|NC_;%*@@kC*7o40-+v+Z# ztKS62&W?4o$`dK%N&Rc64Y%11f7JdD3u4)kKg)&`d^TpwH0r z76n=%FL0mL6uS2>bYjOc3st)xN7;0mR1O}n;A1k=US4l}kXZHpDzIPo%VN^Mc4`xk zpx`Y~&>83F1_t#~n>A?$=#AkG5G&2o_b;6+UOu_E2gI1@bnR#&!EwQf=BgLt!=rv5 z4T2shHZlWJ*cxloL5*PuRI|zh9QESv3 zZaN5+o%|^bRSK3!>88 zYVp`j6=_Po!*RusVdXg?!a+-?ku)=ZmAefZt#&^JCsT7(Ad>Q`j9l;eKHbi)`MsQB za%$30>kZiAML5g$4a%ekz%y$GiWJm~6@V*Lj~ASMam>sZqnoK?2m|MTX8t(;HEL<= z$blL#P-29>M+nNh1(p3<>O^uw1u~lBb<+cN`hYuhN|H1f3zv2T0frJt;jDvA6!%ef zk)UVzatC$7)vy7)tx$wfon|M2i;kugh*+~swQT?sS;Kx+gXMxuvd4`>k|SjrDd*fG zCHp&Mn9BL>?g$(hXzbXW$6;0HoQRSEKRMxmQ~4TE8?zBqWS&Mv#J=>6Zo9Z69jTPx zNV2;OnRbiye$EX`YF!Szw@9H^9y4vZ6Hz^hx8I9ir&Ddhu;HHu9H*bASNiMTu28Su zK1IWjnWCaoTrIID5h-UH88T{Vdb%VmcqsySzLWp%c!R<$R<9C~*kG*E{7U)Sf>5K! zD1pR}mK3oBV}KG98f!d%8OGIK8f89vm6l*$IJVqLh;pq0Umr# zcEyGz8_8a=^G)3A0|ACSJA~pV_BZ}-mZtFNj=j6X;>~-hC{)9|dGH6}BxvgO&m7kP zy`W>}L2}t<3(Pt<=Vk(e&zcCHGTjxSrQiF|No8l!U)X3G9V7M$rNYpOX!lx&DzKC6;;l)AUe0-hVw(EvFh1RU6q;A>=R*3D45=P>o+OvWi}?JkgW1!k zZMoF{5b)&NtOSof8933FHB%;{-S1<%K!1}XWp9wttboVWzD74Gca^- z^nts{c6=g5+bEI@@o!O)RO3-=Y?1A__1q^pvIjEXk4skRcQ)9v;*dry4ri+*@~%4( zsC)%>hYI#9>d2Y-oSK`hRa)J)V>i~DkD2oicB}=?Y|w{4?4;lgS8HWL2E}Y+gMBkm z21bstb)aKUsFjXNBT`1@SIy8nYANx-8iOt8q> zPZlb-nD)YpgpVzlv09n-qwPp18)i;oIdM~ZG5U!=Z!&LhZVELAeyD$5WV|*yv3{ZI zcO}yqC*ZKK{*6oVko^V4!{w1FQpIe=eCA+&5G(k6>kZU4dg>H4p671nRiPgldb**y z24pFh>ryRK5W;|=B4GOT75*-b!_|6LTW_y5a|8-LcuW*thJ4aLnmixw;2H2QoY!rNd+(8TpB181M>c_ji*dPV=i#0i} z>2&(>L2+15L?`RExP0pkM<4v&K!FIOtE+q1I$`|rtj+In8nJ9o&BPS*o5R{=A6B0g z-=ZfBsc&Ea3mdyP3<(=Cyf@*^`aU5g<;!yA2|o+ymHp`GXvv=2=l*mUnWa5w^$dP< zD1lP&vJ3X_-@h1mc!TbXhSFA6Rw+AeAMY?Wf8f!xEyYP0F=_PeFry^u@~8%>)mEGxhMRsl{Y=eEOV>pMFVMd z;r@a6ai^}c0~F?L)Xs#csu(twDUl6BME(b)yG*(&7p?BkVZEj?Z04!8W|G`%vtv{= z?jYZ%Gn5opJ~FuM@Y&4ZP8KS5u18rA$S@G&v$Dnia7D^F6LbI6DOYKf|BTgIj`I3FvI^(KH8=AP z#F0*xRdo{3aafJvb320ZuaI(%%?D$NZ%>!8;|9ge%qY+SuTCjGEFHI4iBxQsBgu8K z{bwFKE-gBs03q>TDA1)3NQ;Azc{csvd3ooA1{O_?*f%3*VtMN1(dNbr?h7YgJUbZn z=TvE`x*Hw@BM9%^Og^yZwx!@N{scUC+)V^W`|f^*ib56w`^(?NNMyh!F-`$`dnU5T z3LN#uR@@&roJ{1BR;LT)(}pgz%2JpOTQ!_fU+Yo2Cb9*P;9&lvHrv^v?D?YAv;EEP zP`FT0pNDfpOXD~ap`~VL^O*b7l?I>)nUhur$IEiHDXcQ!jZ?qTKCix>v$mtUx;mAz zB4Rl>;2) z%MT>f6|2@;*BmQB?>=S_m2}#IHb`qagy*b0)$_{e5k5B5H!E^eWF1rg@&``>^4(6I z<|toIjAav@-z-Tc0OQ{UdowVKWhqvuoF6YZE=l=R?3M{WTtV;8WE|E3(hr;*S8RA6 zr@1Qqzq%ywECOX z6z1k&(t5sB(@T&<`2Eqm^ZB^Ur>VoN|8u($3xt8J-d~@h33*~~Z{4z#Xdr|@&B79Q zeeLom@cpT7#dfWgtJ@?VLMK|~I-(!%ZzqplSR~8q4PhT3iQp>c$HUfM(q+^q(zs-A{RTS>HMYzeNdLRFr z*Ibyhv!{k^V+h;H%F3GF9nbr{UJbgPEW~)<>`#|zvq1UW9rtrBYTTs>J%C*W|9kJ| z)cXbp|J&l!iWz;7mXwxOW9i)xq2=v<^}lZVqrOCw0{%cw4@yLsoq?FLnZdE&9Fz`# zm(x0hEZ&62N3SA<-#srEAmxYiwaD05tL0kD-TnQ<)YO4$)83(>At;mE!|4Q-`mNq@ z4wqe-R*$n0$~ZwR%;V=JLsF$jKdO#9TpqtyHlWAFfUDG@p&?GiGtT_Uw}GKn&u)_h ziTpA4C*Z-nPSMI?#2=xJK0`GrDZL$LXft+Mu=k`1GpLoJLaz<+CyvKC?*QH?$MWME zG^gUhgfD{YMYAc?DcCuB15k?(Vg0iqWR5^o5y_SuHl9w^!ZV(Ymb60~LS>;VOpx!b zoX@QzkP&#goHFR^3bH(iHHR|br;0gZiHV(SvwgG+6DwZikBY5vUGxuavA5xOMpAuj z7p-k1-TPR7`}6jqq;WL+#bGDb7v6Qb+6@c4fR^PZ$@gzqVAV>0Yt@6(EYllB(l6_L zTYescD;L0_jy?(c2OliU4GE~^e}gcYQ`#KfvPIx=EnVg>i^Y%YKEL(p9J$v(rh zR+^_$Nfj2mdOn;RTT6dImyA}HK!;ax@xa!3 zA|I(Ntt45D=0lvY5o8gLJgW>(XuE}x6MU>;+pVfr%ZkAH^31BoqIZJDVjqJ-@D8QNk@&k++*NrP@hJQlpmT z+9t0H!+*}j&_b+Sl2EaI6vtZo&zO)72HIp_<&J&*6t2y2;T#rR75`>nXYZkIBT zJ@bh{g$4B2=8LEq3L44BGr4ZpJjL@ zRle-64YdM^(&G8BLgp=ITU{(H2I0ZxeA7jbS%UXjVbu^g6*y1t`c~!h-+CE)9}Ill zEg-cMN*%Cx`GfHWUv&L+;K}tJ@Cz}Av{>R%K_M|LzjR5FTB^91qe!18V7Z3!`s@3w z(-o3OG@)YRd{{+7q8o79nfK!romKyGJSVc22Aho^ZS`!26&3&2k8TFI#Q+kziwrgd zHgcr9DdE@Aby1;OQnnVM*bOC7Imft{!hf{BjnX61LRUmZ@8V?<)%e)P%f-XdKh8H) zYB?}>^vyv(DAe@e|A1aezF99SpK|PEez1?6E5HFi-K0>~toZ;sKYWum(?)~ja;klJ z5gu-m2=)xJBhiRZY3p0fiDW^-C&P!Qi>ZrMll|XQ2n>UupV4e4w?g~vm)+7;RPyTk z2HSZSof(_z&qwaMwyG~DvVJVJ?BE9krg!*Wdmpu=3{gj3B~@0|y}zLwDwR>;xf*?- zXLbUDHc0m`yD8qU556FVbWz5k$0hr3ZW+fX6OHTFbz1d$zFfVCC8s{>yso3$uRB$X z#vb@Z#Ng_H-kl0MyYC)%;yBDC_G~EF*b>kIf=xW(D5W&zr8FE~Kc8$aj2xeLu@g6Z zfU?Gc<4uFHd9d%42%?KMoMr@a5O^`LlP&`<;kPOPxi9`DPtsTIY_JvOaH~s55z{rA z$A}&X?}az2_f~lbuO$d|SDklw@s_9Nq!n$GY>>8kJI1%TTW5sytGphF7bh%ah%ooQ zN-y!0_Z@*Vok8do?a5srVX~~2f8CSP{+Li47$xL#+vU1V;^89^wLIe}d;6#eEm!-U z3K>33Wm@MZ7w3Ku9_nt}=aG5Iix<1EY^PsEBc{!79uhCUmDt`UPR8-ID+laeySXV^ z_j+oIJIKkm6A9}`98^}w%DAa%99j+SrJSfaJa5@|`&*6F!t-X_^qOM-vmxH^s1R`G zB{*<)KYYAGAqI4gG#0u`FyU(ymc+`oObt(gC_p(pO%6L3`i)cFduGw&eeosu{GY9* z-8gZIpi>;XFB?%cJ!wso4fR>kiG#s*WO+Z7l@pJ*Fh<_jG^5H|5T@mT2`k0q1APT4 zUlwN$RHoc}^g&g%h72sCLOzK9%+utW#AUZ^UmA0WSvq8}}ljeHzXpmcu^>O57Q`8{m-AFOq@392~!YN=Hty+Ts$>sztI zF-?-~*(xzOINM>NSy+w`G z?q5%k$Ln)!u%LiBj;oRJ=%74z4s+R2dg+zBq~v@%Sy9I?f3_NrT(xLB3L>p5uaG5s zYDa>1f>J$SN4+YZh+flfE1pHVzVU?FZ+~qN>q5Lbl+Ei5UrocAQjYz4=1p-W#WJMq z+Ok*M+|AvF#BWd24l(9wPjZ8?q#nF6PtoAY-Wc-)zI7J&J>rB^JQwbM(zf*O$S;o- z7DB`&EJT0Dnp^q#kNahU8C;K-R~pP$qY0VIwSa{M)wT!2Tpk~4Pb~{+fnhjrF1wcJ zXi=}i$4>DfKMH{w*MX>PP1<8$3H_?s4iQzO$NW;~xK+Nok6DVtzig}s<%n$&CDV#Z z#Gt#AdkR^KHQxq4yN&cVgsb=3@OY)?O{Ewxf}w{;P7C8EKrRT{RtuNr(a zF)n5;&r;KSL?rqdsD)Y|3q9x4jru} zU?r*6a@eu&v`^iRq&elcK2&%FHaPbbNcj(;pP)~%6gcmM2^7+}?2P*#EjKY$=tE38 zjo7`^>%AxitqQQ}USv1q7+OWrW`}?!A*s8RX4rKa_!>S~6rJn3IP&R1_!$(Vk^E9d zb@>}|M;Cm&+;bb2k;3{^>v?c>o;B;-Q(VFvA9z+H#7QEo;BmcY+jO_W<`{ z&>mTlS!OlpBDt!Rsz^gVEekOciC0~8d4C8E#{PLfuwNC99V|AI_gP$MW`JRQGJ$0f z{zqWG9G~3A6|i(}y)&@EEzeFG`s`XH&_gBrTB=TSe!iYf$nVidzxa;hx>*RoSh*Ie zAiT0fg;;A2b3Y)qKoovj5D7~D>4v09KNf_EgX^##y^MWvSIoZUgebs zk#h1|F&ajMvvqzvqwYh~m?!y@B#ZOGX)}|z*Bxi(0veQE(+W<9`#`6}^{=yw?a5%Y zmr#(j+*$OwGqz4m`esHT*9hNDm}V4C$~rPgq*nUP&GQb~Kj3aYpt9{8mifr`O?Nj2 zD*b)N1|IdiFGd@rSNzdrnOA429nnaPwNzV}LFOKc997`Rv!hk9JrRu}<#`@GYVZ-P z@>KL=8DLI8hvo`2;G_J0jiTVsQh57*a(w&Ih~u{DrP9r2f=^sLUQ#J@H%e&e>p;*1 zP87Wt-819Evu5+%@~>BliuF^LadX+0=$EAKa;g_8Y*sKm2WMui;)ME4EgbER>i^hV zClQ*E4T8=`K%*>`N0;kiGLK|f1m0j`CsJ(mH^bF$hXAF5@?3C;v^doU76hS6uRNZf zPk4f8YfnTXQm<%)JRRHY$hb2jyL)F2lh>nCavZDL)R6Og3KCp-$FP+R27;jHl|SPf z7}R?^VFjz;dp6tdyG`Jo46z|<5kjo6_?2SJSI_Z08zxlASvpNlEa`UwdAS#Y(fQWe zft7~v=KGZgS*7Hm!@1`7t)e3R2MZFSK)xfxBwD8X+V6X4smv>0(~QYS=r;E2U(Ggi z8_V^$aDjUVTUzWv?dS(dpk3lbd+PF-NBFfTiegKXww)%Ke}+?|@`#l$AzdTiavNTY zRSm=2<3pBOQ4Ot`Me679`E@#!9~Dv=mxr@GnJF7$6b>}%YGh21yLM)Wz=RY`Ou-)k zH&99k{qC?_C9sC(A2-U|<6wzI$(}iww_c{N#MwQ$aw6>0XAM7f^cMNQ8a*UFG;OSh zK5USVPs5~)onn;wI7j2KXhq3sa$A2onx>4Lw>xKpdpw9BOXT0$9ox?)rx#@UaNaT#UnD<}iKu9Ujc)0n zv0GeI77OWU8E3blrfLhlJ*unrJdrd~=`O}!v^Os}jwe+?8ph=Ze88)I^*`3ETA!p7 z|5d*;$b>#!pv_L`2{*)t<(Rto19f8HY?qtxXZf2(aHz(a@D@r!AYA*`174#!%$={P`Sbw|fPJd=W8ugZD!iNd&o2Q~Dly zHu1{*w=e+3^28BR{dr_d#u5mWOjGRFU;MEmE><2{@4-H;WDb){r^3bSA~?3S^I261 zc@hxFg)YPiHQii|^1VBdHk>jrC-`Dh*nm1gr_NyKcoyD$M{{l@-99Oj8(oRwJ;V5o zW&HJm!Y?X@Fph2S!T4&tNjf4f;V7OW37;keQ+j$ctjDRGZ0t(xizaqD@0Hs7W9D&&Bj$0a`I=?N zvv36XbCS*FVIh{tbkE!75~5UkGtLDW1tz4lTrbn9&ppenZM`+1qA*x$PjL|FeOX_q+VOBB=_n{h+=As zP6v>mA6j#;s>F*+1?Q7~o5ptK)0ZplH>~9^vpR-6F^DRkkX}?C0}3fMwyH+ffW^E!$COe~Y+R z3>Ug`MOEH}!M`*AEwu(mDV`vG$q~VjV6^%QEHX`y7^{tt4MJvPmz#GND^*faNBRyU zYACIVLk0X~eG$xyfI{86VKR2-HQpR-YlQhuw^c1=Wd*I@xLac>PeRB;@{OS^UZsQ` zRKg)Q@Ex-{qstMyS{IJd3c5_P&mK2pZjwlgo@Nq8G{!_`5O3-d!7U^zXte+fO}mpi zBWrgvG1#GbHxcLgLAfaK!$M6hOVPR{Sdw*%7+2>11s zh-!7Mugr{?m1vUFL&J3B0&S4HI&itEDt)aDxYX7ZkuL^V`MNJ~%8pwX#28F=C_|BM z0j-N0FM%ORQD7^IL9yl9S}Bc%eS}C$vv~BGf#0-n2A&vN6C06%-zbNG4%Vb$FG;-_`_>08cY>!;~LcQ z?9bF{JY;$ySpY@NVMT&WcUwJpTPrF!F|U5;EiGSY0HbuYmyisQ+;T<{*~pwkGg8Yv z=+}TxAOO)<&G24=fWSRcMVwFh`AXsbeA&1Xs$|>?at7rw&Ab9^HCkq7<$VKswu{Ue z$v89)E4;R|1Cnm_SG8fmqV9)s=_=0Tc|CqTKR>}K@8-3Rs)E0y&_iY4iY2S`c3i*S^+pI<_9=vc3X} z|0u5Me+ezPN^4JHs3?#^fG++&Ap`UO>#sU1U@1tl3;wIZ^3w-2@%o+nlOd1;l9~f0 ME2$(=DP|J#e^<@~2mk;8 literal 0 HcmV?d00001 diff --git a/02-dsp-ontologies/introduction-fig2.dot b/02-dsp-ontologies/introduction-fig2.dot new file mode 100644 index 0000000000..d979b1728d --- /dev/null +++ b/02-dsp-ontologies/introduction-fig2.dot @@ -0,0 +1,42 @@ +digraph { + rankdir = LR + + { + node [color = navy, fillcolor = slateblue4, style = filled, fontcolor = white] + + sub1 [label = "subject no. 1"] + sub2 [label = "subject no. 2"] + sub3 [label = "subject no. 3"] + } + + { + node [shape = box, color = firebrick] + + lit1 [label = "literal no. 1"] + lit2 [label = "literal no. 2"] + lit3 [label = "literal no. 3"] + } + + edge [fontsize = 11, color = cyan4] + + sub1 -> lit1 [label = "predicate no. 1"] + sub1 -> lit2 [label = "predicate no. 2"] + sub1 -> sub2 [label = "predicate no. 3"] + + sub2 -> lit3 [label = "predicate no. 4"] + sub2 -> sub3 [label = "predicate no. 5"] + + // Add invisible edges to order the nodes from top to bottom. + + { + rank = same + lit1 -> lit2 -> sub2 [style = invis] + rankdir = TB + } + + { + rank = same + lit3 -> sub3 [style = invis] + rankdir = TB + } +} \ No newline at end of file diff --git a/02-dsp-ontologies/introduction-fig2.dot.png b/02-dsp-ontologies/introduction-fig2.dot.png new file mode 100644 index 0000000000000000000000000000000000000000..b3f76fe12b3c61857b911da26ed50c137ab9daa5 GIT binary patch literal 38200 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 literal 0 HcmV?d00001 diff --git a/02-dsp-ontologies/introduction-fig3.dot b/02-dsp-ontologies/introduction-fig3.dot new file mode 100644 index 0000000000..43f9701287 --- /dev/null +++ b/02-dsp-ontologies/introduction-fig3.dot @@ -0,0 +1,23 @@ +digraph { + { + node [color = navy, fillcolor = slateblue4, style = filled, fontcolor = white] + + book [label = "ex:book1"] + page [label = "ex:page1"] + } + + { + node [shape = box, color = firebrick] + + title [label = "‘Das Narrenschiff’"] + author [label = "‘Sebastian Brant’"] + pagename [label = "‘a4r’"] + } + + edge [fontsize = 11, color = cyan4] + + book -> title [label = "ex:title"] + book -> author [label = "ex:author"] + page -> book [label = "ex:pageOf"] + page -> pagename [label = "ex:pagename"] +} \ No newline at end of file diff --git a/02-dsp-ontologies/introduction-fig3.dot.png b/02-dsp-ontologies/introduction-fig3.dot.png new file mode 100644 index 0000000000000000000000000000000000000000..7ab7113bd38c60f12617dbd0e988f49139e7fe2d GIT binary patch literal 22506 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 + + + + + + + + + + + + + + + + + + + + + Introduction - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+ +
+
+ + + +
+
+ + + + + + +

Introduction

+

The DSP ontologies provide a generic framework for describing humanities +research data, allowing data from different projects to be combined, augmented, +and reused.

+

Resource Description Framework (RDF)

+

DSP-API uses a hierarchy of ontologies based on the Resource Description +Framework +(RDF), RDF +Schema (RDFS), and +the Web Ontology Language +(OWL). Both RDFS and OWL +are expressed in RDF. RDF expresses information as a set of statements +(called triples). A triple consists of a subject, a predicate, and an +object:

+

Figure 1

+

The object may be either a literal value (such as a name or number) or +another subject. Thus it is possible to create complex graphs that +connect many subjects, like this:

+

Figure 2

+

In RDF, each subject and predicate has a unique, URL-like identifier +called an Internationalized Resource Identifier +(IRI). Within a given project, +IRIs typically differ only in their last component (the "local part"), +which is often the fragment following a # character. Such IRIs share a +long "prefix". In Turtle and similar +formats for writing RDF, a short prefix label can be defined to +represent the long prefix. Then an IRI can be written as a prefix label +and a local part, separated by a colon (:). For example, if the +"example" project's long prefix is http://www.example.org/rdf#, and it +contains subjects with IRIs like http://www.example.org/rdf#book, we +can define the prefix label ex to represent the prefix label, and +write prefixed names for IRIs:

+

Figure 3

+

Built-in Ontologies and User-Created Ontologies

+

To ensure the interoperability of data produced by different projects, +each project must describe its data model by creating one or more ontologies that +extend Knora's built-in ontologies. The main built-in ontology in Knora +is knora-base.

+

Shared Ontologies

+

Knora does not normally allow a project to use classes or properties defined in +an ontology that belongs to another project. Each project must be free to change +its own ontologies, but this is not possible if they have been used in ontologies +or data created by other projects.

+

However, an ontology can be defined as shared, meaning that it can be used by +multiple projects, and that its creators will not change it in ways that could +affect other ontologies or data that are based on it. Specifically, in a shared +ontology, existing classes and properties cannot safely be changed, but new ones +can be added. (It is not even safe to add an optional cardinality to an existing +class, because this could cause subclasses to violate the rule that a class cannot +have a cardinality on property P as well as a cardinality on a subproperty of P; +see Restrictions on Classes.)

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/02-dsp-ontologies/knora-base-fig1.dot b/02-dsp-ontologies/knora-base-fig1.dot new file mode 100644 index 0000000000..29da4150ab --- /dev/null +++ b/02-dsp-ontologies/knora-base-fig1.dot @@ -0,0 +1,33 @@ +digraph { + book [label = "ex:book2", style = filled, fontcolor = white, color = navy, fillcolor = slateblue4] + + { + node [style = filled, fontcolor = white, color = tomato3, fillcolor = tomato2] + + title [label = "kb:TextValue"] + pubdate [label = "kb:DateValue"] + } + + { + node [shape = box, color = firebrick] + + titleStr [label = "‘King Lear’"] + titleCreationDate [label = "2015-08-12 13:00"] + + startJDN [label = "2364669"] + endJDN [label = "2364669"] + pubdateCreationDate [label = "2015-08-12 13:03"] + } + + edge [fontsize = 11, color = cyan4] + + book -> title [label = "ex:title"] + book -> pubdate [label = "ex:pubdate"] + + title -> titleStr [label = "kb:valueHasString"] + title -> titleCreationDate [label = "kb:valueCreationDate"] + + pubdate -> startJDN [label = "kb:valueHasStartJDN"] + pubdate -> endJDN [label = "kb:valueHasEndJDN"] + pubdate -> pubdateCreationDate [label = "kb:valueCreationDate"] +} diff --git a/02-dsp-ontologies/knora-base-fig1.dot.png b/02-dsp-ontologies/knora-base-fig1.dot.png new file mode 100644 index 0000000000000000000000000000000000000000..e0af3693f728a3847da0caa1dd9e299bccd0c6f8 GIT binary patch literal 36499 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 title [label = "hasTitle"] + work -> artistName [label = "hasArtist"] + work -> collection [label = "isInCollection"] + work -> linkValue [label = "isInCollectionValue"] + + collection -> collectionName [label = "hasCollectionName"] + + title -> titleStr [label = "valueHasString"] + artistName -> artistNameStr [label = "valueHasString"] + collectionName -> collectionNameStr [label = "valueHasString"] + linkValue -> refCount [label = "valueHasRefCount"] + linkValue -> work [label = "subject"] + linkValue -> isInCollection [label = "predicate"] + linkValue -> collection [label = "object"] +} \ No newline at end of file diff --git a/02-dsp-ontologies/knora-base-fig2.dot.png b/02-dsp-ontologies/knora-base-fig2.dot.png new file mode 100644 index 0000000000000000000000000000000000000000..01de3a73574f893fd3eeaf757e0c577f88066412 GIT binary patch literal 65507 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 r2 [label = "hasStandoffLinkTo"] + r1 -> v1 [label = "hasComment"] + r1 -> lv1 [label = "hasStandoffLinkToValue"] + + v1 -> v1Str [label = "valueHasString"] + v1 -> so1 [label = "valueHasStandoff"] + + so1 -> tagStart [label = "standoffTagHasStart"] + so1 -> tagEnd [label = "standoffTagHasEnd"] + so1 -> r2 [label = "standoffTagHasLink"] + + lv1 -> r1 [label = "subject"] + lv1 -> hasStandoffLinkTo [label = "predicate"] + lv1 -> r2 [label = "object"] + lv1 -> refCount [label = "valueHasrefCount"] + + // Add an invisible edge to order tagStart and tagEnd from left to right. + + { + rank = same + tagStart -> tagEnd [style = invis] + rankdir = LR + } +} \ No newline at end of file diff --git a/02-dsp-ontologies/knora-base-fig3.dot.png b/02-dsp-ontologies/knora-base-fig3.dot.png new file mode 100644 index 0000000000000000000000000000000000000000..ad50143a61479085dd288e36d6a1ecffca103520 GIT binary patch literal 59160 zcmZ^KWmJ`6(=HY$Eg&c<64Ko%Eg{`0y`{TDrCYjNx;r;WH%NDPcS)Ul^M3DH=f`)J zYY9vDv+tOhYp$8Oo&Z^CF%(2xL^wD&6!Fi(@^Em^D&gRs1igd@|8i-!@Bn_m>q&|U z!#%+Mq(O5c;o#oGi3vA zIb4_@Z@{Lh-OVpdE69!VfB%K+v)FH;&oZA$UTxb)P!8Qa>n6i`^~*rs<8YFizHP0a zbCHsBkbRSLXqX}kOYkMJH#+!Bm^!n{0q#G)d!w(od`^G!KmRpMCI0{XzFkQ0=_PSO zLd(|=A9IpgTTLV+Q7B%Jk-@`hYVDVn4KMAO_~qn0yT32y;OH)vgME7j>n|B|L4UT@ z{&=d3gMpRy0Jl)0zRja>&2pwb3fh9Y?DN{%DGc-_i7>*Zv%PJ}8Vf#T{I{QSqzAu5 zX+G{x6D_3QhQ=FGl%F45sFT{7{Uy(ACQ49V{Yj!4NOd=oa%S2>_?WCO}zXHQ0heqUGy+vAWOM83y0OE&GP2^{*9- zXA6XES5A=arK~pPl5Z0bGQ8Q76TsOZ>^bRMeW>6sZ~d(dCUkxEV(m>FN3?!+G;KH7|=UZPbG-=Fl3aKEhjs6 z9$&5A{Wa0(c?NSTZ-~g_zJnt$o}uxcVNxr%kJd$|_(pd(TC&k(JbUaVk;g0LN z;k3(Gbai(4&0?s<6!%tQc){IeG4m1oI0_5@|Ic#sq$- znbMDniK?58BMC zSxm`QjA>I2xUgwBrV3{taS?(9^U;I>$3=p+Nl7my`e9p((W%7I}PZZ#ptSI;W*0@7j@@D>Kaw%A|8_U?i=q* z>K0rmD%;*d^0$48$72=+o})&;B%X;@$dRyi7)dwJ=Hqr!<=A!TFLsibOxVy1v@4FB77-HU%lK2vj?o zzSuw-`J`TyQCiwN!w7qbSpCgA7)oO+DTx-^$B(x%zi~UdvQ z_;FH>YuW|-yf;MY@fv;n{GJWCi6pt0n0|3PKO} Q|D-Da2Vrq>=Ed35%@Khe4@e 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 F{{`3I*=GO% literal 0 HcmV?d00001 diff --git a/02-dsp-ontologies/knora-base/index.html b/02-dsp-ontologies/knora-base/index.html new file mode 100644 index 0000000000..b5ba1f48e9 --- /dev/null +++ b/02-dsp-ontologies/knora-base/index.html @@ -0,0 +1,5024 @@ + + + + + + + + + + + + + + + + + + + + + + + The Knora Base Ontology - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + +

The Knora Base Ontology

+

Overview

+

The Knora base ontology is the main built-in Knora ontology. Each project that uses DSP-API must describe its data model +by creating ontologies that extend this ontology.

+

The Knora base ontology is identified by the IRI http://www.knora.org/ontology/knora-base. In the DSP-API +documentation in general, it is identified by the prefix knora-base, but for brevity, in this document, we use kb or +omit the prefix entirely.

+

The Knora Data Model

+

The Knora data model is based on the observation that, in the humanities, a value or literal is often itself structured +and can be highly complex. Moreover, a value may have its own metadata, such as its creation date, information about +permissions, and so on. Therefore, the Knora base ontology describes structured value types that can store this type of +metadata. In the diagram below, a book (ex:book2) has a title +(identified by the predicate ex:title) and a publication date +(ex:pubdate), each of which has some metadata.

+

Figure 1

+

Projects

+

In DSP-API, each item of data belongs to some particular project. Each project using DSP-API must define a +kb:knoraProject, which has these properties (cardinalities are indicated in parentheses after each property name):

+
    +
  • +

    projectShortname (1): A short name that can be used to identify the project in configuration files and the like.

    +
  • +
  • +

    projectLongname (0-1): The full name of the project.

    +
  • +
  • +

    projectShortcode (1): A hexadecimal code that uniquely identifies the project. These codes are assigned to projects + by the DaSCH.

    +
  • +
  • +

    projectDescription (1-n): A description of the project.

    +
  • +
+

Ontologies and resources are associated with a project by means of the +kb:attachedToProject property, as described in Ontologies +and Properties of Resource). Users are associated with a project by means of +the kb:isInProject property, as described in +Users and Groups.

+

Ontologies

+

Each user-created ontology must be defined as an owl:Ontology with the properties rdfs:label +and kb:attachedToProject. +Since DSP-API v20 kb:lastModificationDate property is +also required.

+

Resources

+

All the content produced by a project (e.g. digitised primary source materials or research data) must be stored in +objects that belong to subclasses of kb:Resource, so that DSP-API can query and update that content. Each project using +the Knora base ontology must define its own OWL classes, derived from kb:Resource, to represent the types of data it +deals with. A subclass of kb:Resource may additionally be a subclass of any other class, e.g. an industry-standard +class such as foaf:Person; this can facilitate searches across projects.

+

Resources have properties that point to different parts of the content they contain. For example, a resource +representing a book could have a property called hasAuthor, pointing to the author of the book. There are two possible +kinds of content in a Knora resource: Knora values (see Values) or links to other resources (see +Links Between Resources). Properties that point to Knora values must be subproperties +of kb:hasValue, and properties that point to other resources must be subproperties of kb:hasLinkTo. Either of these +two types of properties may also be a subproperty of any other property, e.g. an industry-standard property such +as foaf:name; this can facilitate searches across projects. Each property definition must specify the types that its +subjects and objects must belong to (see +Constraints on the Types of Property Subjects and Objects +for details).

+

Each user-created resource class definition must use OWL cardinality restrictions to specify the properties that +resources of that class can have (see OWL Cardinalities for details).

+

Resources are not versioned; only their values are versioned (see +Values).

+

Every resource is required to have an rdfs:label. The object of this property is an xsd:string, rather than a Knora +value; hence it is not versioned. A user who has modify permission on a resource (see +Authorisation) can change its label.

+

A resource can be marked as deleted; DSP-API does this by adding the predicate kb:isDeleted true to the resource. An +optional kb:deleteComment may be added to explain why the resource has been marked as deleted. Deleted resources are +normally hidden. They cannot be undeleted, because even though resources are not versioned, it is necessary to be able +to find out when a resource was deleted. If desired, a new resource can be created by copying data from a deleted +resource.

+

Properties of Resource

+
    +
  • +

    creationDate (1): The time when the resource was created.

    +
  • +
  • +

    attachedToUser (1): The user who owns the resource.

    +
  • +
  • +

    attachedToProject (1): The project that the resource is part of.

    +
  • +
  • +

    lastModificationDate (0-1): A timestamp indicating when the resource (or one of its values) was last modified.

    +
  • +
  • +

    seqnum (0-1): The sequence number of the resource, if it is part of an ordered group of resources, such as the pages + in a book.

    +
  • +
  • +

    isDeleted (1): Indicates whether the resource has been deleted.

    +
  • +
  • +

    deleteDate (0-1): If the resource has been deleted, indicates when it was deleted.

    +
  • +
  • +

    deleteComment (0-1): If the resource has been deleted, indicates why it was deleted.

    +
  • +
+

Resources can have properties that point to other resources; see +Links Between Resources. A resource grants permissions to groups of users; +see Authorisation.

+

Representations

+

It is not practical to store all data in RDF. In particular, RDF is not a good storage medium for binary data such as +images. Therefore, DSP-API stores such data outside the triplestore, in ordinary files. A resource can have metadata about +a file attached to it. The technical term for such a resource in the Knora ontology is a Representation. For each file, there is +a kb:FileValue in the triplestore containing metadata about the file (see FileValue). DSP-API +uses Sipi to store files. The DSP-API provides ways to create file values.

+

A resource that has a file value must belong to one of the subclasses of +kb:Representation. Its subclasses include:

+
    +
  • +

    StillImageRepresentation: A representation referring to a still image file which can be stored in Sipi or an external IIIF server.

    +
  • +
  • +

    MovingImageRepresentation: A representation containing a video file.

    +
  • +
  • +

    AudioRepresentation: A representation containing an audio file.

    +
  • +
  • +

    DDDrepresentation: A representation containing a 3D image file.

    +
  • +
  • +

    TextRepresentation: A representation containing a formatted text file, such as an XML file.

    +
  • +
  • +

    DocumentRepresentation: A representation containing a document (such as a PDF file) that is not a text file.

    +
  • +
  • +

    ArchiveRepresentation: A representation containing an archive file (such as a zip archive).

    +
  • +
+

These classes can be used directly in data, but it is often better to make subclasses of them, to include metadata about +the files being stored.

+

The base class of all these classes is Representation, which is not intended to be used directly. It has this +property, which its subclasses override:

+
    +
  • hasFileValue (1): Points to a file value.
  • +
+

There are two ways for a project to design classes for representations. The simpler way is to create a resource class +that represents a thing in the world (such as ex:Painting) and also belongs to a subclass of Representation. This is +adequate if the class can have only one type of file attached to it. For example, if paintings are represented only by +still images, ex:Painting could be a subclass of StillImageRepresentation.

+

The more flexible approach, which is supported by DSP-API v2, is for each ex:Painting to +link (using kb:hasRepresentation or a subproperty) to other resources containing files that represent the painting. +Each of these other resources can extend a different subclass of Representation. For example, a painting could have a +StillImageRepresentation as well as a DDDrepresentation.

+

Standard Resource Classes

+

In general, each project must define its own subclasses of kb:Resource. However, the Knora base ontology +provides some standard subclasses of kb:Resource, which are intended to be used by any project:

+
    +
  • +

    Region: Represents a region of a Representation (see Representations).

    +
  • +
  • +

    Annotation: Represents an annotation of a resource.
    + The hasComment property points to the text of the annotation, represented as a kb:TextValue.

    +
  • +
  • +

    LinkObj: Represents a link that connects two or more resources.
    + A LinkObj has a hasLinkTo property pointing to each resource that it connects, as well as a hasLinkToValue + property pointing to a reification of each of these direct links ( + see Links Between Resources).
    + A LinkObj is more complex (and hence less convenient and readable) than a simple direct link, but it has the + advantage that it can be annotated using an Annotation. For improved readability, a project can make its own + subclasses of LinkObj with specific meanings.

    +
  • +
+

Values

+

The Knora base ontology defines a set of OWL classes that are derived from kb:Value and represent different types of +structured values found in humanities data. This set of classes may not be extended by user-created ontologies.

+

A value is always part of one particular resource, which points to it using some property derived from hasValue. For +example, a user-created ontology could specify a Book class with a property hasSummary (derived from hasValue), +and that property could have a knora-base:objectClassConstraint of TextValue. This would mean that the summary of +each book is represented as a TextValue.

+

Knora values are versioned. Existing values are not modified. Instead, a new version of an existing value is created. +The new version is linked to the old version via the previousValue property.

+

Since each value version has a different IRI, there is no IRI that can be used to cite the value, such that it will +always refer to the latest version of the value. Therefore, the latest version of each value has a separate UUID, as the +object of the property valueHasUUID. When a new version of the value is created, this UUID is moved to the new +version. This makes it possible to cite the latest version of a value by searching for the UUID.

+

"Deleting" a value means marking it with kb:isDeleted. An optional kb:deleteComment may be added to explain why the +value has been marked as deleted. Deleted values are normally hidden.

+

Most types of values are marked as deleted without creating a new version of the value. However, link values must be +treated as a special case. Before a LinkValue can be marked as deleted, its reference count must be decremented to 0. +Therefore, a new version of the LinkValue is made, with a reference count of 0, and it is this new version that is +marked as deleted.

+

To simplify the enforcement of ontology constraints, and for consistency with resource updates, no new versions of a +deleted value can be made; it is not possible to undelete. Instead, if desired, a new value can be created by copying +data from a deleted value.

+

Properties of Value

+
    +
  • +

    valueCreationDate (1): The date and time when the value was created.

    +
  • +
  • +

    attachedToUser (1): The user who owns the value.

    +
  • +
  • +

    valueHasString (1): A human-readable string representation of the value's contents, which is available to DSP-API's + full-text search index.

    +
  • +
  • +

    valueHasOrder (0-1): A resource may have several properties of the same type with different values (which will be of + the same class), and it may be necessary to indicate an order in which these values occur. For example, a book may + have several authors which should appear in a defined order. Hence, valueHasOrder, when present, points to an + integer literal indicating the order of a given value relative to the other values of the same property. These + integers will not necessarily start at any particular number, and will not necessarily be consecutive.

    +
  • +
  • +

    previousValue (0-1): The previous version of the value.

    +
  • +
  • +

    valueHasUUID (0-1): The UUID that refers to all versions of the value. Only the latest version of the value has this + property.

    +
  • +
  • +

    isDeleted (1): Indicates whether the value has been deleted.

    +
  • +
  • +

    deleteDate (0-1): If the value has been deleted, indicates when it was deleted.

    +
  • +
  • +

    deleteComment (0-1): If the value has been deleted, indicates why it was deleted.

    +
  • +
+

Each Knora value can grant permissions (see Authorisation).

+

Subclasses of Value

+
TextValue
+

Represents text, possibly including markup. The text is the object of the valueHasString property. A line break is +represented as a Unicode line feed character (U+000A). The non-printing Unicode character +INFORMATION SEPARATOR TWO (U+001E) can be used to separate words that are separated only by standoff markup (see +below), so they are recognised as separate in a full-text search index.

+

Markup is stored using this property:

+ +

A text value can have a specified language:

+
    +
  • valueHasLanguage (0-1): An ISO 639-1 code as string specifying the language of the text.
  • +
+
DateValue
+

Humanities data includes many different types of dates. A date has a specified calendar, and is always +represented as a period with start and end points (which may be equal), each of which has a precision (DAY, MONTH, +or YEAR). For GREGORIAN and JULIAN calendars, an optional ERA indicator term (BCE, CE, or BC, AD) can be +added to the date, when no era is provided the default era AD will be considered. Internally, the start and end points +are stored as two Julian Day Numbers. This calendar-independent representation makes it possible to compare and search +for dates regardless of the calendar in which they were entered. Properties:

+
    +
  • +

    valueHasCalendar (1): The name of the calendar in which the date should be displayed. Currently GREGORIAN, + JULIAN, and ISLAMIC civil calendars are supported.

    +
  • +
  • +

    valueHasStartJDN (1): The Julian Day Number of the start of the period (an xsd:integer).

    +
  • +
  • +

    valueHasStartPrecision (1): The precision of the start of the period.

    +
  • +
  • +

    valueHasEndJDN (1): The Julian Day Number of the end of the period (an xsd:integer).

    +
  • +
  • +

    valueHasEndPrecision (1): The precision of the end of the period.

    +
  • +
+
TimeValue
+

A Knora time value represents a precise moment in time in the Gregorian calendar. Since nanosecond precision can be +included, it is suitable for use as a timestamp. Properties:

+
    +
  • valueHasTimeStamp (1): An xsd:dateTimeStamp, stored as an xsd:dateTime (because SPARQL does not support + xsd:dateTimeStamp).
  • +
+
IntValue
+

Represents an integer. Property:

+
    +
  • valueHasInteger (1): An xsd:integer.
  • +
+
ColorValue
+
    +
  • valueHasColor (1): A string representing a color. The string encodes a color as hexadecimal RGB values, e.g. + \#FF0000.
  • +
+
DecimalValue
+

Represents an arbitrary-precision decimal number. Property:

+
    +
  • valueHasDecimal (1): An xsd:decimal.
  • +
+
UriValue
+

Represents a non-Knora URI. Property:

+
    +
  • valueHasUri (1): An xsd:anyURI.
  • +
+
BooleanValue
+

Represents a boolean value. Property:

+
    +
  • valueHasBoolean (1): An xsd:boolean.
  • +
+
GeomValue
+

Represents a geometrical object as a JSON string, using normalized coordinates. Property:

+
    +
  • valueHasGeometry (1): A JSON string.
  • +
+
GeonameValue
+

Represents a geolocation, using the identifiers found at GeoNames. Property:

+
    +
  • valueHasGeonameCode (1): The identifier of a geographical feature from GeoNames, represented + as an xsd:string.
  • +
+
IntervalValue
+

Represents a time interval, with precise start and end times on a timeline, e.g. relative to the beginning of an audio +or video file. Properties:

+
    +
  • +

    valueHasIntervalStart (1): An xsd:decimal representing the start of the interval in seconds.

    +
  • +
  • +

    valueHasIntervalEnd (1): An xsd:decimal representing the end of the interval in seconds.

    +
  • +
+
ListValue
+

Projects often need to define lists or hierarchies of categories that can be assigned to many different resources. Then, +for example, a user interface can provide a drop-down menu to allow the user to assign a category to a resource. +The ListValue class provides a way to represent these sorts of data structures. It can represent either a flat list or +a tree.

+

A ListValue has this property:

+
    +
  • valueHasListNode (1): Points to a ListNode.
  • +
+

Each ListNode can have the following properties:

+
    +
  • +

    isRootNode (0-1): Set to true if this is the root node.

    +
  • +
  • +

    hasSubListNode (0-n): Points to the node's child nodes, if any.

    +
  • +
  • +

    hasRootNode (0-1): Points to the root node of the list (absent if isRootNode is true).

    +
  • +
  • +

    listNodePosition (0-1): An integer indicating the node's position in the list of its siblings (absent + if isRootNode is true).

    +
  • +
  • +

    listNodeName (0-1): The node's human-readable name (absent if isRootNode is true).

    +
  • +
+
FileValue
+

DSP-API can store certain kinds of data outside the triplestore, in files (see Representations). Each +digital object that is stored outside the triplestore has associated metadata, which is stored in the triplestore in +a kb:FileValue. The base class FileValue, which is not intended to be used directly, has these properties:

+
    +
  • +

    internalFilename (1): The name of the file as stored by Knora.

    +
  • +
  • +

    internalMimeType (1): The MIME type of the file as stored by Knora.

    +
  • +
  • +

    originalFilename (0-1): The original name of the file when it was uploaded to the DSP-API server.

    +
  • +
  • +

    originalMimeType (0-1): The original MIME type of the file when it was uploaded to the Knora API server.

    +
  • +
  • +

    isPreview (0-1): A boolean indicating whether the file is a preview, i.e. a small image representing the contents of + the file. A preview is always a StillImageAbstractFileValue, regardless of the type of the enclosing Representation.

    +
  • +
+

The subclasses of FileValue, which are intended to be used directly in data, include:

+
    +
  • +

    StillImageAbstractFileValue: Contains metadata about a still image file, which can be either StillImageFileValue (an image stored in Sipi) or StillImageExternalFileValue (a reference to an image stored in an external IIIF service).

    +
  • +
  • +

    MovingImageFileValue: Contains metadata about a video file.

    +
  • +
  • +

    AudioFileValue: Contains metadata about an audio file.

    +
  • +
  • +

    DDDFileValue: Contains metadata about a 3D image file.

    +
  • +
  • +

    TextFileValue: Contains metadata about a text file.

    +
  • +
  • +

    DocumentFileValue: Contains metadata about a document (such as PDF) that is not a text file.

    +
  • +
  • +

    ArchiveFileValue: Contains metadata about an archive (such as zio archive).

    +
  • +
+

Each of these classes contains properties that are specific to the type of file it describes. For example, still image +files have dimensions, video files have frame rates, and so on.

+

FileValue objects are versioned like other values, and the actual files stored by DSP-API are also versioned. Version 1 +of the DSP-API does not provide a way to retrieve a previous version of a file, but this feature will be added in a +subsequent version of the API.

+
LinkValue
+

A LinkValue is an RDF "reification" containing metadata about a link between two resources. It is therefore a subclass +of rdf:Statement as well as of Value. It has these properties:

+

rdf:subject (1)

+

: The resource that is the source of the link.

+

rdf:predicate (1)

+

: The link property.

+

rdf:object (1)

+

: The resource that is the target of the link.

+

valueHasRefCount (1)

+

: The reference count of the link. This is meaningful when the +LinkValue describes resource references in Standoff text markup +(see StandoffLinkTag). Otherwise, the reference count will always be 1 (if the link exists) or 0 (if +it has been deleted).

+

For details about how links are created in DSP-API, see +Links Between Resources.

+
ExternalResValue
+

Represents a resource that is not stored in the RDF triplestore managed by DSP-API, but instead resides in an external +repository managed by some other software. The ExternalResValue contains the information that DSP-API needs in order to +access the resource, assuming that a suitable gateway plugin is installed.

+

extResAccessInfo (1)

+

: The location of the repository containing the external resource +(e.g. its URL).

+

extResId (1)

+

: The repository-specific ID of the external resource.

+

extResProvider (1)

+

: The name of the external provider of the resource.

+ +

A link between two resources is expressed, first of all, as a triple, in which the subject is the resource that is the +source of the link, the predicate is a "link property" (a subproperty of kb:hasLinkTo), and the object is the resource +that is the target of the link.

+

It is also useful to store metadata about links. For example, DSP-API needs to know who owns the link, who has permission +to modify it, when it was created, and so on. Such metadata cannot simply describe the link property, because then it +would refer to that property in general, not to any particular instance in which that property is used to connect two +particular resources. To attach metadata to a specific link in RDF, it is necessary to create an RDF "reification". A +reification makes statements about a particular triple (subject, predicate, object), in this case the triple that +expresses the link between the resources. DSP-API uses reifications of type kb:LinkValue (described in +LinkValue) to store metadata about links.

+

For example, suppose a project describes paintings that belong to collections. The project can define an ontology as +follows (expressed here in Turtle format, and simplified for the purposes of +illustration):

+
@prefix kb <http://www.knora.org/ontology/knora-base#> .
+@prefix : <http://www.knora.org/ontology/paintings#> .
+
+:Painting rdf:type owl:Class ;
+    rdfs:subClassOf kb:Resource ,
+        [ rdf:type owl:Restriction ;
+            owl:onProperty :hasArtist ;
+            owl:cardinality 1 ] ,
+        [ rdf:type owl:Restriction ;
+              owl:onProperty :hasTitle ;
+              owl:cardinality 1 ] ;
+        [ rdf:type owl:Restriction ;
+              owl:onProperty :isInCollection ;
+              owl:minCardinality 1 ] ;
+        [ rdf:type owl:Restriction ;
+              owl:onProperty :isInCollectionValue ;
+              owl:minCardinality 1 ] .
+
+:Collection rdf:type owl:Class ;
+    rdfs:subClassOf kb:Resource ,
+        [ rdf:type owl:Restriction ;
+            owl:onProperty :hasCollectionName ;
+            owl:cardinality 1 ] .
+
+:hasArtist rdf:type owl:ObjectProperty ;
+    rdfs:label "Name of artist" ;
+    kb:subjectClassConstraint :Painting ;
+    kb:objectClassConstraint kb:TextValue .
+
+:hasTitle rdf:type owl:ObjectProperty ;
+    rdfs:label "Title of painting"
+    kb:subjectClassConstraint :Painting ;
+    kb:objectClassConstraint kb:TextValue .
+
+:hasCollectionName rdf:type owl:ObjectProperty ;
+    rdfs:label "Name of collection" ;
+    kb:subjectClassConstraint :Collection ;
+    kb:objectClassConstraint kb:TextValue .
+
+

To link the paintings to the collection, we must add a "link property" +to the ontology. In this case, the link property will point from a painting to the collection it belongs to. Every link +property must be a subproperty of kb:hasLinkTo.

+
:isInCollection rdf:type owl:ObjectProperty ;
+    rdfs:subPropertyOf kb:hasLinkTo ;
+    kb:subjectClassConstraint :Painting ;
+    kb:objectClassConstraint :Collection .
+
+

We must then add a "link value property", which will point from a painting to a kb:LinkValue (described in +LinkValue), which will contain metadata about the link between the property and the collection. In +particular, the link value specifies the creator of the link, the date when it was created, and the permissions that +determine who can view or modify it. The name of the link value property is constructed using a simple naming +convention: the word Value is appended to the name of the link property. In this case, since our link property is +called +:isInCollection, the link value property must be called +:isInCollectionValue. Every link value property must be a subproperty of kb:hasLinkToValue.

+
:isInCollectionValue rdf:type owl:ObjectProperty ;
+    rdfs:subPropertyOf kb:hasLinkToValue ;
+    kb:subjectClassConstraint :Painting ;
+    kb:objectClassConstraint kb:LinkValue .
+
+

Given this ontology, we can create some RDF data describing a painting and a collection:

+
@prefix paintings <http://www.knora.org/ontology/paintings#> .
+@prefix data <http://www.knora.org/ontology/paintings/data#> .
+
+data:dali_4587 rdf:type paintings:Painting ;
+    paintings:hasTitle data:value_A ;
+    paintings:hasArtist data:value_B .
+
+data:value_A rdf:type kb:TextValue ;
+    kb:valueHasString "The Persistence of Memory" .
+
+data:value_B rdf:type kb:TextValue ;
+    kb:valueHasString "Salvador Dali" .
+
+data:pompidou rdf:type paintings:Collection ;
+    paintings:hasCollectionName data:value_C .
+
+data:value_C rdf:type kb:TextValue ;
+    kb:valueHasString "Centre Pompidou, Paris" .
+
+

We can then state that the painting is in the collection:

+
data:dali_4587 paintings:isInCollection data:pompidou ;
+    paintings:isinCollectionValue data:value_D .
+
+data:value_D rdf:type kb:LinkValue ;
+    rdf:subject data:dali_4587 ;
+    rdf:predicate paintings:isInCollection ;
+    rdf:object data:pompidou ;
+    kb:valueHasRefCount 1 .
+
+

This creates a link (paintings:isInCollection) between the painting and the collection, along with a reification +containing metadata about the link. We can visualise the result as the following graph:

+

Figure 2

+

DSP-API allows a user to see a link if the requesting user has permission to see the source and target resources as well +as the kb:LinkValue.

+

Part-Whole-Relations between Resources

+

isPartOf

+

A special case of linked resources are part-of related resources, i.e. a resource consisting of several other +resources. In order to create a part-of relation between two resources, the resource that is part of another resource +needs to have a property that is either kb:isPartOf or a subproperty thereof. +kb:isPartOf itself is a subproperty of kb:hasLinkTo. Same as described above for link properties, a corresponding +part-of value property is created automatically. This value property has the same name as the part-of property with +Value appended. For example, if in an ontology data a property data:partOf was defined, the corresponding value +property would be named data:partOfValue. This newly created property data:partOfValue is defined as a subproperty +of kb:isPartOfValue.

+

Part-of relations are recommended for resources of type kb:StillImageRepresentation. In that case, the resource that +is part of another resource needs to have a property kb:seqnum or a subproperty thereof, with an integer as value. A +client can then use this information to leaf through the parts of the compound resource (p.ex. to leaf through the pages +of a book like in this example).

+

Segment

+

DSP-API supports the creation of segment resources. +A segment is a part of a resource which has a temporal extent; +the segment is defined by a start and end time relative to the resource. +Segments are modelled as resources of type kb:Segment, +having the properties kb:isSegmentOf, a LinkValue pointing to the resource the segment is part of, +and kb:hasSegmentBounds, a IntervalValue representing the temporal extent of the segment. +However, kb:Segment is "abstract" and cannot be used directly in data.

+

Segments have a number of optional, generic properties to add additional information: +kb:hasTitle (0-1), kb:hasDescription (0-n), kb:hasKeyword (0-n), +kb:relatesTo/kb:relatesToValue (0-n), and kb:hasComment (0-1).

+

There are two concrete subclasses of kb:Segment for video and audio resources.

+

It is possible to create subclasses of kb:AudioSegment and kb:VideoSegment to add additional properties, +but this is discouraged and may not be supported in future versions of DSP-API. +Instead, instances of kb:Annotation pointing to the segment should be used to add additional information.

+
AudioSegment
+

Audio segments are defined by the following properties:

+
    +
  • kb:isAudioSegmentOf (1): A LinkValue pointing to an AudioRepresentation.
  • +
  • kb:hasSegmentBounds (1): An IntervalValue representing the temporal extent of the segment.
  • +
  • kb:hasTitle (0-1): A TextValue for adding a title or name to the segment.
  • +
  • kb:hasDescription (0-n): A TextValue for providing one or more descriptions of the segment.
  • +
  • kb:hasKeyword (0-n): A TextValue for adding one or more keywords to the segment.
  • +
  • kb:relatesTo/kb:relatesToValue (0-n): A LinkValue for relating the segment to another resource.
  • +
  • kb:hasComment (0-1): A TextValue for a comment on the segment.
  • +
+
VideoSegment
+

Video segments are defined by the following properties:

+
    +
  • kb:isVideoSegmentOf (1): A LinkValue pointing to a MovingImageRepresentation.
  • +
  • kb:hasSegmentBounds (1): An IntervalValue representing the temporal extent of the segment.
  • +
  • kb:hasTitle (0-1): A TextValue for adding a title or name to the segment.
  • +
  • kb:hasDescription (0-n): A TextValue for providing one or more descriptions of the segment.
  • +
  • kb:hasKeyword (0-n): A TextValue for adding one or more keywords to the segment.
  • +
  • kb:relatesTo/kb:relatesToValue (0-n): A LinkValue for relating the segment to another resource.
  • +
  • kb:hasComment (0-1): A TextValue for a comment on the segment.
  • +
+

Text with Standoff Markup

+

DSP-API is designed to be able to store text with markup, which can indicate formatting and structure, as well as the +complex observations involved in transcribing handwritten manuscripts. One popular way of representing text in the +humanities is to encode it in XML using the Text Encoding +Initiative (TEI) +guidelines. In DSP-API, a TEI/XML document can be stored as a file with attached metadata, but this is not recommended, +because it does not allow to perform searches across multiple documents.

+

The recommended way to store text with markup in DSP-API is to use the built-in support for "standoff" markup, which +is stored separately from the text. This has some advantages over embedded markup such as XML. While XML requires markup +to have a hierarchical structure, and does not allow overlapping tags, standoff nodes do not have these limitations +(see +Using Standoff Properties for Marking-up Historical Documents in the Humanities). +A standoff tag can be attached to any substring in the text by giving its start and end positions. Unlike in corpus +linguistics, we do not use any tokenisation resulting in a form of predefined segmentation, which would limit the user's +ability to freely annotate any ranges in the text.

+

For example, suppose we have the following text:

+
<blockquote>This <i>sentence <strong>has overlapping</strong></i> <strong>visual</strong> attributes.</blockquote>
+
+

This would require just two standoff tags: (italic, start=5, end=29) and (bold, start=14, end=36).

+

Moreover, standoff makes it possible to mark up the same text in different, possibly incompatible ways, allowing for +different interpretations without making redundant copies of the text. In the Knora base ontology, any text value can +have standoff tags.

+

By representing standoff as RDF triples, DSP-API makes markup searchable across multiple text documents in a repository. +For example, if a repository contains documents in which references to persons are indicated in standoff, it is +straightforward to find all the documents mentioning a particular person. DSP-API's standoff support is intended to make +it possible to convert documents with embedded, hierarchical markup, such as TEI/XML, into RDF standoff and back again, +with no data loss, thus bringing the benefits of RDF to existing TEI-encoded documents.

+

In the Knora base ontology, a TextValue can have one or more standoff tags. Each standoff tag indicates the start and +end positions of a substring in the text that has a particular attribute. The OWL class +kb:StandoffTag, which is the base class of all standoff node classes, has these properties:

+
    +
  • standoffTagHasStart (1): The index of the first character in the text that has the attribute.
  • +
  • standoffTagHasEnd (1): The index of the last character in the text that has the attribute, plus 1.
  • +
  • standoffTagHasUUID (1): A UUID identifying this instance and those corresponding to it in later versions of + the TextValue it belongs to. + The UUID is a means to maintain a reference to a particular range of a text also when new versions are made and + standoff + tag IRIs change.
  • +
  • standoffTagHasOriginalXMLID (0-1): The original ID of the XML element that the standoff tag represents, if any.
  • +
  • standoffTagHasStartIndex (1): The start index of the standoff tag. Start indexes are numbered from 0 within the + context of a particular text. + When several standoff tags share the same start position, they can be nested correctly with this information when + transforming them to XML.
  • +
  • standoffTagHasEndIndex (1): The end index of the standoff tag. Start indexes are numbered from 0 within the context + of a particular text. + When several standoff tags share the same end position, they can be nested correctly with this information when + transforming + them to XML.
  • +
  • standoffTagHasStartParent (0-1): Points to the parent standoff tag. This corresponds to the original nesting of tags + in XML. If a standoff tag has no parent, it represents the XML root element. + If the original XML element is a CLIX tag, it represents the start of a virtual (non syntactical) hierarchy.
  • +
  • standoffTagHasEndParent (0-1): Points to the parent standoff tag if the original XML element is a CLIX tag and + represents the end of a virtual (non syntactical) hierarchy.
  • +
+

The StandoffTag class is not used directly in RDF data; instead, its subclasses are used. A few subclasses are +currently provided in standoff-onto.ttl, and more will be added to support TEI semantics. +Projects are able to define their own custom standoff tag classes (direct subclasses of StandoffTag +or one of the standoff data type classes or subclasses of one of the standoff classes defined in standoff-onto.ttl).

+

Subclasses of StandoffTag

+
Standoff Data Type Tags
+

Associates data in some Knora value type with a substring in a text. Standoff data type tags are subclasses +of ValueBase classes.

+
    +
  • StandoffLinkTag Indicates that a substring refers to another kb:Resource. See StandoffLinkTag.
  • +
  • StandoffInternalReferenceTag Indicates that a substring refers to another standoff tag in the same text value. + See Internal Links in a TextValue.
  • +
  • StandoffUriTag Indicates that a substring is associated with a URI, which is stored in the same form that is used + for kb:UriValue. See UriValue.
  • +
  • StandoffDateTag Indicates that a substring represents a date, which is stored in the same form that is used + for kb:DateValue. See DateValue.
  • +
  • StandoffColorTag Indicates that a substring represents a color, which is stored in the same form that is used + for kb:ColorValue. See ColorValue.
  • +
  • StandoffIntegerTag Indicates that a substring represents an integer, which is stored in the same form that is used + for kb:IntegerValue. See IntValue.
  • +
  • StandoffDecimalTag Indicates that a substring represents a number with fractions, which is stored in the same form + that is used for kb:DecimalValue. See DecimalValue.
  • +
  • StandoffIntervalTag Indicates that a substring represents an interval, which is stored in the same form that is used + for kb:IntervalValue. See IntervalValue.
  • +
  • StandoffBooleanTag Indicates that a substring represents a Boolean, which is stored in the same form that is used + for kb:BooleanValue. See BooleanValue.
  • +
  • StandoffTimeTag Indicates that a substring represents a timestamp, which is stored in the same form that is used + for kb:TimeValue. See TimeValue.
  • +
+
StandoffLinkTag
+

A StandoffLinkTag Indicates that a substring is associated with a Knora resource. For example, if a repository +contains resources representing persons, a text could be marked up so that each time a person's name is mentioned, +a StandoffLinkTag connects the name to the Knora resource describing that person. It has the following property:

+

standoffTagHasLink (1): The IRI of the resource that is referred to.

+

One of the design goals of the Knora base ontology is to make it easy and efficient to find out which resources contain +references to a given resource. Direct links are easier and more efficient to query than indirect links. Therefore, when +a text value contains a resource reference in its standoff nodes, DSP-API automatically creates a direct link between the +containing resource and the target resource, along with an RDF reification (a kb:LinkValue) describing the link, as +discussed in Links Between Resources. In this case, the link property is +always kb:hasStandoffLinkTo, and the link value property (which points to the LinkValue) is always +kb:hasStandoffLinkToValue.

+

DSP-API automatically updates direct links and reifications for standoff resource references when text values are +updated. +To do this, it keeps track of the number of text values in each resource that contain at least one standoff reference to +a given target resource. It stores this number as the reference count of the LinkValue (see +LinkValue) describing the direct link. Each time this number changes, it makes a new version of +the LinkValue, with an updated reference count. When the reference count reaches zero, it removes the direct link and +makes a new version of the LinkValue, marked with kb:isDeleted.

+

For example, if data:R1 is a resource with a text value in which the resource data:R2 is referenced, the repository +could contain the following triples:

+
data:R1
+    ex:hasComment data:V1 .
+
+data:V1
+    rdf:type            kb:TextValue ;
+    kb:valueHasString   "This link is internal." ;
+    kb:valueHasStandoff data:SO1 .
+
+data:SO1
+    rdf:type                kb:StandoffLinkTag ;
+    kb:standoffTagHasStart: 5 ;
+    kb:standoffTagHasEnd:   9 ;
+    kb:standoffTagHasLink   data:R2 .
+
+data:R1
+    kb:hasStandoffLinkTo data:R2 .
+
+data:R1
+    kb:hasStandoffLinkToValue data:LV1 .
+
+data:LV1
+    rdf:type            kb:LinkValue ;
+    rdf:subject         data:R1 ;
+    rdf:predicate       kb:hasStandoffLinkTo ;
+    rdf:object          data:R2 ;
+    kb:valueHasRefCount 1 .
+
+

The result can be visualized like this:

+

Figure 3

+

Link values created automatically for resource references in standoff are visible to all users, and the creator of these +link values is always +kb:SystemUser (see Users and Groups). The DSP-API server allows a user to see a standoff link if +the user has permission to see the source and target resources.

+ +

Internal links in a TextValue can be represented using the data type standoff class StandoffInternalReferenceTag or +a subclass of it. It has the following property:

+

standoffTagHasInternalReference (1): Points to a StandoffTag that belongs to the same TextValue. It has +an objectClassConstraint of StandoffTag.

+

For links to a kb:Resource, see StandoffLinkTag.

+

Mapping to Create Standoff From XML

+

A mapping allows for the conversion of an XML document to RDF-standoff and back. A mapping defines one-to-one relations +between XML elements (with or without a class) and attributes and standoff classes and properties (see +XML to Standoff Mapping).

+

A mapping is represented by a kb:XMLToStandoffMapping which contains one or more kb:MappingElement. +A kb:MappingElement maps an XML element (including attributes) to a standoff class and standoff properties. It has the +following properties:

+
    +
  • mappingHasXMLTagname (1): The name of the XML element that is mapped to a standoff class.
  • +
  • mappingHasXMLNamespace (1): The XML namespace of the XML element that is mapped to a standoff class. If no namespace + is given, noNamespace is used.
  • +
  • mappingHasXMLClass (1): The name of the class of the XML element. If it has no class, noClass is used.
  • +
  • mappingHasStandoffClass (1): The standoff class the XML element is mapped to.
  • +
  • mappingHasXMLAttribute (0-n): Maps XML attributes to standoff properties using MappingXMLAttribute. See below.
  • +
  • mappingHasStandoffDataTypeClass (0-1): Indicates the standoff data type class of the standoff class the XML element + is mapped to.
  • +
  • mappingElementRequiresSeparator (1): Indicates if there should be an invisible word separator inserted after the XML + element in the RDF-standoff representation. + Once the markup is stripped, text segments that belonged to different elements may be concatenated.
  • +
+

A MappingXMLAttribute has the following properties:

+
    +
  • mappingHasXMLAttributename: The name of the XML attribute that is mapped to a standoff property.
  • +
  • mappingHasXMLNamespace: The namespace of the XML attribute that is mapped to a standoff property. If no namespace is + given, noNamespace is used.
  • +
  • mappingHasStandoffProperty: The standoff property the XML attribute is mapped to.
  • +
+

DSP-API includes a standard mapping used by the DSP APP. It has the +IRI http://rdfh.ch/standoff/mappings/StandardMapping and defines mappings for a few elements used to write texts with +simple markup.

+

Standoff in Digital Editions

+

DSP-API's standoff is designed to make it possible to convert XML documents to standoff and back. One application for +this +feature is an editing workflow in which an editor works in an XML editor, and the resulting XML documents are converted +to standoff and stored in the DSP, where they can be searched and annotated.

+

If an editor wants to correct text that has been imported from XML into standoff, the text can be exported as XML, +edited, and imported again. To preserve annotations on standoff tags across edits, each tag can automatically be given a +UUID. In a future version of the Knora base ontology, it may be possible to create annotations that point to UUIDs +rather than to IRIs. When a text is exported to XML, the UUIDs can be included in the XML. When the edited XML is +imported again, it can be converted to new standoff tags with the same UUIDs. Annotations that applied to standoff tags +in the previous version of the text will therefore also apply to equivalent tags in the new version.

+

When text is converted from XML into standoff, tags are also given indexes, which are numbered from 0 within the context +of a particular text. This makes it possible to order tags that share the same position, and to preserve the hierarchy +of the original XML document. An ordinary, hierarchical XML tag is converted to a standoff tag that has one index, as +well as the index of its parent tag, if any. The Knora base ontology also supports non-hierarchical markup such as +CLIX, which enables overlapping +markup to be represented in XML. When non-hierarchical markup is converted to standoff, both the start position and the +end position of the standoff tag have indexes and parent indexes.

+

To support these features, a standoff tag can have these additional properties:

+
    +
  • standoffTagHasStartIndex (0-1): The index of the start position.
  • +
  • standoffTagHasEndIndex (0-1): The index of the end position, if this is a non-hierarchical tag.
  • +
  • standoffTagHasStartParent (0-1): The IRI of the tag, if any, that contains the start position.
  • +
  • standoffTagHasEndParent (0-1): The IRI of the tag, if any, that contains the end position, if this is a + non-hierarchical tag.
  • +
  • standoffTagHasUUID (0-1): A UUID that can be used to annotate a standoff tag that may be present in different + versions of a text, + or in different layers of a text (such as a diplomatic transcription and an edited critical text).
  • +
+

Querying Standoff in SPARQL

+

A future version of DSP-API may provide an API for querying standoff markup. In the meantime, it is possible to query it +directly in SPARQL. For example, here is a SPARQL query (using RDFS inference) that finds all the text values that +have a standoff date tag referring to Christmas Eve 2016, contained in a StandoffItalicTag:

+
PREFIX knora-base: <http://www.knora.org/ontology/knora-base#>
+PREFIX standoff: <http://www.knora.org/ontology/standoff#>
+
+select * where {
+    ?standoffTag a knora-base:StandoffDateTag  .
+
+    ?standoffTag knora-base:valueHasStartJDN ?dateStart .
+    ?standoffTag knora-base:valueHasEndJDN ?dateEnd .
+
+    FILTER (2457747  <= ?dateEnd && 2457747  >= ?dateStart)
+
+    ?standoffTag knora-base:standoffTagHasStartParent ?parent .
+    ?parent a standoff:StandoffItalicTag .
+
+    ?textValue knora-base:valueHasStandoff ?standoffTag .
+    ?textValue knora-base:valueHasString ?string .
+
+    ?standoffTag knora-base:standoffTagHasStart ?startPos .
+    ?standoffTag knora-base:standoffTagHasEnd ?endPos .  
+}
+
+

Authorisation

+

Users and Groups

+

Each DSP-API user is represented by an object belonging to the class +kb:User, which is a subclass of foaf:Person, and has the following properties:

+

userid (1)

+

: A unique identifier that the user must provide when logging in.

+

password (1)

+

: A cryptographic hash of the user's password.

+

email (0-n)

+

: Email addresses belonging to the user.

+

isInProject (0-n)

+

: Projects that the user is a member of.

+

isInGroup (0-n)

+

: user-created groups that the user is a member of.

+

foaf:familyName (1)

+

: The user's family name.

+

foaf:givenName (1)

+

: The user's given name.

+

DSP-API's concept of access control is that an object (a resource or value) can grant permissions to groups of users (but +not to individual users). There are several built-in groups:

+

knora-admin:UnknownUser

+

: Any user who has not logged into DSP-API is automatically assigned to this group.

+

knora-admin:KnownUser

+

: Any user who has logged into DSP-API is automatically assigned to this group.

+

knora-admin:ProjectMember

+

: When checking a user's permissions on an object, the user is automatically assigned to this group if she is a member +of the project that the object belongs to.

+

knora-admin:Creator

+

: When checking a user's permissions on an object, the user is automatically assigned to this group if he is the +creator of the object.

+

knora-admin:ProjectAdmin

+

: When checking a user's permissions on an object, the user is automatically assigned to this group if she is an +administrator of the project that the object belongs to.

+

knora-admin:SystemAdmin

+

: The group of DSP-API system administrators.

+

A user-created ontology can define additional groups, which must belong to the OWL class knora-admin:UserGroup.

+

There is one built-in knora-admin:SystemUser, which is the creator of link values created automatically for resource +references in standoff markup (see StandoffLinkTag).

+

Permissions

+

Each resource or value can grant certain permissions to specified user groups. These permissions are represented as the +object of the predicate kb:hasPermissions, which is required on every kb:Resource +and on the current version of every kb:Value. The permissions attached to the current version of a value also apply to +previous versions of the value. Value versions other than the current one do not have this predicate.

+

The following permissions can be granted:

+
    +
  1. Restricted view permission (RV) Allows a restricted view of the object, e.g. a view of an image with a watermark.
  2. +
  3. View permission (V) Allows an unrestricted view of the object. Having view permission on a resource only affects + the user's ability to view information about the resource other than its values. To view a value, she must have view + permission on the value itself.
  4. +
  5. Modify permission (M) For values, this permission allows a new version of a value to be created. For resources, + this allows the user to create a new value (as opposed to a new version of an existing value), or to change + information about the resource other than its values. When he wants to make a new version of a value, his permissions + on the containing resource are not relevant. However, when he wants to change the target of a link, the old link must + be deleted and a new one created, so he needs modify permission on the resource.
  6. +
  7. Delete permission (D) Allows the item to be marked as deleted.
  8. +
  9. Change rights permission (CR) Allows the permissions granted by the object to be changed.
  10. +
+

Each permission in the above list implies all lower-numbered permissions. A user's permission level on a particular +object is calculated in the following way:

+
    +
  1. Make a list of the groups that the user belongs to, including + Creator and/or ProjectMember if applicable.
  2. +
  3. Make a list of the permissions that she can obtain on the object, by iterating over the permissions that the object + grants. For each permission, if she is in the specified group, add the specified permission to the list of + permissions she can obtain.
  4. +
  5. From the resulting list, select the highest-level permission.
  6. +
  7. If the result is that she would have no permissions, give her whatever permission UnknownUser would have.
  8. +
+

To view a link between resources, a user needs permission to view the source and target resources. He also needs +permission to view the +LinkValue representing the link, unless the link property is +hasStandoffLinkTo (see StandoffLinkTag).

+

The format of the object of kb:hasPermissions is as follows:

+
    +
  • Each permission is represented by the one-letter or two-letter abbreviation given above.
  • +
  • Each permission abbreviation is followed by a space, then a comma-separated list of groups that the permission is + granted to.
  • +
  • The IRIs of built-in groups are shortened using the knora-admin + prefix.
  • +
  • Multiple permissions are separated by a vertical bar (|).
  • +
+

For example, if an object grants view permission to unknown and known users, and modify permission to project members, +the resulting permission literal would be:

+
V knora-admin:UnknownUser,knora-admin:KnownUser|M knora-admin:ProjectMember
+
+

Consistency Checking

+

DSP-API tries to enforce repository consistency by checking constraints that are specified in the Knora base ontology and +in user-created ontologies. Three types of consistency rules are enforced:

+
    +
  • Cardinalities in OWL class definitions must be satisfied.
  • +
  • Constraints on the types of the subjects and objects of OWL object properties must be satisfied.
  • +
  • A datatype property may not have an empty string as an object.
  • +
+

OWL Cardinalities

+

As noted in Resources, each subclass of +Resource must use OWL cardinality restrictions to specify the properties it can have. More specifically, a resource is +allowed to have a property that is a subproperty of kb:hasValue or kb:hasLinkTo only if the resource's class has +some cardinality for that property. Similarly, a value is allowed to have a subproperty of kb:valueHas +only if the value's class has some cardinality for that property.

+

DSP-API supports, and attempts to enforce, the following cardinality constraints:

+
    +
  • +

    owl:cardinality 1: + Exactly One 1 - A resource of this class must have exactly one instance of the specified property.

    +
  • +
  • +

    owl:minCardinality 1: + At Least One 1-n - A resource of this class must have at least one instance of the specified property.

    +
  • +
  • +

    owl:maxCardinality 1: + Zero Or One 0-1 - A resource of this class must have either zero or one instance of the specified property.

    +
  • +
  • +

    owl:minCardinality 0: + Unbounded 0-n - A resource of this class may have zero or more instances of the specified property.

    +
  • +
+

DSP-API requires cardinalities to be defined using blank nodes, as in the following example from knora-base:

+
:Representation rdf:type owl:Class ;
+    rdfs:subClassOf :Resource ,
+        [ rdf:type owl:Restriction ;
+          owl:onProperty :hasFileValue ;
+          owl:minCardinality "1"^^xsd:nonNegativeInteger ] .
+
+:StillImageRepresentation rdf:type owl:Class ;
+    rdfs:subClassOf :Representation ,
+        [ rdf:type owl:Restriction ;
+          owl:onProperty :hasStillImageFileValue ;
+          owl:minCardinality "1"^^xsd:nonNegativeInteger ] .
+
+

The cardinality of a link property must be the same as the cardinality of the corresponding link value property.

+

Each owl:Restriction may have the predicate salsah-gui:guiOrder to indicate the order in which properties should be +displayed in a GUI +(see The SALSAH GUI Ontology).

+

A resource class inherits cardinalities from its superclasses. This follows from the rules of +RDFS inference. Also, in DSP-API, cardinalities in the subclass can +override cardinalities that would otherwise be inherited from the superclass. Specifically, if a superclass has a +cardinality on a property P, and a subclass has a cardinality on a subproperty of P, the subclass's cardinality +overrides the superclass's cardinality. In the example above, +hasStillImageFileValue is a subproperty of hasFileValue. Therefore, the cardinality on hasStillImageFileValue +overrides (i.e. replaces) +the one on hasFileValue.

+

Note that, unlike cardinalities, predicates of properties are not inherited. If :foo rdfs:subPropertyOf :bar, this +does not mean that +:foo inherits anything from :bar. Any predicates of :foo that are also needed by :bar must be defined explicitly +on :bar. This design decision was made because property predicate inheritance is not provided by RDFS inference, and +would make it more difficult to check the correctness of ontologies, while providing little practical benefit.

+

For more information about OWL cardinalities, see +the OWL 2 Primer.

+

Constraints on the Types of Property Subjects and Objects

+

When a user-created ontology defines a property, it must indicate the types that are allowed as objects (and, if +possible, as subjects) of the property. This is done using the following Knora-specific properties:

+

subjectClassConstraint

+

: Specifies the class that subjects of the property must belong to. This constraint is recommended but not required. +DSP-API will attempt to enforce this constraint.

+

objectClassConstraint

+

: If the property is an object property, specifies the class that objects of the property must belong to. Every +subproperty of +kb:hasValue or a kb:hasLinkTo (i.e. every property of a resource that points to a kb:Value or to another resource) +is required to have this constraint, because DSP-API relies on it to know what type of object to expect for the property. +DSP-API will attempt to enforce this constraint.

+

objectDatatypeConstraint

+

: If the property is a datatype property, specifies the type of literals that can be objects of the property. DSP-API +will not attempt to enforce this constraint, but it is useful for documentation purposes.

+

Note that it is possible for a subproperty to have a more restrictive contraint than its base property, by specifing a +subject or object class that is a subclass of the one specified in the base property. However, it is not possible for +the subproperty to make the base property's constraint less restrictive.

+

See +also Why doesn't DSP-API use rdfs:domain and rdfs:range for consistency checking?

+

Consistency Constraint Example

+

A user-created ontology could define consistency constraints as in this simplified example:

+
:book rdf:type owl:Class ;
+    rdfs:subClassOf knora-base:Resource ,
+        [ rdf:type owl:Restriction ;
+          owl:onProperty :hasTitle ;
+          owl:cardinality "1"^^xsd:nonNegativeInteger ] ,
+        [ rdf:type owl:Restriction ;
+          owl:onProperty :hasAuthor ;
+          owl:minCardinality "0"^^xsd:nonNegativeInteger ] .
+
+:hasTitle rdf:type owl:ObjectProperty ;
+    knora-base:subjectClassConstraint :book ;
+    knora-base:objectClassConstraint knora-base:TextValue .
+
+:hasAuthor rdf:type owl:ObjectProperty ;
+    knora-base:subjectClassConstraint :book ;
+    knora-base:objectClassConstraint knora-base:TextValue .
+
+

Summary of Restrictions on User-Created Ontologies

+

An ontology can refer to a Knora ontology in another project only if the other ontology is built-in or shared +(see Shared Ontologies).

+

Restrictions on Classes

+
    +
  • Each class must be a subclass of either kb:Resource or + kb:StandoffTag, but not both (note that this forbids user-created subclasses of kb:Value).
  • +
  • All the cardinalities that a class defines directly (i.e. does not inherit from kb:Resource) must be on properties + that are defined in the triplestore.
  • +
  • Within the cardinalities of a class, there must be a link value property for each link property and vice versa.
  • +
  • The cardinality of a link property must be the same as the cardinality of the corresponding link value property.
  • +
  • A cardinality on a property with a boolean value must be + owl:cardinality 1 or owl:maxCardinality 1.
  • +
  • Each class must be a subclass of all the classes that are subject class constraints of the properties in its + cardinalities.
  • +
  • If it's a resource class, all its directly defined cardinalities must be on Knora resource properties (subproperties + of kb:hasValue + or kb:hasLinkTo), and all its base classes with Knora IRIs must also be resource classes. A cardinality + on kb:resourceProperty or + kb:hasValue is forbidden. It must also have an rdfs:label.
  • +
  • If it's a standoff class, none of its cardinalities may be on Knora resource properties, and all its base classes with + Knora IRIs must also be standoff classes.
  • +
  • A class cannot have a cardinality on property P as well as a cardinality on a subproperty of P.
  • +
+

Restrictions on properties

+
    +
  • The property's subject class constraint, if provided, must be a subclass of kb:Resource or kb:StandoffTag, and + must be a subclass of the subject class constraints of all its base properties.
  • +
  • Its object class constraint, if provided, must be a subclass of the object class constraints of all its base + properties.
  • +
  • If the property is a Knora resource property, it must have an object class constraint and an rdfs:label.
  • +
  • It can't be a subproperty of both kb:hasValue and kb:hasLinkTo.
  • +
  • It can't be a subproperty of kb:hasFileValue.
  • +
  • Each of its base properties that has a Knora IRI must also be a Knora resource property.
  • +
+

Standardisation

+

The DaSCH intends to coordinate the standardisation of generally useful entities proposed in +user-created ontologies. We envisage a process in which two or more projects would initiate the process by starting a +public discussion on proposed entities to be shared. Once a consensus was reached, the +DaSCH would publish these entities in a +Shared Ontology).

+

Knora Ontology Versions

+

The Knora base ontology has the property kb:ontologyVersion, whose object is a string that indicates the deployed +version of all the DSP-API built-in ontologies. This allows the +repository update program to determine which repository updates are needed +when DSP-API is upgraded.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/02-dsp-ontologies/salsah-gui/index.html b/02-dsp-ontologies/salsah-gui/index.html new file mode 100644 index 0000000000..94ed88d787 --- /dev/null +++ b/02-dsp-ontologies/salsah-gui/index.html @@ -0,0 +1,3554 @@ + + + + + + + + + + + + + + + + + + + + + + + The SALSAH GUI Ontology - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + +

The SALSAH GUI Ontology

+

Overview

+

The SALSAH GUI ontology provides entities that can be used in +user-created ontologies to indicate to SALSAH (or to another GUI) +how data should be entered and displayed.

+

The SALSAH GUI ontology is identified by the IRI +http://www.knora.org/ontology/salsah-gui. In the Knora documentation +in general, it is identified by the prefix salsah-gui, but for +brevity, we omit the prefix in this document.

+

Properties

+

guiOrder

+

guiOrder can be attached to a cardinality +in a resource class, to indicate the order in which properties +should be displayed in the GUI. The object is a non-negative +integer. For example, a property with guiOrder 0 would be +displayed first, followed by a property with guiOrder 1, and so +on.

+

guiElement

+

guiElement can be attached to a property definition to indicate which +GUI element should be used to enter data for the property. This +should be one of the individuals of class Guielement described +below.

+

guiAttribute

+

guiAttribute can be attached to a property definition to provide attributes for +the GUI element specified in guiElement. The objects of this +predicate are written in a DSL with the following syntax:

+
object          = attribute name, "=", attribute value ;
+attribute name  = identifier ;
+identifier      = letter , { letter } ;
+attribute value = integer | decimal | percent | string | iri ;
+percent         = integer, "%" ;
+iri             = "<", string, ">" ;
+
+

The attributes used with each GUI element are described below under +Individuals.

+

guiAttributeDefinition

+

guiAttributeDefinition is used only in the salsah-gui ontology itself, as a predicate +attached to instances of Guielement (see Individuals), +to specify the attributes that can be given as objects of guiAttribute when a given +Guielement is used. The objects of this predicate are written in +a DSL with the following syntax:

+
object              = attribute name, [ "(required)" ], ":", attribute type, [ enumerated values ] ;
+enumerated values   = "(", enumerated value, { "|", enumerated value } ")" ;
+attribute name      = identifier ;
+attribute type      = "integer" | "decimal" | "percent" | "string" | "iri" ;
+enumerated value    = identifier ;
+identifier          = letter , { letter } ;
+
+

Enumerated values are allowed only if attribute type is string. +If enumerated values are provided for an attribute, the attribute +value given via guiAttribute must be one of the enumerated values.

+

Classes

+

Guielement

+

The instances of class Guielement are individuals representing GUI +elements for data entry.

+

Individuals

+

Colorpicker

+

Colorpicker is a GUI element for selecting a color. A property definition that uses +this element may also contain a guiAttribute predicate whose +object is a string in the form "ncolors=N", where N is an +integer specifying the number of colors to display.

+

Date

+

Date is a GUI element for selecting a date.

+

Geometry

+

Geometry is a GUI element for selecting the geometry of a two-dimensional +region.

+

Geonames

+

Geonames is a GUI element for selecting a Geonames +identifier.

+

Interval

+

Interval is a GUI element for selecting a time interval in an audio or video +recording.

+

List

+

List is a GUI element for selecting an item in a hierarchical list (see +ListValue). A property definition that +uses this element must also contain this guiAttribute predicate:

+

"hlist=<LIST_IRI>", where LIST_IRI is the IRI of a +knora-base:ListNode that is the root node of a hierarchical list.

+

Pulldown

+

Pulldown is a GUI element for selecting an item in a flat list (see +ListValue) using a pull-down menu. A +property definition that uses this element must also contain this +guiAttribute predicate:

+

"hlist=<LIST_IRI>", where LIST_IRI is the IRI of a +knora-base:ListNode that is the root node of a hierarchical list.

+

Radio

+

Radio is a GUI element for selecting an item in a flat list (see +ListValue) using radio buttons. A property +definition that uses this element must also contain this +guiAttribute predicate:

+

"hlist=<LIST_IRI>", where LIST_IRI is the IRI of a +knora-base:ListNode that is the root node of a hierarchical list.

+

Richtext

+

Richtext is a GUI element for editing multi-line formatted text.

+ +

Searchbox is a GUI element for searching for a resource by matching text in its rdfs:label.

+

SimpleText

+

SimpleText is a GUI element for editing a single line of unformatted text. A +property definition that uses this element may also contain a +guiAttribute predicate with one or both of the following objects:

+
    +
  • "size=N", where N is an integer specifying the size of the + text field.
  • +
  • "maxlength=N", where N is an integer specifying the maximum + length of the string to be input.
  • +
+

Slider

+

Slider is a GUI element for choosing numerical values using a slider. A +property definition that uses this element must also contain a +guiAttribute predicate with both of the following objects:

+
    +
  • "min=N", where N is an integer specifying the minimum value + of the input.
  • +
  • "max=N", where N is an integer specifying the maximum value + of the input.
  • +
+

Spinbox

+

Spinbox is a GUI element for choosing numerical values using a spinbox. A +property definition that uses this element may also contain a +guiAttribute predicate with one or both of the following objects:

+
    +
  • "min=N", where N is an integer specifying the minimum value + of the input.
  • +
  • "max=N", where N is an integer specifying the maximum value + of the input.
  • +
+

Textarea

+

Textarea is a GUI element for editing multi-line unformatted text. A property +definition that uses this element may also contain a guiAttribute +predicate with one or more of the following objects:

+
    +
  • "width=N", where N is a percentage of the window width (an + integer followed by %).
  • +
  • "cols=N", where N is an integer representing the number of + colums in the text entry box.
  • +
  • "rows=N", where N is an integer specifying the height of the + text entry box in rows.
  • +
  • "wrap=W", where W is soft or hard (see + wrap).
  • +
+

Checkbox

+

Checkbox is a GUI element for choosing a boolean value using a checkbox.

+

Fileupload

+

Fileupload is a GUI element for uploading a file.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/03-endpoints/api-admin/groups/index.html b/03-endpoints/api-admin/groups/index.html new file mode 100644 index 0000000000..7647f69db8 --- /dev/null +++ b/03-endpoints/api-admin/groups/index.html @@ -0,0 +1,3210 @@ + + + + + + + + + + + + + + + + + + + + + + + Groups Endpoint - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + +

Groups Endpoint

+

Endpoint Overview

+

Group Operations:

+
    +
  • GET: /admin/groups : return all groups
  • +
  • GET: /admin/groups/<groupIri> : return single group identified by [IRI]
  • +
  • POST: /admin/groups : create a new group
  • +
  • PUT: /admin/groups/<groupIri> : update groups's basic information
  • +
  • PUT: /admin/groups/<groupIri>/status : update group's status
  • +
  • DELETE: /admin/groups/<groupIri> : delete group (set status to false)
  • +
+

Member Operations:

+
    +
  • GET: /admin/groups/<groupIri>/members : return all group members
  • +
+

Group Operations

+

Create Group

+
    +
  • Required permission: SystemAdmin / hasProjectAllAdminPermission + / hasProjectAllGroupAdminPermission
  • +
  • Required information: name (unique inside project), project IRI
  • +
  • Optional information: group descriptions
  • +
  • Returns information about the newly created group
  • +
  • POST: /admin/groups
  • +
  • BODY:
  • +
+
    {
+  "name": "NewGroup",
+  "descriptions": [
+    {
+      "value": "NewGroupDescription",
+      "language": "en"
+    },
+    {
+      "value": "NeueGruppenBeschreibung",
+      "language": "de"
+    }
+  ],
+  "project": "http://rdfh.ch/projects/00FF",
+  "status": true,
+  "selfjoin": false
+}
+
+

Additionally, each group can have an optional custom IRI (of @ref:Knora IRI +form) +specified by the id in the request body as below:

+
    {
+  "id": "http://rdfh.ch/groups/00FF/a95UWs71KUklnFOe1rcw1w",
+  "name": "GroupWithCustomIRI",
+  "descriptions": [
+    {
+      "value": "A new group with a custom IRI",
+      "language": "en"
+    }
+  ],
+  "project": "http://rdfh.ch/projects/00FF",
+  "status": true,
+  "selfjoin": false
+}
+
+

Update group information

+
    +
  • Required permission: SystemAdmin / hasProjectAllAdminPermission + / hasProjectAllGroupAdminPermission / + hasProjectRestrictedGroupAdminPermission (for this group)
  • +
  • Changeable information: name, descriptions, selfjoin
  • +
  • TypeScript Docs: groupFormats - ChangeGroupApiRequestADM
  • +
  • PUT: /admin/groups/<groupIri>
  • +
  • BODY:
  • +
+
{
+  "name": "UpdatedGroupName",
+  "descriptions": [
+    {
+      "value": "UpdatedGroupDescription",
+      "language": "en"
+    }
+  ],
+  "selfjoin": false
+}
+
+

Change Group Status

+
    +
  • Required permission: SystemAdmin / hasProjectAllAdminPermission
  • +
  • Changeable information: status
  • +
  • Remark: Deleting a group, removes all members from the group.
  • +
  • PUT: /admin/groups/<groupIri>/status
  • +
  • BODY:
  • +
+
{
+  "status": false
+}
+
+

Delete Group

+
    +
  • Required permission: SystemAdmin / hasProjectAllAdminPermission
  • +
  • Remark: The same as changing the groups status to + false. To un-delete, set status to true.
  • +
  • DELETE: /admin/groups/<groupIri>
  • +
+

Example Group Information stored in admin named graph: :

+
<http://rdfh.ch/groups/[shortcode]/[UUID]>
+     rdf:type knora-admin:UserGroup ;
+     knora-admin:groupName "Name of the group" ;
+     knora-admin:groupDescriptions "A description of the group"@en ;
+     knora-admin:belongsToProject <http://rdfh.ch/projects/[UUID]> ;
+     knora-admin:status "true"^^xsd:boolean ;
+     knora-admin:hasSelfJoinEnabled "false"^^xsd:boolean .
+
+

Member Operations

+

Get Group Members

+
    +
  • Returns all group members
  • +
  • Required permission: SystemAdmin / ProjectAdmin
  • +
  • GET: /admin/groups/<groupIri>/members
  • +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/03-endpoints/api-admin/index.html b/03-endpoints/api-admin/index.html new file mode 100644 index 0000000000..e905b7331c --- /dev/null +++ b/03-endpoints/api-admin/index.html @@ -0,0 +1,28496 @@ + + + + + + + + + + + + + + + + + + + + + + + OpenApi Documentation - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

We provide an OpenAPI specification for certain endpoints and are working on providing this for all endpoints. +The latest version is located at api.dasch.swiss/api/docs/docs.yaml. +For an interactive documentation of all API endpoints, please visit api.dasch.swiss/api/docs/.

+ + +

webapi-admin-api v30.21.0-12-gf9dcd98

+

Servers

+ + + + + + + + + + + + + + + + + +
DescriptionURL
Local development server + http://localhost:3333 +
Production server + https://api.dasch.swiss +
+ +

Admin Groups

+
+ +

GET /admin/groups

+
+Description +

Return all groups.

+
+

+ Response 200 OK +

+ +
+
+
+
{
+    "groups": [
+        {
+            "id": "http://rdfh.ch/groups/0042/a95UWs71KUklnFOe1rcw1w",
+            "name": "NewGroup",
+            "descriptions": [
+                {
+                    "value": "NewGroup description in English",
+                    "language": "en"
+                },
+                {
+                    "value": "NewGroup Beschreibung auf Deutsch",
+                    "language": "de"
+                }
+            ],
+            "project": {
+                "id": "http://rdfh.ch/projects/0042",
+                "shortname": "example",
+                "shortcode": "0001",
+                "longname": "Example Project",
+                "description": [
+                    {
+                        "value": "An example project",
+                        "language": "en"
+                    }
+                ],
+                "keywords": [
+                    "example",
+                    "project"
+                ],
+                "ontologies": [],
+                "status": true,
+                "selfjoin": false,
+                "copyrightAttribution": "2024, Example Project",
+                "license": "CC-BY-4.0"
+            },
+            "status": true,
+            "selfjoin": false
+        }
+    ]
+}
+
+
+Schema of the response body +
{
+    "title": "GroupsGetResponseADM",
+    "type": "object",
+    "properties": {
+        "groups": {
+            "type": "array",
+            "items": {
+                "$ref": "#/components/schemas/Group"
+            }
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

POST /admin/groups

+
+Description +

Required permissions: User must SystemAdmin or ProjectAdmin of the +project the group is created in.

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
httpAuth1headerstringN/ANoBasic authentication
httpAuthheaderstringN/ANoJWT Bearer token
KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9cookiestringNo
+

Request body

+ +
+
+
+
{
+    "name": "NewGroup",
+    "descriptions": [
+        {
+            "value": "NewGroup description in English",
+            "language": "en"
+        },
+        {
+            "value": "NewGroup Beschreibung auf Deutsch",
+            "language": "de"
+        }
+    ],
+    "project": "http://rdfh.ch/projects/0042",
+    "status": true,
+    "selfjoin": false
+}
+
+
+Schema of the request body +
{
+    "title": "GroupCreateRequest",
+    "type": "object",
+    "required": [
+        "name",
+        "descriptions",
+        "project",
+        "status",
+        "selfjoin"
+    ],
+    "properties": {
+        "id": {
+            "$ref": "#/components/schemas/GroupIri"
+        },
+        "name": {
+            "$ref": "#/components/schemas/GroupName"
+        },
+        "descriptions": {
+            "$ref": "#/components/schemas/GroupDescriptions"
+        },
+        "project": {
+            "$ref": "#/components/schemas/ProjectIri"
+        },
+        "status": {
+            "$ref": "#/components/schemas/GroupStatus"
+        },
+        "selfjoin": {
+            "$ref": "#/components/schemas/GroupSelfJoin"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 200 OK +

+ +
+
+
+
{
+    "group": {
+        "id": "http://rdfh.ch/groups/0042/a95UWs71KUklnFOe1rcw1w",
+        "name": "NewGroup",
+        "descriptions": [
+            {
+                "value": "NewGroup description in English",
+                "language": "en"
+            },
+            {
+                "value": "NewGroup Beschreibung auf Deutsch",
+                "language": "de"
+            }
+        ],
+        "project": {
+            "id": "http://rdfh.ch/projects/0042",
+            "shortname": "example",
+            "shortcode": "0001",
+            "longname": "Example Project",
+            "description": [
+                {
+                    "value": "An example project",
+                    "language": "en"
+                }
+            ],
+            "keywords": [
+                "example",
+                "project"
+            ],
+            "ontologies": [],
+            "status": true,
+            "selfjoin": false,
+            "copyrightAttribution": "2024, Example Project",
+            "license": "CC-BY-4.0"
+        },
+        "status": true,
+        "selfjoin": false
+    }
+}
+
+
+Schema of the response body +
{
+    "title": "GroupGetResponseADM",
+    "type": "object",
+    "required": [
+        "group"
+    ],
+    "properties": {
+        "group": {
+            "$ref": "#/components/schemas/Group"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

GET /admin/groups/{groupIri}

+
+Description +

Return a single group identified by its IRI.

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
groupIripathstringNoThe IRI of a group. Must be URL-encoded.
+ +

+ Response 200 OK +

+ +
+
+
+
{
+    "group": {
+        "id": "http://rdfh.ch/groups/0042/a95UWs71KUklnFOe1rcw1w",
+        "name": "NewGroup",
+        "descriptions": [
+            {
+                "value": "NewGroup description in English",
+                "language": "en"
+            },
+            {
+                "value": "NewGroup Beschreibung auf Deutsch",
+                "language": "de"
+            }
+        ],
+        "project": {
+            "id": "http://rdfh.ch/projects/0042",
+            "shortname": "example",
+            "shortcode": "0001",
+            "longname": "Example Project",
+            "description": [
+                {
+                    "value": "An example project",
+                    "language": "en"
+                }
+            ],
+            "keywords": [
+                "example",
+                "project"
+            ],
+            "ontologies": [],
+            "status": true,
+            "selfjoin": false,
+            "copyrightAttribution": "2024, Example Project",
+            "license": "CC-BY-4.0"
+        },
+        "status": true,
+        "selfjoin": false
+    }
+}
+
+
+Schema of the response body +
{
+    "title": "GroupGetResponseADM",
+    "type": "object",
+    "required": [
+        "group"
+    ],
+    "properties": {
+        "group": {
+            "$ref": "#/components/schemas/Group"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

PUT /admin/groups/{groupIri}

+
+Description +

Update a group's basic information.

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
httpAuth1headerstringN/ANoBasic authentication
httpAuthheaderstringN/ANoJWT Bearer token
groupIripathstringNoThe IRI of a group. Must be URL-encoded.
KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9cookiestringNo
+

Request body

+ +
+
+
+
{
+    "name": "NewGroupNewName",
+    "descriptions": [
+        {
+            "value": "NewGroupNewName description in English",
+            "language": "en"
+        },
+        {
+            "value": "NewGroupNewName Beschreibung auf Deutsch",
+            "language": "de"
+        }
+    ],
+    "status": false,
+    "selfjoin": true
+}
+
+
+Schema of the request body +
{
+    "title": "GroupUpdateRequest",
+    "type": "object",
+    "properties": {
+        "name": {
+            "$ref": "#/components/schemas/GroupName"
+        },
+        "descriptions": {
+            "$ref": "#/components/schemas/GroupDescriptions"
+        },
+        "status": {
+            "$ref": "#/components/schemas/GroupStatus"
+        },
+        "selfjoin": {
+            "$ref": "#/components/schemas/GroupSelfJoin"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 200 OK +

+ +
+
+
+
{
+    "group": {
+        "id": "http://rdfh.ch/groups/0042/a95UWs71KUklnFOe1rcw1w",
+        "name": "NewGroup",
+        "descriptions": [
+            {
+                "value": "NewGroup description in English",
+                "language": "en"
+            },
+            {
+                "value": "NewGroup Beschreibung auf Deutsch",
+                "language": "de"
+            }
+        ],
+        "project": {
+            "id": "http://rdfh.ch/projects/0042",
+            "shortname": "example",
+            "shortcode": "0001",
+            "longname": "Example Project",
+            "description": [
+                {
+                    "value": "An example project",
+                    "language": "en"
+                }
+            ],
+            "keywords": [
+                "example",
+                "project"
+            ],
+            "ontologies": [],
+            "status": true,
+            "selfjoin": false,
+            "copyrightAttribution": "2024, Example Project",
+            "license": "CC-BY-4.0"
+        },
+        "status": true,
+        "selfjoin": false
+    }
+}
+
+
+Schema of the response body +
{
+    "title": "GroupGetResponseADM",
+    "type": "object",
+    "required": [
+        "group"
+    ],
+    "properties": {
+        "group": {
+            "$ref": "#/components/schemas/Group"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

DELETE /admin/groups/{groupIri}

+
+Description +

Deletes a group by changing its status to 'false'.

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
httpAuth1headerstringN/ANoBasic authentication
httpAuthheaderstringN/ANoJWT Bearer token
groupIripathstringNoThe IRI of a group. Must be URL-encoded.
KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9cookiestringNo
+ +

+ Response 200 OK +

+ +
+
+
+
{
+    "group": {
+        "id": "http://rdfh.ch/groups/0042/a95UWs71KUklnFOe1rcw1w",
+        "name": "NewGroup",
+        "descriptions": [
+            {
+                "value": "NewGroup description in English",
+                "language": "en"
+            },
+            {
+                "value": "NewGroup Beschreibung auf Deutsch",
+                "language": "de"
+            }
+        ],
+        "project": {
+            "id": "http://rdfh.ch/projects/0042",
+            "shortname": "example",
+            "shortcode": "0001",
+            "longname": "Example Project",
+            "description": [
+                {
+                    "value": "An example project",
+                    "language": "en"
+                }
+            ],
+            "keywords": [
+                "example",
+                "project"
+            ],
+            "ontologies": [],
+            "status": true,
+            "selfjoin": false,
+            "copyrightAttribution": "2024, Example Project",
+            "license": "CC-BY-4.0"
+        },
+        "status": true,
+        "selfjoin": false
+    }
+}
+
+
+Schema of the response body +
{
+    "title": "GroupGetResponseADM",
+    "type": "object",
+    "required": [
+        "group"
+    ],
+    "properties": {
+        "group": {
+            "$ref": "#/components/schemas/Group"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

GET /admin/groups/{groupIri}/members

+
+Description +

Return all members of a single group.

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
httpAuth1headerstringN/ANoBasic authentication
httpAuthheaderstringN/ANoJWT Bearer token
groupIripathstringNoThe IRI of a group. Must be URL-encoded.
KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9cookiestringNo
+ +

+ Response 200 OK +

+ +
+
+
+
{
+    "members": [
+        {
+            "id": "http://rdfh.ch/users/0001",
+            "username": "username",
+            "email": "user@exampl.com",
+            "givenName": "Jane",
+            "familyName": "Doe",
+            "status": true,
+            "lang": "rm",
+            "groups": [
+                {
+                    "id": "http://rdfh.ch/groups/0042/a95UWs71KUklnFOe1rcw1w",
+                    "name": "NewGroup",
+                    "descriptions": [
+                        {
+                            "value": "NewGroup description in English",
+                            "language": "en"
+                        },
+                        {
+                            "value": "NewGroup Beschreibung auf Deutsch",
+                            "language": "de"
+                        }
+                    ],
+                    "project": {
+                        "id": "http://rdfh.ch/projects/0042",
+                        "shortname": "example",
+                        "shortcode": "0001",
+                        "longname": "Example Project",
+                        "description": [
+                            {
+                                "value": "An example project",
+                                "language": "en"
+                            }
+                        ],
+                        "keywords": [
+                            "example",
+                            "project"
+                        ],
+                        "ontologies": [],
+                        "status": true,
+                        "selfjoin": false,
+                        "copyrightAttribution": "2024, Example Project",
+                        "license": "CC-BY-4.0"
+                    },
+                    "status": true,
+                    "selfjoin": false
+                }
+            ],
+            "projects": [
+                {
+                    "id": "http://rdfh.ch/projects/0042",
+                    "shortname": "example",
+                    "shortcode": "0001",
+                    "longname": "Example Project",
+                    "description": [
+                        {
+                            "value": "An example project",
+                            "language": "en"
+                        }
+                    ],
+                    "keywords": [
+                        "example",
+                        "project"
+                    ],
+                    "ontologies": [],
+                    "status": true,
+                    "selfjoin": false,
+                    "copyrightAttribution": "2024, Example Project",
+                    "license": "CC-BY-4.0"
+                }
+            ],
+            "permissions": {
+                "groupsPerProject": {},
+                "administrativePermissionsPerProject": {}
+            }
+        }
+    ]
+}
+
+
+Schema of the response body +
{
+    "title": "GroupMembersGetResponseADM",
+    "type": "object",
+    "properties": {
+        "members": {
+            "type": "array",
+            "items": {
+                "$ref": "#/components/schemas/User"
+            }
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

PUT /admin/groups/{groupIri}/status

+
+Description +

Updates a group's status.

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
httpAuth1headerstringN/ANoBasic authentication
httpAuthheaderstringN/ANoJWT Bearer token
groupIripathstringNoThe IRI of a group. Must be URL-encoded.
KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9cookiestringNo
+

Request body

+ +
+
+
+

{
+    "status": {
+        "value": true
+    }
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the request body +
{
+    "title": "GroupStatusUpdateRequest",
+    "type": "object",
+    "required": [
+        "status"
+    ],
+    "properties": {
+        "status": {
+            "$ref": "#/components/schemas/GroupStatus"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 200 OK +

+ +
+
+
+
{
+    "group": {
+        "id": "http://rdfh.ch/groups/0042/a95UWs71KUklnFOe1rcw1w",
+        "name": "NewGroup",
+        "descriptions": [
+            {
+                "value": "NewGroup description in English",
+                "language": "en"
+            },
+            {
+                "value": "NewGroup Beschreibung auf Deutsch",
+                "language": "de"
+            }
+        ],
+        "project": {
+            "id": "http://rdfh.ch/projects/0042",
+            "shortname": "example",
+            "shortcode": "0001",
+            "longname": "Example Project",
+            "description": [
+                {
+                    "value": "An example project",
+                    "language": "en"
+                }
+            ],
+            "keywords": [
+                "example",
+                "project"
+            ],
+            "ontologies": [],
+            "status": true,
+            "selfjoin": false,
+            "copyrightAttribution": "2024, Example Project",
+            "license": "CC-BY-4.0"
+        },
+        "status": true,
+        "selfjoin": false
+    }
+}
+
+
+Schema of the response body +
{
+    "title": "GroupGetResponseADM",
+    "type": "object",
+    "required": [
+        "group"
+    ],
+    "properties": {
+        "group": {
+            "$ref": "#/components/schemas/Group"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

Admin Lists

+
+ +

GET /admin/lists

+
+Description +

Get all lists or all lists belonging to a project. Note that you can provide +either a project IRI or a project shortcode.

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
projectIriquerystringNoThe (optional) IRI of the project.
projectShortcodequerystringNoThe (optional) shortcode of the project.
+ +

+ Response 200 OK +

+ +
+
+
+

{
+    "lists": [
+        {
+            "id": "string",
+            "projectIri": "string",
+            "name": "string",
+            "labels": {
+                "stringLiterals": [
+                    {
+                        "value": "string",
+                        "language": "string"
+                    }
+                ]
+            },
+            "comments": null,
+            "isRootNode": true
+        }
+    ]
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ListsGetResponseADM",
+    "type": "object",
+    "properties": {
+        "lists": {
+            "type": "array",
+            "items": {
+                "$ref": "#/components/schemas/ListRootNodeInfoADM"
+            }
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

POST /admin/lists

+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
httpAuth1headerstringN/ANoBasic authentication
httpAuthheaderstringN/ANoJWT Bearer token
KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9cookiestringNo
+

Request body

+ +
+
+
+

{
+    "id": {
+        "value": "string"
+    },
+    "comments": {
+        "value": [
+            {
+                "value": "string",
+                "language": "string"
+            }
+        ]
+    },
+    "labels": {
+        "value": null
+    },
+    "name": {
+        "value": "string"
+    },
+    "projectIri": {
+        "value": "string"
+    }
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the request body +
{
+    "title": "ListCreateRootNodeRequest",
+    "type": "object",
+    "required": [
+        "comments",
+        "labels",
+        "projectIri"
+    ],
+    "properties": {
+        "id": {
+            "$ref": "#/components/schemas/ListIri"
+        },
+        "comments": {
+            "$ref": "#/components/schemas/Comments"
+        },
+        "labels": {
+            "$ref": "#/components/schemas/Labels"
+        },
+        "name": {
+            "$ref": "#/components/schemas/ListName"
+        },
+        "projectIri": {
+            "$ref": "#/components/schemas/ProjectIri"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 200 OK +

+ +
+
+
+

{
+    "list": {
+        "listinfo": {
+            "id": "string",
+            "projectIri": "string",
+            "name": "string",
+            "labels": {
+                "stringLiterals": [
+                    {
+                        "value": "string",
+                        "language": "string"
+                    }
+                ]
+            },
+            "comments": null,
+            "isRootNode": true
+        },
+        "children": [
+            {
+                "id": "string",
+                "name": "string",
+                "labels": null,
+                "comments": null,
+                "position": 44,
+                "hasRootNode": "string",
+                "children": null
+            }
+        ]
+    }
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ListGetResponseADM",
+    "type": "object",
+    "required": [
+        "list"
+    ],
+    "properties": {
+        "list": {
+            "$ref": "#/components/schemas/ListADM"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

PUT /admin/lists/{p1}/name

+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
httpAuth1headerstringN/ANoBasic authentication
httpAuthheaderstringN/ANoJWT Bearer token
KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9cookiestringNo
p1pathstringNoThe IRI of the list.
+

Request body

+ +
+
+
+

{
+    "name": {
+        "value": "string"
+    }
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the request body +
{
+    "title": "ListChangeNameRequest",
+    "type": "object",
+    "required": [
+        "name"
+    ],
+    "properties": {
+        "name": {
+            "$ref": "#/components/schemas/ListName"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 200 OK +

+ +
+
+
+
+Schema of the response body +
{
+    "title": "NodeInfoGetResponseADM",
+    "oneOf": [
+        {
+            "$ref": "#/components/schemas/ChildNodeInfoGetResponseADM"
+        },
+        {
+            "$ref": "#/components/schemas/RootNodeInfoGetResponseADM"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

PUT /admin/lists/{p1}/labels

+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
httpAuth1headerstringN/ANoBasic authentication
httpAuthheaderstringN/ANoJWT Bearer token
KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9cookiestringNo
p1pathstringNoThe IRI of the list.
+

Request body

+ +
+
+
+

{
+    "labels": {
+        "value": [
+            {
+                "value": "string",
+                "language": "string"
+            }
+        ]
+    }
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the request body +
{
+    "title": "ListChangeLabelsRequest",
+    "type": "object",
+    "required": [
+        "labels"
+    ],
+    "properties": {
+        "labels": {
+            "$ref": "#/components/schemas/Labels"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 200 OK +

+ +
+
+
+
+Schema of the response body +
{
+    "title": "NodeInfoGetResponseADM",
+    "oneOf": [
+        {
+            "$ref": "#/components/schemas/ChildNodeInfoGetResponseADM"
+        },
+        {
+            "$ref": "#/components/schemas/RootNodeInfoGetResponseADM"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

PUT /admin/lists/{p1}/comments

+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
httpAuth1headerstringN/ANoBasic authentication
httpAuthheaderstringN/ANoJWT Bearer token
KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9cookiestringNo
p1pathstringNoThe IRI of the list.
+

Request body

+ +
+
+
+

{
+    "comments": {
+        "value": [
+            {
+                "value": "string",
+                "language": "string"
+            }
+        ]
+    }
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the request body +
{
+    "title": "ListChangeCommentsRequest",
+    "type": "object",
+    "required": [
+        "comments"
+    ],
+    "properties": {
+        "comments": {
+            "$ref": "#/components/schemas/Comments"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 200 OK +

+ +
+
+
+
+Schema of the response body +
{
+    "title": "NodeInfoGetResponseADM",
+    "oneOf": [
+        {
+            "$ref": "#/components/schemas/ChildNodeInfoGetResponseADM"
+        },
+        {
+            "$ref": "#/components/schemas/RootNodeInfoGetResponseADM"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

PUT /admin/lists/{p1}/position

+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
httpAuth1headerstringN/ANoBasic authentication
httpAuthheaderstringN/ANoJWT Bearer token
KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9cookiestringNo
p1pathstringNoThe IRI of the list.
+

Request body

+ +
+
+
+

{
+    "position": {
+        "value": 26
+    },
+    "parentNodeIri": {
+        "value": "string"
+    }
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the request body +
{
+    "title": "ListChangePositionRequest",
+    "type": "object",
+    "required": [
+        "position",
+        "parentNodeIri"
+    ],
+    "properties": {
+        "position": {
+            "$ref": "#/components/schemas/Position"
+        },
+        "parentNodeIri": {
+            "$ref": "#/components/schemas/ListIri"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 200 OK +

+ +
+
+
+

{
+    "node": null
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NodePositionChangeResponseADM",
+    "type": "object",
+    "required": [
+        "node"
+    ],
+    "properties": {
+        "node": {
+            "$ref": "#/components/schemas/ListNodeADM"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

GET /admin/lists/{p1}

+
+Description +

Returns a list node, root or child, with children (if exist).

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
p1pathstringNoThe IRI of the list.
+ +

+ Response 200 OK +

+ +
+
+
+
+Schema of the response body +
{
+    "title": "ListItemGetResponseADM",
+    "oneOf": [
+        {
+            "$ref": "#/components/schemas/ListGetResponseADM"
+        },
+        {
+            "$ref": "#/components/schemas/ListNodeGetResponseADM"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

PUT /admin/lists/{p1}

+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
httpAuth1headerstringN/ANoBasic authentication
httpAuthheaderstringN/ANoJWT Bearer token
KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9cookiestringNo
p1pathstringNoThe IRI of the list.
+

Request body

+ +
+
+
+

{
+    "listIri": {
+        "value": "string"
+    },
+    "projectIri": {
+        "value": "string"
+    },
+    "hasRootNode": null,
+    "position": {
+        "value": 111
+    },
+    "name": {
+        "value": "string"
+    },
+    "labels": {
+        "value": [
+            {
+                "value": "string",
+                "language": "string"
+            }
+        ]
+    },
+    "comments": {
+        "value": null
+    }
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the request body +
{
+    "title": "ListChangeRequest",
+    "type": "object",
+    "required": [
+        "listIri",
+        "projectIri"
+    ],
+    "properties": {
+        "listIri": {
+            "$ref": "#/components/schemas/ListIri"
+        },
+        "projectIri": {
+            "$ref": "#/components/schemas/ProjectIri"
+        },
+        "hasRootNode": {
+            "$ref": "#/components/schemas/ListIri"
+        },
+        "position": {
+            "$ref": "#/components/schemas/Position"
+        },
+        "name": {
+            "$ref": "#/components/schemas/ListName"
+        },
+        "labels": {
+            "$ref": "#/components/schemas/Labels"
+        },
+        "comments": {
+            "$ref": "#/components/schemas/Comments"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 200 OK +

+ +
+
+
+
+Schema of the response body +
{
+    "title": "NodeInfoGetResponseADM",
+    "oneOf": [
+        {
+            "$ref": "#/components/schemas/ChildNodeInfoGetResponseADM"
+        },
+        {
+            "$ref": "#/components/schemas/RootNodeInfoGetResponseADM"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

DELETE /admin/lists/{p1}

+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
httpAuth1headerstringN/ANoBasic authentication
httpAuthheaderstringN/ANoJWT Bearer token
KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9cookiestringNo
p1pathstringNoThe IRI of the list.
+ +

+ Response 200 OK +

+ +
+
+
+
+Schema of the response body +
{
+    "title": "ListItemDeleteResponseADM",
+    "oneOf": [
+        {
+            "$ref": "#/components/schemas/ChildNodeDeleteResponseADM"
+        },
+        {
+            "$ref": "#/components/schemas/ListDeleteResponseADM"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

DELETE /admin/lists/comments/{p1}

+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
httpAuth1headerstringN/ANoBasic authentication
httpAuthheaderstringN/ANoJWT Bearer token
KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9cookiestringNo
p1pathstringNoThe IRI of the list.
+ +

+ Response 200 OK +

+ +
+
+
+

{
+    "nodeIri": "string",
+    "commentsDeleted": true
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ListNodeCommentsDeleteResponseADM",
+    "type": "object",
+    "required": [
+        "nodeIri",
+        "commentsDeleted"
+    ],
+    "properties": {
+        "nodeIri": {
+            "type": "string"
+        },
+        "commentsDeleted": {
+            "type": "boolean"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

GET /admin/lists/{p1}/info

+
+Description +

Returns basic information about a list node, root or child, w/o children (if +exist).

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
p1pathstringNoThe IRI of the list.
+ +

+ Response 200 OK +

+ +
+
+
+
+Schema of the response body +
{
+    "title": "NodeInfoGetResponseADM",
+    "oneOf": [
+        {
+            "$ref": "#/components/schemas/ChildNodeInfoGetResponseADM"
+        },
+        {
+            "$ref": "#/components/schemas/RootNodeInfoGetResponseADM"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

GET /admin/lists/candelete/{p1}

+
+Description +

Checks if a list can be deleted (none of its nodes is used in data).

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
p1pathstringNoThe IRI of the list.
+ +

+ Response 200 OK +

+ +
+
+
+

{
+    "listIri": "string",
+    "canDeleteList": true
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "CanDeleteListResponseADM",
+    "type": "object",
+    "required": [
+        "listIri",
+        "canDeleteList"
+    ],
+    "properties": {
+        "listIri": {
+            "type": "string"
+        },
+        "canDeleteList": {
+            "type": "boolean"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

Admin Maintenance

+
+ +

POST /admin/maintenance/{action-name}

+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
httpAuth1headerstringN/ANoBasic authentication
httpAuthheaderstringN/ANoJWT Bearer token
action-namepathstringNoThe name of the maintenance action to be executed. +Maintenance actions are executed asynchronously in the background. +
KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9cookiestringNo
+

Request body

+ +
+
+
+

"string"
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the request body +
{
+    "type": "string"
+}
+
+
+
+
+
+

+ Response 202 Accepted +

+ +

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

Admin Permissions

+
+ +

POST /admin/permissions/ap

+
+Description +

Create a new administrative permission

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
httpAuth1headerstringN/ANoBasic authentication
httpAuthheaderstringN/ANoJWT Bearer token
KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9cookiestringNo
+

Request body

+ +
+
+
+

{
+    "id": "string",
+    "forProject": "string",
+    "forGroup": "string",
+    "hasPermissions": [
+        {
+            "name": "string",
+            "additionalInformation": "string",
+            "permissionCode": 212
+        }
+    ]
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the request body +
{
+    "title": "CreateAdministrativePermissionAPIRequestADM",
+    "type": "object",
+    "required": [
+        "forProject",
+        "forGroup"
+    ],
+    "properties": {
+        "id": {
+            "type": "string"
+        },
+        "forProject": {
+            "type": "string"
+        },
+        "forGroup": {
+            "type": "string"
+        },
+        "hasPermissions": {
+            "type": "array",
+            "uniqueItems": true,
+            "items": {
+                "$ref": "#/components/schemas/PermissionADM"
+            }
+        }
+    }
+}
+
+
+
+
+
+

+ Response 200 OK +

+ +
+
+
+

{
+    "administrativePermission": {
+        "iri": "string",
+        "forProject": "string",
+        "forGroup": "string",
+        "hasPermissions": [
+            {
+                "name": "string",
+                "additionalInformation": "string",
+                "permissionCode": 213
+            }
+        ]
+    }
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "AdministrativePermissionCreateResponseADM",
+    "type": "object",
+    "required": [
+        "administrativePermission"
+    ],
+    "properties": {
+        "administrativePermission": {
+            "$ref": "#/components/schemas/AdministrativePermissionADM"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

GET /admin/permissions/ap/{projectIri}

+
+Description +

Get all administrative permissions for a project.

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
httpAuth1headerstringN/ANoBasic authentication
httpAuthheaderstringN/ANoJWT Bearer token
KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9cookiestringNo
projectIripathstringNoThe IRI of a project. Must be URL-encoded.
+ +

+ Response 200 OK +

+ +
+
+
+

{
+    "administrativePermissions": [
+        {
+            "iri": "string",
+            "forProject": "string",
+            "forGroup": "string",
+            "hasPermissions": [
+                {
+                    "name": "string",
+                    "additionalInformation": "string",
+                    "permissionCode": 126
+                }
+            ]
+        }
+    ]
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "AdministrativePermissionsForProjectGetResponseADM",
+    "type": "object",
+    "properties": {
+        "administrativePermissions": {
+            "type": "array",
+            "items": {
+                "$ref": "#/components/schemas/AdministrativePermissionADM"
+            }
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

GET /admin/permissions/ap/{projectIri}/{groupIri}

+
+Description +

Get all administrative permissions for a project and a group.

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
httpAuth1headerstringN/ANoBasic authentication
httpAuthheaderstringN/ANoJWT Bearer token
groupIripathstringNoThe IRI of a group. Must be URL-encoded.
KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9cookiestringNo
projectIripathstringNoThe IRI of a project. Must be URL-encoded.
+ +

+ Response 200 OK +

+ +
+
+
+

{
+    "administrativePermission": {
+        "iri": "string",
+        "forProject": "string",
+        "forGroup": "string",
+        "hasPermissions": [
+            {
+                "name": "string",
+                "additionalInformation": "string",
+                "permissionCode": 82
+            }
+        ]
+    }
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "AdministrativePermissionGetResponseADM",
+    "type": "object",
+    "required": [
+        "administrativePermission"
+    ],
+    "properties": {
+        "administrativePermission": {
+            "$ref": "#/components/schemas/AdministrativePermissionADM"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

GET /admin/permissions/doap/{projectIri}

+
+Description +

Get all default object access permissions for a project.

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
httpAuth1headerstringN/ANoBasic authentication
httpAuthheaderstringN/ANoJWT Bearer token
KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9cookiestringNo
projectIripathstringNoThe IRI of a project. Must be URL-encoded.
+ +

+ Response 200 OK +

+ +
+
+
+

{
+    "defaultObjectAccessPermissions": [
+        {
+            "iri": "string",
+            "forProject": "string",
+            "forGroup": "string",
+            "forResourceClass": "string",
+            "forProperty": "string",
+            "hasPermissions": [
+                {
+                    "name": "string",
+                    "additionalInformation": "string",
+                    "permissionCode": 127
+                }
+            ]
+        }
+    ]
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "DefaultObjectAccessPermissionsForProjectGetResponseADM",
+    "type": "object",
+    "properties": {
+        "defaultObjectAccessPermissions": {
+            "type": "array",
+            "items": {
+                "$ref": "#/components/schemas/DefaultObjectAccessPermissionADM"
+            }
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

GET /admin/permissions/{projectIri}

+
+Description +

Get all permissions for a project.

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
httpAuth1headerstringN/ANoBasic authentication
httpAuthheaderstringN/ANoJWT Bearer token
KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9cookiestringNo
projectIripathstringNoThe IRI of a project. Must be URL-encoded.
+ +

+ Response 200 OK +

+ +
+
+
+

{
+    "permissions": [
+        {
+            "iri": "string",
+            "permissionType": "string"
+        }
+    ]
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "PermissionsForProjectGetResponseADM",
+    "type": "object",
+    "properties": {
+        "permissions": {
+            "type": "array",
+            "uniqueItems": true,
+            "items": {
+                "$ref": "#/components/schemas/PermissionInfoADM"
+            }
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

DELETE /admin/permissions/{permissionIri}

+
+Description +

Delete an permission.

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
httpAuth1headerstringN/ANoBasic authentication
httpAuthheaderstringN/ANoJWT Bearer token
KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9cookiestringNo
permissionIripathstringNoThe IRI of a permission. Must be URL-encoded.
+ +

+ Response 200 OK +

+ +
+
+
+

{
+    "permissionIri": "string",
+    "deleted": true
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "PermissionDeleteResponseADM",
+    "type": "object",
+    "required": [
+        "permissionIri",
+        "deleted"
+    ],
+    "properties": {
+        "permissionIri": {
+            "type": "string"
+        },
+        "deleted": {
+            "type": "boolean"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

POST /admin/permissions/doap

+
+Description +

Create a new default object access permission

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
httpAuth1headerstringN/ANoBasic authentication
httpAuthheaderstringN/ANoJWT Bearer token
KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9cookiestringNo
+

Request body

+ +
+
+
+

{
+    "id": "string",
+    "forProject": "string",
+    "forGroup": "string",
+    "forResourceClass": "string",
+    "forProperty": "string",
+    "hasPermissions": [
+        {
+            "name": "string",
+            "additionalInformation": "string",
+            "permissionCode": 179
+        }
+    ]
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the request body +
{
+    "title": "CreateDefaultObjectAccessPermissionAPIRequestADM",
+    "type": "object",
+    "required": [
+        "forProject"
+    ],
+    "properties": {
+        "id": {
+            "type": "string"
+        },
+        "forProject": {
+            "type": "string"
+        },
+        "forGroup": {
+            "type": "string"
+        },
+        "forResourceClass": {
+            "type": "string"
+        },
+        "forProperty": {
+            "type": "string"
+        },
+        "hasPermissions": {
+            "type": "array",
+            "uniqueItems": true,
+            "items": {
+                "$ref": "#/components/schemas/PermissionADM"
+            }
+        }
+    }
+}
+
+
+
+
+
+

+ Response 200 OK +

+ +
+
+
+

{
+    "defaultObjectAccessPermission": {
+        "iri": "string",
+        "forProject": "string",
+        "forGroup": "string",
+        "forResourceClass": "string",
+        "forProperty": "string",
+        "hasPermissions": [
+            {
+                "name": "string",
+                "additionalInformation": "string",
+                "permissionCode": 187
+            }
+        ]
+    }
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "DefaultObjectAccessPermissionCreateResponseADM",
+    "type": "object",
+    "required": [
+        "defaultObjectAccessPermission"
+    ],
+    "properties": {
+        "defaultObjectAccessPermission": {
+            "$ref": "#/components/schemas/DefaultObjectAccessPermissionADM"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

PUT /admin/permissions/doap/{permissionIri}

+
+Description +

Update an existing default object access permission. The request may update +the hasPermission and/or any allowed combination of group, resource class +and property for the permission.

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
httpAuth1headerstringN/ANoBasic authentication
httpAuthheaderstringN/ANoJWT Bearer token
KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9cookiestringNo
permissionIripathstringNoThe IRI of a permission. Must be URL-encoded.
+

Request body

+ +
+
+
+
{
+    "forGroup": "http://www.knora.org/ontology/knora-admin#ProjectMember"
+}
+
+
{
+    "forResourceClass": "http://api.dasch.swiss/ontology/0803/incunabula/v2#bild",
+    "forProperty": "http://api.dasch.swiss/ontology/0803/incunabula/v2#pagenum"
+}
+
+
+Schema of the request body +
{
+    "title": "ChangeDoapRequest",
+    "type": "object",
+    "properties": {
+        "forGroup": {
+            "type": "string"
+        },
+        "forResourceClass": {
+            "type": "string"
+        },
+        "forProperty": {
+            "type": "string"
+        },
+        "hasPermissions": {
+            "type": "array",
+            "uniqueItems": true,
+            "items": {
+                "$ref": "#/components/schemas/PermissionADM"
+            }
+        }
+    }
+}
+
+
+
+
+
+

+ Response 200 OK +

+ +
+
+
+

{
+    "defaultObjectAccessPermission": {
+        "iri": "string",
+        "forProject": "string",
+        "forGroup": "string",
+        "forResourceClass": "string",
+        "forProperty": "string",
+        "hasPermissions": [
+            {
+                "name": "string",
+                "additionalInformation": "string",
+                "permissionCode": 153
+            }
+        ]
+    }
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "DefaultObjectAccessPermissionGetResponseADM",
+    "type": "object",
+    "required": [
+        "defaultObjectAccessPermission"
+    ],
+    "properties": {
+        "defaultObjectAccessPermission": {
+            "$ref": "#/components/schemas/DefaultObjectAccessPermissionADM"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

PUT /admin/permissions/{permissionIri}/group

+
+Description +

Update a permission's group

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
httpAuth1headerstringN/ANoBasic authentication
httpAuthheaderstringN/ANoJWT Bearer token
KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9cookiestringNo
permissionIripathstringNoThe IRI of a permission. Must be URL-encoded.
+

Request body

+ +
+
+
+

{
+    "forGroup": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the request body +
{
+    "title": "ChangePermissionGroupApiRequestADM",
+    "type": "object",
+    "required": [
+        "forGroup"
+    ],
+    "properties": {
+        "forGroup": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 200 OK +

+ +
+
+
+
+Schema of the response body +
{
+    "title": "PermissionGetResponseADM",
+    "oneOf": [
+        {
+            "$ref": "#/components/schemas/AdministrativePermissionGetResponseADM"
+        },
+        {
+            "$ref": "#/components/schemas/DefaultObjectAccessPermissionGetResponseADM"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

PUT /admin/permissions/{permissionIri}/hasPermissions

+
+Description +

Update a permission's set of hasPermissions

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
httpAuth1headerstringN/ANoBasic authentication
httpAuthheaderstringN/ANoJWT Bearer token
KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9cookiestringNo
permissionIripathstringNoThe IRI of a permission. Must be URL-encoded.
+

Request body

+ +
+
+
+

{
+    "hasPermissions": [
+        {
+            "name": "string",
+            "additionalInformation": "string",
+            "permissionCode": 251
+        }
+    ]
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the request body +
{
+    "title": "ChangePermissionHasPermissionsApiRequestADM",
+    "type": "object",
+    "properties": {
+        "hasPermissions": {
+            "type": "array",
+            "uniqueItems": true,
+            "items": {
+                "$ref": "#/components/schemas/PermissionADM"
+            }
+        }
+    }
+}
+
+
+
+
+
+

+ Response 200 OK +

+ +
+
+
+
+Schema of the response body +
{
+    "title": "PermissionGetResponseADM",
+    "oneOf": [
+        {
+            "$ref": "#/components/schemas/AdministrativePermissionGetResponseADM"
+        },
+        {
+            "$ref": "#/components/schemas/DefaultObjectAccessPermissionGetResponseADM"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

PUT /admin/permissions/{permissionIri}/resourceClass

+
+Description +

Update a DOAP's resource class. Use PUT +/admin/permissions/doap/{permissionIri} instead.

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
httpAuth1headerstringN/ANoBasic authentication
httpAuthheaderstringN/ANoJWT Bearer token
KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9cookiestringNo
permissionIripathstringNoThe IRI of a permission. Must be URL-encoded.
+

Request body

+ +
+
+
+

{
+    "forResourceClass": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the request body +
{
+    "title": "ChangePermissionResourceClassApiRequestADM",
+    "type": "object",
+    "required": [
+        "forResourceClass"
+    ],
+    "properties": {
+        "forResourceClass": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 200 OK +

+ +
+
+
+

{
+    "defaultObjectAccessPermission": {
+        "iri": "string",
+        "forProject": "string",
+        "forGroup": "string",
+        "forResourceClass": "string",
+        "forProperty": "string",
+        "hasPermissions": [
+            {
+                "name": "string",
+                "additionalInformation": "string",
+                "permissionCode": 236
+            }
+        ]
+    }
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "DefaultObjectAccessPermissionGetResponseADM",
+    "type": "object",
+    "required": [
+        "defaultObjectAccessPermission"
+    ],
+    "properties": {
+        "defaultObjectAccessPermission": {
+            "$ref": "#/components/schemas/DefaultObjectAccessPermissionADM"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

PUT /admin/permissions/{permissionIri}/property

+
+Description +

Update a DAOP's property. Use PUT /admin/permissions/doap/{permissionIri} +instead.

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
httpAuth1headerstringN/ANoBasic authentication
httpAuthheaderstringN/ANoJWT Bearer token
KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9cookiestringNo
permissionIripathstringNoThe IRI of a permission. Must be URL-encoded.
+

Request body

+ +
+
+
+

{
+    "forProperty": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the request body +
{
+    "title": "ChangePermissionPropertyApiRequestADM",
+    "type": "object",
+    "required": [
+        "forProperty"
+    ],
+    "properties": {
+        "forProperty": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 200 OK +

+ +
+
+
+

{
+    "defaultObjectAccessPermission": {
+        "iri": "string",
+        "forProject": "string",
+        "forGroup": "string",
+        "forResourceClass": "string",
+        "forProperty": "string",
+        "hasPermissions": [
+            {
+                "name": "string",
+                "additionalInformation": "string",
+                "permissionCode": 271
+            }
+        ]
+    }
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "DefaultObjectAccessPermissionGetResponseADM",
+    "type": "object",
+    "required": [
+        "defaultObjectAccessPermission"
+    ],
+    "properties": {
+        "defaultObjectAccessPermission": {
+            "$ref": "#/components/schemas/DefaultObjectAccessPermissionADM"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

Admin Projects

+
+ +

GET /admin/projects

+
+Description +

Returns all projects.

+
+

+ Response 200 OK +

+ +
+
+
+

{
+    "projects": [
+        {
+            "id": "string",
+            "shortname": "string",
+            "shortcode": "string",
+            "longname": "string",
+            "description": [
+                {
+                    "value": "string",
+                    "language": "string"
+                }
+            ],
+            "keywords": [
+                "string"
+            ],
+            "logo": "string",
+            "ontologies": [
+                "string"
+            ],
+            "status": true,
+            "selfjoin": true,
+            "copyrightAttribution": {
+                "value": "string"
+            },
+            "license": {
+                "value": "string"
+            }
+        }
+    ]
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ProjectsGetResponse",
+    "type": "object",
+    "properties": {
+        "projects": {
+            "type": "array",
+            "items": {
+                "$ref": "#/components/schemas/Project"
+            }
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

POST /admin/projects

+
+Description +

Creates a new project.

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
httpAuth1headerstringN/ANoBasic authentication
httpAuthheaderstringN/ANoJWT Bearer token
KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9cookiestringNo
+

Request body

+ +
+
+
+

{
+    "id": {
+        "value": "string"
+    },
+    "shortname": {
+        "value": "string"
+    },
+    "shortcode": {
+        "value": "string"
+    },
+    "longname": {
+        "value": "string"
+    },
+    "description": [
+        {
+            "value": {
+                "value": "string",
+                "language": "string"
+            }
+        }
+    ],
+    "keywords": [
+        {
+            "value": "string"
+        }
+    ],
+    "logo": {
+        "value": "string"
+    },
+    "status": null,
+    "selfjoin": null,
+    "copyrightAttribution": {
+        "value": "string"
+    },
+    "license": {
+        "value": "string"
+    }
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the request body +
{
+    "title": "ProjectCreateRequest",
+    "type": "object",
+    "required": [
+        "shortname",
+        "shortcode",
+        "status",
+        "selfjoin"
+    ],
+    "properties": {
+        "id": {
+            "$ref": "#/components/schemas/ProjectIri"
+        },
+        "shortname": {
+            "$ref": "#/components/schemas/Shortname"
+        },
+        "shortcode": {
+            "$ref": "#/components/schemas/Shortcode"
+        },
+        "longname": {
+            "$ref": "#/components/schemas/Longname"
+        },
+        "description": {
+            "type": "array",
+            "items": {
+                "$ref": "#/components/schemas/Description"
+            }
+        },
+        "keywords": {
+            "type": "array",
+            "items": {
+                "$ref": "#/components/schemas/Keyword"
+            }
+        },
+        "logo": {
+            "$ref": "#/components/schemas/Logo"
+        },
+        "status": {
+            "$ref": "#/components/schemas/Status"
+        },
+        "selfjoin": {
+            "$ref": "#/components/schemas/SelfJoin"
+        },
+        "copyrightAttribution": {
+            "$ref": "#/components/schemas/CopyrightAttribution"
+        },
+        "license": {
+            "$ref": "#/components/schemas/License"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 200 OK +

+ +
+
+
+

{
+    "project": {
+        "id": "string",
+        "shortname": "string",
+        "shortcode": "string",
+        "longname": "string",
+        "description": [
+            {
+                "value": "string",
+                "language": "string"
+            }
+        ],
+        "keywords": [
+            "string"
+        ],
+        "logo": "string",
+        "ontologies": [
+            "string"
+        ],
+        "status": true,
+        "selfjoin": true,
+        "copyrightAttribution": {
+            "value": "string"
+        },
+        "license": {
+            "value": "string"
+        }
+    }
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ProjectOperationResponseADM",
+    "type": "object",
+    "required": [
+        "project"
+    ],
+    "properties": {
+        "project": {
+            "$ref": "#/components/schemas/Project"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

GET /admin/projects/iri/{projectIri}

+
+Description +

Returns a single project identified by the IRI.

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
projectIripathstringNoThe IRI of a project. Must be URL-encoded.
+ +

+ Response 200 OK +

+ +
+
+
+

{
+    "project": {
+        "id": "string",
+        "shortname": "string",
+        "shortcode": "string",
+        "longname": "string",
+        "description": [
+            {
+                "value": "string",
+                "language": "string"
+            }
+        ],
+        "keywords": [
+            "string"
+        ],
+        "logo": "string",
+        "ontologies": [
+            "string"
+        ],
+        "status": true,
+        "selfjoin": true,
+        "copyrightAttribution": {
+            "value": "string"
+        },
+        "license": {
+            "value": "string"
+        }
+    }
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ProjectGetResponse",
+    "type": "object",
+    "required": [
+        "project"
+    ],
+    "properties": {
+        "project": {
+            "$ref": "#/components/schemas/Project"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

PUT /admin/projects/iri/{projectIri}

+
+Description +

Updates a project identified by the IRI.

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
httpAuth1headerstringN/ANoBasic authentication
httpAuthheaderstringN/ANoJWT Bearer token
KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9cookiestringNo
projectIripathstringNoThe IRI of a project. Must be URL-encoded.
+

Request body

+ +
+
+
+

{
+    "shortname": {
+        "value": "string"
+    },
+    "longname": {
+        "value": "string"
+    },
+    "description": [
+        {
+            "value": {
+                "value": "string",
+                "language": "string"
+            }
+        }
+    ],
+    "keywords": [
+        {
+            "value": "string"
+        }
+    ],
+    "logo": {
+        "value": "string"
+    },
+    "status": null,
+    "selfjoin": null,
+    "copyrightAttribution": {
+        "value": "string"
+    },
+    "license": {
+        "value": "string"
+    }
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the request body +
{
+    "title": "ProjectUpdateRequest",
+    "type": "object",
+    "properties": {
+        "shortname": {
+            "$ref": "#/components/schemas/Shortname"
+        },
+        "longname": {
+            "$ref": "#/components/schemas/Longname"
+        },
+        "description": {
+            "type": "array",
+            "items": {
+                "$ref": "#/components/schemas/Description"
+            }
+        },
+        "keywords": {
+            "type": "array",
+            "items": {
+                "$ref": "#/components/schemas/Keyword"
+            }
+        },
+        "logo": {
+            "$ref": "#/components/schemas/Logo"
+        },
+        "status": {
+            "$ref": "#/components/schemas/Status"
+        },
+        "selfjoin": {
+            "$ref": "#/components/schemas/SelfJoin"
+        },
+        "copyrightAttribution": {
+            "$ref": "#/components/schemas/CopyrightAttribution"
+        },
+        "license": {
+            "$ref": "#/components/schemas/License"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 200 OK +

+ +
+
+
+

{
+    "project": {
+        "id": "string",
+        "shortname": "string",
+        "shortcode": "string",
+        "longname": "string",
+        "description": [
+            {
+                "value": "string",
+                "language": "string"
+            }
+        ],
+        "keywords": [
+            "string"
+        ],
+        "logo": "string",
+        "ontologies": [
+            "string"
+        ],
+        "status": true,
+        "selfjoin": true,
+        "copyrightAttribution": {
+            "value": "string"
+        },
+        "license": {
+            "value": "string"
+        }
+    }
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ProjectOperationResponseADM",
+    "type": "object",
+    "required": [
+        "project"
+    ],
+    "properties": {
+        "project": {
+            "$ref": "#/components/schemas/Project"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

DELETE /admin/projects/iri/{projectIri}

+
+Description +

Deletes a project identified by the IRI.

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
httpAuth1headerstringN/ANoBasic authentication
httpAuthheaderstringN/ANoJWT Bearer token
KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9cookiestringNo
projectIripathstringNoThe IRI of a project. Must be URL-encoded.
+ +

+ Response 200 OK +

+ +
+
+
+

{
+    "project": {
+        "id": "string",
+        "shortname": "string",
+        "shortcode": "string",
+        "longname": "string",
+        "description": [
+            {
+                "value": "string",
+                "language": "string"
+            }
+        ],
+        "keywords": [
+            "string"
+        ],
+        "logo": "string",
+        "ontologies": [
+            "string"
+        ],
+        "status": true,
+        "selfjoin": true,
+        "copyrightAttribution": {
+            "value": "string"
+        },
+        "license": {
+            "value": "string"
+        }
+    }
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ProjectOperationResponseADM",
+    "type": "object",
+    "required": [
+        "project"
+    ],
+    "properties": {
+        "project": {
+            "$ref": "#/components/schemas/Project"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

GET /admin/projects/iri/{projectIri}/RestrictedViewSettings

+
+Description +

Returns the project's restricted view settings identified by the IRI.

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
projectIripathstringNoThe IRI of a project. Must be URL-encoded.
+ +

+ Response 200 OK +

+ +
+
+
+

{
+    "settings": {
+        "size": "string",
+        "watermark": true
+    }
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ProjectRestrictedViewSettingsGetResponseADM",
+    "type": "object",
+    "required": [
+        "settings"
+    ],
+    "properties": {
+        "settings": {
+            "$ref": "#/components/schemas/ProjectRestrictedViewSettingsADM"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

POST /admin/projects/iri/{projectIri}/RestrictedViewSettings

+
+Description +

Sets the project's restricted view settings identified by the IRI.

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
httpAuth1headerstringN/ANoBasic authentication
httpAuthheaderstringN/ANoJWT Bearer token
KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9cookiestringNo
projectIripathstringNoThe IRI of a project. Must be URL-encoded.
+

Request body

+ +
+
+
+
{
+    "size": "!128,128"
+}
+
+
+Schema of the request body +
{
+    "title": "SetRestrictedViewRequest",
+    "type": "object",
+    "properties": {
+        "size": {
+            "$ref": "#/components/schemas/Size"
+        },
+        "watermark": {
+            "$ref": "#/components/schemas/Watermark"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 200 OK +

+ +
+
+
+

{
+    "size": {
+        "value": "string"
+    },
+    "watermark": {
+        "value": true
+    }
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "RestrictedViewResponse",
+    "type": "object",
+    "properties": {
+        "size": {
+            "$ref": "#/components/schemas/Size"
+        },
+        "watermark": {
+            "$ref": "#/components/schemas/Watermark"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

GET /admin/projects/shortcode/{projectShortcode}

+
+Description +

Returns a single project identified by the shortcode.

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
projectShortcodepathstringNoThe shortcode of a project. Must be a 4 digit hexadecimal String.
+ +

+ Response 200 OK +

+ +
+
+
+

{
+    "project": {
+        "id": "string",
+        "shortname": "string",
+        "shortcode": "string",
+        "longname": "string",
+        "description": [
+            {
+                "value": "string",
+                "language": "string"
+            }
+        ],
+        "keywords": [
+            "string"
+        ],
+        "logo": "string",
+        "ontologies": [
+            "string"
+        ],
+        "status": true,
+        "selfjoin": true,
+        "copyrightAttribution": {
+            "value": "string"
+        },
+        "license": {
+            "value": "string"
+        }
+    }
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ProjectGetResponse",
+    "type": "object",
+    "required": [
+        "project"
+    ],
+    "properties": {
+        "project": {
+            "$ref": "#/components/schemas/Project"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

GET /admin/projects/shortcode/{projectShortcode}/RestrictedViewSettings

+
+Description +

Returns the project's restricted view settings identified by the shortcode.

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
projectShortcodepathstringNoThe shortcode of a project. Must be a 4 digit hexadecimal String.
+ +

+ Response 200 OK +

+ +
+
+
+

{
+    "settings": {
+        "size": "string",
+        "watermark": true
+    }
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ProjectRestrictedViewSettingsGetResponseADM",
+    "type": "object",
+    "required": [
+        "settings"
+    ],
+    "properties": {
+        "settings": {
+            "$ref": "#/components/schemas/ProjectRestrictedViewSettingsADM"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

POST /admin/projects/shortcode/{projectShortcode}/RestrictedViewSettings

+
+Description +

Sets the project's restricted view settings identified by the shortcode.

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
httpAuth1headerstringN/ANoBasic authentication
httpAuthheaderstringN/ANoJWT Bearer token
KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9cookiestringNo
projectShortcodepathstringNoThe shortcode of a project. Must be a 4 digit hexadecimal String.
+

Request body

+ +
+
+
+
{
+    "size": "!128,128"
+}
+
+
+Schema of the request body +
{
+    "title": "SetRestrictedViewRequest",
+    "type": "object",
+    "properties": {
+        "size": {
+            "$ref": "#/components/schemas/Size"
+        },
+        "watermark": {
+            "$ref": "#/components/schemas/Watermark"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 200 OK +

+ +
+
+
+

{
+    "size": {
+        "value": "string"
+    },
+    "watermark": {
+        "value": true
+    }
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "RestrictedViewResponse",
+    "type": "object",
+    "properties": {
+        "size": {
+            "$ref": "#/components/schemas/Size"
+        },
+        "watermark": {
+            "$ref": "#/components/schemas/Watermark"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

GET /admin/projects/shortname/{projectShortname}

+
+Description +

Returns a single project identified by the shortname.

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
projectShortnamepathstringNoThe shortname of a project.
+ +

+ Response 200 OK +

+ +
+
+
+

{
+    "project": {
+        "id": "string",
+        "shortname": "string",
+        "shortcode": "string",
+        "longname": "string",
+        "description": [
+            {
+                "value": "string",
+                "language": "string"
+            }
+        ],
+        "keywords": [
+            "string"
+        ],
+        "logo": "string",
+        "ontologies": [
+            "string"
+        ],
+        "status": true,
+        "selfjoin": true,
+        "copyrightAttribution": {
+            "value": "string"
+        },
+        "license": {
+            "value": "string"
+        }
+    }
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ProjectGetResponse",
+    "type": "object",
+    "required": [
+        "project"
+    ],
+    "properties": {
+        "project": {
+            "$ref": "#/components/schemas/Project"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

GET /admin/projects/shortname/{projectShortname}/RestrictedViewSettings

+
+Description +

Returns the project's restricted view settings identified by the shortname.

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
projectShortnamepathstringNoThe shortname of a project.
+ +

+ Response 200 OK +

+ +
+
+
+

{
+    "settings": {
+        "size": "string",
+        "watermark": true
+    }
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ProjectRestrictedViewSettingsGetResponseADM",
+    "type": "object",
+    "required": [
+        "settings"
+    ],
+    "properties": {
+        "settings": {
+            "$ref": "#/components/schemas/ProjectRestrictedViewSettingsADM"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

GET /admin/projects/Keywords

+
+Description +

Returns all unique keywords for all projects as a list.

+
+

+ Response 200 OK +

+ +
+
+
+

{
+    "keywords": [
+        "string"
+    ]
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ProjectsKeywordsGetResponse",
+    "type": "object",
+    "properties": {
+        "keywords": {
+            "type": "array",
+            "items": {
+                "type": "string"
+            }
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

GET /admin/projects/iri/{projectIri}/Keywords

+
+Description +

Returns all keywords for a single project.

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
projectIripathstringNoThe IRI of a project. Must be URL-encoded.
+ +

+ Response 200 OK +

+ +
+
+
+

{
+    "keywords": [
+        "string"
+    ]
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ProjectKeywordsGetResponse",
+    "type": "object",
+    "properties": {
+        "keywords": {
+            "type": "array",
+            "items": {
+                "type": "string"
+            }
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

DELETE /admin/projects/shortcode/{projectShortcode}/erase

+
+Description +

!ATTENTION! Erase a project with the given shortcode. +This will permanently and irrecoverably remove the project and all of its +assets. +Authorization: Requires system admin permissions. +Only available if the feature has been configured on the server side.

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
httpAuth1headerstringN/ANoBasic authentication
httpAuthheaderstringN/ANoJWT Bearer token
keepAssetsquerybooleanFalseNoIf set to true the assets in ingest will not be removed.
KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9cookiestringNo
projectShortcodepathstringNoThe shortcode of a project. Must be a 4 digit hexadecimal String.
+ +

+ Response 200 OK +

+ +
+
+
+

{
+    "project": {
+        "id": "string",
+        "shortname": "string",
+        "shortcode": "string",
+        "longname": "string",
+        "description": [
+            {
+                "value": "string",
+                "language": "string"
+            }
+        ],
+        "keywords": [
+            "string"
+        ],
+        "logo": "string",
+        "ontologies": [
+            "string"
+        ],
+        "status": true,
+        "selfjoin": true,
+        "copyrightAttribution": {
+            "value": "string"
+        },
+        "license": {
+            "value": "string"
+        }
+    }
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ProjectOperationResponseADM",
+    "type": "object",
+    "required": [
+        "project"
+    ],
+    "properties": {
+        "project": {
+            "$ref": "#/components/schemas/Project"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

GET /admin/projects/iri/{projectIri}/AllData

+
+Description +

Returns all ontologies, data, and configuration belonging to a project +identified by the IRI.

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
httpAuth1headerstringN/ANoBasic authentication
httpAuthheaderstringN/ANoJWT Bearer token
KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9cookiestringNo
projectIripathstringNoThe IRI of a project. Must be URL-encoded.
+ +

+ Response 200 OK +

+ +
+
+
+

"TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQ="
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "type": "string",
+    "format": "binary"
+}
+
+
+
+
+
+
+

Response headers

+ + + + + + + + + + + + + + + + + + + + + +
NameDescriptionSchema
Content-Dispositionstring
Content-Typestring
+
+ +

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

GET /admin/projects/iri/{projectIri}/admin-members

+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
httpAuth1headerstringN/ANoBasic authentication
httpAuthheaderstringN/ANoJWT Bearer token
KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9cookiestringNo
projectIripathstringNoThe IRI of a project. Must be URL-encoded.
+ +

+ Response 200 OK +

+ +
+
+
+

{
+    "members": [
+        {
+            "id": "string",
+            "username": "string",
+            "email": "string",
+            "givenName": "string",
+            "familyName": "string",
+            "status": true,
+            "lang": "string",
+            "password": "string",
+            "groups": [
+                {
+                    "id": "string",
+                    "name": "string",
+                    "descriptions": [
+                        {
+                            "value": "string",
+                            "language": "string"
+                        }
+                    ],
+                    "project": {
+                        "id": "string",
+                        "shortname": "string",
+                        "shortcode": "string",
+                        "longname": "string",
+                        "description": null,
+                        "keywords": [
+                            "string"
+                        ],
+                        "logo": "string",
+                        "ontologies": [
+                            "string"
+                        ],
+                        "status": true,
+                        "selfjoin": true,
+                        "copyrightAttribution": {
+                            "value": "string"
+                        },
+                        "license": {
+                            "value": "string"
+                        }
+                    },
+                    "status": true,
+                    "selfjoin": true
+                }
+            ],
+            "projects": null,
+            "permissions": {
+                "groupsPerProject": {},
+                "administrativePermissionsPerProject": {}
+            }
+        }
+    ]
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ProjectAdminMembersGetResponseADM",
+    "type": "object",
+    "properties": {
+        "members": {
+            "type": "array",
+            "items": {
+                "$ref": "#/components/schemas/User"
+            }
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

GET /admin/projects/iri/{projectIri}/members

+
+Description +

Returns all project members of a project identified by the IRI.

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
httpAuth1headerstringN/ANoBasic authentication
httpAuthheaderstringN/ANoJWT Bearer token
KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9cookiestringNo
projectIripathstringNoThe IRI of a project. Must be URL-encoded.
+ +

+ Response 200 OK +

+ +
+
+
+

{
+    "members": [
+        {
+            "id": "string",
+            "username": "string",
+            "email": "string",
+            "givenName": "string",
+            "familyName": "string",
+            "status": true,
+            "lang": "string",
+            "password": "string",
+            "groups": [
+                {
+                    "id": "string",
+                    "name": "string",
+                    "descriptions": [
+                        {
+                            "value": "string",
+                            "language": "string"
+                        }
+                    ],
+                    "project": {
+                        "id": "string",
+                        "shortname": "string",
+                        "shortcode": "string",
+                        "longname": "string",
+                        "description": null,
+                        "keywords": [
+                            "string"
+                        ],
+                        "logo": "string",
+                        "ontologies": [
+                            "string"
+                        ],
+                        "status": true,
+                        "selfjoin": true,
+                        "copyrightAttribution": {
+                            "value": "string"
+                        },
+                        "license": {
+                            "value": "string"
+                        }
+                    },
+                    "status": true,
+                    "selfjoin": true
+                }
+            ],
+            "projects": null,
+            "permissions": {
+                "groupsPerProject": {},
+                "administrativePermissionsPerProject": {}
+            }
+        }
+    ]
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ProjectMembersGetResponseADM",
+    "type": "object",
+    "properties": {
+        "members": {
+            "type": "array",
+            "items": {
+                "$ref": "#/components/schemas/User"
+            }
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

GET /admin/projects/shortcode/{projectShortcode}/admin-members

+
+Description +

Returns all admin members of a project identified by the shortcode.

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
httpAuth1headerstringN/ANoBasic authentication
httpAuthheaderstringN/ANoJWT Bearer token
KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9cookiestringNo
projectShortcodepathstringNoThe shortcode of a project. Must be a 4 digit hexadecimal String.
+ +

+ Response 200 OK +

+ +
+
+
+

{
+    "members": [
+        {
+            "id": "string",
+            "username": "string",
+            "email": "string",
+            "givenName": "string",
+            "familyName": "string",
+            "status": true,
+            "lang": "string",
+            "password": "string",
+            "groups": [
+                {
+                    "id": "string",
+                    "name": "string",
+                    "descriptions": [
+                        {
+                            "value": "string",
+                            "language": "string"
+                        }
+                    ],
+                    "project": {
+                        "id": "string",
+                        "shortname": "string",
+                        "shortcode": "string",
+                        "longname": "string",
+                        "description": null,
+                        "keywords": [
+                            "string"
+                        ],
+                        "logo": "string",
+                        "ontologies": [
+                            "string"
+                        ],
+                        "status": true,
+                        "selfjoin": true,
+                        "copyrightAttribution": {
+                            "value": "string"
+                        },
+                        "license": {
+                            "value": "string"
+                        }
+                    },
+                    "status": true,
+                    "selfjoin": true
+                }
+            ],
+            "projects": null,
+            "permissions": {
+                "groupsPerProject": {},
+                "administrativePermissionsPerProject": {}
+            }
+        }
+    ]
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ProjectAdminMembersGetResponseADM",
+    "type": "object",
+    "properties": {
+        "members": {
+            "type": "array",
+            "items": {
+                "$ref": "#/components/schemas/User"
+            }
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

GET /admin/projects/shortcode/{projectShortcode}/members

+
+Description +

Returns all project members of a project identified by the shortcode.

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
httpAuth1headerstringN/ANoBasic authentication
httpAuthheaderstringN/ANoJWT Bearer token
KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9cookiestringNo
projectShortcodepathstringNoThe shortcode of a project. Must be a 4 digit hexadecimal String.
+ +

+ Response 200 OK +

+ +
+
+
+

{
+    "members": [
+        {
+            "id": "string",
+            "username": "string",
+            "email": "string",
+            "givenName": "string",
+            "familyName": "string",
+            "status": true,
+            "lang": "string",
+            "password": "string",
+            "groups": [
+                {
+                    "id": "string",
+                    "name": "string",
+                    "descriptions": [
+                        {
+                            "value": "string",
+                            "language": "string"
+                        }
+                    ],
+                    "project": {
+                        "id": "string",
+                        "shortname": "string",
+                        "shortcode": "string",
+                        "longname": "string",
+                        "description": null,
+                        "keywords": [
+                            "string"
+                        ],
+                        "logo": "string",
+                        "ontologies": [
+                            "string"
+                        ],
+                        "status": true,
+                        "selfjoin": true,
+                        "copyrightAttribution": {
+                            "value": "string"
+                        },
+                        "license": {
+                            "value": "string"
+                        }
+                    },
+                    "status": true,
+                    "selfjoin": true
+                }
+            ],
+            "projects": null,
+            "permissions": {
+                "groupsPerProject": {},
+                "administrativePermissionsPerProject": {}
+            }
+        }
+    ]
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ProjectMembersGetResponseADM",
+    "type": "object",
+    "properties": {
+        "members": {
+            "type": "array",
+            "items": {
+                "$ref": "#/components/schemas/User"
+            }
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

GET /admin/projects/shortname/{projectShortname}/admin-members

+
+Description +

Returns all admin members of a project identified by the shortname.

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
httpAuth1headerstringN/ANoBasic authentication
httpAuthheaderstringN/ANoJWT Bearer token
KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9cookiestringNo
projectShortnamepathstringNoThe shortname of a project.
+ +

+ Response 200 OK +

+ +
+
+
+

{
+    "members": [
+        {
+            "id": "string",
+            "username": "string",
+            "email": "string",
+            "givenName": "string",
+            "familyName": "string",
+            "status": true,
+            "lang": "string",
+            "password": "string",
+            "groups": [
+                {
+                    "id": "string",
+                    "name": "string",
+                    "descriptions": [
+                        {
+                            "value": "string",
+                            "language": "string"
+                        }
+                    ],
+                    "project": {
+                        "id": "string",
+                        "shortname": "string",
+                        "shortcode": "string",
+                        "longname": "string",
+                        "description": null,
+                        "keywords": [
+                            "string"
+                        ],
+                        "logo": "string",
+                        "ontologies": [
+                            "string"
+                        ],
+                        "status": true,
+                        "selfjoin": true,
+                        "copyrightAttribution": {
+                            "value": "string"
+                        },
+                        "license": {
+                            "value": "string"
+                        }
+                    },
+                    "status": true,
+                    "selfjoin": true
+                }
+            ],
+            "projects": null,
+            "permissions": {
+                "groupsPerProject": {},
+                "administrativePermissionsPerProject": {}
+            }
+        }
+    ]
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ProjectAdminMembersGetResponseADM",
+    "type": "object",
+    "properties": {
+        "members": {
+            "type": "array",
+            "items": {
+                "$ref": "#/components/schemas/User"
+            }
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

GET /admin/projects/shortname/{projectShortname}/members

+
+Description +

Returns all project members of a project identified by the shortname.

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
httpAuth1headerstringN/ANoBasic authentication
httpAuthheaderstringN/ANoJWT Bearer token
KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9cookiestringNo
projectShortnamepathstringNoThe shortname of a project.
+ +

+ Response 200 OK +

+ +
+
+
+

{
+    "members": [
+        {
+            "id": "string",
+            "username": "string",
+            "email": "string",
+            "givenName": "string",
+            "familyName": "string",
+            "status": true,
+            "lang": "string",
+            "password": "string",
+            "groups": [
+                {
+                    "id": "string",
+                    "name": "string",
+                    "descriptions": [
+                        {
+                            "value": "string",
+                            "language": "string"
+                        }
+                    ],
+                    "project": {
+                        "id": "string",
+                        "shortname": "string",
+                        "shortcode": "string",
+                        "longname": "string",
+                        "description": null,
+                        "keywords": [
+                            "string"
+                        ],
+                        "logo": "string",
+                        "ontologies": [
+                            "string"
+                        ],
+                        "status": true,
+                        "selfjoin": true,
+                        "copyrightAttribution": {
+                            "value": "string"
+                        },
+                        "license": {
+                            "value": "string"
+                        }
+                    },
+                    "status": true,
+                    "selfjoin": true
+                }
+            ],
+            "projects": null,
+            "permissions": {
+                "groupsPerProject": {},
+                "administrativePermissionsPerProject": {}
+            }
+        }
+    ]
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ProjectMembersGetResponseADM",
+    "type": "object",
+    "properties": {
+        "members": {
+            "type": "array",
+            "items": {
+                "$ref": "#/components/schemas/User"
+            }
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

GET /admin/projects/export

+
+Description +

Lists existing exports of all projects.

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
httpAuth1headerstringN/ANoBasic authentication
httpAuthheaderstringN/ANoJWT Bearer token
KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9cookiestringNo
+ +

+ Response 200 OK +

+ +
+
+
+

[
+    {
+        "projectShortcode": "string",
+        "location": "string"
+    }
+]
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "type": "array",
+    "items": {
+        "$ref": "#/components/schemas/ProjectExportInfoResponse"
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

POST /admin/projects/shortcode/{projectShortcode}/export

+
+Description +

Trigger an export of a project identified by the shortcode.

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
httpAuth1headerstringN/ANoBasic authentication
httpAuthheaderstringN/ANoJWT Bearer token
KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9cookiestringNo
projectShortcodepathstringNoThe shortcode of a project. Must be a 4 digit hexadecimal String.
+ +

+ Response 202 Accepted +

+ +

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

POST /admin/projects/shortcode/{projectShortcode}/export-await

+
+Description +

Trigger an export of a project identified by the shortcode.Returns the +shortcode and the export location when the process has finished +successfully.

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
httpAuth1headerstringN/ANoBasic authentication
httpAuthheaderstringN/ANoJWT Bearer token
KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9cookiestringNo
projectShortcodepathstringNoThe shortcode of a project. Must be a 4 digit hexadecimal String.
+ +

+ Response 200 OK +

+ +
+
+
+

{
+    "projectShortcode": "string",
+    "location": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ProjectExportInfoResponse",
+    "type": "object",
+    "required": [
+        "projectShortcode",
+        "location"
+    ],
+    "properties": {
+        "projectShortcode": {
+            "type": "string"
+        },
+        "location": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

POST /admin/projects/shortcode/{projectShortcode}/import

+
+Description +

Trigger an import of a project identified by the shortcode.

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
httpAuth1headerstringN/ANoBasic authentication
httpAuthheaderstringN/ANoJWT Bearer token
KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9cookiestringNo
projectShortcodepathstringNoThe shortcode of a project. Must be a 4 digit hexadecimal String.
+ +

+ Response 200 OK +

+ +
+
+
+

{
+    "location": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ProjectImportResponse",
+    "type": "object",
+    "required": [
+        "location"
+    ],
+    "properties": {
+        "location": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

Admin Store

+
+ +

GET /admin/store/ResetTriplestoreContent

+
+Description +

Resets the content of the triplestore, only available if configuration +allowReloadOverHttp is set to true.

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
prependDefaultsquerybooleanTrueNoPrepend defaults to the data objects.
+

Request body

+ +
+
+
+

[
+    {
+        "path": "string",
+        "name": "string"
+    }
+]
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the request body +
{
+    "type": "array",
+    "items": {
+        "$ref": "#/components/schemas/RdfDataObject"
+    }
+}
+
+
+
+
+
+

+ Response 200 OK +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "MessageResponse",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

Admin Users

+
+ +

GET /admin/users/iri/{userIri}/project-memberships

+
+Description +

Returns the user's project memberships for a user identified by their IRI.

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
userIripathstringNoThe user IRI. Must be URL-encoded.
+ +

+ Response 200 OK +

+ +
+
+
+

{
+    "projects": [
+        {
+            "id": "string",
+            "shortname": "string",
+            "shortcode": "string",
+            "longname": "string",
+            "description": [
+                {
+                    "value": "string",
+                    "language": "string"
+                }
+            ],
+            "keywords": [
+                "string"
+            ],
+            "logo": "string",
+            "ontologies": [
+                "string"
+            ],
+            "status": true,
+            "selfjoin": true,
+            "copyrightAttribution": {
+                "value": "string"
+            },
+            "license": {
+                "value": "string"
+            }
+        }
+    ]
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "UserProjectMembershipsGetResponseADM",
+    "type": "object",
+    "properties": {
+        "projects": {
+            "type": "array",
+            "items": {
+                "$ref": "#/components/schemas/Project"
+            }
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

GET /admin/users/iri/{userIri}/project-admin-memberships

+
+Description +

Returns the user's project admin memberships for a user identified by their +IRI.

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
userIripathstringNoThe user IRI. Must be URL-encoded.
+ +

+ Response 200 OK +

+ +
+
+
+

{
+    "projects": [
+        {
+            "id": "string",
+            "shortname": "string",
+            "shortcode": "string",
+            "longname": "string",
+            "description": [
+                {
+                    "value": "string",
+                    "language": "string"
+                }
+            ],
+            "keywords": [
+                "string"
+            ],
+            "logo": "string",
+            "ontologies": [
+                "string"
+            ],
+            "status": true,
+            "selfjoin": true,
+            "copyrightAttribution": {
+                "value": "string"
+            },
+            "license": {
+                "value": "string"
+            }
+        }
+    ]
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "UserProjectAdminMembershipsGetResponseADM",
+    "type": "object",
+    "properties": {
+        "projects": {
+            "type": "array",
+            "items": {
+                "$ref": "#/components/schemas/Project"
+            }
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

GET /admin/users/iri/{userIri}/group-memberships

+
+Description +

Returns the user's group memberships for a user identified by their IRI.

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
userIripathstringNoThe user IRI. Must be URL-encoded.
+ +

+ Response 200 OK +

+ +
+
+
+

{
+    "groups": [
+        {
+            "id": "string",
+            "name": "string",
+            "descriptions": [
+                {
+                    "value": "string",
+                    "language": "string"
+                }
+            ],
+            "project": {
+                "id": "string",
+                "shortname": "string",
+                "shortcode": "string",
+                "longname": "string",
+                "description": null,
+                "keywords": [
+                    "string"
+                ],
+                "logo": "string",
+                "ontologies": [
+                    "string"
+                ],
+                "status": true,
+                "selfjoin": true,
+                "copyrightAttribution": {
+                    "value": "string"
+                },
+                "license": {
+                    "value": "string"
+                }
+            },
+            "status": true,
+            "selfjoin": true
+        }
+    ]
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "UserGroupMembershipsGetResponseADM",
+    "type": "object",
+    "properties": {
+        "groups": {
+            "type": "array",
+            "items": {
+                "$ref": "#/components/schemas/Group"
+            }
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

GET /admin/users

+
+Description +

Returns all users.

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
httpAuth1headerstringN/ANoBasic authentication
httpAuthheaderstringN/ANoJWT Bearer token
KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9cookiestringNo
+ +

+ Response 200 OK +

+ +
+
+
+

{
+    "users": [
+        {
+            "id": "string",
+            "username": "string",
+            "email": "string",
+            "givenName": "string",
+            "familyName": "string",
+            "status": true,
+            "lang": "string",
+            "password": "string",
+            "groups": [
+                {
+                    "id": "string",
+                    "name": "string",
+                    "descriptions": [
+                        {
+                            "value": "string",
+                            "language": "string"
+                        }
+                    ],
+                    "project": {
+                        "id": "string",
+                        "shortname": "string",
+                        "shortcode": "string",
+                        "longname": "string",
+                        "description": null,
+                        "keywords": [
+                            "string"
+                        ],
+                        "logo": "string",
+                        "ontologies": [
+                            "string"
+                        ],
+                        "status": true,
+                        "selfjoin": true,
+                        "copyrightAttribution": {
+                            "value": "string"
+                        },
+                        "license": {
+                            "value": "string"
+                        }
+                    },
+                    "status": true,
+                    "selfjoin": true
+                }
+            ],
+            "projects": null,
+            "permissions": {
+                "groupsPerProject": {},
+                "administrativePermissionsPerProject": {}
+            }
+        }
+    ]
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "UsersGetResponseADM",
+    "type": "object",
+    "properties": {
+        "users": {
+            "type": "array",
+            "items": {
+                "$ref": "#/components/schemas/User"
+            }
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

POST /admin/users

+
+Description +

Create a new user.

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
httpAuth1headerstringN/ANoBasic authentication
httpAuthheaderstringN/ANoJWT Bearer token
KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9cookiestringNo
+

Request body

+ +
+
+
+

{
+    "id": {
+        "value": "string"
+    },
+    "username": {
+        "value": "string"
+    },
+    "email": {
+        "value": "string"
+    },
+    "givenName": {
+        "value": "string"
+    },
+    "familyName": {
+        "value": "string"
+    },
+    "password": {
+        "value": "string"
+    },
+    "status": {
+        "value": true
+    },
+    "lang": {
+        "value": "string"
+    },
+    "systemAdmin": {
+        "value": true
+    }
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the request body +
{
+    "title": "UserCreateRequest",
+    "type": "object",
+    "required": [
+        "username",
+        "email",
+        "givenName",
+        "familyName",
+        "password",
+        "status",
+        "lang",
+        "systemAdmin"
+    ],
+    "properties": {
+        "id": {
+            "$ref": "#/components/schemas/UserIri"
+        },
+        "username": {
+            "$ref": "#/components/schemas/Username"
+        },
+        "email": {
+            "$ref": "#/components/schemas/Email"
+        },
+        "givenName": {
+            "$ref": "#/components/schemas/GivenName"
+        },
+        "familyName": {
+            "$ref": "#/components/schemas/FamilyName"
+        },
+        "password": {
+            "$ref": "#/components/schemas/Password"
+        },
+        "status": {
+            "$ref": "#/components/schemas/UserStatus"
+        },
+        "lang": {
+            "$ref": "#/components/schemas/LanguageCode"
+        },
+        "systemAdmin": {
+            "$ref": "#/components/schemas/SystemAdmin"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 200 OK +

+ +
+
+
+

{
+    "user": {
+        "id": "string",
+        "username": "string",
+        "email": "string",
+        "givenName": "string",
+        "familyName": "string",
+        "status": true,
+        "lang": "string",
+        "password": "string",
+        "groups": [
+            {
+                "id": "string",
+                "name": "string",
+                "descriptions": [
+                    {
+                        "value": "string",
+                        "language": "string"
+                    }
+                ],
+                "project": {
+                    "id": "string",
+                    "shortname": "string",
+                    "shortcode": "string",
+                    "longname": "string",
+                    "description": null,
+                    "keywords": [
+                        "string"
+                    ],
+                    "logo": "string",
+                    "ontologies": [
+                        "string"
+                    ],
+                    "status": true,
+                    "selfjoin": true,
+                    "copyrightAttribution": {
+                        "value": "string"
+                    },
+                    "license": {
+                        "value": "string"
+                    }
+                },
+                "status": true,
+                "selfjoin": true
+            }
+        ],
+        "projects": null,
+        "permissions": {
+            "groupsPerProject": {},
+            "administrativePermissionsPerProject": {}
+        }
+    }
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "UserResponseADM",
+    "type": "object",
+    "required": [
+        "user"
+    ],
+    "properties": {
+        "user": {
+            "$ref": "#/components/schemas/User"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

GET /admin/users/iri/{userIri}

+
+Description +

Returns a user identified by their IRI.

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
httpAuth1headerstringN/ANoBasic authentication
httpAuthheaderstringN/ANoJWT Bearer token
KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9cookiestringNo
userIripathstringNoThe user IRI. Must be URL-encoded.
+ +

+ Response 200 OK +

+ +
+
+
+

{
+    "user": {
+        "id": "string",
+        "username": "string",
+        "email": "string",
+        "givenName": "string",
+        "familyName": "string",
+        "status": true,
+        "lang": "string",
+        "password": "string",
+        "groups": [
+            {
+                "id": "string",
+                "name": "string",
+                "descriptions": [
+                    {
+                        "value": "string",
+                        "language": "string"
+                    }
+                ],
+                "project": {
+                    "id": "string",
+                    "shortname": "string",
+                    "shortcode": "string",
+                    "longname": "string",
+                    "description": null,
+                    "keywords": [
+                        "string"
+                    ],
+                    "logo": "string",
+                    "ontologies": [
+                        "string"
+                    ],
+                    "status": true,
+                    "selfjoin": true,
+                    "copyrightAttribution": {
+                        "value": "string"
+                    },
+                    "license": {
+                        "value": "string"
+                    }
+                },
+                "status": true,
+                "selfjoin": true
+            }
+        ],
+        "projects": null,
+        "permissions": {
+            "groupsPerProject": {},
+            "administrativePermissionsPerProject": {}
+        }
+    }
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "UserResponseADM",
+    "type": "object",
+    "required": [
+        "user"
+    ],
+    "properties": {
+        "user": {
+            "$ref": "#/components/schemas/User"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

DELETE /admin/users/iri/{userIri}

+
+Description +

Delete a user identified by IRI (change status to false).

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
httpAuth1headerstringN/ANoBasic authentication
httpAuthheaderstringN/ANoJWT Bearer token
KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9cookiestringNo
userIripathstringNoThe user IRI. Must be URL-encoded.
+ +

+ Response 200 OK +

+ +
+
+
+

{
+    "user": {
+        "id": "string",
+        "username": "string",
+        "email": "string",
+        "givenName": "string",
+        "familyName": "string",
+        "status": true,
+        "lang": "string",
+        "password": "string",
+        "groups": [
+            {
+                "id": "string",
+                "name": "string",
+                "descriptions": [
+                    {
+                        "value": "string",
+                        "language": "string"
+                    }
+                ],
+                "project": {
+                    "id": "string",
+                    "shortname": "string",
+                    "shortcode": "string",
+                    "longname": "string",
+                    "description": null,
+                    "keywords": [
+                        "string"
+                    ],
+                    "logo": "string",
+                    "ontologies": [
+                        "string"
+                    ],
+                    "status": true,
+                    "selfjoin": true,
+                    "copyrightAttribution": {
+                        "value": "string"
+                    },
+                    "license": {
+                        "value": "string"
+                    }
+                },
+                "status": true,
+                "selfjoin": true
+            }
+        ],
+        "projects": null,
+        "permissions": {
+            "groupsPerProject": {},
+            "administrativePermissionsPerProject": {}
+        }
+    }
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "UserResponseADM",
+    "type": "object",
+    "required": [
+        "user"
+    ],
+    "properties": {
+        "user": {
+            "$ref": "#/components/schemas/User"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

GET /admin/users/email/{email}

+
+Description +

Returns a user identified by their Email.

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
httpAuth1headerstringN/ANoBasic authentication
httpAuthheaderstringN/ANoJWT Bearer token
emailpathstringNoThe user email. Must be URL-encoded.
KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9cookiestringNo
+ +

+ Response 200 OK +

+ +
+
+
+

{
+    "user": {
+        "id": "string",
+        "username": "string",
+        "email": "string",
+        "givenName": "string",
+        "familyName": "string",
+        "status": true,
+        "lang": "string",
+        "password": "string",
+        "groups": [
+            {
+                "id": "string",
+                "name": "string",
+                "descriptions": [
+                    {
+                        "value": "string",
+                        "language": "string"
+                    }
+                ],
+                "project": {
+                    "id": "string",
+                    "shortname": "string",
+                    "shortcode": "string",
+                    "longname": "string",
+                    "description": null,
+                    "keywords": [
+                        "string"
+                    ],
+                    "logo": "string",
+                    "ontologies": [
+                        "string"
+                    ],
+                    "status": true,
+                    "selfjoin": true,
+                    "copyrightAttribution": {
+                        "value": "string"
+                    },
+                    "license": {
+                        "value": "string"
+                    }
+                },
+                "status": true,
+                "selfjoin": true
+            }
+        ],
+        "projects": null,
+        "permissions": {
+            "groupsPerProject": {},
+            "administrativePermissionsPerProject": {}
+        }
+    }
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "UserResponseADM",
+    "type": "object",
+    "required": [
+        "user"
+    ],
+    "properties": {
+        "user": {
+            "$ref": "#/components/schemas/User"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

GET /admin/users/username/{username}

+
+Description +

Returns a user identified by their Username.

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
httpAuth1headerstringN/ANoBasic authentication
httpAuthheaderstringN/ANoJWT Bearer token
KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9cookiestringNo
usernamepathstringNoThe user name. Must be URL-encoded.
+ +

+ Response 200 OK +

+ +
+
+
+

{
+    "user": {
+        "id": "string",
+        "username": "string",
+        "email": "string",
+        "givenName": "string",
+        "familyName": "string",
+        "status": true,
+        "lang": "string",
+        "password": "string",
+        "groups": [
+            {
+                "id": "string",
+                "name": "string",
+                "descriptions": [
+                    {
+                        "value": "string",
+                        "language": "string"
+                    }
+                ],
+                "project": {
+                    "id": "string",
+                    "shortname": "string",
+                    "shortcode": "string",
+                    "longname": "string",
+                    "description": null,
+                    "keywords": [
+                        "string"
+                    ],
+                    "logo": "string",
+                    "ontologies": [
+                        "string"
+                    ],
+                    "status": true,
+                    "selfjoin": true,
+                    "copyrightAttribution": {
+                        "value": "string"
+                    },
+                    "license": {
+                        "value": "string"
+                    }
+                },
+                "status": true,
+                "selfjoin": true
+            }
+        ],
+        "projects": null,
+        "permissions": {
+            "groupsPerProject": {},
+            "administrativePermissionsPerProject": {}
+        }
+    }
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "UserResponseADM",
+    "type": "object",
+    "required": [
+        "user"
+    ],
+    "properties": {
+        "user": {
+            "$ref": "#/components/schemas/User"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

POST /admin/users/iri/{userIri}/project-memberships/{projectIri}

+
+Description +

Add a user to a project identified by IRI.

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
httpAuth1headerstringN/ANoBasic authentication
httpAuthheaderstringN/ANoJWT Bearer token
KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9cookiestringNo
projectIripathstringNoThe IRI of a project. Must be URL-encoded.
userIripathstringNoThe user IRI. Must be URL-encoded.
+ +

+ Response 200 OK +

+ +
+
+
+

{
+    "user": {
+        "id": "string",
+        "username": "string",
+        "email": "string",
+        "givenName": "string",
+        "familyName": "string",
+        "status": true,
+        "lang": "string",
+        "password": "string",
+        "groups": [
+            {
+                "id": "string",
+                "name": "string",
+                "descriptions": [
+                    {
+                        "value": "string",
+                        "language": "string"
+                    }
+                ],
+                "project": {
+                    "id": "string",
+                    "shortname": "string",
+                    "shortcode": "string",
+                    "longname": "string",
+                    "description": null,
+                    "keywords": [
+                        "string"
+                    ],
+                    "logo": "string",
+                    "ontologies": [
+                        "string"
+                    ],
+                    "status": true,
+                    "selfjoin": true,
+                    "copyrightAttribution": {
+                        "value": "string"
+                    },
+                    "license": {
+                        "value": "string"
+                    }
+                },
+                "status": true,
+                "selfjoin": true
+            }
+        ],
+        "projects": null,
+        "permissions": {
+            "groupsPerProject": {},
+            "administrativePermissionsPerProject": {}
+        }
+    }
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "UserResponseADM",
+    "type": "object",
+    "required": [
+        "user"
+    ],
+    "properties": {
+        "user": {
+            "$ref": "#/components/schemas/User"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

DELETE /admin/users/iri/{userIri}/project-memberships/{projectIri}

+
+Description +

Remove a user from a project membership identified by IRI.

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
httpAuth1headerstringN/ANoBasic authentication
httpAuthheaderstringN/ANoJWT Bearer token
KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9cookiestringNo
projectIripathstringNoThe IRI of a project. Must be URL-encoded.
userIripathstringNoThe user IRI. Must be URL-encoded.
+ +

+ Response 200 OK +

+ +
+
+
+

{
+    "user": {
+        "id": "string",
+        "username": "string",
+        "email": "string",
+        "givenName": "string",
+        "familyName": "string",
+        "status": true,
+        "lang": "string",
+        "password": "string",
+        "groups": [
+            {
+                "id": "string",
+                "name": "string",
+                "descriptions": [
+                    {
+                        "value": "string",
+                        "language": "string"
+                    }
+                ],
+                "project": {
+                    "id": "string",
+                    "shortname": "string",
+                    "shortcode": "string",
+                    "longname": "string",
+                    "description": null,
+                    "keywords": [
+                        "string"
+                    ],
+                    "logo": "string",
+                    "ontologies": [
+                        "string"
+                    ],
+                    "status": true,
+                    "selfjoin": true,
+                    "copyrightAttribution": {
+                        "value": "string"
+                    },
+                    "license": {
+                        "value": "string"
+                    }
+                },
+                "status": true,
+                "selfjoin": true
+            }
+        ],
+        "projects": null,
+        "permissions": {
+            "groupsPerProject": {},
+            "administrativePermissionsPerProject": {}
+        }
+    }
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "UserResponseADM",
+    "type": "object",
+    "required": [
+        "user"
+    ],
+    "properties": {
+        "user": {
+            "$ref": "#/components/schemas/User"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

POST /admin/users/iri/{userIri}/project-admin-memberships/{projectIri}

+
+Description +

Add a user as an admin to a project identified by IRI.

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
httpAuth1headerstringN/ANoBasic authentication
httpAuthheaderstringN/ANoJWT Bearer token
KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9cookiestringNo
projectIripathstringNoThe IRI of a project. Must be URL-encoded.
userIripathstringNoThe user IRI. Must be URL-encoded.
+ +

+ Response 200 OK +

+ +
+
+
+

{
+    "user": {
+        "id": "string",
+        "username": "string",
+        "email": "string",
+        "givenName": "string",
+        "familyName": "string",
+        "status": true,
+        "lang": "string",
+        "password": "string",
+        "groups": [
+            {
+                "id": "string",
+                "name": "string",
+                "descriptions": [
+                    {
+                        "value": "string",
+                        "language": "string"
+                    }
+                ],
+                "project": {
+                    "id": "string",
+                    "shortname": "string",
+                    "shortcode": "string",
+                    "longname": "string",
+                    "description": null,
+                    "keywords": [
+                        "string"
+                    ],
+                    "logo": "string",
+                    "ontologies": [
+                        "string"
+                    ],
+                    "status": true,
+                    "selfjoin": true,
+                    "copyrightAttribution": {
+                        "value": "string"
+                    },
+                    "license": {
+                        "value": "string"
+                    }
+                },
+                "status": true,
+                "selfjoin": true
+            }
+        ],
+        "projects": null,
+        "permissions": {
+            "groupsPerProject": {},
+            "administrativePermissionsPerProject": {}
+        }
+    }
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "UserResponseADM",
+    "type": "object",
+    "required": [
+        "user"
+    ],
+    "properties": {
+        "user": {
+            "$ref": "#/components/schemas/User"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

DELETE /admin/users/iri/{userIri}/project-admin-memberships/{projectIri}

+
+Description +

Remove a user form an admin project membership identified by IRI.

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
httpAuth1headerstringN/ANoBasic authentication
httpAuthheaderstringN/ANoJWT Bearer token
KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9cookiestringNo
projectIripathstringNoThe IRI of a project. Must be URL-encoded.
userIripathstringNoThe user IRI. Must be URL-encoded.
+ +

+ Response 200 OK +

+ +
+
+
+

{
+    "user": {
+        "id": "string",
+        "username": "string",
+        "email": "string",
+        "givenName": "string",
+        "familyName": "string",
+        "status": true,
+        "lang": "string",
+        "password": "string",
+        "groups": [
+            {
+                "id": "string",
+                "name": "string",
+                "descriptions": [
+                    {
+                        "value": "string",
+                        "language": "string"
+                    }
+                ],
+                "project": {
+                    "id": "string",
+                    "shortname": "string",
+                    "shortcode": "string",
+                    "longname": "string",
+                    "description": null,
+                    "keywords": [
+                        "string"
+                    ],
+                    "logo": "string",
+                    "ontologies": [
+                        "string"
+                    ],
+                    "status": true,
+                    "selfjoin": true,
+                    "copyrightAttribution": {
+                        "value": "string"
+                    },
+                    "license": {
+                        "value": "string"
+                    }
+                },
+                "status": true,
+                "selfjoin": true
+            }
+        ],
+        "projects": null,
+        "permissions": {
+            "groupsPerProject": {},
+            "administrativePermissionsPerProject": {}
+        }
+    }
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "UserResponseADM",
+    "type": "object",
+    "required": [
+        "user"
+    ],
+    "properties": {
+        "user": {
+            "$ref": "#/components/schemas/User"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

POST /admin/users/iri/{userIri}/group-memberships/{groupIri}

+
+Description +

Add a user to a group identified by IRI.

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
httpAuth1headerstringN/ANoBasic authentication
httpAuthheaderstringN/ANoJWT Bearer token
groupIripathstringNoThe IRI of a group. Must be URL-encoded.
KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9cookiestringNo
userIripathstringNoThe user IRI. Must be URL-encoded.
+ +

+ Response 200 OK +

+ +
+
+
+

{
+    "user": {
+        "id": "string",
+        "username": "string",
+        "email": "string",
+        "givenName": "string",
+        "familyName": "string",
+        "status": true,
+        "lang": "string",
+        "password": "string",
+        "groups": [
+            {
+                "id": "string",
+                "name": "string",
+                "descriptions": [
+                    {
+                        "value": "string",
+                        "language": "string"
+                    }
+                ],
+                "project": {
+                    "id": "string",
+                    "shortname": "string",
+                    "shortcode": "string",
+                    "longname": "string",
+                    "description": null,
+                    "keywords": [
+                        "string"
+                    ],
+                    "logo": "string",
+                    "ontologies": [
+                        "string"
+                    ],
+                    "status": true,
+                    "selfjoin": true,
+                    "copyrightAttribution": {
+                        "value": "string"
+                    },
+                    "license": {
+                        "value": "string"
+                    }
+                },
+                "status": true,
+                "selfjoin": true
+            }
+        ],
+        "projects": null,
+        "permissions": {
+            "groupsPerProject": {},
+            "administrativePermissionsPerProject": {}
+        }
+    }
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "UserResponseADM",
+    "type": "object",
+    "required": [
+        "user"
+    ],
+    "properties": {
+        "user": {
+            "$ref": "#/components/schemas/User"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

DELETE /admin/users/iri/{userIri}/group-memberships/{groupIri}

+
+Description +

Remove a user form an group membership identified by IRI.

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
httpAuth1headerstringN/ANoBasic authentication
httpAuthheaderstringN/ANoJWT Bearer token
groupIripathstringNoThe IRI of a group. Must be URL-encoded.
KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9cookiestringNo
userIripathstringNoThe user IRI. Must be URL-encoded.
+ +

+ Response 200 OK +

+ +
+
+
+

{
+    "user": {
+        "id": "string",
+        "username": "string",
+        "email": "string",
+        "givenName": "string",
+        "familyName": "string",
+        "status": true,
+        "lang": "string",
+        "password": "string",
+        "groups": [
+            {
+                "id": "string",
+                "name": "string",
+                "descriptions": [
+                    {
+                        "value": "string",
+                        "language": "string"
+                    }
+                ],
+                "project": {
+                    "id": "string",
+                    "shortname": "string",
+                    "shortcode": "string",
+                    "longname": "string",
+                    "description": null,
+                    "keywords": [
+                        "string"
+                    ],
+                    "logo": "string",
+                    "ontologies": [
+                        "string"
+                    ],
+                    "status": true,
+                    "selfjoin": true,
+                    "copyrightAttribution": {
+                        "value": "string"
+                    },
+                    "license": {
+                        "value": "string"
+                    }
+                },
+                "status": true,
+                "selfjoin": true
+            }
+        ],
+        "projects": null,
+        "permissions": {
+            "groupsPerProject": {},
+            "administrativePermissionsPerProject": {}
+        }
+    }
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "UserResponseADM",
+    "type": "object",
+    "required": [
+        "user"
+    ],
+    "properties": {
+        "user": {
+            "$ref": "#/components/schemas/User"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

PUT /admin/users/iri/{userIri}/BasicUserInformation

+
+Description +

Update a user's basic information identified by IRI.

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
httpAuth1headerstringN/ANoBasic authentication
httpAuthheaderstringN/ANoJWT Bearer token
KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9cookiestringNo
userIripathstringNoThe user IRI. Must be URL-encoded.
+

Request body

+ +
+
+
+

{
+    "username": {
+        "value": "string"
+    },
+    "email": {
+        "value": "string"
+    },
+    "givenName": {
+        "value": "string"
+    },
+    "familyName": {
+        "value": "string"
+    },
+    "lang": {
+        "value": "string"
+    }
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the request body +
{
+    "title": "BasicUserInformationChangeRequest",
+    "type": "object",
+    "properties": {
+        "username": {
+            "$ref": "#/components/schemas/Username"
+        },
+        "email": {
+            "$ref": "#/components/schemas/Email"
+        },
+        "givenName": {
+            "$ref": "#/components/schemas/GivenName"
+        },
+        "familyName": {
+            "$ref": "#/components/schemas/FamilyName"
+        },
+        "lang": {
+            "$ref": "#/components/schemas/LanguageCode"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 200 OK +

+ +
+
+
+

{
+    "user": {
+        "id": "string",
+        "username": "string",
+        "email": "string",
+        "givenName": "string",
+        "familyName": "string",
+        "status": true,
+        "lang": "string",
+        "password": "string",
+        "groups": [
+            {
+                "id": "string",
+                "name": "string",
+                "descriptions": [
+                    {
+                        "value": "string",
+                        "language": "string"
+                    }
+                ],
+                "project": {
+                    "id": "string",
+                    "shortname": "string",
+                    "shortcode": "string",
+                    "longname": "string",
+                    "description": null,
+                    "keywords": [
+                        "string"
+                    ],
+                    "logo": "string",
+                    "ontologies": [
+                        "string"
+                    ],
+                    "status": true,
+                    "selfjoin": true,
+                    "copyrightAttribution": {
+                        "value": "string"
+                    },
+                    "license": {
+                        "value": "string"
+                    }
+                },
+                "status": true,
+                "selfjoin": true
+            }
+        ],
+        "projects": null,
+        "permissions": {
+            "groupsPerProject": {},
+            "administrativePermissionsPerProject": {}
+        }
+    }
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "UserResponseADM",
+    "type": "object",
+    "required": [
+        "user"
+    ],
+    "properties": {
+        "user": {
+            "$ref": "#/components/schemas/User"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

PUT /admin/users/iri/{userIri}/Password

+
+Description +

Change a user's password identified by IRI.

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
httpAuth1headerstringN/ANoBasic authentication
httpAuthheaderstringN/ANoJWT Bearer token
KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9cookiestringNo
userIripathstringNoThe user IRI. Must be URL-encoded.
+

Request body

+ +
+
+
+

{
+    "requesterPassword": {
+        "value": "string"
+    },
+    "newPassword": null
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the request body +
{
+    "title": "PasswordChangeRequest",
+    "type": "object",
+    "required": [
+        "requesterPassword",
+        "newPassword"
+    ],
+    "properties": {
+        "requesterPassword": {
+            "$ref": "#/components/schemas/Password"
+        },
+        "newPassword": {
+            "$ref": "#/components/schemas/Password"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 200 OK +

+ +
+
+
+

{
+    "user": {
+        "id": "string",
+        "username": "string",
+        "email": "string",
+        "givenName": "string",
+        "familyName": "string",
+        "status": true,
+        "lang": "string",
+        "password": "string",
+        "groups": [
+            {
+                "id": "string",
+                "name": "string",
+                "descriptions": [
+                    {
+                        "value": "string",
+                        "language": "string"
+                    }
+                ],
+                "project": {
+                    "id": "string",
+                    "shortname": "string",
+                    "shortcode": "string",
+                    "longname": "string",
+                    "description": null,
+                    "keywords": [
+                        "string"
+                    ],
+                    "logo": "string",
+                    "ontologies": [
+                        "string"
+                    ],
+                    "status": true,
+                    "selfjoin": true,
+                    "copyrightAttribution": {
+                        "value": "string"
+                    },
+                    "license": {
+                        "value": "string"
+                    }
+                },
+                "status": true,
+                "selfjoin": true
+            }
+        ],
+        "projects": null,
+        "permissions": {
+            "groupsPerProject": {},
+            "administrativePermissionsPerProject": {}
+        }
+    }
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "UserResponseADM",
+    "type": "object",
+    "required": [
+        "user"
+    ],
+    "properties": {
+        "user": {
+            "$ref": "#/components/schemas/User"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

PUT /admin/users/iri/{userIri}/Status

+
+Description +

Change a user's status identified by IRI.

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
httpAuth1headerstringN/ANoBasic authentication
httpAuthheaderstringN/ANoJWT Bearer token
KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9cookiestringNo
userIripathstringNoThe user IRI. Must be URL-encoded.
+

Request body

+ +
+
+
+

{
+    "status": {
+        "value": true
+    }
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the request body +
{
+    "title": "StatusChangeRequest",
+    "type": "object",
+    "required": [
+        "status"
+    ],
+    "properties": {
+        "status": {
+            "$ref": "#/components/schemas/UserStatus"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 200 OK +

+ +
+
+
+

{
+    "user": {
+        "id": "string",
+        "username": "string",
+        "email": "string",
+        "givenName": "string",
+        "familyName": "string",
+        "status": true,
+        "lang": "string",
+        "password": "string",
+        "groups": [
+            {
+                "id": "string",
+                "name": "string",
+                "descriptions": [
+                    {
+                        "value": "string",
+                        "language": "string"
+                    }
+                ],
+                "project": {
+                    "id": "string",
+                    "shortname": "string",
+                    "shortcode": "string",
+                    "longname": "string",
+                    "description": null,
+                    "keywords": [
+                        "string"
+                    ],
+                    "logo": "string",
+                    "ontologies": [
+                        "string"
+                    ],
+                    "status": true,
+                    "selfjoin": true,
+                    "copyrightAttribution": {
+                        "value": "string"
+                    },
+                    "license": {
+                        "value": "string"
+                    }
+                },
+                "status": true,
+                "selfjoin": true
+            }
+        ],
+        "projects": null,
+        "permissions": {
+            "groupsPerProject": {},
+            "administrativePermissionsPerProject": {}
+        }
+    }
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "UserResponseADM",
+    "type": "object",
+    "required": [
+        "user"
+    ],
+    "properties": {
+        "user": {
+            "$ref": "#/components/schemas/User"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+ +

PUT /admin/users/iri/{userIri}/SystemAdmin

+
+Description +

Change a user's SystemAdmin status identified by IRI.

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
httpAuth1headerstringN/ANoBasic authentication
httpAuthheaderstringN/ANoJWT Bearer token
KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9cookiestringNo
userIripathstringNoThe user IRI. Must be URL-encoded.
+

Request body

+ +
+
+
+

{
+    "systemAdmin": {
+        "value": true
+    }
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the request body +
{
+    "title": "SystemAdminChangeRequest",
+    "type": "object",
+    "required": [
+        "systemAdmin"
+    ],
+    "properties": {
+        "systemAdmin": {
+            "$ref": "#/components/schemas/SystemAdmin"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 200 OK +

+ +
+
+
+

{
+    "user": {
+        "id": "string",
+        "username": "string",
+        "email": "string",
+        "givenName": "string",
+        "familyName": "string",
+        "status": true,
+        "lang": "string",
+        "password": "string",
+        "groups": [
+            {
+                "id": "string",
+                "name": "string",
+                "descriptions": [
+                    {
+                        "value": "string",
+                        "language": "string"
+                    }
+                ],
+                "project": {
+                    "id": "string",
+                    "shortname": "string",
+                    "shortcode": "string",
+                    "longname": "string",
+                    "description": null,
+                    "keywords": [
+                        "string"
+                    ],
+                    "logo": "string",
+                    "ontologies": [
+                        "string"
+                    ],
+                    "status": true,
+                    "selfjoin": true,
+                    "copyrightAttribution": {
+                        "value": "string"
+                    },
+                    "license": {
+                        "value": "string"
+                    }
+                },
+                "status": true,
+                "selfjoin": true
+            }
+        ],
+        "projects": null,
+        "permissions": {
+            "groupsPerProject": {},
+            "administrativePermissionsPerProject": {}
+        }
+    }
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "UserResponseADM",
+    "type": "object",
+    "required": [
+        "user"
+    ],
+    "properties": {
+        "user": {
+            "$ref": "#/components/schemas/User"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

Admin Files

+
+ +

GET /admin/files/{projectShortcode}/{filename}

+
+Description +

Returns the permission code and the project's restricted view settings for a +given shortcode and filename.

+
+

Input parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterInTypeDefaultNullableDescription
httpAuth1headerstringN/ANoBasic authentication
httpAuthheaderstringN/ANoJWT Bearer token
filenamepathstringNo
KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9cookiestringNo
projectShortcodepathstringNoThe shortcode of a project. Must be a 4 digit hexadecimal String.
+ +

+ Response 200 OK +

+ +
+
+
+

{
+    "permissionCode": 8,
+    "restrictedViewSettings": {
+        "size": "string",
+        "watermark": true
+    }
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "PermissionCodeAndProjectRestrictedViewSettings",
+    "type": "object",
+    "required": [
+        "permissionCode"
+    ],
+    "properties": {
+        "permissionCode": {
+            "type": "integer",
+            "format": "int32"
+        },
+        "restrictedViewSettings": {
+            "$ref": "#/components/schemas/ProjectRestrictedViewSettingsADM"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 400 Bad Request +

+ +
+
+
+
+Schema of the response body +
{
+    "anyOf": [
+        {
+            "$ref": "#/components/schemas/BadRequestException"
+        },
+        {
+            "$ref": "#/components/schemas/ValidationException"
+        },
+        {
+            "$ref": "#/components/schemas/DuplicateValueException"
+        },
+        {
+            "$ref": "#/components/schemas/GravsearchException"
+        }
+    ]
+}
+
+
+
+
+
+

+ Response 401 Unauthorized +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "BadCredentialsException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 403 Forbidden +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "ForbiddenException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+

+ Response 404 Not Found +

+ +
+
+
+

{
+    "message": "string"
+}
+
+⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

+
+Schema of the response body +
{
+    "title": "NotFoundException",
+    "type": "object",
+    "required": [
+        "message"
+    ],
+    "properties": {
+        "message": {
+            "type": "string"
+        }
+    }
+}
+
+
+
+
+
+
+

Schemas

+

Active

+

AdministrativePermissionADM

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameType
forGroupstring
forProjectstring
hasPermissionsArray<PermissionADM>
iristring
+ +

AdministrativePermissionCreateResponseADM

+ + + + + + + + + + + + + +
NameType
administrativePermissionAdministrativePermissionADM
+ +

AdministrativePermissionGetResponseADM

+ + + + + + + + + + + + + +
NameType
administrativePermissionAdministrativePermissionADM
+ +

AdministrativePermissionsForProjectGetResponseADM

+ + + + + + + + + + + + + +
NameType
administrativePermissionsArray<AdministrativePermissionADM>
+ +

BadCredentialsException

+ + + + + + + + + + + + + +
NameType
messagestring
+ +

BadRequestException

+ + + + + + + + + + + + + +
NameType
messagestring
+ +

BasicUserInformationChangeRequest

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameType
emailEmail
familyNameFamilyName
givenNameGivenName
langLanguageCode
usernameUsername
+ +

CanDeleteListResponseADM

+ + + + + + + + + + + + + + + + + +
NameType
canDeleteListboolean
listIristring
+ +

CanJoin

+

CannotJoin

+

ChangeDoapRequest

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameType
forGroupstring
forPropertystring
forResourceClassstring
hasPermissionsArray<PermissionADM>
+ +

ChangePermissionGroupApiRequestADM

+ + + + + + + + + + + + + +
NameType
forGroupstring
+ +

ChangePermissionHasPermissionsApiRequestADM

+ + + + + + + + + + + + + +
NameType
hasPermissionsArray<PermissionADM>
+ +

ChangePermissionPropertyApiRequestADM

+ + + + + + + + + + + + + +
NameType
forPropertystring
+ +

ChangePermissionResourceClassApiRequestADM

+ + + + + + + + + + + + + +
NameType
forResourceClassstring
+ +

ChildNodeDeleteResponseADM

+ + + + + + + + + + + + + +
NameType
nodeListNodeADM
+ +

ChildNodeInfoGetResponseADM

+ + + + + + + + + + + + + +
NameType
nodeinfoListChildNodeInfoADM
+ +

Comments

+ + + + + + + + + + + + + +
NameType
valueArray<StringLiteralV2>
+ +

CopyrightAttribution

+ + + + + + + + + + + + + +
NameType
valuestring
+ +

CreateAdministrativePermissionAPIRequestADM

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameType
forGroupstring
forProjectstring
hasPermissionsArray<PermissionADM>
idstring
+ +

CreateDefaultObjectAccessPermissionAPIRequestADM

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameType
forGroupstring
forProjectstring
forPropertystring
forResourceClassstring
hasPermissionsArray<PermissionADM>
idstring
+ +

DefaultObjectAccessPermissionADM

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameType
forGroupstring
forProjectstring
forPropertystring
forResourceClassstring
hasPermissionsArray<PermissionADM>
iristring
+ +

DefaultObjectAccessPermissionCreateResponseADM

+ + + + + + + + + + + + + +
NameType
defaultObjectAccessPermissionDefaultObjectAccessPermissionADM
+ +

DefaultObjectAccessPermissionGetResponseADM

+ + + + + + + + + + + + + +
NameType
defaultObjectAccessPermissionDefaultObjectAccessPermissionADM
+ +

DefaultObjectAccessPermissionsForProjectGetResponseADM

+ + + + + + + + + + + + + +
NameType
defaultObjectAccessPermissionsArray<DefaultObjectAccessPermissionADM>
+ +

Description

+ + + + + + + + + + + + + +
NameType
valueStringLiteralV2
+ +

DuplicateValueException

+ + + + + + + + + + + + + +
NameType
messagestring
+ +

Email

+ + + + + + + + + + + + + +
NameType
valuestring
+ +

FamilyName

+ + + + + + + + + + + + + +
NameType
valuestring
+ +

ForbiddenException

+ + + + + + + + + + + + + +
NameType
messagestring
+ +

GivenName

+ + + + + + + + + + + + + +
NameType
valuestring
+ +

GravsearchException

+ + + + + + + + + + + + + +
NameType
messagestring
+ +

Group

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameType
descriptionsArray<StringLiteralV2>
idstring
namestring
projectProject
selfjoinboolean
statusboolean
+ +

GroupCreateRequest

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameType
descriptionsGroupDescriptions
idGroupIri
nameGroupName
projectProjectIri
selfjoinGroupSelfJoin
statusGroupStatus
+ +

GroupDescriptions

+ + + + + + + + + + + + + +
NameType
valueArray<StringLiteralV2>
+ +

GroupGetResponseADM

+ + + + + + + + + + + + + +
NameType
groupGroup
+ +

GroupIri

+ + + + + + + + + + + + + +
NameType
valuestring
+ +

GroupMembersGetResponseADM

+ + + + + + + + + + + + + +
NameType
membersArray<User>
+ +

GroupName

+ + + + + + + + + + + + + +
NameType
valuestring
+ +

GroupSelfJoin

+ + + + + + + + + + + + + +
NameType
valueboolean
+ +

GroupsGetResponseADM

+ + + + + + + + + + + + + +
NameType
groupsArray<Group>
+ +

GroupStatus

+ + + + + + + + + + + + + +
NameType
valueboolean
+ +

GroupStatusUpdateRequest

+ + + + + + + + + + + + + +
NameType
statusGroupStatus
+ +

GroupUpdateRequest

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameType
descriptionsGroupDescriptions
nameGroupName
selfjoinGroupSelfJoin
statusGroupStatus
+ +

Inactive

+

Keyword

+ + + + + + + + + + + + + +
NameType
valuestring
+ +

Labels

+ + + + + + + + + + + + + +
NameType
valueArray<StringLiteralV2>
+ +

LanguageCode

+ + + + + + + + + + + + + +
NameType
valuestring
+ +

License

+ + + + + + + + + + + + + +
NameType
valuestring
+ +

ListADM

+ + + + + + + + + + + + + + + + + +
NameType
childrenArray<ListChildNodeADM>
listinfoListRootNodeInfoADM
+ +

ListChangeCommentsRequest

+ + + + + + + + + + + + + +
NameType
commentsComments
+ +

ListChangeLabelsRequest

+ + + + + + + + + + + + + +
NameType
labelsLabels
+ +

ListChangeNameRequest

+ + + + + + + + + + + + + +
NameType
nameListName
+ +

ListChangePositionRequest

+ + + + + + + + + + + + + + + + + +
NameType
parentNodeIriListIri
positionPosition
+ +

ListChangeRequest

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameType
commentsComments
hasRootNodeListIri
labelsLabels
listIriListIri
nameListName
positionPosition
projectIriProjectIri
+ +

ListChildNodeADM

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameType
childrenArray<ListChildNodeADM>
commentsStringLiteralSequenceV2
hasRootNodestring
idstring
labelsStringLiteralSequenceV2
namestring
positioninteger(int32)
+ +

ListChildNodeInfoADM

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameType
commentsStringLiteralSequenceV2
hasRootNodestring
idstring
labelsStringLiteralSequenceV2
namestring
positioninteger(int32)
+ +

ListCreateRootNodeRequest

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameType
commentsComments
idListIri
labelsLabels
nameListName
projectIriProjectIri
+ +

ListDeleteResponseADM

+ + + + + + + + + + + + + + + + + +
NameType
deletedboolean
iristring
+ +

ListGetResponseADM

+ + + + + + + + + + + + + +
NameType
listListADM
+ +

ListIri

+ + + + + + + + + + + + + +
NameType
valuestring
+ +

ListItemDeleteResponseADM

+

Type:

+

ListItemGetResponseADM

+

Type:

+

ListName

+ + + + + + + + + + + + + +
NameType
valuestring
+ +

ListNodeADM

+

Type:

+

ListNodeCommentsDeleteResponseADM

+ + + + + + + + + + + + + + + + + +
NameType
commentsDeletedboolean
nodeIristring
+ +

ListNodeGetResponseADM

+ + + + + + + + + + + + + +
NameType
nodeNodeADM
+ +

ListRootNodeADM

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameType
childrenArray<ListChildNodeADM>
commentsStringLiteralSequenceV2
idstring
isRootNodeboolean
labelsStringLiteralSequenceV2
namestring
projectIristring
+ +

ListRootNodeInfoADM

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameType
commentsStringLiteralSequenceV2
idstring
isRootNodeboolean
labelsStringLiteralSequenceV2
namestring
projectIristring
+ +

ListsGetResponseADM

+ + + + + + + + + + + + + +
NameType
listsArray<ListRootNodeInfoADM>
+ + + + + + + + + + + + + + + +
NameType
valuestring
+ +

Longname

+ + + + + + + + + + + + + +
NameType
valuestring
+ +

Map_Seq_IRI

+

Map_Set_PermissionADM

+

MessageResponse

+ + + + + + + + + + + + + +
NameType
messagestring
+ +

NodeADM

+ + + + + + + + + + + + + + + + + +
NameType
childrenArray<ListChildNodeADM>
nodeinfoListChildNodeInfoADM
+ +

NodeInfoGetResponseADM

+

Type:

+

NodePositionChangeResponseADM

+ + + + + + + + + + + + + +
NameType
nodeListNodeADM
+ +

NotFoundException

+ + + + + + + + + + + + + +
NameType
messagestring
+ +

Password

+ + + + + + + + + + + + + +
NameType
valuestring
+ +

PasswordChangeRequest

+ + + + + + + + + + + + + + + + + +
NameType
newPasswordPassword
requesterPasswordPassword
+ +

PermissionADM

+ + + + + + + + + + + + + + + + + + + + + +
NameType
additionalInformationstring
namestring
permissionCodeinteger(int32)
+ +

PermissionCodeAndProjectRestrictedViewSettings

+ + + + + + + + + + + + + + + + + +
NameType
permissionCodeinteger(int32)
restrictedViewSettingsProjectRestrictedViewSettingsADM
+ +

PermissionDeleteResponseADM

+ + + + + + + + + + + + + + + + + +
NameType
deletedboolean
permissionIristring
+ +

PermissionGetResponseADM

+

Type:

+

PermissionInfoADM

+ + + + + + + + + + + + + + + + + +
NameType
iristring
permissionTypestring
+ +

PermissionsDataADM

+ + + + + + + + + + + + + + + + + +
NameType
administrativePermissionsPerProjectMap_Set_PermissionADM
groupsPerProjectMap_Seq_IRI
+ +

PermissionsForProjectGetResponseADM

+ + + + + + + + + + + + + +
NameType
permissionsArray<PermissionInfoADM>
+ +

Position

+ + + + + + + + + + + + + +
NameType
valueinteger(int32)
+ +

Project

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameType
copyrightAttributionCopyrightAttribution
descriptionArray<StringLiteralV2>
idstring
keywordsArray<string>
licenseLicense
logostring
longnamestring
ontologiesArray<string>
selfjoinboolean
shortcodestring
shortnamestring
statusboolean
+ +

ProjectAdminMembersGetResponseADM

+ + + + + + + + + + + + + +
NameType
membersArray<User>
+ +

ProjectCreateRequest

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameType
copyrightAttributionCopyrightAttribution
descriptionArray<Description>
idProjectIri
keywordsArray<Keyword>
licenseLicense
logoLogo
longnameLongname
selfjoinSelfJoin
shortcodeShortcode
shortnameShortname
statusStatus
+ +

ProjectExportInfoResponse

+ + + + + + + + + + + + + + + + + +
NameType
locationstring
projectShortcodestring
+ +

ProjectGetResponse

+ + + + + + + + + + + + + +
NameType
projectProject
+ +

ProjectImportResponse

+ + + + + + + + + + + + + +
NameType
locationstring
+ +

ProjectIri

+ + + + + + + + + + + + + +
NameType
valuestring
+ +

ProjectKeywordsGetResponse

+ + + + + + + + + + + + + +
NameType
keywordsArray<string>
+ +

ProjectMembersGetResponseADM

+ + + + + + + + + + + + + +
NameType
membersArray<User>
+ +

ProjectOperationResponseADM

+ + + + + + + + + + + + + +
NameType
projectProject
+ +

ProjectRestrictedViewSettingsADM

+ + + + + + + + + + + + + + + + + +
NameType
sizestring
watermarkboolean
+ +

ProjectRestrictedViewSettingsGetResponseADM

+ + + + + + + + + + + + + +
NameType
settingsProjectRestrictedViewSettingsADM
+ +

ProjectsGetResponse

+ + + + + + + + + + + + + +
NameType
projectsArray<Project>
+ +

ProjectsKeywordsGetResponse

+ + + + + + + + + + + + + +
NameType
keywordsArray<string>
+ +

ProjectUpdateRequest

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameType
copyrightAttributionCopyrightAttribution
descriptionArray<Description>
keywordsArray<Keyword>
licenseLicense
logoLogo
longnameLongname
selfjoinSelfJoin
shortnameShortname
statusStatus
+ +

RdfDataObject

+ + + + + + + + + + + + + + + + + +
NameType
namestring
pathstring
+ +

RestrictedViewResponse

+ + + + + + + + + + + + + + + + + +
NameType
sizeSize
watermarkWatermark
+ +

RootNodeInfoGetResponseADM

+ + + + + + + + + + + + + +
NameType
listinfoListRootNodeInfoADM
+ +

SelfJoin

+

Type:

+

SetRestrictedViewRequest

+ + + + + + + + + + + + + + + + + +
NameType
sizeSize
watermarkWatermark
+ +

Shortcode

+ + + + + + + + + + + + + +
NameType
valuestring
+ +

Shortname

+ + + + + + + + + + + + + +
NameType
valuestring
+ +

Size

+ + + + + + + + + + + + + +
NameType
valuestring
+ +

Status

+

Type:

+

StatusChangeRequest

+ + + + + + + + + + + + + +
NameType
statusUserStatus
+ +

StringLiteralSequenceV2

+ + + + + + + + + + + + + +
NameType
stringLiteralsArray<StringLiteralV2>
+ +

StringLiteralV2

+ + + + + + + + + + + + + + + + + +
NameType
languagestring
valuestring
+ +

SystemAdmin

+ + + + + + + + + + + + + +
NameType
valueboolean
+ +

SystemAdminChangeRequest

+ + + + + + + + + + + + + +
NameType
systemAdminSystemAdmin
+ +

User

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameType
emailstring
familyNamestring
givenNamestring
groupsArray<Group>
idstring
langstring
passwordstring
permissionsPermissionsDataADM
projectsArray<Project>
statusboolean
usernamestring
+ +

UserCreateRequest

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameType
emailEmail
familyNameFamilyName
givenNameGivenName
idUserIri
langLanguageCode
passwordPassword
statusUserStatus
systemAdminSystemAdmin
usernameUsername
+ +

UserGroupMembershipsGetResponseADM

+ + + + + + + + + + + + + +
NameType
groupsArray<Group>
+ +

UserIri

+ + + + + + + + + + + + + +
NameType
valuestring
+ +

Username

+ + + + + + + + + + + + + +
NameType
valuestring
+ +

UserProjectAdminMembershipsGetResponseADM

+ + + + + + + + + + + + + +
NameType
projectsArray<Project>
+ +

UserProjectMembershipsGetResponseADM

+ + + + + + + + + + + + + +
NameType
projectsArray<Project>
+ +

UserResponseADM

+ + + + + + + + + + + + + +
NameType
userUser
+ +

UsersGetResponseADM

+ + + + + + + + + + + + + +
NameType
usersArray<User>
+ +

UserStatus

+ + + + + + + + + + + + + +
NameType
valueboolean
+ +

ValidationException

+ + + + + + + + + + + + + +
NameType
msgstring
+ +

Watermark

+ + + + + + + + + + + + + +
NameType
valueboolean
+ +

Security schemes

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeSchemeDescription
httpAuthhttpbearer
httpAuth1httpbasic
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/03-endpoints/api-admin/introduction/index.html b/03-endpoints/api-admin/introduction/index.html new file mode 100644 index 0000000000..5e574d1db1 --- /dev/null +++ b/03-endpoints/api-admin/introduction/index.html @@ -0,0 +1,3092 @@ + + + + + + + + + + + + + + + + + + + + + + + Introduction - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + + + + + +
+
+ + + + + + +

Introduction: Using the Admin API

+

The DSP Admin API makes it possible to administrate projects, users, user groups, permissions, and hierarchical lists.

+

RESTful API

+

The Knora Admin API is a RESTful API that allows for reading and adding of +administrative resources from and to Knora and changing their values +using HTTP requests. The actual data is submitted as JSON (request and +response format). The various HTTP methods are applied according to the +widespread practice of RESTful APIs: GET for reading, POST for adding, +PUT for changing resources and values, and DELETE to delete resources or +values (see +Using HTTP Methods for RESTful Services).

+

Knora IRIs in the Admin API

+

Every resource that is created or hosted by Knora is identified by a +unique ID called an Internationalized Resource Identifier (IRI). +The IRI is required for every API operation to identify the resource in question. +A Knora IRI has itself the format of a URL. +For some API operations, the IRI has to be URL-encoded (HTTP GET requests).

+

Unlike the DSP-API v2, the admin API uses internal IRIs, i.e. the actual IRIs +that are stored in the triplestore (see Knora IRIs).

+

Admin Path Segment

+

Every request to Admin API includes admin as a path segment, e.g. +http://host/admin/users/iri/http%3A%2F%2Frdfh.ch%2Fusers%2Froot.

+

Admin API Response Format

+

If an API request is handled successfully, Knora responds +with a 200 HTTP status code. The actual answer from Knora (the +representation of the requested resource or information about the +executed API operation) is sent in the HTTP body, encoded as JSON.

+

Placeholder host in sample URLs

+

Please note that all the sample URLs used in this documentation contain +host as a placeholder. The placeholder host has to be replaced by +the actual hostname (and port) of the server the Knora instance is +running on.

+

Authentication

+

For all API operations that target at changing resources or values, the +client has to provide credentials (username and password) so that the +API server can authenticate the user making the request. Credentials can +be sent as a part of the HTTP header or as parts of the URL (see +Authentication in Knora).

+

Admin API Endpoints

+

An overview over all admin API endpoints can be found here.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/03-endpoints/api-admin/lists/index.html b/03-endpoints/api-admin/lists/index.html new file mode 100644 index 0000000000..ea2a1e36c3 --- /dev/null +++ b/03-endpoints/api-admin/lists/index.html @@ -0,0 +1,3574 @@ + + + + + + + + + + + + + + + + + + + + + + + Lists Endpoint - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + + + + + +
+
+ + + + + + +

Lists Endpoint

+

Endpoint Overview

+

List Item Operations:

+
    +
  • GET: /admin/lists[?projectIri=<projectIri>] : return all lists optionally filtered by project
  • +
  • GET: /admin/lists/<listItemIri> : return complete list with all children if IRI of the list (i.e. root node) is given. + If IRI of the child node is given, return the node with its immediate children
  • +
  • GET: /admin/lists/infos/<listIri> : return list information (without children)
  • +
  • GET: /admin/lists/nodes/<nodeIri> : return list node information (without children)
  • +
  • GET: /admin/lists/<listIri>/info : return list basic information (without children)
  • +
  • +

    GET: /admin/lists/candelete/<listItemIri> : check if list or its node is unused and can be deleted

    +
  • +
  • +

    POST: /admin/lists : create new list

    +
  • +
  • +

    POST: /admin/lists/<parentNodeIri> : create new child node under the supplied parent node IRI

    +
  • +
  • +

    PUT: /admin/lists/<listItemIri> : update node information (root or child)

    +
  • +
  • PUT: /admin/lists/<listItemIri>/name : update the name of the node (root or child)
  • +
  • PUT: /admin/lists/<listItemIri>/labels : update labels of the node (root or child)
  • +
  • PUT: /admin/lists/<listItemIri>/comments : update comments of the node (root or child)
  • +
  • +

    PUT: /admin/lists/<nodeIri>/position : update position of a child node within its current parent + or by changing its parent node

    +
  • +
  • +

    DELETE: /admin/lists/<listItemIri> : delete a list (i.e. root node) or a child node and all its children, if not used

    +
  • +
  • DELETE: /admin/lists/comments/<nodeIri> : delete comments of a node (child only)
  • +
+

List Item Operations

+

Get lists

+
    +
  • Required permission: none
  • +
  • Return all lists optionally filtered by project
  • +
  • GET: /admin/lists[?projectIri=<projectIri>]
  • +
+

Get list

+
    +
  • Required permission: none
  • +
  • Return complete list (or node) including basic information of the list (or child node), + listinfo (or nodeinfo), and all its children
  • +
  • GET: /admin/lists/<listIri>
  • +
+

Get list's information

+
    +
  • Required permission: none
  • +
  • Return list information, listinfo (without children).
  • +
  • GET: /admin/lists/infos/<listIri>
  • +
+

Get list node Information

+
    +
  • Required permission: none
  • +
  • Return node information, nodeinfo, (without children).
  • +
  • GET: /admin/lists/nodes/<nodeIri>
  • +
+

Get list's information (merged)

+
    +
  • Required permission: none
  • +
  • Return list (or node) basic information, listinfo (or nodeinfo), without its children
  • +
  • GET: /admin/lists/<listIri>/info
  • +
+

Check if list node is unused and can be deleted

+
    +
  • Required permission: none
  • +
  • GET: /admin/lists/candelete/<listItemIri>
  • +
  • Return simple JSON that confirms if the list node can be deleted
  • +
+
{
+    "canDeleteList": true,
+    "listIri": "http://rdfh.ch/lists/0801/xxx"
+}
+
+

List (root node or child node with all its children) can be deleted only if it (or one of its children) is not used.

+

Create new list

+
    +
  • Required permission: SystemAdmin / ProjectAdmin
  • +
  • Required fields: projectIri, labels, comments
  • +
  • POST: /admin/lists
  • +
  • BODY:
  • +
+
    {
+        "projectIri": "someprojectiri",
+        "labels": [{ "value": "New list", "language": "en"}],
+        "comments": []
+    } 
+
+

Additionally, each list can have an optional custom IRI (of Knora IRI form) +specified by the id in the request body as below:

+
  {
+    "id": "http://rdfh.ch/lists/0001/yWQEGXl53Z4C4DYJ-S2c5A",
+    "projectIri": "http://rdfh.ch/projects/0001",
+    "name": "a new list",
+    "labels": [{ "value": "New list with IRI", "language": "en"}],
+    "comments": [{ "value": "New comment", "language": "en"}]
+  }
+
+

The response will contain the basic information of the list, listinfo and an empty list of its children, as below:

+
{
+    "list": {
+        "children": [],
+        "listinfo": {
+            "comments": [{ "value": "New comment", "language": "en"}],
+            "id": "http://rdfh.ch/lists/0001/yWQEGXl53Z4C4DYJ-S2c5A",
+            "isRootNode": true,
+            "labels": [
+                {
+                    "value": "New list with IRI",
+                    "language": "en"
+                }
+            ],
+            "name": "a new list",
+            "projectIri": "http://rdfh.ch/projects/0001"
+        }
+    }
+}
+
+

Create new child node

+
    +
  • Required permission: SystemAdmin / ProjectAdmin
  • +
  • Required fields: parentNodeIri, projectIri, labels,
  • +
  • Appends a new child node under the supplied nodeIri. If the supplied nodeIri + is the listIri, then a new child node is appended to the top level. If a position is given + for the new child node, the node will be created and inserted in the specified position, otherwise + the node is appended to the end of parent's children.
  • +
  • POST: /admin/lists/<parentNodeIri>
  • +
  • BODY:
  • +
+
     {   
+         "parentNodeIri": "http://rdfh.ch/lists/0001/yWQEGXl53Z4C4DYJ-S2c5A",
+         "projectIri": "http://rdfh.ch/projects/0001",
+         "name": "a child",
+         "labels": [{ "value": "New List Node", "language": "en"}]
+    }
+
+

Additionally, each child node can have an optional custom IRI (of Knora IRI +form) specified by the id in the request body as below:

+
{    "id": "http://rdfh.ch/lists/0001/8u37MxBVMbX3XQ8-d31x6w",
+     "parentNodeIri": "http://rdfh.ch/lists/0001/yWQEGXl53Z4C4DYJ-S2c5A",
+     "projectIri": "http://rdfh.ch/projects/0001",
+     "name": "a child",
+     "labels": [{ "value": "New List Node", "language": "en"}]
+}
+
+

The response will contain the basic information of the node, nodeinfo, as below:

+
{
+    "nodeinfo": {
+        "comments": [],
+        "hasRootNode": "http://rdfh.ch/lists/0001/yWQEGXl53Z4C4DYJ-S2c5A",
+        "id": "http://rdfh.ch/lists/0001/8u37MxBVMbX3XQ8-d31x6w",
+        "labels": [
+            {
+                "value": "New List Node",
+                "language": "en"
+            }
+        ],
+        "name": "a new child",
+        "position": 1
+    }
+}
+
+

The new node can be created and inserted in a specific position which must be given in the payload as shown below. +If necessary, according to the given position, the sibling nodes will be shifted. +Note that position cannot have a value higher than the number of existing children.

+
{   "parentNodeIri": "http://rdfh.ch/lists/0001/yWQEGXl53Z4C4DYJ-S2c5A",
+    "projectIri": "http://rdfh.ch/projects/0001",
+    "name": "Inserted new child",
+    "position": 0,
+    "labels": [{ "value": "New List Node", "language": "en"}]
+}
+
+

In case the new node should be appended to the list of current children, either position: -1 must be given in the +payload or the position parameter must be left out of the payload.

+

Update list's or node's information

+

The basic information of a list (or node) such as its labels, comments, name, or all of them can be updated. +The parameters that must be updated together with the new value must be given in the JSON body of the request +together with the IRI of the list and the IRI of the project it belongs to.

+
    +
  • Required permission: SystemAdmin / ProjectAdmin
  • +
  • Required fields: listIri, projectIri
  • +
  • Update list information
  • +
  • PUT: /admin/lists/<listIri>
  • +
  • BODY:
  • +
+
{
+    "listIri": "http://rdfh.ch/lists/0001/yWQEGXl53Z4C4DYJ-S2c5A",
+    "projectIri": "http://rdfh.ch/projects/0001",
+    "name": "new name for the list",
+    "labels": [{ "value": "a new label for the list", "language": "en"}],
+    "comments": [{ "value": "a new comment for the list", "language": "en"}]
+}
+
+

The response will contain the basic information of the list, listinfo (or nodeinfo), without its children, as below:

+
{
+    "listinfo": {
+        "comments": [
+            {
+                "value": "a new comment for the list",
+                "language": "en"
+            }
+        ],
+        "id": "http://rdfh.ch/lists/0001/yWQEGXl53Z4C4DYJ-S2c5A",
+        "isRootNode": true,
+        "labels": [
+            {
+                "value": "a new label for the list",
+                "language": "en"
+            }
+        ],
+        "name": "new name for the list",
+        "projectIri": "http://rdfh.ch/projects/0001"
+    }
+}
+
+

If only name of the list must be updated, it can be given as below in the body of the request:

+
{
+    "listIri": "listIri",
+    "projectIri": "someprojectiri",
+    "name": "another name"
+}
+
+

Alternatively, basic information name, labels, or comments of the root node (i.e. list) +can be updated individually as explained below.

+

Update list or node's name

+
    +
  • Required permission: SystemAdmin / ProjectAdmin
  • +
  • Update name of the list (i.e. root node) or a child node whose IRI is specified by <listItemIri>.
  • +
  • PUT: /admin/lists/<listItemIri>/name
  • +
  • BODY: The new name of the node must be given in the body of the request as shown below:
  • +
+
{
+    "name": "a new name"
+}
+
+

There is no need to specify the project IRI because it is automatically extracted using the given <listItemIRI>.

+

Update list or node's labels

+
    +
  • Required permission: SystemAdmin / ProjectAdmin
  • +
  • Update labels of the list (i.e. root node) or a child node whose IRI is specified by <listItemIri>.
  • +
  • PUT: /admin/lists/<listItemIri>/labels
  • +
  • BODY: The new set of labels of the node must be given in the body of the request as shown below:
  • +
+
{
+    "labels": [{"language": "se", "value": "nya märkningen"}]
+}
+
+

There is no need to specify the project IRI because it is automatically extracted using the given <listItemIRI>.

+

Update list or node's comments

+
    +
  • Required permission: SystemAdmin / ProjectAdmin
  • +
  • Update comments of the list (i.e. root node) or a child node whose IRI is specified by <listItemIri>.
  • +
  • PUT: /admin/lists/<listItemIri>/labels
  • +
  • BODY: The new set of comments of the node must be given in the body of the request as shown below:
  • +
+
{
+    "comments": [{"language": "se", "value": "nya kommentarer"}]
+}
+
+

There is no need to specify the project IRI because it is automatically extracted using the given <listItemIRI>.

+

Repositioning a child node

+

The position of an existing child node can be updated. The child node can be either repositioned within its +current parent node, or can be added to another parent node in a specific position. The IRI of the parent node +and the new position of the child node must be given in the request body.

+

If a node is supposed to be repositioned to the end of a parent node's children, give position: -1.

+

Suppose a parent node parentNode1 has five children in positions 0-4, to change the position of its child node +childNode4 from its original position 3 to position 1 the request body should specify the IRI of its parent node +and the new position as below:

+
   {
+      "parentNodeIri": "<parentNode1-IRI>",
+      "position": 1
+  }
+
+

Then the node childNode4 will be put in position 1, and its siblings will be shifted accordingly. The new position given +in the request body cannot be the same as the child node's original position. If position: -1 is given, the node will +be moved to the end of children list, and its siblings will be shifted to left. In case of repositioning the node +within its current parent, the maximum permitted position is the length of its children list, i.e. in this example the +highest allowed position is 4.

+

To reposition a child node childNode4 to another parent node parentNode2 in a specific position, for +example position: 3, the IRI of the new parent node and the position the node must be placed within children of +parentNode2 must be given as:

+
   {
+      "parentNodeIri": "<parentNode2-IRI>",
+      "position": 3
+  }
+
+

In this case, the childNode4 is removed from the list of children of its old parent parentNode1 and its old +siblings are shifted accordingly. Then the node childNode4 is added to the specified new parent, i.e. parentNode2, in +the given position. The new siblings are shifted accordingly.

+

Note that, the furthest the node can be placed is at the end of the list of the children of parentNode2. That means +if parentNode2 had 3 children with positions 0-2, then childNode4 can be placed in position 0-3 within children +of its new parent node. If the position: -1 is given, the node will be appended to the end of new parent's children, +and new siblings will not be shifted.

+

Values less than -1 are not permitted for parameter position.

+
    +
  • Required permission: SystemAdmin / ProjectAdmin
  • +
  • Response: returns the updated parent node with all its children.
  • +
  • Put /admin/lists/<nodeIri>/position
  • +
+

Delete a list or a node

+

An entire list or a single node of it can be completely deleted, if not in use. Before deleting an entire list +(i.e. root node), the data and ontologies are checked for any usage of the list or its children. If not in use, the list +and all its children are deleted.

+

Similarily, before deleting a single node of a list, it is verified that the node itself and none of its children are used. +If not in use, the node and all its children are deleted. Once a node is deleted, its parent node is updated by shifting the +remaining child nodes with respect to the position of the deleted node.

+
    +
  • Required permission: SystemAdmin / ProjectAdmin
  • +
  • +

    Response:

    +
      +
    • If the IRI of the list (i.e. root node) is given, the iri of the deleted list with a flag deleted: true is returned.
    • +
    • If the IRI of a child node is given, the updated parent node is returned.
    • +
    +
  • +
  • +

    Delete /admin/lists/<listItemIri>

    +
  • +
+

Delete child node comments

+

Performing a DELETE request to route /admin/lists/comments/<nodeIri> deletes the comments of that node. +As a response sipmle JSON is returned:

+
{
+    "commentsDeleted": true,
+    "nodeIri": "http://rdfh.ch/lists/0801/xxx"
+}
+
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/03-endpoints/api-admin/overview/index.html b/03-endpoints/api-admin/overview/index.html new file mode 100644 index 0000000000..ec452fb553 --- /dev/null +++ b/03-endpoints/api-admin/overview/index.html @@ -0,0 +1,2902 @@ + + + + + + + + + + + + + + + + + + + + + + + Overview - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + +

Admin Endpoint

+

For the management of users, projects, groups, lists, and permissions, the DSP-API following a resource +centric approach, provides the following endpoints corresponding to the respective classes of objects that they have an +effect on, namely:

+ +

All information regarding users, projects, groups, lists and permissions is stored in the http://www.knora.org/admin +named graph.

+

Additionally there is the stores endpoint which allows manipulation of the triplestore content.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/03-endpoints/api-admin/permissions/index.html b/03-endpoints/api-admin/permissions/index.html new file mode 100644 index 0000000000..fe3cc86e22 --- /dev/null +++ b/03-endpoints/api-admin/permissions/index.html @@ -0,0 +1,3433 @@ + + + + + + + + + + + + + + + + + + + + + + + Permissions Endpoint - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + + + + + +
+
+ + + + + + +

Permissions Endpoint

+

For an extensive explanation on how DSP permissions are implemented, see +here.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RouteOperationsExplanation
/admin/permissions/{projectIri}GETget all permissions of a project
/admin/permissions/ap/{projectIri}GETget all administrative permissions of a project
/admin/permissions/ap/{projectIri}/{groupIri}GETget all administrative permissions of a group
/admin/permissions/doap/{projectIri}GETget all default object access permissions of a project
/admin/permissions/apPOSTcreate a new administrative permission
/admin/permissions/doapPOSTcreate a new default object access permission
/admin/permissions/doap/{permissionIri}PUTupdate an existing default object access permission
/admin/permissions/{permissionIri}/groupPUTupdate for which group an administrative or default object access permission is used
/admin/permissions/{permissionIri}/hasPermissionPUTupdate the scope of an administrative or default object access permission, i.e. what permissions are granted to which group when this permission applies
/admin/permissions/{permissionIri}DELETEdelete an administrative or default object access permission
/admin/permissions/{doap_permissionIri}/resourceClassPUTdeprecated, use /admin/permissions/doap/{permissionIri} instead
/admin/permissions/{doap_permissionIri}/propertyPUTdeprecated, use /admin/permissions/doap/{permissionIri} instead
+

Permission Operations

+

Note: For the following operations, the requesting user must be either a systemAdminor a projectAdmin.

+

Getting Permissions

+
    +
  • +

    GET: /admin/permissions/<projectIri> : return all permissions for a project. +As a response, the IRI and the type of all permissions of a project are returned.

    +
  • +
  • +

    GET: /admin/permissions/ap/<projectIri>: return all administrative permissions +for a project. As a response, all administrative_permissions of a project are returned.

    +
  • +
  • +

    GET: /admin/permissions/ap/<projectIri>/<groupIri>: return the administrative +permissions for a project group. As a response, the administrative_permission defined +for the group is returned.

    +
  • +
  • +

    GET: /admin/permissions/doap/<projectIri>: return all default object access +permissions for a project. As a response, all default_object_acces_permissions of a +project are returned.

    +
  • +
+

Creating New Administrative Permissions

+
    +
  • POST: /admin/permissions/ap: create a new administrative permission. The type of +permissions, the project and group to which the permission should be added must be +included in the request body, for example:
  • +
+
{
+    "forGroup":"http://rdfh.ch/groups/0001/thing-searcher", 
+    "forProject":"http://rdfh.ch/projects/0001", 
+    "hasPermissions":[
+      {
+        "additionalInformation":null,
+        "name":"ProjectAdminGroupAllPermission",
+        "permissionCode":null
+      }
+    ]
+}
+
+

In addition, in the body of the request, it is possible to specify a custom IRI (of +DSP IRI form) for a permission through +the @id attribute which will then be assigned to the permission; otherwise the permission will get a unique random IRI. +A custom permission IRI must be http://rdfh.ch/permissions/PROJECT_SHORTCODE/ (where PROJECT_SHORTCODE +is the shortcode of the project that the permission belongs to), plus a custom ID string. For example:

+
"id": "http://rdfh.ch/permissions/0001/jKIYuaEUETBcyxpenUwRzQ",
+
+

As a response, the created administrative permission and its IRI are returned as below:

+
{
+    "administrative_permission": {
+        "forGroup": "http://rdfh.ch/groups/0001/thing-searcher",
+        "forProject": "http://rdfh.ch/projects/0001",
+        "hasPermissions": [
+            {
+                "additionalInformation": null,
+                "name": "ProjectAdminGroupAllPermission",
+                "permissionCode": null
+            }
+        ],
+        "iri": "http://rdfh.ch/permissions/0001/mFlyBEiMQtGzwy_hK0M-Ow"
+    }
+}
+
+

hasPermissions contains permission types that must be granted. See the complete description of administrative +permission types. +In summary, each permission should contain followings:

+
    +
  • additionalInformation: should be left empty, otherwise will be ignored.
  • +
  • name : indicates the type of the permission that can be one of the followings:
      +
    • ProjectAdminAllPermission: gives the user the permission to do anything + on project level, i.e. create new groups, modify all + existing groups
    • +
    • ProjectAdminGroupAllPermission: gives the user the permission to modify + group info and group membership on all groups + belonging to the project.
    • +
    • ProjectAdminGroupRestrictedPermission: gives the user the permission to modify + group info and group membership on certain groups + belonging to the project.
    • +
    • ProjectAdminRightsAllPermission: gives the user the permission to change the + permissions on all objects belonging to the project + (e.g., default permissions attached to groups and + permissions on objects).
    • +
    • ProjectResourceCreateAllPermission: gives the permission to create resources + inside the project.
    • +
    • ProjectResourceCreateRestrictedPermission: gives restricted resource creation permission + inside the project.
    • +
    +
  • +
  • permissionCode: should be left empty, otherwise will be ignored.
  • +
+

Note that during the creation of a new project, +a default set of administrative permissions are added to its ProjectAdmin and ProjectMember groups +(See Default set of permissions for a new project). +Therefore, it is not possible to create new administrative permissions +for the ProjectAdmin and ProjectMember groups of a project. +However, the default permissions set for these groups can be modified +(See update permission).

+

Creating New Default Object Access Permissions

+
    +
  • POST: /admin/permissions/doap : create a new default object access permission. +A single instance of knora-admin:DefaultObjectAccessPermission must +always reference a project, but can only reference either a group +(knora-admin:forGroup property), a resource class +(knora-admin:forResourceClass), a property (knora-admin:forProperty), +or a combination of resource class and property. For example, to create a new +default object access permission for a group of a project the request body would be
  • +
+
{
+    "forGroup":"http://rdfh.ch/groups/0001/thing-searcher",
+    "forProject":"http://rdfh.ch/projects/0001",
+    "forProperty":null,
+    "forResourceClass":null,
+    "hasPermissions":[
+      {
+        "additionalInformation":"http://www.knora.org/ontology/knora-admin#ProjectMember",
+        "name":"D",
+        "permissionCode":7
+      }
+    ]
+}
+
+

hasPermissions contains permission types that must be granted. See a complete description of object access +permission types. +In summary, each permission should contain followings:

+
    +
  • additionalInformation: To whom the permission should be granted: project members, known users, unknown users, etc.
  • +
  • name : indicates the type of the permission that can be one of the followings.
      +
    • RV: restricted view permission (least privileged)
    • +
    • V: view permission
    • +
    • M modify permission
    • +
    • D: delete permission
    • +
    • CR: change rights permission (most privileged)
    • +
    +
  • +
  • permissionCode: The code assigned to a permission indicating its hierarchical level. These codes are as below:
      +
    • 1: for restricted view permission (least privileged)
    • +
    • 2: for view permission
    • +
    • 6: for modify permission
    • +
    • 7: for delete permission
    • +
    • 8: for change rights permission (most privileged)
    • +
    +
  • +
+

Note that, at least either name or permissionCode must be provided. If one is missing, it will be extrapolated from the other. +For example, if permissionCode= 1 is given but name was left empty, its value will be set to name = RV.

+

Similar to the previous case a custom IRI can be assigned to a permission specified by the id in the request body. +The example below shows the request body to create a new default object access permission with a custom IRI defined for +a resource class of a specific project:

+
{
+    "id": "http://rdfh.ch/permissions/00FF/fSw7w1sI5IwDjEfFi1jOeQ",
+    "forGroup": null,
+    "forProject": "http://rdfh.ch/projects/00FF",
+    "forProperty": null,
+    "forResourceClass": "http://api.dasch.swiss/ontology/00FF/images/v2#bild",
+    "hasPermissions": [
+      {
+        "additionalInformation": "http://www.knora.org/ontology/knora-admin#ProjectMember",
+        "name": "D",
+        "permissionCode": 7
+      }
+    ]
+}
+
+

The response contains the newly created permission and its IRI, as:

+
{
+    "default_object_access_permission": {
+        "forGroup": null,
+        "forProject": "http://rdfh.ch/projects/00FF",
+        "forProperty": null,
+        "forResourceClass": "http://api.dasch.swiss/ontology/00FF/images/v2#bild",
+        "hasPermissions": [
+            {
+                "additionalInformation": "http://www.knora.org/ontology/knora-admin#ProjectMember",
+                "name": "D",
+                "permissionCode": 7
+            }
+        ],
+        "iri": "http://rdfh.ch/permissions/00FF/fSw7w1sI5IwDjEfFi1jOeQ"
+    }
+}
+
+

Note that during the creation of a new project, +a set of default object access permissions are created for its ProjectAdmin and ProjectMember groups +(See Default set of permissions for a new project). +Therefore, it is not possible to create new default object access permissions +for the ProjectAdmin and ProjectMember groups of a project. +However, the default permissions set for these groups can be modified; see below for more information.

+

Updating an existing Default Object Access Permission

+
    +
  • PUT: /admin/permissions/doap/<doap_permissionIri> to change the attributes of an existing default object + access permission, identified by its IRI <doap_permissionIri>.
  • +
+

This is an example of a request body to update an existing default object access permission:

+
{
+  "forProperty" : "http://api.dasch.swiss/ontology/00FF/images/v2#hasTitle",
+  "forResourceClass": "http://api.dasch.swiss/ontology/0803/incunabula/v2#Book",
+  "forGroup": null, 
+  "hasPermissions": [
+    {
+      "additionalInformation": "http://www.knora.org/ontology/knora-admin#ProjectMember",
+      "name": "D",
+      "permissionCode": 7
+    }
+  ]
+}
+
+

All attributes of the default object access permission are optional and may be combined.

+
+

Warning

+

Only certain combinations of attributes are allowed. Only exactly one of the following combinations is allowed:

+
    +
  • forGroup
  • +
  • forResourceClass
  • +
  • forProperty
  • +
  • forResourceClass and forProperty
  • +
+
+

If the combination of attributes is not allowed, the request will fail with a 400 Bad Request error. +Any valid combination of attributes will replace the existing values.

+

If present, the hasPermissions attribute must contain all permission types that must be granted. See a complete description of object access +permission types. +This is also described in the Creating New Default Object Access Permissions section.

+

The response is the updated default object access permission with its new attributes and is the same as when +creating a new default object access permission.

+

Updating a Permission's Group

+
+

Warning

+

For Default Object Access Permissions this endpoint is deprecated, use PUT: /admin/permissions/doap/<permissionIri> instead.

+
+
    +
  • PUT: /admin/permissions/<permissionIri>/group to change the group for which an administrative or a default object +access permission, identified by its IRI <permissionIri>, is defined. The request body must contain the IRI of the new +group as below:
  • +
+
{
+    "forGroup": "http://www.knora.org/ontology/knora-admin#ProjectMember"
+}
+
+

When updating an administrative permission, its previous forGroup value will be replaced with the new one. +When updating a default object access permission, if it originally had a forGroup value defined, it will be replaced +with the new group. Otherwise, if the default object access permission was defined for a resource class or a property or +the combination of both, the permission will be defined for the newly specified group and its previous +forResourceClass and forProperty values will be deleted.

+

Updating a Permission's Scope

+
+

Note

+

For Default Object Access Permissions this endpoint is deprecated, use PUT: /admin/permissions/doap/<permissionIri> instead.

+
+
    +
  • PUT: /admin/permissions/<permissionIri>/hasPermissions to change the scope of permissions assigned to an administrative + or a default object access permission identified by it IRI, <permissionIri>. The request body must contain the new set + of permission types as below:
  • +
+
{
+   "hasPermissions":[
+     {
+       "additionalInformation":"http://www.knora.org/ontology/knora-admin#ProjectMember",
+       "name":"D",
+       "permissionCode":7
+     }
+   ]
+}
+
+

Each permission item given in hasPermissions, must contain the necessary parameters with respect to the type of the +permission. For example, if you wish to change the scope of an administrative permission, follow the +guidelines for the +content of its hasPermissions property. Similarly, if you wish to change the scope of a default object access permission, +follow the guidelines given about the content of its hasPermissions property.
+Either the name or the permissionCode must be present; it is not necessary to provide both.

+

The previous permission set is replaced by the new permission set. In order to remove a permission for a group +entirely, you can provide a new set of permissions, leaving out the permission specification for the group.

+

Deleting a Permission

+
    +
  • DELETE: /admin/permissions/<permissionIri> to delete an administrative, or a default object access permission. The +IRI of the permission must be given in encoded form.
  • +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/03-endpoints/api-admin/projects/index.html b/03-endpoints/api-admin/projects/index.html new file mode 100644 index 0000000000..cfff2aa4d5 --- /dev/null +++ b/03-endpoints/api-admin/projects/index.html @@ -0,0 +1,4132 @@ + + + + + + + + + + + + + + + + + + + + + + + Projects Endpoint - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + + + + + +
+
+ + + + + + +

Projects Endpoint

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ScopeRouteOperationsExplanation
projects/admin/projectsGETget all projects
projects/admin/projectsPOSTcreate a project
projects/admin/projects/shortname/{shortname}GETget a single project
projects/admin/projects/shortcode/{shortcode}GETget a single project
projects/admin/projects/iri/{iri}GETget a single project
projects/admin/projects/iri/{iri}PUTupdate a project
projects/admin/projects/iri/{iri}DELETEdelete a project
projects/admin/projects/iri/{iri}/AllDataGETget all data of a project
project members/admin/projects/shortname/{shortname}/membersGETget all project members
project members/admin/projects/shortcode/{shortcode}/membersGETget all project members
project members/admin/projects/iri/{iri}/membersGETget all project members
project members/admin/projects/shortname/{shortname}/admin-membersGETget all project admins
project members/admin/projects/shortcode/{shortcode}/admin-membersGETget all project admins
project members/admin/projects/iri/{iri}/admin-membersGETget all project admins
keywords/admin/projects/KeywordsGETget all project keywords
keywords/admin/projects/iri/{iri}/KeywordsGETget project keywords of a single project
view settings/admin/projects/shortname/{shortname}/RestrictedViewSettingsGETget restricted view settings for a project
view settings/admin/projects/shortcode/{shortcode}/RestrictedViewSettingsGETget restricted view settings for a project
view settings/admin/projects/iri/{iri}/RestrictedViewSettingsGETget restricted view settings for a project
view settings/admin/projects/iri/{iri}/RestrictedViewSettingsPOSTset restricted view settings for a project
view settings/admin/projects/shortcode/{shortcode}/RestrictedViewSettingsPOSTset restricted view settings for a project
+

Project Operations

+

Get All Projects

+

Permissions: No permissions required

+

Request definition: GET /admin/projects

+

Description: Returns a list of all projects except built-in system ones.

+

Example request:

+
curl --request GET --url http://localhost:3333/admin/projects
+
+

Example response:

+
{
+  "projects": [
+    {
+      "description": [
+        {
+          "value": "A demo project of a collection of images",
+          "language": "en"
+        }
+      ],
+      "id": "http://rdfh.ch/projects/00FF",
+      "keywords": [
+        "collection",
+        "images"
+      ],
+      "logo": null,
+      "longname": "Image Collection Demo",
+      "ontologies": [
+        "http://0.0.0.0:3333/ontology/00FF/images/v2"
+      ],
+      "selfjoin": false,
+      "shortcode": "00FF",
+      "shortname": "images",
+      "status": true
+    },
+    {
+      // ...
+    }
+  ]
+}
+
+

Create a New Project

+

Permissions: SystemAdmin

+

Request definition: POST /admin/projects

+

Description: Create a new project.

+

Required payload:

+
    +
  • shortcode (unique, 4-digits)
  • +
  • shortname (unique, 3-20 characters long, can contain small and capital letters, numbers, special characters: - +and _, cannot start with number nor allowed special characters, should be in the form of a +xsd:NCNAME and URL safe)
  • +
  • description (collection of descriptions as strings with language tag)
  • +
  • keywords (collection of keywords)
  • +
  • status (true, if project is active. false, if project is inactive)
  • +
  • selfjoin
  • +
+

Optional payload:

+
    +
  • id (unique, custom DSP IRI, e.g. used for migrating a project from one server to another)
  • +
  • longname
  • +
  • logo
  • +
+

Example request:

+
curl --request POST \
+  --url http://localhost:3333/admin/projects \
+  --header 'Authorization: Basic cm9vdEBleGFtcGxlLmNvbTp0ZXN0' \
+  --header 'Content-Type: application/json' \
+  --data '{
+    "shortname": "newproject",
+    "shortcode": "3333",
+    "longname": "project longname",
+    "description": [
+        {
+            "value": "project description",
+            "language": "en"
+        }
+    ],
+    "keywords": [
+        "test project"
+    ],
+    "logo": "/fu/bar/baz.jpg",
+    "status": true,
+    "selfjoin": false
+}'
+
+

Example response:

+
{
+    "project": {
+        "description": [
+            {
+                "value": "project description",
+                "language": "en"
+            }
+        ],
+        "id": "http://rdfh.ch/projects/3333",
+        "keywords": [
+            "test project"
+        ],
+        "logo": "/fu/bar/baz.jpg",
+        "longname": "project longname",
+        "ontologies": [],
+        "selfjoin": false,
+        "shortcode": "3333",
+        "shortname": "newproject",
+        "status": true
+    }
+}
+
+

Errors:

+
    +
  • 400 Bad Request if the project already exists or any of the provided properties is invalid.
  • +
  • 401 Unauthorized if authorization failed.
  • +
+

Default set of RestrictedViewSize

+

Starting from DSP 2023.10.02 release, the creation of new project will also set the RestrictedViewSize to default +value, which is: !512,512. It is possible to change the value using dedicated routes.

+

Default set of permissions for a new project

+

When a new project is created, following default permissions are added to its admins and members:

+
    +
  • +

    ProjectAdmin group receives an administrative permission to do all project level operations + and to create resources within the new project. + This administrative permission is retrievable through its IRI: + http://rdfh.ch/permissions/[projectShortcode]/defaultApForAdmin

    +
  • +
  • +

    ProjectAdmin group also gets a default object access permission to change rights + (which includes delete, modify, view, and restricted view permissions) of any entity that belongs to the project. + This default object access permission is retrievable through its IRI: + http://rdfh.ch/permissions/[projectShortcode]/defaultDoapForAdmin

    +
  • +
  • +

    ProjectMember group receives an administrative permission to create resources within the new project. + This administrative permission is retrievable through its IRI: + http://rdfh.ch/permissions/[projectShortcode]/defaultApForMember

    +
  • +
  • +

    ProjectMember group also gets a default object access permission to delete + (which includes modify, view and restricted view permissions) of any entity that belongs to the project. + This default object access permission is retrievable through its IRI: + http://rdfh.ch/permissions/[projectShortcode]/defaultDoapForMember

    +
  • +
+

Get Project by ID

+

The ID can be shortcode, shortname or IRI.

+

Permissions: No permissions required

+

Request definition:

+
    +
  • GET /admin/projects/shortcode/{shortcode}
  • +
  • GET /admin/projects/shortname/{shortname}
  • +
  • GET /admin/projects/iri/{iri}
  • +
+

Description: Returns a single project identified by shortcode, shortname or IRI.

+

Example request:

+
curl --request GET --url http://localhost:3333/admin/projects/shortcode/0001
+
+
curl --request GET --url http://localhost:3333/admin/projects/shortname/anything
+
+
curl --request GET --url \
+    http://localhost:3333/admin/projects/iri/http%3A%2F%2Frdfh.ch%2Fprojects%2F0001
+
+

Example response:

+
{
+  "project": {
+    "description": [
+      {
+        "value": "Anything Project"
+      }
+    ],
+    "id": "http://rdfh.ch/projects/0001",
+    "keywords": [
+      "arbitrary test data",
+      "things"
+    ],
+    "logo": null,
+    "longname": "Anything Project",
+    "ontologies": [
+      "http://0.0.0.0:3333/ontology/0001/something/v2",
+      "http://0.0.0.0:3333/ontology/0001/freetest/v2",
+      "http://0.0.0.0:3333/ontology/0001/minimal/v2",
+      "http://0.0.0.0:3333/ontology/0001/anything/v2"
+    ],
+    "selfjoin": false,
+    "shortcode": "0001",
+    "shortname": "anything",
+    "status": true
+  }
+}
+
+

Errors:

+
    +
  • 400 Bad Request if the provided ID is not valid.
  • +
  • 404 Not Found if no project with the provided ID is found.
  • +
+

NB:

+
    +
  • IRI must be URL-encoded.
  • +
+

Update Project Information

+

Permissions: SystemAdmin / ProjectAdmin

+

Request definition: PUT /admin/projects/iri/{iri}

+

Description: Update a project identified by its IRI.

+

Payload: The following properties can be changed:

+
    +
  • longname
  • +
  • description
  • +
  • keywords
  • +
  • logo
  • +
  • status
  • +
  • selfjoin
  • +
+

Example request:

+
curl --request PUT \
+  --url http://localhost:3333/admin/projects/iri/http%3A%2F%2Frdfh.ch%2Fprojects%2F0001 \
+  --header 'Authorization: Basic cm9vdEBleGFtcGxlLmNvbTp0ZXN0' \
+  --header 'Content-Type: application/json' \
+  --data '{
+  "longname": "other longname"
+}'
+
+

Example response:

+
{
+  "project": {
+    "description": [
+      {
+        "value": "Anything Project"
+      }
+    ],
+    "id": "http://rdfh.ch/projects/0001",
+    "keywords": [
+      "arbitrary test data",
+      "things"
+    ],
+    "logo": null,
+    "longname": "other longname",
+    "ontologies": [
+      "http://api.knora.org/ontology/0001/something/v2",
+      "http://api.knora.org/ontology/0001/freetest/v2",
+      "http://api.knora.org/ontology/0001/minimal/v2",
+      "http://api.knora.org/ontology/0001/anything/v2"
+    ],
+    "selfjoin": false,
+    "shortcode": "0001",
+    "shortname": "anything",
+    "status": true
+  }
+}
+
+

Errors:

+
    +
  • 400 Bad Request
      +
    • if the provided IRI is not valid.
    • +
    • if the provided payload is not valid.
    • +
    +
  • +
  • 404 Not Found if no project with the provided IRI is found.
  • +
+

Delete a Project

+

Permissions: SystemAdmin / ProjectAdmin

+

Request definition: DELETE /admin/projects/iri/{iri}

+

Description: Mark a project as deleted (by setting the status flag to false).

+
curl --request DELETE \
+  --url http://localhost:3333/admin/projects/iri/http%3A%2F%2Frdfh.ch%2Fprojects%2F0001 \
+  --header 'Authorization: Basic cm9vdEBleGFtcGxlLmNvbTp0ZXN0' \
+  --header 'Content-Type: application/json'
+
+

Example response:

+
{
+  "project": {
+    "description": [
+      {
+        "value": "Anything Project"
+      }
+    ],
+    "id": "http://rdfh.ch/projects/0001",
+    "keywords": [
+      "arbitrary test data",
+      "things"
+    ],
+    "logo": null,
+    "longname": "other longname",
+    "ontologies": [
+      "http://api.knora.org/ontology/0001/something/v2",
+      "http://api.knora.org/ontology/0001/freetest/v2",
+      "http://api.knora.org/ontology/0001/minimal/v2",
+      "http://api.knora.org/ontology/0001/anything/v2"
+    ],
+    "selfjoin": false,
+    "shortcode": "0001",
+    "shortname": "anything",
+    "status": false
+  }
+}
+
+

Errors:

+
    +
  • 400 Bad Request if the provided IRI is not valid.
  • +
  • 404 Not Found if no project with the provided IRI is found.
  • +
+

Get all Data of a Project

+

Permissions: ProjectAdmin / SystemAdmin

+

Request definition: POST /admin/projects/iri/{iri}/AllData

+

Description: Gets all data of a project as a TriG file (ontologies, resource data, admin data, and permissions).

+

Example request:

+
curl --request GET \
+  --url http://localhost:3333/admin/projects/iri/http%3A%2F%2Frdfh.ch%2Fprojects%2F00FF/AllData \
+  --header 'Authorization: Basic cm9vdEBleGFtcGxlLmNvbTp0ZXN0'
+
+

Example response:

+
@prefix images: <http://www.knora.org/ontology/00FF/images#> .
+@prefix knora-admin: <http://www.knora.org/ontology/knora-admin#> .
+@prefix knora-base: <http://www.knora.org/ontology/knora-base#> .
+@prefix owl: <http://www.w3.org/2002/07/owl#> .
+@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
+@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
+@prefix salsah-gui: <http://www.knora.org/ontology/salsah-gui#> .
+@prefix standoff: <http://www.knora.org/ontology/standoff#> .
+@prefix xml: <http://www.w3.org/XML/1998/namespace> .
+@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
+
+<http://www.knora.org/ontology/00FF/images> {
+    <http://www.knora.org/ontology/00FF/images>
+            rdf:type                      owl:Ontology ;
+            rdfs:label                    "The images demo ontology" ;
+            knora-base:attachedToProject  <http://rdfh.ch/projects/00FF> ;
+            knora-base:lastModificationDate  "2012-12-12T12:12:12.12Z"^^xsd:dateTime .
+    images:lastname  rdf:type        owl:ObjectProperty ;
+            rdfs:comment             "Nachname einer Person"@de ;
+            rdfs:comment             "Last name of a person"@en ;
+            rdfs:label               "Name"@de ;
+            rdfs:subPropertyOf       knora-base:hasValue ;
+            knora-base:objectClassConstraint  knora-base:TextValue ;
+            knora-base:subjectClassConstraint  images:person ;
+            salsah-gui:guiAttribute  "size=32" ;
+            salsah-gui:guiAttribute  "maxlength=32" ;
+            salsah-gui:guiElement    salsah-gui:SimpleText .
+    # ...
+}
+
+<http://www.knora.org/data/00FF/images> {
+    <http://rdfh.ch/00FF/0cb8286054d5>
+            rdf:type                      images:bild ;
+            rdfs:label                    "1 Alpinismus" ;
+            images:bearbeiter             <http://rdfh.ch/00FF/0cb8286054d5/values/0b80b43aee0f04> ;
+            images:titel                  <http://rdfh.ch/00FF/0cb8286054d5/values/cea90774ee0f04> ;
+            images:urheber                <http://rdfh.ch/00FF/df1260ad43d5> ;
+            images:urheberValue           <http://rdfh.ch/00FF/0cb8286054d5/values/e346ff38-6b03-4a27-a11b-b0818a2e5ee3> ;
+            knora-base:attachedToProject  <http://rdfh.ch/projects/00FF> ;
+            knora-base:attachedToUser     <http://rdfh.ch/users/c266a56709> ;
+            knora-base:creationDate       "2016-03-02T15:05:57Z"^^xsd:dateTime ;
+            knora-base:hasPermissions     "CR knora-admin:ProjectMember,knora-admin:Creator|V knora-admin:KnownUser|RV knora-admin:UnknownUser" ;
+            knora-base:hasStillImageFileValue  <http://rdfh.ch/00FF/0cb8286054d5/values/c66133bf942f01> ;
+            knora-base:isDeleted          false .
+    # ...
+}
+
+<http://www.knora.org/data/admin> {
+  # ...
+}
+
+<http://www.knora.org/data/permissions> {
+  # ...
+}
+
+

Project Member Operations

+

Get Project Members by ID

+

Permissions: SystemAdmin / ProjectAdmin

+

Request definition:

+
    +
  • GET /admin/projects/shortcode/{shortcode}/members
  • +
  • GET /admin/projects/shortname/{shortname}/members
  • +
  • GET /admin/projects/iri/{iri}/members
  • +
+

Description: returns all members part of a project identified through iri, shortname or shortcode

+

Example request:

+
curl --request GET 'http://0.0.0.0:3333/admin/projects/shortcode/0001/members' \
+--header 'Authorization: Basic cm9vdEBleGFtcGxlLmNvbTp0ZXN0'
+
+
curl --request GET 'http://0.0.0.0:3333/admin/projects/shortname/anything/members' \
+--header 'Authorization: Basic cm9vdEBleGFtcGxlLmNvbTp0ZXN0'
+
+
curl --request GET 'http://0.0.0.0:3333/admin/projects/iri/http%3A%2F%2Frdfh.ch%2Fprojects%2F0001/members'
+--header 'Authorization: Basic cm9vdEBleGFtcGxlLmNvbTp0ZXN0'
+
+

Example response:

+
{
+    "members": [
+        {
+            "email": "anything.user01@example.org",
+            "familyName": "UserFamilyName",
+            "givenName": "UserGivenName",
+            "groups": [],
+            "id": "http://rdfh.ch/users/BhkfBc3hTeS_IDo-JgXRbQ",
+            "lang": "de",
+            "password": null,
+            "permissions": {
+                "administrativePermissionsPerProject": {
+                    "http://rdfh.ch/projects/0001": [
+                        {
+                            "additionalInformation": null,
+                            "name": "ProjectResourceCreateAllPermission",
+                            "permissionCode": null
+                        }
+                    ]
+                },
+                "groupsPerProject": {
+                    "http://rdfh.ch/projects/0001": [
+                        "http://www.knora.org/ontology/knora-admin#ProjectMember"
+                    ]
+                }
+            },
+            "projects": [
+                {
+                    "description": [
+                        {
+                            "value": "Anything Project"
+                        }
+                    ],
+                    "id": "http://rdfh.ch/projects/0001",
+                    "keywords": [
+                        "arbitrary test data",
+                        "things"
+                    ],
+                    "logo": null,
+                    "longname": "Anything Project",
+                    "ontologies": [
+                        "http://0.0.0.0:3333/ontology/0001/something/v2",
+                        "http://0.0.0.0:3333/ontology/0001/anything/v2"
+                    ],
+                    "selfjoin": false,
+                    "shortcode": "0001",
+                    "shortname": "anything",
+                    "status": true
+                }
+            ],
+            "sessionId": null,
+            "status": true,
+            "token": null,
+            "username": "anything.user01"
+        }
+    ]
+}
+
+

Errors:

+
    +
  • 400 Bad Request if the provided ID is not valid.
  • +
  • 404 Not Found if no project with the provided ID is found.
  • +
+

NB:

+
    +
  • IRI must be URL-encoded.
  • +
+

Get Project Admins by ID

+

Permissions: SystemAdmin / ProjectAdmin

+

Request definition:

+
    +
  • GET /admin/projects/shortcode/{shortcode}/admin-members
  • +
  • GET /admin/projects/shortname/{shortname}/admin-members
  • +
  • GET /admin/projects/iri/{iri}/admin-members
  • +
+

Description: returns all admin members part of a project identified through iri, shortname or shortcode

+

Example request:

+
curl --request GET 'http://0.0.0.0:3333/admin/projects/shortcode/0001/admin-members' \
+--header 'Authorization: Basic cm9vdEBleGFtcGxlLmNvbTp0ZXN0'
+
+
curl --request GET 'http://0.0.0.0:3333/admin/projects/shortname/anything/admin-members' \
+--header 'Authorization: Basic cm9vdEBleGFtcGxlLmNvbTp0ZXN0'
+
+
curl --request GET 'http://0.0.0.0:3333/admin/projects/iri/http%3A%2F%2Frdfh.ch%2Fprojects%2F0001/admin-members'
+--header 'Authorization: Basic cm9vdEBleGFtcGxlLmNvbTp0ZXN0'
+
+

Example response:

+
{
+    "members": [
+        {
+            "email": "anything.admin@example.org",
+            "familyName": "Admin",
+            "givenName": "Anything",
+            "groups": [],
+            "id": "http://rdfh.ch/users/AnythingAdminUser",
+            "lang": "de",
+            "password": null,
+            "permissions": {
+                "administrativePermissionsPerProject": {
+                    "http://rdfh.ch/projects/0001": [
+                        {
+                            "additionalInformation": null,
+                            "name": "ProjectResourceCreateAllPermission",
+                            "permissionCode": null
+                        },
+                        {
+                            "additionalInformation": null,
+                            "name": "ProjectAdminAllPermission",
+                            "permissionCode": null
+                        }
+                    ]
+                },
+                "groupsPerProject": {
+                    "http://rdfh.ch/projects/0001": [
+                        "http://www.knora.org/ontology/knora-admin#ProjectMember",
+                        "http://www.knora.org/ontology/knora-admin#ProjectAdmin"
+                    ]
+                }
+            },
+            "projects": [
+                {
+                    "description": [
+                        {
+                            "value": "Anything Project"
+                        }
+                    ],
+                    "id": "http://rdfh.ch/projects/0001",
+                    "keywords": [
+                        "arbitrary test data",
+                        "things"
+                    ],
+                    "logo": null,
+                    "longname": "Anything Project",
+                    "ontologies": [
+                        "http://0.0.0.0:3333/ontology/0001/something/v2",
+                        "http://0.0.0.0:3333/ontology/0001/freetest/v2",
+                        "http://0.0.0.0:3333/ontology/0001/minimal/v2",
+                        "http://0.0.0.0:3333/ontology/0001/anything/v2"
+                    ],
+                    "selfjoin": false,
+                    "shortcode": "0001",
+                    "shortname": "anything",
+                    "status": true
+                }
+            ],
+            "sessionId": null,
+            "status": true,
+            "token": null,
+            "username": "anything.admin"
+        }
+    ]
+}
+
+

Errors:

+
    +
  • 400 Bad Request if the provided ID is not valid.
  • +
  • 404 Not Found if no project with the provided ID is found.
  • +
+

NB:

+
    +
  • IRI must be URL-encoded.
  • +
+

Other Project Operations

+

Get all Keywords

+

Permissions:

+

Request definition: GET /admin/projects/Keywords

+

Description: returns keywords of all projects as a list

+

Example request:

+
curl --request GET 'http://0.0.0.0:3333/admin/projects/Keywords'
+
+

Example response:

+
{
+    "keywords": [
+        "Annotation",
+        "Arabe",
+        "Arabic",
+        "Arabisch",
+        "Audio",
+        "Basel",
+        "Basler Frühdrucke",
+        "Bilder",
+        "Bilderfolgen",
+        "Contectualisation of images",
+        "Cyrillic",
+        "Cyrillique",
+        "Data and Service Center for the Humanities (DaSCH)",
+        "Grec",
+        "Greek",
+        "Griechisch",
+        "Hebrew",
+        "Hebräisch",
+        "Hieroglyphen",
+        "Hébreu",
+        "Inkunabel",
+        "Japanese",
+        "Japanisch",
+        "Japonais",
+        "Keilschrift",
+        "Kunsthistorisches Seminar Universität Basel",
+        "Kyrillisch",
+        "Late Middle Ages",
+        "Letterpress Printing",
+        "Markup",
+        "Narrenschiff",
+        "Objekte",
+        "Sebastian Brant",
+        "Sonderzeichen",
+        "Texteigenschaften",
+        "Textquellen",
+        "Wiegendrucke",
+        "XML",
+        "arbitrary test data",
+        "asdf",
+        "audio",
+        "caractères spéciaux",
+        "collection",
+        "cuneiform",
+        "cunéiforme",
+        "early print",
+        "hieroglyphs",
+        "hiéroglyphes",
+        "images",
+        "incunabula",
+        "objects",
+        "objets",
+        "propriétés de texte",
+        "ship of fools",
+        "sources",
+        "special characters",
+        "textual properties",
+        "textual sources",
+        "things"
+    ]
+}
+
+

Get Keywords of a Project

+

Permissions:

+

Request definition:

+
    +
  • GET /admin/projects/iri/{iri}/Keywords
  • +
+

Description: returns the keywords of a single project

+

Example request:

+
curl --request GET 'http://0.0.0.0:3333/admin/projects/iri/http%3A%2F%2Frdfh.ch%2Fprojects%2F0001/Keywords'
+--header 'Authorization: Basic cm9vdEBleGFtcGxlLmNvbTp0ZXN0'
+
+

Example response:

+
{
+    "keywords": [
+        "arbitrary test data",
+        "things"
+    ]
+}
+
+

Get Restricted View Settings

+

Permissions: ProjectAdmin

+

Request definition:

+
    +
  • GET /admin/projects/shortcode/{shortcode}/RestrictedViewSettings
  • +
  • GET /admin/projects/shortname/{shortname}/RestrictedViewSettings
  • +
  • GET /admin/projects/iri/{iri}/RestrictedViewSettings
  • +
+

Description: returns the project's restricted view settings

+

Example request:

+
curl --request GET 'http://0.0.0.0:3333/admin/projects/shortcode/0001/RestrictedViewSettings' \
+--header 'Authorization: Basic cm9vdEBleGFtcGxlLmNvbTp0ZXN0'
+
+
curl --request GET 'http://0.0.0.0:3333/admin/projects/shortname/anything/RestrictedViewSettings' \
+--header 'Authorization: Basic cm9vdEBleGFtcGxlLmNvbTp0ZXN0'
+
+
curl --request GET 'http://0.0.0.0:3333/admin/projects/iri/http%3A%2F%2Frdfh.ch%2Fprojects%2F0001/RestrictedViewSettings' \
+--header 'Authorization: Basic cm9vdEBleGFtcGxlLmNvbTp0ZXN0'
+
+

Example response:

+
{
+    "settings": {
+        "size": "!512,512",
+        "watermark": false
+    }
+}
+
+

Set Restricted View Settings

+

Set how all still image resources of a projects should be displayed when viewed as restricted. +This can be either a size restriction or a watermark.

+

For that, we support two of the IIIF size forms:

+
    +
  • !d,d The returned image is scaled so that the width and height of the returned image are not greater than d, + while maintaining the aspect ratio.
  • +
  • pct:n The width and height of the returned image is scaled to n percent + of the width and height of the original image. 1<= n <= 100.
  • +
+

If the watermark is set to true, the returned image will be watermarked, otherwise the default size !128,128 is set. +It is only possible to set either the size or the watermark, not both at the same time.

+

Permissions: ProjectAdmin/SystemAdmin

+

Request definition:

+
    +
  • POST /admin/projects/iri/{iri}/RestrictedViewSettings
  • +
  • POST /admin/projects/shortcode/{shortcode}/RestrictedViewSettings
  • +
+

Description: Set the project's restricted view

+

The endpoint accepts either a size or a watermark but not both.

+

Size:

+
{ "size": "!512,512" }
+
+

Watermark:

+
{ "watermark": true }
+
+

Examples :

+

Request:

+
curl --request POST 'http://0.0.0.0:5555/admin/projects/iri/http%3A%2F%2Frdfh.ch%2Fprojects%2F0001/RestrictedViewSettings' \
+--header 'Authorization: Basic cm9vdEBleGFtcGxlLmNvbTp0ZXN0' \
+--data '{"size": "!512,512"}
+
+

Response:

+
{ "size": "!512,512" }
+
+

Request:

+
curl --request POST 'http://0.0.0.0:5555/admin/projects/shortcode/0001/RestrictedViewSettings' \
+--header 'Authorization: Basic cm9vdEBleGFtcGxlLmNvbTp0ZXN0' \
+--data '{"watermark": true}'
+
+

Response:

+
{ "watermark": true }
+
+

Operates on the following mutually exclusive properties:

+
    +
  • knora-admin:projectRestrictedViewSize: the IIIF size value
  • +
  • knora-admin:projectRestrictedViewWatermark: whether images of a project should be protected with a watermark.
  • +
+

Note: Restricted view settings only take effect, if a user has "Restricted View" permission on an image.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/03-endpoints/api-admin/stores/index.html b/03-endpoints/api-admin/stores/index.html new file mode 100644 index 0000000000..e96abee15d --- /dev/null +++ b/03-endpoints/api-admin/stores/index.html @@ -0,0 +1,2892 @@ + + + + + + + + + + + + + + + + + + + + + + + Stores Endpoint - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + +

Stores Endpoint

+

This endpoint allows manipulation of the triplestore content.

+

POST admin/store/ResetTriplestoreContent resets the triplestore content, given that the allowReloadOverHttp +configuration flag is set to true. This route is mostly used in tests.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/03-endpoints/api-admin/users/index.html b/03-endpoints/api-admin/users/index.html new file mode 100644 index 0000000000..887c7879f6 --- /dev/null +++ b/03-endpoints/api-admin/users/index.html @@ -0,0 +1,3580 @@ + + + + + + + + + + + + + + + + + + + + + + + Users Endpoint - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + + + + + +
+
+ + + + + + +

Users Endpoint

+

Endpoint Overview

+

General User Operations

+
    +
  • GET: /admin/users : return all users
  • +
  • GET: /admin/users/[iri | email | username]/<identifier> : return single user identified by [IRI | email | username]
  • +
  • POST: /admin/users/ : create new user
  • +
  • PUT: /admin/users/iri/<userIri>/BasicUserInformation : update user's basic user information
  • +
  • PUT: /admin/users/iri/<userIri>/Password : update user's password
  • +
  • PUT: /admin/users/iri/<userIri>/Status : update user's status
  • +
  • DELETE: /admin/users/iri/<userIri> : delete user (set status to false)
  • +
+

Project membership operations

+
    +
  • GET: /admin/users/iri/<userIri>/project-memberships : get user's project memberships
  • +
  • POST: /admin/users/iri/<userIri>/project-memberships/<projectIri> : add user to project (to ProjectMember group)
  • +
  • DELETE: /admin/users/iri/<userIri>/project-memberships/<projectIri> : remove user from project (to ProjectMember + group)
  • +
+

Group membership operations

+
    +
  • GET: /admin/users/iri/<userIri>/project-admin-memberships : get user's ProjectAdmin group memberships
  • +
  • POST: /admin/users/iri/<userIri>/project-admin-memberships/<projectIri> : add user to ProjectAdmin group
  • +
  • +

    DELETE: /admin/users/iri/<userIri>/project-admin-memberships/<projectIri> : remove user from ProjectAdmin group

    +
  • +
  • +

    GET: /admin/users/iri/<userIri>/group-memberships : get user's normal group memberships

    +
  • +
  • POST: /admin/users/iri/<userIri>/group-memberships/<groupIri> : add user to normal group
  • +
  • +

    DELETE: /admin/users/iri/<userIri>/group-memberships/<groupIri> : remove user from normal group

    +
  • +
  • +

    PUT: /admin/users/iri/<userIri>/SystemAdmin : Add/remove user to/from SystemAdmin group

    +
  • +
+

User Operations

+

Get users

+
    +
  • Required permission: SystemAdmin
  • +
  • GET: /admin/users
  • +
+

Get user

+
    +
  • Required permission:
      +
    • SystemAdmin / self: for getting all properties
    • +
    • All other users: for getting only the public properties (givenName and familyName)
    • +
    +
  • +
  • GET:/admin/users/[iri | email | username ]/<identifier>
  • +
+

Create user

+
    +
  • Required permission: none, self-registration is allowed
  • +
  • Required information: email (unique), given name, family name, + password, status, systemAdmin
  • +
  • Username restrictions:
      +
    • 4 - 50 characters long
    • +
    • Only contains alphanumeric characters, underscore and dot.
    • +
    • Underscore and dot can't be at the end or start of a username
    • +
    • Underscore or dot can't be used multiple times in a row
    • +
    +
  • +
  • Returns information about the newly created user
  • +
  • POST: /admin/users
  • +
  • BODY:
  • +
+
    {
+  "email": "donald.duck@example.org",
+  "givenName": "Donald",
+  "familyName": "Duck",
+  "username": "donald.duck",
+  "password": "test",
+  "status": true,
+  "lang": "en",
+  "systemAdmin": false
+}
+
+

Additionally, each user can have an optional custom IRI (of Knora IRI form) +specified by the id in the request body as below:

+
    {
+  "id": "http://rdfh.ch/users/FnjFfIQFVDvI7ex8zSyUyw",
+  "email": "donald.duck@example.org",
+  "givenName": "Donald",
+  "familyName": "Duck",
+  "username": "donald.duck",
+  "password": "test",
+  "status": true,
+  "lang": "en",
+  "systemAdmin": false
+}
+
+

Update basic user information**

+
    +
  • Required permission: SystemAdmin / self
  • +
  • Changeable information: username, email, given name, family name, + password, status, SystemAdmin membership
  • +
  • TypeScript Docs: userFormats - ChangeUserApiRequestADM
  • +
  • PUT: /admin/users/iri/<userIri>/BasicUserInformation
  • +
  • BODY:
  • +
+
    {
+  "username": "donald.big.duck",
+  "email": "donald.big.duck@example.org",
+  "givenName": "Big Donald",
+  "familyName": "Duckmann",
+  "lang": "de"
+}
+
+

Update user's password

+
    +
  • Required permission: SystemAdmin / self
  • +
  • Changeable information: password
  • +
  • PUT: /admin/users/iri/<userIri>/Password
  • +
  • BODY:
  • +
+
    {
+  "requesterPassword": "test",
+  "newPassword": "test1234"
+}
+
+

Delete user

+
    +
  • Required permission: SystemAdmin / self
  • +
  • Remark: The same as updating a user and changing status to false. To un-delete, set status to true.
  • +
  • PUT: /admin/users/iri/<userIri>/Status
  • +
  • BODY:
  • +
+
{
+    "status": false // true or false
+}
+
+

Delete user (-\update user)**

+
    +
  • Required permission: SystemAdmin / self
  • +
  • Remark: The same as updating a user and changing status to false. To un-delete, set status to true.
  • +
  • DELETE: /admin/users/iri/<userIri>
  • +
  • BODY: empty
  • +
+

User's project membership operations

+

Get user's project memberships

+
    +
  • GET: /admin/users/iri/<userIri>/project-memberships
  • +
+

Add/remove user to/from project

+
    +
  • Required permission: SystemAdmin / ProjectAdmin / self (if project self-assignment is enabled)
  • +
  • Required information: project IRI, user IRI
  • +
  • Effects: knora-base:isInProject user property
  • +
  • POST / DELETE: /admin/users/iri/<userIri>/project-memberships/<projectIri>
  • +
  • BODY: empty
  • +
+

Note: When a user is project admin in the same project, his project admin membership will be removed as well.

+

User's group membership operations

+

Get user's project admin memberships

+
    +
  • GET: /admin/users/iri/<userIri>/project-admin-memberships
  • +
+

Add/remove user to/from project admin group

+
    +
  • Required permission: SystemAdmin / ProjectAdmin
  • +
  • Required information: project IRI, user IRI
  • +
  • Effects: knora-base:isInProjectAdminGroup user property
  • +
  • POST / DELETE: /admin/users/iri/<userIri>/project-admin-memberships/<projectIri>
  • +
  • BODY: empty
  • +
+

Note: In order to add a user to a project admin group, the user needs to be member of that project.

+

Get user's group memberships**

+
    +
  • GET: /admin/users/iri/<userIri>/group-memberships
  • +
+

Add/remove user to/from 'normal' group (not SystemAdmin or ProjectAdmin)

+
    +
  • Required permission: SystemAdmin / hasProjectAllAdminPermission + / hasProjectAllGroupAdminPermission / + hasProjectRestrictedGroupAdminPermission (for this group) / User + (if group self-assignment is enabled)
  • +
  • Required information: group IRI, user IRI
  • +
  • Effects: knora-base:isInGroup
  • +
  • POST / DELETE: /admin/users/iri/<userIri>/group-memberships/<groupIri>
  • +
  • BODY: empty
  • +
+

Add/remove user to/from system admin group

+
    +
  • Required permission: SystemAdmin / self
  • +
  • Effects property: knora-base:isInSystemAdminGroup with value + true or false
  • +
  • PUT: /admin/users/iri/<userIri>/SystemAdmin
  • +
  • BODY:
  • +
+
{
+  "systemAdmin": false
+}
+
+

Example Data

+

The following is an example for user information stored in the admin named graph:

+
<http://rdfh.ch/users/c266a56709>
+    rdf:type knora-admin:User ;
+    knora-admin:username "user01.user1"^^xsd:string ;
+    knora-admin:email "user01.user1@example.com"^^xsd:string ;
+    knora-admin:givenName "User01"^^xsd:string ;
+    knora-admin:familyName "User"^^xsd:string ;
+    knora-admin:password "$e0801$FGl9FDIWw+D83OeNPGmD9u2VTqIkJopIQECgmb2DSWQLS0TeKSvYoWAkbEv6KxePPlCI3CP9MmVHuvnWv8/kag==$mlegCYdGXt+ghuo8i0rLjgOiNnGDW604Q5g/v7zwBPU="^^xsd:string ;
+    knora-admin:preferredLanguage "de"^^xsd:string ;
+    knora-admin:status "true"^^xsd:boolean ;
+    knora-admin:isInProject <http://rdfh.ch/projects/00FF> ;
+    knora-admin:isInSystemAdminGroup "false"^^xsd:boolean ;
+    knora-admin:isInProjectAdminGroup <http://rdfh.ch/projects/00FF> .
+
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/03-endpoints/api-util/version/index.html b/03-endpoints/api-util/version/index.html new file mode 100644 index 0000000000..ace4df0595 --- /dev/null +++ b/03-endpoints/api-util/version/index.html @@ -0,0 +1,2983 @@ + + + + + + + + + + + + + + + + + + + + + + + Version - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + +

Version

+

The version endpoint provides all versions of used components in the DSP stack.

+

Example request

+

GET /version

+

Example response

+
HTTP/1.1 200 OK
+Content-Length: 247
+Content-Type: application/json
+Date: Mon, 11 Mar 2024 17:40:32 GMT
+Server: webapi/v30.9.0
+
+{
+    "buildCommit": "bbb0e65c7",
+    "buildTime": "2024-03-11T17:40:17.322491Z",
+    "fuseki": "2.1.5",
+    "pekkoHttp": "1.0.1",
+    "scala": "2.13.13",
+    "sipi": "3.9.0",
+    "webapi": "v30.9.0"
+}
+
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/03-endpoints/api-v2/authentication/index.html b/03-endpoints/api-v2/authentication/index.html new file mode 100644 index 0000000000..7e0a8f602f --- /dev/null +++ b/03-endpoints/api-v2/authentication/index.html @@ -0,0 +1,3008 @@ + + + + + + + + + + + + + + + + + + + + + + + Authentication - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + +

Authentication

+

Certain routes are secured and require authentication. +When accessing any secured route we support three options for authentication:

+
    +
  • Preferred method: For each request an Access Token is sent in the HTTP authorization header with the + HTTP bearer scheme.
  • +
  • Deprecated method: For each request an Access Token is provided as a cookie in the HTTP request.
  • +
  • Deprecated method: HTTP basic authentication, where + the username is the user's email.
  • +
+

Access Token / Login and Logout

+

A client can obtain an access token by sending a POST request (e.g., {"identifier_type":"identifier_value", +"password":"password_value"}) to the /v2/authentication route with +identifier and password in the body. The identifier_type can be iri, email, or username. +If the credentials are valid, a JSON WEB Token (JWT) will be sent back in the +response (e.g., {"token": "eyJ0eXAiOiJ..."}). Additionally, for web browser clients a session cookie +containing the JWT token is also created, containing KnoraAuthentication=eyJ0eXAiOiJ....

+

To logout, the client sends a DELETE request to the same route /v2/authentication and +the access token in one of the three described ways. This will invalidate the access token, +thus not allowing further request that would supply the invalidated token.

+

Checking Credentials

+

To check the credentials, send a GET request to /v2/authentication with the credentials +supplied as URL parameters or HTTP authentication headers as described before.

+

Usage Scenarios

+
    +
  1. Create token by logging-in, send token on each subsequent request, and logout when finished.
  2. +
  3. Send email/password credentials on every request.
  4. +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/03-endpoints/api-v2/editing-resources/index.html b/03-endpoints/api-v2/editing-resources/index.html new file mode 100644 index 0000000000..97b43550b2 --- /dev/null +++ b/03-endpoints/api-v2/editing-resources/index.html @@ -0,0 +1,3416 @@ + + + + + + + + + + + + + + + + + + + + + + + Creating and Editing Resources - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + + + + + +
+
+ + + + + + +

Creating and Editing Resources

+

Creating a Resource

+

To create a new resources, use this route:

+
HTTP POST to http://host/v2/resources
+
+

The body of the request is a JSON-LD document in the +complex API schema, specifying the type,rdfs:label, and its Knora resource properties +and their values. The representation of the resource is the same as when it is returned in a GET request, except that +its knora-api:attachedToUser is not given, and the resource IRI and those of its values can be optionally specified. +The format of the values submitted is described in Creating and Editing Values. +If there are multiple values for a property, these must be given in an array.

+

For example, here is a request to create a resource with various value types:

+
{
+  "@type" : "anything:Thing",
+  "anything:hasBoolean" : {
+    "@type" : "knora-api:BooleanValue",
+    "knora-api:booleanValueAsBoolean" : true
+  },
+  "anything:hasColor" : {
+    "@type" : "knora-api:ColorValue",
+    "knora-api:colorValueAsColor" : "#ff3333"
+  },
+  "anything:hasDate" : {
+    "@type" : "knora-api:DateValue",
+    "knora-api:dateValueHasCalendar" : "GREGORIAN",
+    "knora-api:dateValueHasEndEra" : "CE",
+    "knora-api:dateValueHasEndYear" : 1489,
+    "knora-api:dateValueHasStartEra" : "CE",
+    "knora-api:dateValueHasStartYear" : 1489
+  },
+  "anything:hasDecimal" : {
+    "@type" : "knora-api:DecimalValue",
+    "knora-api:decimalValueAsDecimal" : {
+      "@type" : "xsd:decimal",
+      "@value" : "100000000000000.000000000000001"
+    }
+  },
+  "anything:hasGeometry" : {
+    "@type" : "knora-api:GeomValue",
+    "knora-api:geometryValueAsGeometry" : "{\"status\":\"active\",\"lineColor\":\"#ff3333\",\"lineWidth\":2,\"points\":[{\"x\":0.08098591549295775,\"y\":0.16741071428571427},{\"x\":0.7394366197183099,\"y\":0.7299107142857143}],\"type\":\"rectangle\",\"original_index\":0}"
+  },
+  "anything:hasGeoname" : {
+    "@type" : "knora-api:GeonameValue",
+    "knora-api:geonameValueAsGeonameCode" : "2661604"
+  },
+  "anything:hasInteger" : [ {
+    "@type" : "knora-api:IntValue",
+    "knora-api:hasPermissions" : "CR knora-admin:Creator|V http://rdfh.ch/groups/0001/thing-searcher",
+    "knora-api:intValueAsInt" : 5,
+    "knora-api:valueHasComment" : "this is the number five"
+  }, {
+    "@type" : "knora-api:IntValue",
+    "knora-api:intValueAsInt" : 6
+  } ],
+  "anything:hasInterval" : {
+    "@type" : "knora-api:IntervalValue",
+    "knora-api:intervalValueHasEnd" : {
+      "@type" : "xsd:decimal",
+      "@value" : "3.4"
+    },
+    "knora-api:intervalValueHasStart" : {
+      "@type" : "xsd:decimal",
+      "@value" : "1.2"
+    }
+  },
+  "anything:hasListItem" : {
+    "@type" : "knora-api:ListValue",
+    "knora-api:listValueAsListNode" : {
+      "@id" : "http://rdfh.ch/lists/0001/treeList03"
+    }
+  },
+  "anything:hasOtherThingValue" : {
+    "@type" : "knora-api:LinkValue",
+    "knora-api:linkValueHasTargetIri" : {
+      "@id" : "http://rdfh.ch/0001/a-thing"
+    }
+  },
+  "anything:hasRichtext" : {
+    "@type" : "knora-api:TextValue",
+    "knora-api:textValueAsXml" : "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<text><p><strong>this is</strong> text</p> with standoff</text>",
+    "knora-api:textValueHasMapping" : {
+      "@id" : "http://rdfh.ch/standoff/mappings/StandardMapping"
+    }
+  },
+  "anything:hasText" : {
+    "@type" : "knora-api:TextValue",
+    "knora-api:valueAsString" : "this is text without standoff"
+  },
+  "anything:hasUri" : {
+    "@type" : "knora-api:UriValue",
+    "knora-api:uriValueAsUri" : {
+      "@type" : "xsd:anyURI",
+      "@value" : "https://www.knora.org"
+    }
+  },
+  "knora-api:attachedToProject" : {
+    "@id" : "http://rdfh.ch/projects/0001"
+  },
+  "rdfs:label" : "test thing",
+  "@context" : {
+    "rdf" : "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
+    "knora-api" : "http://api.knora.org/ontology/knora-api/v2#",
+    "rdfs" : "http://www.w3.org/2000/01/rdf-schema#",
+    "xsd" : "http://www.w3.org/2001/XMLSchema#",
+    "anything" : "http://0.0.0.0:3333/ontology/0001/anything/v2#"
+  }
+}
+
+

Permissions for the new resource can be given by adding knora-api:hasPermissions, a custom creation date can be +specified by adding knora-api:creationDate +(an xsd:dateTimeStamp), and the resource's creator can be specfied +by adding knora-api:attachedToUser. For example:

+
{
+  "@type" : "anything:Thing",
+  "anything:hasBoolean" : {
+    "@type" : "knora-api:BooleanValue",
+    "knora-api:booleanValueAsBoolean" : true
+  },
+  "knora-api:attachedToProject" : {
+    "@id" : "http://rdfh.ch/projects/0001"
+  },
+  "knora-api:attachedToUser" : {
+    "@id" : "http://rdfh.ch/users/9XBCrDV3SRa7kS1WwynB4Q"
+  },
+  "rdfs:label" : "test thing",
+  "knora-api:hasPermissions" : "CR knora-admin:Creator|V http://rdfh.ch/groups/0001/thing-searcher",
+  "knora-api:creationDate" : {
+    "@type" : "xsd:dateTimeStamp",
+    "@value" : "2019-01-09T15:45:54.502951Z"
+  },
+  "@context" : {
+    "rdf" : "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
+    "knora-api" : "http://api.knora.org/ontology/knora-api/v2#",
+    "rdfs" : "http://www.w3.org/2000/01/rdf-schema#",
+    "xsd" : "http://www.w3.org/2001/XMLSchema#",
+    "anything" : "http://0.0.0.0:3333/ontology/0001/anything/v2#"
+  }
+}
+
+

The format of the object of knora-api:hasPermissions is described in +Permissions.

+

If permissions are not given, configurable default permissions are used (see +Default Object Access Permissions +).

+

To create a resource, the user must have permission to create resources of that class in that project.

+

The predicate knora-api:attachedToUser can be used to specify a creator other than the requesting user only if the +requesting user is an administrator of the project or a system administrator. The specified creator must also have +permission to create resources of that class in that project.

+

In addition to the creation date, in the body of the request, it is possible to specify a custom IRI ( +of Knora IRI form) for a resource through the @id attribute which will then be assigned +to the resource; otherwise the resource will get a unique random IRI.

+

A custom resource IRI must be http://rdfh.ch/PROJECT_SHORTCODE/ (where PROJECT_SHORTCODE +is the shortcode of the project that the resource belongs to) plus a custom ID string.

+

Similarly, it is possible to assign a custom IRI to the values using their @id attributes; if not given, random IRIs +will be assigned to the values.

+

A custom value IRI must be the IRI of the containing resource, followed by a /values/ and a custom ID string.

+

An optional custom UUID of a value can also be given by adding knora-api:valueHasUUID. Each custom UUID must +be base64url-encoded without padding. Each value of the new resource +can also have a custom creation date specified by adding knora-api:creationDate +(an xsd:dateTimeStamp). For example:

+
{
+   "@id" : "http://rdfh.ch/0001/oveR1dQltEUwNrls9Lu5Rw",
+   "@type" : "anything:Thing",
+   "knora-api:attachedToProject" : {
+     "@id" : "http://rdfh.ch/projects/0001"
+   },
+   "anything:hasInteger" : {
+       "@id" : "http://rdfh.ch/0001/oveR1dQltEUwNrls9Lu5Rw/values/IN4R19yYR0ygi3K2VEHpUQ",
+       "@type" : "knora-api:IntValue",
+       "knora-api:intValueAsInt" : 10,
+       "knora-api:valueHasUUID" : "IN4R19yYR0ygi3K2VEHpUQ",
+       "knora-api:creationDate" : {
+               "@type" : "xsd:dateTimeStamp",
+               "@value" : "2020-06-04T12:58:54.502951Z"
+       }
+   },
+   "rdfs:label" : "test thing with custom IRI",
+   "knora-api:creationDate" : {
+     "@type" : "xsd:dateTimeStamp",
+     "@value" : "2019-01-09T15:45:54.502951Z"
+   },
+   "@context" : {
+     "rdf" : "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
+     "knora-api" : "http://api.knora.org/ontology/knora-api/v2#",
+     "rdfs" : "http://www.w3.org/2000/01/rdf-schema#",
+     "xsd" : "http://www.w3.org/2001/XMLSchema#",
+     "anything" : "http://0.0.0.0:3333/ontology/0001/anything/v2#"
+  }
+}
+
+

The response is a JSON-LD document containing a +preview +of the resource.

+

Modifying a Resource's Values

+

See Creating and Editing Values.

+

Modifying a Resource's Metadata

+

You can modify the following metadata attached to a resource:

+
    +
  • label
  • +
  • permissions
  • +
  • last modification date
  • +
+

To do this, use this route:

+
HTTP PUT to http://host/v2/resources
+
+

The request body is a JSON-LD object containing the following information about the resource:

+
    +
  • @id: the resource's IRI
  • +
  • @type: the resource's class IRI
  • +
  • knora-api:lastModificationDate: an xsd:dateTimeStamp representing the last modification date that is currently + attached to the resource, if any. This is used to make sure that the resource has not been modified by someone else + since you last read it.
  • +
+

The submitted JSON-LD object must also contain one or more of the following predicates, representing the metadata you +want to change:

+
    +
  • rdfs:label: a string
  • +
  • knora-api:hasPermissions, in the format described + in Permissions
  • +
  • knora-api:newModificationDate: an xsd:dateTimeStamp.
  • +
+

Here is an example:

+
{
+  "@id" : "http://rdfh.ch/0001/a-thing",
+  "@type" : "anything:Thing",
+  "rdfs:label" : "this is the new label",
+  "knora-api:hasPermissions" : "CR knora-admin:Creator|M knora-admin:ProjectMember|V knora-admin:ProjectMember",
+  "knora-api:lastModificationDate" : {
+    "@type" : "xsd:dateTimeStamp",
+    "@value" : "2017-11-20T15:55:17Z"
+  },
+  "knora-api:newModificationDate" : {
+    "@type" : "xsd:dateTimeStamp",
+    "@value" : "2018-12-21T16:56:18Z"
+  },
+  "@context" : {
+    "rdf" : "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
+    "knora-api" : "http://api.knora.org/ontology/knora-api/v2#",
+    "rdfs" : "http://www.w3.org/2000/01/rdf-schema#",
+    "xsd" : "http://www.w3.org/2001/XMLSchema#",
+    "anything" : "http://0.0.0.0:3333/ontology/0001/anything/v2#"
+  }
+}
+
+

If you submit a knora-api:lastModificationDate that is different from the resource's actual last modification date, +you will get an HTTP 409 (Conflict) error.

+

If you submit a knora-api:newModificationDate that is earlier than the resource's knora-api:lastModificationDate, +you will get an HTTP 400 (Bad Request) error.

+

A successful response is an HTTP 200 (OK) status containing the resource's metadata.

+

Deleting a Resource

+

Knora does not normally delete resources; instead, it marks them as deleted, which means that they do not appear in +normal query results.

+

To mark a resource as deleted, use this route:

+
HTTP POST to http://host/v2/resources/delete
+
+

The request body is a JSON-LD object containing the following information about the resource:

+
    +
  • @id: the resource's IRI
  • +
  • @type: the resource's class IRI
  • +
  • knora-api:lastModificationDate: an xsd:dateTimeStamp representing the last modification date that is currently + attached to the resource, if any. This is used to make sure that the resource has not been modified by someone else + since you last read it.
  • +
+
{
+  "@id" : "http://rdfh.ch/0001/a-thing",
+  "@type" : "anything:Thing",
+  "knora-api:lastModificationDate" : {
+    "@type" : "xsd:dateTimeStamp",
+    "@value" : "2019-02-05T17:05:35.776747Z"
+  },
+  "knora-api:deleteComment" : "This resource was created by mistake.",
+  "@context" : {
+    "rdf" : "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
+    "knora-api" : "http://api.knora.org/ontology/knora-api/v2#",
+    "rdfs" : "http://www.w3.org/2000/01/rdf-schema#",
+    "xsd" : "http://www.w3.org/2001/XMLSchema#",
+    "anything" : "http://0.0.0.0:3333/ontology/0001/anything/v2#"
+  }
+}
+
+

The optional property knora-api:deleteComment specifies a comment to be attached to the resource, explaining why it +has been marked as deleted.

+

The optional property knora-api:deleteDate +(an xsd:dateTimeStamp) +indicates when the resource was marked as deleted; if not given, the current time is used.

+

The response is a JSON-LD document containing the predicate knora-api:result with a confirmation message.

+

Requesting Deleted Resources

+

Resources marked as deleted are not found in search queries. It is however possible to request them directly or from an +ARK URL. In these instances, the API will not return the deleted resource, but instead a generic resource of type +knora-base:DeletedResource. This resource will be similar to the requested resource, having e.g. the same IRI. +The resource will contain the deletion date and optionally the deletion comment.

+

The response to requesting a deleted resource will look as the following example:

+
{
+    "rdfs:label": "Deleted Resource",
+    "knora-api:versionArkUrl": {
+        "@value": "http://0.0.0.0:3336/ark:/72163/1/0001/a=thingO.20211214T084407677335Z",
+        "@type": "xsd:anyURI"
+    },
+    "knora-api:attachedToProject": {
+        "@id": "http://rdfh.ch/projects/0001"
+    },
+    "knora-api:userHasPermission": "CR",
+    "knora-api:attachedToUser": {
+        "@id": "http://rdfh.ch/users/9XBCrDV3SRa7kS1WwynB4Q"
+    },
+    "knora-api:hasPermissions": "CR knora-admin:ProjectMember|V knora-admin:ProjectMember",
+    "knora-api:isDeleted": true,
+    "@type": "knora-api:DeletedResource",
+    "@id": "http://rdfh.ch/0001/a-thing",
+    "knora-api:deleteComment": "This resource is too boring.",
+    "knora-api:arkUrl": {
+        "@value": "http://0.0.0.0:3336/ark:/72163/1/0001/a=thingO",
+        "@type": "xsd:anyURI"
+    },
+    "knora-api:creationDate": {
+        "@value": "2021-12-14T08:44:07.677335Z",
+        "@type": "xsd:dateTimeStamp"
+    },
+    "knora-api:deleteDate": {
+        "@type": "xsd:dateTimeStamp",
+        "@value": "2021-12-14T08:44:07.372543Z"
+    },
+    "@context": {
+        "rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
+        "rdfs": "http://www.w3.org/2000/01/rdf-schema#",
+        "xsd": "http://www.w3.org/2001/XMLSchema#",
+        "knora-api": "http://api.knora.org/ontology/knora-api/v2#"
+    }
+}
+
+ +

If resource A has a link to resource B, and resource +B is later marked as deleted, A's link will still exist. DSP-API v2 will still return the link when A is queried, +but without any information about B (except for B's IRI). If A's link is necessary to meet the requirements of a +cardinality, marking B as deleted will not violate the cardinality.

+

The reason for this design is that A and B might be in different projects, and each project must retain control of +its resources and be able to mark them as deleted, even if they are used by another project.

+

Erasing a Resource from the Triplestore

+

Normally, resources are not actually removed from the triplestore; they are only marked as deleted (see +Deleting a Resource). However, sometimes it is necessary to erase a resource from the +triplestore. To do so, use this route:

+
HTTP POST to http://host/v2/resources/erase
+
+

The request body is the same as for Deleting a Resource, except that knora-api:deleteComment +is not relevant and will be ignored.

+

To do this, a user must be a system administrator or an administrator of the project containing the resource. The user's +permissions on the resource are not otherwise checked.

+

A resource cannot be erased if any other resource has a link to it. Any such links must first be changed or marked as +deleted (see Updating a Value and +Deleting a Value). Then, when the resource is erased, the deleted link values that +referred to it will also be erased.

+

This operation cannot be undone (except by restoring the repository from a backup), so use it with care.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/03-endpoints/api-v2/editing-values/index.html b/03-endpoints/api-v2/editing-values/index.html new file mode 100644 index 0000000000..dbbde03f7b --- /dev/null +++ b/03-endpoints/api-v2/editing-values/index.html @@ -0,0 +1,3803 @@ + + + + + + + + + + + + + + + + + + + + + + + Creating and Editing Values - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + + + + + +
+
+ + + + + + +

Creating and Editing Values

+

Creating a Value

+

To create a value in an existing resource, use this route:

+
HTTP POST to http://host/v2/values
+
+

The body of the request is a JSON-LD document in the +complex API schema, specifying the resource's IRI and type, the resource property, and the +content of the value. The representation of the value is the same as when it is returned in a GET request, except that +its IRI and knora-api:attachedToUser are not given. For example, to create an integer value:

+
{
+  "@id": "http://rdfh.ch/0001/a-thing",
+  "@type": "anything:Thing",
+  "anything:hasInteger": {
+    "@type": "knora-api:IntValue",
+    "knora-api:intValueAsInt": 4
+  },
+  "@context": {
+    "knora-api": "http://api.knora.org/ontology/knora-api/v2#",
+    "anything": "http://0.0.0.0:3333/ontology/0001/anything/v2#"
+  }
+}
+
+

Each value can have a comment, given in knora-api:valueHasComment. For example:

+
{
+  "@id": "http://rdfh.ch/0001/a-thing",
+  "@type": "anything:Thing",
+  "anything:hasInteger": {
+    "@type": "knora-api:IntValue",
+    "knora-api:intValueAsInt": 4,
+    "knora-api:valueHasComment": "This is a comment."
+  },
+  "@context": {
+    "knora-api": "http://api.knora.org/ontology/knora-api/v2#",
+    "anything": "http://0.0.0.0:3333/ontology/0001/anything/v2#"
+  }
+}
+
+

Permissions for the new value can be given by adding knora-api:hasPermissions. For example:

+
{
+  "@id": "http://rdfh.ch/0001/a-thing",
+  "@type": "anything:Thing",
+  "anything:hasInteger": {
+    "@type": "knora-api:IntValue",
+    "knora-api:intValueAsInt": 4,
+    "knora-api:hasPermissions": "CR knora-admin:Creator|V http://rdfh.ch/groups/0001/thing-searcher"
+  },
+  "@context": {
+    "knora-api": "http://api.knora.org/ontology/knora-api/v2#",
+    "anything": "http://0.0.0.0:3333/ontology/0001/anything/v2#"
+  }
+}
+
+

Each value can have an optional custom IRI (of Knora IRI form) specified by the @id +attribute, a custom creation date specified by adding knora-api:valueCreationDate (an +xsd:dateTimeStamp), or a custom UUID given by +knora-api:valueHasUUID. Each custom UUID must be base64url-encoded, without padding. If a custom +UUID is provided, it will be used in value IRI. If a custom IRI is given for the value, its UUID should match the given +custom UUID. If a custom IRI is provided, but there is no custom UUID provided, then the UUID given in the IRI will be +assigned to the knora-api:valueHasUUID. A custom value IRI must be the IRI of the containing resource, followed by +a /values/ and a custom ID string. For example:

+
{
+  "@id": "http://rdfh.ch/0001/a-thing",
+  "@type": "anything:Thing",
+  "anything:hasInteger": {
+    "@id": "http://rdfh.ch/0001/a-thing/values/IN4R19yYR0ygi3K2VEHpUQ",
+    "@type": "knora-api:IntValue",
+    "knora-api:intValueAsInt": 21,
+    "knora-api:valueHasUUID": "IN4R19yYR0ygi3K2VEHpUQ",
+    "knora-api:valueCreationDate": {
+      "@type": "xsd:dateTimeStamp",
+      "@value": "2020-06-04T12:58:54.502951Z"
+    }
+  },
+  "@context": {
+    "knora-api": "http://api.knora.org/ontology/knora-api/v2#",
+    "anything": "http://0.0.0.0:3333/ontology/0001/anything/v2#",
+    "xsd": "http://www.w3.org/2001/XMLSchema#"
+  }
+}
+
+

The format of the object of knora-api:hasPermissions is described in +Permissions.

+

If permissions are not given, configurable default permissions are used (see +Default Object Access Permissions +).

+

To create a value, the user must have modify permission on the containing resource.

+

The response is a JSON-LD document containing:

+
    +
  • @id: the IRI of the value that was created.
  • +
  • @type: the value's type.
  • +
  • knora-api:valueHasUUID, the value's UUID, which remains stable across value versions + (except for link values, as explained below).
  • +
+ +

To create a link, you must create a knora-api:LinkValue, which represents metadata about the link. The property that +connects the resource to the LinkValue is a link value property, whose name is constructed by adding Value to the +name of the link property (see +Links Between Resources). The triple representing the +direct link between the resources is created automatically. For example, if the link property that should connect the +resources is anything:hasOtherThing, we can create a link like this:

+
{
+  "@id": "http://rdfh.ch/0001/a-thing",
+  "@type": "anything:Thing",
+  "anything:hasOtherThingValue": {
+    "@type": "knora-api:LinkValue",
+    "knora-api:linkValueHasTargetIri": {
+      "@id": "http://rdfh.ch/0001/tPfZeNMvRVujCQqbIbvO0A"
+    }
+  },
+  "@context": {
+    "xsd": "http://www.w3.org/2001/XMLSchema#",
+    "knora-api": "http://api.knora.org/ontology/knora-api/v2#",
+    "anything": "http://0.0.0.0:3333/ontology/0001/anything/v2#"
+  }
+}
+
+

As with ordinary values, permissions on links can be specified by adding knora-api:hasPermissions.

+

The response is a JSON-LD document containing:

+
    +
  • @id: the IRI of the value that was created.
  • +
  • @type: the value's type.
  • +
  • knora-api:valueHasUUID, the value's UUID, which remains stable across value versions, unless the link is changed to + point to a different resource, in which case it is considered a new link and gets a new UUID. Changing a link's + metadata, without changing its target, creates a new version of the link value with the same UUID.
  • +
+

Creating a Text Value Without Standoff Markup

+

Use the predicate knora-api:valueAsString of knora-api:TextValue:

+
{
+  "@id": "http://rdfh.ch/0001/a-thing",
+  "@type": "anything:Thing",
+  "anything:hasText": {
+    "@type": "knora-api:TextValue",
+    "knora-api:valueAsString": "This is a text without markup."
+  },
+  "@context": {
+    "knora-api": "http://api.knora.org/ontology/knora-api/v2#",
+    "anything": "http://0.0.0.0:3333/ontology/0001/anything/v2#"
+  }
+}
+
+

Creating a Text Value with Standoff Markup

+

Currently, the only way to create a text value with standoff markup +is to submit it in XML format using an XML-to-standoff mapping. +See here for more detials.

+

Creating a Text Value with Standard Mapping

+

To create a value with the standard mapping (http://rdfh.ch/standoff/mappings/StandardMapping), we can make an XML +document like this:

+
<?xml version="1.0" encoding="UTF-8"?>
+<text>
+    This text links to another <a class="salsah-link" href="http://rdfh.ch/0001/another-thing">resource</a>.
+</text>
+
+

This document can then be embedded in a JSON-LD request, using the predicate knora-api:textValueAsXml:

+
{
+  "@id": "http://rdfh.ch/0001/a-thing",
+  "@type": "anything:Thing",
+  "anything:hasText": {
+    "@type": "knora-api:TextValue",
+    "knora-api:textValueAsXml": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<text>\n   This text links to another <a class=\"salsah-link\" href=\"http://rdfh.ch/0001/another-thing\">resource</a>.\n</text>",
+    "knora-api:textValueHasMapping": {
+      "@id": "http://rdfh.ch/standoff/mappings/StandardMapping"
+    }
+  },
+  "@context": {
+    "knora-api": "http://api.knora.org/ontology/knora-api/v2#",
+    "anything": "http://0.0.0.0:3333/ontology/0001/anything/v2#"
+  }
+}
+
+

Note that quotation marks and line breaks in the XML must be escaped, and that the IRI of the mapping must be provided.

+

Creating a Text Value with a Custom Mapping

+

To create a text value with custom mapping, the following steps are required:

+
    +
  1. Optionally, an XSL transformation resource (kb:XSLTransformation) can be created that may be defined as the default + transformation of the mapping.
  2. +
  3. The mapping resource (kb:XMLToStandoffMapping) must be created, if it does not already exist.
  4. +
  5. The text value can be created as in the example above, using the mapping resource IRI in kb:textValueHasMapping.
  6. +
+

The kb:XSLTransformation resource is a subclass of kb:TextRepresentation, so it has a kb:hasTextFileValue pointing +to a kb:TextFileValue +which represents the XSLT file stored in SIPI. For more Details, see Creating File Values.

+

The kb:XMLToStandoffMapping resource requires the mapping XML as +specified here. +If an XSL transformation has been defined, the IRI the transformation can be placed in the <defaultXSLTransformation> +tag of the mapping XML.

+

If a mapping has been defined, then requesting the text value will return both the kb:textValueAsXml and +the kb:textValueAsHtml properties, +where the XML can be used for editing the value, while the HTML can be used to display it. +If no mapping has been defined, only kb:textValueAsXml can be returned.

+

Creating File Values

+

DSP-API supports the storage of certain types of data as files, using SIPI +(see FileValue). DSP-API v2 currently supports using SIPI to store +the following types of files:

+
    +
  • Images: JPEG, JPEG2000, TIFF, or PNG which are stored internally as JPEG2000
  • +
  • Documents: PDF
  • +
  • Audio: MPEG or Waveform audio file format (.wav, .x-wav, .vnd.wave)
  • +
  • Text files: CSV, JSON, ODD, RNG, TXT, XLS, XLSX, XML, XSD, XSL
  • +
  • Video files: MP4
  • +
  • Archive files: ZIP, TAR, GZIP
  • +
+

Support for other types of files will be added in the future.

+

The following sections describe the steps for creating a file value.

+

Files can be ingested into DSP using SIPI or DSP-INGEST (experimental).

+

Upload Files to SIPI

+

The first step is to upload one or more files to SIPI, using a multipart/form-data request, where sipihost +represents the host and port on which SIPI is running:

+
HTTP POST to http://sipihost/upload?token=TOKEN
+
+

The token parameter must provide the JSON Web Token that DSP-API returned when the client logged in. +Each body part in the request must contain a parameter filename, providing the file's original filename, which both +DSP-API and SIPI will store; these filenames can be descriptive and need not be unique.

+

SIPI stores the file in a temporary location. If the file is an image, it is converted first to JPEG2000 format, and the +converted file is stored.

+

SIPI then returns a JSON response that looks something like this:

+
{
+  "uploadedFiles": [
+    {
+      "originalFilename": "manuscript-1234-page-1.tiff",
+      "internalFilename": "3UIsXH9bP0j-BV0D4sN51Xz.jp2",
+      "temporaryBaseIIIFUrl": "http://sipihost/tmp"
+    },
+    {
+      "originalFilename": "manuscript-1234-page-2.tiff",
+      "internalFilename": "2RvJgguglpe-B45EOk0Gx8H.jp2",
+      "temporaryBaseIIIFUrl": "http://sipihost/tmp"
+    }
+  ]
+}
+
+

In this example, we uploaded two files to SIPI, so uploadedFiles is an array with two elements. For each file, we +have:

+
    +
  • the originalFilename, which we submitted when uploading the file
  • +
  • the unique internalFilename that SIPI has randomly generated for the file
  • +
  • the temporaryBaseIIIFUrl, which we can use to construct a IIIF URL for previewing the file
  • +
+

In the case of an image file, the client may now wish to get a thumbnail of each uploaded image, to allow the user to +confirm that the correct files have been uploaded. This can be done by adding IIIF parameters to temporaryBaseIIIFUrl. +For example, to get a JPG thumbnail image that is 150 pixels wide, you would add /full/150,/0/default.jpg.

+

Upload Files to DSP-INGEST

+

Support for DSP-INGEST is in its early stage and currently mainly intended for ingesting large amounts of data. +When a file has been ingested through DSP-INGEST, +it is necessary to send the header X-Asset-Ingested +along with the request to create the file value resource in DSP-API.

+

Submit A File Value to DSP-API

+

A DSP-API Representation (i.e. a resource containing information about a file) must always have exactly one file value +attached to it. (see Representations). Therefore, a request +to create a new file value must always be submitted as part of a request to create a new resource (see +Creating a Resource). You can also update a file value in an existing +Representation; see Updating a Value.

+

Instead of providing the file's complete metadata to DSP-API, you just provide the unique internal filename generated by +SIPI.

+

Still Images

+

Still Image may be stored in SIPI or in an external IIIF server.

+
Images stored in SIPI
+

Here is an example of a request to create a resource of class anything:ThingPicture with a still image stored in SIPI. +The resource's class is a subclass of knora-api:StillImageRepresentation and therefore has the property knora-api:hasStillImageFileValue. +The file value is of type knora-api:StillImageFileValue:

+
{
+  "@type": "anything:ThingPicture",
+  "knora-api:hasStillImageFileValue": {
+    "@type": "knora-api:StillImageFileValue",
+    "knora-api:fileValueHasFilename": "3UIsXH9bP0j-BV0D4sN51Xz.jp2"
+  },
+  "knora-api:attachedToProject": {
+    "@id": "http://rdfh.ch/projects/0001"
+  },
+  "rdfs:label": "test thing",
+  "@context": {
+    "rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
+    "knora-api": "http://api.knora.org/ontology/knora-api/v2#",
+    "rdfs": "http://www.w3.org/2000/01/rdf-schema#",
+    "xsd": "http://www.w3.org/2001/XMLSchema#",
+    "anything": "http://0.0.0.0:3333/ontology/0001/anything/v2#"
+  }
+}
+
+

In the case of a knora-api:StillImageFileValue DSP-API gets the rest of the file's metadata from SIPI. +If the client's request to DSP-API is valid, DSP-API saves the file value in the triplestore and instructs SIPI to move the file to permanent storage. +Otherwise, the temporary file that was stored by SIPI is deleted.

+
Images stored in an external IIIF server
+

In the case of a Still image stored in an external IIIF server, the request is similar to the one above, but the file value is of type knora-api:StillImageExternalFileValue +and the knora-api:externalUrl property is used to provide the URL of the image in the IIIF server:

+
{
+  "@type": "anything:ThingPicture",
+  "knora-api:hasStillImageFileValue": {
+    "@type": "knora-api:StillImageExternalFileValue",
+    "knora-api:stillImageFileValueHasExternalUrl": {
+      "@type": "xsd:anyURI",
+      "@value": "https://example.com/iiif/3UIsXH9bP0j-BV0D4sN51Xz.jp2/full/max/0/default.jpg"
+    }
+  },
+  "knora-api:attachedToProject": {
+    "@id": "http://rdfh.ch/projects/0001"
+  },
+  "rdfs:label": "test thing",
+  "@context": {
+    "rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
+    "knora-api": "http://api.knora.org/ontology/knora-api/v2#",
+    "rdfs": "http://www.w3.org/2000/01/rdf-schema#",
+    "xsd": "http://www.w3.org/2001/XMLSchema#",
+    "anything": "http://0.0.0.0:3333/ontology/0001/anything/v2#"
+  }
+}
+
+

Note: For backwards compatibility, we support using knora-api:fileValueHasExternalUrl and +knora-api:stillImageFileValueExternalFileValue properties if the value is submitted as a +String literal, i.e. "knora-api:stillImageFileValueExternalFileValue" : "https://example.com/iiif/3UIsXH9bP0j-BV0D4sN51Xz.jp2/full/max/0/default.jpg". +Support for String literals and the knora-api:fileValueHasExternalUrl property is +deprecated and will be removed in the future. +The knora-api:stillImageFileValueHasExternalUrl property with a xsd:anyURI type is +correct and must be used for reading and writing.

+

PDF Documents

+

If you're submitting a PDF document, use the resource class knora-api:DocumentRepresentation, which has the property +knora-api:hasDocumentFileValue, pointing to a knora-api:DocumentFileValue.

+

Text Files

+

For a text file, use knora-api:TextRepresentation, which has the property knora-api:hasTextFileValue, pointing to a +knora-api:TextFileValue.

+

Archive Files

+

For an archive like zip, use knora-api:ArchiveRepresentation, which has the property knora-api:hasArchiveFileValue, +pointing to a knora-api:ArchiveFileValue.

+

Updating a Value

+

To update a value, use this route:

+
HTTP PUT to http://host/v2/values
+
+

Updating a value means creating a new version of an existing value. The new version will have a different IRI. The +request is the same as for creating a value, except that the @id of the current value version is given. For example, +to update an integer value:

+
{
+  "@id": "http://rdfh.ch/0001/a-thing",
+  "@type": "anything:Thing",
+  "anything:hasInteger": {
+    "@id": "http://rdfh.ch/0001/a-thing/values/vp96riPIRnmQcbMhgpv_Rg",
+    "@type": "knora-api:IntValue",
+    "knora-api:intValueAsInt": 5
+  },
+  "@context": {
+    "knora-api": "http://api.knora.org/ontology/knora-api/v2#",
+    "anything": "http://0.0.0.0:3333/ontology/0001/anything/v2#"
+  }
+}
+
+

The value can be given a comment by using knora-api:valueHasComment. To change only the comment of a value, you can +resubmit the existing value with the updated comment.

+

Permissions can be specified by adding knora-api:hasPermissions. Otherwise, the new version has the same permissions +as the previous one. To change the permissions on a value, the user must have change rights permission on the value.

+

To update only the permissions on a value, submit it with the new permissions and with its @id and @type but without +any other content, like this:

+
{
+  "@id": "http://rdfh.ch/0001/a-thing",
+  "@type": "anything:Thing",
+  "anything:hasInteger": {
+    "@id": "http://rdfh.ch/0001/a-thing/values/vp96riPIRnmQcbMhgpv_Rg",
+    "@type": "knora-api:IntValue",
+    "knora-api:hasPermissions": "CR knora-admin:Creator|V knora-admin:KnownUser"
+  },
+  "@context": {
+    "knora-api": "http://api.knora.org/ontology/knora-api/v2#",
+    "anything": "http://0.0.0.0:3333/ontology/0001/anything/v2#"
+  }
+}
+
+

To update a link, the user must have modify permission on the containing resource as well as on the value.

+

To update a value and give it a custom timestamp, add knora-api:valueCreationDate (an +xsd:dateTimeStamp).

+

To update a value and give the new version a custom IRI, add knora-api:newValueVersionIri, like this:

+
{
+  "@id": "http://rdfh.ch/0001/a-thing",
+  "@type": "anything:Thing",
+  "anything:hasInteger": {
+    "@id": "http://rdfh.ch/0001/a-thing/values/vp96riPIRnmQcbMhgpv_Rg",
+    "@type": "knora-api:IntValue",
+    "knora-api:intValueAsInt": 21,
+    "knora-api:newValueVersionIri": {
+      "@id": "http://rdfh.ch/0001/a-thing/values/int-value-IRI"
+    }
+  },
+  "@context": {
+    "knora-api": "http://api.knora.org/ontology/knora-api/v2#",
+    "anything": "http://0.0.0.0:3333/ontology/0001/anything/v2#"
+  }
+}
+
+

A custom value IRI must be the IRI of the containing resource, followed by a /values/ and a custom ID string.

+

The response is a JSON-LD document containing only @id and @type, returning the IRI and type of the new value +version.

+

If you submit an outdated value ID in a request to update a value, the response will be an HTTP 404 (Not Found) error.

+

The response to a value update request contains:

+
    +
  • @id: the IRI of the value that was created.
  • +
  • @type: the value's type.
  • +
  • knora-api:valueHasUUID, the value's UUID, which remains stable across value versions, unless the value is a link + value and is changed to point to a different resource, in which case it is considered a new link and gets a new UUID.
  • +
+

Deleting a Value

+

DSP-API does not normally delete values; instead, it marks them as deleted, which means that they do not appear in normal +query results.

+

To mark a value as deleted, use this route:

+
HTTP POST to http://host/v2/values/delete
+
+

The request must include the resource's ID and type, the property that points from the resource to the value, and the +value's ID and type. For example:

+
{
+  "@id": "http://rdfh.ch/0001/a-thing",
+  "@type": "anything:Thing",
+  "anything:hasInteger": {
+    "@id": "http://rdfh.ch/0001/a-thing/values/vp96riPIRnmQcbMhgpv_Rg",
+    "@type": "knora-api:IntValue",
+    "knora-api:deleteComment": "This value was created by mistake."
+  },
+  "@context": {
+    "knora-api": "http://api.knora.org/ontology/knora-api/v2#",
+    "anything": "http://0.0.0.0:3333/ontology/0001/anything/v2#"
+  }
+}
+
+

The optional property knora-api:deleteComment specifies a comment to be attached to the value, explaining why it has +been marked as deleted

+

The optional property knora-api:deleteDate (an +xsd:dateTimeStamp) +specifies a custom timestamp indicating when the value was deleted. If not specified, the current time is used.

+

The response is a JSON-LD document containing the predicate knora-api:result with a confirmation message.

+

Requesting Deleted Values

+

Values marked as deleted are not found in search queries. But when requesting a resource that has deleted values, these +will show up as generic knora-api:DeletedValue values. This value will be similar to the deleted value, having e.g. +the same IRI. The DeletedValue will contain the deletion date and optionally the deletion comment.

+

The response to requesting a deleted resource will look as the following example:

+
{
+  "knora-api:DeletedValue": [
+    {
+      "knora-api:versionArkUrl": {
+        "@value": "http://0.0.0.0:3336/ark:/72163/1/0001/a=thingO/sWSymIzAS_qXqyHLhwbwwAU.20211216T18193124797Z",
+        "@type": "xsd:anyURI"
+      },
+      "knora-api:userHasPermission": "RV",
+      "knora-api:valueCreationDate": {
+        "@value": "2021-12-16T18:19:31.247970Z",
+        "@type": "xsd:dateTimeStamp"
+      },
+      "knora-api:deleteDate": {
+        "@type": "xsd:dateTimeStamp",
+        "@value": "2021-12-16T18:20:02.550828Z"
+      },
+      "knora-api:attachedToUser": {
+        "@id": "http://rdfh.ch/users/9XBCrDV3SRa7kS1WwynB4Q"
+      },
+      "knora-api:valueHasUUID": "sWSymIzAS_qXqyHLhwbwwA",
+      "knora-api:hasPermissions": "CR knora-admin:Creator|M knora-admin:ProjectMember|V knora-admin:KnownUser|RV knora-admin:UnknownUser",
+      "knora-api:isDeleted": true,
+      "@type": "knora-api:DeletedValue",
+      "http://www.knora.org/ontology/knora-base#DeletedValue": "DeletedValue",
+      "@id": "http://rdfh.ch/0001/a-thing/values/DrXts3Up3DijGriI403nhg",
+      "knora-api:deleteComment": "This value is obsolete",
+      "knora-api:arkUrl": {
+        "@value": "http://0.0.0.0:3336/ark:/72163/1/0001/a=thingO/sWSymIzAS_qXqyHLhwbwwAU",
+        "@type": "xsd:anyURI"
+      }
+    },
+    {}
+  ]
+}
+
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/03-endpoints/api-v2/getting-lists/index.html b/03-endpoints/api-v2/getting-lists/index.html new file mode 100644 index 0000000000..c19cdd689e --- /dev/null +++ b/03-endpoints/api-v2/getting-lists/index.html @@ -0,0 +1,2977 @@ + + + + + + + + + + + + + + + + + + + + + + + Getting Lists - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + +

Getting Lists

+

Getting a complete List

+

In order to request a complete list, make a HTTP GET request to the lists route, +appending the Iri of the list's root node (URL-encoded):

+
HTTP GET to http://host/v2/lists/listRootNodeIri
+
+

Lists are only returned in the complex schema. +The response to a list request is a List (see interface List in module ListResponse).

+

Getting a single Node

+

In order to request a single node of a list, make a HTTP GET request to the node route, +appending the node's Iri (URL-encoded):

+
HTTP GET to http://host/v2/node/nodeIri
+
+

Nodes are only returned in the complex schema. +The response to a node request is a ListNode (see interface List in module ListResponse).

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/03-endpoints/api-v2/introduction/index.html b/03-endpoints/api-v2/introduction/index.html new file mode 100644 index 0000000000..93550b466a --- /dev/null +++ b/03-endpoints/api-v2/introduction/index.html @@ -0,0 +1,3149 @@ + + + + + + + + + + + + + + + + + + + + + + + Introduction - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + +

Introduction: Using API v2

+

API v2 Path Segment

+

Every request to API v2 includes v2 as a path segment, e.g. +http://host/v2/resources/http%3A%2F%2Frdfh.ch%2Fc5058f3a. +Accordingly, requests using any other version of the API will require +another path segment.

+

Response Formats

+

All API v2 responses can be returned in +JSON-LD, +Turtle, +or RDF/XML, using +HTTP content negotiation. The client +can request these formats using the following MIME types:

+ + + + + + + + + + + + + + + + + + + + + +
FormatMIME Type
JSON-LDapplication/ld+json
Turtletext/turtle
RDF/XMLapplication/rdf+xml
+

JSON-LD

+

Our preferred format for data exchange is +JSON-LD. JSON-LD allows the +DSP-API server to provide responses that are relatively easy for +automated processes to interpret, since their structure and semantics is +explicitly defined. For example, each user-created Knora resource +property is identified by an IRI, which can be dereferenced to get more +information about it (e.g. its label in different languages). Moreover, +each value has a type represented by an IRI. These are either standard +RDF types (e.g. XSD datatypes) or more complex types whose IRIs can be +dereferenced to get more information about their structure.

+

At the same time, JSON-LD responses are relatively easy for software +developers to work with, and are more concise and easier to read than +the equivalent XML. Items in a response can have human-readable names, +which can nevertheless be expanded to full IRIs. Also, while a format such as +Turtle just provides a +set of RDF triples, an equivalent JSON-LD response can explicitly +provide data in a hierarchical structure, with objects nested inside +other objects.

+

Hierarchical vs. Flat JSON-LD

+

The client can choose between hierarchical and flat JSON-LD. In hierarchical +JSON-LD, entities with IRIs are inlined (nested) where they are used. If the +same entity is used in more than one place, it is inlined only once, and other +uses just refer to its IRI. In Knora's flat JSON-LD, all entities with IRIs are located +at the top level of the document (in a @graph if there is more than one of them). +This setting does not affect blank nodes, which are always inlined (unlike in standard +flat JSON-LD). DSP ontologies are always returned in the flat rendering; other kinds +of responses default to hierarchical. To use this setting, submit the HTTP header +X-Knora-JSON-LD-Rendering with the value hierarchical or flat.

+

Knora IRIs

+

Resources and entities are identified by IRIs. The format of these IRIs +is explained in Knora IRIs.

+

API Schema

+

DSP-API v2 uses RDF data structures that are simpler than the ones +actually stored in the triplestore, and more suitable for the development +of client software. Thus we refer to the internal schema of data +as it is stored in the triplestore, and to external schemas which +are used to represent that data in API v2.

+

DSP-API v2 offers a complex schema and a simple one. The main difference +is that the complex schema exposes the complexity of value objects, while +the simple version does not. A client that needs to edit values must use the +complex schema in order to obtain the IRI of each value. A client that reads +but does not update data can use the simplified schema. The simple schema is +mainly intended to facilitate interoperability with other RDF-based systems in the +context of Linked Open Data. It is therefore designed to use the +simplest possible datatypes and to require minimal knowledge of Knora.

+

In either case, the client deals only with data whose structure and +semantics are defined by external DSP-API ontologies, which are distinct from +the internal ontologies that are used to store date in the triplestore. The Knora +API server automatically converts back and forth between these internal +and external representations. This approach encapsulates the internals +and adds a layer of abstraction to them.

+

IRIs representing ontologies and ontology entities are different in different +schemas; see Knora IRIs.

+

Some API operations inherently require the client to accept responses in +the complex schema. For example, if an ontology is requested using an IRI +indicating the simple schema, the ontology will be returned in the simple schema (see +Querying, Creating, and Updating Ontologies).

+

Other API operations can return data in either schema. In this case, the +complex schema is used by default in the response, unless the request specifically +asks for the simple schema. The client can specify the desired schema by using +an HTTP header or a URL parameter:

+
    +
  • the HTTP header X-Knora-Accept-Schema
  • +
  • the URL parameter schema
  • +
+

Both the HTTP header and the URL parameter accept the values simple or +complex.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/03-endpoints/api-v2/knora-iris/index.html b/03-endpoints/api-v2/knora-iris/index.html new file mode 100644 index 0000000000..182d59c5fd --- /dev/null +++ b/03-endpoints/api-v2/knora-iris/index.html @@ -0,0 +1,3234 @@ + + + + + + + + + + + + + + + + + + + + + + + IRIs - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + + + + + +
+
+ + + + + + +

Knora IRIs

+

The IRIs used in Knora repositories and in the DSP-API v2 follow +certain conventions.

+

Project Short-Codes

+

A project short-code is a hexadecimal number of at least four digits, +assigned by the DaSCH to uniquely identify a +Knora project regardless of where it is hosted. The IRIs of ontologies that +are built into Knora do not contain shortcodes; these ontologies implicitly +belong to the Knora system project.

+

A user-created ontology IRI must always include its project shortcode.

+

Project ID 0000 is reserved for shared ontologies +(see Shared Ontologies).

+

The range of project IDs from 0001 to 00FF inclusive is reserved for +local testing. Thus, the first useful project will be 0100.

+

In the beginning, Unil will use the IDs 0100 to 07FF, and Unibas +0800 to 08FF.

+

IRIs for Ontologies and Ontology Entities

+

Internal Ontology IRIs

+

Knora makes a distinction between internal and external ontologies. Internal +ontologies are used in the triplestore, while external ontologies are used in +API v2. For each internal ontology, there is a corresponding external ontology. Some +internal ontologies are built into Knora, while others are +user-created. Knora automatically generates external +ontologies based on user-created internal ontologies.

+

Each internal ontology has an IRI, which is also the IRI of the named +graph that contains the ontology in the triplestore. An internal +ontology IRI has the form:

+
http://www.knora.org/ontology/PROJECT_SHORTCODE/ONTOLOGY_NAME
+
+

For example, the internal ontology IRI based on project code 0001 and ontology +name example would be:

+
http://www.knora.org/ontology/0001/example
+
+

An ontology name must be a valid XML +NCName and must be URL safe. +The following names are reserved for built-in internal DSP ontologies:

+
    +
  • knora-base
  • +
  • standoff
  • +
  • salsah-gui
  • +
+

Names starting with knora are reserved for future built-in Knora +ontologies. A user-created ontology name may not start with the +letter v followed by a digit, and may not contain these reserved +words:

+
    +
  • knora
  • +
  • ontology
  • +
  • simple
  • +
  • shared
  • +
+

External Ontology IRIs

+

Unlike internal ontology IRIs, external ontology IRIs are meant to be +dereferenced as URLs. When an ontology IRI is dereferenced, the ontology +itself can be served either in a machine-readable format or as +human-readable documentation.

+

The IRI of an external Knora ontology has the form:

+
http://HOST[:PORT]/ontology/PROJECT_SHORTCODE/ONTOLOGY_NAME/API_VERSION
+
+

For built-in and shared ontologies, the host is always api.knora.org. Otherwise, +the hostname and port configured in application.conf under +app.http.knora-api.host and app.http.knora-api.http-port are used +(the port is omitted if it is 80).

+

This means that when a built-in or shared external ontology IRI is dereferenced, +the ontology can be served by a DSP-API server running at +api.knora.org. When the external IRI of a non-shared, project-specific ontology is +dereferenced, the ontology can be served by Knora that +hosts the project. During development and testing, this could be +localhost.

+

The name of an external ontology is the same as the name of the +corresponding internal ontology, with one exception: the external form +of knora-base is called knora-api.

+

The API version identifier indicates not only the version of the API, +but also an API 'schema'. The DSP-API v2 is available in two schemas:

+
    +
  • A complex schema, which is suitable both for reading and for editing + data. The complex schema represents values primarily as complex + objects. Its version identifier is v2.
  • +
  • A simple schema, which is suitable for reading data but not for + editing it. The simple schema facilitates interoperability between + DSP ontologies and non-DSP ontologies, since it represents + values primarily as literals. Its version identifier is simple/v2.
  • +
+

Other schemas could be added in the future for more specific use cases.

+

When requesting an ontology, the client requests a particular schema. +(This will also be true of most DSP-API v2 requests: the client will +be able to specify which schema the response should be provided in.)

+

For example, suppose a DSP-API server is running at +knora.example.org and hosts an ontology whose internal IRI is +http://www.knora.org/ontology/0001/example. That ontology can then be +requested using either of these IRIs:

+
    +
  • http://knora.example.org/ontology/0001/example/v2 (in the complex schema)
  • +
  • http://knora.example.org/ontology/0001/example/simple/v2 (in the simple schema)
  • +
+

While the internal example ontology refers to definitions in +knora-base, the external example ontology that is served by the API +refers instead to a knora-api ontology, whose IRI depends on the +schema being used:

+
    +
  • http://api.knora.org/ontology/knora-api/v2 (in the complex schema)
  • +
  • http://api.knora.org/ontology/knora-api/simple/v2 (in the simple schema)
  • +
+

Ontology Entity IRIs

+

DSP ontologies use 'hash namespaces' (see URI +Namespaces). +This means that the IRI of an ontology entity (a class or property +definition) is constructed by adding a hash character (#) to the +ontology IRI, followed by the name of the entity. In Knora, an entity +name must be a valid XML +NCName. +Thus, if there is a class called ExampleThing in an ontology whose +internal IRI is http://www.knora.org/ontology/0001/example, that class +has the following IRIs:

+
    +
  • http://www.knora.org/ontology/0001/example#ExampleThing (in the internal ontology)
  • +
  • http://HOST[:PORT]/ontology/0001/example/v2#ExampleThing (in the API v2 complex schema)
  • +
  • http://HOST[:PORT]/ontology/0001/example/simple/v2#ExampleThing (in the API v2 simple schema)
  • +
+

Shared Ontology IRIs

+

As explained in Shared Ontologies, +a user-created ontology can be defined as shared, meaning that it can be used by +multiple projects, and that its creators will not change it in ways that could +affect other ontologies or data that are based on it.

+

There is currently one project for shared ontologies:

+
http://www.knora.org/ontology/knora-base#DefaultSharedOntologiesProject
+
+

Its project code is 0000. Additional projects for shared ontologies may be supported +in future.

+

The internal and external IRIs of shared ontologies always use the hostname +api.knora.org, and have an additional segment, shared, after ontology. +The project code can be omitted, in which case the default shared ontology +project, 0000, is assumed. The sample shared ontology, example-box, has these IRIs:

+
    +
  • http://www.knora.org/ontology/shared/example-box (internal)
  • +
  • http://api.knora.org/ontology/shared/example-box/v2 (external, complex schema)
  • +
  • http://api.knora.org/ontology/shared/example-box/simple/v2 (external, simple schema)
  • +
+

IRIs for Data

+

Knora generates IRIs for data that it creates in the triplestore. Each +generated data IRI contains one or more UUID +identifiers to make it unique. To keep data IRIs relatively short, each UUID is +base64url-encoded, without padding; +thus each UUID is a 22-character string. DSP-API supports UUID version 4 or 5.

+

Data IRIs are not currently intended to be dereferenced as URLs. +Instead, each Knora resource has a separate permalink.

+

A Knora value does not have a stable IRI throughout its version history. +Each time a new version of a value is made, the new version gets a new IRI. +Therefore, it would not make sense to publish Knora value IRIs. When designing +ontologies for Knora projects, keep in mind that if you want something be directly +citable, it needs to be a resource, not a value.

+

The formats of generated data IRIs for different types of objects are as +follows:

+
    +
  • Resource: http://rdfh.ch/PROJECT_SHORTCODE/RESOURCE_UUID.
  • +
  • Value: + http://rdfh.ch/PROJECT_SHORTCODE/RESOURCE_UUID/values/VALUE_UUID
  • +
  • Standoff tag: + http://rdfh.ch/PROJECT_SHORTCODE/RESOURCE_UUID/values/VALUE_UUID/STANDOFF_UUID
  • +
  • XML-to-standoff mapping: + http://rdfh.ch/projects/PROJECT_SHORTCODE/mappings/MAPPING_NAME
  • +
  • XML-to-standoff mapping element: + http://rdfh.ch/projects/PROJECT_SHORTCODE/mappings/MAPPING_NAME/elements/MAPPING_ELEMENT_UUID
  • +
  • Project: http://rdfh.ch/projects/PROJECT_UUID
  • +
  • Group: http://rdfh.ch/groups/PROJECT_SHORTCODE/GROUP_UUID
  • +
  • Permission: + http://rdfh.ch/permissions/PROJECT_SHORTCODE/PERMISSION_UUID
  • +
  • Lists: http://rdfh.ch/lists/PROJECT_SHORTCODE/LIST_UUID
  • +
  • User: http://rdfh.ch/users/USER_UUID
  • +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/03-endpoints/api-v2/ontology-information/index.html b/03-endpoints/api-v2/ontology-information/index.html new file mode 100644 index 0000000000..b6fe117547 --- /dev/null +++ b/03-endpoints/api-v2/ontology-information/index.html @@ -0,0 +1,5402 @@ + + + + + + + + + + + + + + + + + + + + + + + Querying, Creating, and Updating Ontologies - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + +

Querying, Creating, and Updating Ontologies

+

Querying Ontology Information

+

Before reading this document, you should have a basic understanding of +DSP-API v2 external ontology schemas (see API Schema).

+

Each request returns a single RDF graph, which can be represented in +JSON-LD, +Turtle, +or RDF/XML, using +HTTP content negotiation (see +Response Formats).

+

The response format uses prefixes to shorten IRIs, making them more +human-readable. A client may wish to convert these to full IRIs for +processing. This can be done with responses in JSON-LD by using a library +that implements the JSON-LD API +to compact the document with an empty JSON-LD @context.

+

Querying Ontology Metadata

+

Requests for ontology metadata can return information about more than one +ontology, unlike other requests for ontology information. To get metadata +about all ontologies:

+
HTTP GET to http://host/v2/ontologies/metadata
+
+

If you submit a project IRI in the X-Knora-Accept-Project header, only the +ontologies for that project will be returned.

+

The response is in the complex API v2 schema. Sample response:

+
{
+  "@graph": [
+    {
+      "knora-api:lastModificationDate": {
+        "@value": "2017-12-19T15:23:42.166Z",
+        "@type": "xsd:dateTimeStamp"
+      },
+      "rdfs:label": "The anything ontology",
+      "knora-api:attachedToProject": {
+        "@id": "http://rdfh.ch/projects/0001"
+      },
+      "@type": "owl:Ontology",
+      "@id": "http://0.0.0.0:3333/ontology/0001/anything/v2"
+    },
+    {
+      "knora-api:lastModificationDate": {
+        "@value": "2022-03-23T07:14:17.445208Z",
+        "@type": "xsd:dateTimeStamp"
+      },
+      "rdfs:label": "The something ontology",
+      "knora-api:attachedToProject": {
+        "@id": "http://rdfh.ch/projects/0001"
+      },
+      "@type": "owl:Ontology",
+      "@id": "http://0.0.0.0:3333/ontology/0001/something/v2"
+    },
+    {
+      "knora-api:lastModificationDate": {
+        "@value": "2022-03-23T07:14:17.445208Z",
+        "@type": "xsd:dateTimeStamp"
+      },
+      "rdfs:label": "The images demo ontology",
+      "knora-api:attachedToProject": {
+        "@id": "http://rdfh.ch/projects/00FF" 
+      },
+      "@type": "owl:Ontology",
+      "@id": "http://0.0.0.0:3333/ontology/00FF/images/v2"
+    },
+    {
+      "knora-api:lastModificationDate": {
+        "@value": "2022-03-23T07:14:17.445208Z",
+        "@type": "xsd:dateTimeStamp"
+      },
+      "rdfs:label": "The BEOL ontology",
+      "knora-api:attachedToProject": {
+        "@id": "http://rdfh.ch/projects/yTerZGyxjZVqFMNNKXCDPF"
+      },
+      "@type": "owl:Ontology",
+      "@id": "http://0.0.0.0:3333/ontology/0801/beol/v2"
+    },
+    {
+      "knora-api:lastModificationDate": {
+        "@value": "2022-03-23T07:14:17.445208Z",
+        "@type": "xsd:dateTimeStamp"
+      },
+      "rdfs:label": "The Biblio ontology",
+      "knora-api:attachedToProject": {
+        "@id": "http://rdfh.ch/projects/yTerZGyxjZVqFMNNKXCDPF"
+      },
+      "@type": "owl:Ontology",
+      "@id": "http://0.0.0.0:3333/ontology/0801/biblio/v2"
+    },
+    {
+      "knora-api:lastModificationDate": {
+        "@value": "2022-03-23T07:14:17.445208Z",
+        "@type": "xsd:dateTimeStamp"
+      },
+      "rdfs:label": "The Newton-Project ontology",
+      "knora-api:attachedToProject": {
+        "@id": "http://rdfh.ch/projects/yTerZGyxjZVqFMNNKXCDPF"
+      },
+      "@type": "owl:Ontology",
+      "@id": "http://0.0.0.0:3333/ontology/0801/newton/v2"
+    },
+    {
+      "knora-api:lastModificationDate": {
+        "@value": "2022-03-23T07:14:17.445208Z",
+        "@type": "xsd:dateTimeStamp"
+      },
+      "rdfs:label": "The incunabula ontology",
+      "knora-api:attachedToProject": {
+        "@id": "http://rdfh.ch/projects/0803"
+      },
+      "@type": "owl:Ontology",
+      "@id": "http://0.0.0.0:3333/ontology/0803/incunabula/v2"
+    },
+    {
+      "knora-api:lastModificationDate": {
+        "@value": "2022-03-23T07:14:17.445208Z",
+        "@type": "xsd:dateTimeStamp"
+      },
+      "rdfs:label": "The dokubib ontology",
+      "knora-api:attachedToProject": {
+        "@id": "http://rdfh.ch/projects/0804"
+      },
+      "@type": "owl:Ontology",
+      "@id": "http://0.0.0.0:3333/ontology/0804/dokubib/v2"
+    },
+    {
+      "knora-api:lastModificationDate": {
+        "@value": "2022-03-23T07:14:17.445208Z",
+        "@type": "xsd:dateTimeStamp"
+      },
+      "rdfs:label": "The Anton Webern project ontology",
+      "knora-api:attachedToProject": {
+        "@id": "http://rdfh.ch/projects/08AE"
+      },
+      "@type": "owl:Ontology",
+      "@id": "http://0.0.0.0:3333/ontology/08AE/webern/v2"
+    },
+    {
+      "rdfs:label": "The Knora admin ontology",
+      "knora-api:attachedToProject": {
+        "@id": "http://www.knora.org/ontology/knora-admin#SystemProject"
+      },
+      "knora-api:isBuiltIn": true,
+      "@type": "owl:Ontology",
+      "@id": "http://api.knora.org/ontology/knora-admin/v2"
+    },
+    {
+      "rdfs:label": "The knora-api ontology in the complex schema",
+      "knora-api:attachedToProject": {
+        "@id": "http://www.knora.org/ontology/knora-admin#SystemProject"
+      },
+      "knora-api:isBuiltIn": true,
+      "@type": "owl:Ontology",
+      "@id": "http://api.knora.org/ontology/knora-api/v2"
+    },
+    {
+      "rdfs:label": "The salsah-gui ontology",
+      "knora-api:attachedToProject": {
+        "@id": "http://www.knora.org/ontology/knora-admin#SystemProject"
+      },
+      "knora-api:isBuiltIn": true,
+      "@type": "owl:Ontology",
+      "@id": "http://api.knora.org/ontology/salsah-gui/v2"
+    },
+    {
+      "rdfs:label": "The standoff ontology",
+      "knora-api:attachedToProject": {
+        "@id": "http://www.knora.org/ontology/knora-admin#SystemProject"
+      },
+      "knora-api:isBuiltIn": true,
+      "@type": "owl:Ontology",
+      "@id": "http://api.knora.org/ontology/standoff/v2"
+    }
+  ],
+  "@context": {
+    "knora-api": "http://api.knora.org/ontology/knora-api/v2#",
+    "xsd": "http://www.w3.org/2001/XMLSchema#",
+    "rdfs": "http://www.w3.org/2000/01/rdf-schema#",
+    "owl": "http://www.w3.org/2002/07/owl#"
+  }
+}
+
+

To get metadata about the ontologies that belong to one or more particular +projects:

+
HTTP GET to http://host/v2/ontologies/metadata/PROJECT_IRI[/PROJECT_IRI...]
+
+

The project IRIs must be URL-encoded.

+

Example response for the anything test project +(project IRI http://rdfh.ch/projects/0001):

+
{
+  "@id" : "http://0.0.0.0:3333/ontology/0001/anything/v2",
+  "@type" : "owl:Ontology",
+  "knora-api:attachedToProject" : {
+    "@id" : "http://rdfh.ch/projects/0001"
+  },
+  "knora-api:lastModificationDate": "2017-12-19T15:23:42.166Z",
+  "rdfs:label" : "The anything ontology",
+  "@context" : {
+    "knora-api" : "http://api.knora.org/ontology/knora-api/v2#",
+    "rdfs" : "http://www.w3.org/2000/01/rdf-schema#",
+    "owl" : "http://www.w3.org/2002/07/owl#"
+  }
+}
+
+

Querying an Ontology

+

An ontology can be queried either by using an API route directly or by +simply dereferencing the ontology IRI. The API route is as follows:

+
HTTP GET to http://host/v2/ontologies/allentities/ONTOLOGY_IRI
+
+

The ontology IRI must be URL-encoded, and may be in either the complex +or the simple schema. The response will be in the same schema. For +example, if the server is running on 0.0.0.0:3333, you can request +the knora-api ontology in the complex schema as follows:

+
HTTP GET to http://0.0.0.0:3333/v2/ontologies/allentities/http%3A%2F%2Fapi.knora.org%2Fontology%2Fknora-api%2Fv2
+
+

By default, this returns the ontology in JSON-LD; to request Turtle +or RDF/XML, add an HTTP Accept header +(see Response Formats).

+

If the client dereferences a project-specific ontology IRI as a URL, the +DSP-API server running on the hostname in the IRI will serve the +ontology. For example, if the server is running on 0.0.0.0:3333, the +IRI http://0.0.0.0:3333/ontology/00FF/images/simple/v2 can be +dereferenced to request the images sample ontology in the simple +schema.

+

If the client dereferences a built-in Knora ontology, such as +http://api.knora.org/ontology/knora-api/simple/v2, there must be a +DSP-API server running at api.knora.org that can serve the ontology. +The DaSCH intends to run such as server. For +testing, you can configure your local /etc/hosts file to resolve +api.knora.org as localhost.

+

Differences Between Internal and External Ontologies

+

The external ontologies used by DSP-API v2 are different to the internal +ontologies that are actually stored in the triplestore (see +API Schema). In general, the external +ontologies use simpler data structures, but they also provide additional +information to make it easier for clients to use them. This is illustrated +in the examples in the next sections.

+

The internal predicates knora-base:subjectClassConstraint and +knora-base:objectClassConstraint (see +Constraints on the Types of Property Subjects and Objects) +are represented as knora-api:subjectType and knora-api:objectType in +external ontologies.

+

JSON-LD Representation of an Ontology in the Simple Schema

+

The simple schema is suitable for client applications that need to read +but not update data in Knora. For example, here is the response for the +images sample ontology in the simple schema, +http://0.0.0.0:3333/ontology/00FF/images/simple/v2 (simplified for +clarity):

+
{
+  "@id" : "http://0.0.0.0:3333/ontology/00FF/images/simple/v2",
+  "@type" : "owl:Ontology",
+  "rdfs:label" : "The images demo ontology",
+  "@graph" : [ {
+    "@id" : "images:bild",
+    "@type" : "owl:Class",
+    "knora-api:resourceIcon" : "bild.png",
+    "rdfs:comment" : "An image of the demo image collection",
+    "rdfs:label" : "Image",
+    "rdfs:subClassOf" : [ {
+      "@id" : "knora-api:StillImageRepresentation"
+    }, {
+      "@type" : "owl:Restriction",
+      "owl:cardinality" : 1,
+      "owl:onProperty" : {
+        "@id" : "knora-api:creationDate"
+      }
+    }, {
+      "@type" : "owl:Restriction",
+      "owl:minCardinality" : 0,
+      "owl:onProperty" : {
+        "@id" : "knora-api:hasIncomingLink"
+      }
+    }, {
+      "@type" : "owl:Restriction",
+      "owl:minCardinality" : 0,
+      "owl:onProperty" : {
+        "@id" : "knora-api:hasStandoffLinkTo"
+      }
+    }, {
+      "@type" : "owl:Restriction",
+      "owl:minCardinality" : 1,
+      "owl:onProperty" : {
+        "@id" : "knora-api:hasStillImageFile"
+      }
+    }, {
+      "@type" : "owl:Restriction",
+      "owl:maxCardinality" : 1,
+      "owl:onProperty" : {
+        "@id" : "knora-api:lastModificationDate"
+      }
+    }, {
+      "@type" : "owl:Restriction",
+      "owl:cardinality" : 1,
+      "owl:onProperty" : {
+        "@id" : "rdfs:label"
+      }
+    }, {
+      "@type" : "owl:Restriction",
+      "owl:cardinality" : 1,
+      "owl:onProperty" : {
+        "@id" : "images:description"
+      }
+    }, {
+      "@type" : "owl:Restriction",
+      "owl:cardinality" : 1,
+      "owl:onProperty" : {
+        "@id" : "images:erfassungsdatum"
+      }
+    }, {
+      "@type" : "owl:Restriction",
+      "owl:maxCardinality" : 1,
+      "owl:onProperty" : {
+        "@id" : "images:urheber"
+      }
+    } ]
+  }, {
+    "@id" : "images:description",
+    "@type" : "owl:DatatypeProperty",
+    "knora-api:objectType" : {
+      "@id" : "xsd:string"
+    },
+    "knora-api:subjectType" : {
+      "@id" : "images:bild"
+    },
+    "rdfs:label" : "Description",
+    "rdfs:subPropertyOf" : [ {
+      "@id" : "knora-api:hasValue"
+    }, {
+      "@id" : "http://purl.org/dc/terms/description"
+    } ]
+  }, {
+    "@id" : "images:erfassungsdatum",
+    "@type" : "owl:DatatypeProperty",
+    "knora-api:objectType" : {
+      "@id" : "knora-api:Date"
+    },
+    "knora-api:subjectType" : {
+      "@id" : "images:bild"
+    },
+    "rdfs:label" : "Date of acquisition",
+    "rdfs:subPropertyOf" : [ {
+      "@id" : "knora-api:hasValue"
+    }, {
+      "@id" : "http://purl.org/dc/terms/date"
+    } ]
+  }, {
+    "@id" : "images:firstname",
+    "@type" : "owl:DatatypeProperty",
+    "knora-api:objectType" : {
+      "@id" : "xsd:string"
+    },
+    "knora-api:subjectType" : {
+      "@id" : "images:person"
+    },
+    "rdfs:comment" : "First name of a person",
+    "rdfs:label" : "First name",
+    "rdfs:subPropertyOf" : {
+      "@id" : "knora-api:hasValue"
+    }
+  }, {
+    "@id" : "images:lastname",
+    "@type" : "owl:DatatypeProperty",
+    "knora-api:objectType" : {
+      "@id" : "xsd:string"
+    },
+    "knora-api:subjectType" : {
+      "@id" : "images:person"
+    },
+    "rdfs:comment" : "Last name of a person",
+    "rdfs:label" : "Name",
+    "rdfs:subPropertyOf" : {
+      "@id" : "knora-api:hasValue"
+    }
+  }, {
+    "@id" : "images:person",
+    "@type" : "owl:Class",
+    "knora-api:resourceIcon" : "person.png",
+    "rdfs:comment" : "Person",
+    "rdfs:label" : "Person",
+    "rdfs:subClassOf" : [ {
+      "@id" : "knora-api:Resource"
+    }, {
+      "@type" : "owl:Restriction",
+      "owl:cardinality" : 1,
+      "owl:onProperty" : {
+        "@id" : "knora-api:creationDate"
+      }
+    }, {
+      "@type" : "owl:Restriction",
+      "owl:minCardinality" : 0,
+      "owl:onProperty" : {
+        "@id" : "knora-api:hasIncomingLink"
+      }
+    }, {
+      "@type" : "owl:Restriction",
+      "owl:minCardinality" : 0,
+      "owl:onProperty" : {
+        "@id" : "knora-api:hasStandoffLinkTo"
+      }
+    }, {
+      "@type" : "owl:Restriction",
+      "owl:maxCardinality" : 1,
+      "owl:onProperty" : {
+        "@id" : "knora-api:lastModificationDate"
+      }
+    }, {
+      "@type" : "owl:Restriction",
+      "owl:cardinality" : 1,
+      "owl:onProperty" : {
+        "@id" : "rdfs:label"
+      }
+    }, {
+      "@type" : "owl:Restriction",
+      "owl:cardinality" : 1,
+      "owl:onProperty" : {
+        "@id" : "images:lastname"
+      }
+    }, {
+      "@type" : "owl:Restriction",
+      "owl:cardinality" : 1,
+      "owl:onProperty" : {
+        "@id" : "images:firstname"
+      }
+    } ]
+  }, {
+    "@id" : "images:urheber",
+    "@type" : "owl:ObjectProperty",
+    "knora-api:objectType" : {
+      "@id" : "images:person"
+    },
+    "knora-api:subjectType" : {
+      "@id" : "images:bild"
+    },
+    "rdfs:comment" : "An entity primarily responsible for making the resource. Examples of a Creator include a person, an organization, or a service. Typically, the name of a Creator should be used to indicate the entity.",
+    "rdfs:label" : "Creator",
+    "rdfs:subPropertyOf" : {
+      "@id" : "knora-api:hasLinkTo"
+    }
+  } ],
+  "@context" : {
+    "rdf" : "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
+    "images" : "http://0.0.0.0:3333/ontology/00FF/images/simple/v2#",
+    "knora-api" : "http://api.knora.org/ontology/knora-api/simple/v2#",
+    "owl" : "http://www.w3.org/2002/07/owl#",
+    "rdfs" : "http://www.w3.org/2000/01/rdf-schema#",
+    "xsd" : "http://www.w3.org/2001/XMLSchema#"
+  }
+}
+
+

The response format is an RDF graph. The top level object describes the ontology +itself, providing its IRI (in the @id member) and its rdfs:label. +The @graph member (see +Named Graphs in the +JSON-LD specification) contains an array of entities that belong to the +ontology.

+

In a class definition, cardinalities for properties of the class are +represented as in OWL, using objects of type owl:Restriction. The +supported cardinalities are the ones indicated in +OWL Cardinalities.

+

The class definitions include cardinalities that are directly defined on +each class, as well as cardinalities inherited from base classes. For +example, we can see cardinalities inherited from knora-api:Resource, +such as knora-api:hasStandoffLinkTo and http://schema.org/name +(which represents rdfs:label).

+

In the simple schema, Knora value properties can be datatype properties. +The knora-base:objectType of a Knora value property such as +images:description is a literal datatype, in this case +xsd:string. Moreover, images:description is a subproperty of +the standard property dcterms:description, whose object can be a +literal value. A client that understands rdfs:subPropertyOf, and is +familiar with dcterms:description, can then work with +images:description on the basis of its knowledge about +dcterms:description.

+

By default, values for rdfs:label and rdfs:comment are returned only +in the user's preferred language, or in the system default language. To +obtain these values in all available languages, add the URL parameter +?allLanguages=true. For example, with this parameter, the definition +of images:description becomes:

+
{
+  "@id" : "images:description",
+  "@type" : "owl:DatatypeProperty",
+  "knora-api:objectType" : {
+    "@id" : "xsd:string"
+  },
+  "knora-api:subjectType" : {
+    "@id" : "images:bild"
+  },
+  "rdfs:label" : [ {
+    "@language" : "en",
+    "@value" : "Description"
+  }, {
+    "@language" : "de",
+    "@value" : "Beschreibung"
+  }, {
+    "@language" : "fr",
+    "@value" : "Description"
+  }, {
+    "@language" : "it",
+    "@value" : "Descrizione"
+  } ],
+  "rdfs:subPropertyOf" : [ {
+    "@id" : "knora-api:hasValue"
+  }, {
+    "@id" : "http://purl.org/dc/terms/description"
+  } ]
+}
+
+

To find out more about the knora-api entities used in the response, +the client can request the knora-api ontology in the simple schema: +http://api.knora.org/ontology/knora-api/simple/v2. For example, +images:erfassungsdatum has a knora-api:objectType of +knora-api:Date, which is a subtype of xsd:string with a +Knora-specific, human-readable format. In the knora-api simple +ontology, there is a definition of this type:

+
{
+  "@id" : "http://api.knora.org/ontology/knora-api/simple/v2",
+  "@type" : "owl:Ontology",
+  "rdfs:label" : "The knora-api ontology in the simple schema",
+  "@graph" : [ {
+    "@id" : "knora-api:Date",
+    "@type" : "rdfs:Datatype",
+    "rdfs:comment" : "Represents a date as a period with different possible precisions.",
+    "rdfs:label" : "Date literal",
+    "rdfs:subClassOf" : {
+      "@type" : "rdfs:Datatype",
+      "owl:onDatatype" : {
+        "@id" : "xsd:string"
+      },
+      "owl:withRestrictions" : {
+        "xsd:pattern" : "(GREGORIAN|JULIAN|ISLAMIC):\\d{1,4}(-\\d{1,2}(-\\d{1,2})?)?( BC| AD| BCE| CE)?(:\\d{1,4}(-\\d{1,2}(-\\d{1,2})?)?( BC| AD| BCE| CE)?)?"
+      }
+    }
+  } ],
+  "@context" : {
+    "rdf" : "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
+    "knora-api" : "http://api.knora.org/ontology/knora-api/simple/v2#",
+    "owl" : "http://www.w3.org/2002/07/owl#",
+    "rdfs" : "http://www.w3.org/2000/01/rdf-schema#",
+    "xsd" : "http://www.w3.org/2001/XMLSchema#"
+  }
+}
+
+

JSON-LD Representation of an Ontology in the Complex Schema

+

The complex schema is suitable for client applications that need to +update data in Knora. For example, here is the response for the images +sample ontology in the complex schema, http://0.0.0.0:3333/ontology/00FF/images/v2 +(simplified for clarity):

+
{
+  "@id" : "http://0.0.0.0:3333/ontology/00FF/images/v2",
+  "@type" : "owl:Ontology",
+  "knora-api:attachedToProject" : {
+    "@id" : "http://rdfh.ch/projects/00FF"
+  },
+  "rdfs:label" : "The images demo ontology",
+  "@graph" : [ {
+    "@id" : "images:bild",
+    "@type" : "owl:Class",
+    "knora-api:canBeInstantiated" : true,
+    "knora-api:isResourceClass" : true,
+    "knora-api:resourceIcon" : "bild.png",
+    "rdfs:comment" : "An image of the demo image collection",
+    "rdfs:label" : "Image",
+    "rdfs:subClassOf" : [ {
+      "@id" : "knora-api:StillImageRepresentation"
+    }, {
+      "@type" : "owl:Restriction",
+      "knora-api:isInherited" : true,
+      "owl:cardinality" : 1,
+      "owl:onProperty" : {
+        "@id" : "knora-api:attachedToProject"
+      }
+    }, {
+      "@type" : "owl:Restriction",
+      "knora-api:isInherited" : true,
+      "owl:cardinality" : 1,
+      "owl:onProperty" : {
+        "@id" : "knora-api:attachedToUser"
+      }
+    }, {
+      "@type" : "owl:Restriction",
+      "knora-api:isInherited" : true,
+      "owl:cardinality" : 1,
+      "owl:onProperty" : {
+        "@id" : "knora-api:creationDate"
+      }
+    }, {
+      "@type" : "owl:Restriction",
+      "knora-api:isInherited" : true,
+      "owl:minCardinality" : 0,
+      "owl:onProperty" : {
+        "@id" : "knora-api:hasIncomingLink"
+      }
+    }, {
+      "@type" : "owl:Restriction",
+      "knora-api:isInherited" : true,
+      "owl:cardinality" : 1,
+      "owl:onProperty" : {
+        "@id" : "knora-api:hasPermissions"
+      }
+    }, {
+      "@type" : "owl:Restriction",
+      "knora-api:isInherited" : true,
+      "owl:minCardinality" : 0,
+      "owl:onProperty" : {
+        "@id" : "knora-api:hasStandoffLinkTo"
+      }
+    }, {
+      "@type" : "owl:Restriction",
+      "knora-api:isInherited" : true,
+      "owl:minCardinality" : 0,
+      "owl:onProperty" : {
+        "@id" : "knora-api:hasStandoffLinkToValue"
+      }
+    }, {
+      "@type" : "owl:Restriction",
+      "knora-api:isInherited" : true,
+      "owl:minCardinality" : 1,
+      "owl:onProperty" : {
+        "@id" : "knora-api:hasStillImageFileValue"
+      }
+    }, {
+      "@type" : "owl:Restriction",
+      "knora-api:isInherited" : true,
+      "owl:maxCardinality" : 1,
+      "owl:onProperty" : {
+        "@id" : "knora-api:lastModificationDate"
+      }
+    }, {
+      "@type" : "owl:Restriction",
+      "knora-api:isInherited" : true,
+      "owl:cardinality" : 1,
+      "owl:onProperty" : {
+        "@id" : "rdfs:label"
+      }
+    }, {
+      "@type" : "owl:Restriction",
+      "salsah-gui:guiOrder" : 3,
+      "owl:cardinality" : 1,
+      "owl:onProperty" : {
+        "@id" : "images:description"
+      }
+    }, {
+      "@type" : "owl:Restriction",
+      "salsah-gui:guiOrder" : 8,
+      "owl:cardinality" : 1,
+      "owl:onProperty" : {
+        "@id" : "images:erfassungsdatum"
+      }
+    }, {
+      "@type" : "owl:Restriction",
+      "salsah-gui:guiOrder" : 12,
+      "owl:maxCardinality" : 1,
+      "owl:onProperty" : {
+        "@id" : "images:urheber"
+      }
+    }, {
+      "@type" : "owl:Restriction",
+      "salsah-gui:guiOrder" : 12,
+      "owl:maxCardinality" : 1,
+      "owl:onProperty" : {
+        "@id" : "images:urheberValue"
+      }
+    } ]
+  }, {
+    "@id" : "images:description",
+    "@type" : "owl:ObjectProperty",
+    "knora-api:isEditable" : true,
+    "knora-api:isResourceProperty" : true,
+    "knora-api:objectType" : {
+      "@id" : "knora-api:TextValue"
+    },
+    "knora-api:subjectType" : {
+      "@id" : "images:bild"
+    },
+    "salsah-gui:guiAttribute" : [ "rows=10", "width=95%", "wrap=soft" ],
+    "salsah-gui:guiElement" : {
+      "@id" : "salsah-gui:Textarea"
+    },
+    "rdfs:label" : "Description",
+    "rdfs:subPropertyOf" : [ {
+      "@id" : "knora-api:hasValue"
+    }, {
+      "@id" : "http://purl.org/dc/terms/description"
+    } ]
+  }, {
+    "@id" : "images:erfassungsdatum",
+    "@type" : "owl:ObjectProperty",
+    "knora-api:isEditable" : true,
+    "knora-api:isResourceProperty" : true,
+    "knora-api:objectType" : {
+      "@id" : "knora-api:DateValue"
+    },
+    "knora-api:subjectType" : {
+      "@id" : "images:bild"
+    },
+    "salsah-gui:guiElement" : {
+      "@id" : "salsah-gui:Date"
+    },
+    "rdfs:label" : "Date of acquisition",
+    "rdfs:subPropertyOf" : [ {
+      "@id" : "knora-api:hasValue"
+    }, {
+      "@id" : "http://purl.org/dc/terms/date"
+    } ]
+  }, {
+    "@id" : "images:firstname",
+    "@type" : "owl:ObjectProperty",
+    "knora-api:isEditable" : true,
+    "knora-api:isResourceProperty" : true,
+    "knora-api:objectType" : {
+      "@id" : "knora-api:TextValue"
+    },
+    "knora-api:subjectType" : {
+      "@id" : "images:person"
+    },
+    "salsah-gui:guiAttribute" : [ "maxlength=32", "size=32" ],
+    "salsah-gui:guiElement" : {
+      "@id" : "salsah-gui:SimpleText"
+    },
+    "rdfs:comment" : "First name of a person",
+    "rdfs:label" : "First name",
+    "rdfs:subPropertyOf" : {
+      "@id" : "knora-api:hasValue"
+    }
+  }, {
+    "@id" : "images:lastname",
+    "@type" : "owl:ObjectProperty",
+    "knora-api:isEditable" : true,
+    "knora-api:isResourceProperty" : true,
+    "knora-api:objectType" : {
+      "@id" : "knora-api:TextValue"
+    },
+    "knora-api:subjectType" : {
+      "@id" : "images:person"
+    },
+    "salsah-gui:guiAttribute" : [ "maxlength=32", "size=32" ],
+    "salsah-gui:guiElement" : {
+      "@id" : "salsah-gui:SimpleText"
+    },
+    "rdfs:comment" : "Last name of a person",
+    "rdfs:label" : "Name",
+    "rdfs:subPropertyOf" : {
+      "@id" : "knora-api:hasValue"
+    }
+  }, {
+    "@id" : "images:person",
+    "@type" : "owl:Class",
+    "knora-api:canBeInstantiated" : true,
+    "knora-api:isResourceClass" : true,
+    "knora-api:resourceIcon" : "person.png",
+    "rdfs:comment" : "Person",
+    "rdfs:label" : "Person",
+    "rdfs:subClassOf" : [ {
+      "@id" : "knora-api:Resource"
+    }, {
+      "@type" : "owl:Restriction",
+      "knora-api:isInherited" : true,
+      "owl:cardinality" : 1,
+      "owl:onProperty" : {
+        "@id" : "knora-api:attachedToProject"
+      }
+    }, {
+      "@type" : "owl:Restriction",
+      "knora-api:isInherited" : true,
+      "owl:cardinality" : 1,
+      "owl:onProperty" : {
+        "@id" : "knora-api:attachedToUser"
+      }
+    }, {
+      "@type" : "owl:Restriction",
+      "knora-api:isInherited" : true,
+      "owl:cardinality" : 1,
+      "owl:onProperty" : {
+        "@id" : "knora-api:creationDate"
+      }
+    }, {
+      "@type" : "owl:Restriction",
+      "knora-api:isInherited" : true,
+      "owl:minCardinality" : 0,
+      "owl:onProperty" : {
+        "@id" : "knora-api:hasIncomingLink"
+      }
+    }, {
+      "@type" : "owl:Restriction",
+      "knora-api:isInherited" : true,
+      "owl:cardinality" : 1,
+      "owl:onProperty" : {
+        "@id" : "knora-api:hasPermissions"
+      }
+    }, {
+      "@type" : "owl:Restriction",
+      "knora-api:isInherited" : true,
+      "owl:minCardinality" : 0,
+      "owl:onProperty" : {
+        "@id" : "knora-api:hasStandoffLinkTo"
+      }
+    }, {
+      "@type" : "owl:Restriction",
+      "knora-api:isInherited" : true,
+      "owl:minCardinality" : 0,
+      "owl:onProperty" : {
+        "@id" : "knora-api:hasStandoffLinkToValue"
+      }
+    }, {
+      "@type" : "owl:Restriction",
+      "knora-api:isInherited" : true,
+      "owl:maxCardinality" : 1,
+      "owl:onProperty" : {
+        "@id" : "knora-api:lastModificationDate"
+      }
+    }, {
+      "@type" : "owl:Restriction",
+      "knora-api:isInherited" : true,
+      "owl:cardinality" : 1,
+      "owl:onProperty" : {
+        "@id" : "rdfs:label"
+      }
+    }, {
+      "@type" : "owl:Restriction",
+      "salsah-gui:guiOrder" : 0,
+      "owl:cardinality" : 1,
+      "owl:onProperty" : {
+        "@id" : "images:lastname"
+      }
+    }, {
+      "@type" : "owl:Restriction",
+      "salsah-gui:guiOrder" : 1,
+      "owl:cardinality" : 1,
+      "owl:onProperty" : {
+        "@id" : "images:firstname"
+      }
+    } ]
+  }, {
+    "@id" : "images:urheber",
+    "@type" : "owl:ObjectProperty",
+    "knora-api:isEditable" : true,
+    "knora-api:isLinkProperty" : true,
+    "knora-api:isResourceProperty" : true,
+    "knora-api:objectType" : {
+      "@id" : "images:person"
+    },
+    "knora-api:subjectType" : {
+      "@id" : "images:bild"
+    },
+    "salsah-gui:guiAttribute" : "numprops=2",
+    "salsah-gui:guiElement" : {
+      "@id" : "salsah-gui:Searchbox"
+    },
+    "rdfs:comment" : "An entity primarily responsible for making the resource. Examples of a Creator include a person, an organization, or a service. Typically, the name of a Creator should be used to indicate the entity.",
+    "rdfs:label" : "Creator",
+    "rdfs:subPropertyOf" : {
+      "@id" : "knora-api:hasLinkTo"
+    }
+  }, {
+    "@id" : "images:urheberValue",
+    "@type" : "owl:ObjectProperty",
+    "knora-api:isEditable" : true,
+    "knora-api:isLinkValueProperty" : true,
+    "knora-api:isResourceProperty" : true,
+    "knora-api:objectType" : {
+      "@id" : "knora-api:LinkValue"
+    },
+    "knora-api:subjectType" : {
+      "@id" : "images:bild"
+    },
+    "salsah-gui:guiAttribute" : "numprops=2",
+    "salsah-gui:guiElement" : {
+      "@id" : "salsah-gui:Searchbox"
+    },
+    "rdfs:comment" : "An entity primarily responsible for making the resource. Examples of a Creator include a person, an organization, or a service. Typically, the name of a Creator should be used to indicate the entity.",
+    "rdfs:label" : "Creator",
+    "rdfs:subPropertyOf" : {
+      "@id" : "knora-api:hasLinkToValue"
+    }
+  } ],
+  "@context" : {
+    "rdf" : "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
+    "images" : "http://0.0.0.0:3333/ontology/00FF/images/v2#",
+    "knora-api" : "http://api.knora.org/ontology/knora-api/v2#",
+    "owl" : "http://www.w3.org/2002/07/owl#",
+    "salsah-gui" : "http://api.knora.org/ontology/salsah-gui/v2#",
+    "rdfs" : "http://www.w3.org/2000/01/rdf-schema#",
+    "xsd" : "http://www.w3.org/2001/XMLSchema#"
+  }
+}
+
+

In the complex schema, all Knora value properties are object properties, +whose objects are IRIs, each of which uniquely identifies a value that +contains metadata and can potentially be edited. The +knora-base:objectType of a Knora value property such as +images:description is a Knora value class, in this case +knora-api:TextValue. Similarly, images:erfassungsdatum has a +knora-api:objectType of knora-api:DateValue, which has a more +complex structure than the knora-api:Date datatype shown in the +previous section. A client can find out more about these value classes +by requesting the knora-api ontology in the complex schema, +http://api.knora.org/ontology/knora-api/v2.

+

Moreover, additional information is provided in the complex schema, to +help clients that wish to create or update resources and values. A Knora +resource class that can be instantiated is identified with the boolean +properties knora-api:isResourceClass and +knora-api:canBeInstantiated, to distinguish it from built-in abstract +classes. Knora resource properties whose values can be edited by clients +are identified with knora-api:isResourceProperty and +knora-api:isEditable, to distinguish them from properties whose values +are maintained automatically by Knora. Link value +properties are shown along with link properties, because a client that +updates links will need the IRIs of their link values. The predicate +salsah-gui:guiOrder tells a GUI client in what order to display the +properties of a class, and the predicates salsah-gui:guiElement and +salsah-gui:guiAttribute specify how to configure a GUI element for +editing the value of a property. For more information on the +salsah-gui ontology, see The SALSAH GUI Ontology.

+

Querying class definition

+

To get the definition of a class, use the following route:

+
HTTP GET to http://host/v2/ontologies/classes/CLASS_IRI
+
+

Sample response:

+
{
+    "knora-api:lastModificationDate": {
+        "@value": "2023-01-09T15:39:48.548298041Z",
+        "@type": "xsd:dateTimeStamp"
+    },
+    "rdfs:label": "The anything ontology",
+    "@graph": [
+        {
+            "knora-api:isResourceClass": true,
+            "rdfs:label": "Institution",
+            "knora-api:canBeInstantiated": true,
+            "rdfs:subClassOf": [
+                {
+                    "@id": "knora-api:Resource"
+                },
+                {
+                    "@type": "owl:Restriction",
+                    "owl:onProperty": {
+                        "@id": "knora-api:arkUrl"
+                    },
+                    "owl:cardinality": 1,
+                    "knora-api:isInherited": true
+                },
+                {
+                    "@type": "owl:Restriction",
+                    "owl:onProperty": {
+                        "@id": "knora-api:attachedToProject"
+                    },
+                    "owl:cardinality": 1,
+                    "knora-api:isInherited": true
+                },
+                {
+                    "@type": "owl:Restriction",
+                    "owl:onProperty": {
+                        "@id": "knora-api:attachedToUser"
+                    },
+                    "owl:cardinality": 1,
+                    "knora-api:isInherited": true
+                },
+                {
+                    "@type": "owl:Restriction",
+                    "owl:onProperty": {
+                        "@id": "knora-api:creationDate"
+                    },
+                    "owl:cardinality": 1,
+                    "knora-api:isInherited": true
+                },
+                {
+                    "@type": "owl:Restriction",
+                    "owl:onProperty": {
+                        "@id": "knora-api:deleteComment"
+                    },
+                    "owl:maxCardinality": 1,
+                    "knora-api:isInherited": true
+                },
+                {
+                    "@type": "owl:Restriction",
+                    "owl:onProperty": {
+                        "@id": "knora-api:deleteDate"
+                    },
+                    "owl:maxCardinality": 1,
+                    "knora-api:isInherited": true
+                },
+                {
+                    "@type": "owl:Restriction",
+                    "owl:onProperty": {
+                        "@id": "knora-api:deletedBy"
+                    },
+                    "owl:maxCardinality": 1,
+                    "knora-api:isInherited": true
+                },
+                {
+                    "@type": "owl:Restriction",
+                    "owl:onProperty": {
+                        "@id": "knora-api:hasIncomingLinkValue"
+                    },
+                    "owl:minCardinality": 0,
+                    "knora-api:isInherited": true
+                },
+                {
+                    "@type": "owl:Restriction",
+                    "owl:onProperty": {
+                        "@id": "knora-api:hasPermissions"
+                    },
+                    "owl:cardinality": 1,
+                    "knora-api:isInherited": true
+                },
+                {
+                    "@type": "owl:Restriction",
+                    "owl:onProperty": {
+                        "@id": "knora-api:hasStandoffLinkTo"
+                    },
+                    "owl:minCardinality": 0,
+                    "knora-api:isInherited": true
+                },
+                {
+                    "@type": "owl:Restriction",
+                    "owl:onProperty": {
+                        "@id": "knora-api:hasStandoffLinkToValue"
+                    },
+                    "owl:minCardinality": 0,
+                    "knora-api:isInherited": true
+                },
+                {
+                    "@type": "owl:Restriction",
+                    "owl:onProperty": {
+                        "@id": "knora-api:isDeleted"
+                    },
+                    "owl:maxCardinality": 1,
+                    "knora-api:isInherited": true
+                },
+                {
+                    "@type": "owl:Restriction",
+                    "owl:onProperty": {
+                        "@id": "knora-api:lastModificationDate"
+                    },
+                    "owl:maxCardinality": 1,
+                    "knora-api:isInherited": true
+                },
+                {
+                    "@type": "owl:Restriction",
+                    "owl:onProperty": {
+                        "@id": "knora-api:userHasPermission"
+                    },
+                    "owl:cardinality": 1,
+                    "knora-api:isInherited": true
+                },
+                {
+                    "@type": "owl:Restriction",
+                    "owl:onProperty": {
+                        "@id": "knora-api:versionArkUrl"
+                    },
+                    "owl:cardinality": 1,
+                    "knora-api:isInherited": true
+                },
+                {
+                    "@type": "owl:Restriction",
+                    "owl:onProperty": {
+                        "@id": "knora-api:versionDate"
+                    },
+                    "owl:maxCardinality": 1,
+                    "knora-api:isInherited": true
+                },
+                {
+                    "@type": "owl:Restriction",
+                    "owl:onProperty": {
+                        "@id": "rdfs:label"
+                    },
+                    "owl:cardinality": 1,
+                    "knora-api:isInherited": true
+                },
+                {
+                    "@type": "owl:Restriction",
+                    "owl:onProperty": {
+                        "@id": "anything:hasName"
+                    },
+                    "owl:cardinality": 1,
+                    "salsah-gui:guiOrder": 1
+                },
+                {
+                    "@type": "owl:Restriction",
+                    "owl:onProperty": {
+                        "@id": "anything:hasLocation"
+                    },
+                    "owl:cardinality": 1,
+                    "salsah-gui:guiOrder": 2
+                }
+            ],
+            "rdfs:comment": "some comment",
+            "@type": "owl:Class",
+            "@id": "anything:Institution"
+        }
+    ],
+    "knora-api:attachedToProject": {
+        "@id": "http://rdfh.ch/projects/0001"
+    },
+    "@type": "owl:Ontology",
+    "@id": "http://0.0.0.0:3333/ontology/0001/anything/v2",
+    "@context": {
+        "rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
+        "knora-api": "http://api.knora.org/ontology/knora-api/v2#",
+        "anything": "http://0.0.0.0:3333/ontology/0001/anything/v2#",
+        "owl": "http://www.w3.org/2002/07/owl#",
+        "salsah-gui": "http://api.knora.org/ontology/salsah-gui/v2#",
+        "rdfs": "http://www.w3.org/2000/01/rdf-schema#",
+        "xsd": "http://www.w3.org/2001/XMLSchema#"
+    }
+}
+
+

Ontology Updates

+

The ontology update API must ensure that the ontologies it creates are +valid and consistent, and that existing data is not invalidated by a +change to an ontology. To make this easier to enforce, the ontology +update API allows only one entity to be created or modified at a time. +It is not possible to submit an entire ontology all at once. Each +update request is a JSON-LD document providing only the information that is +relevant to the update.

+

Moreover, the API enforces the following rules:

+
    +
  • An entity (i.e. a class or property) cannot be referred to until it has been created.
  • +
  • An entity cannot be modified or deleted if it is used in data, + except for changes to its rdfs:label or rdfs:comment.
  • +
  • An entity cannot be modified if another entity refers to it, with + one exception: a knora-api:subjectType or knora-api:objectType + that refers to a class will not prevent the class's cardinalities + from being modified.
  • +
+

Because of these rules, some operations have to be done in a specific +order:

+
    +
  • Properties have to be defined before they can be used in the + cardinalities of a class, but a property's knora-api:subjectType + cannot refer to a class that does not yet exist. The recommended + approach is to first create a class with no cardinalities, then + create the properties that it needs, then add cardinalities for + those properties to the class.
  • +
  • To delete a class along with its properties, the client must first + remove the cardinalities from the class, then delete the property + definitions, then delete the class definition.
  • +
+

When changing an existing ontology, the client must always supply the +ontology's knora-api:lastModificationDate, which is returned in the +response to each update or when querying the ontology. +If user A attempts to update an ontology, but +user B has already updated it since the last time user A received the +ontology's knora-api:lastModificationDate, user A's update will be +rejected with an HTTP 409 Conflict error. This means that it is possible +for two different users to work concurrently on the same ontology, but +this is discouraged since it is likely to lead to confusion.

+

An ontology can be created or updated only by a system administrator, or +by a project administrator in the ontology's project.

+

Ontology updates always use the complex schema.

+

Creating a New Ontology

+

An ontology is always created within a particular project.

+
HTTP POST to http://host/v2/ontologies
+
+
{
+  "knora-api:ontologyName" : "ONTOLOGY_NAME",
+  "knora-api:attachedToProject" : {
+    "@id" : "PROJECT_IRI"
+  },
+  "rdfs:label" : "ONTOLOGY_NAME",
+  "@context" : {
+    "rdfs" : "http://www.w3.org/2000/01/rdf-schema#",
+    "knora-api" : "http://api.knora.org/ontology/knora-api/v2#"
+  }
+}
+
+

The ontology name must follow the rules given in +Knora IRIs.

+

The ontology metadata can have an optional comment given in the request +body as:

+
"rdfs:comment": "some comment",
+
+

If the ontology is to be shared by multiple projects, it must be +created in the default shared ontologies project, +http://www.knora.org/ontology/knora-base#DefaultSharedOntologiesProject, +and the request must have this additional boolean property:

+
"knora-api:isShared" : true
+
+

See Shared Ontologies for details about +shared ontologies.

+

A successful response will be a JSON-LD document providing only the +ontology's metadata, which includes the ontology's IRI. When the client +makes further requests to create entities (classes and properties) in +the ontology, it must construct entity IRIs by concatenating the +ontology IRI, a # character, and the entity name. An entity name must +be a valid XML NCName.

+

Changing an Ontology's Metadata

+

One can modify an ontology's metadata by updating its rdfs:label or rdfs:comment +or both. The example below shows the request for changing the label of an ontology.

+
HTTP PUT to http://host/v2/ontologies/metadata
+
+
{
+  "@id" : "ONTOLOGY_IRI",
+  "rdfs:label" : "NEW_ONTOLOGY_LABEL",
+  "knora-api:lastModificationDate" : {
+    "@type" : "xsd:dateTimeStamp",
+    "@value" : "ONTOLOGY_LAST_MODIFICATION_DATE"
+  },
+  "@context" : {
+    "xsd" : "http://www.w3.org/2001/XMLSchema#",
+    "rdfs" : "http://www.w3.org/2000/01/rdf-schema#",
+    "knora-api" : "http://api.knora.org/ontology/knora-api/v2#"
+  }
+}
+
+

Similarly, a user can change an ontology's existing comment or add one by specifying +the new comment in the request body:

+
{
+  "@id" : "ONTOLOGY_IRI",
+  "rdfs:comment" : "NEW_ONTOLOGY_COMMENT",
+  "knora-api:lastModificationDate" : {
+    "@type" : "xsd:dateTimeStamp",
+    "@value" : "ONTOLOGY_LAST_MODIFICATION_DATE"
+  },
+  "@context" : {
+    "xsd" : "http://www.w3.org/2001/XMLSchema#",
+    "rdfs" : "http://www.w3.org/2000/01/rdf-schema#",
+    "knora-api" : "http://api.knora.org/ontology/knora-api/v2#"
+  }
+}
+
+

The request body can also contain a new label and a new comment for the ontology's metadata. +A successful response will be a JSON-LD document providing only the +ontology's metadata.

+

Deleting an Ontology's comment

+
HTTP DELETE to http://host/v2/ontologies/comment/ONTOLOGY_IRI?lastModificationDate=ONTOLOGY_LAST_MODIFICATION_DATE
+
+

The ontology IRI and the ontology's last modification date must be +URL-encoded.

+

A successful response will be a JSON-LD document containing the ontology's +updated metadata.

+

Deleting an Ontology

+

An ontology can be deleted only if it is not used in data.

+
HTTP DELETE to http://host/v2/ontologies/ONTOLOGY_IRI?lastModificationDate=ONTOLOGY_LAST_MODIFICATION_DATE
+
+

The ontology IRI and the ontology's last modification date must be +URL-encoded.

+

A successful response will be a JSON-LD document containing a +confirmation message.

+

To check whether an ontology can be deleted:

+
HTTP GET to http://host/v2/ontologies/candeleteontology/ONTOLOGY_IRI
+
+

The response will look like this:

+
{
+    "knora-api:canDo": false,
+    "@context": {
+        "knora-api": "http://api.knora.org/ontology/knora-api/v2#"
+    }
+}
+
+

Creating a Class Without Cardinalities

+
HTTP POST to http://host/v2/ontologies/classes
+
+
{
+  "@id" : "ONTOLOGY_IRI",
+  "@type" : "owl:Ontology",
+  "knora-api:lastModificationDate" : {
+    "@type" : "xsd:dateTimeStamp",
+    "@value" : "ONTOLOGY_LAST_MODIFICATION_DATE"
+  },
+  "@graph" : [
+    {
+      "@id" : "CLASS_IRI",
+      "@type" : "owl:Class",
+      "rdfs:label" : {
+        "@language" : "LANGUAGE_CODE",
+        "@value" : "LABEL"
+      },
+      "rdfs:comment" : {
+        "@language" : "LANGUAGE_CODE",
+        "@value" : "COMMENT"
+      },
+      "rdfs:subClassOf" : {
+        "@id" : "BASE_CLASS_IRI"
+      }
+    }
+  ],
+  "@context" : {
+    "knora-api" : "http://api.knora.org/ontology/knora-api/v2#",
+    "owl" : "http://www.w3.org/2002/07/owl#",
+    "rdfs" : "http://www.w3.org/2000/01/rdf-schema#",
+    "xsd" : "http://www.w3.org/2001/XMLSchema#"
+  }
+}
+
+

Values for rdfs:label must be submitted in at least +one language, either as an object or as an array of objects.

+

Values for rdfs:comment are optional, but if they are provided, they must include a language code.

+

At least one base class must be provided, which can be +knora-api:Resource or any of its subclasses.

+

A successful response will be a JSON-LD document providing the new class +definition (but not any of the other entities in the ontology).

+

Creating a Class With Cardinalities

+

This can work if the new class will have cardinalities for properties +that have no knora-api:subjectType, or if the new class will be a +subclass of their knora-api:subjectType.

+
HTTP POST to http://host/v2/ontologies/classes
+
+
{
+  "@id" : "ONTOLOGY_IRI",
+  "@type" : "owl:Ontology",
+  "knora-api:lastModificationDate" : {
+    "@type" : "xsd:dateTimeStamp",
+    "@value" : "ONTOLOGY_LAST_MODIFICATION_DATE"
+  },
+  "@graph" : [
+    {
+      "@id" : "CLASS_IRI",
+      "@type" : "owl:Class",
+      "rdfs:label" : {
+        "@language" : "LANGUAGE_CODE",
+        "@value" : "LABEL"
+      },
+      "rdfs:comment" : {
+        "@language" : "LANGUAGE_CODE",
+        "@value" : "COMMENT"
+      },
+      "rdfs:subClassOf" : [ {
+        "@id" : "BASE_CLASS_IRI"
+      }, {
+        "@type": "owl:Restriction",
+        "OWL_CARDINALITY_PREDICATE": "OWL_CARDINALITY_VALUE",
+        "owl:onProperty": {
+          "@id" : "PROPERTY_IRI"
+        }
+      } ]
+    }
+  ],
+  "@context" : {
+    "knora-api" : "http://api.knora.org/ontology/knora-api/v2#",
+    "owl" : "http://www.w3.org/2002/07/owl#",
+    "rdfs" : "http://www.w3.org/2000/01/rdf-schema#",
+    "xsd" : "http://www.w3.org/2001/XMLSchema#"
+  }
+}
+
+

OWL_CARDINALITY_PREDICATE and OWL_CARDINALITY_VALUE must correspond +to the supported combinations given in +OWL Cardinalities. (The placeholder +OWL_CARDINALITY_VALUE is shown here in quotes, but it should be an +unquoted integer.)

+

Values for rdfs:label must be submitted in at least +one language, either as an object or as an array of objects.

+

Values for rdfs:comment are optional, but if they are provided, they must include a language code.

+

At least one base class must be provided.

+

When a cardinality on a link property is submitted, an identical cardinality +on the corresponding link value property is automatically added (see +Links Between Resources).

+

A successful response will be a JSON-LD document providing the new class +definition (but not any of the other entities in the ontology).

+

Changing the Labels of a Class

+

This operation is permitted even if the class is used in data.

+
HTTP PUT to http://host/v2/ontologies/classes
+
+
{
+  "@id" : "ONTOLOGY_IRI",
+  "@type" : "owl:Ontology",
+  "knora-api:lastModificationDate" : {
+    "@type" : "xsd:dateTimeStamp",
+    "@value" : "ONTOLOGY_LAST_MODIFICATION_DATE"
+  },
+  "@graph" : [
+    {
+      "@id" : "CLASS_IRI",
+      "@type" : "owl:Class",
+      "rdfs:label" : {
+        "@language" : "LANGUAGE_CODE",
+        "@value" : "LABEL"
+      }
+    }
+  ],
+  "@context" : {
+    "knora-api" : "http://api.knora.org/ontology/knora-api/v2#",
+    "owl" : "http://www.w3.org/2002/07/owl#",
+    "rdfs" : "http://www.w3.org/2000/01/rdf-schema#",
+    "xsd" : "http://www.w3.org/2001/XMLSchema#"
+  }
+}
+
+

Values for rdfs:label must be submitted in at least one language, +either as an object or as an array of objects. The submitted labels will +replace the existing ones.

+

To get the current labels use the class definition.

+

Changing the Comments of a Class

+

This operation is permitted even if the class is used in data.

+
HTTP PUT to http://host/v2/ontologies/classes
+
+
{
+  "@id" : "ONTOLOGY_IRI",
+  "@type" : "owl:Ontology",
+  "knora-api:lastModificationDate" : {
+    "@type" : "xsd:dateTimeStamp",
+    "@value" : "ONTOLOGY_LAST_MODIFICATION_DATE"
+  },
+  "@graph" : [
+    {
+      "@id" : "CLASS_IRI",
+      "@type" : "owl:Class",
+      "rdfs:comment" : {
+        "@language" : "LANGUAGE_CODE",
+        "@value" : "COMMENT"
+      }
+    }
+  ],
+  "@context" : {
+    "rdf" : "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
+    "knora-api" : "http://api.knora.org/ontology/knora-api/v2#",
+    "owl" : "http://www.w3.org/2002/07/owl#",
+    "rdfs" : "http://www.w3.org/2000/01/rdf-schema#",
+    "xsd" : "http://www.w3.org/2001/XMLSchema#"
+  }
+}
+
+

Values for rdfs:comment must be submitted in at least one language, +either as an object or as an array of objects. The submitted comments +will replace the existing ones.

+

To get the current comments use the class definition.

+

Deleting the Comments of a Class

+

This operation is permitted even if the class is used in data.

+
HTTP DELETE to http://host/v2/ontologies/classes/comment/CLASS_IRI?lastModificationDate=ONTOLOGY_LAST_MODIFICATION_DATE
+
+

The class IRI and the ontology's last modification date must be URL-encoded.

+

All values i.e. all languages for rdfs:comment are deleted.

+

A successful response will be a JSON-LD document providing the class definition.

+

Creating a Property

+
HTTP POST to http://host/v2/ontologies/properties
+
+
{
+  "@id" : "ONTOLOGY_IRI",
+  "@type" : "owl:Ontology",
+  "knora-api:lastModificationDate" : {
+    "@type" : "xsd:dateTimeStamp",
+    "@value" : "ONTOLOGY_LAST_MODIFICATION_DATE"
+  },
+  "@graph" : [
+    {
+      "@id" : "PROPERTY_IRI",
+      "@type" : "owl:ObjectProperty",
+      "knora-api:subjectType" : {
+        "@id" : "SUBJECT_TYPE"
+      },
+      "knora-api:objectType" : {
+        "@id" : "OBJECT_TYPE"
+      },
+      "rdfs:label" : {
+        "@language" : "LANGUAGE_CODE",
+        "@value" : "LABEL"
+      },
+      "rdfs:comment" : {
+        "@language" : "LANGUAGE_CODE",
+        "@value" : "COMMENT"
+      },
+      "rdfs:subPropertyOf" : {
+        "@id" : "BASE_PROPERTY_IRI"
+      },
+      "salsah-gui:guiElement" : {
+        "@id" : "GUI_ELEMENT_IRI"
+      },
+      "salsah-gui:guiAttribute" : [ "GUI_ATTRIBUTE" ]
+    }
+  ],
+  "@context" : {
+    "knora-api" : "http://api.knora.org/ontology/knora-api/v2#",
+    "salsah-gui" : "http://api.knora.org/ontology/salsah-gui/v2#",
+    "owl" : "http://www.w3.org/2002/07/owl#",
+    "rdfs" : "http://www.w3.org/2000/01/rdf-schema#",
+    "xsd" : "http://www.w3.org/2001/XMLSchema#"
+  }
+}
+
+

Values for rdfs:label must be submitted in at least +one language, either as an object or as an array of objects.

+

Values for rdfs:comment are optional, but if they are provided, they must include a language code.

+

At least one base property must be provided, which can be +knora-api:hasValue, knora-api:hasLinkTo, or any of their +subproperties, with the exception of file properties (subproperties of +knora-api:hasFileValue) and link value properties (subproperties of +knora-api:hasLinkToValue).

+

If the property is a link property, the corresponding link value property +(see Links Between Resources) +will automatically be created.

+

The property definition must specify its knora-api:objectType. If the +new property is a subproperty of knora-api:hasValue, its +knora-api:objectType must be one of the built-in subclasses of +knora-api:Value, which are defined in the knora-api ontology in the +complex schema. If the new property is a subproperty of +knora-base:hasLinkTo, its knora-api:objectType must be a subclass of +knora-api:Resource.

+

To improve consistency checking, it is recommended, but not required, to +provide knora-api:subjectType, which must be a subclass of +knora-api:Resource.

+

The predicates salsah-gui:guiElement and salsah-gui:guiAttribute are +optional. If provided, the object of guiElement must be one of the OWL +named individuals defined in +The SALSAH GUI Ontology. Some GUI elements +take required or optional attributes, which are provided as objects of +salsah-gui:guiAttribute; see The SALSAH GUI Ontology +for details.

+

A successful response will be a JSON-LD document providing the new +property definition (but not any of the other entities in the ontology).

+

Changing the Labels of a Property

+

This operation is permitted even if the property is used in data.

+
HTTP PUT to http://host/v2/ontologies/properties
+
+
{
+  "@id" : "ONTOLOGY_IRI",
+  "@type" : "owl:Ontology",
+  "knora-api:lastModificationDate" : {
+    "@type" : "xsd:dateTimeStamp",
+    "@value" : "ONTOLOGY_LAST_MODIFICATION_DATE"
+  },
+  "@graph" : [
+    {
+      "@id" : "PROPERTY_IRI",
+      "@type" : "owl:ObjectProperty",
+      "rdfs:label" : {
+        "@language" : "LANGUAGE_CODE",
+        "@value" : "LABEL"
+      }
+    }
+  ],
+  "@context" : {
+    "knora-api" : "http://api.knora.org/ontology/knora-api/v2#",
+    "owl" : "http://www.w3.org/2002/07/owl#",
+    "rdfs" : "http://www.w3.org/2000/01/rdf-schema#",
+    "xsd" : "http://www.w3.org/2001/XMLSchema#"
+  }
+}
+
+

Values for rdfs:label must be submitted in at least one language, +either as an object or as an array of objects.

+

Changing the Comments of a Property

+

This operation is permitted even if the property is used in data.

+
HTTP PUT to http://host/v2/ontologies/properties
+
+
{
+  "@id" : "ONTOLOGY_IRI",
+  "@type" : "owl:Ontology",
+  "knora-api:lastModificationDate" : {
+    "@type" : "xsd:dateTimeStamp",
+    "@value" : "ONTOLOGY_LAST_MODIFICATION_DATE"
+  },
+  "@graph" : [
+    {
+      "@id" : "PROPERTY_IRI",
+      "@type" : "owl:ObjectProperty",
+      "rdfs:comment" : {
+        "@language" : "LANGUAGE_CODE",
+        "@value" : "COMMENT"
+      }
+    }
+  ],
+  "@context" : {
+    "knora-api" : "http://api.knora.org/ontology/knora-api/v2#",
+    "owl" : "http://www.w3.org/2002/07/owl#",
+    "rdfs" : "http://www.w3.org/2000/01/rdf-schema#",
+    "xsd" : "http://www.w3.org/2001/XMLSchema#"
+  }
+}
+
+

Values for rdfs:comment must be submitted in at least one language, +either as an object or as an array of objects.

+

Deleting the Comments of a Property

+

This operation is permitted even if the property is used in data.

+
HTTP DELETE to http://host/v2/ontologies/properties/comment/PROPERTY_IRI?lastModificationDate=ONTOLOGY_LAST_MODIFICATION_DATE
+
+

The property IRI and the ontology's last modification date must be URL-encoded.

+

All values i.e. all languages for rdfs:comment are deleted.

+

If the property is a link property, the rdfs:comment of its corresponding link value property will automatically be deleted.

+

A successful response will be a JSON-LD document providing the property definition.

+

Changing the GUI Element and GUI Attributes of a Property

+

This operation is permitted even if the property is used in data.

+
HTTP PUT to http://host/v2/ontologies/properties/guielement
+
+
{
+  "@id": "ONTOLOGY_IRI",
+  "@type": "owl:Ontology",
+  "knora-api:lastModificationDate": {
+    "@type": "xsd:dateTimeStamp",
+    "@value": "ONTOLOGY_LAST_MODIFICATION_DATE"
+  },
+  "@graph": [
+    {
+      "@id": "PROPERTY_IRI",
+      "@type": "owl:ObjectProperty",
+      "salsah-gui:guiElement": {
+        "@id": "salsah-gui:Textarea"
+      },
+      "salsah-gui:guiAttribute": [
+        "cols=80",
+        "rows=24"
+      ]
+    }
+  ],
+  "@context": {
+    "rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
+    "knora-api": "http://api.knora.org/ontology/knora-api/v2#",
+    "salsah-gui": "http://api.knora.org/ontology/salsah-gui/v2#",
+    "owl": "http://www.w3.org/2002/07/owl#",
+    "rdfs": "http://www.w3.org/2000/01/rdf-schema#",
+    "xsd": "http://www.w3.org/2001/XMLSchema#"
+  }
+}
+
+

To remove the values of salsah-gui:guiElement and salsah-gui:guiAttribute from +the property definition, submit the request without those predicates.

+

Adding Cardinalities to a Class

+

If the class (or any of its sub-classes) is used in data, +it is not allowed to add cardinalities owl:minCardinality greater than 0 or owl:cardinality 1 to the class.

+
HTTP POST to http://host/v2/ontologies/cardinalities
+
+
{
+  "@id" : "ONTOLOGY_IRI",
+  "@type" : "owl:Ontology",
+  "knora-api:lastModificationDate" : {
+    "@type" : "xsd:dateTimeStamp",
+    "@value" : "ONTOLOGY_LAST_MODIFICATION_DATE"
+  },
+  "@graph" : [ 
+    {
+      "@id" : "CLASS_IRI",
+      "@type" : "owl:Class",
+      "rdfs:subClassOf" : {
+        "@type": "owl:Restriction",
+        "OWL_CARDINALITY_PREDICATE": "OWL_CARDINALITY_VALUE",
+        "owl:onProperty": {
+          "@id" : "PROPERTY_IRI"
+        }
+      }
+    }
+  ],
+  "@context" : {
+    "knora-api" : "http://api.knora.org/ontology/knora-api/v2#",
+    "owl" : "http://www.w3.org/2002/07/owl#",
+    "rdfs" : "http://www.w3.org/2000/01/rdf-schema#",
+    "xsd" : "http://www.w3.org/2001/XMLSchema#"
+  }
+}
+
+

At least one cardinality must be submitted.

+

OWL_CARDINALITY_PREDICATE and OWL_CARDINALITY_VALUE must correspond +to the supported combinations given in +OWL Cardinalities. (The placeholder +OWL_CARDINALITY_VALUE is shown here in quotes, but it should be an +unquoted integer.)

+

When a cardinality on a link property is submitted, an identical cardinality +on the corresponding link value property is automatically added (see +Links Between Resources).

+

A successful response will be a JSON-LD document providing the new class +definition (but not any of the other entities in the ontology).

+

Replacing the Cardinalities of a Class

+

It is possible to replace all cardinalities on properties used by a class.
+If it succeeds the request will effectively replace all direct cardinalities of the class as specified. +That is, it removes all the cardinalities from the class and replaces them with the submitted cardinalities. +Meaning that, if no cardinalities are submitted (i.e. the request contains no rdfs:subClassOf), +the class is left with no cardinalities.

+

The request will fail if any of the "Pre-Update Checks" fails. +A partial update of the ontology will not be performed.

+

Pre-Update Checks

+
    +
  • Ontology Check
      +
    • Any given cardinality on a property must be included in any of the existing cardinalities + for the same property of the super-classes.
    • +
    • Any given cardinality on a property must include the effective cardinalities + for the same property of all subclasses, + taking into account the respective inherited cardinalities from the class hierarchy of the subclasses.
    • +
    +
  • +
  • Consistency Check with existing data
      +
    • Given that instances of the class or any of its subclasses exist, + then these instances are checked if they conform to the given cardinality.
    • +
    +
  • +
+
+

Subproperty handling for cardinality pre-update checks

+

The Pre-Update check does not take into account any subproperty relations between the properties. +Every cardinality is checked against only the given property and not its subproperties, +neither in the ontology nor the consistency check with existing data. +This means that currently it is necessary to maintain the cardinalities on all subproperties of a property +in sync with the cardinalities on the superproperty.

+
+
HTTP PUT to http://host/v2/ontologies/cardinalities
+
+
{
+  "@id" : "ONTOLOGY_IRI",
+  "@type" : "owl:Ontology",
+  "knora-api:lastModificationDate" : {
+    "@type" : "xsd:dateTimeStamp",
+    "@value" : "ONTOLOGY_LAST_MODIFICATION_DATE"
+  },
+  "@graph" : [ {
+    "@id" : "CLASS_IRI",
+    "@type" : "owl:Class",
+    "rdfs:subClassOf" : {
+      "@type": "owl:Restriction",
+      "OWL_CARDINALITY_PREDICATE": "OWL_CARDINALITY_VALUE",
+      "owl:onProperty": {
+        "@id" : "PROPERTY_IRI"
+      }
+    }
+  } ],
+  "@context" : {
+    "knora-api" : "http://api.knora.org/ontology/knora-api/v2#",
+    "owl" : "http://www.w3.org/2002/07/owl#",
+    "rdfs" : "http://www.w3.org/2000/01/rdf-schema#",
+    "xsd" : "http://www.w3.org/2001/XMLSchema#"
+  }
+}
+
+

OWL_CARDINALITY_PREDICATE and OWL_CARDINALITY_VALUE must correspond +to the supported combinations given in +OWL Cardinalities. (The placeholder +OWL_CARDINALITY_VALUE is shown here in quotes, but it should be an +unquoted integer.)

+

When a cardinality on a link property is submitted, an identical cardinality +on the corresponding link value property is automatically added (see +Links Between Resources).

+

A successful response will be a JSON-LD document providing the new class definition (but not any of the other entities in the ontology). +If any of the "Pre-Update Checks" fail the endpoint will respond with a 400 Bad Request containing the reasons why the update failed.

+

The "Pre-Update Checks" are available on a dedicated endpoint. +For a check whether a particular cardinality can be set on a class/property combination, use the following request:

+
HTTP GET to http://host/v2/ontologies/canreplacecardinalities/CLASS_IRI?propertyIri=PROPERTY_IRI&newCardinality=[0-1|1|1-n|0-n]
+
+

The response will look like this:

+

Failure:

+
{
+  "knora-api:canDo": false,
+  "knora-api:cannotDoReason": "An explanation, understandable to humans, why the update cannot be carried out.",
+  "knora-api:cannotDoContext": {
+    "knora-api:canSetCardinalityCheckFailure": [
+      {
+        "knora-api:canSetCardinalityOntologySuperClassCheckFailed": [
+          {
+            "@id": "http://0.0.0.0:3333/ontology/0801/biblio/v2#somePublicationInstance"
+          },
+          {
+            "@id": "http://0.0.0.0:3333/ontology/0801/biblio/v2#someArticleInstance"
+          }
+        ]
+      },
+      {
+        "knora-api:canSetCardinalityOntologySubclassCheckFailed": {
+          "@id": "http://0.0.0.0:3333/ontology/0801/biblio/v2#someJournalArticleInstance"
+        }
+      }
+    ]
+  },
+  "@context": {
+    "knora-api": "http://api.knora.org/ontology/knora-api/v2#"
+  }
+}
+
+

Success:

+
{
+    "knora-api:canDo": true,
+    "@context": {
+        "knora-api": "http://api.knora.org/ontology/knora-api/v2#"
+    } 
+}
+
+

Note: The following check is still available but deprecated - use the more detailed check above.

+

To check whether all class's cardinalities can be replaced:

+
HTTP GET to http://host/v2/ontologies/canreplacecardinalities/CLASS_IRI
+
+

The response will look like this:

+
{
+    "knora-api:canDo": false,
+    "@context": {
+        "knora-api": "http://api.knora.org/ontology/knora-api/v2#"
+    }
+}
+
+

The ontologies/canreplacecardinalities/CLASS_IRI request is only checking if the class is in use.

+

Delete a single cardinality from a class

+

If a class is used in data, it is only allowed to delete a cardinality, if the +property a cardinality refers to, is not used inside the data. Also, the property +isn't allowed to be used inside the data in any subclasses of this class.

+
HTTP PATCH to http://host/v2/ontologies/cardinalities
+
+
{
+  "@id" : "ONTOLOGY_IRI",
+  "@type" : "owl:Ontology",
+  "knora-api:lastModificationDate" : {
+    "@type" : "xsd:dateTimeStamp",
+    "@value" : "ONTOLOGY_LAST_MODIFICATION_DATE"
+  },
+  "@graph" : [ {
+    "@id" : "CLASS_IRI",
+    "@type" : "owl:Class",
+    "rdfs:subClassOf" : {
+      "@type": "owl:Restriction",
+      "OWL_CARDINALITY_PREDICATE": "OWL_CARDINALITY_VALUE",
+      "owl:onProperty": {
+        "@id" : "PROPERTY_IRI"
+      }
+    }
+  } ],
+  "@context" : {
+    "knora-api" : "http://api.knora.org/ontology/knora-api/v2#",
+    "owl" : "http://www.w3.org/2002/07/owl#",
+    "rdfs" : "http://www.w3.org/2000/01/rdf-schema#",
+    "xsd" : "http://www.w3.org/2001/XMLSchema#"
+  }
+}
+
+

OWL_CARDINALITY_PREDICATE and OWL_CARDINALITY_VALUE must correspond +to the supported combinations given in +OWL Cardinalities. (The placeholder +OWL_CARDINALITY_VALUE is shown here in quotes, but it should be an +unquoted integer.)

+

When a cardinality on a link property is submitted, an identical cardinality +on the corresponding link value property is automatically added (see +Links Between Resources).

+

A successful response will be a JSON-LD document providing the new class +definition (but not any of the other entities in the ontology).

+

To check whether a class's cardinality can be deleted:

+
HTTP POST to http://host/v2/ontologies/candeletecardinalities
+
+

The response will look like this:

+
{
+    "knora-api:canDo": false,
+    "@context": {
+        "knora-api": "http://api.knora.org/ontology/knora-api/v2#"
+    }
+}
+
+

Changing the GUI Order of Cardinalities

+

To change the GUI order of one or more cardinalities in a class:

+
HTTP PUT to http://host/v2/ontologies/guiorder
+
+

This can be done even if the class is used in data.

+

The request body includes the cardinalities whose GUI order should be changed, +using the predicate salsah-gui:guiOrder, whose object is an integer:

+
{
+  "@id" : "ONTOLOGY_IRI",
+  "@type" : "owl:Ontology",
+  "knora-api:lastModificationDate" : {
+    "@type" : "xsd:dateTimeStamp",
+    "@value" : "ONTOLOGY_LAST_MODIFICATION_DATE"
+  },
+  "@graph" : [ {
+    "@id" : "CLASS_IRI",
+    "@type" : "owl:Class",
+    "rdfs:subClassOf" : {
+      "@type": "owl:Restriction",
+      "OWL_CARDINALITY_PREDICATE": "OWL_CARDINALITY_VALUE",
+      "owl:onProperty": {
+        "@id" : "PROPERTY_IRI"
+      },
+      "salsah-gui:guiOrder": "GUI_ORDER_VALUE"
+    }
+  } ],
+  "@context" : {
+    "rdf" : "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
+    "knora-api" : "http://api.knora.org/ontology/knora-api/v2#",
+    "salsah-gui" : "http://api.knora.org/ontology/salsah-gui/v2#",
+    "owl" : "http://www.w3.org/2002/07/owl#",
+    "rdfs" : "http://www.w3.org/2000/01/rdf-schema#",
+    "xsd" : "http://www.w3.org/2001/XMLSchema#"
+  }
+}
+
+

Only the cardinalities whose GUI order is to be changed need to be included +in the request. The OWL_CARDINALITY_PREDICATE and OWL_CARDINALITY_VALUE +are ignored; only the GUI_ORDER_VALUE is changed.

+

Deleting a Property

+

A property can be deleted only if no other ontology entity refers to it, +and if it is not used in data.

+
HTTP DELETE to http://host/v2/ontologies/properties/PROPERTY_IRI?lastModificationDate=ONTOLOGY_LAST_MODIFICATION_DATE
+
+

The property IRI and the ontology's last modification date must be +URL-encoded.

+

If the property is a link property, the corresponding link value property +(see Links Between Resources) +will automatically be deleted.

+

A successful response will be a JSON-LD document providing only the +ontology's metadata.

+

To check whether a property can be deleted:

+
HTTP GET to http://host/v2/ontologies/candeleteproperty/PROPERTY_IRI
+
+

The response will look like this:

+
{
+    "knora-api:canDo": false,
+    "@context": {
+        "knora-api": "http://api.knora.org/ontology/knora-api/v2#"
+    }
+}
+
+

Deleting a Class

+

A class can be deleted only if no other ontology entity refers to it, +and if it is not used in data.

+
HTTP DELETE to http://host/v2/ontologies/classes/CLASS_IRI?lastModificationDate=ONTOLOGY_LAST_MODIFICATION_DATE
+
+

The class IRI and the ontology's last modification date must be +URL-encoded.

+

A successful response will be a JSON-LD document providing only the +ontology's metadata.

+

To check whether a class can be deleted:

+
HTTP GET to http://host/v2/ontologies/candeleteclass/CLASS_IRI
+
+

The response will look like this:

+
{
+    "knora-api:canDo": false,
+    "@context": {
+        "knora-api": "http://api.knora.org/ontology/knora-api/v2#"
+    }
+}
+
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/03-endpoints/api-v2/permalinks/index.html b/03-endpoints/api-v2/permalinks/index.html new file mode 100644 index 0000000000..7b743ae1dc --- /dev/null +++ b/03-endpoints/api-v2/permalinks/index.html @@ -0,0 +1,3178 @@ + + + + + + + + + + + + + + + + + + + + + + + Permalinks - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + +

Permalinks

+

Knora provides a permanent, citable URL for each resource and value. +These URLs use Archival Resource Key (ARK) Identifiers, +and are designed to remain valid even if the resource itself is moved +from one Knora repository to another.

+

Obtaining ARK URLs

+

In the complex schema, a resource or value +is always returned with two ARK URLs: one that will always refer +to the latest version of the resource or value (knora-api:arkUrl), and one that refers +specifically to the version being returned (knora-api:versionArkUrl). +For example:

+
{
+  "@id" : "http://rdfh.ch/0803/2a6221216701",
+  "@type" : "incunabula:book",
+  "incunabula:book_comment" : {
+    "@id" : "http://rdfh.ch/0803/2a6221216701/values/56c287fc9505",
+    "@type" : "knora-api:TextValue",
+    "knora-api:arkUrl" : {
+      "@type" : "xsd:anyURI",
+      "@value" : "http://ark.dasch.swiss/ark:/72163/1/0803/2a6221216701W/dhaRsvZATjmOxhCOOzHqewB"
+    },
+    "knora-api:versionArkUrl" : {
+      "@type" : "xsd:anyURI",
+      "@value" : "http://ark.dasch.swiss/ark:/72163/1/0803/2a6221216701W/dhaRsvZATjmOxhCOOzHqewB.20160302T150521Z"
+    },
+    "knora-api:attachedToUser" : {
+      "@id" : "http://rdfh.ch/users/91e19f1e01"
+    },
+    "knora-api:hasPermissions" : "CR knora-admin:Creator|M knora-admin:ProjectMember|V knora-admin:UnknownUser",
+    "knora-api:userHasPermission" : "V",
+    "knora-api:valueAsString" : "Katalogaufnahme anhand ISTC und v.d.Haegen",
+    "knora-api:valueCreationDate" : {
+      "@type" : "xsd:dateTimeStamp",
+      "@value" : "2016-03-02T15:05:21Z"
+    },
+    "knora-api:valueHasUUID" : "dhaRsvZATjmOxhCOOzHqew"
+  },
+  "knora-api:arkUrl" : {
+    "@type" : "xsd:anyURI",
+    "@value" : "http://ark.dasch.swiss/ark:/72163/1/0803/2a6221216701W"
+  },
+  "knora-api:versionArkUrl" : {
+    "@type" : "xsd:anyURI",
+    "@value" : "http://ark.dasch.swiss/ark:/72163/1/0803/2a6221216701W.20160302T150521Z"
+  },
+  "knora-api:attachedToProject" : {
+    "@id" : "http://rdfh.ch/projects/0803"
+  },
+  "knora-api:attachedToUser" : {
+    "@id" : "http://rdfh.ch/users/91e19f1e01"
+  },
+  "knora-api:creationDate" : {
+    "@type" : "xsd:dateTimeStamp",
+    "@value" : "2016-03-02T15:05:21Z"
+  },
+  "knora-api:hasPermissions" : "CR knora-admin:Creator|M knora-admin:ProjectMember|V knora-admin:UnknownUser",
+  "knora-api:userHasPermission" : "V",
+  "rdfs:label" : "Reise ins Heilige Land",
+  "@context" : {
+    "rdf" : "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
+    "knora-api" : "http://api.knora.org/ontology/knora-api/v2#",
+    "rdfs" : "http://www.w3.org/2000/01/rdf-schema#",
+    "incunabula" : "http://0.0.0.0:3333/ontology/0803/incunabula/v2#",
+    "xsd" : "http://www.w3.org/2001/XMLSchema#"
+  }
+}
+
+

In the simple schema, resources are returned +with ARK URLs, but values are returned as literals, so ARK URLs are not provided +for values.

+

For more information on getting past versions of resources and values, see:

+ +

Resolving Knora ARK URLs

+

A Knora ARK URL is intended to be resolved by the Knora ARK resolver.

+

Knora ARK URL Format

+

For details, see Archival Resource Key (ARK) Identifiers.

+

ARK URLs for Projects

+

The format of a Knora project ARK URL is as follows:

+
http://HOST/ark:/NAAN/VERSION/PROJECT
+
+

NAAN is a +Name Assigning Authority Number, +VERSION is the version number of the Knora ARK URL format (currently always 1), +and PROJECT is the project's short-code.

+

For example, given a project with ID 0001, and using the DaSCH's ARK resolver +hostname and NAAN, the ARK URL for the project itself is:

+
http://ark.dasch.swiss/ark:/72163/1/0001
+
+

This could redirect to a page describing the project.

+

ARK URLs for Resources

+

The format of a Knora resource ARK URL is as follows:

+
http://HOST/ark:/NAAN/VERSION/PROJECT/RESOURCE_UUID[.TIMESTAMP]
+
+

NAAN is a +Name Assigning Authority Number, +VERSION is the version number of the Knora ARK URL format (currently always 1), +PROJECT is the project's short-code, +and RESOURCE_UUID is the resource's UUID.

+

For example, given the Knora resource IRI http://rdfh.ch/0001/0C-0L1kORryKzJAJxxRyRQ, +and using the DaSCH's ARK resolver hostname and NAAN, the corresponding +ARK URL without a timestamp is:

+
http://ark.dasch.swiss/ark:/72163/1/0001/0C=0L1kORryKzJAJxxRyRQY
+
+

The same ARK URL with an optional timestamp is:

+
http://ark.dasch.swiss/ark:/72163/1/0001/0C=0L1kORryKzJAJxxRyRQY.20180604T085622513Z
+
+

Without a timestamp, a Knora resource ARK URL refers to the latest version of the +resource at the time when the URL is resolved.

+

ARK URLs for Values

+

The format of a Knora value ARK URL is as follows:

+
http://HOST/ark:/NAAN/VERSION/PROJECT/RESOURCE_UUID/VALUE_UUID[.TIMESTAMP]
+
+

NAAN is a +Name Assigning Authority Number, +VERSION is the version number of the Knora ARK URL format (currently always 1), +PROJECT is the project's short-code, +RESOURCE_UUID is the resource's UUID, and VALUE_UUID +is the value's knora-api:valueHasUUID.

+

For example, given a value with knora-api:valueHasUUID "4OOf3qJUTnCDXlPNnygSzQ" in the resource +http://rdfh.ch/0001/0C-0L1kORryKzJAJxxRyRQ, and using the DaSCH's ARK resolver +hostname and NAAN, the corresponding ARK URL without a timestamp is:

+
http://ark.dasch.swiss/ark:/72163/1/0001/0C=0L1kORryKzJAJxxRyRQY/4OOf3qJUTnCDXlPNnygSzQX
+
+

The same ARK URL with an optional timestamp is:

+
http://ark.dasch.swiss/ark:/72163/1/0001/0C=0L1kORryKzJAJxxRyRQY/4OOf3qJUTnCDXlPNnygSzQX.20180604T085622513Z
+
+

Without a timestamp, a Knora value ARK URL refers to the latest version of the +value at the time when the URL is resolved.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/03-endpoints/api-v2/query-language/index.html b/03-endpoints/api-v2/query-language/index.html new file mode 100644 index 0000000000..c5356b7e13 --- /dev/null +++ b/03-endpoints/api-v2/query-language/index.html @@ -0,0 +1,4731 @@ + + + + + + + + + + + + + + + + + + + + + + + Gravsearch - Virtual Graph Search - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + +

Gravsearch: Virtual Graph Search

+

Basic Concept

+

Gravsearch is intended to offer the advantages of SPARQL endpoints +(particularly the ability to perform queries using complex search +criteria) while avoiding their drawbacks in terms of performance and +security (see The Enduring Myth of the SPARQL +Endpoint). +It also has the benefit of enabling clients to work with a simpler RDF +data model than the one the API actually uses to store data in the +triplestore and makes it possible to provide better error-checking.

+

Rather than being processed directly by the triplestore, a Gravsearch query +is interpreted by the API, which enforces certain +restrictions on the query, and implements paging and permission +checking. The API server generates SPARQL based on the Gravsearch query +submitted, queries the triplestore, filters the results according to the +user's permissions, and returns each page of query results as an +API response. Thus, Gravsearch is a hybrid between a RESTful API and a +SPARQL endpoint.

+

A Gravsearch query conforms to a subset of the syntax of a SPARQL +CONSTRUCT query, with +some additional restrictions and functionality. In particular, the +variable representing the top-level (or 'main') resource that will +appear in each search result must be identified, statements must be +included to specify the types of the entities being queried, OFFSET is +used to control paging, and ORDER BY is used to sort the results.

+

It is certainly possible to write Gravsearch queries by hand, but we expect +that in general, they will be automatically generated by client +software, e.g. by a client user interface.

+

For a more detailed overview of Gravsearch, see +Gravsearch: Transforming SPARQL to query humanities data.

+

Submitting Gravsearch Queries

+

The recommended way to submit a Gravsearch query is via HTTP POST:

+
HTTP POST to http://host/v2/searchextended
+
+

This works like query via POST directly +in the SPARQL 1.1 Protocol: the query +is sent unencoded as the HTTP request message body, in the UTF-8 charset.

+

It is also possible to submit a Gravsearch query using HTTP GET. The entire +query must be URL-encoded and included as the last element of the URL path:

+
HTTP GET to http://host/v2/searchextended/QUERY
+
+

The response to a Gravsearch query is an RDF graph, which can be requested in various +formats (see Responses Describing Resources).

+

To request the number of results rather than the results themselves, you can +do a count query:

+
HTTP POST to http://host/v2/searchextended/count
+
+

The response to a count query request is an object with one predicate, +http://schema.org/numberOfItems, with an integer value.

+

If a gravsearch query times out, a 504 Gateway Timeout will be returned.

+

Gravsearch and API Schemas

+

A Gravsearch query can be written in either of the two +DSP-API v2 schemas. The simple schema +is easier to work with, and is sufficient if you don't need to query +anything below the level of a DSP-API value. If your query needs to refer to +standoff markup, you must use the complex schema. Each query must use a single +schema, with one exception (see Date Comparisons).

+

Gravsearch query results can be requested in the simple or complex schema; +see API Schema.

+

All examples hereafter run with the DSP stack started locally. If you access another stack, you can check +the IRI of the ontology you are targeting by requesting the ontologies metadata.

+

Using the Simple Schema

+

To write a query in the simple schema, use the knora-api ontology in +the simple schema, and use the simple schema for any other DSP ontologies +the query refers to, e.g.:

+
PREFIX knora-api: <http://api.knora.org/ontology/knora-api/simple/v2#>
+PREFIX incunabula: <http://0.0.0.0:3333/ontology/0803/incunabula/simple/v2#>
+
+

In the simple schema, DSP-API values are represented as literals, which can be used in FILTER expressions +(see Filtering on Values in the Simple Schema).

+

Using the Complex Schema

+

To write a query in the complex schema, use the knora-api ontology in +the complex schema, and use the complex schema for any other DSP ontologies +the query refers to, e.g.:

+
PREFIX knora-api: <http://api.knora.org/ontology/knora-api/v2#>
+PREFIX incunabula: <http://0.0.0.0:3333/ontology/0803/incunabula/v2#>
+
+

In the complex schema, DSP-API values are represented as objects belonging +to subclasses of knora-api:Value, e.g. knora-api:TextValue, and have +predicates of their own, which can be used in FILTER expressions +(see Filtering on Values in the Complex Schema).

+

Main and Dependent Resources

+

The main resource is the top-level resource in a search result. Other +resources that are in some way connected to the main resource are +referred to as dependent resources. If the client asks for a resource A +relating to a resource B, then all matches for A will be presented as +main resources and those for B as dependent resources. The main resource +must be represented by a variable, marked with knora-api:isMainResource, +as explained under CONSTRUCT Clause.

+ +

Depending on the ontology design, a resource A points to B or vice versa. +For example, a page A is part of a book B using the property incunabula:partOf. +If A is marked as the main resource, then B is nested as a dependent resource +in its link value incunabula:partOfValue. But in case B is marked as the main resource, +B does not have a link value pointing to A because in fact B is pointed to by A. +Instead, B has a virtual property knora-api:hasIncomingLink containing A's link value:

+
"knora-api:hasIncomingLinkValue" : {
+    "@id" : "http://rdfh.ch/A/values/xy",
+    "@type" : "knora-api:LinkValue",
+    "knora-api:linkValueHasSource" : {
+      "@id" : "http://rdfh.ch/A",
+      "@type" : "incunabula:page",
+      "incunabula:partOfValue" : {
+        "@id" : "http://rdfh.ch/A/values/xy",
+        "@type" : "knora-api:LinkValue",
+        "knora-api:linkValueHasTargetIri" : {
+          "@id" : "http://rdfh.ch/B"
+        }
+      }
+    }
+  },
+
+

Note that the virtually inserted link value inverts the relation by using knora-api:linkValueHasSource. +The source of the link is A and its target B is only represented by an IRI (knora-api:linkValueHasTargetIri) +since B is the main resource.

+

Graph Patterns and Result Graphs

+

The WHERE clause of a Gravsearch query specifies a graph pattern. Each query +result will match this graph pattern, and will have the form of a graph +whose starting point is a main resource. The query's graph pattern, and +hence each query result graph, can span zero more levels of relations +between resources. For example, a query could request regions +in images on pages of books written by a certain author, articles by +authors who were students of a particular professor, or authors of texts +that refer to events that took place within a certain date range.

+

Permission Checking

+

Each matching resource is returned with the values that the user has +permission to see. If the user does not have permission to see a matching +main resource, it is hidden in the results. If a user does not have +permission to see a matching dependent resource, the link value is hidden.

+

Paging

+

Gravsearch results are returned in pages. The maximum number of main +resources per page is determined by the API (and can be configured +in application.conf via the setting app/v2/resources-sequence/results-per-page). +If some resources have been filtered out because the user does not have +permission to see them, a page could contain fewer results, or no results. +If it is possible that more results are available in subsequent pages, +the Gravsearch response will contain the predicate knora-api:mayHaveMoreResults +with the boolean value true, otherwise it will not contain this predicate. +Therefore, to retrieve all available results, the client must request each page +one at a time, until the response does not contain knora-api:mayHaveMoreResults.

+

Inference

+

Gravsearch queries are understood to imply a subset of +RDFS reasoning. This is done by the API by expanding the incoming query.

+

Specifically, if a statement pattern specifies a property, the pattern will +also match subproperties of that property, and if a statement specifies that +a subject has a particular rdf:type, the statement will also match subjects +belonging to subclasses of that type.

+

If you know that reasoning will not return any additional results for +your query, you can disable it by adding this line to the WHERE clause, which may improve query performance:

+
knora-api:GravsearchOptions knora-api:useInference false .
+
+

Gravsearch Syntax

+

Every Gravsearch query is a valid SPARQL 1.1 +CONSTRUCT query. +However, Gravsearch only supports a subset of the elements that can be used +in a SPARQL Construct query, and a Gravsearch +CONSTRUCT Clause has to indicate which variable +is to be used for the main resource in each search result.

+

Supported SPARQL Syntax

+

The current version of Gravsearch accepts CONSTRUCT queries whose WHERE +clauses use the following patterns, with the specified restrictions:

+
    +
  • OPTIONAL: cannot be nested in a UNION.
  • +
  • UNION: cannot be nested in a UNION.
  • +
  • FILTER: may contain a complex expression using the Boolean + operators AND and OR, as well as comparison operators. The left + argument of a comparison operator must be a query variable. + A Knora ontology entity IRI used in a FILTER must be a property IRI.
  • +
  • FILTER NOT EXISTS
  • +
  • MINUS
  • +
  • OFFSET: the OFFSET is needed for paging. It does not actually + refer to the number of triples to be returned, but to the + requested page of results. The default value is 0, which refers + to the first page of results.
  • +
  • ORDER BY: In SPARQL, the result of a CONSTRUCT query is an + unordered set of triples. However, a Gravsearch query returns an + ordered list of resources, which can be ordered by the values of + specified properties. If the query is written in the complex schema, + items below the level of DSP-API values may not be used in ORDER BY.
  • +
  • BIND: The value assigned must be a DSP resource IRI.
  • +
+

Resources, Properties, and Values

+

Resources can be represented either by an IRI or by a variable, except for the +main resource, which must be represented by a variable.

+

It is possible to do a Gravsearch query in which the IRI of the main resource +is already known, e.g. to request specific information about that resource and +perhaps about linked resources. In this case, the IRI of the main resource must +be assigned to a variable using BIND. Note that BIND statements slow the query down, +therefore we recommend that you do not use them unless you have to.

+

Properties can be represented by an IRI or a query variable. If a +property is represented by a query variable, it can be restricted to +certain property IRIs using a FILTER.

+

A Knora value (i.e. a value attached to a knora-api:Resource) +must be represented as a query variable.

+

Filtering on Values

+

Filtering on Values in the Simple Schema

+

In the simple schema, a variable representing a DSP-API value can be used +directly in a FILTER expression. For example:

+
?book incunabula:title ?title .
+FILTER(?title = "Zeitglöcklein des Lebens und Leidens Christi")
+
+

Here the type of ?title is xsd:string.

+

The following value types can be compared with literals in FILTER +expressions in the simple schema:

+
    +
  • Text values (xsd:string)
  • +
  • URI values (xsd:anyURI)
  • +
  • Integer values (xsd:integer)
  • +
  • Decimal values (xsd:decimal)
  • +
  • Boolean values (xsd:boolean)
  • +
  • Date values (knora-api:Date)
  • +
  • List values (knora-api:ListNode)
  • +
+

List values can only be searched for using the equal operator (=), +performing an exact match on a list node's label. Labels can be given in different languages for a specific list node. +If one of the given list node labels matches, it is considered a match. +Note that in the simple schema, uniqueness is not guaranteed (as opposed to the complex schema).

+

A DSP-API value may not be represented as the literal object of a predicate; +for example, this is not allowed:

+
?book incunabula:title "Zeitglöcklein des Lebens und Leidens Christi" .
+
+

Filtering on Values in the Complex Schema

+

In the complex schema, variables representing DSP-API values are not literals. +You must add something to the query (generally a statement) to get a literal +from a DSP-API value. For example:

+
?book incunabula:title ?title .
+?title knora-api:valueAsString "Zeitglöcklein des Lebens und Leidens Christi" .
+
+

Here the type of ?title is knora-api:TextValue. Note that no FILTER is needed +in this example. But if you want to use a different comparison operator, +you need a FILTER:

+
?page incunabula:seqnum ?seqnum .
+?seqnum knora-api:intValueAsInt ?seqnumInt .
+FILTER(?seqnumInt <= 10)
+
+

To match a date value in the complex schema, you must use the +knora-api:toSimpleDate function in a FILTER +(see Date Comparisons). The predicates of +knora-api:DateValue (knora-api:dateValueHasStartYear, etc.) are not +available in Gravsearch.

+

Date Comparisons

+

In the simple schema, you can compare a date value directly with a knora-api:Date +in a FILTER:

+
?book incunabula:pubdate ?pubdate .
+FILTER(?pubdate < "JULIAN:1497"^^knora-api:Date)
+
+

In the complex schema, you must use the function knora-api:toSimpleDate, +passing it the variable representing the date value. The date literal used +in the comparison must still be a knora-api:Date in the simple schema. +This is the only case in which you can use both schemas in a single query:

+
PREFIX incunabula: <http://0.0.0.0:3333/ontology/0803/incunabula/v2#>
+PREFIX knora-api: <http://api.knora.org/ontology/knora-api/v2#>
+PREFIX knora-api-simple: <http://api.knora.org/ontology/knora-api/simple/v2#>
+
+CONSTRUCT {
+    ?book knora-api:isMainResource true .
+    ?book incunabula:pubdate ?pubdate .
+} WHERE {
+    ?book a incunabula:book .
+    ?book incunabula:pubdate ?pubdate .
+    FILTER(knora-api:toSimpleDate(?pubdate) < "JULIAN:1497"^^knora-api-simple:Date)
+} ORDER BY ?pubdate
+
+

You can also use knora-api:toSimpleDate with to search for date tags in standoff +text markup (see Matching Standoff Dates).

+

Note that the given date value for comparison must have the following format:

+
(GREGORIAN|JULIAN|ISLAMIC):\d{1,4}(-\d{1,2}(-\d{1,2})?)?( BC| AD| BCE| CE)?(:\d{1,4}(-\d{1,2}(-\d{1,2})?)?( BC| AD| BCE| CE)?)?
+
+

E.g. an exact date like GREGORIAN:2015-12-03 or a period like GREGORIAN:2015-12-03:2015-12-04. +Dates may also have month or year precision, e.g. ISLAMIC:1407-02 (the whole month of december) or JULIAN:1330 +(the whole year 1330). An optional ERA indicator term (BCE, CE, or BC, AD) can be added to the date, when no +era is provided the default era AD will be considered. Era can be given as GREGORIAN:1220 BC or in range as +GREGORIAN:600 BC:480 BC.

+

Searching for Matching Words

+

The function knora-api:matchText searches for matching words anywhere in a +text value and is implemented using a full-text search index if available. +The first argument must represent a text value (a knore-api:TextValue in +the complex schema, or an xsd:string in the simple schema). The second +argument is a string literal containing the words to be matched, separated by spaces. +The function supports the +Lucene Query Parser syntax. +Note that Lucene's default operator is a logical OR when submitting several search terms.

+

This function can only be used as the top-level expression in a FILTER.

+

For example, to search for titles that contain the words 'Zeitglöcklein' and +'Lebens':

+
?book incunabule:title ?title .
+FILTER knora-api:matchText(?title, "Zeitglöcklein Lebens")
+
+

Filtering Text by Language

+

To filter a text value by language in the simple schema, use the SPARQL lang function +on the text value, e.g.:

+
FILTER(lang(?text) = "fr")
+
+

In the complex schema, the lang function is not supported. Use the text +value's knora-api:textValueHasLanguage predicate instead:

+
?text knora-api:textValueHasLanguage "fr" .
+
+

Regular Expressions

+

The SPARQL regex function +is supported. In the simple schema, you can use it directly on the text value, +e.g.

+
?book incunabula:title ?title .
+FILTER regex(?title, "Zeit", "i")
+
+

In the complex schema, use it on the object of the text value's +knora-api:valueAsString predicate:

+
?book incunabula:title ?title .
+?title knora-api:valueAsString ?titleStr .
+FILTER regex(?titleStr, "Zeit", "i")
+
+

Searching for Text Markup

+

To refer to standoff markup in text values, you must write your query in the complex +schema.

+

A knora-api:TextValue can have the property +knora-api:textValueHasStandoff, whose objects are the standoff markup +tags in the text. You can match the tags you're interested in using +rdf:type or other properties of each tag.

+

Matching Text in a Standoff Tag

+

The function knora-api:matchTextInStandoff searches for standoff tags containing certain terms. +The implementation is optimised using the full-text search index if available. The +function takes three arguments:

+
    +
  1. A variable representing a text value.
  2. +
  3. A variable representing a standoff tag.
  4. +
  5. A string literal containing space-separated search terms.
  6. +
+

This function can only be used as the top-level expression in a FILTER. +For example:

+
PREFIX knora-api: <http://api.knora.org/ontology/knora-api/v2#>
+PREFIX standoff: <http://api.knora.org/ontology/standoff/v2#>
+PREFIX beol: <http://0.0.0.0:3333/ontology/0801/beol/v2#>
+
+CONSTRUCT {
+    ?letter knora-api:isMainResource true .
+    ?letter beol:hasText ?text .
+} WHERE {
+    ?letter a beol:letter .
+    ?letter beol:hasText ?text .
+    ?text knora-api:textValueHasStandoff ?standoffParagraphTag .
+    ?standoffParagraphTag a standoff:StandoffParagraphTag .
+    FILTER knora-api:matchTextInStandoff(?text, ?standoffParagraphTag, "Grund Richtigkeit")
+}
+
+

Here we are looking for letters containing the words "Grund" and "Richtigkeit" +within a single paragraph.

+ +

If you are only interested in specifying that a resource has some text +value containing a standoff link to another resource, the most efficient +way is to use the property knora-api:hasStandoffLinkTo, whose subjects and objects +are resources. This property is automatically maintained by the API. For example:

+
PREFIX knora-api: <http://api.knora.org/ontology/knora-api/v2#>
+PREFIX beol: <http://0.0.0.0:3333/ontology/0801/beol/v2#>
+
+CONSTRUCT {
+    ?letter knora-api:isMainResource true .
+    ?letter beol:hasText ?text .
+} WHERE {
+    ?letter a beol:letter .
+    ?letter beol:hasText ?text .
+    ?letter knora-api:hasStandoffLinkTo ?person .
+    ?person a beol:person .
+    ?person beol:hasIAFIdentifier ?iafIdentifier .
+    ?iafIdentifier knora-api:valueAsString "(VIAF)271899510" .
+}
+
+

Here we are looking for letters containing a link to the historian +Claude Jordan, who is identified by his Integrated Authority File +identifier, (VIAF)271899510.

+

However, if you need to specify the context in which the link tag occurs, you must +use the function knora-api:standoffLink. It takes three arguments:

+
    +
  1. A variable or IRI representing the resource that is the source of the link.
  2. +
  3. A variable representing the standoff link tag.
  4. +
  5. A variable or IRI representing the resource that is the target of the link.
  6. +
+

This function can only be used as the top-level expression in a FILTER. +For example:

+
PREFIX knora-api: <http://api.knora.org/ontology/knora-api/v2#>
+PREFIX standoff: <http://api.knora.org/ontology/standoff/v2#>
+PREFIX beol: <http://0.0.0.0:3333/ontology/0801/beol/v2#>
+
+CONSTRUCT {
+    ?letter knora-api:isMainResource true .
+    ?letter beol:hasText ?text .
+} WHERE {
+    ?letter a beol:letter .
+    ?letter beol:hasText ?text .
+    ?text knora-api:textValueHasStandoff ?standoffLinkTag .
+    ?standoffLinkTag a knora-api:StandoffLinkTag .
+    FILTER knora-api:standoffLink(?letter, ?standoffLinkTag, ?person)
+    ?person a beol:person .
+    ?person beol:hasIAFIdentifier ?iafIdentifier .
+    ?iafIdentifier knora-api:valueAsString "(VIAF)271899510" .
+    ?standoffLinkTag knora-api:standoffTagHasStartParent ?standoffItalicTag .
+    ?standoffItalicTag a standoff:StandoffItalicTag .
+}
+
+

This has the same effect as the previous example, except that because we are matching +the link tag itself, we can specify that its immediate parent is a +StandoffItalicTag.

+

If you actually want to get the target of the link (in this example, ?person) +in the search results, you need to add a statement like +?letter knora-api:hasStandoffLinkTo ?person . to the WHERE clause and to the +CONSTRUCT clause:

+
PREFIX knora-api: <http://api.knora.org/ontology/knora-api/v2#>
+PREFIX standoff: <http://api.knora.org/ontology/standoff/v2#>
+PREFIX beol: <http://0.0.0.0:3333/ontology/0801/beol/v2#>
+
+CONSTRUCT {
+    ?letter knora-api:isMainResource true .
+    ?letter beol:hasText ?text .
+    ?letter knora-api:hasStandoffLinkTo ?person .
+} WHERE {
+    ?letter a beol:letter .
+    ?letter beol:hasText ?text .
+    ?text knora-api:textValueHasStandoff ?standoffLinkTag .
+    ?standoffLinkTag a knora-api:StandoffLinkTag .
+    FILTER knora-api:standoffLink(?letter, ?standoffLinkTag, ?person)
+    ?person a beol:person .
+    ?person beol:hasIAFIdentifier ?iafIdentifier .
+    ?iafIdentifier knora-api:valueAsString "(VIAF)271899510" .
+    ?standoffLinkTag knora-api:standoffTagHasStartParent ?standoffItalicTag .
+    ?standoffItalicTag a standoff:StandoffItalicTag .
+    ?letter knora-api:hasStandoffLinkTo ?person .
+}
+
+

Matching Standoff Dates

+

You can use the knora-api:toSimpleDate function (see @refDate Comparisons) +to match dates in standoff date tags, i.e. instances of knora-api:StandoffDateTag or +of one of its subclasses. For example, here we are looking for a text containing +an anything:StandoffEventTag (which is a project-specific subclass of knora-api:StandoffDateTag) +representing an event that occurred sometime during the month of December 2016:

+
PREFIX knora-api: <http://api.knora.org/ontology/knora-api/v2#>
+PREFIX anything: <http://0.0.0.0:3333/ontology/0001/anything/v2#>
+PREFIX knora-api-simple: <http://api.knora.org/ontology/knora-api/simple/v2#>
+
+CONSTRUCT {
+    ?thing knora-api:isMainResource true .
+    ?thing anything:hasText ?text .
+} WHERE {
+    ?thing a anything:Thing .
+    ?thing anything:hasText ?text .
+    ?text knora-api:textValueHasStandoff ?standoffEventTag .
+    ?standoffEventTag a anything:StandoffEventTag .
+    FILTER(knora-api:toSimpleDate(?standoffEventTag) = "GREGORIAN:2016-12 CE"^^knora-api-simple:Date)
+}
+
+

Matching Ancestor Tags

+

Suppose we want to search for a standoff date in a paragraph, but we know +that the paragraph tag might not be the immediate parent of the date tag. +For example, the date tag might be in an italics tag, which is in a paragraph +tag. In that case, we can use the inferred property +knora-api:standoffTagHasStartAncestor. We can modify the previous example to +do this:

+
PREFIX knora-api: <http://api.knora.org/ontology/knora-api/v2#>
+PREFIX standoff: <http://api.knora.org/ontology/standoff/v2#>
+PREFIX anything: <http://0.0.0.0:3333/ontology/0001/anything/v2#>
+PREFIX knora-api-simple: <http://api.knora.org/ontology/knora-api/simple/v2#>
+
+CONSTRUCT {
+    ?thing knora-api:isMainResource true .
+    ?thing anything:hasText ?text .
+} WHERE {
+    ?thing a anything:Thing .
+    ?thing anything:hasText ?text .
+    ?text knora-api:textValueHasStandoff ?standoffDateTag .
+    ?standoffDateTag a knora-api:StandoffDateTag .
+    FILTER(knora-api:toSimpleDate(?standoffDateTag) = "GREGORIAN:2016-12-24 CE"^^knora-api-simple:Date)
+    ?standoffDateTag knora-api:standoffTagHasStartAncestor ?standoffParagraphTag .
+    ?standoffParagraphTag a standoff:StandoffParagraphTag .
+}
+
+

Filtering on rdfs:label

+

The rdfs:label of a resource is not a DSP-API value, but you can still search for it. +This can be done in the same ways in the simple or complex schema:

+

Using a string literal object:

+
?book rdfs:label "Zeitglöcklein des Lebens und Leidens Christi" .
+
+

Using a variable and a FILTER:

+
?book rdfs:label ?label .
+FILTER(?label = "Zeitglöcklein des Lebens und Leidens Christi")
+
+

Using the regex function:

+
?book rdfs:label ?bookLabel .
+FILTER regex(?bookLabel, "Zeit", "i")
+
+

To match words in an rdfs:label using the full-text search index, use the +knora-api:matchLabel function, which works like knora-api:matchText, +except that the first argument is a variable representing a resource:

+
FILTER knora-api:matchLabel(?book, "Zeitglöcklein")
+
+

Filtering on Resource IRIs

+

A FILTER can compare a variable with another variable or IRI +representing a resource. For example, to find a letter whose +author and recipient are different persons:

+
PREFIX beol: <http://0.0.0.0:3333/ontology/0801/beol/v2#>
+PREFIX knora-api: <http://api.knora.org/ontology/knora-api/v2#>
+
+CONSTRUCT {
+    ?letter knora-api:isMainResource true .
+    ?letter beol:hasAuthor ?person1 .
+    ?letter beol:hasRecipient ?person2 .
+} WHERE {
+    ?letter a beol:letter .
+    ?letter beol:hasAuthor ?person1 .
+    ?letter beol:hasRecipient ?person2 .
+    FILTER(?person1 != ?person2) .
+}
+OFFSET 0
+
+

To find a letter whose author is not a person with a specified IRI:

+
PREFIX beol: <http://0.0.0.0:3333/ontology/0801/beol/v2#>
+PREFIX knora-api: <http://api.knora.org/ontology/knora-api/v2#>
+
+CONSTRUCT {
+    ?letter knora-api:isMainResource true .
+    ?letter beol:hasAuthor ?person1 .
+    ?letter beol:hasRecipient ?person2 .
+} WHERE {
+    ?letter a beol:letter .
+    ?letter beol:hasAuthor ?person1 .
+    ?letter beol:hasRecipient ?person2 .
+    FILTER(?person1 != <http://rdfh.ch/0801/F4n1xKa3TCiR4llJeElAGA>) .
+}
+OFFSET 0
+
+

CONSTRUCT Clause

+

In the CONSTRUCT clause of a Gravsearch query, the variable representing the +main resource must be indicated with knora-api:isMainResource true. Exactly +one variable representing a resource must be marked in this way.

+

Any other statements in the CONSTRUCT clause must also be present in the WHERE +clause. If a variable representing a resource or value is used in the WHERE +clause but not in the CONSTRUCT clause, the matching resources or values +will not be included in the results.

+

If the query is written in the complex schema, all variables in the CONSTRUCT +clause must refer to DSP-API resources, DSP-API values, or properties. Data below +the level of values may not be mentioned in the CONSTRUCT clause.

+

Predicates from the rdf, rdfs, and owl ontologies may not be used +in the CONSTRUCT clause. The rdfs:label of each matching resource is always +returned, so there is no need to mention it in the query.

+

Gravsearch by Example

+

In this section, we provide some sample queries of different complexity +to illustrate the usage of Gravsearch.

+

Getting All the Components of a Compound Resource

+

In order to get all the components of a compound resource, the following +Gravsearch query can be sent to the API.

+

In this case, the compound resource is an incunabula:book identified +by the IRI http://rdfh.ch/0803/c5058f3a and the components are of +type incunabula:page (test data for the Incunabula project). Since +inference is assumed, we can use knora-api:StillImageRepresentation +(incunabula:page is one of its subclasses). This makes the query more +generic and allows for reuse (for instance, a client would like to query +different types of compound resources defined in different ontologies).

+

ORDER BY is used to sort the components by their sequence number.

+

OFFSET is set to 0 to get the first page of results.

+
PREFIX knora-api: <http://api.knora.org/ontology/knora-api/simple/v2#>
+
+CONSTRUCT {
+   ?component knora-api:isMainResource true . # marking of the component searched for as the main resource, required
+   ?component knora-api:seqnum ?seqnum . # return the sequence number in the response
+   ?component knora-api:hasStillImageFileValue ?file . # return the StillImageFile in the response
+} WHERE {
+   ?component a knora-api:StillImageRepresentation . # restriction of the type of component
+   ?component knora-api:isPartOf <http://rdfh.ch/0803/c5058f3a> . # component relates to a compound resource via this property
+   ?component knora-api:seqnum ?seqnum . # component must have a sequence number
+   ?component knora-api:hasStillImageFileValue ?file . # component must have a StillImageFile
+}
+ORDER BY ASC(?seqnum) # order by sequence number, ascending
+OFFSET 0 # get first page of results
+
+

The incunabula:book with the IRI http://rdfh.ch/0803/c5058f3a has +402 pages. (This result can be obtained by doing a count query; see +Submitting Gravsearch Queries.) +However, with OFFSET 0, only the first page of results is returned. +The same query can be sent again with OFFSET 1 to get the next page of +results, and so forth. When a page of results is not full (see settings +in app/v2 in application.conf) or is empty, no more results are +available.

+

By design, it is not possible for the client to get more than one page +of results at a time; this is intended to prevent performance problems +that would be caused by huge responses. A client that wants to download +all the results of a query must request each page sequentially.

+

Let's assume the client is not interested in all of the book's pages, +but just in first ten of them. In that case, the sequence number can be +restricted using a FILTER that is added to the query's WHERE clause:

+
FILTER (?seqnum <= 10)
+
+

The first page starts with sequence number 1, so with this FILTER only +the first ten pages are returned.

+

This query would be exactly the same in the complex schema, except for +the expansion of the knora-api prefix:

+
PREFIX knora-api: <http://api.knora.org/ontology/knora-api/v2#>
+
+ +

Here we are looking for regions of pages that are part of books that have a +particular title. In the simple schema:

+
PREFIX incunabula: <http://0.0.0.0:3333/ontology/0803/incunabula/simple/v2#>
+PREFIX knora-api: <http://api.knora.org/ontology/knora-api/simple/v2#>
+
+CONSTRUCT {
+  ?region knora-api:isMainResource true ;
+    knora-api:isRegionOf ?page .
+
+  ?page incunabula:partOf ?book .
+
+  ?book incunabula:title ?title .
+} WHERE {
+  ?region a knora-api:Region ;
+    knora-api:isRegionOf ?page .
+
+  ?page a incunabula:page ;
+    incunabula:partOf ?book .
+
+  ?book incunabula:title ?title .
+
+  FILTER(?title = "Zeitglöcklein des Lebens und Leidens Christi")
+}
+
+

In the complex schema:

+
PREFIX incunabula: <http://0.0.0.0:3333/ontology/0803/incunabula/v2#>
+PREFIX knora-api: <http://api.knora.org/ontology/knora-api/v2#>
+
+CONSTRUCT {
+  ?region knora-api:isMainResource true ;
+    knora-api:isRegionOf ?page .
+
+  ?page incunabula:partOf ?book .
+
+  ?book incunabula:title ?title .
+} WHERE {
+  ?region a knora-api:Region ;
+    knora-api:isRegionOf ?page .
+
+  ?page a incunabula:page ;
+    incunabula:partOf ?book .
+
+  ?book incunabula:title ?title .
+
+  ?title knora-api:valueAsString "Zeitglöcklein des Lebens und Leidens Christi" .
+}
+
+

If we remove the line ?book incunabula:title ?title . from the CONSTRUCT +clause, so that the CONSTRUCT clause no longer mentions ?title, the response +will contain the same matching resources, but the titles of those resources +will not be included in the response.

+

Requesting a Graph Starting with a Known Resource

+

Here the IRI of the main resource is already known and we want specific information +about it, as well as about related resources. In this case, the IRI of the main +resource must be assigned to a variable using BIND:

+
PREFIX beol: <http://0.0.0.0:3333/ontology/0801/beol/simple/v2#>
+PREFIX knora-api: <http://api.knora.org/ontology/knora-api/simple/v2#>
+
+CONSTRUCT {
+  ?letter knora-api:isMainResource true ;
+    beol:creationDate ?date ;
+    ?linkingProp1 ?person1 .
+
+  ?person1 beol:hasFamilyName ?familyName .
+} WHERE {
+  BIND(<http://rdfh.ch/0801/_B3lQa6tSymIq7_7SowBsA> AS ?letter)
+
+  ?letter a beol:letter ;
+    beol:creationDate ?date ;
+    ?linkingProp1 ?person1 .
+
+  FILTER(?linkingProp1 = beol:hasAuthor || ?linkingProp1 = beol:hasRecipient)
+
+  ?person1 beol:hasFamilyName ?familyName .
+} ORDER BY ?date
+
+

This query would be the same in the complex schema, except for the prefix +expansions:

+
PREFIX beol: <http://0.0.0.0:3333/ontology/0801/beol/v2#>
+PREFIX knora-api: <http://api.knora.org/ontology/knora-api/v2#>
+
+

Searching for a List Value Referring to a Particular List Node

+

Since list nodes are represented by their IRI in the complex schema, +uniqueness is guranteed (as opposed to the simple schema). +Also all the subnodes of the given list node are considered a match.

+
PREFIX knora-api: <http://api.knora.org/ontology/knora-api/v2#>
+PREFIX anything: <http://0.0.0.0:3333/ontology/0001/anything/v2#>
+
+CONSTRUCT {
+    ?thing knora-api:isMainResource true .
+    ?thing anything:hasListItem ?listItem .
+} WHERE {
+    ?thing anything:hasListItem ?listItem .
+    ?listItem knora-api:listValueAsListNode <http://rdfh.ch/lists/0001/treeList02> .
+}
+
+

Type Inference

+

Gravsearch needs to be able to determine the types of the entities that +query variables and IRIs refer to in the WHERE clause. In most cases, it can +infer these from context and from the ontologies used. In particular, it needs to +know:

+
    +
  • The type of the subject and object of each statement.
  • +
  • The type that is expected as the object of each predicate.
  • +
+

Type Annotations

+

When one or more types cannot be inferred, Gravsearch will return an error message +indicating the entities for which it could not determine types. The missing +information must then be given by adding type annotations to the query. This can always done by +adding statements with the predicate rdf:type. The subject must be a resource or value, +and the object must either be knora-api:Resource (if the subject is a resource) +or the subject's specific type (if it is a value).

+

For example, consider this query that uses a non-DSP property:

+
PREFIX incunabula: <http://0.0.0.0:3333/ontology/0803/incunabula/simple/v2#>
+PREFIX knora-api: <http://api.knora.org/ontology/knora-api/simple/v2#>
+PREFIX dcterms: <http://purl.org/dc/terms/>
+
+CONSTRUCT {
+    ?book knora-api:isMainResource true ;
+        dcterms:title ?title .
+
+} WHERE {
+    ?book dcterms:title ?title .
+}
+
+

This produces the error message:

+
The types of one or more entities could not be determined:
+  ?book, <http://purl.org/dc/terms/title>, ?title
+
+

To solve this problem, it is enough to specify the types of ?book and +?title; the type of the expected object of dcterms:title can then be inferred +from the type of ?title.

+
PREFIX incunabula: <http://0.0.0.0:3333/ontology/0803/incunabula/simple/v2#>
+PREFIX knora-api: <http://api.knora.org/ontology/knora-api/simple/v2#>
+PREFIX dcterms: <http://purl.org/dc/terms/>
+
+CONSTRUCT {
+    ?book knora-api:isMainResource true ;
+        dcterms:title ?title .
+
+} WHERE {
+
+    ?book rdf:type incunabula:book ;
+        dcterms:title ?title .
+
+    ?title rdf:type xsd:string .
+
+}
+
+

It would also be possible to annotate the property itself, using the predicate knora-api:objectType; +then the type of ?title would be inferred:

+
PREFIX incunabula: <http://0.0.0.0:3333/ontology/0803/incunabula/simple/v2#>
+PREFIX knora-api: <http://api.knora.org/ontology/knora-api/simple/v2#>
+PREFIX dcterms: <http://purl.org/dc/terms/>
+
+CONSTRUCT {
+    ?book knora-api:isMainResource true ;
+        dcterms:title ?title .
+
+} WHERE {
+
+    ?book rdf:type incunabula:book ;
+        dcterms:title ?title .
+
+    dcterms:title knora-api:objectType xsd:string .
+
+}
+
+

Note that it only makes sense to use dcterms:title in the simple schema, because +its object is supposed to be a literal.

+

Here is another example, using a non-DSP class:

+
PREFIX knora-api: <http://api.knora.org/ontology/knora-api/simple/v2#>
+PREFIX foaf: <http://xmlns.com/foaf/0.1/>
+
+CONSTRUCT {
+    ?person knora-api:isMainResource true .
+} WHERE {
+    ?person a foaf:Person .
+    ?person foaf:familyName ?familyName .
+    FILTER(?familyName = "Meier")
+}
+
+

This produces the error message:

+
Types could not be determined for one or more entities: ?person
+
+

The solution is to specify that ?person is a knora-api:Resource:

+
PREFIX knora-api: <http://api.knora.org/ontology/knora-api/simple/v2#>
+PREFIX foaf: <http://xmlns.com/foaf/0.1/>
+
+CONSTRUCT {
+    ?person knora-api:isMainResource true .
+} WHERE {
+    ?person a foaf:Person .
+    ?person a knora-api:Resource .
+    ?person foaf:familyName ?familyName .
+    FILTER(?familyName = "Meier")
+}
+
+

Inconsistent Types

+

Gravsearch will also reject a query if an entity is used with inconsistent types. +For example:

+
PREFIX incunabula: <http://0.0.0.0:3333/ontology/0803/incunabula/simple/v2#>
+PREFIX knora-api: <http://api.knora.org/ontology/knora-api/simple/v2#>
+
+CONSTRUCT {
+    ?book knora-api:isMainResource true ;
+        incunabula:pubdate ?pubdate .
+} WHERE {
+    ?book a incunabula:book ;
+        incunabula:pubdate ?pubdate .
+
+  FILTER(?pubdate = "JULIAN:1497-03-01") .
+}
+
+

This returns the error message:

+
One or more entities have inconsistent types:
+
+<http://0.0.0.0:3333/ontology/0803/incunabula/simple/v2#pubdate>
+  knora-api:objectType <http://api.knora.org/ontology/knora-api/simple/v2#Date> ;
+  knora-api:objectType <http://www.w3.org/2001/XMLSchema#string> .
+
+?pubdate rdf:type <http://api.knora.org/ontology/knora-api/simple/v2#Date> ;
+  rdf:type <http://www.w3.org/2001/XMLSchema#string> .
+
+

This is because the incunabula ontology says that the object of incunabula:pubdate must be a knora-api:Date, +but the FILTER expression compares ?pubdate with an xsd:string. The solution is to specify the +type of the literal in the FILTER:

+
PREFIX incunabula: <http://0.0.0.0:3333/ontology/0803/incunabula/simple/v2#>
+PREFIX knora-api: <http://api.knora.org/ontology/knora-api/simple/v2#>
+
+CONSTRUCT {
+    ?book knora-api:isMainResource true ;
+        incunabula:pubdate ?pubdate .
+} WHERE {
+    ?book a incunabula:book ;
+        incunabula:pubdate ?pubdate .
+
+  FILTER(?pubdate = "JULIAN:1497-03-01"^^knora-api:Date) .
+}
+
+

Scoping Issues

+

SPARQL is evaluated from the bottom up. +A UNION block therefore opens a new scope, in which variables bound at +higher levels are not necessarily in scope. This can cause unexpected results if queries +are not carefully designed. Gravsearch tries to prevent this by rejecting queries in the +following cases.

+

FILTER in UNION

+

A FILTER in a UNION block can only use variables that are bound in the same block, otherwise the query will be rejected. This query is invalid because ?text is not bound in the UNION block containing the FILTER where the variable is used:

+
PREFIX knora-api: <http://api.knora.org/ontology/knora-api/simple/v2#>
+PREFIX mls: <http://0.0.0.0:3333/ontology/0807/mls/simple/v2#>
+
+CONSTRUCT {
+    ?lemma knora-api:isMainResource true .
+    ?lemma mls:hasLemmaText ?text .        
+} WHERE {
+    ?lemma a mls:Lemma .
+    ?lemma mls:hasLemmaText ?text .
+
+    {
+        ?lemma mls:hasPseudonym ?pseudo .
+        FILTER regex(?pseudo, "Abel", "i") .
+    } UNION {
+        FILTER regex(?text, "Abel", "i") .
+    }
+}
+ORDER BY ASC(?text)
+OFFSET 0
+
+

It can be corrected like this:

+
PREFIX knora-api: <http://api.knora.org/ontology/knora-api/simple/v2#>
+PREFIX mls: <http://0.0.0.0:3333/ontology/0807/mls/simple/v2#>
+
+CONSTRUCT {
+    ?lemma knora-api:isMainResource true .
+    ?lemma mls:hasLemmaText ?text .        
+} WHERE {
+    ?lemma a mls:Lemma .
+    ?lemma mls:hasLemmaText ?text .
+
+    {
+        ?lemma mls:hasPseudonym ?pseudo .
+        FILTER regex(?pseudo, "Abel", "i") .
+    } UNION {
+        ?lemma mls:hasLemmaText ?text .
+        FILTER regex(?text, "Abel", "i") .
+    }
+}
+ORDER BY ASC(?text)
+OFFSET 0
+
+

ORDER BY

+

A variable used in ORDER BY must be bound at the top level of the WHERE clause. This query is invalid, because ?int is not bound at the top level of the WHERE clause:

+
PREFIX knora-api: <http://api.knora.org/ontology/knora-api/v2#>
+PREFIX anything: <http://0.0.0.0:3333/ontology/0001/anything/v2#>
+
+CONSTRUCT {
+    ?thing knora-api:isMainResource true .
+    ?thing anything:hasInteger ?int .
+    ?thing anything:hasRichtext ?richtext .
+    ?thing anything:hasText ?text .
+} WHERE {
+    ?thing a knora-api:Resource .
+    ?thing a anything:Thing .
+
+    {
+        ?thing anything:hasRichtext ?richtext .
+        FILTER knora-api:matchText(?richtext, "test")
+        ?thing anything:hasInteger ?int .
+    }
+    UNION
+    {
+        ?thing anything:hasText ?text .
+        FILTER knora-api:matchText(?text, "test")
+        ?thing anything:hasInteger ?int .
+    }
+}
+ORDER BY (?int)
+
+

It can be corrected like this:

+
PREFIX knora-api: <http://api.knora.org/ontology/knora-api/v2#>
+PREFIX anything: <http://0.0.0.0:3333/ontology/0001/anything/v2#>
+
+CONSTRUCT {
+    ?thing knora-api:isMainResource true .
+    ?thing anything:hasInteger ?int .
+    ?thing anything:hasRichtext ?richtext .
+    ?thing anything:hasText ?text .
+} WHERE {
+    ?thing a knora-api:Resource .
+    ?thing a anything:Thing .
+    ?thing anything:hasInteger ?int .
+
+    {
+        ?thing anything:hasRichtext ?richtext .
+        FILTER knora-api:matchText(?richtext, "test")
+    }
+    UNION
+    {
+        ?thing anything:hasText ?text .
+        FILTER knora-api:matchText(?text, "test")
+    }
+}
+ORDER BY (?int)
+
+

Query Optimization by Dependency

+

The query performance of triplestores, such as Fuseki, is highly dependent on the order of query +patterns. To improve performance, Gravsearch automatically reorders the +statement patterns in the WHERE clause according to their dependencies on each other, to minimise +the number of possible matches for each pattern.

+

Consider the following Gravsearch query:

+
PREFIX beol: <http://0.0.0.0:3333/ontology/0801/beol/v2#>
+PREFIX knora-api: <http://api.knora.org/ontology/knora-api/v2#>
+
+CONSTRUCT {
+  ?letter knora-api:isMainResource true .
+  ?letter ?linkingProp1  ?person1 .
+  ?letter ?linkingProp2  ?person2 .
+  ?letter beol:creationDate ?date .
+} WHERE {
+  ?letter beol:creationDate ?date .
+
+  ?letter ?linkingProp1 ?person1 .
+  FILTER(?linkingProp1 = beol:hasAuthor || ?linkingProp1 = beol:hasRecipient )
+
+  ?letter ?linkingProp2 ?person2 .
+  FILTER(?linkingProp2 = beol:hasAuthor || ?linkingProp2 = beol:hasRecipient )
+
+  ?person1 beol:hasIAFIdentifier ?gnd1 .
+  ?gnd1 knora-api:valueAsString "(DE-588)118531379" .
+
+  ?person2 beol:hasIAFIdentifier ?gnd2 .
+  ?gnd2 knora-api:valueAsString "(DE-588)118696149" .
+} ORDER BY ?date
+
+

Gravsearch optimises the performance of this query by moving these statements +to the top of the WHERE clause:

+
  ?gnd1 knora-api:valueAsString "(DE-588)118531379" .
+  ?gnd2 knora-api:valueAsString "(DE-588)118696149" .
+
+

The rest of the WHERE clause then reads:

+
  ?person1 beol:hasIAFIdentifier ?gnd1 .
+  ?person2 beol:hasIAFIdentifier ?gnd2 .
+  ?letter ?linkingProp1 ?person1 .
+  FILTER(?linkingProp1 = beol:hasAuthor || ?linkingProp1 = beol:hasRecipient )
+
+  ?letter ?linkingProp2 ?person2 .
+  FILTER(?linkingProp2 = beol:hasAuthor || ?linkingProp2 = beol:hasRecipient )
+ ?letter beol:creationDate ?date .
+
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/03-endpoints/api-v2/reading-and-searching-resources/index.html b/03-endpoints/api-v2/reading-and-searching-resources/index.html new file mode 100644 index 0000000000..4ab33a7a0e --- /dev/null +++ b/03-endpoints/api-v2/reading-and-searching-resources/index.html @@ -0,0 +1,3815 @@ + + + + + + + + + + + + + + + + + + + + + + + Reading and Searching Resources - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + + + + + +
+
+ + + + + + +

Reading and Searching Resources

+

To retrieve an existing resource, the HTTP method GET has to be used. +Reading resources may require authentication, since some resources may +have restricted viewing permissions.

+

Responses Describing Resources

+

Resources can be returned in +JSON-LD, +Turtle, +or RDF/XML, using +HTTP content negotiation (see +Response Formats).

+

Operations for reading and searching resources can return responses in either the +simple or the complex ontology schema. The complex schema is used by default. +To receive a response in the simple schema, use the HTTP request header or URL +parameter described in API Schema.

+

Each DSP-API v2 response describing one or more resources returns a +single RDF graph. For example, a request for a single resource returns that +resource and all its values. In a full-text search, the resource is returned with the +values that matched the search criteria. A response to an extended search +may represent a whole graph of interconnected resources.

+

In JSON-LD, if only one resource is returned, it is the top-level object; +if more than one resource is returned, they are represented as an array +of objects of the @graph member of the top-level object (see +Named Graphs in the +JSON-LD specification).

+

In the complex schema, dependent resources, i.e. resources that are referred +to by other resources on the top level, are nested in link value objects. +If resources on the top level are referred to by other resources and +these links are part of the response, virtual incoming links are generated; +see Gravsearch: Virtual Graph Search).

+

See the interfaces Resource and ResourcesSequence in module +ResourcesResponse (exists for both API schemas: ApiV2Simple and +ApiV2WithValueObjects).

+

Requesting Text Markup as XML

+

When requesting a text value with standoff markup, there are three possibilities:

+
    +
  1. The text value uses standard mapping.
  2. +
  3. The text value uses a custom mapping which does not specify an XSL transformation.
  4. +
  5. The text value uses a custom mapping which specifies an XSL transformation.
  6. +
+

In the first case, the mapping will be defined as:

+
"kb:textValueHasMapping": {
+        "@id": "http://rdfh.ch/standoff/mappings/StandardMapping"
+    }
+
+

the text value will only be available as kb:textValueAsXml, which will be of the following structure:

+
<?xml version="1.0" encoding="UTF-8"?>
+<text documentType="html">
+   ...
+</text>
+
+

where the content of <text> is a limited set of HTML tags that can be handled by CKEditor in DSP-APP. +This allows for both displaying and editing the text value.

+

In the second and third case, kb:textValueHasMapping will point to the custom mapping +that may or may not specify an XSL transformation.

+

If no transformation is specified (second case), the text value will be returned only as kb:textValueAsXml. +This property will be a string containing the contents of the initially uploaded XML.

+

Note: The returned XML document is equivalent to the uploaded document but it is not necessarily identical - +the order of the attributes in one element may vary from the original.

+

In the third case, when a transformation is specified, both kb:textValueAsXml and kb:textValueAsHtml will be returned. +kb:textValueAsHtml is the result of the XSL transformation applied to kb:textValueAsXml. +The HTML representation is intended to display the text value in a human readable and properly styled way, +while the XML representation can be used to update the text value.

+

Get the Representation of a Resource by IRI

+

Get a Full Representation of a Resource by IRI

+

A full representation of resource can be obtained by making a GET +request to the API providing its IRI. Because a DSP IRI has the format +of a URL, its IRI has to be URL-encoded.

+

To get the resource with the IRI http://rdfh.ch/c5058f3a (a +book from the sample Incunabula project, which is included in the DSP-API +server's test data), make a HTTP GET request to the resources +route (path segment resources in the API call) and append the +URL-encoded IRI:

+
HTTP GET to http://host/v2/resources/http%3A%2F%2Frdfh.ch%2Fc5058f3a
+
+

If necessary, several resources can be queried at the same time, their +IRIs separated by slashes. Please note that the amount of resources that +can be queried in one requested is limited. See the settings for +app/v2 in application.conf.

+

More formally, the URL looks like this:

+
HTTP GET to http://host/v2/resources/resourceIRI(/anotherResourceIri)*
+
+

Get a Full Representation of a Version of a Resource by IRI

+

To get a specific past version of a resource, use the route described in +Get a Full Representation of a Resource by IRI, +and add the URL parameter ?version=TIMESTAMP, where TIMESTAMP is an +xsd:dateTimeStamp in the +UTC timezone. The timestamp can either be URL-encoded, or submitted with all +punctuation (-, :, and .) removed (this is to accept timestamps +from DSP's ARK URLs).

+

The resource will be returned with the values that it had at the specified +time. Since DSP only versions values, not resource metadata (e.g. +rdfs:label), the current metadata will be returned.

+

Each value will be returned with the permissions that are attached to +the current version of the value +(see Permissions).

+

The returned resource will include the predicate knora-api:versionDate, +containing the timestamp that was submitted, and its knora-api:versionArkUrl +(see Resource Permalinks) will contain the +same timestamp.

+

Get a Value in a Resource

+

To get a specific value of a resource, use this route:

+
HTTP GET to http://host/v2/values/resourceIRI/valueUUID
+
+

The resource IRI must be URL-encoded. The path element valueUUID is the +string object of the value's knora-api:valueHasUUID.

+

The value will be returned within its containing resource, in the same format +as for Responses Describing Resources, +but without any of the resource's other values.

+

Get a Version of a Value in a Resource

+

To get a particular version of a specific value of a resource, use the route +described in Get a Value in a Resource, +and add the URL parameter ?version=TIMESTAMP, where TIMESTAMP is an +xsd:dateTimeStamp in the +UTC timezone. The timestamp can either be URL-encoded, or submitted with all +punctuation (-, :, and .) removed (this is to accept timestamps +from DSP's ARK URLs).

+

The value will be returned within its containing resource, in the same format +as for Responses Describing Resources, +but without any of the resource's other values.

+

Since DSP only versions values, not resource metadata (e.g. +rdfs:label), the current resource metadata will be returned.

+

The value will be returned with the permissions that are attached to +its current version +(see Permissions).

+

Get the Version History of a Resource

+

To get a list of the changes that have been made to a resource since its creation, +use this route:

+
HTTP GET to http://host/v2/resources/history/resourceIRI[?startDate=START_DATE&endDate=END_DATE]
+
+

The resource IRI must be URL-encoded. The start and end dates are optional, and +are URL-encoded timestamps in +xsd:dateTimeStamp format. +The start date is inclusive, and the end date is exclusive. +If the start date is not provided, the resource's history since its creation is returned. +If the end date is not provided, the resource's history up to the present is returned.

+

The response is a list of changes made to the resource, in reverse chronological order. +Each entry has the properties knora-api:author (the IRI of the user who made the change) and +knora-api:versionDate (the date when the change was made). For example:

+
{
+  "@graph" : [ {
+    "knora-api:author" : {
+      "@id" : "http://rdfh.ch/users/BhkfBc3hTeS_IDo-JgXRbQ"
+    },
+    "knora-api:versionDate" : {
+      "@type" : "xsd:dateTimeStamp",
+      "@value" : "2019-02-11T09:05:10Z"
+    }
+  }, {
+    "knora-api:author" : {
+      "@id" : "http://rdfh.ch/users/9XBCrDV3SRa7kS1WwynB4Q"
+    },
+    "knora-api:versionDate" : {
+      "@type" : "xsd:dateTimeStamp",
+      "@value" : "2019-02-10T10:30:10Z"
+    }
+  }, {
+    "knora-api:author" : {
+      "@id" : "http://rdfh.ch/users/BhkfBc3hTeS_IDo-JgXRbQ"
+    },
+    "knora-api:versionDate" : {
+      "@type" : "xsd:dateTimeStamp",
+      "@value" : "2019-02-10T10:05:10Z"
+    }
+  } ],
+  "@context" : {
+    "rdf" : "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
+    "rdfs" : "http://www.w3.org/2000/01/rdf-schema#",
+    "xsd" : "http://www.w3.org/2001/XMLSchema#",
+    "knora-api" : "http://api.knora.org/ontology/knora-api/v2#"
+  }
+}
+
+

The entries include all the dates when the resource's values were created or modified (within +the requested date range), as well as the date when the resource was created (if the requested +date range allows it). Each date is included only once. Since DSP only versions values, not +resource metadata (e.g. rdfs:label), changes to a resource's metadata are not included in its +version history.

+

To request the resource as it was at each of these dates, see +Get a Full Representation of a Version of a Resource by IRI. +For consistency in citation, we recommend using these dates when requesting resource versions.

+

Get the preview of a resource by IRI

+

In some cases, the client may only want to request the preview of a +resource, which just provides its metadata (e.g. its IRI, rdfs:label, +and type), without its values.

+

This works exactly like making a conventional resource request, using +the path segment resourcespreview:

+
HTTP GET to http://host/v2/resourcespreview/resourceIRI(/anotherResourceIri)*
+
+

Get a Graph of Resources

+

DSP can return a graph of connections between resources, e.g. for generating a network diagram.

+
HTTP GET to http://host/v2/graph/resourceIRI[depth=Integer]
+[direction=outbound|inbound|both][excludeProperty=propertyIri]
+
+

The first parameter must be preceded by a question mark ?, any +following parameter by an ampersand &.

+
    +
  • depth must be at least 1. The maximum depth is a DSP configuration setting. + The default is 4.
  • +
  • direction specifies the direction of the links to be queried, i.e. links to + and/or from the given resource. The default is outbound.
  • +
  • excludeProperty is an optional link property to be excluded from the + results.
  • +
+

To accommodate large graphs, the graph response format is very concise, and is therefore +simpler than the usual resources response format. Each resource represented only by its IRI, +class, and label. Direct links are shown instead of link values. For example:

+
{
+  "@graph" : [ {
+    "@id" : "http://rdfh.ch/0001/0C-0L1kORryKzJAJxxRyRQ",
+    "@type" : "anything:Thing",
+    "rdfs:label" : "Sierra"
+  }, {
+    "@id" : "http://rdfh.ch/0001/A67ka6UQRHWf313tbhQBjw",
+    "@type" : "anything:Thing",
+    "rdfs:label" : "Victor"
+  }, {
+    "@id" : "http://rdfh.ch/0001/Lz7WEqJETJqqsUZQYexBQg",
+    "@type" : "anything:Thing",
+    "rdfs:label" : "Foxtrot"
+  }, {
+    "@id" : "http://rdfh.ch/0001/WLSHxQUgTOmG1T0lBU2r5w",
+    "@type" : "anything:Thing",
+    "anything:hasOtherThing" : {
+      "@id" : "http://rdfh.ch/0001/A67ka6UQRHWf313tbhQBjw"
+    },
+    "rdfs:label" : "Tango"
+  }, {
+    "@id" : "http://rdfh.ch/0001/start",
+    "@type" : "anything:Thing",
+    "anything:hasOtherThing" : [ {
+      "@id" : "http://rdfh.ch/0001/0C-0L1kORryKzJAJxxRyRQ"
+    }, {
+      "@id" : "http://rdfh.ch/0001/WLSHxQUgTOmG1T0lBU2r5w"
+    }, {
+      "@id" : "http://rdfh.ch/0001/tPfZeNMvRVujCQqbIbvO0A"
+    } ],
+    "rdfs:label" : "Romeo"
+  }, {
+    "@id" : "http://rdfh.ch/0001/tPfZeNMvRVujCQqbIbvO0A",
+    "@type" : "anything:Thing",
+    "anything:hasOtherThing" : {
+      "@id" : "http://rdfh.ch/0001/Lz7WEqJETJqqsUZQYexBQg"
+    },
+    "rdfs:label" : "Echo"
+  } ],
+  "@context" : {
+    "rdf" : "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
+    "knora-api" : "http://api.knora.org/ontology/knora-api/v2#",
+    "rdfs" : "http://www.w3.org/2000/01/rdf-schema#",
+    "xsd" : "http://www.w3.org/2001/XMLSchema#",
+    "anything" : "http://0.0.0.0:3333/ontology/0001/anything/v2#"
+  }
+}
+
+

Search for Resources

+

Search for a Resource by its rdfs:label

+

DSP offers the possibility to search for resources by their +rdfs:label. The use case for this search is to find a specific +resource as you type. E.g., the user wants to get a list of resources +whose rdfs:label contain some search terms separated by a whitespace +character:

+
    +
  • Zeit
  • +
  • Zeitg
  • +
  • ...
  • +
  • Zeitglöcklein d
  • +
  • ...
  • +
  • Zeitglöcklein des Lebens
  • +
+

With each character added to the last term, the selection gets more +specific. The first term should at least contain three characters. To +make this kind of "search as you type" possible, a wildcard character is +automatically added to the last search term.

+

Characters provided by the user that have a special meaning in the Lucene Query Parser +syntax need to be escaped. If a user wants to search for the string "Zeit-Glöcklein", she +needs to type "Zeit-Glöcklein". The special characters that need escaping are: ++, -, &, |, !, (, ), [, ], {, }, ^, ", ~, *, ?, :, \, /

+
HTTP GET to http://host/v2/searchbylabel/searchValue[limitToResourceClass=resourceClassIRI]
+[limitToProject=projectIRI][offset=Integer]
+
+

The first parameter must be preceded by a question mark ?, any +following parameter by an ampersand &.

+

The default value for the parameter offset is 0, which returns the +first page of search results. Subsequent pages of results can be fetched +by increasing offset by one. The amount of results per page is defined +in app/v2 in application.conf.

+

For performance reasons, standoff markup is not queried for this route.

+

To request the number of results rather than the results themselves, you can +do a count query:

+
HTTP GET to http://host/v2/searchbylabel/count/searchValue[limitToResourceClass=resourceClassIRI][limitToProject=projectIRI][offset=Integer]
+
+

The response to a count query request is an object with one predicate, +http://schema.org/numberOfItems, with an integer value.

+ +

DSP offers a full-text search that searches through all textual +representations of values and rdfs:label of resources. +Full-text search supports the +Lucene Query Parser syntax. +Note that Lucene's default operator is a logical OR when submitting several search terms.

+

The search index used by DSP transforms all text into lower case characters and splits text into tokens by whitespace. +For example, if a text value is: The cake needs flour, sugar, and butter., +the tokens are the, cake, needs, flour,, sugar,, and, butter.. +Note that punctuation marks like , and . are left with the word where they occurred. +Therefore, if you search for sugar you would have to use sugar* or sugar? +to get results that contain sugar, or sugar. as well. +The reason for this kind of tokenization is +that some users need to be able to search explicitly for special characters including punctuation marks.

+

Alphabetic, numeric, symbolic, and diacritical Unicode characters +which are not in the first 127 ASCII characters (the "Basic Latin" Unicode block) +are converted into their ASCII equivalents, if one exists, e.g. é or ä are converted into e and a.

+

Please note that the search terms have to be URL-encoded.

+
HTTP GET to http://host/v2/search/searchValue[limitToResourceClass=resourceClassIRI]
+[limitToStandoffClass=standoffClassIri][limitToProject=projectIRI][offset=Integer]
+
+

The first parameter has to be preceded by a question mark ?, any following parameter by an ampersand &.

+

A search value must have a minimal length of three characters (default value) +as defined in search-value-min-length in application.conf.

+

A search term may contain wildcards. A ? represents a single character. +It has to be URL-encoded as %3F since it has a special meaning in the URL syntax. +For example, the term Uniform can be search for like this:

+
HTTP GET to http://host/v2/search/Unif%3Frm
+
+

A * represents zero, one or multiple characters. For example, the term Uniform can be searched for like this:

+
HTTP GET to http://host/v2/search/Uni*m
+
+

The default value for the parameter offset is 0 which returns the +first page of search results. Subsequent pages of results can be fetched +by increasing offset by one. The amount of results per page is defined +in results-per-page in application.conf.

+

If the parameter limitToStandoffClass is provided, DSP will look for search terms +that are marked up with the indicated standoff class.

+

If the parameter returnFiles=true is provided, DSP will return any +file value attached to each matching resource.

+

To request the number of results rather than the results themselves, you can +do a count query:

+
HTTP GET to http://host/v2/search/count/searchValue[limitToResourceClass=resourceClassIRI][limitToStandoffClass=standoffClassIri][limitToProject=projectIRI][offset=Integer]
+
+

The first parameter has to be preceded by a question +mark ?, any following parameter by an ampersand &.

+

The response to a count query request is an object with one predicate, +http://schema.org/numberOfItems, with an integer value.

+

Gravsearch

+

For more complex queries than a full-text search, DSP offers a query language +called Gravsearch: Virtual Graph Search).

+

Support of TEI/XML

+

To convert standoff markup to TEI/XML, see TEI/XML.

+

IIIF Manifests

+

This is an experimental feature and may change.

+

To generate a IIIF manifest for a resource, containing +the still image representations that have knora-api:isPartOf (or a subproperty) +pointing to that resource:

+
HTTP GET to http://host/v2/resources//iiifmanifest/RESOURCE_IRI
+
+

Reading Resources by Class from a Project

+

To facilitate the development of tabular user interfaces for data entry, it is +possible to get a paged list of all the resources belonging to a particular +class in a given project, sorted by the value of a property:

+
HTTP GET to http://host/v2/resources?resourceClass=RESOURCE_CLASS_IRI&page=PAGE[&orderByProperty=PROPERTY_IRI]
+
+

This is useful only if the project does not contain a large amount of data; +otherwise, you should use Gravsearch to search +using more specific criteria.

+

The specified class and property are used without inference; they will not +match subclasses or subproperties.

+

The HTTP header X-Knora-Accept-Project must be submitted; its value is +a DSP project IRI. In the request URL, the values of resourceClass and orderByProperty +are URL-encoded IRIs in the complex schema. +The orderByProperty parameter is optional; if it is not supplied, resources will +be sorted alphabetically by resource IRI (an arbitrary but consistent order). +The value of page is a 0-based integer page number. Paging works as it does +in Gravsearch).

+

Get the Full History of a Resource and its Values as Events

+

To get a list of the changes that have been made to a resource and its values since its creation as events ordered by +date:

+
HTTP GET to http://host/v2/resources/resourceHistoryEvents/<resourceIRI>
+
+

The resource IRI must be URL-encoded. The response is a list of events describing changes made to the resource and its values, + in chronological order. Each entry has the properties: + knora-api:eventType (the type of the operation performed on a specific date. The operation can be either + createdResource, updatedResourceMetadata, deletedResource, createdValue, updatedValueContent, + updatedValuePermissions, or deletedValue.), +knora-api:versionDate (the date when the change was made), +knora-api:author (the IRI of the user who made the change), +knora-api:eventBody (the information necessary to make the same request).

+

For example, the following response contains the list of events describing the version history of the resource +http://rdfh.ch/0001/thing-with-history ordered by date:

+
{
+  "@graph" : [ 
+        {
+            "knora-api:eventType": "createdResource",
+            "knora-api:author": {
+                "@id": "http://rdfh.ch/users/9XBCrDV3SRa7kS1WwynB4Q"
+            },
+            "knora-api:eventBody": {
+                "rdfs:label": "A thing with version history",
+                "knora-api:resourceIri": "http://rdfh.ch/0001/thing-with-history",
+                "knora-api:resourceClassIri": "http://www.knora.org/ontology/0001/anything#Thing",
+                "knora-api:hasPermissions": "CR knora-admin:Creator|M knora-admin:ProjectMember|V knora-admin:UnknownUser",
+                "knora-api:creationDate": {
+                    "@value": "2019-02-08T15:05:10Z",
+                    "@type": "xsd:dateTimeStamp"
+                },
+                "knora-api:attachedToProject": {
+                    "@id": "http://rdfh.ch/projects/0001"
+                }
+            },
+            "knora-api:versionDate": {
+                "@value": "2019-02-08T15:05:10Z",
+                "@type": "xsd:dateTimeStamp"
+            }
+        },
+        {
+            "knora-api:eventType": "createdValue",
+            "knora-api:author": {
+                "@id": "http://rdfh.ch/users/9XBCrDV3SRa7kS1WwynB4Q"
+            },
+            "knora-api:eventBody": {
+                "knora-api:resourceIri": "http://rdfh.ch/0001/thing-with-history",
+            "knora-api:resourceClassIri": "http://www.knora.org/ontology/0001/anything#Thing",
+                "knora-api:valueCreationDate": {
+                    "@value": "2019-02-10T10:30:10Z",
+                    "@type": "xsd:dateTimeStamp"
+                },
+                "knora-api:valueHasUUID": "IZGOjVqxTfSNO4ieKyp0SA",
+                "knora-api:hasPermissions": "V knora-admin:UnknownUser|M knora-admin:ProjectMember",
+                "@type": "knora-base:LinkValue",
+                "http://www.knora.org/ontology/0001/anything#hasOtherThingValue": {
+                    "knora-api:linkValueHasTargetIri": {
+                        "@id": "http://rdfh.ch/0001/2qMtTWvVRXWMBcRNlduvCQ"
+                    }
+                },
+                "rdf:Property": "http://www.knora.org/ontology/0001/anything#hasOtherThingValue",
+                "@id": "http://rdfh.ch/0001/thing-with-history/values/3a"
+            },
+            "knora-api:versionDate": {
+                "@value": "2019-02-10T10:30:10Z",
+                "@type": "xsd:dateTimeStamp"
+            }
+        },
+        {
+            "knora-api:eventType": "updatedValueContent",
+            "knora-api:author": {
+                "@id": "http://rdfh.ch/users/BhkfBc3hTeS_IDo-JgXRbQ"
+            },
+            "knora-api:eventBody": {
+                "knora-api:resourceIri": "http://rdfh.ch/0001/thing-with-history",
+                "knora-api:resourceClassIri": "http://www.knora.org/ontology/0001/anything#Thing"
+                "http://www.knora.org/ontology/0001/anything#hasText": {
+                    "knora-api:valueAsString": "two"
+                },
+                "knora-api:valueCreationDate": {
+                    "@value": "2019-02-11T10:05:10Z",
+                    "@type": "xsd:dateTimeStamp"
+                },
+                "knora-base:previousValue": "http://rdfh.ch/0001/thing-with-history/values/2a",
+                "knora-api:valueHasUUID": "W5fm67e0QDWxRZumcXcs6g",
+                "@type": "knora-base:TextValue",
+                "rdf:Property": "http://www.knora.org/ontology/0001/anything#hasText",
+                "@id": "http://rdfh.ch/0001/thing-with-history/values/2b"
+            },
+            "knora-api:versionDate": {
+                "@value": "2019-02-11T10:05:10Z",
+                "@type": "xsd:dateTimeStamp"
+            }
+        },
+        {
+            "knora-api:eventType": "deletedValue",
+            "knora-api:author": {
+                "@id": "http://rdfh.ch/users/9XBCrDV3SRa7kS1WwynB4Q"
+            },
+            "knora-api:eventBody": {
+                "knora-api:resourceIri": "http://rdfh.ch/0001/thing-with-history",
+                "knora-api:resourceClassIri": "http://www.knora.org/ontology/0001/anything#Thing",
+                "knora-base:previousValue": "http://rdfh.ch/0001/thing-with-history/values/3a",
+                "knora-api:deleteDate": {
+                    "@type": "xsd:dateTimeStamp",
+                    "@value": "2019-02-13T09:00:10Z"
+                },
+                "knora-api:isDeleted": true,
+                "@type": "knora-base:LinkValue",
+                "rdf:Property": "http://www.knora.org/ontology/0001/anything#hasOtherThingValue",
+                "@id": "http://rdfh.ch/0001/thing-with-history/values/3b"
+            },
+            "knora-api:versionDate": {
+                "@value": "2019-02-13T09:00:10Z",
+                "@type": "xsd:dateTimeStamp"
+            }
+        }
+    ],
+  "@context" : {
+    "rdf" : "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
+    "rdfs" : "http://www.w3.org/2000/01/rdf-schema#",
+    "xsd" : "http://www.w3.org/2001/XMLSchema#",
+    "knora-api" : "http://api.knora.org/ontology/knora-api/v2#"
+  }
+}
+
+

Since the history of changes made to the metadata of a resource is not part of resouce's version history, there are no +events describing the changes on metadata elements like its rdfs:label or rdfs:comment. +The only record depicting a change in a resource's metadata is the knora-api:lastModificationDate of the resource. Thus +the event updatedResourceMetadata indicates a change in a resource's metadata, its knora-api:eventBody contains the +payload needed to update the value of the resource's lastModificationDate, see +modifying metadata of a resource.

+

Get the Full History of all Resources of a Project as Events

+

To get a list of the changes that have been made to the resources and their values of a project as events ordered by +date:

+
HTTP GET to http://host/v2/resources/projectHistoryEvents/<projectIRI>
+
+

The project IRI must be URL-encoded. The response contains the resource history events of all resources that belong to +the specified project.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/03-endpoints/api-v2/reading-user-permissions/index.html b/03-endpoints/api-v2/reading-user-permissions/index.html new file mode 100644 index 0000000000..3d69cc53cf --- /dev/null +++ b/03-endpoints/api-v2/reading-user-permissions/index.html @@ -0,0 +1,2903 @@ + + + + + + + + + + + + + + + + + + + + + + + Reading the User's Permissions on Resources and Values - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + +

Reading the User's Permissions on Resources and Values

+

In the complex API schema, each +resource and value is returned with the predicate knora-api:userHasPermission. +The object of this predicate is a string containing a permission code, which +indicates the requesting user's maximum permission on the resource or value. +These are the possible permission codes, in ascending order:

+
    +
  • RV: restricted view permission (least privileged)
  • +
  • V: view permission
  • +
  • M modify permission
  • +
  • D: delete permission
  • +
  • CR: change rights permission (most privileged)
  • +
+

Each permission implies all lesser permissions. For more details, see +Permissions.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/03-endpoints/api-v2/text/custom-standoff/index.html b/03-endpoints/api-v2/text/custom-standoff/index.html new file mode 100644 index 0000000000..ea758940ef --- /dev/null +++ b/03-endpoints/api-v2/text/custom-standoff/index.html @@ -0,0 +1,3520 @@ + + + + + + + + + + + + + + + + + + + + + + + Custom Standoff Mapping - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + + + + + +
+
+ + + + + + +

XML to Standoff Mapping in API v2

+

Creating a custom Mapping

+

The DSP-API's standard standoff mapping only supports a few HTML tags. In order to +submit more complex XML markup, a custom mapping has to be +created first. A mapping expresses the relations between XML +elements and attributes, and their corresponding standoff classes and +properties. The relations expressed in a mapping are one-to-one +relations, so the XML can be recreated from the data in RDF. However, +since HTML offers a very limited set of elements, custom mappings support +the combination of element names and classes. In this way, the same +element can be used several times in combination with another classname +(please note that <a> without a class is a hyperlink whereas <a class="salsah-link"> is an internal link/standoff link).

+

With a mapping, a default XSL transformation may be provided to +transform the XML to HTML before sending it back to the client. This is +useful when the client is a web-browser expecting HTML (instead of XML).

+

Basic Structure of a Mapping

+

The mapping is written in XML itself (for a formal description, see +webapi/src/resources/mappingXMLToStandoff.xsd). It has the following +structure (the indentation corresponds to the nesting in XML):

+
    +
  • <mapping>: the root element
      +
    • <defaultXSLTransformation> (optional): the IRI of the + default XSL transformation to be applied to the XML when + reading it back from DSP-API. The XSL transformation is + expected to produce HTML. If given, the IRI has to refer to + a resource of type knora-base:XSLTransformation.
    • +
    • <mappingElement>: an element of the mapping (at least one)
        +
      • <tag>: information about the XML element that is mapped to a standoff class
          +
        • <name>: name of the XML element
        • +
        • <class>: value of the class attribute of + the XML element, if any. If the element has + no class attribute, the keyword noClass + has to be used.
        • +
        • <namespace>: the namespace the XML element + belongs to, if any. If the element does not + belong to a namespace, the keyword + noNamespace has to be used.
        • +
        • <separatesWords>: a Boolean value + indicating whether this tag separates words + in the text. Once an XML document is + converted to RDF-standoff the markup is + stripped from the text, possibly leading to + continuous text that has been separated by + tags before. For structural tags like + paragraphs etc., <separatesWords> can be + set to true in which case a special + separator is inserted in the text in the + RDF representation. In this way, words stay + separated and are represented in the + fulltext index as such.
        • +
        +
      • +
      • <standoffClass>: information about the standoff class the XML element is mapped to
          +
        • <classIri>: IRI of the standoff class the XML element is mapped to
        • +
        • <attributes>: XML attributes to be mapped to standoff properties (other than id or class), if any
            +
          • <attribute>: an XML attribute to be mapped to a standoff property, may be repeated
              +
            • <attributeName>: the name of the XML attribute
            • +
            • <namespace>: the namespace the attribute belongs to, if any. + If the attribute does not belong to a namespace, the keyword noNamespace has to be used.
            • +
            • <propertyIri>: the IRI of the standoff property the XML attribute is mapped to.
            • +
            +
          • +
          +
        • +
        • <datatype>: the data type of the standoff class, if any.
            +
          • <type>: the IRI of the data type standoff class
          • +
          • <attributeName>: the name of the attribute holding the typed value in the expected standard format
          • +
          +
        • +
        +
      • +
      +
    • +
    +
  • +
+

XML structure of a mapping:

+
<?xml version="1.0" encoding="UTF-8"?>
+<mapping>
+    <defaultXSLTransformation>Iri of a knora-base:XSLTransformation</defaultXSLTransformation>
+    <mappingElement>
+        <tag>
+            <name>XML element name</name>
+            <class>XML class name or "noClass"</class>
+            <namespace>XML namespace or "noNamespace"</namespace>
+            <separatesWords>true or false</separatesWords>
+        </tag>
+        <standoffClass>
+            <classIri>standoff class Iri</classIri>
+            <attributes>
+                <attribute>
+                    <attributeName>XML attribute name</attributeName>
+                    <namespace>XML namespace or "noNamespace"</namespace>
+                    <propertyIri>standoff property Iri</propertyIri>
+                </attribute>
+            </attributes>
+            <datatype>
+                <type>standoff data type class</type>
+                <attributeName>XML attribute with the typed value</attributeName>
+            </datatype>
+        </standoffClass>
+    </mappingElement>
+    <mappingElement>
+       ...
+    </mappingElement>
+</mapping>
+
+

Please note that the absence of an XML namespace and/or a class have to +be explicitly stated using the keywords noNamespace and +noClass. This is because we use XML Schema validation to ensure the one-to-one +relations between XML elements and standoff classes. XML Schema validation's unique checks +do not support optional values.

+

id and class Attributes

+

The id and class attributes are supported by default and do not have +to be included in the mapping like other attributes. The id attribute +identifies an element and must be unique in the document. id is an +optional attribute. The class attribute allows for the reuse of an +element in the mapping, i.e. the same element can be combined with +different class names and mapped to different standoff classes (mapping +element <class> in <tag>).

+

Respecting Cardinalities

+

A mapping from XML elements and attributes to standoff classes and +standoff properties must respect the cardinalities defined in the +ontology for those very standoff classes. If an XML element is mapped to +a certain standoff class and this class requires a standoff property, an +attribute must be defined for the XML element mapping to that very +standoff property. Equally, all mappings for attributes of an XML +element must have corresponding cardinalities for standoff properties +defined for the standoff class the XML element maps to.

+

However, since an XML attribute may occur once at maximum, it makes +sense to make the corresponding standoff property required +(owl:cardinality of one) in the ontology or optional +(owl:maxCardinality of one), but not allowing it more than once.

+

Standoff Data Types

+

DSP-API allows the use of all its value types as standoff data types +(defined in knora-base.ttl):

+
    +
  • knora-base:StandoffLinkTag: Represents a reference to a + resource (the IRI of the target resource must be submitted in the + data type attribute).
  • +
  • knora-base:StandoffInternalReferenceTag: Represents an internal + reference inside a document (the id of the target element inside the + same document must be indicated in the data type attribute); see + Internal References in an XML Document.
  • +
  • knora-base:StandoffUriTag: Represents a reference to a URI (the + URI of the target resource must be submitted in the data type + attribute).
  • +
  • knora-base:StandoffDateTag: Represents a date (a date + string must be submitted in the data type attribute, e.g. + GREGORIAN:2017-01-27).
  • +
  • knora-base:StandoffColorTag: Represents a color (a hexadecimal + RGB color string must be submitted in the data type attribute, e.g. + #0000FF).
  • +
  • knora-base:StandoffIntegerTag: Represents an integer (the integer + must be submitted in the data type attribute).
  • +
  • knora-base:StandoffDecimalTag: Represents a number with fractions + (the decimal number must be submitted in the data type attribute, + e.g. 1.1).
  • +
  • knora-base:StandoffIntervalTag: Represents an interval (two + decimal numbers separated with a comma must be submitted in the data + type attribute, e.g. 1.1,2.2).
  • +
  • knora-base:StandoffBooleanTag: Represents a Boolean value (true + or false must be submitted in the data type attribute).
  • +
  • knora-base:StandoffTimeTag: Represents a timestamp value (an xsd:dateTimeStamp + must be submitted in the data type attribute).
  • +
+

The basic idea is that parts of a text can be marked up in a way that +allows using DSP-API's built-in data types. In order to do so, the typed +values have to be provided in a standardized way in an attribute that +has to be defined in the mapping.

+

Data type standoff classes are standoff classes with predefined +properties (e.g., a knora-base:StandoffLinkTag has a +knora-base:standoffTagHasLink and a knora-base:StandoffIntegerTag +has a knora-base:valueHasInteger). Please note the data type standoff +classes can not be combined, i.e. a standoff class can only be the +subclass of one data type standoff class. However, standoff data +type classes can be subclassed and extended further by assigning +properties to them (see below).

+

The following simple mapping illustrates this principle:

+
<?xml version="1.0" encoding="UTF-8"?>
+<mapping>
+     <mappingElement>
+        <tag>
+            <name>text</name>
+            <class>noClass</class>
+            <namespace>noNamespace</namespace>
+            <separatesWords>false</separatesWords>
+        </tag>
+        <standoffClass>
+            <classIri>http://www.knora.org/ontology/standoff#StandoffRootTag</classIri>
+        </standoffClass>
+    </mappingElement>
+
+    <mappingElement>
+        <tag>
+            <name>mydate</name>
+            <class>noClass</class>
+            <namespace>noNamespace</namespace>
+            <separatesWords>false</separatesWords>
+        </tag>
+        <standoffClass>
+            <classIri>http://www.knora.org/ontology/0001/anything#StandoffEventTag</classIri>
+            <attributes>
+                <attribute>
+                    <attributeName>description</attributeName>
+                    <namespace>noNamespace</namespace>
+                    <propertyIri>http://www.knora.org/ontology/0001/anything#standoffEventTagHasDescription</propertyIri>
+                </attribute>
+            </attributes>
+            <datatype>
+                <type>http://www.knora.org/ontology/knora-base#StandoffDateTag</type>
+                <attributeName>knoraDate</attributeName>
+            </datatype>
+        </standoffClass>
+    </mappingElement>
+</mapping>
+
+

<datatype> must hold the IRI of a standoff data type class (see +list above). The <classIri> must be a subclass of this type or this +type itself (the latter is probably not recommendable since semantics +are missing: what is the meaning of the date?). In the example above, +the standoff class is anything:StandoffEventTag which has the +following definition in the ontology anything-onto.ttl:

+
anything:StandoffEventTag rdf:type owl:Class ;
+
+    rdfs:subClassOf knora-base:StandoffDateTag,
+                   [
+                      rdf:type owl:Restriction ;
+                      owl:onProperty :standoffEventTagHasDescription ;
+                      owl:cardinality "1"^^xsd:nonNegativeInteger
+                   ] ;
+
+    rdfs:label "Represents an event in a TextValue"@en ;
+
+    rdfs:comment """Represents an event in a TextValue"""@en .
+
+

anything:StandoffEventTag is a subclass of +knora-base:StandoffDateTag and therefore has the data type date. It +also requires the standoff property +anything:standoffEventTagHasDescription which is defined as an +attribute in the mapping.

+

Once the mapping has been created, an XML like the following could be +sent to DSP-API and converted to standoff:

+
<?xml version="1.0" encoding="UTF-8"?>
+<text>
+    We had a party on <mydate description="new year" knoraDate="GREGORIAN:2016-12-31">New Year's Eve</mydate>. 
+    It was a lot of fun.
+</text>
+
+

The attribute holds the date in the format of a DSP-API date string (the +format is also documented in the typescript type alias dateString in +module basicMessageComponents. There you will also find documentation +about the other types like color etc.). DSP-API date strings have this +format: GREGORIAN|JULIAN):YYYY[-MM[-DD]][:YYYY[-MM[-DD]]]. This allows +for different formats as well as for imprecision and periods. Intervals +are submitted as one attribute in the following format: +interval-attribute="1.0,2.0" (two decimal numbers separated with a +comma).

+

You will find a sample mapping with all the data types and a sample XML +file in the the test data: +test_data/test_route/texts/mappingForHTML.xml and +test_data/test_route/texts/HTML.xml.

+

Internal References in an XML Document

+

Internal references inside an XML document can be represented using the +data type standoff class knora-base:StandoffInternalReferenceTag or a +subclass of it. This class has a standoff property that points to a +standoff node representing the target XML element when converted to RDF.

+

The following example shows the definition of a mapping element for an +internal reference (for reasons of simplicity, only the mapping element +for the element is question is depicted):

+
<?xml version="1.0" encoding="UTF-8"?>
+<mappingElement>
+    <tag>
+        <name>ref</name>
+        <class>noClass</class>
+        <namespace>noNamespace</namespace>
+        <separatesWords>false</separatesWords>
+    </tag>
+    <standoffClass>
+        <classIri>http://www.knora.org/ontology/knora-base#StandoffInternalReferenceTag</classIri>
+        <datatype>
+            <type>http://www.knora.org/ontology/knora-base#StandoffInternalReferenceTag</type>
+            <attributeName>internalRef</attributeName>
+        </datatype>
+    </standoffClass>
+</mappingElement>
+
+

Now, an internal reference to an element in the same document can be +made that will be converted to a pointer in RDF:

+
<?xml version="1.0" encoding="UTF-8"?>
+<text>
+    This is an <sample id="1">element</sample> and here is a reference to <ref internalRef="#1">it</ref>.
+</text>
+
+

An internal reference in XML has to start with a # followed by the +value of the id attribute of the element referred to.

+

Predefined Standoff Classes and Properties

+

The standoff ontology standoff-onto.ttl offers a set of predefined +standoff classes that can be used in a custom mapping like the +following:

+
<?xml version="1.0" encoding="UTF-8"?>
+<mapping>
+    <mappingElement>
+        <tag>
+            <name>myDoc</name>
+            <class>noClass</class>
+            <namespace>noNamespace</namespace>
+            <separatesWords>false</separatesWords>
+        </tag>
+        <standoffClass>
+            <classIri>http://www.knora.org/ontology/standoff#StandoffRootTag</classIri>
+            <attributes>
+                <attribute>
+                    <attributeName>documentType</attributeName>
+                    <namespace>noNamespace</namespace>
+                    <propertyIri>http://www.knora.org/ontology/standoff#standoffRootTagHasDocumentType</propertyIri>
+                </attribute>
+            </attributes>
+        </standoffClass>
+    </mappingElement>
+
+    <mappingElement>
+        <tag>
+            <name>p</name>
+            <class>noClass</class>
+            <namespace>noNamespace</namespace>
+            <separatesWords>true</separatesWords>
+        </tag>
+        <standoffClass>
+            <classIri>http://www.knora.org/ontology/standoff#StandoffParagraphTag</classIri>
+        </standoffClass>
+    </mappingElement>
+
+    <mappingElement>
+        <tag>
+            <name>i</name>
+            <class>noClass</class>
+            <namespace>noNamespace</namespace>
+            <separatesWords>false</separatesWords>
+        </tag>
+        <standoffClass>
+            <classIri>http://www.knora.org/ontology/standoff#StandoffItalicTag</classIri>
+        </standoffClass>
+    </mappingElement>
+</mapping>
+
+

Predefined standoff classes may be used by various projects, each +providing a custom mapping to be able to recreate the original XML from +RDF. Predefined standoff classes may also be inherited and extended in +project specific ontologies.

+

The mapping above allows for an XML like this:

+
<?xml version="1.0" encoding="UTF-8"?>
+<myDoc documentType="letter">
+    <p>
+        This my text that is <i>very</i> interesting.
+    </p>
+    <p>
+        And here it goes on.
+    </p>
+</myDoc>
+
+

Respecting Property Types

+

When mapping XML attributes to standoff properties, attention has to be +paid to the properties' object constraints.

+

In the ontology, standoff property literals may have one of the +following knora-base:objectDatatypeConstraint:

+
    +
  • xsd:string
  • +
  • xsd:integer
  • +
  • xsd:boolean
  • +
  • xsd:decimal
  • +
  • xsd:anyURI
  • +
+

In XML, all attribute values are submitted as strings. However, these +string representations need to be convertible to the types defined in +the ontology. If they are not, the request will be rejected. It is +recommended to enforce types on attributes by applying XML Schema +validations (restrictions).

+

Links (object property) to a knora-base:Resource can be represented +using the data type standoff class knora-base:StandoffLinkTag, +internal links using the data type standoff class +knora-base:StandoffInternalReferenceTag.

+

Validating a Mapping and sending it to DSP-API

+

A mapping can be validated before sending it to DSP-API with the following +XML Schema file: webapi/src/resources/mappingXMLToStandoff.xsd. Any +mapping that does not conform to this XML Schema file will be rejected +by DSP-API.

+

The mapping has to be sent as a multipart request to the standoff route +using the path segment mapping:

+
HTTP POST http://host/v2/mapping
+
+

The multipart request consists of two named parts:

+
"json":
+
+  {
+      "knora-api:mappingHasName": "My Mapping",
+      "knora-api:attachedToProject": "projectIRI",
+      "rdfs:label": "MappingNameSegment",
+      "@context": {
+          "rdfs": "http://www.w3.org/2000/01/rdf-schema#",
+          "knora-api": "http://api.knora.org/ontology/knora-api/v2#"
+      }
+  }
+
+"xml":
+
+  <?xml version="1.0" encoding="UTF-8"?>
+  <mapping>
+      ...
+  </mapping>
+
+

A successful response returns the IRI of the mapping. However, the IRI +of a mapping is predictable: it consists of the project Iri followed by +/mappings/ and the knora-api:mappingHasName submitted in the JSON-LD (if the name +already exists, the request will be rejected). Once created, a mapping +can be used to create TextValues in Knora. The formats are documented in +the v2 typescript interfaces AddMappingRequest and AddMappingResponse +in module MappingFormats

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/03-endpoints/api-v2/text/overview/index.html b/03-endpoints/api-v2/text/overview/index.html new file mode 100644 index 0000000000..90ef2e0d35 --- /dev/null +++ b/03-endpoints/api-v2/text/overview/index.html @@ -0,0 +1,3109 @@ + + + + + + + + + + + + + + + + + + + + + + + Overview - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Overview

+

DSP-API supports various ways of handling textual data:

+

Text in RDF

+

Textual data can be included directly in the data stored in DSP-API. +This is the default way of handling text in the DSP. +There are three ways of representing textual data in DSP-API, +two of which are fully supported by DSP-APP and DSP-TOOLS.

+

Texts stored in RDF can be searched using both full-text search and structured queries.

+

Simple Text

+

If a text requires no formatting, it can simply be stored as a string in a knora-base:TextValue. +This is sufficient in many cases, especially for shorter texts like names, titles, identifiers, etc.

+

Text with Formatting

+

For text requiring regular markup, knora-base:TextValue can be used +in combination with the DSP's standard standoff markup.

+

This allows for the following markup:

+
    +
  • structural markup
      +
    • paragraphs
    • +
    • headings levels 1-6
    • +
    • ordered lists
    • +
    • unordered lists
    • +
    • tables
    • +
    • line breaks
    • +
    • horizontal rules
    • +
    • code blocks
    • +
    • block quotes
    • +
    +
  • +
  • typographical markup
      +
    • italics
    • +
    • bold
    • +
    • underline
    • +
    • strikethrough
    • +
    • subscript
    • +
    • superscript
    • +
    +
  • +
  • semantic markup
      +
    • links
    • +
    • DSP internal links
    • +
    +
  • +
+

DSP-APP provides a text editor for conveniently editing text with standard standoff markup.

+

More details can be found here.

+

Text with Custom Markup

+

It is possible to create custom XML-to-Schema mappings, +which allows for creating project specific custom markup for text values. +Details can be found here.

+
+

Info

+

Custom markup is not supported by DSP-TOOLS and is view-only in DSP-APP.
+Creating custom markup is relatively involved, +so that it should only be used by projects working with complex textual data.

+
+

File Based

+

Text files of various formats (Word, PDF, XML, etc.) can be uploaded to the media file server. +For more details, see here

+

This allows for easy upload and retrieval of the file. +However, it does not allow for searching within the file content.

+

TEI XML

+

All text values in DSP-API using standoff markup can be converted to TEI XML as described here.

+
+

Info

+

Improved support for TEI XML is in planning.

+
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/03-endpoints/api-v2/text/standard-standoff/index.html b/03-endpoints/api-v2/text/standard-standoff/index.html new file mode 100644 index 0000000000..d3dfaa0082 --- /dev/null +++ b/03-endpoints/api-v2/text/standard-standoff/index.html @@ -0,0 +1,2932 @@ + + + + + + + + + + + + + + + + + + + + + + + Standard Standoff Markup - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Standard Standoff Markup Mapping

+

A mapping allows for the conversion of XML to standoff representation in RDF and back. +In order to create a TextValue with markup, +the text has to be provided in XML format, +along with the IRI of the mapping that will be used to convert the markup to standoff.

+

DSP-API offers a standard mapping with the IRI http://rdfh.ch/standoff/mappings/StandardMapping. +The standard mapping covers the HTML elements and attributes +supported by the GUI's text editor, CKEditor. +(Please note that the HTML has to be encoded in strict XML syntax. +CKeditor offers the possibility to define filter rules. +They should reflect the elements supported by the mapping.) +The standard mapping contains the following elements and attributes +that are mapped to standoff classes and properties defined in the ontology:

+
    +
  • <text>standoff:StandoffRootTag
  • +
  • <p>standoff:StandoffParagraphTag
  • +
  • <em>standoff:StandoffItalicTag
  • +
  • <strong>standoff:StandoffBoldTag
  • +
  • <u>standoff:StandoffUnderlineTag
  • +
  • <sub>standoff:StandoffSubscriptTag
  • +
  • <sup>standoff:StandoffSuperscriptTag
  • +
  • <strike>standoff:StandoffStrikeTag
  • +
  • <a href="URL">knora-base:StandoffUriTag
  • +
  • <a class="salsah-link" href="Knora IRI">knora-base:StandoffLinkTag
  • +
  • <a class="internal-link" href="#fragment">knora-base:StandoffInternalReferenceTag
  • +
  • <h1> to <h6>standoff:StandoffHeader1Tag to standoff:StandoffHeader6Tag
  • +
  • <ol>standoff:StandoffOrderedListTag
  • +
  • <ul>standoff:StandoffUnrderedListTag
  • +
  • <li>standoff:StandoffListElementTag
  • +
  • <tbody>standoff:StandoffTableBodyTag
  • +
  • <thead>standoff:StandoffTableHeaderTag
  • +
  • <table>standoff:StandoffTableTag
  • +
  • <tr>standoff:StandoffTableRowTag
  • +
  • <th>standoff:StandoffTableHeaderCellTag
  • +
  • <td>standoff:StandoffTableCellTag
  • +
  • <br>standoff:StandoffBrTag
  • +
  • <hr>standoff:StandoffLineTag
  • +
  • <pre>standoff:StandoffPreTag
  • +
  • <cite>standoff:StandoffCiteTag
  • +
  • <blockquote>standoff:StandoffBlockquoteTag
  • +
  • <code>standoff:StandoffCodeTag
  • +
+

The HTML produced by CKEditor is wrapped in an XML doctype and a pair of root tags <text>...</text> +and then sent to the DSP-API. +The XML sent to the GUI by the DSP-API is unwrapped accordingly. +Although the GUI supports HTML5, it is treated as if it was XHTML in strict XML notation.

+

Text with standard standoff markup can be transformed to TEI XML as described here.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/03-endpoints/api-v2/text/tei-xml/index.html b/03-endpoints/api-v2/text/tei-xml/index.html new file mode 100644 index 0000000000..e1e7efad55 --- /dev/null +++ b/03-endpoints/api-v2/text/tei-xml/index.html @@ -0,0 +1,3391 @@ + + + + + + + + + + + + + + + + + + + + + + + TEI XML - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + +

TEI/XML: Converting Standoff to TEI/XML

+

General

+

DSP-API offers a way to convert standoff markup to TEI/XML. +The conversion is based on the assumption that a whole resource is to be turned into a TEI document. +There is a basic distinction between the body and the header of a TEI document. +The resource's property that contains the text with standoff markup is mapped to the TEI document's body. +Other of the resource's property may be mapped to the TEI header.

+

Standard Standoff to TEI Conversion

+

DSP-API offers a built-in conversion form standard standoff entities (defined in the standoff ontology) tags to TEI.

+
+

Note

+

As TEI provides a wide range of Elements and Attributes +which can have different meaning depending on the markup practices of a project, +whereas DSP standard standoff has a very limited tagset, +this conversion is oppinionated by necessity +and may not be appropriate for all projects.

+
+

In order to obtain a resource as a TEI document, the following request has to be performed. +Please note that the URL parameters have to be URL-encoded.

+
HTTP GET to http://host/v2/tei/resourceIri?textProperty=textPropertyIri
+
+

In addition to the resource's Iri, the Iri of the property containing the text with standoff has to be submitted. +This will be converted to the TEI body. +Please note that the resource can only have one instance of this property and the text must have standoff markup.

+

The test data contain the resource http://rdfh.ch/0001/thing_with_richtext_with_markup +with the text property http://0.0.0.0:3333/ontology/0001/anything/v2#hasRichtext +that can be converted to TEI as follows:

+
HTTP GET to http://host/v2/tei/http%3A%2F%2Frdfh.ch%2F0001%2Fthing_with_richtext_with_markup?textProperty=http%3A%2F%2F0.0.0.0%3A3333%2Fontology%2F0001%2Fanything%2Fv2%23hasRichtext
+
+

The response to this request is a TEI XML document:

+
<?xml version="1.0" encoding="UTF-8"?>
+<TEI xmlns="http://www.tei-c.org/ns/1.0" version="3.3.0">
+  <teiHeader>
+    <fileDesc>
+      <titleStmt>
+        <title>test thing with markup</title>
+      </titleStmt>
+      <publicationStmt>
+        <p>
+             This is the TEI/XML representation of a resource identified by the Iri http://rdfh.ch/0001/thing_with_richtext_with_markup.
+         </p>
+      </publicationStmt>
+      <sourceDesc>
+        <p>Representation of the resource's text as TEI/XML</p>
+      </sourceDesc>
+    </fileDesc>
+  </teiHeader>
+  <text>
+    <body>
+      <p>
+        This is a test that contains marked up elements. 
+        This is <hi rend="italic">interesting text</hi> in italics.
+        This is <hi rend="italic">boring text</hi> in italics.
+      </p>
+    </body>
+  </text>
+</TEI>        
+
+

The body of the TEI document contains the standoff markup as XML. +The header contains contains some basic metadata about the resource such as the rdfs:label an its IRI. +However, this might not be sufficient for more advanced use cases like digital edition projects. +In that case, a custom conversion has to be performed (see below).

+

Custom Conversion

+

If a project defines its own standoff entities, a custom conversion can be provided (body of the TEI document). +Also for the TEI header, a custom conversion can be provided.

+

For the custom conversion, additional configuration is required.

+

TEI body:

+
    +
  • additional mapping from standoff to XML (URL parameter mappingIri)
  • +
  • XSL transformation to turn the XML into a valid TEI body (referred to by the mapping).
  • +
+

The mapping has to refer to a defaultXSLTransformation that transforms the XML that was created from standoff markup +(see XML To Standoff Mapping). +This step is necessary because the mapping assumes a one to one relation +between standoff classes and properties and XML elements and attributes. +For example, we may want to convert a standoff:StandoffItalicTag into TEI/XML. +TEI expresses this as <hi rend="italic">...</hi>. +In the mapping, the standoff:StandoffItalicTag may be mapped to a temporary XML element +that is going to be converted to <hi rend="italic">...</hi> in a further step by the XSLT.

+

For sample data, see webapi/_test_data/test_route/texts/beol/BEOLTEIMapping.xml (mapping) +and webapi/_test_data/test_route/texts/beol/standoffToTEI.xsl. +The standoff entities are defined in beol-onto.ttl.

+

TEI header:

+
    +
  • Gravsearch template to query the resources metadata, results are serialized to RDF/XML (URL parameter gravsearchTemplateIri)
  • +
  • XSL transformation to turn that RDF/XML into a valid TEI header (URL parameter teiHeaderXSLTIri)
  • +
+

The Gravsearch template is expected to be of type knora-base:TextRepresentation +and to contain a placeholder $resourceIri that is to be replaced by the actual resource Iri. +The Gravsearch template is expected to contain a query involving the text property (URL parameter textProperty) +and more properties that are going to be mapped to the TEI header. +The Gravsearch template is a simple text file with the files extension .txt.

+

A Gravsearch template may look like this (see test_data/test_route/texts/beol/gravsearch.txt):

+
PREFIX beol: <http://0.0.0.0:3333/ontology/0801/beol/simple/v2#>
+PREFIX knora-api: <http://api.knora.org/ontology/knora-api/simple/v2#>
+PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
+
+    CONSTRUCT {
+        ?letter knora-api:isMainResource true .
+
+        ?letter beol:creationDate ?date .
+
+        ?letter beol:hasText ?text .
+
+        ?letter beol:hasAuthor ?person1 .
+
+        ?person1 beol:hasFamilyName ?name1 .
+
+        ?person1 beol:hasGivenName ?givenName1 .
+
+        ?person1 beol:hasIAFIdentifier ?iaf1 .
+
+        ?letter beol:hasRecipient ?person2 .
+
+        ?person2 beol:hasFamilyName ?name2 .
+
+        ?person2 beol:hasGivenName ?givenName2 .
+
+        ?person2 beol:hasIAFIdentifier ?iaf2 .
+
+
+    } WHERE {
+        BIND(<$resourceIri> as ?letter)
+        ?letter a knora-api:Resource .
+        ?letter a beol:letter .
+
+        ?letter beol:creationDate ?date .
+
+        beol:creationDate knora-api:objectType knora-api:Date .
+        ?date a knora-api:Date .
+
+        ?letter beol:hasText ?text .
+
+        beol:hasText knora-api:objectType xsd:string .
+
+        ?text a xsd:string .
+
+        ?letter beol:hasAuthor ?person1 .
+
+        ?person1 beol:hasFamilyName ?name1 .
+
+        ?person1 beol:hasGivenName ?givenName1 .
+
+        ?person1 beol:hasIAFIdentifier ?iaf1 .
+
+        ?name1 a xsd:string .
+
+        ?givenName1 a xsd:string .
+
+        ?iaf1 a xsd:string .
+
+        ?person2 beol:hasFamilyName ?name2 .
+
+        ?person2 beol:hasGivenName ?givenName2 .
+
+        ?person2 beol:hasIAFIdentifier ?iaf2 .
+
+        ?name2 a xsd:string .
+
+        ?givenName2 a xsd:string .
+
+        ?iaf2 a xsd:string .
+
+        beol:hasGivenName knora-api:objectType xsd:string .
+        beol:hasFamilyName knora-api:objectType xsd:string .
+        beol:hasIAFIdentifier knora-api:objectType xsd:string .
+
+        beol:hasAuthor knora-api:objectType knora-api:Resource .
+
+        ?letter beol:hasRecipient ?person2 .
+
+        beol:hasRecipient knora-api:objectType knora-api:Resource .
+
+        ?person1 a knora-api:Resource .
+        ?person2 a knora-api:Resource .
+
+    }
+
+

Note the placeholder BIND(<$resourceIri> as ?letter) that is going to be replaced +by the Iri of the resource the request is performed for. +The query asks for information about the letter's text beol:hasText and information about its author and recipient. +This information is converted to the TEI header in the format required by correspSearch.

+

To write the XSLT, do the Gravsearch query and request the data as RDF/XML using content negotiation +(see Introduction).

+

The Gravsearch query's result may look like this (RDF/XML):

+
<?xml version="1.0" encoding="UTF-8"?>
+<rdf:RDF
+    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+    xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
+    xmlns:knora-api="http://api.knora.org/ontology/knora-api/v2#"
+    xmlns:beol="http://0.0.0.0:3333/ontology/0801/beol/v2#">
+<beol:letter rdf:about="http://rdfh.ch/0801/MbZdHVcsR_Ky5pZoytaiBA">
+    <beol:creationDate rdf:resource="http://rdfh.ch/0801/MbZdHVcsR_Ky5pZoytaiBA/values/Ob_1YRO_QmaDxTRI64vGOQ"/>
+    <beol:hasAuthorValue rdf:resource="http://rdfh.ch/0801/MbZdHVcsR_Ky5pZoytaiBA/values/zt4a3XoESTq9To4mSN8Dug"/>
+    <beol:hasRecipientValue rdf:resource="http://rdfh.ch/0801/MbZdHVcsR_Ky5pZoytaiBA/values/pVerHO_FRXePZQT9kgEp_Q"/>
+    <rdfs:label rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Testletter</rdfs:label>
+</beol:letter>
+<knora-api:DateValue rdf:about="http://rdfh.ch/0801/MbZdHVcsR_Ky5pZoytaiBA/values/Ob_1YRO_QmaDxTRI64vGOQ">
+    <knora-api:dateValueHasCalendar rdf:datatype="http://www.w3.org/2001/XMLSchema#string">GREGORIAN</knora-api:dateValueHasCalendar>
+    <knora-api:dateValueHasEndDay rdf:datatype="http://www.w3.org/2001/XMLSchema#integer">10</knora-api:dateValueHasEndDay>
+    <knora-api:dateValueHasEndEra rdf:datatype="http://www.w3.org/2001/XMLSchema#string">CE</knora-api:dateValueHasEndEra>
+    <knora-api:dateValueHasEndMonth rdf:datatype="http://www.w3.org/2001/XMLSchema#integer">6</knora-api:dateValueHasEndMonth>
+    <knora-api:dateValueHasEndYear rdf:datatype="http://www.w3.org/2001/XMLSchema#integer">1703</knora-api:dateValueHasEndYear>
+    <knora-api:dateValueHasStartDay rdf:datatype="http://www.w3.org/2001/XMLSchema#integer">10</knora-api:dateValueHasStartDay>
+    <knora-api:dateValueHasStartEra rdf:datatype="http://www.w3.org/2001/XMLSchema#string">CE</knora-api:dateValueHasStartEra>
+    <knora-api:dateValueHasStartMonth rdf:datatype="http://www.w3.org/2001/XMLSchema#integer">6</knora-api:dateValueHasStartMonth>
+    <knora-api:dateValueHasStartYear rdf:datatype="http://www.w3.org/2001/XMLSchema#integer">1703</knora-api:dateValueHasStartYear>
+    <knora-api:valueAsString rdf:datatype="http://www.w3.org/2001/XMLSchema#string">GREGORIAN:1703-06-10 CE</knora-api:valueAsString>
+</knora-api:DateValue>
+<knora-api:LinkValue rdf:about="http://rdfh.ch/0801/MbZdHVcsR_Ky5pZoytaiBA/values/zt4a3XoESTq9To4mSN8Dug">
+    <knora-api:linkValueHasTarget>
+        <beol:person rdf:about="http://rdfh.ch/0801/_9LEnLM7TFuPRjTshOTJpQ">
+            <beol:hasFamilyName rdf:resource="http://rdfh.ch/0801/_9LEnLM7TFuPRjTshOTJpQ/values/NG42jDqSTz2U35N6sJ8cqg"/>
+            <beol:hasGivenName rdf:resource="http://rdfh.ch/0801/_9LEnLM7TFuPRjTshOTJpQ/values/W2lVG1mvQU2MauAvCGB13w"/>
+            <beol:hasIAFIdentifier rdf:resource="http://rdfh.ch/0801/_9LEnLM7TFuPRjTshOTJpQ/values/N2TVtntdToqJQpdZhYPc5g"/>
+            <rdfs:label rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Johann Jacob Scheuchzer</rdfs:label>
+        </beol:person>
+    </knora-api:linkValueHasTarget>
+</knora-api:LinkValue>
+<knora-api:TextValue rdf:about="http://rdfh.ch/0801/_9LEnLM7TFuPRjTshOTJpQ/values/NG42jDqSTz2U35N6sJ8cqg">
+    <knora-api:valueAsString rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Scheuchzer</knora-api:valueAsString>
+</knora-api:TextValue>
+<knora-api:TextValue rdf:about="http://rdfh.ch/0801/_9LEnLM7TFuPRjTshOTJpQ/values/W2lVG1mvQU2MauAvCGB13w">
+    <knora-api:valueAsString rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Johann Jacob</knora-api:valueAsString>
+</knora-api:TextValue>
+<knora-api:TextValue rdf:about="http://rdfh.ch/0801/_9LEnLM7TFuPRjTshOTJpQ/values/N2TVtntdToqJQpdZhYPc5g">
+    <knora-api:valueAsString rdf:datatype="http://www.w3.org/2001/XMLSchema#string">(DE-588)118607308</knora-api:valueAsString>
+</knora-api:TextValue>
+<knora-api:LinkValue rdf:about="http://rdfh.ch/0801/MbZdHVcsR_Ky5pZoytaiBA/values/pVerHO_FRXePZQT9kgEp_Q">
+    <knora-api:linkValueHasTarget>
+        <beol:person rdf:about="http://rdfh.ch/0801/JaQwPsYEQJ6GQrAgKC0Gkw">
+            <beol:hasFamilyName rdf:resource="http://rdfh.ch/0801/JaQwPsYEQJ6GQrAgKC0Gkw/values/k1Exqf93SsWi7LWK9ozXkw"/>
+            <beol:hasGivenName rdf:resource="http://rdfh.ch/0801/JaQwPsYEQJ6GQrAgKC0Gkw/values/gkqK5Ij_R7mtO59xfSDGJA"/>
+            <beol:hasIAFIdentifier rdf:resource="http://rdfh.ch/0801/JaQwPsYEQJ6GQrAgKC0Gkw/values/C-Dl15S-SV63L1KCCPFfew"/>
+            <rdfs:label rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Jacob Hermann</rdfs:label>
+        </beol:person>
+    </knora-api:linkValueHasTarget>
+</knora-api:LinkValue>
+<knora-api:TextValue rdf:about="http://rdfh.ch/0801/JaQwPsYEQJ6GQrAgKC0Gkw/values/k1Exqf93SsWi7LWK9ozXkw">
+    <knora-api:valueAsString rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Hermann</knora-api:valueAsString>
+</knora-api:TextValue>
+<knora-api:TextValue rdf:about="http://rdfh.ch/0801/JaQwPsYEQJ6GQrAgKC0Gkw/values/gkqK5Ij_R7mtO59xfSDGJA">
+    <knora-api:valueAsString rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Jacob</knora-api:valueAsString>
+</knora-api:TextValue>
+<knora-api:TextValue rdf:about="http://rdfh.ch/0801/JaQwPsYEQJ6GQrAgKC0Gkw/values/C-Dl15S-SV63L1KCCPFfew">
+    <knora-api:valueAsString rdf:datatype="http://www.w3.org/2001/XMLSchema#string">(DE-588)119112450</knora-api:valueAsString>
+</knora-api:TextValue>
+
+</rdf:RDF>
+
+

In order to convert the metadata (not the actual standoff markup), +a knora-base:knora-base:XSLTransformation has to be provided. +For our example, it looks like this (see test_data/test_route/texts/beol/header.xsl):

+
<?xml version="1.0" encoding="UTF-8"?>
+<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+               xmlns:xs="http://www.w3.org/2001/XMLSchema"
+               xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+               xmlns:rdfs1="http://www.w3.org/2000/01/rdf-schema#"
+               xmlns:beol="http://0.0.0.0:3333/ontology/0801/beol/v2#"
+               xmlns:knora-api="http://api.knora.org/ontology/knora-api/v2#"
+               exclude-result-prefixes="rdf beol knora-api xs rdfs1" version="2.0">
+
+    <xsl:output method="xml" omit-xml-declaration="yes" encoding="utf-8" indent="yes"/>
+
+    <!-- make IAF id a URL -->
+    <xsl:function name="knora-api:iaf" as="xs:anyURI">
+        <xsl:param name="input" as="xs:string"/>
+        <xsl:value-of select="replace($input, '\(DE-588\)', 'http://d-nb.info/gnd/')"/>
+    </xsl:function>
+
+    <!-- make a standard date (Gregorian calendar assumed) -->
+    <xsl:function name="knora-api:dateformat" as="element()*">
+        <xsl:param name="input" as="element()*"/>
+
+        <xsl:choose>
+            <xsl:when test="$input/knora-api:dateValueHasStartYear/text() = $input/knora-api:dateValueHasEndYear/text() and $input/knora-api:dateValueHasStartMonth/text() = $input/knora-api:dateValueHasEndMonth/text() and $input/knora-api:dateValueHasStartDay/text() = $input/knora-api:dateValueHasEndDay/text()">
+                <!-- no period, day precision -->
+                <date>
+                    <xsl:attribute name="when">
+                        <xsl:value-of select="format-number($input/knora-api:dateValueHasStartYear/text(), '0000')"/>-<xsl:value-of select="format-number($input/knora-api:dateValueHasStartMonth/text(), '00')"/>-<xsl:value-of select="format-number($input/knora-api:dateValueHasStartMonth/text(), '00')"/>
+                    </xsl:attribute>
+                </date>
+
+            </xsl:when>
+            <xsl:otherwise>
+                <!-- period -->
+                <date>
+                    <xsl:attribute name="notBefore">
+                        <xsl:value-of select="format-number($input/knora-api:dateValueHasStartYear/text(), '0000')"/>-<xsl:value-of select="format-number($input/knora-api:dateValueHasStartMonth/text(), '00')"/>-<xsl:value-of select="format-number($input/knora-api:dateValueHasStartDay/text(), '00')"/>
+                    </xsl:attribute>
+
+                    <xsl:attribute name="notAfter">
+                        <xsl:value-of select="format-number($input/knora-api:dateValueHasEndYear/text(), '0000')"/>-<xsl:value-of select="format-number($input/knora-api:dateValueHasEndMonth/text(), '00')"/>-<xsl:value-of select="format-number($input/knora-api:dateValueHasEndDay/text(), '00')"/>
+                    </xsl:attribute>
+                </date>
+
+            </xsl:otherwise>
+        </xsl:choose>
+
+
+    </xsl:function>
+
+    <xsl:template match="rdf:RDF">
+        <xsl:variable name="resourceIri" select="beol:letter/@rdf:about"/>
+        <xsl:variable name="label" select="beol:letter/rdfs1:label/text()"/>
+
+
+        <teiHeader>
+            <fileDesc>
+                <titleStmt>
+                    <title>
+                        <xsl:value-of select="$label"/>
+                    </title>
+                </titleStmt>
+                <publicationStmt>
+                    <p> This is the TEI/XML representation of the resource identified by the Iri
+                        <xsl:value-of select="$resourceIri"/>. </p>
+                </publicationStmt>
+                <sourceDesc>
+                    <p>Representation of the resource's text as TEI/XML</p>
+                </sourceDesc>
+            </fileDesc>
+            <profileDesc>
+
+                <correspDesc>
+                    <xsl:attribute name="ref">
+                        <xsl:value-of select="$resourceIri"/>
+                    </xsl:attribute>
+                    <xsl:apply-templates/>
+                </correspDesc>
+            </profileDesc>
+        </teiHeader>
+    </xsl:template>
+
+    <xsl:template match="beol:letter/beol:hasAuthorValue">
+        <xsl:variable name="authorValue" select="@rdf:resource"/>
+
+        <xsl:variable name="authorIAFValue"
+                      select="//knora-api:LinkValue[@rdf:about=$authorValue]//beol:hasIAFIdentifier/@rdf:resource"/>
+        <xsl:variable name="authorFamilyNameValue"
+                      select="//knora-api:LinkValue[@rdf:about=$authorValue]//beol:hasFamilyName/@rdf:resource"/>
+        <xsl:variable name="authorGivenNameValue"
+                      select="//knora-api:LinkValue[@rdf:about=$authorValue]//beol:hasGivenName/@rdf:resource"/>
+
+        <correspAction type="sent">
+
+            <xsl:variable name="authorIAFText"
+                          select="//knora-api:TextValue[@rdf:about=$authorIAFValue]/knora-api:valueAsString/text()"/>
+            <xsl:variable name="authorFamilyNameText"
+                          select="//knora-api:TextValue[@rdf:about=$authorFamilyNameValue]/knora-api:valueAsString/text()"/>
+            <xsl:variable name="authorGivenNameText"
+                          select="//knora-api:TextValue[@rdf:about=$authorGivenNameValue]/knora-api:valueAsString/text()"/>
+
+            <persName>
+                <xsl:attribute name="ref"><xsl:value-of select="knora-api:iaf($authorIAFText)"
+                /></xsl:attribute>
+                <xsl:value-of select="$authorFamilyNameText"/>, <xsl:value-of
+                    select="$authorGivenNameText"/>
+            </persName>
+
+            <xsl:variable name="dateValue" select="//beol:creationDate/@rdf:resource"/>
+
+            <xsl:variable name="dateObj"
+                          select="//knora-api:DateValue[@rdf:about=$dateValue]"/>
+
+            <xsl:copy-of select="knora-api:dateformat($dateObj)"/>
+
+        </correspAction>
+    </xsl:template>
+
+    <xsl:template match="beol:letter/beol:hasRecipientValue">
+        <xsl:variable name="recipientValue" select="@rdf:resource"/>
+
+        <xsl:variable name="recipientIAFValue"
+                      select="//knora-api:LinkValue[@rdf:about=$recipientValue]//beol:hasIAFIdentifier/@rdf:resource"/>
+        <xsl:variable name="recipientFamilyNameValue"
+                      select="//knora-api:LinkValue[@rdf:about=$recipientValue]//beol:hasFamilyName/@rdf:resource"/>
+        <xsl:variable name="recipientGivenNameValue"
+                      select="//knora-api:LinkValue[@rdf:about=$recipientValue]//beol:hasGivenName/@rdf:resource"/>
+
+        <correspAction type="received">
+
+            <xsl:variable name="recipientIAFText"
+                          select="//knora-api:TextValue[@rdf:about=$recipientIAFValue]/knora-api:valueAsString/text()"/>
+            <xsl:variable name="recipientFamilyNameText"
+                          select="//knora-api:TextValue[@rdf:about=$recipientFamilyNameValue]/knora-api:valueAsString/text()"/>
+            <xsl:variable name="recipientGivenNameText"
+                          select="//knora-api:TextValue[@rdf:about=$recipientGivenNameValue]/knora-api:valueAsString/text()"/>
+
+            <persName>
+                <xsl:attribute name="ref"><xsl:value-of select="knora-api:iaf($recipientIAFText)"
+                /></xsl:attribute>
+                <xsl:value-of select="$recipientFamilyNameText"/>, <xsl:value-of
+                    select="$recipientGivenNameText"/>
+            </persName>
+
+        </correspAction>
+    </xsl:template>
+
+    <!-- ignore text if there is no template for the element containing it -->
+    <xsl:template match="text()"> </xsl:template>
+
+
+</xsl:transform>
+
+

You can use the functions knora-api:iaf and knora-api:dateformat in your own XSLT in case you want to support correspSearch.

+

The complete request looks like this:

+
HTTP GET request to http://host/v2/tei/resourceIri&textProperty=textPropertyIri&mappingIri=mappingIri&gravsearchTemplateIri=gravsearchTemplateIri&teiHeaderXSLTIri=teiHeaderXSLTIri
+
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/03-endpoints/generated-openapi/openapi-admin-api.yml b/03-endpoints/generated-openapi/openapi-admin-api.yml new file mode 100644 index 0000000000..5838c0b0c4 --- /dev/null +++ b/03-endpoints/generated-openapi/openapi-admin-api.yml @@ -0,0 +1,6164 @@ +openapi: 3.1.0 +info: + title: webapi-admin-api + version: v30.21.0-12-gf9dcd98 +servers: +- url: http://localhost:3333 + description: Local development server +- url: https://api.dasch.swiss + description: Production server +paths: + /admin/groups: + get: + tags: + - Admin Groups + description: Return all groups. + operationId: getAdminGroups + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/GroupsGetResponseADM' + example: + groups: + - id: http://rdfh.ch/groups/0042/a95UWs71KUklnFOe1rcw1w + name: NewGroup + descriptions: + - value: NewGroup description in English + language: en + - value: NewGroup Beschreibung auf Deutsch + language: de + project: + id: http://rdfh.ch/projects/0042 + shortname: example + shortcode: '0001' + longname: Example Project + description: + - value: An example project + language: en + keywords: + - example + - project + ontologies: [] + status: true + selfjoin: false + copyrightAttribution: 2024, Example Project + license: CC-BY-4.0 + status: true + selfjoin: false + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + post: + tags: + - Admin Groups + description: '**Required permissions**: User must SystemAdmin or ProjectAdmin + of the project the group is created in.' + operationId: Create new group + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/GroupCreateRequest' + example: + name: NewGroup + descriptions: + - value: NewGroup description in English + language: en + - value: NewGroup Beschreibung auf Deutsch + language: de + project: http://rdfh.ch/projects/0042 + status: true + selfjoin: false + required: true + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/GroupGetResponseADM' + example: + group: + id: http://rdfh.ch/groups/0042/a95UWs71KUklnFOe1rcw1w + name: NewGroup + descriptions: + - value: NewGroup description in English + language: en + - value: NewGroup Beschreibung auf Deutsch + language: de + project: + id: http://rdfh.ch/projects/0042 + shortname: example + shortcode: '0001' + longname: Example Project + description: + - value: An example project + language: en + keywords: + - example + - project + ontologies: [] + status: true + selfjoin: false + copyrightAttribution: 2024, Example Project + license: CC-BY-4.0 + status: true + selfjoin: false + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + /admin/groups/{groupIri}: + get: + tags: + - Admin Groups + description: Return a single group identified by its IRI. + operationId: getAdminGroupsGroupiri + parameters: + - name: groupIri + in: path + description: The IRI of a group. Must be URL-encoded. + required: true + schema: + type: string + example: http://rdfh.ch/groups/0042/a95UWs71KUklnFOe1rcw1w + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/GroupGetResponseADM' + example: + group: + id: http://rdfh.ch/groups/0042/a95UWs71KUklnFOe1rcw1w + name: NewGroup + descriptions: + - value: NewGroup description in English + language: en + - value: NewGroup Beschreibung auf Deutsch + language: de + project: + id: http://rdfh.ch/projects/0042 + shortname: example + shortcode: '0001' + longname: Example Project + description: + - value: An example project + language: en + keywords: + - example + - project + ontologies: [] + status: true + selfjoin: false + copyrightAttribution: 2024, Example Project + license: CC-BY-4.0 + status: true + selfjoin: false + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + put: + tags: + - Admin Groups + description: Update a group's basic information. + operationId: putAdminGroupsGroupiri + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + - name: groupIri + in: path + description: The IRI of a group. Must be URL-encoded. + required: true + schema: + type: string + example: http://rdfh.ch/groups/0042/a95UWs71KUklnFOe1rcw1w + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/GroupUpdateRequest' + example: + name: NewGroupNewName + descriptions: + - value: NewGroupNewName description in English + language: en + - value: NewGroupNewName Beschreibung auf Deutsch + language: de + status: false + selfjoin: true + required: true + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/GroupGetResponseADM' + example: + group: + id: http://rdfh.ch/groups/0042/a95UWs71KUklnFOe1rcw1w + name: NewGroup + descriptions: + - value: NewGroup description in English + language: en + - value: NewGroup Beschreibung auf Deutsch + language: de + project: + id: http://rdfh.ch/projects/0042 + shortname: example + shortcode: '0001' + longname: Example Project + description: + - value: An example project + language: en + keywords: + - example + - project + ontologies: [] + status: true + selfjoin: false + copyrightAttribution: 2024, Example Project + license: CC-BY-4.0 + status: true + selfjoin: false + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + delete: + tags: + - Admin Groups + description: Deletes a group by changing its status to 'false'. + operationId: deleteAdminGroupsGroupiri + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + - name: groupIri + in: path + description: The IRI of a group. Must be URL-encoded. + required: true + schema: + type: string + example: http://rdfh.ch/groups/0042/a95UWs71KUklnFOe1rcw1w + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/GroupGetResponseADM' + example: + group: + id: http://rdfh.ch/groups/0042/a95UWs71KUklnFOe1rcw1w + name: NewGroup + descriptions: + - value: NewGroup description in English + language: en + - value: NewGroup Beschreibung auf Deutsch + language: de + project: + id: http://rdfh.ch/projects/0042 + shortname: example + shortcode: '0001' + longname: Example Project + description: + - value: An example project + language: en + keywords: + - example + - project + ontologies: [] + status: true + selfjoin: false + copyrightAttribution: 2024, Example Project + license: CC-BY-4.0 + status: true + selfjoin: false + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + /admin/groups/{groupIri}/members: + get: + tags: + - Admin Groups + description: Return all members of a single group. + operationId: getAdminGroupsGroupiriMembers + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + - name: groupIri + in: path + description: The IRI of a group. Must be URL-encoded. + required: true + schema: + type: string + example: http://rdfh.ch/groups/0042/a95UWs71KUklnFOe1rcw1w + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/GroupMembersGetResponseADM' + example: + members: + - id: http://rdfh.ch/users/0001 + username: username + email: user@exampl.com + givenName: Jane + familyName: Doe + status: true + lang: rm + groups: + - id: http://rdfh.ch/groups/0042/a95UWs71KUklnFOe1rcw1w + name: NewGroup + descriptions: + - value: NewGroup description in English + language: en + - value: NewGroup Beschreibung auf Deutsch + language: de + project: + id: http://rdfh.ch/projects/0042 + shortname: example + shortcode: '0001' + longname: Example Project + description: + - value: An example project + language: en + keywords: + - example + - project + ontologies: [] + status: true + selfjoin: false + copyrightAttribution: 2024, Example Project + license: CC-BY-4.0 + status: true + selfjoin: false + projects: + - id: http://rdfh.ch/projects/0042 + shortname: example + shortcode: '0001' + longname: Example Project + description: + - value: An example project + language: en + keywords: + - example + - project + ontologies: [] + status: true + selfjoin: false + copyrightAttribution: 2024, Example Project + license: CC-BY-4.0 + permissions: + groupsPerProject: {} + administrativePermissionsPerProject: {} + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + /admin/groups/{groupIri}/status: + put: + tags: + - Admin Groups + description: Updates a group's status. + operationId: putAdminGroupsGroupiriStatus + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + - name: groupIri + in: path + description: The IRI of a group. Must be URL-encoded. + required: true + schema: + type: string + example: http://rdfh.ch/groups/0042/a95UWs71KUklnFOe1rcw1w + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/GroupStatusUpdateRequest' + required: true + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/GroupGetResponseADM' + example: + group: + id: http://rdfh.ch/groups/0042/a95UWs71KUklnFOe1rcw1w + name: NewGroup + descriptions: + - value: NewGroup description in English + language: en + - value: NewGroup Beschreibung auf Deutsch + language: de + project: + id: http://rdfh.ch/projects/0042 + shortname: example + shortcode: '0001' + longname: Example Project + description: + - value: An example project + language: en + keywords: + - example + - project + ontologies: [] + status: true + selfjoin: false + copyrightAttribution: 2024, Example Project + license: CC-BY-4.0 + status: true + selfjoin: false + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + /admin/lists: + get: + tags: + - Admin Lists + description: Get all lists or all lists belonging to a project. Note that you + can provide either a project IRI or a project shortcode. + operationId: getAdminLists + parameters: + - name: projectIri + in: query + description: The (optional) IRI of the project. + required: false + schema: + type: string + example: http://rdfh.ch/projects/0042 + - name: projectShortcode + in: query + description: The (optional) shortcode of the project. + required: false + schema: + type: string + example: '0042' + responses: + '200': + description: Contains the list of all root nodes of each found list. + content: + application/json: + schema: + $ref: '#/components/schemas/ListsGetResponseADM' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + post: + tags: + - Admin Lists + operationId: postAdminLists + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ListCreateRootNodeRequest' + required: true + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ListGetResponseADM' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + /admin/lists/{p1}/name: + put: + tags: + - Admin Lists + operationId: putAdminListsP1Name + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + - name: p1 + in: path + description: The IRI of the list. + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ListChangeNameRequest' + required: true + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NodeInfoGetResponseADM' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + /admin/lists/{p1}/labels: + put: + tags: + - Admin Lists + operationId: putAdminListsP1Labels + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + - name: p1 + in: path + description: The IRI of the list. + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ListChangeLabelsRequest' + required: true + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NodeInfoGetResponseADM' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + /admin/lists/{p1}/comments: + put: + tags: + - Admin Lists + operationId: putAdminListsP1Comments + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + - name: p1 + in: path + description: The IRI of the list. + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ListChangeCommentsRequest' + required: true + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NodeInfoGetResponseADM' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + /admin/lists/{p1}/position: + put: + tags: + - Admin Lists + operationId: putAdminListsP1Position + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + - name: p1 + in: path + description: The IRI of the list. + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ListChangePositionRequest' + required: true + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NodePositionChangeResponseADM' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + /admin/lists/{p1}: + get: + tags: + - Admin Lists + description: Returns a list node, root or child, with children (if exist). + operationId: getAdminListsP1 + parameters: + - name: p1 + in: path + description: The IRI of the list. + required: true + schema: + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ListItemGetResponseADM' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + put: + tags: + - Admin Lists + operationId: putAdminListsP1 + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + - name: p1 + in: path + description: The IRI of the list. + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ListChangeRequest' + required: true + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NodeInfoGetResponseADM' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + delete: + tags: + - Admin Lists + operationId: deleteAdminListsP1 + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + - name: p1 + in: path + description: The IRI of the list. + required: true + schema: + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ListItemDeleteResponseADM' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + /admin/lists/comments/{p1}: + delete: + tags: + - Admin Lists + operationId: deleteAdminListsCommentsP1 + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + - name: p1 + in: path + description: The IRI of the list. + required: true + schema: + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ListNodeCommentsDeleteResponseADM' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + /admin/lists/{p1}/info: + get: + tags: + - Admin Lists + description: Returns basic information about a list node, root or child, w/o + children (if exist). + operationId: getAdminListsP1Info + parameters: + - name: p1 + in: path + description: The IRI of the list. + required: true + schema: + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NodeInfoGetResponseADM' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + /admin/lists/candelete/{p1}: + get: + tags: + - Admin Lists + description: Checks if a list can be deleted (none of its nodes is used in data). + operationId: getAdminListsCandeleteP1 + parameters: + - name: p1 + in: path + description: The IRI of the list. + required: true + schema: + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/CanDeleteListResponseADM' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + /admin/maintenance/{action-name}: + post: + tags: + - Admin Maintenance + operationId: postAdminMaintenanceAction-name + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + - name: action-name + in: path + description: | + The name of the maintenance action to be executed. + Maintenance actions are executed asynchronously in the background. + required: true + schema: + type: string + example: fix-top-left + requestBody: + description: | + The optional parameters as json for the maintenance action. + May be required by certain actions. + content: + application/json: + schema: + type: string + required: false + responses: + '202': + description: '' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + /admin/permissions/ap: + post: + tags: + - Admin Permissions + description: Create a new administrative permission + operationId: postAdminPermissionsAp + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/CreateAdministrativePermissionAPIRequestADM' + required: true + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/AdministrativePermissionCreateResponseADM' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + /admin/permissions/ap/{projectIri}: + get: + tags: + - Admin Permissions + description: Get all administrative permissions for a project. + operationId: getAdminPermissionsApProjectiri + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + - name: projectIri + in: path + description: The IRI of a project. Must be URL-encoded. + required: true + schema: + type: string + example: http://rdfh.ch/projects/0001 + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/AdministrativePermissionsForProjectGetResponseADM' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + /admin/permissions/ap/{projectIri}/{groupIri}: + get: + tags: + - Admin Permissions + description: Get all administrative permissions for a project and a group. + operationId: getAdminPermissionsApProjectiriGroupiri + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + - name: projectIri + in: path + description: The IRI of a project. Must be URL-encoded. + required: true + schema: + type: string + example: http://rdfh.ch/projects/0001 + - name: groupIri + in: path + description: The IRI of a group. Must be URL-encoded. + required: true + schema: + type: string + example: http://rdfh.ch/groups/0042/a95UWs71KUklnFOe1rcw1w + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/AdministrativePermissionGetResponseADM' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + /admin/permissions/doap/{projectIri}: + get: + tags: + - Admin Permissions + description: Get all default object access permissions for a project. + operationId: getAdminPermissionsDoapProjectiri + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + - name: projectIri + in: path + description: The IRI of a project. Must be URL-encoded. + required: true + schema: + type: string + example: http://rdfh.ch/projects/0001 + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/DefaultObjectAccessPermissionsForProjectGetResponseADM' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + /admin/permissions/{projectIri}: + get: + tags: + - Admin Permissions + description: Get all permissions for a project. + operationId: getAdminPermissionsProjectiri + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + - name: projectIri + in: path + description: The IRI of a project. Must be URL-encoded. + required: true + schema: + type: string + example: http://rdfh.ch/projects/0001 + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/PermissionsForProjectGetResponseADM' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + /admin/permissions/{permissionIri}: + delete: + tags: + - Admin Permissions + description: Delete an permission. + operationId: deleteAdminPermissionsPermissioniri + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + - name: permissionIri + in: path + description: The IRI of a permission. Must be URL-encoded. + required: true + schema: + type: string + example: http://rdfh.ch/permissions/00FF/Mck2xJDjQ_Oimi_9z4aFaA + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/PermissionDeleteResponseADM' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + /admin/permissions/doap: + post: + tags: + - Admin Permissions + description: Create a new default object access permission + operationId: postAdminPermissionsDoap + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/CreateDefaultObjectAccessPermissionAPIRequestADM' + required: true + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/DefaultObjectAccessPermissionCreateResponseADM' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + /admin/permissions/doap/{permissionIri}: + put: + tags: + - Admin Permissions + description: Update an existing default object access permission. The request + may update the hasPermission and/or any allowed combination of group, resource + class and property for the permission. + operationId: putAdminPermissionsDoapPermissioniri + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + - name: permissionIri + in: path + description: The IRI of a permission. Must be URL-encoded. + required: true + schema: + type: string + example: http://rdfh.ch/permissions/00FF/Mck2xJDjQ_Oimi_9z4aFaA + requestBody: + description: Default object access permissions can be only for group, resource + class, property or both resource class and property.If an invalid combination + is provided, the request will fail with a Bad Request response.The iris + for resource class and property must be valid Api V2 complex iris. + content: + application/json: + schema: + $ref: '#/components/schemas/ChangeDoapRequest' + examples: + For a group: + value: + forGroup: http://www.knora.org/ontology/knora-admin#ProjectMember + For a resource class and a property: + value: + forResourceClass: http://api.dasch.swiss/ontology/0803/incunabula/v2#bild + forProperty: http://api.dasch.swiss/ontology/0803/incunabula/v2#pagenum + required: true + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/DefaultObjectAccessPermissionGetResponseADM' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + /admin/permissions/{permissionIri}/group: + put: + tags: + - Admin Permissions + description: Update a permission's group + operationId: putAdminPermissionsPermissioniriGroup + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + - name: permissionIri + in: path + description: The IRI of a permission. Must be URL-encoded. + required: true + schema: + type: string + example: http://rdfh.ch/permissions/00FF/Mck2xJDjQ_Oimi_9z4aFaA + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ChangePermissionGroupApiRequestADM' + required: true + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/PermissionGetResponseADM' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + /admin/permissions/{permissionIri}/hasPermissions: + put: + tags: + - Admin Permissions + description: Update a permission's set of hasPermissions + operationId: putAdminPermissionsPermissioniriHaspermissions + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + - name: permissionIri + in: path + description: The IRI of a permission. Must be URL-encoded. + required: true + schema: + type: string + example: http://rdfh.ch/permissions/00FF/Mck2xJDjQ_Oimi_9z4aFaA + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ChangePermissionHasPermissionsApiRequestADM' + required: true + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/PermissionGetResponseADM' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + /admin/permissions/{permissionIri}/resourceClass: + put: + tags: + - Admin Permissions + description: Update a DOAP's resource class. Use `PUT /admin/permissions/doap/{permissionIri}` + instead. + operationId: putAdminPermissionsPermissioniriResourceclass + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + - name: permissionIri + in: path + description: The IRI of a permission. Must be URL-encoded. + required: true + schema: + type: string + example: http://rdfh.ch/permissions/00FF/Mck2xJDjQ_Oimi_9z4aFaA + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ChangePermissionResourceClassApiRequestADM' + required: true + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/DefaultObjectAccessPermissionGetResponseADM' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + deprecated: true + security: + - httpAuth: [] + - httpAuth1: [] + /admin/permissions/{permissionIri}/property: + put: + tags: + - Admin Permissions + description: Update a DAOP's property. Use `PUT /admin/permissions/doap/{permissionIri}` + instead. + operationId: putAdminPermissionsPermissioniriProperty + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + - name: permissionIri + in: path + description: The IRI of a permission. Must be URL-encoded. + required: true + schema: + type: string + example: http://rdfh.ch/permissions/00FF/Mck2xJDjQ_Oimi_9z4aFaA + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ChangePermissionPropertyApiRequestADM' + required: true + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/DefaultObjectAccessPermissionGetResponseADM' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + deprecated: true + security: + - httpAuth: [] + - httpAuth1: [] + /admin/projects: + get: + tags: + - Admin Projects + description: Returns all projects. + operationId: getAdminProjects + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ProjectsGetResponse' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + post: + tags: + - Admin Projects + description: Creates a new project. + operationId: postAdminProjects + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ProjectCreateRequest' + required: true + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ProjectOperationResponseADM' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + /admin/projects/iri/{projectIri}: + get: + tags: + - Admin Projects + description: Returns a single project identified by the IRI. + operationId: getAdminProjectsIriProjectiri + parameters: + - name: projectIri + in: path + description: The IRI of a project. Must be URL-encoded. + required: true + schema: + type: string + example: http://rdfh.ch/projects/0001 + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ProjectGetResponse' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + put: + tags: + - Admin Projects + description: Updates a project identified by the IRI. + operationId: putAdminProjectsIriProjectiri + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + - name: projectIri + in: path + description: The IRI of a project. Must be URL-encoded. + required: true + schema: + type: string + example: http://rdfh.ch/projects/0001 + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ProjectUpdateRequest' + required: true + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ProjectOperationResponseADM' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + delete: + tags: + - Admin Projects + description: Deletes a project identified by the IRI. + operationId: deleteAdminProjectsIriProjectiri + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + - name: projectIri + in: path + description: The IRI of a project. Must be URL-encoded. + required: true + schema: + type: string + example: http://rdfh.ch/projects/0001 + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ProjectOperationResponseADM' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + /admin/projects/iri/{projectIri}/RestrictedViewSettings: + get: + tags: + - Admin Projects + description: Returns the project's restricted view settings identified by the + IRI. + operationId: getAdminProjectsIriProjectiriRestrictedviewsettings + parameters: + - name: projectIri + in: path + description: The IRI of a project. Must be URL-encoded. + required: true + schema: + type: string + example: http://rdfh.ch/projects/0001 + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ProjectRestrictedViewSettingsGetResponseADM' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + post: + tags: + - Admin Projects + description: Sets the project's restricted view settings identified by the IRI. + operationId: postAdminProjectsIriProjectiriRestrictedviewsettings + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + - name: projectIri + in: path + description: The IRI of a project. Must be URL-encoded. + required: true + schema: + type: string + example: http://rdfh.ch/projects/0001 + requestBody: + description: |- + Set how all still image resources of a projects should be displayed when viewed as restricted. + This can be either a size restriction or a watermark. + For that, we support two of the (IIIF size)[https://iiif.io/api/image/3.0/#42-size] forms: + * `!d,d` The returned image is scaled so that the width and height of the returned image are not greater than d, while maintaining the aspect ratio. + * `pct:n` The width and height of the returned image is scaled to n percent of the width and height of the original image. 1<= n <= 100. + + If the watermark is set to `true`, the returned image will be watermarked, otherwise the default size !128,128 is set. + + It is only possible to set either the size or the watermark, not both at the same time. + content: + application/json: + schema: + $ref: '#/components/schemas/SetRestrictedViewRequest' + example: + size: '!128,128' + required: true + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/RestrictedViewResponse' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + /admin/projects/shortcode/{projectShortcode}: + get: + tags: + - Admin Projects + description: Returns a single project identified by the shortcode. + operationId: getAdminProjectsShortcodeProjectshortcode + parameters: + - name: projectShortcode + in: path + description: The shortcode of a project. Must be a 4 digit hexadecimal String. + required: true + schema: + type: string + example: '0001' + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ProjectGetResponse' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + /admin/projects/shortcode/{projectShortcode}/RestrictedViewSettings: + get: + tags: + - Admin Projects + description: Returns the project's restricted view settings identified by the + shortcode. + operationId: getAdminProjectsShortcodeProjectshortcodeRestrictedviewsettings + parameters: + - name: projectShortcode + in: path + description: The shortcode of a project. Must be a 4 digit hexadecimal String. + required: true + schema: + type: string + example: '0001' + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ProjectRestrictedViewSettingsGetResponseADM' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + post: + tags: + - Admin Projects + description: Sets the project's restricted view settings identified by the shortcode. + operationId: postAdminProjectsShortcodeProjectshortcodeRestrictedviewsettings + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + - name: projectShortcode + in: path + description: The shortcode of a project. Must be a 4 digit hexadecimal String. + required: true + schema: + type: string + example: '0001' + requestBody: + description: |- + Set how all still image resources of a projects should be displayed when viewed as restricted. + This can be either a size restriction or a watermark. + For that, we support two of the (IIIF size)[https://iiif.io/api/image/3.0/#42-size] forms: + * `!d,d` The returned image is scaled so that the width and height of the returned image are not greater than d, while maintaining the aspect ratio. + * `pct:n` The width and height of the returned image is scaled to n percent of the width and height of the original image. 1<= n <= 100. + + If the watermark is set to `true`, the returned image will be watermarked, otherwise the default size !128,128 is set. + + It is only possible to set either the size or the watermark, not both at the same time. + content: + application/json: + schema: + $ref: '#/components/schemas/SetRestrictedViewRequest' + example: + size: '!128,128' + required: true + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/RestrictedViewResponse' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + /admin/projects/shortname/{projectShortname}: + get: + tags: + - Admin Projects + description: Returns a single project identified by the shortname. + operationId: getAdminProjectsShortnameProjectshortname + parameters: + - name: projectShortname + in: path + description: The shortname of a project. + required: true + schema: + type: string + example: someShortname + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ProjectGetResponse' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + /admin/projects/shortname/{projectShortname}/RestrictedViewSettings: + get: + tags: + - Admin Projects + description: Returns the project's restricted view settings identified by the + shortname. + operationId: getAdminProjectsShortnameProjectshortnameRestrictedviewsettings + parameters: + - name: projectShortname + in: path + description: The shortname of a project. + required: true + schema: + type: string + example: someShortname + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ProjectRestrictedViewSettingsGetResponseADM' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + /admin/projects/Keywords: + get: + tags: + - Admin Projects + description: Returns all unique keywords for all projects as a list. + operationId: getAdminProjectsKeywords + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ProjectsKeywordsGetResponse' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + /admin/projects/iri/{projectIri}/Keywords: + get: + tags: + - Admin Projects + description: Returns all keywords for a single project. + operationId: getAdminProjectsIriProjectiriKeywords + parameters: + - name: projectIri + in: path + description: The IRI of a project. Must be URL-encoded. + required: true + schema: + type: string + example: http://rdfh.ch/projects/0001 + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ProjectKeywordsGetResponse' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + /admin/projects/shortcode/{projectShortcode}/erase: + delete: + tags: + - Admin Projects + description: |- + !ATTENTION! Erase a project with the given shortcode. + This will permanently and irrecoverably remove the project and all of its assets. + Authorization: Requires system admin permissions. + Only available if the feature has been configured on the server side. + operationId: deleteAdminProjectsShortcodeProjectshortcodeErase + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + - name: projectShortcode + in: path + description: The shortcode of a project. Must be a 4 digit hexadecimal String. + required: true + schema: + type: string + example: '0001' + - name: keepAssets + in: query + description: If set to true the assets in ingest will not be removed. + required: false + schema: + default: false + type: boolean + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ProjectOperationResponseADM' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + /admin/projects/iri/{projectIri}/AllData: + get: + tags: + - Admin Projects + description: Returns all ontologies, data, and configuration belonging to a + project identified by the IRI. + operationId: getAdminProjectsIriProjectiriAlldata + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + - name: projectIri + in: path + description: The IRI of a project. Must be URL-encoded. + required: true + schema: + type: string + example: http://rdfh.ch/projects/0001 + responses: + '200': + description: '' + headers: + Content-Disposition: + required: true + schema: + type: string + Content-Type: + required: true + schema: + type: string + content: + application/octet-stream: + schema: + type: string + format: binary + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + /admin/projects/iri/{projectIri}/admin-members: + get: + tags: + - Admin Projects + operationId: getAdminProjectsIriProjectiriAdmin-members + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + - name: projectIri + in: path + description: The IRI of a project. Must be URL-encoded. + required: true + schema: + type: string + example: http://rdfh.ch/projects/0001 + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ProjectAdminMembersGetResponseADM' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + /admin/projects/iri/{projectIri}/members: + get: + tags: + - Admin Projects + description: Returns all project members of a project identified by the IRI. + operationId: getAdminProjectsIriProjectiriMembers + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + - name: projectIri + in: path + description: The IRI of a project. Must be URL-encoded. + required: true + schema: + type: string + example: http://rdfh.ch/projects/0001 + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ProjectMembersGetResponseADM' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + /admin/projects/shortcode/{projectShortcode}/admin-members: + get: + tags: + - Admin Projects + description: Returns all admin members of a project identified by the shortcode. + operationId: getAdminProjectsShortcodeProjectshortcodeAdmin-members + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + - name: projectShortcode + in: path + description: The shortcode of a project. Must be a 4 digit hexadecimal String. + required: true + schema: + type: string + example: '0001' + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ProjectAdminMembersGetResponseADM' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + /admin/projects/shortcode/{projectShortcode}/members: + get: + tags: + - Admin Projects + description: Returns all project members of a project identified by the shortcode. + operationId: getAdminProjectsShortcodeProjectshortcodeMembers + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + - name: projectShortcode + in: path + description: The shortcode of a project. Must be a 4 digit hexadecimal String. + required: true + schema: + type: string + example: '0001' + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ProjectMembersGetResponseADM' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + /admin/projects/shortname/{projectShortname}/admin-members: + get: + tags: + - Admin Projects + description: Returns all admin members of a project identified by the shortname. + operationId: getAdminProjectsShortnameProjectshortnameAdmin-members + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + - name: projectShortname + in: path + description: The shortname of a project. + required: true + schema: + type: string + example: someShortname + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ProjectAdminMembersGetResponseADM' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + /admin/projects/shortname/{projectShortname}/members: + get: + tags: + - Admin Projects + description: Returns all project members of a project identified by the shortname. + operationId: getAdminProjectsShortnameProjectshortnameMembers + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + - name: projectShortname + in: path + description: The shortname of a project. + required: true + schema: + type: string + example: someShortname + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ProjectMembersGetResponseADM' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + /admin/projects/export: + get: + tags: + - Admin Projects + description: Lists existing exports of all projects. + operationId: getAdminProjectsExport + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/ProjectExportInfoResponse' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + /admin/projects/shortcode/{projectShortcode}/export: + post: + tags: + - Admin Projects + description: Trigger an export of a project identified by the shortcode. + operationId: postAdminProjectsShortcodeProjectshortcodeExport + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + - name: projectShortcode + in: path + description: The shortcode of a project. Must be a 4 digit hexadecimal String. + required: true + schema: + type: string + example: '0001' + responses: + '202': + description: '' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + /admin/projects/shortcode/{projectShortcode}/export-await: + post: + tags: + - Admin Projects + description: Trigger an export of a project identified by the shortcode.Returns + the shortcode and the export location when the process has finished successfully. + operationId: postAdminProjectsShortcodeProjectshortcodeExport-await + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + - name: projectShortcode + in: path + description: The shortcode of a project. Must be a 4 digit hexadecimal String. + required: true + schema: + type: string + example: '0001' + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ProjectExportInfoResponse' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + /admin/projects/shortcode/{projectShortcode}/import: + post: + tags: + - Admin Projects + description: Trigger an import of a project identified by the shortcode. + operationId: postAdminProjectsShortcodeProjectshortcodeImport + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + - name: projectShortcode + in: path + description: The shortcode of a project. Must be a 4 digit hexadecimal String. + required: true + schema: + type: string + example: '0001' + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ProjectImportResponse' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + /admin/store/ResetTriplestoreContent: + get: + tags: + - Admin Store + description: Resets the content of the triplestore, only available if configuration + `allowReloadOverHttp` is set to `true`. + operationId: getAdminStoreResettriplestorecontent + parameters: + - name: prependDefaults + in: query + description: Prepend defaults to the data objects. + required: false + schema: + default: true + type: boolean + requestBody: + description: RDF data objects to load into the triplestore, uses defaults + if not present. + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/RdfDataObject' + required: false + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/MessageResponse' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + /admin/users/iri/{userIri}/project-memberships: + get: + tags: + - Admin Users + description: Returns the user's project memberships for a user identified by + their IRI. + operationId: getAdminUsersIriUseririProject-memberships + parameters: + - name: userIri + in: path + description: The user IRI. Must be URL-encoded. + required: true + schema: + type: string + example: http://rdfh.ch/users/ymnLIdo1TzWBsmhq24qWfw + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/UserProjectMembershipsGetResponseADM' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + /admin/users/iri/{userIri}/project-admin-memberships: + get: + tags: + - Admin Users + description: Returns the user's project admin memberships for a user identified + by their IRI. + operationId: getAdminUsersIriUseririProject-admin-memberships + parameters: + - name: userIri + in: path + description: The user IRI. Must be URL-encoded. + required: true + schema: + type: string + example: http://rdfh.ch/users/ymnLIdo1TzWBsmhq24qWfw + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/UserProjectAdminMembershipsGetResponseADM' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + /admin/users/iri/{userIri}/group-memberships: + get: + tags: + - Admin Users + description: Returns the user's group memberships for a user identified by their + IRI. + operationId: getAdminUsersIriUseririGroup-memberships + parameters: + - name: userIri + in: path + description: The user IRI. Must be URL-encoded. + required: true + schema: + type: string + example: http://rdfh.ch/users/ymnLIdo1TzWBsmhq24qWfw + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/UserGroupMembershipsGetResponseADM' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + /admin/users: + get: + tags: + - Admin Users + description: Returns all users. + operationId: getAdminUsers + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/UsersGetResponseADM' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + post: + tags: + - Admin Users + description: Create a new user. + operationId: postAdminUsers + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/UserCreateRequest' + required: true + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/UserResponseADM' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + /admin/users/iri/{userIri}: + get: + tags: + - Admin Users + description: Returns a user identified by their IRI. + operationId: getAdminUsersIriUseriri + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + - name: userIri + in: path + description: The user IRI. Must be URL-encoded. + required: true + schema: + type: string + example: http://rdfh.ch/users/ymnLIdo1TzWBsmhq24qWfw + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/UserResponseADM' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + delete: + tags: + - Admin Users + description: Delete a user identified by IRI (change status to false). + operationId: deleteAdminUsersIriUseriri + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + - name: userIri + in: path + description: The user IRI. Must be URL-encoded. + required: true + schema: + type: string + example: http://rdfh.ch/users/ymnLIdo1TzWBsmhq24qWfw + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/UserResponseADM' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + /admin/users/email/{email}: + get: + tags: + - Admin Users + description: Returns a user identified by their Email. + operationId: getAdminUsersEmailEmail + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + - name: email + in: path + description: The user email. Must be URL-encoded. + required: true + schema: + type: string + example: jane@example.com + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/UserResponseADM' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + /admin/users/username/{username}: + get: + tags: + - Admin Users + description: Returns a user identified by their Username. + operationId: getAdminUsersUsernameUsername + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + - name: username + in: path + description: The user name. Must be URL-encoded. + required: true + schema: + type: string + example: JaneDoe + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/UserResponseADM' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + /admin/users/iri/{userIri}/project-memberships/{projectIri}: + post: + tags: + - Admin Users + description: Add a user to a project identified by IRI. + operationId: postAdminUsersIriUseririProject-membershipsProjectiri + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + - name: userIri + in: path + description: The user IRI. Must be URL-encoded. + required: true + schema: + type: string + example: http://rdfh.ch/users/ymnLIdo1TzWBsmhq24qWfw + - name: projectIri + in: path + description: The IRI of a project. Must be URL-encoded. + required: true + schema: + type: string + example: http://rdfh.ch/projects/0001 + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/UserResponseADM' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + delete: + tags: + - Admin Users + description: Remove a user from a project membership identified by IRI. + operationId: deleteAdminUsersIriUseririProject-membershipsProjectiri + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + - name: userIri + in: path + description: The user IRI. Must be URL-encoded. + required: true + schema: + type: string + example: http://rdfh.ch/users/ymnLIdo1TzWBsmhq24qWfw + - name: projectIri + in: path + description: The IRI of a project. Must be URL-encoded. + required: true + schema: + type: string + example: http://rdfh.ch/projects/0001 + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/UserResponseADM' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + /admin/users/iri/{userIri}/project-admin-memberships/{projectIri}: + post: + tags: + - Admin Users + description: Add a user as an admin to a project identified by IRI. + operationId: postAdminUsersIriUseririProject-admin-membershipsProjectiri + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + - name: userIri + in: path + description: The user IRI. Must be URL-encoded. + required: true + schema: + type: string + example: http://rdfh.ch/users/ymnLIdo1TzWBsmhq24qWfw + - name: projectIri + in: path + description: The IRI of a project. Must be URL-encoded. + required: true + schema: + type: string + example: http://rdfh.ch/projects/0001 + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/UserResponseADM' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + delete: + tags: + - Admin Users + description: Remove a user form an admin project membership identified by IRI. + operationId: deleteAdminUsersIriUseririProject-admin-membershipsProjectiri + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + - name: userIri + in: path + description: The user IRI. Must be URL-encoded. + required: true + schema: + type: string + example: http://rdfh.ch/users/ymnLIdo1TzWBsmhq24qWfw + - name: projectIri + in: path + description: The IRI of a project. Must be URL-encoded. + required: true + schema: + type: string + example: http://rdfh.ch/projects/0001 + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/UserResponseADM' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + /admin/users/iri/{userIri}/group-memberships/{groupIri}: + post: + tags: + - Admin Users + description: Add a user to a group identified by IRI. + operationId: postAdminUsersIriUseririGroup-membershipsGroupiri + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + - name: userIri + in: path + description: The user IRI. Must be URL-encoded. + required: true + schema: + type: string + example: http://rdfh.ch/users/ymnLIdo1TzWBsmhq24qWfw + - name: groupIri + in: path + description: The IRI of a group. Must be URL-encoded. + required: true + schema: + type: string + example: http://rdfh.ch/groups/0042/a95UWs71KUklnFOe1rcw1w + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/UserResponseADM' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + delete: + tags: + - Admin Users + description: Remove a user form an group membership identified by IRI. + operationId: deleteAdminUsersIriUseririGroup-membershipsGroupiri + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + - name: userIri + in: path + description: The user IRI. Must be URL-encoded. + required: true + schema: + type: string + example: http://rdfh.ch/users/ymnLIdo1TzWBsmhq24qWfw + - name: groupIri + in: path + description: The IRI of a group. Must be URL-encoded. + required: true + schema: + type: string + example: http://rdfh.ch/groups/0042/a95UWs71KUklnFOe1rcw1w + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/UserResponseADM' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + /admin/users/iri/{userIri}/BasicUserInformation: + put: + tags: + - Admin Users + description: Update a user's basic information identified by IRI. + operationId: putAdminUsersIriUseririBasicuserinformation + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + - name: userIri + in: path + description: The user IRI. Must be URL-encoded. + required: true + schema: + type: string + example: http://rdfh.ch/users/ymnLIdo1TzWBsmhq24qWfw + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/BasicUserInformationChangeRequest' + required: true + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/UserResponseADM' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + /admin/users/iri/{userIri}/Password: + put: + tags: + - Admin Users + description: Change a user's password identified by IRI. + operationId: putAdminUsersIriUseririPassword + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + - name: userIri + in: path + description: The user IRI. Must be URL-encoded. + required: true + schema: + type: string + example: http://rdfh.ch/users/ymnLIdo1TzWBsmhq24qWfw + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PasswordChangeRequest' + required: true + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/UserResponseADM' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + /admin/users/iri/{userIri}/Status: + put: + tags: + - Admin Users + description: Change a user's status identified by IRI. + operationId: putAdminUsersIriUseririStatus + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + - name: userIri + in: path + description: The user IRI. Must be URL-encoded. + required: true + schema: + type: string + example: http://rdfh.ch/users/ymnLIdo1TzWBsmhq24qWfw + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/StatusChangeRequest' + required: true + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/UserResponseADM' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + /admin/users/iri/{userIri}/SystemAdmin: + put: + tags: + - Admin Users + description: Change a user's SystemAdmin status identified by IRI. + operationId: putAdminUsersIriUseririSystemadmin + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + - name: userIri + in: path + description: The user IRI. Must be URL-encoded. + required: true + schema: + type: string + example: http://rdfh.ch/users/ymnLIdo1TzWBsmhq24qWfw + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/SystemAdminChangeRequest' + required: true + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/UserResponseADM' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + /admin/files/{projectShortcode}/{filename}: + get: + tags: + - Admin Files + description: Returns the permission code and the project's restricted view settings + for a given shortcode and filename. + operationId: getAdminFilesProjectshortcodeFilename + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + - name: projectShortcode + in: path + description: The shortcode of a project. Must be a 4 digit hexadecimal String. + required: true + schema: + type: string + example: '0001' + - name: filename + in: path + required: true + schema: + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/PermissionCodeAndProjectRestrictedViewSettings' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] +components: + schemas: + Active: + title: Active + type: object + AdministrativePermissionADM: + title: AdministrativePermissionADM + type: object + required: + - iri + - forProject + - forGroup + properties: + iri: + type: string + forProject: + type: string + forGroup: + type: string + hasPermissions: + type: array + uniqueItems: true + items: + $ref: '#/components/schemas/PermissionADM' + AdministrativePermissionCreateResponseADM: + title: AdministrativePermissionCreateResponseADM + type: object + required: + - administrativePermission + properties: + administrativePermission: + $ref: '#/components/schemas/AdministrativePermissionADM' + AdministrativePermissionGetResponseADM: + title: AdministrativePermissionGetResponseADM + type: object + required: + - administrativePermission + properties: + administrativePermission: + $ref: '#/components/schemas/AdministrativePermissionADM' + AdministrativePermissionsForProjectGetResponseADM: + title: AdministrativePermissionsForProjectGetResponseADM + type: object + properties: + administrativePermissions: + type: array + items: + $ref: '#/components/schemas/AdministrativePermissionADM' + BadCredentialsException: + title: BadCredentialsException + type: object + required: + - message + properties: + message: + type: string + BadRequestException: + title: BadRequestException + type: object + required: + - message + properties: + message: + type: string + BasicUserInformationChangeRequest: + title: BasicUserInformationChangeRequest + type: object + properties: + username: + $ref: '#/components/schemas/Username' + email: + $ref: '#/components/schemas/Email' + givenName: + $ref: '#/components/schemas/GivenName' + familyName: + $ref: '#/components/schemas/FamilyName' + lang: + $ref: '#/components/schemas/LanguageCode' + CanDeleteListResponseADM: + title: CanDeleteListResponseADM + type: object + required: + - listIri + - canDeleteList + properties: + listIri: + type: string + canDeleteList: + type: boolean + CanJoin: + title: CanJoin + type: object + CannotJoin: + title: CannotJoin + type: object + ChangeDoapRequest: + title: ChangeDoapRequest + type: object + properties: + forGroup: + type: string + forResourceClass: + type: string + forProperty: + type: string + hasPermissions: + type: array + uniqueItems: true + items: + $ref: '#/components/schemas/PermissionADM' + ChangePermissionGroupApiRequestADM: + title: ChangePermissionGroupApiRequestADM + type: object + required: + - forGroup + properties: + forGroup: + type: string + ChangePermissionHasPermissionsApiRequestADM: + title: ChangePermissionHasPermissionsApiRequestADM + type: object + properties: + hasPermissions: + type: array + uniqueItems: true + items: + $ref: '#/components/schemas/PermissionADM' + ChangePermissionPropertyApiRequestADM: + title: ChangePermissionPropertyApiRequestADM + type: object + required: + - forProperty + properties: + forProperty: + type: string + ChangePermissionResourceClassApiRequestADM: + title: ChangePermissionResourceClassApiRequestADM + type: object + required: + - forResourceClass + properties: + forResourceClass: + type: string + ChildNodeDeleteResponseADM: + title: ChildNodeDeleteResponseADM + type: object + required: + - node + properties: + node: + $ref: '#/components/schemas/ListNodeADM' + ChildNodeInfoGetResponseADM: + title: ChildNodeInfoGetResponseADM + type: object + required: + - nodeinfo + properties: + nodeinfo: + $ref: '#/components/schemas/ListChildNodeInfoADM' + Comments: + title: Comments + type: object + properties: + value: + type: array + items: + $ref: '#/components/schemas/StringLiteralV2' + CopyrightAttribution: + title: CopyrightAttribution + type: object + required: + - value + properties: + value: + type: string + CreateAdministrativePermissionAPIRequestADM: + title: CreateAdministrativePermissionAPIRequestADM + type: object + required: + - forProject + - forGroup + properties: + id: + type: string + forProject: + type: string + forGroup: + type: string + hasPermissions: + type: array + uniqueItems: true + items: + $ref: '#/components/schemas/PermissionADM' + CreateDefaultObjectAccessPermissionAPIRequestADM: + title: CreateDefaultObjectAccessPermissionAPIRequestADM + type: object + required: + - forProject + properties: + id: + type: string + forProject: + type: string + forGroup: + type: string + forResourceClass: + type: string + forProperty: + type: string + hasPermissions: + type: array + uniqueItems: true + items: + $ref: '#/components/schemas/PermissionADM' + DefaultObjectAccessPermissionADM: + title: DefaultObjectAccessPermissionADM + type: object + required: + - iri + - forProject + properties: + iri: + type: string + forProject: + type: string + forGroup: + type: string + forResourceClass: + type: string + forProperty: + type: string + hasPermissions: + type: array + uniqueItems: true + items: + $ref: '#/components/schemas/PermissionADM' + DefaultObjectAccessPermissionCreateResponseADM: + title: DefaultObjectAccessPermissionCreateResponseADM + type: object + required: + - defaultObjectAccessPermission + properties: + defaultObjectAccessPermission: + $ref: '#/components/schemas/DefaultObjectAccessPermissionADM' + DefaultObjectAccessPermissionGetResponseADM: + title: DefaultObjectAccessPermissionGetResponseADM + type: object + required: + - defaultObjectAccessPermission + properties: + defaultObjectAccessPermission: + $ref: '#/components/schemas/DefaultObjectAccessPermissionADM' + DefaultObjectAccessPermissionsForProjectGetResponseADM: + title: DefaultObjectAccessPermissionsForProjectGetResponseADM + type: object + properties: + defaultObjectAccessPermissions: + type: array + items: + $ref: '#/components/schemas/DefaultObjectAccessPermissionADM' + Description: + title: Description + type: object + required: + - value + properties: + value: + $ref: '#/components/schemas/StringLiteralV2' + DuplicateValueException: + title: DuplicateValueException + type: object + required: + - message + properties: + message: + type: string + Email: + title: Email + type: object + required: + - value + properties: + value: + type: string + FamilyName: + title: FamilyName + type: object + required: + - value + properties: + value: + type: string + ForbiddenException: + title: ForbiddenException + type: object + required: + - message + properties: + message: + type: string + GivenName: + title: GivenName + type: object + required: + - value + properties: + value: + type: string + GravsearchException: + title: GravsearchException + type: object + required: + - message + properties: + message: + type: string + Group: + title: Group + type: object + required: + - id + - name + - status + - selfjoin + properties: + id: + type: string + name: + type: string + descriptions: + type: array + items: + $ref: '#/components/schemas/StringLiteralV2' + project: + $ref: '#/components/schemas/Project' + status: + type: boolean + selfjoin: + type: boolean + GroupCreateRequest: + title: GroupCreateRequest + type: object + required: + - name + - descriptions + - project + - status + - selfjoin + properties: + id: + $ref: '#/components/schemas/GroupIri' + name: + $ref: '#/components/schemas/GroupName' + descriptions: + $ref: '#/components/schemas/GroupDescriptions' + project: + $ref: '#/components/schemas/ProjectIri' + status: + $ref: '#/components/schemas/GroupStatus' + selfjoin: + $ref: '#/components/schemas/GroupSelfJoin' + GroupDescriptions: + title: GroupDescriptions + type: object + properties: + value: + type: array + items: + $ref: '#/components/schemas/StringLiteralV2' + GroupGetResponseADM: + title: GroupGetResponseADM + type: object + required: + - group + properties: + group: + $ref: '#/components/schemas/Group' + GroupIri: + title: GroupIri + type: object + required: + - value + properties: + value: + type: string + GroupMembersGetResponseADM: + title: GroupMembersGetResponseADM + type: object + properties: + members: + type: array + items: + $ref: '#/components/schemas/User' + GroupName: + title: GroupName + type: object + required: + - value + properties: + value: + type: string + GroupSelfJoin: + title: GroupSelfJoin + type: object + required: + - value + properties: + value: + type: boolean + GroupStatus: + title: GroupStatus + type: object + required: + - value + properties: + value: + type: boolean + GroupStatusUpdateRequest: + title: GroupStatusUpdateRequest + type: object + required: + - status + properties: + status: + $ref: '#/components/schemas/GroupStatus' + GroupUpdateRequest: + title: GroupUpdateRequest + type: object + properties: + name: + $ref: '#/components/schemas/GroupName' + descriptions: + $ref: '#/components/schemas/GroupDescriptions' + status: + $ref: '#/components/schemas/GroupStatus' + selfjoin: + $ref: '#/components/schemas/GroupSelfJoin' + GroupsGetResponseADM: + title: GroupsGetResponseADM + type: object + properties: + groups: + type: array + items: + $ref: '#/components/schemas/Group' + Inactive: + title: Inactive + type: object + Keyword: + title: Keyword + type: object + required: + - value + properties: + value: + type: string + Labels: + title: Labels + type: object + properties: + value: + type: array + items: + $ref: '#/components/schemas/StringLiteralV2' + LanguageCode: + title: LanguageCode + type: object + required: + - value + properties: + value: + type: string + License: + title: License + type: object + required: + - value + properties: + value: + type: string + ListADM: + title: ListADM + type: object + required: + - listinfo + properties: + listinfo: + $ref: '#/components/schemas/ListRootNodeInfoADM' + children: + type: array + items: + $ref: '#/components/schemas/ListChildNodeADM' + ListChangeCommentsRequest: + title: ListChangeCommentsRequest + type: object + required: + - comments + properties: + comments: + $ref: '#/components/schemas/Comments' + ListChangeLabelsRequest: + title: ListChangeLabelsRequest + type: object + required: + - labels + properties: + labels: + $ref: '#/components/schemas/Labels' + ListChangeNameRequest: + title: ListChangeNameRequest + type: object + required: + - name + properties: + name: + $ref: '#/components/schemas/ListName' + ListChangePositionRequest: + title: ListChangePositionRequest + type: object + required: + - position + - parentNodeIri + properties: + position: + $ref: '#/components/schemas/Position' + parentNodeIri: + $ref: '#/components/schemas/ListIri' + ListChangeRequest: + title: ListChangeRequest + type: object + required: + - listIri + - projectIri + properties: + listIri: + $ref: '#/components/schemas/ListIri' + projectIri: + $ref: '#/components/schemas/ProjectIri' + hasRootNode: + $ref: '#/components/schemas/ListIri' + position: + $ref: '#/components/schemas/Position' + name: + $ref: '#/components/schemas/ListName' + labels: + $ref: '#/components/schemas/Labels' + comments: + $ref: '#/components/schemas/Comments' + ListChildNodeADM: + title: ListChildNodeADM + type: object + required: + - id + - labels + - comments + - position + - hasRootNode + properties: + id: + type: string + name: + type: string + labels: + $ref: '#/components/schemas/StringLiteralSequenceV2' + comments: + $ref: '#/components/schemas/StringLiteralSequenceV2' + position: + type: integer + format: int32 + hasRootNode: + type: string + children: + type: array + items: + $ref: '#/components/schemas/ListChildNodeADM' + ListChildNodeInfoADM: + title: ListChildNodeInfoADM + type: object + required: + - id + - labels + - comments + - position + - hasRootNode + properties: + id: + type: string + name: + type: string + labels: + $ref: '#/components/schemas/StringLiteralSequenceV2' + comments: + $ref: '#/components/schemas/StringLiteralSequenceV2' + position: + type: integer + format: int32 + hasRootNode: + type: string + ListCreateRootNodeRequest: + title: ListCreateRootNodeRequest + type: object + required: + - comments + - labels + - projectIri + properties: + id: + $ref: '#/components/schemas/ListIri' + comments: + $ref: '#/components/schemas/Comments' + labels: + $ref: '#/components/schemas/Labels' + name: + $ref: '#/components/schemas/ListName' + projectIri: + $ref: '#/components/schemas/ProjectIri' + ListDeleteResponseADM: + title: ListDeleteResponseADM + type: object + required: + - iri + - deleted + properties: + iri: + type: string + deleted: + type: boolean + ListGetResponseADM: + title: ListGetResponseADM + type: object + required: + - list + properties: + list: + $ref: '#/components/schemas/ListADM' + ListIri: + title: ListIri + type: object + required: + - value + properties: + value: + type: string + ListItemDeleteResponseADM: + title: ListItemDeleteResponseADM + oneOf: + - $ref: '#/components/schemas/ChildNodeDeleteResponseADM' + - $ref: '#/components/schemas/ListDeleteResponseADM' + ListItemGetResponseADM: + title: ListItemGetResponseADM + oneOf: + - $ref: '#/components/schemas/ListGetResponseADM' + - $ref: '#/components/schemas/ListNodeGetResponseADM' + ListName: + title: ListName + type: object + required: + - value + properties: + value: + type: string + ListNodeADM: + title: ListNodeADM + oneOf: + - $ref: '#/components/schemas/ListChildNodeADM' + - $ref: '#/components/schemas/ListRootNodeADM' + ListNodeCommentsDeleteResponseADM: + title: ListNodeCommentsDeleteResponseADM + type: object + required: + - nodeIri + - commentsDeleted + properties: + nodeIri: + type: string + commentsDeleted: + type: boolean + ListNodeGetResponseADM: + title: ListNodeGetResponseADM + type: object + required: + - node + properties: + node: + $ref: '#/components/schemas/NodeADM' + ListRootNodeADM: + title: ListRootNodeADM + type: object + required: + - id + - projectIri + - labels + - comments + - isRootNode + properties: + id: + type: string + projectIri: + type: string + name: + type: string + labels: + $ref: '#/components/schemas/StringLiteralSequenceV2' + comments: + $ref: '#/components/schemas/StringLiteralSequenceV2' + children: + type: array + items: + $ref: '#/components/schemas/ListChildNodeADM' + isRootNode: + type: boolean + ListRootNodeInfoADM: + title: ListRootNodeInfoADM + type: object + required: + - id + - projectIri + - labels + - comments + - isRootNode + properties: + id: + type: string + projectIri: + type: string + name: + type: string + labels: + $ref: '#/components/schemas/StringLiteralSequenceV2' + comments: + $ref: '#/components/schemas/StringLiteralSequenceV2' + isRootNode: + type: boolean + ListsGetResponseADM: + title: ListsGetResponseADM + type: object + properties: + lists: + type: array + items: + $ref: '#/components/schemas/ListRootNodeInfoADM' + Logo: + title: Logo + type: object + required: + - value + properties: + value: + type: string + Longname: + title: Longname + type: object + required: + - value + properties: + value: + type: string + Map_Seq_IRI: + title: Map_Seq_IRI + type: object + additionalProperties: + type: array + items: + type: string + Map_Set_PermissionADM: + title: Map_Set_PermissionADM + type: object + additionalProperties: + type: array + uniqueItems: true + items: + $ref: '#/components/schemas/PermissionADM' + MessageResponse: + title: MessageResponse + type: object + required: + - message + properties: + message: + type: string + NodeADM: + title: NodeADM + type: object + required: + - nodeinfo + properties: + nodeinfo: + $ref: '#/components/schemas/ListChildNodeInfoADM' + children: + type: array + items: + $ref: '#/components/schemas/ListChildNodeADM' + NodeInfoGetResponseADM: + title: NodeInfoGetResponseADM + oneOf: + - $ref: '#/components/schemas/ChildNodeInfoGetResponseADM' + - $ref: '#/components/schemas/RootNodeInfoGetResponseADM' + NodePositionChangeResponseADM: + title: NodePositionChangeResponseADM + type: object + required: + - node + properties: + node: + $ref: '#/components/schemas/ListNodeADM' + NotFoundException: + title: NotFoundException + type: object + required: + - message + properties: + message: + type: string + Password: + title: Password + type: object + required: + - value + properties: + value: + type: string + PasswordChangeRequest: + title: PasswordChangeRequest + type: object + required: + - requesterPassword + - newPassword + properties: + requesterPassword: + $ref: '#/components/schemas/Password' + newPassword: + $ref: '#/components/schemas/Password' + PermissionADM: + title: PermissionADM + type: object + required: + - name + properties: + name: + type: string + additionalInformation: + type: string + permissionCode: + type: integer + format: int32 + PermissionCodeAndProjectRestrictedViewSettings: + title: PermissionCodeAndProjectRestrictedViewSettings + type: object + required: + - permissionCode + properties: + permissionCode: + type: integer + format: int32 + restrictedViewSettings: + $ref: '#/components/schemas/ProjectRestrictedViewSettingsADM' + PermissionDeleteResponseADM: + title: PermissionDeleteResponseADM + type: object + required: + - permissionIri + - deleted + properties: + permissionIri: + type: string + deleted: + type: boolean + PermissionGetResponseADM: + title: PermissionGetResponseADM + oneOf: + - $ref: '#/components/schemas/AdministrativePermissionGetResponseADM' + - $ref: '#/components/schemas/DefaultObjectAccessPermissionGetResponseADM' + PermissionInfoADM: + title: PermissionInfoADM + type: object + required: + - iri + - permissionType + properties: + iri: + type: string + permissionType: + type: string + PermissionsDataADM: + title: PermissionsDataADM + type: object + required: + - groupsPerProject + - administrativePermissionsPerProject + properties: + groupsPerProject: + $ref: '#/components/schemas/Map_Seq_IRI' + administrativePermissionsPerProject: + $ref: '#/components/schemas/Map_Set_PermissionADM' + PermissionsForProjectGetResponseADM: + title: PermissionsForProjectGetResponseADM + type: object + properties: + permissions: + type: array + uniqueItems: true + items: + $ref: '#/components/schemas/PermissionInfoADM' + Position: + title: Position + type: object + required: + - value + properties: + value: + type: integer + format: int32 + Project: + title: Project + type: object + required: + - id + - shortname + - shortcode + - status + - selfjoin + properties: + id: + type: string + shortname: + type: string + shortcode: + type: string + longname: + type: string + description: + type: array + items: + $ref: '#/components/schemas/StringLiteralV2' + keywords: + type: array + items: + type: string + logo: + type: string + ontologies: + type: array + items: + type: string + status: + type: boolean + selfjoin: + type: boolean + copyrightAttribution: + $ref: '#/components/schemas/CopyrightAttribution' + license: + $ref: '#/components/schemas/License' + ProjectAdminMembersGetResponseADM: + title: ProjectAdminMembersGetResponseADM + type: object + properties: + members: + type: array + items: + $ref: '#/components/schemas/User' + ProjectCreateRequest: + title: ProjectCreateRequest + type: object + required: + - shortname + - shortcode + - status + - selfjoin + properties: + id: + $ref: '#/components/schemas/ProjectIri' + shortname: + $ref: '#/components/schemas/Shortname' + shortcode: + $ref: '#/components/schemas/Shortcode' + longname: + $ref: '#/components/schemas/Longname' + description: + type: array + items: + $ref: '#/components/schemas/Description' + keywords: + type: array + items: + $ref: '#/components/schemas/Keyword' + logo: + $ref: '#/components/schemas/Logo' + status: + $ref: '#/components/schemas/Status' + selfjoin: + $ref: '#/components/schemas/SelfJoin' + copyrightAttribution: + $ref: '#/components/schemas/CopyrightAttribution' + license: + $ref: '#/components/schemas/License' + ProjectExportInfoResponse: + title: ProjectExportInfoResponse + type: object + required: + - projectShortcode + - location + properties: + projectShortcode: + type: string + location: + type: string + ProjectGetResponse: + title: ProjectGetResponse + type: object + required: + - project + properties: + project: + $ref: '#/components/schemas/Project' + ProjectImportResponse: + title: ProjectImportResponse + type: object + required: + - location + properties: + location: + type: string + ProjectIri: + title: ProjectIri + type: object + required: + - value + properties: + value: + type: string + ProjectKeywordsGetResponse: + title: ProjectKeywordsGetResponse + type: object + properties: + keywords: + type: array + items: + type: string + ProjectMembersGetResponseADM: + title: ProjectMembersGetResponseADM + type: object + properties: + members: + type: array + items: + $ref: '#/components/schemas/User' + ProjectOperationResponseADM: + title: ProjectOperationResponseADM + type: object + required: + - project + properties: + project: + $ref: '#/components/schemas/Project' + ProjectRestrictedViewSettingsADM: + title: ProjectRestrictedViewSettingsADM + type: object + required: + - watermark + properties: + size: + type: string + watermark: + type: boolean + ProjectRestrictedViewSettingsGetResponseADM: + title: ProjectRestrictedViewSettingsGetResponseADM + type: object + required: + - settings + properties: + settings: + $ref: '#/components/schemas/ProjectRestrictedViewSettingsADM' + ProjectUpdateRequest: + title: ProjectUpdateRequest + type: object + properties: + shortname: + $ref: '#/components/schemas/Shortname' + longname: + $ref: '#/components/schemas/Longname' + description: + type: array + items: + $ref: '#/components/schemas/Description' + keywords: + type: array + items: + $ref: '#/components/schemas/Keyword' + logo: + $ref: '#/components/schemas/Logo' + status: + $ref: '#/components/schemas/Status' + selfjoin: + $ref: '#/components/schemas/SelfJoin' + copyrightAttribution: + $ref: '#/components/schemas/CopyrightAttribution' + license: + $ref: '#/components/schemas/License' + ProjectsGetResponse: + title: ProjectsGetResponse + type: object + properties: + projects: + type: array + items: + $ref: '#/components/schemas/Project' + ProjectsKeywordsGetResponse: + title: ProjectsKeywordsGetResponse + type: object + properties: + keywords: + type: array + items: + type: string + RdfDataObject: + title: RdfDataObject + type: object + required: + - path + - name + properties: + path: + type: string + name: + type: string + RestrictedViewResponse: + title: RestrictedViewResponse + type: object + properties: + size: + $ref: '#/components/schemas/Size' + watermark: + $ref: '#/components/schemas/Watermark' + RootNodeInfoGetResponseADM: + title: RootNodeInfoGetResponseADM + type: object + required: + - listinfo + properties: + listinfo: + $ref: '#/components/schemas/ListRootNodeInfoADM' + SelfJoin: + title: SelfJoin + oneOf: + - $ref: '#/components/schemas/CanJoin' + - $ref: '#/components/schemas/CannotJoin' + SetRestrictedViewRequest: + title: SetRestrictedViewRequest + type: object + properties: + size: + $ref: '#/components/schemas/Size' + watermark: + $ref: '#/components/schemas/Watermark' + Shortcode: + title: Shortcode + type: object + required: + - value + properties: + value: + type: string + Shortname: + title: Shortname + type: object + required: + - value + properties: + value: + type: string + Size: + title: Size + type: object + required: + - value + properties: + value: + type: string + Status: + title: Status + oneOf: + - $ref: '#/components/schemas/Active' + - $ref: '#/components/schemas/Inactive' + StatusChangeRequest: + title: StatusChangeRequest + type: object + required: + - status + properties: + status: + $ref: '#/components/schemas/UserStatus' + StringLiteralSequenceV2: + title: StringLiteralSequenceV2 + type: object + properties: + stringLiterals: + type: array + items: + $ref: '#/components/schemas/StringLiteralV2' + StringLiteralV2: + title: StringLiteralV2 + type: object + required: + - value + properties: + value: + type: string + language: + type: string + SystemAdmin: + title: SystemAdmin + type: object + required: + - value + properties: + value: + type: boolean + SystemAdminChangeRequest: + title: SystemAdminChangeRequest + type: object + required: + - systemAdmin + properties: + systemAdmin: + $ref: '#/components/schemas/SystemAdmin' + User: + title: User + type: object + required: + - id + - username + - email + - givenName + - familyName + - status + - lang + - permissions + properties: + id: + type: string + username: + type: string + email: + type: string + givenName: + type: string + familyName: + type: string + status: + type: boolean + lang: + type: string + password: + type: string + groups: + type: array + items: + $ref: '#/components/schemas/Group' + projects: + type: array + items: + $ref: '#/components/schemas/Project' + permissions: + $ref: '#/components/schemas/PermissionsDataADM' + UserCreateRequest: + title: UserCreateRequest + type: object + required: + - username + - email + - givenName + - familyName + - password + - status + - lang + - systemAdmin + properties: + id: + $ref: '#/components/schemas/UserIri' + username: + $ref: '#/components/schemas/Username' + email: + $ref: '#/components/schemas/Email' + givenName: + $ref: '#/components/schemas/GivenName' + familyName: + $ref: '#/components/schemas/FamilyName' + password: + $ref: '#/components/schemas/Password' + status: + $ref: '#/components/schemas/UserStatus' + lang: + $ref: '#/components/schemas/LanguageCode' + systemAdmin: + $ref: '#/components/schemas/SystemAdmin' + UserGroupMembershipsGetResponseADM: + title: UserGroupMembershipsGetResponseADM + type: object + properties: + groups: + type: array + items: + $ref: '#/components/schemas/Group' + UserIri: + title: UserIri + type: object + required: + - value + properties: + value: + type: string + UserProjectAdminMembershipsGetResponseADM: + title: UserProjectAdminMembershipsGetResponseADM + type: object + properties: + projects: + type: array + items: + $ref: '#/components/schemas/Project' + UserProjectMembershipsGetResponseADM: + title: UserProjectMembershipsGetResponseADM + type: object + properties: + projects: + type: array + items: + $ref: '#/components/schemas/Project' + UserResponseADM: + title: UserResponseADM + type: object + required: + - user + properties: + user: + $ref: '#/components/schemas/User' + UserStatus: + title: UserStatus + type: object + required: + - value + properties: + value: + type: boolean + Username: + title: Username + type: object + required: + - value + properties: + value: + type: string + UsersGetResponseADM: + title: UsersGetResponseADM + type: object + properties: + users: + type: array + items: + $ref: '#/components/schemas/User' + ValidationException: + title: ValidationException + type: object + required: + - msg + properties: + msg: + type: string + Watermark: + title: Watermark + type: object + required: + - value + properties: + value: + type: boolean + securitySchemes: + httpAuth: + type: http + scheme: bearer + httpAuth1: + type: http + scheme: basic diff --git a/03-endpoints/generated-openapi/openapi-management.yml b/03-endpoints/generated-openapi/openapi-management.yml new file mode 100644 index 0000000000..1eae7574a7 --- /dev/null +++ b/03-endpoints/generated-openapi/openapi-management.yml @@ -0,0 +1,203 @@ +openapi: 3.1.0 +info: + title: webapi-management + version: v30.21.0-12-gf9dcd98 +servers: +- url: http://localhost:3333 + description: Local development server +- url: https://api.dasch.swiss + description: Production server +paths: + /version: + get: + tags: + - Management + operationId: getVersion + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/VersionResponse' + example: + webapi: v30.21.0-12-gf9dcd98 + buildCommit: f9dcd9868 + buildTime: '2024-11-20T17:34:00.787393694Z' + fuseki: 5.2.0 + pekkoHttp: 1.1.0 + scala: 3.3.4 + sipi: v3.14.0 + name: version + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + /health: + get: + tags: + - Management + operationId: getHealth + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/HealthResponse' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' +components: + schemas: + BadCredentialsException: + title: BadCredentialsException + type: object + required: + - message + properties: + message: + type: string + BadRequestException: + title: BadRequestException + type: object + required: + - message + properties: + message: + type: string + DuplicateValueException: + title: DuplicateValueException + type: object + required: + - message + properties: + message: + type: string + ForbiddenException: + title: ForbiddenException + type: object + required: + - message + properties: + message: + type: string + GravsearchException: + title: GravsearchException + type: object + required: + - message + properties: + message: + type: string + HealthResponse: + title: HealthResponse + type: object + required: + - name + - severity + - status + - message + properties: + name: + type: string + severity: + type: string + status: + type: boolean + message: + type: string + NotFoundException: + title: NotFoundException + type: object + required: + - message + properties: + message: + type: string + ValidationException: + title: ValidationException + type: object + required: + - msg + properties: + msg: + type: string + VersionResponse: + title: VersionResponse + type: object + required: + - webapi + - buildCommit + - buildTime + - fuseki + - pekkoHttp + - scala + - sipi + - name + properties: + webapi: + type: string + buildCommit: + type: string + buildTime: + type: string + fuseki: + type: string + pekkoHttp: + type: string + scala: + type: string + sipi: + type: string + name: + type: string diff --git a/03-endpoints/generated-openapi/openapi-shacl.yml b/03-endpoints/generated-openapi/openapi-shacl.yml new file mode 100644 index 0000000000..df5944a90e --- /dev/null +++ b/03-endpoints/generated-openapi/openapi-shacl.yml @@ -0,0 +1,150 @@ +openapi: 3.1.0 +info: + title: webapi-shacl + version: v30.21.0-12-gf9dcd98 +servers: +- url: http://localhost:3333 + description: Local development server +- url: https://api.dasch.swiss + description: Production server +paths: + /shacl/validate: + post: + tags: + - Shacl + description: foo + operationId: postShaclValidate + requestBody: + content: + multipart/form-data: + schema: + $ref: '#/components/schemas/ValidationFormData' + required: true + responses: + '200': + description: |2 + + The validation report in Turtle format. + + ```turtle + @prefix sh: . + @prefix rdf: . + + [ rdf:type sh:ValidationReport; + sh:conforms true + ] . + ``` + content: + text/turtle: + schema: + type: string + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' +components: + schemas: + BadCredentialsException: + title: BadCredentialsException + type: object + required: + - message + properties: + message: + type: string + BadRequestException: + title: BadRequestException + type: object + required: + - message + properties: + message: + type: string + DuplicateValueException: + title: DuplicateValueException + type: object + required: + - message + properties: + message: + type: string + ForbiddenException: + title: ForbiddenException + type: object + required: + - message + properties: + message: + type: string + GravsearchException: + title: GravsearchException + type: object + required: + - message + properties: + message: + type: string + NotFoundException: + title: NotFoundException + type: object + required: + - message + properties: + message: + type: string + ValidationException: + title: ValidationException + type: object + required: + - msg + properties: + msg: + type: string + ValidationFormData: + title: ValidationFormData + type: object + required: + - data.ttl + - shacl.ttl + properties: + data.ttl: + description: The data to be validated. + type: string + format: binary + shacl.ttl: + description: The shapes for validation. + type: string + format: binary + validateShapes: + description: Should shapes also be validated. + type: boolean + reportDetails: + description: Add `sh:details` to the validation report. + type: boolean + addBlankNodes: + description: Add blank nodes to the validation report. + type: boolean diff --git a/03-endpoints/generated-openapi/openapi-v2.yml b/03-endpoints/generated-openapi/openapi-v2.yml new file mode 100644 index 0000000000..a209c4e04e --- /dev/null +++ b/03-endpoints/generated-openapi/openapi-v2.yml @@ -0,0 +1,1705 @@ +openapi: 3.1.0 +info: + title: webapi-v2 + version: v30.21.0-12-gf9dcd98 +servers: +- url: http://localhost:3333 + description: Local development server +- url: https://api.dasch.swiss + description: Production server +paths: + /v2/lists/{listIri}: + get: + tags: + - v2 + description: Returns a list (a graph with all list nodes). + operationId: getV2ListsListiri + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + - name: listIri + in: path + description: The iri to a list. + required: true + schema: + type: string + example: http://rdfh.ch/lists/0001/VXDzRM5HScmYXDCFpR6YgA + - name: Accept + in: header + description: |- + The RDF format to be used for the request. Valid values are: List(JSON-LD, Turtle, TriG, RDF/XML, N-Quads) + If not specified or unknown, the fallback RDF format JSON-LD will be used. + required: false + schema: + type: string + - name: x-knora-accept-schema + in: header + description: |- + The ontology schema to be used for the request. + If not specified, the default schema ApiV2Complex will be used. + required: false + schema: + type: string + - name: schema + in: query + description: |- + The ontology schema to be used for the request. + If not specified, the default schema ApiV2Complex will be used. + required: false + schema: + type: string + - name: x-knora-json-ld-rendering + in: header + description: |- + The JSON-LD rendering to be used for the request (flat or hierarchical). + If not specified, hierarchical JSON-LD will be used. + required: false + schema: + type: string + - name: markup + in: query + description: The markup rendering to be used for the request (XML or standoff). + required: false + schema: + type: string + - name: x-knora-accept-markup + in: header + description: The markup rendering to be used for the request (XML or standoff). + required: false + schema: + type: string + responses: + '200': + description: '' + headers: + Content-Type: + required: true + schema: + type: string + content: + text/plain: + schema: + type: string + example: + rdfs:label: Listenwurzel + knora-api:attachedToProject: + '@id': http://rdfh.ch/projects/0001 + knora-api:hasSubListNode: + - rdfs:label: Tree list node 01 + knora-api:hasRootNode: + '@id': http://rdfh.ch/lists/0001/treeList + knora-api:listNodePosition: 0 + '@type': knora-api:ListNode + '@id': http://rdfh.ch/lists/0001/treeList01 + - rdfs:label: Baumlistenknoten 02 + knora-api:hasRootNode: + '@id': http://rdfh.ch/lists/0001/treeList + knora-api:listNodePosition: 1 + '@type': knora-api:ListNode + '@id': http://rdfh.ch/lists/0001/treeList02 + - rdfs:label: Tree list node 03 + knora-api:hasRootNode: + '@id': http://rdfh.ch/lists/0001/treeList + knora-api:hasSubListNode: + - rdfs:label: Tree list node 10 + knora-api:hasRootNode: + '@id': http://rdfh.ch/lists/0001/treeList + knora-api:listNodePosition: 0 + '@type': knora-api:ListNode + '@id': http://rdfh.ch/lists/0001/treeList10 + - rdfs:label: Tree list node 11 + knora-api:hasRootNode: + '@id': http://rdfh.ch/lists/0001/treeList + knora-api:listNodePosition: 1 + '@type': knora-api:ListNode + '@id': http://rdfh.ch/lists/0001/treeList11 + knora-api:listNodePosition: 2 + '@type': knora-api:ListNode + '@id': http://rdfh.ch/lists/0001/treeList03 + knora-api:isRootNode: true + rdfs:comment: Anything Tree List + '@type': knora-api:ListNode + '@id': http://rdfh.ch/lists/0001/treeList + '@context': + rdf: http://www.w3.org/1999/02/22-rdf-syntax-ns# + knora-api: http://api.knora.org/ontology/knora-api/v2# + owl: http://www.w3.org/2002/07/owl# + rdfs: http://www.w3.org/2000/01/rdf-schema# + xsd: http://www.w3.org/2001/XMLSchema# + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + /v2/node/{listIri}: + get: + tags: + - v2 + description: Returns a list node. + operationId: getV2NodeListiri + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + - name: listIri + in: path + description: The iri to a list. + required: true + schema: + type: string + example: http://rdfh.ch/lists/0001/VXDzRM5HScmYXDCFpR6YgA + - name: Accept + in: header + description: |- + The RDF format to be used for the request. Valid values are: List(JSON-LD, Turtle, TriG, RDF/XML, N-Quads) + If not specified or unknown, the fallback RDF format JSON-LD will be used. + required: false + schema: + type: string + - name: x-knora-accept-schema + in: header + description: |- + The ontology schema to be used for the request. + If not specified, the default schema ApiV2Complex will be used. + required: false + schema: + type: string + - name: schema + in: query + description: |- + The ontology schema to be used for the request. + If not specified, the default schema ApiV2Complex will be used. + required: false + schema: + type: string + - name: x-knora-json-ld-rendering + in: header + description: |- + The JSON-LD rendering to be used for the request (flat or hierarchical). + If not specified, hierarchical JSON-LD will be used. + required: false + schema: + type: string + - name: markup + in: query + description: The markup rendering to be used for the request (XML or standoff). + required: false + schema: + type: string + - name: x-knora-accept-markup + in: header + description: The markup rendering to be used for the request (XML or standoff). + required: false + schema: + type: string + responses: + '200': + description: '' + headers: + Content-Type: + required: true + schema: + type: string + content: + text/plain: + schema: + type: string + example: + rdfs:label: Tree list node 11 + knora-api:hasRootNode: + '@id': http://rdfh.ch/lists/0001/treeList + knora-api:listNodePosition: 1 + '@type': knora-api:ListNode + '@id': http://rdfh.ch/lists/0001/treeList11 + '@context': + rdf: http://www.w3.org/1999/02/22-rdf-syntax-ns# + knora-api: http://api.knora.org/ontology/knora-api/v2# + owl: http://www.w3.org/2002/07/owl# + rdfs: http://www.w3.org/2000/01/rdf-schema# + xsd: http://www.w3.org/2001/XMLSchema# + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + /v2/resources/info: + get: + tags: + - V2 Resources + operationId: getV2ResourcesInfo + parameters: + - name: x-knora-accept-project + in: header + required: true + schema: + type: string + - name: resourceClass + in: query + required: true + schema: + type: string + - name: order + in: query + required: false + schema: + type: string + - name: orderBy + in: query + required: false + schema: + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ListResponseDto' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + /v2/searchextended: + post: + tags: + - V2 Search + description: Search for resources using a Gravsearch query. + operationId: postV2Searchextended + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + - name: Accept + in: header + description: |- + The RDF format to be used for the request. Valid values are: List(JSON-LD, Turtle, TriG, RDF/XML, N-Quads) + If not specified or unknown, the fallback RDF format JSON-LD will be used. + required: false + schema: + type: string + - name: x-knora-accept-schema + in: header + description: |- + The ontology schema to be used for the request. + If not specified, the default schema ApiV2Complex will be used. + required: false + schema: + type: string + - name: schema + in: query + description: |- + The ontology schema to be used for the request. + If not specified, the default schema ApiV2Complex will be used. + required: false + schema: + type: string + - name: x-knora-json-ld-rendering + in: header + description: |- + The JSON-LD rendering to be used for the request (flat or hierarchical). + If not specified, hierarchical JSON-LD will be used. + required: false + schema: + type: string + - name: markup + in: query + description: The markup rendering to be used for the request (XML or standoff). + required: false + schema: + type: string + - name: x-knora-accept-markup + in: header + description: The markup rendering to be used for the request (XML or standoff). + required: false + schema: + type: string + requestBody: + description: The Gravsearch query. See https://docs.dasch.swiss/latest/DSP-API/03-endpoints/api-v2/query-language/ + content: + text/plain: + schema: + type: string + required: true + responses: + '200': + description: '' + headers: + Content-Type: + required: true + schema: + type: string + content: + text/plain: + schema: + type: string + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + /v2/searchextended/{p1}: + get: + tags: + - V2 Search + description: Search for resources using a Gravsearch query. + operationId: getV2SearchextendedP1 + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + - name: p1 + in: path + description: The Gravsearch query. See https://docs.dasch.swiss/latest/DSP-API/03-endpoints/api-v2/query-language/ + required: true + schema: + type: string + - name: Accept + in: header + description: |- + The RDF format to be used for the request. Valid values are: List(JSON-LD, Turtle, TriG, RDF/XML, N-Quads) + If not specified or unknown, the fallback RDF format JSON-LD will be used. + required: false + schema: + type: string + - name: x-knora-accept-schema + in: header + description: |- + The ontology schema to be used for the request. + If not specified, the default schema ApiV2Complex will be used. + required: false + schema: + type: string + - name: schema + in: query + description: |- + The ontology schema to be used for the request. + If not specified, the default schema ApiV2Complex will be used. + required: false + schema: + type: string + - name: x-knora-json-ld-rendering + in: header + description: |- + The JSON-LD rendering to be used for the request (flat or hierarchical). + If not specified, hierarchical JSON-LD will be used. + required: false + schema: + type: string + - name: markup + in: query + description: The markup rendering to be used for the request (XML or standoff). + required: false + schema: + type: string + - name: x-knora-accept-markup + in: header + description: The markup rendering to be used for the request (XML or standoff). + required: false + schema: + type: string + responses: + '200': + description: '' + headers: + Content-Type: + required: true + schema: + type: string + content: + text/plain: + schema: + type: string + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + /v2/searchextended/count: + post: + tags: + - V2 Search + description: Count resources using a Gravsearch query. + operationId: postV2SearchextendedCount + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + - name: Accept + in: header + description: |- + The RDF format to be used for the request. Valid values are: List(JSON-LD, Turtle, TriG, RDF/XML, N-Quads) + If not specified or unknown, the fallback RDF format JSON-LD will be used. + required: false + schema: + type: string + - name: x-knora-accept-schema + in: header + description: |- + The ontology schema to be used for the request. + If not specified, the default schema ApiV2Complex will be used. + required: false + schema: + type: string + - name: schema + in: query + description: |- + The ontology schema to be used for the request. + If not specified, the default schema ApiV2Complex will be used. + required: false + schema: + type: string + - name: x-knora-json-ld-rendering + in: header + description: |- + The JSON-LD rendering to be used for the request (flat or hierarchical). + If not specified, hierarchical JSON-LD will be used. + required: false + schema: + type: string + - name: markup + in: query + description: The markup rendering to be used for the request (XML or standoff). + required: false + schema: + type: string + - name: x-knora-accept-markup + in: header + description: The markup rendering to be used for the request (XML or standoff). + required: false + schema: + type: string + requestBody: + description: The Gravsearch query. See https://docs.dasch.swiss/latest/DSP-API/03-endpoints/api-v2/query-language/ + content: + text/plain: + schema: + type: string + required: true + responses: + '200': + description: '' + headers: + Content-Type: + required: true + schema: + type: string + content: + text/plain: + schema: + type: string + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + /v2/searchextended/count/{p1}: + get: + tags: + - V2 Search + description: Count resources using a Gravsearch query. + operationId: getV2SearchextendedCountP1 + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + - name: p1 + in: path + description: The Gravsearch query. See https://docs.dasch.swiss/latest/DSP-API/03-endpoints/api-v2/query-language/ + required: true + schema: + type: string + - name: Accept + in: header + description: |- + The RDF format to be used for the request. Valid values are: List(JSON-LD, Turtle, TriG, RDF/XML, N-Quads) + If not specified or unknown, the fallback RDF format JSON-LD will be used. + required: false + schema: + type: string + - name: x-knora-accept-schema + in: header + description: |- + The ontology schema to be used for the request. + If not specified, the default schema ApiV2Complex will be used. + required: false + schema: + type: string + - name: schema + in: query + description: |- + The ontology schema to be used for the request. + If not specified, the default schema ApiV2Complex will be used. + required: false + schema: + type: string + - name: x-knora-json-ld-rendering + in: header + description: |- + The JSON-LD rendering to be used for the request (flat or hierarchical). + If not specified, hierarchical JSON-LD will be used. + required: false + schema: + type: string + - name: markup + in: query + description: The markup rendering to be used for the request (XML or standoff). + required: false + schema: + type: string + - name: x-knora-accept-markup + in: header + description: The markup rendering to be used for the request (XML or standoff). + required: false + schema: + type: string + responses: + '200': + description: '' + headers: + Content-Type: + required: true + schema: + type: string + content: + text/plain: + schema: + type: string + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + /v2/searchbylabel/{searchTerm}: + get: + tags: + - V2 Search + description: Search for resources by label. + operationId: getV2SearchbylabelSearchterm + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + - name: searchTerm + in: path + required: true + schema: + type: string + - name: Accept + in: header + description: |- + The RDF format to be used for the request. Valid values are: List(JSON-LD, Turtle, TriG, RDF/XML, N-Quads) + If not specified or unknown, the fallback RDF format JSON-LD will be used. + required: false + schema: + type: string + - name: x-knora-accept-schema + in: header + description: |- + The ontology schema to be used for the request. + If not specified, the default schema ApiV2Complex will be used. + required: false + schema: + type: string + - name: schema + in: query + description: |- + The ontology schema to be used for the request. + If not specified, the default schema ApiV2Complex will be used. + required: false + schema: + type: string + - name: x-knora-json-ld-rendering + in: header + description: |- + The JSON-LD rendering to be used for the request (flat or hierarchical). + If not specified, hierarchical JSON-LD will be used. + required: false + schema: + type: string + - name: markup + in: query + description: The markup rendering to be used for the request (XML or standoff). + required: false + schema: + type: string + - name: x-knora-accept-markup + in: header + description: The markup rendering to be used for the request (XML or standoff). + required: false + schema: + type: string + - name: offset + in: query + description: The offset to be used for paging. + required: false + schema: + default: 0 + type: integer + format: int32 + exclusiveMinimum: -1 + - name: limitToProject + in: query + description: The project to limit the search to. + required: false + schema: + type: string + - name: limitToResourceClass + in: query + description: The resource class to limit the search to. + required: false + schema: + type: string + responses: + '200': + description: '' + headers: + Content-Type: + required: true + schema: + type: string + content: + text/plain: + schema: + type: string + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + /v2/searchbylabel/count/{searchTerm}: + get: + tags: + - V2 Search + description: Search for resources by label. + operationId: getV2SearchbylabelCountSearchterm + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + - name: searchTerm + in: path + required: true + schema: + type: string + - name: Accept + in: header + description: |- + The RDF format to be used for the request. Valid values are: List(JSON-LD, Turtle, TriG, RDF/XML, N-Quads) + If not specified or unknown, the fallback RDF format JSON-LD will be used. + required: false + schema: + type: string + - name: x-knora-accept-schema + in: header + description: |- + The ontology schema to be used for the request. + If not specified, the default schema ApiV2Complex will be used. + required: false + schema: + type: string + - name: schema + in: query + description: |- + The ontology schema to be used for the request. + If not specified, the default schema ApiV2Complex will be used. + required: false + schema: + type: string + - name: x-knora-json-ld-rendering + in: header + description: |- + The JSON-LD rendering to be used for the request (flat or hierarchical). + If not specified, hierarchical JSON-LD will be used. + required: false + schema: + type: string + - name: markup + in: query + description: The markup rendering to be used for the request (XML or standoff). + required: false + schema: + type: string + - name: x-knora-accept-markup + in: header + description: The markup rendering to be used for the request (XML or standoff). + required: false + schema: + type: string + - name: limitToProject + in: query + description: The project to limit the search to. + required: false + schema: + type: string + - name: limitToResourceClass + in: query + description: The resource class to limit the search to. + required: false + schema: + type: string + responses: + '200': + description: '' + headers: + Content-Type: + required: true + schema: + type: string + content: + text/plain: + schema: + type: string + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + /v2/search/{searchTerm}: + get: + tags: + - V2 Search + description: Search for resources by label. + operationId: getV2SearchSearchterm + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + - name: searchTerm + in: path + required: true + schema: + type: string + - name: Accept + in: header + description: |- + The RDF format to be used for the request. Valid values are: List(JSON-LD, Turtle, TriG, RDF/XML, N-Quads) + If not specified or unknown, the fallback RDF format JSON-LD will be used. + required: false + schema: + type: string + - name: x-knora-accept-schema + in: header + description: |- + The ontology schema to be used for the request. + If not specified, the default schema ApiV2Complex will be used. + required: false + schema: + type: string + - name: schema + in: query + description: |- + The ontology schema to be used for the request. + If not specified, the default schema ApiV2Complex will be used. + required: false + schema: + type: string + - name: x-knora-json-ld-rendering + in: header + description: |- + The JSON-LD rendering to be used for the request (flat or hierarchical). + If not specified, hierarchical JSON-LD will be used. + required: false + schema: + type: string + - name: markup + in: query + description: The markup rendering to be used for the request (XML or standoff). + required: false + schema: + type: string + - name: x-knora-accept-markup + in: header + description: The markup rendering to be used for the request (XML or standoff). + required: false + schema: + type: string + - name: offset + in: query + description: The offset to be used for paging. + required: false + schema: + default: 0 + type: integer + format: int32 + exclusiveMinimum: -1 + - name: limitToProject + in: query + description: The project to limit the search to. + required: false + schema: + type: string + - name: limitToResourceClass + in: query + description: The resource class to limit the search to. + required: false + schema: + type: string + - name: limitToStandoffClass + in: query + description: The standoff class to limit the search to. + required: false + schema: + type: string + - name: returnFiles + in: query + description: Whether to return files in the search results. + required: false + schema: + default: false + type: boolean + responses: + '200': + description: '' + headers: + Content-Type: + required: true + schema: + type: string + content: + text/plain: + schema: + type: string + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + /v2/search/count/{searchTerm}: + get: + tags: + - V2 Search + description: Search for resources by label. + operationId: getV2SearchCountSearchterm + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + - name: searchTerm + in: path + required: true + schema: + type: string + - name: Accept + in: header + description: |- + The RDF format to be used for the request. Valid values are: List(JSON-LD, Turtle, TriG, RDF/XML, N-Quads) + If not specified or unknown, the fallback RDF format JSON-LD will be used. + required: false + schema: + type: string + - name: x-knora-accept-schema + in: header + description: |- + The ontology schema to be used for the request. + If not specified, the default schema ApiV2Complex will be used. + required: false + schema: + type: string + - name: schema + in: query + description: |- + The ontology schema to be used for the request. + If not specified, the default schema ApiV2Complex will be used. + required: false + schema: + type: string + - name: x-knora-json-ld-rendering + in: header + description: |- + The JSON-LD rendering to be used for the request (flat or hierarchical). + If not specified, hierarchical JSON-LD will be used. + required: false + schema: + type: string + - name: markup + in: query + description: The markup rendering to be used for the request (XML or standoff). + required: false + schema: + type: string + - name: x-knora-accept-markup + in: header + description: The markup rendering to be used for the request (XML or standoff). + required: false + schema: + type: string + - name: limitToProject + in: query + description: The project to limit the search to. + required: false + schema: + type: string + - name: limitToResourceClass + in: query + description: The resource class to limit the search to. + required: false + schema: + type: string + - name: limitToStandoffClass + in: query + description: The standoff class to limit the search to. + required: false + schema: + type: string + responses: + '200': + description: '' + headers: + Content-Type: + required: true + schema: + type: string + content: + text/plain: + schema: + type: string + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + /v2/authentication: + get: + operationId: getV2Authentication + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/CheckResponse' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - httpAuth: [] + - httpAuth1: [] + post: + operationId: postV2Authentication + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/LoginPayload' + required: true + responses: + '200': + description: '' + headers: + Set-Cookie: + required: false + schema: + type: array + items: + type: string + content: + application/json: + schema: + $ref: '#/components/schemas/TokenResponse' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + delete: + operationId: deleteV2Authentication + parameters: + - name: KnoraAuthenticationMFYGSLTEMFZWG2BOON3WS43THI2DIMY9 + in: cookie + required: false + schema: + type: string + responses: + '200': + description: '' + headers: + Set-Cookie: + required: false + schema: + type: array + items: + type: string + content: + application/json: + schema: + $ref: '#/components/schemas/LogoutResponse' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + security: + - {} + - httpAuth: [] + /v2/login: + get: + operationId: getV2Login + responses: + '200': + description: '' + content: + text/html: + schema: + type: string + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' + post: + operationId: postV2Login + requestBody: + content: + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/LoginForm' + required: true + responses: + '200': + description: '' + headers: + Set-Cookie: + required: false + schema: + type: array + items: + type: string + content: + application/json: + schema: + $ref: '#/components/schemas/TokenResponse' + '400': + description: '' + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/BadRequestException' + - $ref: '#/components/schemas/ValidationException' + - $ref: '#/components/schemas/DuplicateValueException' + - $ref: '#/components/schemas/GravsearchException' + '401': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BadCredentialsException' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ForbiddenException' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundException' +components: + schemas: + BadCredentialsException: + title: BadCredentialsException + type: object + required: + - message + properties: + message: + type: string + BadRequestException: + title: BadRequestException + type: object + required: + - message + properties: + message: + type: string + CheckResponse: + title: CheckResponse + type: object + required: + - message + properties: + message: + type: string + DuplicateValueException: + title: DuplicateValueException + type: object + required: + - message + properties: + message: + type: string + Email: + title: Email + type: object + required: + - value + properties: + value: + type: string + EmailPassword: + title: EmailPassword + type: object + required: + - email + - password + properties: + email: + $ref: '#/components/schemas/Email' + password: + type: string + ForbiddenException: + title: ForbiddenException + type: object + required: + - message + properties: + message: + type: string + GravsearchException: + title: GravsearchException + type: object + required: + - message + properties: + message: + type: string + IriPassword: + title: IriPassword + type: object + required: + - iri + - password + properties: + iri: + $ref: '#/components/schemas/UserIri' + password: + type: string + ListResponseDto: + title: ListResponseDto + type: object + required: + - count + properties: + resources: + type: array + items: + $ref: '#/components/schemas/ResourceInfoDto' + count: + type: integer + format: int32 + LoginForm: + title: LoginForm + type: object + required: + - username + - password + properties: + username: + type: string + password: + type: string + LoginPayload: + title: LoginPayload + oneOf: + - $ref: '#/components/schemas/EmailPassword' + - $ref: '#/components/schemas/IriPassword' + - $ref: '#/components/schemas/UsernamePassword' + LogoutResponse: + title: LogoutResponse + type: object + required: + - status + - message + properties: + status: + type: integer + format: int32 + message: + type: string + NotFoundException: + title: NotFoundException + type: object + required: + - message + properties: + message: + type: string + ResourceInfoDto: + title: ResourceInfoDto + type: object + required: + - resourceIri + - creationDate + - lastModificationDate + - isDeleted + properties: + resourceIri: + type: string + creationDate: + type: string + format: date-time + lastModificationDate: + type: string + format: date-time + deleteDate: + type: string + format: date-time + isDeleted: + type: boolean + TokenResponse: + title: TokenResponse + type: object + required: + - token + properties: + token: + type: string + UserIri: + title: UserIri + type: object + required: + - value + properties: + value: + type: string + Username: + title: Username + type: object + required: + - value + properties: + value: + type: string + UsernamePassword: + title: UsernamePassword + type: object + required: + - username + - password + properties: + username: + $ref: '#/components/schemas/Username' + password: + type: string + ValidationException: + title: ValidationException + type: object + required: + - msg + properties: + msg: + type: string + securitySchemes: + httpAuth: + type: http + scheme: bearer + httpAuth1: + type: http + scheme: basic diff --git a/03-endpoints/instrumentation/health/index.html b/03-endpoints/instrumentation/health/index.html new file mode 100644 index 0000000000..d60eb0dc82 --- /dev/null +++ b/03-endpoints/instrumentation/health/index.html @@ -0,0 +1,2974 @@ + + + + + + + + + + + + + + + + + + + + + + + Health Endpoint - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + +

Health

+

The health endpoint provides information about the health state of the dsp-stack.

+

Example request

+

GET /health

+

Example response

+
{
+    "name":"AppState",
+    "message" : "Application is healthy",
+    "severity":"non fatal",
+    "status":"healthy"
+}
+
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/03-endpoints/instrumentation/introduction/index.html b/03-endpoints/instrumentation/introduction/index.html new file mode 100644 index 0000000000..7369dac204 --- /dev/null +++ b/03-endpoints/instrumentation/introduction/index.html @@ -0,0 +1,2897 @@ + + + + + + + + + + + + + + + + + + + + + + + Introduction - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + +

Instrumentation

+

The instrumentation endpoints are running on a separate port (default 3339) +defined in application.conf under the key: app.instrumentaion-server-config.port +and can also be set through the environment variable: KNORA_INSTRUMENTATION_SERVER_PORT.

+

The exposed endpoints are:

+
    +
  • /metrics - a metrics endpoint, backed by the ZIO metrics backend exposing metrics in the prometheus format
  • +
  • /health - provides information about the health state, see Health Endpoint
  • +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/03-endpoints/instrumentation/metrics/index.html b/03-endpoints/instrumentation/metrics/index.html new file mode 100644 index 0000000000..01defeda4a --- /dev/null +++ b/03-endpoints/instrumentation/metrics/index.html @@ -0,0 +1,3040 @@ + + + + + + + + + + + + + + + + + + + + + + + Metrics Endpoint - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + +

Metrics Endpoint

+

The metrics endpoint exposes metrics gathered through the ZIO metrics frontend in the Prometheus +format. Additionally, ZIO runtime, JVM and ZIO-HTTP metrics are also exposed.

+

Configuration

+

The refresh interval is configured in application.conf under the key: app.instrumentaion-server-config.interval +which es per default set to 5 seconds.

+

Example request

+

GET /metrics

+

Example response

+
# TYPE jvm_memory_pool_allocated_bytes_total counter
+# HELP jvm_memory_pool_allocated_bytes_total Some help
+jvm_memory_pool_allocated_bytes_total{pool="G1 Survivor Space"}  4828024.0 1671021037947
+# TYPE jvm_memory_pool_allocated_bytes_total counter
+# HELP jvm_memory_pool_allocated_bytes_total Some help
+jvm_memory_pool_allocated_bytes_total{pool="G1 Eden Space"}  3.3554432E7 1671021037947
+# TYPE zio_fiber_successes counter
+# HELP zio_fiber_successes Some help
+zio_fiber_successes 17.0 1671021037947
+# TYPE zio_fiber_lifetimes histogram
+# HELP zio_fiber_lifetimes Some help
+zio_fiber_lifetimes_bucket{le="1.0"}  17.0 1671021037947
+zio_fiber_lifetimes_bucket{le="2.0"}  17.0 1671021037947
+...
+
+

ZIO-HTTP metrics

+

Metrics of all routes served by ZIO-HTTP (default: port 5555) are exposed through a default metrics middleware. +However, instead of http_concurrent_requests_total etc. they are labeled zio_http_concurrent_requests_total etc. +with zio prepended, so that they are clearly distinguishable while we still run ZIO-HTTP and Pekko-HTTP in parallel.

+

To prevent excessive amounts of labels, it is considered good practice, +to replace dynamic path segments with slugs (e.g. /projects/shortcode/0000 with /projects/shortcode/:shortcode). +Like this, requesting different projects by identifier will add multiple values to the histogram of a single route, +instead of creating a histogram for each project:

+
zio_http_request_duration_seconds_bucket{method="GET",path="/admin/projects/shortcode/:shortcode",status="200",le="0.005"} 0.0 1676481606015
+...
+
+

Instead of:

+
zio_http_request_duration_seconds_bucket{method="GET",path="/admin/projects/shortcode/0000",status="200",le="0.005"} 0.0 1676481606015
+zio_http_request_duration_seconds_bucket{method="GET",path="/admin/projects/shortcode/0001",status="200",le="0.005"} 0.0 1676481606015
+...
+
+

This is achieved by providing the middleware a pathLabelMapper; +when adding new routes, it is advisable to assert that this replacement works correctly for the newly added route.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/04-publishing-deployment/configuration/index.html b/04-publishing-deployment/configuration/index.html new file mode 100644 index 0000000000..66ba9d2f3f --- /dev/null +++ b/04-publishing-deployment/configuration/index.html @@ -0,0 +1,3197 @@ + + + + + + + + + + + + + + + + + + + + + + + Configuration - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + +

Configuration

+

All configuration for Knora is done in application.conf. Besides the Knora application +specific configuration, there we can also find configuration for the underlying Pekko library.

+

For optimal performance it is important to tune the configuration to the hardware used, mainly +to the number of CPUs and cores per CPU.

+

The relevant sections for tuning are:

+
    +
  • pekko.actor.deployment
  • +
  • knora-actor-dispatcher
  • +
  • knora-blocking-dispatcher
  • +
+

System Environment Variables

+

A number of core settings is additionally configurable through system environment variables. These are:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
key in application.confenvironment variabledefault value
pekko.log-config-on-startKNORA_AKKA_LOG_CONFIG_ON_STARToff
pekko.loglevelKNORA_AKKA_LOGLEVELINFO
pekko.stdout-loglevelKNORA_AKKA_STDOUT_LOGLEVELINFO
app.print-extended-configKNORA_WEBAPI_PRINT_EXTENDED_CONFIGfalse
app.bcrypt-password-strengthKNORA_WEBAPI_BCRYPT_PASSWORD_STRENGTH12
app.jwt.secretKNORA_WEBAPI_JWT_SECRET_KEYsuper-secret-key
app.jwt.expirationKNORA_WEBAPI_JWT_LONGEVITY30 days
app.jwt.issuerKNORA_WEBAPI_JWT_ISSUER0.0.0.0:3333
app.dsp-ingest.audienceKNORA_WEBAPI_DSP_INGEST_AUDIENCEhttp://localhost:3340
app.dsp-ingest.base-urlKNORA_WEBAPI_DSP_INGEST_BASE_URLhttp://localhost:3340
app.cookie-domainKNORA_WEBAPI_COOKIE_DOMAINlocalhost
app.allow-reload-over-httpKNORA_WEBAPI_ALLOW_RELOAD_OVER_HTTPfalse
app.ark.resolverKNORA_WEBAPI_ARK_RESOLVER_URLhttp://0.0.0.0:3336
app.ark.assigned-numberKNORA_WEBAPI_ARK_NAAN72163
app.knora-api.internal-hostKNORA_WEBAPI_KNORA_API_INTERNAL_HOST0.0.0.0
app.knora-api.internal-portKNORA_WEBAPI_KNORA_API_INTERNAL_PORT3333
app.knora-api.external-protocolKNORA_WEBAPI_KNORA_API_EXTERNAL_PROTOCOLhttp
app.knora-api.external-hostKNORA_WEBAPI_KNORA_API_EXTERNAL_HOST0.0.0.0
app.knora-api.external-portKNORA_WEBAPI_KNORA_API_EXTERNAL_PORT3333
app.sipi.internal-protocolKNORA_WEBAPI_SIPI_INTERNAL_PROTOCOLhttp
app.sipi.internal-hostKNORA_WEBAPI_SIPI_INTERNAL_HOSTlocalhost
app.sipi.internal-portKNORA_WEBAPI_SIPI_INTERNAL_PORT1024
app.sipi.external-protocolKNORA_WEBAPI_SIPI_EXTERNAL_PROTOCOLhttp
app.sipi.external-hostKNORA_WEBAPI_SIPI_EXTERNAL_HOSTlocalhost
app.sipi.external-portKNORA_WEBAPI_SIPI_EXTERNAL_PORT443
app.ark.resolverKNORA_WEBAPI_ARK_RESOLVER_URLhttp://0.0.0.0:3336
app.ark.assigned-numberKNORA_WEBAPI_ARK_NAAN72163
app.salsah1.base-urlKNORA_WEBAPI_SALSAH1_BASE_URLhttp://localhost:3335
app.triplestore.dbtypeKNORA_WEBAPI_TRIPLESTORE_DBTYPEfuseki
app.triplestore.use-httpsKNORA_WEBAPI_TRIPLESTORE_USE_HTTPSfalse
app.triplestore.hostKNORA_WEBAPI_TRIPLESTORE_HOSTlocalhost
app.triplestore.auto-initKNORA_WEBAPI_TRIPLESTORE_AUTOINITfalse
app.triplestore.fuseki.portKNORA_WEBAPI_TRIPLESTORE_FUSEKI_PORT3030
app.triplestore.fuseki.repository-nameKNORA_WEBAPI_TRIPLESTORE_FUSEKI_REPOSITORY_NAMEknora-test
app.triplestore.fuseki.usernameKNORA_WEBAPI_TRIPLESTORE_FUSEKI_USERNAMEadmin
app.triplestore.fuseki.passwordKNORA_WEBAPI_TRIPLESTORE_FUSEKI_PASSWORDtest
+

Selectively Disabling Routes

+

In application.conf the setting app.routes-to-reject contains a list +of strings, representing routes which should be rejected.

+

For Example, the string "v2/users" would lead to rejection of any +route which contains this string.

+

Startup Flags

+

There is a number of flags that can be set on startup, they will +override any value set in the application configuration file:

+
    +
  • loadDemoData, --loadDemoData, -d: Loads the demo data.
  • +
  • allowReloadOverHTTP, --allow-reload-over-http, -r: Allows + reloading of data over HTTP.
  • +
  • -c: Print the configuration at startup.
  • +
  • --help: Shows the help message with all startup flags.
  • +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/04-publishing-deployment/publishing/index.html b/04-publishing-deployment/publishing/index.html new file mode 100644 index 0000000000..ee325e2d33 --- /dev/null +++ b/04-publishing-deployment/publishing/index.html @@ -0,0 +1,2906 @@ + + + + + + + + + + + + + + + + + + + + + + + Publishing - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + +

Publishing

+

DSP is published as a set of Docker images under the +DaSCH Dockerhub Organization.

+

The following Docker images are published:

+ +

DSP's Docker images are published automatically through Github CI each time a +pull-request is merged into the main branch.

+

Each image is tagged with a version number, which is derived by +using the result of git describe. The describe version is built from the +last tag + number of commits since tag + short hash, e.g., 8.0.0-7-ga7827e9.

+

The images can be published locally by running:

+
make docker-build
+
+

or to Dockerhub:

+
make docker-publish
+
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/05-internals/design/adr/ADR-0001-record-architecture-decisions/index.html b/05-internals/design/adr/ADR-0001-record-architecture-decisions/index.html new file mode 100644 index 0000000000..06b691eaba --- /dev/null +++ b/05-internals/design/adr/ADR-0001-record-architecture-decisions/index.html @@ -0,0 +1,3005 @@ + + + + + + + + + + + + + + + + + + + + + + + 0001 Record Architectural Decisions - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

ADR-0001 Record architectural decisions as ADR

+

Date: 2022-03-14

+

Status

+

Accepted

+

Context

+

We need to record the architectural decisions made on this project.

+

Decision

+

We will use Architectural Decision Records, as described by Michael Nygard.

+

Consequences

+

See Michael Nygard's article, linked above. For a lightweight ADR toolset, see Nat Pryce's adr-tools.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/05-internals/design/adr/ADR-0002-change-cache-service-manager-from-akka-actor-to-zlayer/index.html b/05-internals/design/adr/ADR-0002-change-cache-service-manager-from-akka-actor-to-zlayer/index.html new file mode 100644 index 0000000000..a276abeb51 --- /dev/null +++ b/05-internals/design/adr/ADR-0002-change-cache-service-manager-from-akka-actor-to-zlayer/index.html @@ -0,0 +1,3008 @@ + + + + + + + + + + + + + + + + + + + + + + + 0002 Change Cache Service Manager from Akka-Actor to ZLayer - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

ADR-0002 Change Cache Service Manager from Akka-Actor to ZLayer

+

Date: 2022-04-06

+

Status

+

Accepted

+

Context

+

The org.knora.webapi.store.cacheservice.CacheServiceManager was implemented as an Akka-Actor.

+

Decision

+

As part of the move from Akka to ZIO, +it was decided that the CacheServiceManager +and the whole implementation of the in-memory and Redis backed cache +is refactored using ZIO.

+

Consequences

+

The usage from other actors stays the same. The actor messages and responses don't change.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/05-internals/design/adr/ADR-0003-change-iiif-service-manager-and-sipi-implementation-to-zlayer/index.html b/05-internals/design/adr/ADR-0003-change-iiif-service-manager-and-sipi-implementation-to-zlayer/index.html new file mode 100644 index 0000000000..bacd96f766 --- /dev/null +++ b/05-internals/design/adr/ADR-0003-change-iiif-service-manager-and-sipi-implementation-to-zlayer/index.html @@ -0,0 +1,3007 @@ + + + + + + + + + + + + + + + + + + + + + + + 0003 Change IIIF Service Manager and Sipi implementation to zlayer - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

ADR-0003 Change IIIF Service Manager and Sipi implementation to zlayer

+

Date: 2022-04-29

+

Status

+

Accepted

+

Context

+

Both org.knora.webapi.store.iiif.IIIFServiceManager and org.knora.webapi.store.iiif.impl.IIIFServiceSipiImpl +where implemented as Akka-Actors

+

Decision

+

As part of the move from Akka to ZIO, +it was decided that the IIIFServiceManager and the IIIFServiceSipiImpl is refactored using ZIO.

+

Consequences

+

The usage from other actors stays the same. The actor messages and responses don't change.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/05-internals/design/adr/ADR-0004-change-triplestore-service-manager-and-fuseki-implementation-to-zlayer/index.html b/05-internals/design/adr/ADR-0004-change-triplestore-service-manager-and-fuseki-implementation-to-zlayer/index.html new file mode 100644 index 0000000000..e807c30eb7 --- /dev/null +++ b/05-internals/design/adr/ADR-0004-change-triplestore-service-manager-and-fuseki-implementation-to-zlayer/index.html @@ -0,0 +1,3010 @@ + + + + + + + + + + + + + + + + + + + + + + + 0004 Change Triplestore Service Manager and Fuseki implementation to ZLayer - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

ADR-0004 Change Triplestore Service Manager and Fuseki implementation to ZLayer

+

Date: 2022-05-23

+

Status

+

Accepted

+

Context

+

Both org.knora.webapi.store.triplestore.TriplestoreServiceManager +and org.knora.webapi.store.triplestore.impl.TriplestoreServiceHttpConnectorImpl +where implemented as Akka-Actors.

+

Decision

+

As part of the move from Akka to ZIO, +it was decided that the TriplestoreServiceManager +and the TriplestoreServiceHttpConnectorImpl +is refactored using ZIO.

+

Consequences

+

The usage from other actors stays the same. The actor messages and responses don't change.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/05-internals/design/adr/ADR-0005-change-respondermanager-to-a-simple-case-class/index.html b/05-internals/design/adr/ADR-0005-change-respondermanager-to-a-simple-case-class/index.html new file mode 100644 index 0000000000..7cbeec1590 --- /dev/null +++ b/05-internals/design/adr/ADR-0005-change-respondermanager-to-a-simple-case-class/index.html @@ -0,0 +1,3012 @@ + + + + + + + + + + + + + + + + + + + + + + + 0005 Change ResponderManager to a simple case class - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

ADR-0005 Change ResponderManager to a simple case class

+

Date: 2022-06-06

+

Status

+

Accepted

+

Context

+

The org.knora.webapi.responders.ResponderManager was implemented as an Akka-Actor.

+

Decision

+

In preparation of the move from Akka to ZIO, it was decided that the ResponderManager is refactored using plain case classes.

+

Consequences

+

The actor messages and responses don't change. +All calls made previously to the ResponderManager and the StorageManager +are now changed to the ApplicationActor +which will route the calls to either the ResponderManager +or the StorageManager, based on the message type. +The ApplicationActor is the only actor that is allowed to make calls +to either the ResponderManager or the StorageManager. +All requests from routes are now routed to the ApplicationActor.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/05-internals/design/adr/ADR-0006-use-zio-http/index.html b/05-internals/design/adr/ADR-0006-use-zio-http/index.html new file mode 100644 index 0000000000..772f228384 --- /dev/null +++ b/05-internals/design/adr/ADR-0006-use-zio-http/index.html @@ -0,0 +1,3011 @@ + + + + + + + + + + + + + + + + + + + + + + + 0006 Gradually Replace Akka-HTTP with ZIO-HTTP - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

ADR-0006 Use ZIO HTTP

+

Date: 2022-12-01

+

Status

+

Accepted

+

Context

+

The current routes use the Akka Http library. +Because of changes to the licensing of the Akka framework, +we want to move away from using Akka Http. +This also fits the general strategic decision to use ZIO for the backend.

+

Decision

+

In preparation of the move from Akka to ZIO, +it was decided that the routes should be ported to use the ZIO HTTP server / library instead of Akka Http.

+

Consequences

+

In a first step only the routes are going to be ported, one by one, +to use ZIO HTTP instead of being routed through Akka Http. +The Akka Actor System still remains and will be dealt with later.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/05-internals/design/adr/ADR-0007-zio-fication-of-responders/index.html b/05-internals/design/adr/ADR-0007-zio-fication-of-responders/index.html new file mode 100644 index 0000000000..ce34a5f28e --- /dev/null +++ b/05-internals/design/adr/ADR-0007-zio-fication-of-responders/index.html @@ -0,0 +1,3307 @@ + + + + + + + + + + + + + + + + + + + + + + + 0007 ZIO-fication of Responders - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + + + + + +
+
+ + + + +

ADR-0007 ZIO-fication of Responders

+

Date: 2023-02-20

+

Status

+

Accepted

+

Context

+

In order to remove all Akka dependencies, we have to migrate the existing Responders to a ZIO based +implementation. +This migration should be possible to do on a per Responder basis so that we do not do a single "big-bang" release with +too much code changed at once.

+

Status Quo

+

The central and only Actor is the RoutingActor which contains instances of each Responder as a field. +Each of the Responders needs an ActorRef to the RoutingActor and used the Akka "ask pattern" for communication +with the other Responders. +This means a Responder can only be created inside the RoutingActor because the RoutingActor must know +every Responder in order to route the message but the Responder needs the ActorRef in order to communicate with +the other Responders. +This leads to a circular dependency between the RoutingActor and all Akka based Responders.

+

Goal

+

In the long term all Responders do not contain any Akka dependency anymore and all implementations currently +returning a Future will return a zio.Task.

+

The zio.Task is a very suitable replacement for the Future because:

+
    +
  • a Future[A] will complete with either a value A or with a failure Throwable.
  • +
  • a zio.Task[A] will succeed with either a value A or fail with an error of type Throwable.
  • +
+

Ideally all Responders will directly call the necessary components directly through invoking methods. +However, this will not be possible in the beginning as there are Responders who call on each other creating yet another +circular dependency which we cannot simply recreate with ZLayer dependency injection. +Hence, a message like communication pattern through a central component the MessageRelay will be introduced which +can replace the existing Akka "ask pattern" one to one in the ziofied component.

+

Solution

+

The MessageRelay is capable of relaying message to subscribed MessageHandlers and replaces the existing Akka "ask +pattern" with the RoutingActor. +Messages which will have a MessageHandler implementation must extend the RelayedMessage trait so that these are +routed to the MessageRelay from the RoutingActor. +All other messages will be handled as before.

+

In ziofied Responders we can use the MessageRelay for communication with all other Responders in a similar fashion +as the Akka "ask pattern" by invoking the method MessageRelay#ask(ResponderRequest): Task[Any]. +A special MessageHandler will route all messages which do not implement the RelayedMessage trait back to +the RoutingActor, this is the AppRouterRelayingMessageHandler.

+

In the long run we will prefer to invoke methods on the respective ziofied services directly. +This is now already possible for example with the TriplestoreServive, i.e. instead of +calling MessageRelay#ask[SparqlSelectResul](SparqlSelectRequest) it is much easier and more importantly typesafe to +call TriplestoreService#sparqlHttpSelect(String): UIO[SparqlSelectResult].

+

Communication between Akka based Responder and another Akka based Responder

+

Nothing changes with regard to existing communication patterns:

+
sequenceDiagram
+    autonumber
+    AkkaResponder ->> RoutingActor: "ask(Request)"
+    activate RoutingActor
+    RoutingActor ->> OtherAkkaResponder: "sends message to"
+    activate OtherAkkaResponder
+    OtherAkkaResponder ->> RoutingActor: "returns response"
+    deactivate OtherAkkaResponder
+    RoutingActor ->> AkkaResponder: "returns response"
+    deactivate RoutingActor
+

Communication between Akka based Responder and ziofied Responder

+

The AkkaResponder code remains unchanged and will still ask the ActorRef to the RoutingActor. +The RoutingActor will forward the message to the MessageRelay and return its response to the AkkaResponder.

+
sequenceDiagram
+    autonumber
+    AkkaResponder ->> RoutingActor: "ask(RelayedMessage)"
+    activate RoutingActor
+    RoutingActor ->> MessageRelay: "messageRelay.ask(RelayedMessage)"
+    activate MessageRelay
+    MessageRelay ->> MessageRelay: "finds MessageHandler"
+    MessageRelay ->> ZioResponder: "calls .handle(Request)"
+    activate ZioResponder
+    ZioResponder ->> MessageRelay: "returns response"
+    deactivate ZioResponder
+    MessageRelay ->> RoutingActor: "returns response"
+    deactivate MessageRelay
+    RoutingActor ->> AkkaResponder: "returns response"
+    deactivate RoutingActor
+

Communication between ziofied Responder and Akka based Responder

+

The AppRouterRelayingMessageHandler route all messages which do not implement the RelayedMessage trait to +the RoutingActor.

+
sequenceDiagram
+    autonumber
+    ZioResponder ->> MessageRelay: "ask(Request)"
+    activate MessageRelay
+    MessageRelay ->> MessageRelay: "finds MessageHandler"
+    MessageRelay ->> AppRouterRelayingMessageHandler: "calls .handle(Request)"
+    activate AppRouterRelayingMessageHandler
+    AppRouterRelayingMessageHandler ->> RoutingActor: "sends message to"
+    deactivate AppRouterRelayingMessageHandler
+    activate RoutingActor
+    RoutingActor ->> AkkaResponder: "calls AkkaResponder"
+    activate AkkaResponder
+    AkkaResponder ->> RoutingActor: "returns response"
+    deactivate AkkaResponder
+    RoutingActor ->> MessageRelay: "returns response"
+    deactivate RoutingActor
+    MessageRelay ->> ZioResponder: "returns response"
+    deactivate MessageRelay
+

Communication between two ziofied Responders

+

Variant using the MessageRelay

+
sequenceDiagram
+    autonumber
+    ZioResponder ->> MessageRelay: "ask(Request)"
+    activate MessageRelay
+    MessageRelay ->> MessageRelay: "finds MessageHandler"
+    MessageRelay ->> OtherZioResponder: "calls .handle(Request)"
+    activate OtherZioResponder
+    OtherZioResponder ->> MessageRelay: "returns response"
+    deactivate OtherZioResponder
+    MessageRelay ->> ZioResponder: "returns response"
+    deactivate MessageRelay
+

Variant if other Responder is a direct dependency

+
sequenceDiagram
+    autonumber
+    ZioResponder ->> TriplestoreService: "calls method"
+    activate TriplestoreService
+    TriplestoreService ->> ZioResponder: "returns response"
+    deactivate TriplestoreService
+

Decision

+

In preparation of the move from Akka to ZIO, +it was decided that the Responders should be ported to use return ZIOs and the MessageRelay +instead of Futures and the ActorRef to the RoutingActor.

+

Consequences

+

In a first step only the Responders are going to be ported, one by one, to use the above pattern. +The Akka Actor System still remains, will be used in the test and will be removed in a later step. +Due to the added indirections and the blocking nature of Unsafe.unsafe(implicit u => r.unsafe.run(effect)) +it is necessary to spin up more RoutingActor instances as otherwise deadlocks will occur. +This should not be a problem as any shared state, e.g. caches, +is not held within the RoutingActor or one of its contained Responder instances.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/05-internals/design/adr/ADR-0008-replace-akka-with-pekko/index.html b/05-internals/design/adr/ADR-0008-replace-akka-with-pekko/index.html new file mode 100644 index 0000000000..6d4632d43d --- /dev/null +++ b/05-internals/design/adr/ADR-0008-replace-akka-with-pekko/index.html @@ -0,0 +1,3030 @@ + + + + + + + + + + + + + + + + + + + + + + + 0008 Replace Akka with Pekko - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

ADR-0006 Replace Akka with Pekko

+

Status

+

Accepted

+

Context

+

On 7. September 2022 Lightbend announced a +license change for the Akka project, +the TL;DR being that you will need a commercial license to use future versions of Akka (2.7+) in production +if you exceed a certain revenue threshold.

+

For now, we have staid on Akka 2.6, the current latest version that is still available under the original license. +Historically Akka has been incredibly stable, and combined with our limited use of features, +we did not expect this to be a problem.

+

However, the last update of Akka 2.6 is announced to be in September 2023.

+
+

Will critical vulnerabilities and bugs be patched in 2.6.x? +Yes, critical security updates and critical bugs will be patched in Akka v2.6.x + under the current Apache 2 license until September of 2023.

+
+

As a result, we will not receive further updates and we will never get support for Scala 3 for Akka.

+

Proposal

+

Apache Pekko is based on the latest version of Akka in the v2.6.x series. +It is currently an incubator project in the ASF. +All Akka modules currently in use in the dsp-api are already released and ported to +pekko: +https://mvnrepository.com/artifact/org.apache.pekko

+

The latest stable version 1.0.1 +is compatible with Akka v2.6.x series and meant to be a plug in replacement.

+

Scala 3.3.0 is the minimum Scala 3 version supported. Scala 2.12 and 2.13 are still supported.

+

The migration guide

+

Our current migration to another http server implementation is currently on hold, +but we might want to switch to Pekko so that we could receive security updates and bugfixes.

+

The proof of concept implementation has been shared in the pull request +here, +allowing for further testing and validation of the proposed switch to Pekko.

+

Decision

+

We replace Akka and Akka/Http with Apache Pekko.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/05-internals/design/api-admin/administration-fig1.dot b/05-internals/design/api-admin/administration-fig1.dot new file mode 100644 index 0000000000..5c52b261f7 --- /dev/null +++ b/05-internals/design/api-admin/administration-fig1.dot @@ -0,0 +1,30 @@ +digraph G { + a [label="Start"]; + + b [label="Get all groups for user"]; + + c1 [label="Get all Resource Creation Permissions"]; + c2 [label="Decide if user is allowed to create the resource type"]; + + d1 [label="Get all Default Object Access Permissions"]; + d2 [label="Get Default Object Access Permissions attached to Groups"]; + d3 [label="Get Default Object Access Permissions attached to Resources/Values"]; + d4 [label="Calculate maximum Default Object Access Permissions"]; + + e [label="Create Resource/Values with maximum Default Object Access Permissions"]; + + z [label="End"]; + + a -> b; + b -> c1; + c1 -> c2; + c2 -> e; + + b -> d1; + d1 -> d2; + d2 -> d3; + d3 -> d4; + d4 -> e; + + e -> z; +} diff --git a/05-internals/design/api-admin/administration-fig1.dot.png b/05-internals/design/api-admin/administration-fig1.dot.png new file mode 100644 index 0000000000000000000000000000000000000000..a7bdfdf3efe6c18805b1c19606b5dd17435db4f7 GIT binary patch literal 96541 zcmeFZc|4cf`#!4L%~6^o>?A2s%8*%+Xdn_YmdczV^Q;La6csWh$xM=YEFsA}WmaZy zL*|)tE%x`E*Ez4(Ip_Ds`Sa{guMh40em~E8*1FeyU-xxg>v?iT<~;Q#x=mD6RMgT^ z67p13>rPWqt!~<|4*%x7{S#&USf_RIyad$}`QO{@2p=k{f2pJ;&L~(14z$>q@0$3% zIMSotwr9K4*X?IluU@s~z}xR{B>t&n5i_Ksjf{JjEL_Vu`$~l}!>GqG6#j}aH8@57 z+%uO$XWni2^7!0WnpGQF#I}noe)1OfZ(~|8&6Tj+aLLFzx6FUXsDJvYa-Fh*gH!3J zZgFkN--fX)|KmKUY^Yo0-n!LsZMdnVTokZo%j*eR`J$=;?homhm zETZG%6>V(NfBg8NprR7}?j19OsH0kXdisyj(rahV+;41b?CkFTplY0bE#Gx({oT}- z4^MU+KFZBq^Rs#lM$ta2a%uS?+dmC9rON8*>HYZrz2Y^8DjqpPBimN5^ZSdZ&z{w| z(H`WspEjB3tL|~>)YI3m!n4J#Eg5RbOg5P0a*Zkr|2MoVoa%*?#tkp%&HL#fgN8?+3lUx3shjSd)uzGOa|S-qcXbYzNa) zvUUOoXVvHS+%~1iHQle{*4|yXX|tIv42KKMk@WdZjFE4d^|EaxpqJo zU#2R1xEvm7PhwS)FVND`9zA}%KDEs;Ms)u7)_WEfJc5c5+Zh?-sp)xp3-)N%ygTQ< zbH|P_Z}06%x5&+>S1m7FJL||SC4rJNH&p%8|5Wm=BARm&5`GL()t{7)%}yjZ#UZ*W zoy9(M!nU7j7zA!x9wYbGSqUPe)wv6U#uJ@Bvi;${8dXikxg1#dq=OBQZsxn_QR?FQ z8yd#ohb;5Y1iGyl;85T*n@7g;#5Jr=zc2Np(sb8AkO3sr}9Nn(Gr+K*lK*mp{@wYBx0 zxw%4lu&_nB@Kmn{Uuy+|L2y7h=m~B$pG4`I#j|_N!N~!ta#4F8=Z*G=DO{-#@CW#FrB4 z%2>5DU%nJ+HQaj7)Km@`b8$REv@fxUQE-?dBqYRb)SO0BVtS;0%o?GP8Eo5sM0l#% z47o0cvk3Q~GSOQOW3fHejg8U18n)7y{8+Wj}s+vrz9p{WpuEQx@0|T11Hr zcAVAQ=knzm8J_bKHWWE3XHHfgo@>~KwzGW^g7$5zR;}`WKS8Mvv0C`{WXCl{#k$`` zgN9kz*%M`+P-5i)xuT+?G8QJAY7;bbY1*cyM>=-x-5XghGI!}} zgiP&+%K@CTtCrXkvY6cq-XZB2jCGeH8u4e)D4@2g>fJ7O#oqYLA^96O-m0mq^BDd* z!Eyc5`<5J~IF&mN*#%mazw=#r%(^el%*ua&9}C>Tnv!}NHP zyl^=a{Gd|5WNVu-l-?6e`DBcuhMY)J@&#F0rAwEdJ$Ued+iFOSLo-JWHDfTv33=$w zUKbQS9?Jn`l$`t%HC0troWlbRNxSIjW5iu)j);nClBjeX3uybCx#`aAc;Cq_;?*B6 z`>+Vl_J+;Qlsm=G&)buvJ~=t*Ymw!7(!BS|+V$%x)v}_4e;r7GrE#z9lFgVYxtljb zC7LuH#IJrhZu57sjh)*#!htjEszySD>nj*~w|iAgFcMJ}#|CG)yA) z;$9mufcD(~R=X2>-~0XBw{I!7`*n15N<&07V-(}6qOL}KzL~$SG+0=*tE-Fb0aRg! zhPkKi?pGxx3;8>cko1j=Qbc~uyBcK;rD$+~Y zuWCI0w70)SSt}?kj5cn|u^lPcGci)c#D4PR=qC-$YuCb+G##$7E5$3IHUm5~#V!55 zn^0zAWtH1KP>-xmd7$Kn3sR-!q%Eh#-m|vjy$7U^a&TmG&b4LPB&}Y(nlnuV+16V@ zPOj3ZSu0WPFVD!xhzjx$NhSjWhJZK4C$?lS&QiQt@=wH{?kVuBfARF`Q%+kEa%nZu z|Mt%IZQK486cpUGbElf`0=-Kpaw=AHFpFX}@auqdk6QL`AcqehSSiD6*3;A=E5_B; zDc)_(x(=XYJ3mrXn{8)hz>k9HRLg(dJj-(ui>Nu(bf09p)Boki&8A355)zMc=0{5? zwt@bqbV#MSf>@xVr?;4&Hq9RW!A|PTu3fvrXU2L`n;gHn(f%kaQ*?C9Nik}PZf;id zU=r0ph&}c6RFso@q2V}l2U#U5Cr4x7zJ0a;PYD8TkMV@KU^2!pGjfc8#dhu6T=Ctu z#^i~E>deZ8BanvrekI;w$Qe#a;l10Efs!0oRj=t3hbVsa^5ys1+G}`D1ud<2qzof9 zB-^!M2PWV6vU;#F`C?0kMfKOmo0s!}w}PVL2b~ZH#Sq8YD9mh4oGRbtAc1R`7=j#F zjvPID!8mKgWhkw~)9hr>a0vGvL5=e>14-rF7X1o{v?ydghK%LG`F{3WS!u1wp_Ulj zkX=|<{pyEHT!J#b1oikFmeofI(mqe7)ktz>?Uc-s;3GeMl2=VJbpa!~6&UK?Ws06EPGTBxt3=^ps$qb{CbO z;)S@6GpFu&Z>8-(V$pa~$igKX8yoGSK6z5+02wYAXHV?zB0a(l=JbWP{GcT-#FX0Li?0rO()xGjKd0>g5po(I+&F zLXp>#w4=hq3kIZk@3!SQJoWObuZg;vZ1VeTQU|#MpYVT)g#P4hx4L-s7(f=14)k?( zPY8NnZp^kzC1vybcPWRzU)BR~^R1N4>ace5^^CO2u=DIl_>}sDdLUFRpSC4Sz$eQ= zmCJr7&g8pLS4Urq>HPCY%aVnB{#`ryf1^!YTwIOVbDK7AwwN1CHCSGT{&5u*Y_>|~ z%K^NXlXS}Kkczwd`t(*1#nKA!Gx6E5b!&af-6r!Aj#S;Rk2cyOGh1^Ot?lgWT>k6t z$9u*b4HEhY@CyqIYe*zF41D|_6vE_-lh8s@jjq?QyG#a{VL|!nS*urrWC?7cfJ&^d zumAaO6E6Xb+C`)zGGY7=+!bmi_P#jJSP6Juo9pD%g7Cj^>5_t_WlBTkrRuu656H1s z9f~E7pxgSKfgc2R$M9X+?D0p#Fu{L>IdDW#RZid z`}9vqNo2DZ`y8fpc!?@rz3S6267T-t!D5Sb!UavdEV-|!g+59Ka7qCEOD48N(VtJBA( zot?^Eio+9FQ0gv^^_17+p7Cg`k~+wKN;~O(gajj1pc3-UB5GQ{=F+UMCxhSze5TZo zixj+SWR1IjcFW+pGIdFU%zK&R?T459O~z{_j2HAxfd^9+_SRc6Z`;#_t}D?c(?JhG_sk1dGB*I zH8pO%Di(6@jT<+PPEGL%vf{$d2Ip7$v>*EgEid7-bzOi0zS-H?M(JI1l8dCt;zVW_lZx$3^fU_%Pup;(pE?b%6X%9+%N8u|B zSzcGZ?aN8a*;5IP7TRITwcTsiu0>Oj`g#`iHG zi+wER#VA~Zsx&d!q=ZP?L`{7SZO0wlbJUP5x1aO!26LW4gZp9a=H1E(t@yX-vXp-+ z1(Dy#KhCA0?aRNA|KoLC{>Jj(f9+pRLd(D3Fk4w?@|XYr3;!R^(*B>zU3h!gpWQbi9Us7C({MQksmaGlz5R@=uYF?VVp)iRLQ@4jdqCh>T1bKZR!h z>58E#bXY}vM|YD&qR;1uCO?}^kOX|g!aB~SCMq9$BWyQGeS!32d37tPD(yF;b^EI1 z&!5#yvV($xNY@7%q$N**eA#g0N^sJ19y@jk&=6R@N8LD4ncHb`o<5KeY0exg!E@s& zz)VSN>*52-jvYIUZ;)o5D#c|b{Elds2gjwPq?i>B4i56%`LPoS-~ajY*W=!{lTY4w z`u6R=gu$@199+7Ntk+!@WFUW({HK%^I>lM9yEMS6%+JTi=TAq+Whnx;^Ioq!!--Na z$MG=B^4}&VCKcFqUB7?d)LQxSe;Yv0-ob&~nE&)?DQ^{3)rq_{TmAlffd57iy`Irp zEG{n2n+4s(uKy~#H3(NO{f^**7c9VuA;RllK>&#(tLXdons;T1F zF9Hjs<<-@L0L>0b^YHNK>**yLSxshaj#|kT6H}3qY=r;nuZ{8b_VJ19(9qBr46Za4 z5p6C6nWEwym|a$1KXvZ|0rPp1%IKbd(vY3p-hWL=DOFY9z~Gv?dK^G1{;FE?D5;2! zj!prHw3RFWgu?afN2GB}xyzS5icbwF14DvX@n*qji(6XMy*md7ISwB_Y-4LnkVsis znJ-UwfB#WqW8<0WX{4l!7|cCOOJ1|5}NprxQj?{GC>02KYm=m z-DBRp`xCf5EF(kZ+O=!Zv9UFebCNpS+y9l7l}*pc_<^Y+moqninVOo4WYyWb(jwecx0)T-!`%0wuSF}P zh{>4v@iIF4C=VZ>CU-zmQc_k{7N){MX2w)|WODL#NJxl9A6T1-avjEuWmx$2zh2}< zczF2HBS$Jxy04+KpkF{DPG&z|_Hti@Opv}+468JXyALifA#SRv**4~Q+A-9Ek&&_P z!PnQHKY#w!ynb$CVuBQkJ9om9pU?hAX#^8{6f+id%CWyDYE0umM_1P&u&^_8bE)hi z06nbu%fvv#Rdnc^wro+ja^-olA=&pv%qykaxugOd0Eo|^)23$&3JQ)MJEkBl{REip z8cG8B_d+)EhYlSATKbezR$MGCY&-rO9p(J|e5|O`w8sL|;yykv^f{J~>l>6t10C*^ z`&-<(a|bQg-PEmEy@~$Xi}=nJ+~ zm_95UtYBmmkD`A~S^3w{6gmvdwrZ*s$PTbG1ko(?Q7Cq0$|$F$>e8#4u3)7cLV_2P z-o5)e+cTWI)M{(M*|*f18X6i}H>Ibm8#yuc{P{M@DQP^qvyA6*BH?pIL)O*PL+Pyy z8+?so3GTOf_R>0O@Wod#vR&w=0b@Ygo_ClXPh4c&yZ6_S{|+%7?A}FYe z?IZvm)00t{G;5T&FnfFZMh9K`?c23DxMn8@4ICl=Zw8f>&i zhNskC1aiY-B`vn>!`;?V)4d0^Y}U1&Eb$6`@aqFOUfiq?#B5#2+|;m=sc9lhaeaNg zEhUJFb76MEr$CF#W}Wk0U2Jv@jo=B(yE?~RX&6ZAVL8IaCME8&Mb6qfZK4M>Hrp2D z50mWWO!?OA)E4oEhK3(Mf7Sr=eRf)MWH@aihG_9#RK2~0K|lfDtOT983k)Q0;Lcx_|og$-F&p6(&Njr!0u97)zAX(qi4GTQ!k#;OIMdE8!k#^2ZQ`vWeKM}6 zPl>wHAh)WS>aa}U6>aSgISZ4j4imLXr00M3Kpz0zOP`vAja< zvp{?mvlEn8-rnzk;?X%2BQxWZS3qk)7~p{_ffe*;*d=!O3c?x<>JODiXnd5sckbI4 z_2|(*01^7V6``yVDDz^6#R!T9x`Yyhj-by+R-`f_#4#HD9A&b}SP9LumX_AeUAqpg zU%x)-*6NR|klCtyH601$H$W;tda22~zve$Z0xbb{%Zeny$GE&T1SBtBbSEt;Aq{8I z^4HYVyeFCq7nj^A?Vs&8+o|HOtEvW|IsEYQ<<9W;?|ac-^f#p@XqN>>xiZ>Hfra1} zWG3++SkO%N0ag9`$Ve%4IkAA=4noXBswLySlo&_3Pu+NqZ$S+k23jQAio{UvZwv;XU$CQW&yv`?_V+kavyWa=?#t zM2{am>TR)VtIgjk8jH>D0EWl5H`KLrc-YudA_fGEFep4a{(J8OgMyN^3O2oZ{W=<{ z2#GHTL}M6X{^-EuSq?SpSvHRm*#vYYVwKZif4w${)QqLYIUbwQ+xT8TvfoarpeyKz zcXOzaekV>fRR$Tm0)!&>jXbJ_g<&Tp(q__7Q<25#TcndF{4mx}^|7lf z>4A9#8L`OmJC@rEwG@OoHBwKB@9}!g#nC-v!+&|O7DPFhVB=Z_0dpy=rlNwvOUKEi z5OtHx$D8+9_S>`<{wOc^Wg$p1@E;{a>7|RloV94kNh?hR9K_xgg>=a^;H)cGP|)`_N~4`~jBv6o@L>Y%2>#48r{iBm@} zT)a3j-QmT~!XhCfBSR9)_8mKtb;=njygH2Is8)I)8XIQC^w+OzW?Q9OibIHMg;|D*={EZLtgholW{^gGE;+M`cib zpB9Z0mCdLB-XxQOnp2nf>C;JRd1$AE;by~xVIW|eYe76gf4nI?gzn)yg;JIiqy%Q& zVt$|}b^h;xeq_juu`)qWK1ZO_lFW#39PF+G-0carlXNXiGCKMsczQz?R#rO5 zwAMXAR*i$hXM0eke*7I96C9q0IN>2Ul$MX-yUVGn8r;^_rb}(LjrrZ#dE2n@b8*HX zl8d3WogICM(_*@ul9CS6_C9E{?++Az|NcEK*34Wx2XJ$+Fu^?7SHO6W*`c1^dp-8y z!+i$DZ4KN!Jo^ZLLkpY&s^|>^$+Y!D<;&$W?JY9ft-tMG3g>6WN#Dsmf|?y!9?%Bs zH4B+m1CG<)-rifJ3yYYXnvJsFzyD@pW|pb@Wuz}6B-kp12v`S-m2>QEGDloo)`jVm z2fKh=kyB8(&5--%fw*@f5T|7aL_y3k7N{=Kabb2J_AS2-Q)=_Q5}rN#l?2K!2Bo^E zdz+c3o8?q3N7Xa%FIxa&J8G3Qc?3y|8Q&6;er^|j;p_$PLkhU#h`XjALsv8by55}D zfuM2FTU_}xx2d?SQ&(!LS81F3H~u? zT$*_w5pmHQY;2WL7KTj6ty^(U)2``mYLJzE*N<1;?~!j(Thh>X3}ubU5bYk*+CR>AnBJZEe=yHjfet9n@(DA*`>DbA7EyH{xkdLq}rg+ zar0JzA6;cL`fb(qf=eD%Ab?8W@LV*gk6(FWffZ!V8JU)*>`gB0x>^YOI;luX00QP!nRW0 zSQ!>+lB6*q5vW=%Ha$V;PpeQi?{XZDuS@q+Nt!ZzcMd~GJFgBog2m+wg5^@(aSk&dZOMVXw97EXfaC1kdq)Y}*=v;Wf-V%Y< zmGswFubP$3o?>EMziypM(ZIj}5RQ3S3VOjkLNYcsGdAT#{y%k|(m?hkGP3*eoGWPe z6ysD5<)3&7^a4hE@CU2a>lpu@(jDwcl{Ax3l$`OZi^oy^PNk0Xt3tFPtUPXKR+l~f$DOohfMFItOH1Qg z)>r+fUpZ9XGWx&BSJLtz3$Bl4(xD{38h1*K76=2>!jvi{m+w2JEmg&zx=2hZF4Xks z*c*plE1x-YW_EFIxSZcnL!))AS7k+oNm<-C;>182hUtI}{YI5j!Z;~OEYhByo-mtx%Ax!*Z-5QY-b=NTfg*{ljdE@a zL8G?0+0ZgD<`Yy0VK^*iTZSDY2vQ_F5j{>ng_4ZcCHwE!&2M<`zCp(2xz{O0p)7(u zXGdWZUFefdHfj+-o85=%W{WOk98*eprKIuV;lqa(bD&^J4B&2!85S{UTLJo~H+Mrv zQ8G9G43s%OT5>!lHue(IDe(sd80Xlulog?byhU@w-wwn)2zY((eg#K@$klq-frigCR z_Ro{Uu}U`sy%27}Hr@M(Ru>@~Qil$Wh}igqUa|L~!IXuDa>ox2bCXetiE?P!Z2Q7} zZ|`-{x^*i--%&}h+`u#(`M#Uv`}j_@j&JzQK7bZuvQXYgG+UpR3Y|A#&GK09Hm6no z9Utc=mF?xrmwpUA(SyzD)zf{lPWq1?Ki(G~AMXO1jdt%|-EW13bWTY89?i|oW*S#D zG>qoE`Et3yxl^A%e?AQPt`K$31HD2>(jbgCI?tFyTcPgq0o2|)rk*kG?GNPR0q9)Q zTOHx`ySG>OpMU<@OOk&ggcEV^1I2DnpPnQdCuLaYbsHq|J^OQCBHPiUp7MdI*#gjU z>!%-AA$k%$iSy^_A%WKoLMgQ^TRc8q?gmiPLDr)(K~prpva<5;$01y4z0AmR}2Og#!h5G<#B!MO;_5#j+wwQBs+YqLdpizh}+yko3-r(TnLPWqs z2i9FLbr|Jgub0SdB$xHy8~IRyh{cD?c3iguVip&&D5tFkG!mQE8N|lK({7tXJ%eZC zJNK&>2OjScZlRqK^Z~-nFDfe9E9#gXxvF#{HXtAvyIxle`ge$Utb5 z$Y48iqlj65)3)WtRxZtmi_SI zo;SuF|MPdo=mP<2@Qzq@>(P$P3T^%_n;W zUZzr_$vIP2h+CxrLVm+qLfXFcv@|wOP8pKikYgjEUM6+?-VUTf%tu5V{;!|jzI{8X z6NG92o1}gIvu)QarQ3^*Vx;;;*A)XtkwqEI$HmWcV_K_aM^1_>%5u(Z!3+viQBt|;IPA3{UV5K;bci2XY>=S1QsjR}%FjC!G< zzmg8F{wN1ddKO+ULI}KKS0Y^_q#nqdHP9x30Pk2zU~tXKD_K;81W zA3jW^K;T@$8C^fN`<$fYQ7kxsI~{^rNJ!|X=cYUfm({!8(pHOXBzm@SN@-Y#`UK~76=o7-wfP=XMPTEq9s{RZ@94&Da z+6168eN=tY^r78A?_j_odfs#Y5kgyZAkg2Ag|_1+&NHyGBv$AAlefq>Gt<+$c$cp)||MG;tZ_w z61D}{5BiavVPLI7w_4lS2(9lp+X(WF}>SMx46?|Ho3+}ygz5RJJ` zxlnrE!l6bA4|*MM7EMh}0#XTa2OLTC_eij000iBHl#rE>vsIR4v~_fd zl1oEFLoBE+Gz`&%z5D+B02nm|7}FXm$u_rG-sX7(<0P{SmCeUSMm{GxLX>7MAup>T zl-EFLr&OgHYmx?9Xw6%*=;-Jw*bd@K{LglLe{qn|Z!7>7M_5?Csc3D%1OEQ~n@-63 zM5;f@OB2hkIp_GO*w}%Wu z$Ka;t$YDIZyeg?ya1BArC3i;C0oQLN`l0^HFxTWQBV%JpoI*SPQG(Vd0|p!6Lik{d zBjEk9!!u8I{2Xj3L)nAZH#>H%I(YC}tO|^2s!lye$;SK7>D#U!xNyb{PNa$aF31GC z_Us`BQ9PC$yiTgNwpRb{-R$;RD1Yc*N-OH z_x0=D9*n{&aN=E%lBz&LJMK>$Fuh+_7M4B=wGHkgC1OI4Qwb*wuBYJ86?u7YSXLHk zoNm}ySR|9xP*-mmihkJL-ECG_rWW+Cdd4%E}aLbP>p8h zGWzppZeof-UZ&$S3jFiuk2#YnamSAgUPKN5D3UTc;OGV>`x=8Uw_(R;x7a)>^aY}@4Mm>44G zfSp6V(1S-C_(!{lw4DO0ml=E$jxtUjsL>YaQt+rcW&2z1m2haE|8_YVi`ZsA<^cwc zzz=wqh~E{Bo}!vsAggS!y?Dq$By%eB6U(D(*S`&kjGzBHnLAWPZ4Mry{GWNa4)&~*l@M<+@w}Kdvs!{Zbgj!K?1rv1yS3^5-&jbQLD<1K$_{xHAB{nT4 zhw&Fg8X)9!w%wE>5F5BIYpGKipNVA@{Tni~N|Lq*toJO~Kyb$%1#-o$k)wPYxKLuL zo-8vO(+PmyL}wuj3Wo!XMhQ6g0VkoC{2IPE&?Mm>K0um_DTWQqKn5+~TEM$hp$ksu*lP0n{~O zfSJUrm|XLBWJC_Djps9;YOyN8oD8^$MbsnZ8|TbOBF4!17FeYq)mY#I?08OCIA4SB zT7J%o~rCw4Fr2gwKM)|i2vfOUB};M&5>k#$AKK`a9VxE2)| z5Qx2D!wN3VU|bG1^UF}G^(Lq*I5@thMj=i! zSA&CtgAR-|93-!BY6dM|00S+aSAETj%IgVh11M}s;60*bk8o(G569!;% zHR}I4quA6D!YY3E@)ZqL0WgU;Mx+Bm+X5gAWl%WDhAn)y4;Yy!U($g1gowcI_^e$@ zN1_UZ{ZkJQgkvC1Byb|>Lz~08Sgzo*N#cqmJQG$LJUOYq*Z>BL^D{8`@G^O?=KYtC zPl>Dz!W!KZfmLXIk6>-EL?O0QLwA>Vo4L_)P=7=bq*lpw%*IqE!@~!X(g2oBGL;}N zh`|htlXd~%qcP1i49Otbc0wO8fL%yP4F!NCK1g~vs`b+oz7^-P62 z-~U|%?Ici)@A&dn{Dv<@y$B2>=KCuc5b`of3M9o~`{QYQ|M_1E9KMwkct0!QF-1~i zL+&HF0XRN3ys$aljJQ$B)xME77%ePHfF2Q5IXM+!aX^;e$;6ZZQUt!F6;ZW*>vG%} z#gaB5d#be>?0GDRHiIZrbgtxd9nLk~cvz;k_BARR+|5vW#fkmF&@dL4Th@eZZ2Xtc zj4`+`rB$2iB@u0+?1|tIY z8{lRHT|;lfj_FgY!O zu1giTjId}xE2YZ;SF+Nn8ki0I;v(CZlpj#t;qV*v;e=FJ4OK-ScoV|OVNVcd9b6DO z_JNv6#t*B_N@xCfMJxS5tTkxN<*~hZja!c)gD+c(u^&K=AB33{Ynn%d`KwUM$bN8K zu!V(=n8;DkAgZq}-;C|rYri5p+F*f5{R9rU+wkdJPEHOvCiUv&%lE*%1h@>iQB@rH zKZVFrQEQOv`D<-+Yn)`Yy^C4=58amiceASVBMGtS4WEv9!+u!hT z$=rm{*zJ4WKY#WF@}KIl%Nb6}@`8cwQn1iIM9KHk(t@h+i!%Y|Ap*S@TDKoRBx;fX z^RqB^XjGd~+x`iwbVG>(F29Mz-T)FhLxTC;fiBBTQwWcM8f%(TjnB);(E?z9LMMJeyHL zz84pN!5N59`KXtiKDeN6tXAF`GHwn3Qfwgh?ta|46IdFi8CEs4U9awmdjh`w@v&H(4dTgasd`ySUe68yWdw%S;Aj z5L%*8YT+4SKw?+?_xN$Io)?Fi=_Jr~BGazN1x;}*uGd`Pm}bs?3{*MQhymN5+!dqz zd~0Qtb<&}Q;QGkDzx+07?~h54)X-ow%9+syk;<;lOk3%vsG;GBRKqMP%9Lp}>{8P8 z6~YV;96uaaC1%9KvzV$`YC{ za++TcF8URDaJ5ejhQE?@w!-vtA3ZY@`Y%5ro0E9z=K%rk;TL_+hE=kuvyv<7<~cuH zo>`O3mT4&DiFZnNXTj{Cd-v`uaSt4OUcfI9w)GafH| zeDbfZCksE}xiU;$Rtry{uwCTj1_YcFK<|(YIevZC+X2~~4AE^KF75xNSYla;CCPxY zGMW7X<{QY8<7|)zwhD<7vgEidK+HSyCx{F&MDnjptK($NfnW2r5^tbQz-~GxBSQna zcEhU+;pYBiGhO&EmI7lH+0k5jf^6o0+hgNGhdZ1@o3>xy9u|y3v=pw9TFlJyZ}NY` zh_n8ANQf79;8rxMQZh1y0IhibhhPTJ#?($yk{@qF2^81Y?{D9InMCUNN?=j@qU9%R ziUwU*S656*N-Crr6v8*e2bprUG?OzlJUJ6_#y5dW@~`k97P(R#!hw{VpvHuo3G57OFpu-JI?9sg74QPUF~~$`FW60<)-0RI!gK4zQHp5;?0|< zI8puQwW`sVESoWx^n3VvF^Wi{S&vL-PtPqJD8@I_{yb$T`yBD0g=(KIvh?I|a9+97 zqM5m+zHCSsC)|{AS&3TpP)1-@mc4Cl%lget`r8@nNS? zY7>PkNX8Y6_6_WH;t2pJ{|M$OEwm&UO-I44CwQ1 zgwrTiGnWzY5y_8PD03}09ks&IUBOO^HqGb|)b@}aCRMny!`N_;Vhcp#bK>G_1Ox;! zgyZF-wlOl&JpAHp3`+=^7wqLcPvj%I?buzvavTInqCqBq^ytwIxK(lI{@q{Kh+Vm| z%_!~nx-6Wy!xof(i|Ay2C$f^t=?rm@{UlERFm5CSEtn*4Rk8V9-FD#o}*o&7%sMtAwAc2d2~ zr>3SRfVFNO&szP*C0(PGnZ^FzUNHj$gS>K|M=maBBdRAT>9*N9O>5;2vHBEKUdo^r zwS0Zh8Z7EZ!Vnw6n3ez~{-poVRL*`iPQLU#?0&# z)v%0XxyLQNTdKAkd4kq|o438@O~Z-DN*ouhKaiap@#UBEhavmB(^i9Qf9KnDxtZD6 zHbCD!LFa)J{5G_^cdw&DQ9OU{+**>5z%MydY~Wl>v>wqysX`S0d-`-*u8$;;z~LzB zF&GHN;}oaTu1Y8wrP81GVl03p@e$~c1z!2zZap+RZRSk{~3yN!p&eoKM6_6)oEGPF2%R|E!&b7IvduFWev~d1P>n`e9xTh1r{BCl`4Zg zaS4fztzG~N?`TW367!5w!{XwoF_|Bm20u0!qRzXt7`ft4gW>Ck>m#Z+Vpd)A4|q|` z1+dyKlarP+-`5?vy!1}k=NJf`o3R}=LxohA3S^Q+Ai#&PS3pu9%c3D;=oPb z`BJHnq@D48msn>K#{Dmr_>KEtD7h{n@sGIx!?>;RxNWx3&l@NHJ$7shxZ#%9Jjm#t zHI6uwVImNO6$I(^u)6ON#^1yvKX*>$xHN@NFKy=rDGIlqI&1R7+02ed7s9=b5#;!T zMRW7=@)b;^UiZ+x|7iJKmF+|RKPe10U{Jh68h9UT;+4MWanCAdG0?7W5&V|{G*X8ZxIm^BnostwLH zPdn)g{uuJ+YbO=cQ{c5A>!f@P&xv0gf@!21r%(7_LZZyJoW4LWT2&ZdV{`1Tvz;a5 z#RD!nVq6s-H<+K)Y&^7s zLaY03oYhLe zdJ)vF`M>LFsDc^d^^;YMe5IDAKKt6$muZ&Ew1fYLS!@#&MKLTP?t(v{3u*E6u!pS* zI{PFtS18|8EMKtC?vTUM`+D!MJEN!%tvyk-6fBrBF3~9YJm(^-&qkHF-H<&hC=(U> z$$-7sU9O5TkBe`6H(fz)c6;{hrIpAFBY80?35hjdNuK6369`H(@AI~&(8+W2@!37z z6YLbeEx-Qgxkm9Hw@)5`yFBcvg%$BydRt^f1a3{ zC)XdFq!Kqed`33n_sP9mMoUjoars}mx2XnzZZ7heoi_miH+cgbTy|D{ ztgEXt%73qF{3Y?rjpt1ql3{W*JDy2~*>CzvkaV(2u7I@g6x-or{4qYQ#~aXf zupmy6Jy7N_SdIND7%ei|_gp677b#9c;#>QsBsQJTpsA)z;4vlOR?P}JC&BGW$^@Ok zewy{1>KQD?-{R+yaS_5BB^--Hem28dSAM-4(kRBf3eP0sDlK?-TEO;f zoMMUH3A>@vfd-rU>ZPhEjwf!CJNhynsC!+Y*yctQg&Tac@%G%{f8yq9!2N9u3?5)a z0p<_l-2jZ;{DFcWX)8C7IFi~(8dP|&7asy`NPb2UTAT?F|P5#%f zot^?w)tn+CjNtWJ&Tj52%--}w_t>_x<9qF47%a{Ws4@l;zni)_-NnVla*ldp%ULw@ zFZ}%6fKtBRIKjppE)nM5H2B&o2WrY$Fh27^u?Y#j;-o}lI<1=4To0GGpj;udVrX~_ zwYuV#+m~TBTDcqVuWp^&B>KKhxBTPv*}-+4h-ozc;7V_o|9poarpw&O>qvY*_9A)SVuL=S38d_$y z7%;TQs2^%Umd_Zxv3=jZz9fdObWT5Rz3mSTnESVqPWV1@S(^0-Gp9zD8_p)RqeqO4 zjKr)`L-o7@q=>k%vG*x{1S*5&&>Yy zC~S;Jqx{9>x679i2nwJ%oHtfy9rE4L^kOD;gS{uKPeY;xXUV^JHQx zaX~ZVe?PY6IKsZO`q^K$&A>sI@U784Y6^wY^;~_^8S+#b8biqp@%5DK)m~t35AgHv z!z7MoJgZk`rc*)`RZdq|R^EsIeG?Ea+$4n!Njj$J0MP%ef)X}rjg0@df%cGv{K)EN zz#Jc}B>%wkv-irwmT;n~GfWJH0E`b8-s1t|C!rptWM$9W+6qiPieLmQ07F$f6do9O zzNDM=TtSlwK@+q5BjRg~ezFFGn7ZI2%x=Sn1AsE6+DX6v6u940hHK#Wu6Da%ZG||+ zgNPPT&VB+GM?u}X=v99xo|>@D{(4nh;^8wSEDv?S2`?BAY0c!qPMBpFg|16+eTl|J^tz?l|w^S zz2W+i#&;$cm?{?EQvZB$ zH0TG%HgTh8hv4zT-~S1|3zLs{Yc5RyalW zz&J0isJL5Jl=~~PPZ&mtqu!@&Mp?jZnk>%S;10bLw(xy3!<;Dc)f|(E4c0Mn9L(R;#8CW;XWm#(?>-1M=+j(Ii}uGfvi8Ea z$^nrt*1Whw5_nf+Zs62@5&ONEfPC$M%Uv@bx_ zpt(2guQ@Wap#-ua9(N5D$?HKu9(Y60b{Kc_2+@S<_&A1@&X?@W?^?+!i8v84(3(w; zLvKZRcgkD&sOOksocQ>0Us7AU+wYgp2s{hcc*{&8d`J-VS5bk`AtVCcvvdn010f0| zZ|f8#I8Lw|wr1_i>k_v?C9q>?4FHOPcsgT$DW+Bn_QbTgq0EtoO!GG+%G?v%VOX)o zJ1Rcns@SaP0uOL;(L!QOLywyXrtXse$#Z=t&%X+OZSd;CV-($EYH8a@|4JkSF$?ax zjR(jI?iY33U*yG91fI&Y^E>V7{WM7bH^GoBUk9dGjq+RDkiT!jr7?}OA|`0AVTBXJ zu0MEijgq>>E2XzLx#?bUT2&;foB1cSIla2D79=Z}V{${ZlZPP^^06i7;yp~(-TpdP z)YP`P=C7hU?J&!I^3dYpPECUY}Fwefz&1rM%&&4 zp^7mDP&L?*0ua0b*wniJ-b&yK^(|N^Ng)N*gPAkwD4Ms z(GwBXN66Q}p|Mf9VG_1pC>>u)Z!sDHZ@kGv@*rXAA-p`w|Gf>FTni_-{=hcp>sx@0 z9$qr&Q>(uVxnY+JJ=_I{>lPL{EX< zI~y+l1kbh^Ijt;2^f;?bAe&5xi16F`!HaLl@|nmBs;JT!gP`7>s(O~dKY}d*ivF7Tjwh7XeV6< z*M3z9?^DsjNd;!8c~sj_J^rAt-$VHFb8xLy-P!JOt^5Q)`#Ef4cbpwmL5es}wGD8V zuy(ZMoR|dOgHhE*olf4(x7v9cZ+iRHahkl>%2{wV+A~-CHAZY}XryuW2u9rPbRLqx zmei3NqpTe6V2eJL7pZglru}xImsH5BY`S+hQTZEoc>y(F^NF9=X6l;mEx;1Hfr_Nr z`#5k3_a0L22t{*A1ukTT$Xfl- zTKxhTb`FzwtAWz`O*^K_ANVW2FFv)+>A)jvoYnh>3WtdrSFLp?Z{k}^C3pRL!*G4C zS8(@vC($s?`9FJBI}@JMUZl0Ijuqj37%e>*vC){_nvG3O=#O2LKi)W#$1_FlGs8c8M8o>`TA;E7 z(8#wo0&UTWAizi%Yk`_XXW))^shC10b4S{dN>k$uFQMnf8{cSAbF^Uo$o8zqnFlzt z8)*MJ;of*0xJMl8FSKG)%&Y9)${@h4zuNP~ht#eN_?}u1Cc*r3zuzqjr?cIP80{{h zvTml*f`M{qNqohLkfpJA(YS7JTbxWK1h_D#XGJe{6FB4A_`ZRG zog{ft{fqyYJCWH6KjQ|f{6%4gpUz=8Ws9fevKngED4Ijg!@wZ;@7 zi8&ko)J-&3^n@HcHZa0{WivA5p zS>;qz1TNJcpiH!v`}Dy|3x2*SBvI>3GXr`=N!(2%ZGxALplUI_25GIXw1XLu6w@+ zQ`-t*Puj-Bv=#g|a9D>`?i_=Fpy1rKF|k*`J|8};Tla7k=19Y9=9DN^UZ44&2+@Tj zkbm!g{CMJ$--%UV*1WVY?4n+#G)?KVEa*Nn;cHO zNr^EBih+$a&Tk0WLz)^jL7j%Zve~@)GDvD~S2Q@5c23wvXk1BQC?aP~!7eyQWFM~j zThU0<;C;o z&Y43Qn-yb{i>5{cBNiPa=J&})m2*CCdpx3ztvp>FvPb~>CcJUr*ej+xbup}y@X1@`69I$+4_s>t8t)a3QBrELGt z$vm-->IIgyx`Z%;I!G`bf%Ax7ce|nV^=92azhE6+a(d~S%TI3D&P-PVib4WvI#K}1 z>IxZwv}lCRP;G;2#wM>E@3h^GG{Fo9i#^C@!vVwPfpPwGG%4J8F z@C)xG2ABK}hjN6VMWc?92pd6{BLSBY85i8B@8DP6xo3|%NpP<&93scX6X`u#skU8weToNLfTj5mlp!s=2_eI zhKt2s7vy|6_qqAh{|RtXX1# z`dsdQbKR`}lgSAivo(&B!y@MV;zOyq3vn1XGn_<#sBG$GZiSW}#tuR6 zE^Ih3V3}!uAqf1z0g0vhwd%5RJj#^1;KoxAZJtJpy$&T%Xw=-MPK%qa;M1LwZ;&k? z0e-=+Pm7$z%);`%$@q1G&F=5^Q>k%vZ8HaEaAf^B7KC-Ft)k*zbXJcMe^8AzI%ZX? zuY5k``cAlFM@kHeXbgcx{4l!79l~~qHcYsDYNC8@vxRj=ugt;c#kLG<YWe-}mvmopzK+JEKHal(bYxA@Wd4$w(0uD(!(5q9{E^ zNyAFRNP8m+4HDXtmZnlk`XA?==kx#myu3aik6ZV3UGM8X&ht2r<2b{{!mnJJpOW?M znnUU`B$BC|BiM!KGlHSMDYw@^tpRyRz?M5R2t?@r!zn?knTj!)yh*H$hMtGuo|eyv z@mJ=}H<08($h+=lE2p}o|9i2H<+V5caAW3h}?PfZBc}=ixCijji2oZ@2pvZ2xni_T4yN zo2{6^QRlH!S5c3W!`An4iJis`5CJrWMMUPtc=oPNG@32?F=gP*O+SG2F1%{La+Lc; zo%k@{)Yt@kKg*jG4!mAb;a0<{gQV}HeLb=`79Av-p8O*#D_F1g{drn*W|mnYo$C&3 zM(W*KL$P9NQhnN1);C=XjEi0^(&Hb)+yuv9&Q>+CpU*R-V@czCBl?-GC*wu5k;( zoUQOX!ZwR+0NTL2bthP_N;g43#=$rSVs;2LWFu~SJwY^JjON;X$MMI`AkXCTl3#P2 z5VLds{$p9ndtg`pI`f&Hbz$8h+V7TC{_-&Y_G^X{`>!m+)Rrv&1!sgPx@5?}_Nd0b zXS%O?riMM=ftX=hZtq--D?rZRX2c~Yzp)=h;TT~`-++ro`@MoDMc>lyPVd0M$Gi!v zvL7TTZ{BoGWh2!l4WpJHK%({>v*)(+?08NDP-8#FCvl)mW5@wNev*;FEBmWJxqn2i z)j!1|NWMAj$}O_i@V?+#!msK)-ca%OE#-4@U|80Tf|qE;a!E)t)&6%h^ObZ=F84&* zjbkP!`A&volQIM7J6~#x{}XAhod5Gu+|s~VqQYKcxs3Q`xA0?FKcEzV!z0j9|EKji zU?~;`Qdz+ccg*UkvgMg7yCL-j_fdx0lbVolKxY`7r)K7{T@e$CV|i>?)v=L}flZXn zV?qa+Z_5(jF0o!w`M*vVt76xD+&HRHhKN^~ze%8tR`Pm*NFBE-7?%TjqmEi~23z43f z)$n+okHmM^Z%$9RSf9H_Ivz0%6+n8e1Bb0@8==sJD16%)>~^Wyfg-OP)N2t~9$C=U z649stw&Oy&qZ1m*J9#g^Vh>$^8VN3n?Txf6YM0gqTJ1rc0gd}_){_k`V%XY)kic`x z_T#AGWU$_MUy2j+3nU4FLadZeYG_oBf#H+}?w=Q|C{bDd`1I(UGeX2<^1;L_Pd%g} z-r}T|tIVwc?kgLEpxzSX`IXRJ9Nqo+lSKcMpTmD9qJPHJBT__B&kb3Mr(_>&uXRBc zcpIbHJ>tx6vM08DcWk+fuU2i#DzlrNPJ{pN3jsNLKO8g7Aa<@!)%H1#A5-{z zwWLalTcmDB{zJ=^gMi#yAR8`1;F9F5s2|TmiP?16)fU0Wn`uNJ^>T%!EmY@cy z>que9|BvCngg1ZFO)W|7@lO>_h#_(@b+t-C7=A&PsT4#5A`WbN*W&0svFjVFWr}~H zw&^^+7q;p*eot%}TVrL6y>5=((bhKz>(XG#L2wn*mZXjEs@NVcI?Tc7d-JcBiA`FX zGj@*1kYOZmrUXpN?dL5hg4u z8bHZsgOnqc<9owyXnBjH_VM!V+w}+rQdhDsZ<;uo#4>SR8i5)dDS8JC9w85!!RQA; z=+(_T1uOa2tvQkTnazJ+PMIn|kQ8XS;KI*?JbU!!Lx5(9AsWc7qH0p=vc>KU@8b#OMKpb>O=4Jg$qJ_Xo7i%-|b3f%91;erEX z^wDU4iD1B|BQt@>enDC~oj3r>vogV>2Hdv}z=#@*DX?_D09?uY@Dvami;f127$|D| zcw`k)c`FoT7BPZhIqVs#y}SMXAHZJh3>?3^$0W-AUkl=(gS(9!PO5nl0zt?NXI#|& zlgW@_W=Odxcu@d@>WMy3Ii!SfnVDwLNUy#7&%yzS-92kukcjdyzQ8>;4|~=ZV0d3{ zUw4=eZf~B|>G(S*Y>fJDqNW5Qk1R#6ckc?(VY?0tbr8;Y-9C>G!itFkr~y3cIb>cf z&g$#ngW!e)WgX-jW-#nVDUsh!o%P<5N}H6_w$G+V{e4n2H#fo81W!gd`ASE&)uzs| zH}7e;TlO8gf!R9^Tlmr6*!P2>b1ASYZR(3CXdNEX(i{84VN&OYqV;^TyZ;OC)OL@( zDm{x(Wf^?ru}+@#`HZaD`}k9Y@*(}d_#1*mR31Wrzr9-7aI93a;YxCmxfr{8ga1=o zk89EsW9R46+zdeFp3eSJ3{C(bMPzUUJrMSVgDoU}!^K|@<^eHVgw)duYT`JM3kbeM z-5>hsDpje%tzl%cIy;v~I`# zaD>RDN$2L}opGZ5ttfcuhEe(|pZn!n!Q%rXM;TmyWa~2oA)hym_sxZo+P}<+h|HM& z9;YC&CBX^ZP1s``O4D^Gps{*Jf(R-GQ2@4Y-@a#MkxDs7@AAk#LuO7nnG!&{=cwa7 z1Bkue!y);%e0$(x2F`sWQ$ z^IYdRR>iFwY^~;)GZ8I~8ifc*Xc_;)hkzall{F!lIi}NjmTejF2r~0}-^mF%u(EN? z@?!pyWd`=Gcggb~e_E73-q3dzqIGaPo*}k+2EO@M-h-?{fECl!V1kx$==&k<(<#hJ zNxa1n44HeV*vm(iQ8+hrk#%qUQ;)h?=C7`#=QIs4AKM04uL}5f|2TQ|^3aprli2jX z@2mwAvA)%7csT3VHLXKqJ?dW2s^`7kj`YgI!y~m~z&2*=$Lt{$$?A1JnvNA3KhBR* zqRc-DH--=08p9)N+A7=(yzg%(D)mrS z2*DE#)Sswu$w^z}zCY*N@;wEUi1KHJt|z#50BO)3(DWXZwvVqc_L^{D6@t^AfL->y zKTmCcF(;=6brPVgTMi0uATj_MmZank8V&$i<9Yn)`^psC#kl$xs6&LH6GJgZm@Z2T z2*|Lr=fxQHBW$~7Vx#0(u8k6M?ziq8rj|8FZvY8$zCMWx9!rhN$DY?kM+ApZ4VY|~ zuiFu?N9!0a75ZR5fXng)v09d$qoZl|qPVJ#*^xp#(asUUFGO)2S~{a`OMEHy2HU%t zU zjx+qbM5#nV-8-J)PRjUuC--O64G_`K_s@@;Sms)YrU*VKj4dCHaW2*|g6$H@U%!3^ z1zgy*Ydnm9*PK*FP32fiF^3JWeB3eOfzu<#N9P8y*iQMkAy4mc}foartVjqfAW(7W) zWXzxeV+O;h_4@m_?%yvDWFQDPOrN84z8=Dk-0iS46F^}vQu(soqP-Ync|Fwdq1g|i z0>UW7uhtLEmcmPe3X1S?dqD^gDtoANC|WKAJN54N?b}b2%|t#rNP!mKe9b;3{Ny5F zs~4(mE*PRPLP>6YIMosvh1h-{A}rs1;>}80*RY-7d%8bZq<^gaW@}53^b3%~fjM5J zIfW`spn3AnY!x~2HXP>1zP+AJ^lhvsVv(b2&X;Z;3Im-M_|=qvMNWPsF&{43b)eP} z7hVbw6FyBPeeYi; zyOpUNN$^wsw(bA?!yZ*mr9=diZXD8xwl~1wwb}+71b-G>pWGW1IK)91V)$VO;XjT# zL-?Vvdw|K80L}XgbO(P+)%^g{0l*P?lw5?^1Qi+Bakgb2!QCF)$nB4vi zy4)@4CAz42qfB~{YW2kXSFdt=PPBjpISm(ZRHx=`FZexZl>?Q;2P_koYJZjajP8q-2Tuo0)c~V5jPOUb#MuU>=ktrLEydcZ*h}sQA12*CE>+B zLpK&Dphf#D)Q@G(_yN5IP2={K=(Ff0wjYW@s)*u0%j`Xg&~OTXA*4s_ICb#_5`dX5 zB0R*E%GbzJ^|z5l7A1B-|LcJU;%35CX_Q@&ueX9~LA(YeI!Y&53Eh7Dc!qc=C&?g7 z1Qkb#AOiYZb=wT#Dm9SJP_sRc_{d#z{)FS>PYebsY5$^qRIWe{iq}gazm4JCdmbSg z)pSw(3&p|Kf;mK#5z6t+E1TCFi8jq7gOF{h}&=)__A(n5=OPF!;FoLx?SgfIX`=a+dnVV z+Ky*|6%vTCyP@rCCBWpH?A*zT$;SYOst5iB=r2U)Ngan6CKw_|H$(6nIF0|Zryxkd zx56pIy#cic1_QBy{NlyQbpotVGU_3FGCsChB^xZlxPc^$Gjv@<r*5 z03U{Siw;_B*ubT{J5we|8bqYyC@r|JCIZkgAQa)3E}a6q$elyRgnK!j1Uej!JAuK$ z9m}B^022mq>C0}F3PyZf94o>y24(GFjXKCq(k0Ll1!FuYK3jjk820(N7!W66qb-h9 z6W)Zw*^uLagR?_Qb@}q?#24GN>HE)4z$ zc$l#~=whMMmvyw~Q$EzWI_Bo$#l^)UHx|m72+^(n!8J?p@`1e3 zbO8V2RnSX>;N+j6WvlL#wQUu)da%E((FO$sPOl>Hj)Q;-Dit|0XMK)a$tg6q8#2HwikMOynIB!beeF^QaKDy zlvoTfksQHlLuw0i^lk8X0?83Kb_-@YTCCGD>r+B7>p*D(JVUHPFiz-8QO5!dfFyDK zrcHdQF6;GGUJ$zuF=;;3ujSoB6)qc*zSU;yLsgTh9RArHlT~Bg0^#96l+UWR!e%{u zO(`+=073@I;AfA^SM<1+S8PkFIbKT32~W`0EDvTSRPJ;g(DIOdxwWjoV#TBY`x7~u z9K(Npwb=p@(e zjvBgvMnYxD3ign*XLSJ>)W4uVKvb%`eWSigJ{EXttZw#_fLVm1PpX35ceH}lugF>l z@qcQ|I!q+IG?8nDa^iYKuEe^KJ(;~R+Q~$(+LSB0{oX?cqK-|yBBZf8Gi}E2>|+)C zWho^PpO37M8Z3fXv4S_FGGTjVe{%ks)^S{)*JahQQ7qC4UFaju}bX9LhK|+NTu=_WSdl(1mw$q>b95O zENSWZsg8pcMH$UNIn)~QXZ)UjdE=iZ>!tmy3Ho2f5Pbq5BEI?*KOB?qPo0JJF&MZy zc(UEEIh@*bFQs6QNpQ>T-6+}y+>Qxmt*Wm-kJvVKss7=*p%1Iu&sEudUrFR@#KnWj z-IIv7OEiY{^&5#1Z(*@F-JE`dD?N^KUu{|(+B>-PY$FxYUzVwAvfFfv6Rvjj7#2?kIIfu95NN zQS#!LU0*mq4(@edyE}c8YPwEv32i)Z;6O%Y$q6$M-$8Mx*b4&tVBd``cUn822ESm* zX%Gl1@dp)GEqV)(33pFJo`ng~nqK_f;s?Qd5A0IR?dkD-8Xs(To+)tC?Ee0JD62ia z-TPk2yW0IGK@dyWUhD%v4W?)ylKL!pif=I!P};(8%m-wPKW2x4><1_XdJ1+9j#s{) z{O&wVL8TcxHU(nXoI%0ctt|HX;EM0AYmTh4$nXOW&yP&2(eG&;^WUI4R(rz3Udok! zdEz);yjE9I_x|c|>*`4jei7kNb}(@oXPE!8j8LDQxHl&H0#badNl$@p@K%TOK=XWJ zz8HBi1~|6naNAOB1jPrIzuFtzp6QV%1pt096Nk!R69P4mlv{ukI#xM20<(&(?QU}ovsGBw!}sCcQbo1MzyXyK zef^9D-L&32G%9-EWr#> zQ=5hPcl?gu&ZKqla;guPaS<|*olJb5?l^A3~i+@q667u~a*n|@iNG(2WO z-jyM%>T#nrr$_b7V?22z6OVFM_$`-{V+G8EsJU@HNij0Guog805Dd;nl%%hso}R(f z8G&yLh)`=yaN;qKE}7m#f^LUejXs+Ve*d?3$-T?5chcDVdnLjQZk>Df`10B>_7$5I zy*fAgj{N*?Z1?Wn>T1u{*%Ctu_IEC(wmUZ@?Nnd*YI|)(Eo3NHB=@9>DpXWhb?IEv zT5#{QB35{>#-&wH65HbJbryIBTC%BEq@4m+T>H?({PgV!1=Sw+x*I#IJvJZaa_LdH z@*yBb^0~?NQd1pmp=x#Beh1G{b(g5rymu3l-;x^MnOfYvQ#%-?o!V5R^DRmHsQjMP zCEmRgv%hs~YM$)q=M&=myycQ}gTKLHG54qbiLRGbQr@Rr`h3six`FxI1e;WQZiVz@ zjnkT-TD#C8Ani(XNbnl1cK}6(zYGqNa z=lK4+#StkN$JJL})o!_H+b`3p6vp$lLsDuOf|~fN?Z28Hzmexq@H;vF;<09{`}@7d zlC76gj?UQAGut<4?DMT#N)^}GR)$6I$?k2Q&h6`}GEmdoZ~Jd*w4E3Kj|EQ#Z>+C~ zc7cqEPt>hz9&V69Z%luG18RvxFM54bTN==K>+>zhlY;|ap%;}u7-8Sh*sjwAfAb>F zmTgT8sSMYP2F}4x>X*SpxsZ(SooCY*%|yH-7q{$e3nx}o_#>3;wjohPzMW_!i_2YR zjz{QPK2>~0a75JAtJ4@DWS=jN#4v?!W(pTy%$oXUc?v%ud?xLG=;5K&Ft?1`zH-8Xf!>z^VWU^E}Pj~fqUFduW<)MHk?6oaA! z6b0rT>XAA|xJu#K)Fp>rzJ3kP@h#M+@Pwe)Dy-VtzXYc>O47d)~OGK|9)VM z50IZ#efo3{w__>N{OQupZ>5 zyI9Lq#@ey}{opAMzUJ?r9z#-T7^RCZJxKeoocP{Z4tQkYP)*naLac{835$|NQ|jL+P~-E!TD38H}!$Y zi>Yt)!jMnB{?knTefX)rcOs4IKW@Xn!NGLuPW)(&H zk^Do2*2bIxoK%RHi`)C(C95G`Ha2b#c!72E-)DbkfLH6(-wICs#MEO4!xPetohFJ5 z!9V&cd{b8u2B1WgC&=%r6KTeHFrPVa7IWImUBXMy<@Sfe0D}RAej4f#sCQ&9KreQ*}5@(5G$jfudV zJ=;vd#{xUrqxaM?DB)keob>|#DEI~E)YqMv`ns`8NKvFGIyO|=dF|n;>2X~_Gq8&* zQbt{}qgzb2b!Wa2#?*!omyh68W8m2g zE#n<4kvuVH-2~Hj!HzL?ci{!S`Qr|lpwE@QZoT(UZlRj6@HTCxqPuIs)GQU@Mx~kR z_&5p&(@^3duP-xE8gfE&g6~TIeNbO8js!q}3SXkuSXEWTdmgyW@C@dh`R|7ON8dR5 zut5rh4)Na)(6o6!rS)e0`w}>*+2!bmjC>BDItW(4O;w`Qq3UkJwrmF8R@Kx75`LU1 zg>DGUc={A5WPC;Y8VLcA`g{s}!SqD3@@vA20VriKe9pOI0ZX)t)5r87F zV_`tZw=+ppXXNe3uMw&L^$0+;H0Fc&(`%c3QVmdU4hF&>Jt#OBkS>!-vI1f?)D5lr zBn=9eid5Wrh(L)IbI7WMb(#U^_!!9M4nOP>R|W*IFu;exl3-zgjfH5R!GI><@~f{u zG|#V>KXpp^rvAFr+Va{x5EQX^UMaYXozk1ReX8V7MWgN)C&5XD_TiQPDcgT#IHs8d z%W!a?o~_1r(AJkJIA81+v&M;~?}CLfatg2|?9H5=RUpl&P1A{y78h5KZTH-=VUL%l zwvc~r)Dp`(<%iS1p!NEs@An3Gw}0AhY4`UXxW4gVMZQk(v~yuH+_#lugJTUug)P3{ zuF1YNlAR%v`^Vfq(Wc5`xB0oB3$HjR=Pf?9kJm0yM$TW(=;L%Z_|K-{zh;{}5;?_WGtXNEb)YKnTKMkjX;!2=w>ZSfVDaO`ouA5PTq$$#i&*d>a`E#> z|I>qC_c?BH3LNxS8FkZ$(F#x&(X9T((J?N%qfF`QDUOA=yl(zu#S^C?B}iXXpfp`} zqgpE@_IP`P9v6ZY_>!1M1IN@g)jGez9F`ZCg&xAo3_Z2+L<1O_K~p&V(07TC+S9xin-W zajUv}cxu8xad>Kdygx+8wdF{Gu?w0fe@Mc{j2h?9h4u)naTq-ME`Hw5j2TFXFhdjZ zEy!SzT47AU_WS+$a5@SVMV-#Yn7}=*n8R)XGfhl4mR0Jy$A7g>P!i(fWW(tPsXOu} z_)s8}u9rMF$R6RitMkB)lP%c2_;{DrNd8U-3Y#dI!XE*(!U6%6 zMIXC$N`MZ1b%??Xe3vA1-!-J; zS-}KjVcKDxZl0GCGi4~i5>y8OMXSzx?CIQ^?qR$=q@^qt|6Y4@u%P98_YM4zbAH_+ zj*s__U)4$Qj8MqvL%xOQupd|EUondhKX`oWCDiVlZid*MVV;q5_tGYk zkL(r2S->fCxkM@VED9KOY_sp2|Hx21I>q=Fdrk=*fS*}i=G@~m@(SYOF=B0~or}Iv z0&60Qf(FkDH;n*Fb+4Jn@4`G=nc)O;XQHo#Be6DGhK=*vLlYasmHjDw%N^eCul_^k z*->~G!rS(^X-JJ3R$22eK9wh?AW?;AYV+oGfczkD1i~q&eFxC#;>B<5%?=-4nDaia z=oAGR!Z^RRfc%kS5n?BluL%*vMUXY;YF&p*$`Hfi z)57p%K}rU6-+lVjc{1IeptrLMb0VR}`Nbgzi1GMGP$U9j8jO=|FU+VBeMQ`S_wHT% z5bq&wrlpd+7(KmzJN&Jn8NH$DITPrkn(rSC+yME=tgZyB7uZD5@7dsfqwAO~s1fi$ z_Gt+ibiuJA;wy;}6h>wZP3bA2wr)WCx9}MF7Awnx_i7H4_HV%gF8qkqMKad<_H7?- zB=_1CrUJU^B}HO)eX*6_LRAmkwL$8?DCLUU7G5Sp2gYNx1a^A)$MEv-xNSd5Bfr=1 z^T~*xVr-f>H9bFc=i4EhMLiH+JW(UFy(e!AGo#p04O$7m&`9}Z3yi}RVHgeB2*L1> zNtCz2JEdvuox#EtaH3LeAdjCosg2_|%K}%F6&T;t;_p<+fXov9S%~%Xey#-zJ8N?F zZzhZp9)R_`%?{fLRmM=wY(^ysl`+x~Lg*_%ha(CWvrzT^jb0Ku-~!bL5K0;0%Rz$` z$_}&?%tVq0+t|zle+eRA<-P*Lk)uY2hJ&AdqoK^ky%H=8X2!ZP)2&OUE_@mn4%Y_I z0I~+@OVm7u?s~0Tk1t`!EL$cFzR9!9W39QT&chlJ(``j|r1SywZ8yqAWszLAPy!NU z3`Q;ln^cmjez;-eBK&62I2lcwK2Y3gts)){M=NyBXa=|TIm#{agWi3)KLjA?0TF7; z%e5b=*a+1?_<$1it01!=h74XYTH2lK7#%@H6(r^;q7=Hos3= zSXdNDkL04P%nYQOi#0_Oh9|9;&&sG$Nh20@kd#S3x?lx@+F#V;Di25;Tw$c5LmnWj zPCJ~g{<-E(^Uk#tyfcWX3j~~mMu6ECf3A_0J9`$iLQ**n)HVItsR5(oeXx#_W0Lma z3b_v@0P=?Va@96QxG#S^MGbcN2=~srrgLdtES2|xKJhFx{!F?Ms0rLC@Pk+c@2u2J zG?pScAT+~#ZWB~0Wdx(@z$2^tnv0};c*K3EWwZK`hI1Xfdv502LMKJqIf#aMK*q)_ zd5*4S&oKD%11nBZFEV(!g>G zTgV3C)U=Z*b0uFqU)I4JfWwbP^Cybl7jPc4{q(*y>wBHu*?by36ty3McS%+KWAHwr z%H%oNzq07S`5*)(rVv!Jx96h4%RbDP;vUxxIiH6dm0IIwJiuGwm$1r0!95ZL87!^- zfl}%HUsz4%na?_s?_Co5oKBr8N>5xh)j{*=DNIzLtg08)!Bu70E zn=iTfdH<3Ee-Lw?Bxv5^#wckZ)k{N_oTz<7N4U1qz7jA4h(ABGhr8f3%O%TB9n}E* z;Wx6g;d?3GRdt=z?~Z78q-Fu(;A;ya5b!Toq~!FfQzidjZC|aQy$$C;S;?$*`QFu~ z3nPS7ZRrd7Z?!EgEs2M!oHt|wD?J7rrAxsNk!~>;IEqjPG5sk#J%KwA)JZ^J5aODC zYPv4pOAWQHO*1xYF5VMv?klLuw#<_A@SM$hrf|vh^1Xl-Krc(+i$s&3sMScN*Fp!Dh4S4Z+jKF(2;3gUC;V$+k|1M z8Gw+iuEaZYT559>yD4-a<7sO$z@%MvEu@6I-_X}3eqiekf>!^>1Fsf^{dweBv z)lqcG34#xtobrV`qF!%eH0Lm2KfnV}zb5*VbzE&XX4}2JKQ#6814~w2i(3GWHEn^g zY#4~{^WrKDs3hBdsxrg#lf3KpV-}$L_za|rV-v%*tt6TP)9hozC&rf;Zp=Rm8j%ES z%*E6?jz~RJvc@q^cG=hw`g%N&0r>bf{rsG01=C zk)g9f?{qkoP2ghbjFxNsxoC%R3k3Jl$##;7<4itM_mm$89*!;PSn>50NV!8`ur?>k z(sj0S*4ODwXTGOLiWX3q zVxv0^tZ;Tllg}DbWTEDmi@nIL*`I5c!_Z@*1~L4=Mi}b)foO#Ga`Jpb85E1F1%h94 zDo~7ahvFQE2>SV+C9xK&)(ayS#w~7#s&g8H{1ag@Reb;E`{bJOz5>B!-3)2`6Vu(t zIQ)2%C7ayaC3pKy3==H3Z=W1h@6kc&RZ{sih!S2FY`!nZ_zg?G%RzT;-~Ksj@oRY= zsGBS@PbTmDa}b+}PoE^nA*v0|@c5C3Ty!buXT)P19GCX$_usuF(y;BMUgOr=ISFvU z0Y8U43Xmr(JN#bZHLMKCSrL1u-113OulGa!lnHh^gV8kJIKtS?t;yPXZ%fM+UKbCf zF~6ZbegUTMc``#;uwXw9H#jC5Qk!0&^|Kma!ou(e>q!p@2Nmt~pz(o63i=Jc`T zw)dw~_S>K`Q-$U-VV#5&eWf?`cBv?sey8hJftmr^DefnpshA{QYH(}m5MPI4zf~c-{ z$Hb|IN>{uEdy4PRHqoQ#;s5Ig4lj!JxCgx0k?xs=dpD&CG7+s&#S*?BUF? z3-v2RJW3=*V$p#!sfw^UY=6AN12dvNpEmaGQ z>F3z`0^W6s;5oit1-k6T6XXQ?yakY=?; zSa`TB5x|kEtDzrpX3x_)$X=(DW{dU0{+8l^eXy%!ekr=ofM#$O$7$*#?+NJ*hx0_s z##_8h)ylnMJBM*p^PVnhR?REEx}m(R48qdsu-v8Hy|~3G7-Gf{QtpAr7vOSvp!c>> z=8p|B-k;X0nVaYKy8Rm4aV5~DGEd05GiN(E{EF6v%^ zBu^KbSvtb_`zriOI-P%UNVI%N&GBo6s(E<)Ejm`}LASt*BzUFQQg#XW==MB(Ama33 zcUEY~L7&4-;R?0=I`0IMivRYtxC|P zZ!RNP%*w6E-tDdnPx@}Pcdgivr<1}Qi}#{*pUbHw?~gZxUr}n)L(GSb;uzZAxV_QC zJBRRb`p|gda?;<`_Cs&Oq64eR68q70VwQ7Jgb{MqD05HKzP&%TFZ`Q72@I@k;64Bm z!AwwwApZQ|C;{r=&xMo2slJwsu#%fj-7^gmK3Lq!m416N;PGp&>sF*fn7D1K_M-zT zDacJpx|H-CLO}p37t9KUdw&ZX?0H(HJCwU9(4w^QNE3s&w{HA`Pd0}<^9cP_f#tXk zr4#_|VmQ;PQrFnsj3EQJ1)l+sFS+s_Eyf#}W|P(R#!=`?(~oti1y&w2 zwDC%f&4Psr2cuxJ7I8#?RjQ!6RGY>}>37RM=1Lur%0z3~i7QJEN#rj`zv=d68azPI zzroancSB}(^42E7;hf@K-%f8%MO^=DbE?y~ZMY={H#T}xS5TsadDV)ewOKpMSD6RL zL_K%v{#d7^#yZe&d#F~!I2;~Ra)_hmJLL2{wKKKJ-1W+n0EDzcPY0nYgJbA+vB)fq zL3z#&Sw`*d6a0R>b+?>wVgY`0c5x}PQ}GxcPDasr02}bS+_(M)-gox6w?%^3bkS}C z-aFJ1bw6$cjFmw(;&(Do9-0^_DOSO@%i#Xlo|}qMWM!n}{WMQ)F_G@cM{LB@h^;N1 z{nk0E?68VB4u~+HJ&q(xgI=lp@s^^jP6)v$+jK0LSan87)^`iY3vf0>j3y~5DWuEpMGN51rr68h z!YgZP0`^RFnKJw+5cuvgacWnZH4B{?Bpo0=Dnd$`Glgg@!BXg$jUH#Qd3gXL zH}R)C-wc5UQYihWpNpa*mhJ(F!Pyufi!Z6wj!+NSu6$!`E5!6~*YrIDEgBr3hwwe+ zmUTko*A}sY(SX_~+=;vA>L1@FuE4fT((@V@jxomWOm|1$KY`Z8%xJ@9#OH34Xzz0A z`%blMfEl8c0G*{z>tP26f$p5so1+ZgNK<$br|RR_Vg5$_v(K`5~{S00zT zSnBwZyd;o`(nI?6C0pf*g93;wJt7FHhkNuaavHQkl&STHwHZb@#YhbvqAMrZ+?ln* zyw6$(n!%FRLu4a`4F( zZ9mQrjzz7o$H2%^REH!Wu4x=2Fjymb3F=+qL_%n{cIVEW87|zm*-JohW~9NZy5JE4 zUBwve7Gr&ln=ZmG2Mv}*aXRcM9D#_*icv_KwXwl1 z7Rg#@89R33)|GP+28)c?4#nP%R}mb&;*!JkASZi6FvEwt9k~-!yOU$Cq+0g{ja#-X z`q9E|D;15ThSBVZcJ!uMNT;E#mwV9H-=B{1Rq7%wA0DdKse)Su3T*0L|EG#@ z@QtrTyQyaAXNu5J!-xshTU0A*th`ahw)69M}LK;}-!2rLM609N+XOuNaG1ArntuNRQOni6#u z9jI0`i#we?yp`*JapZ6X4M{?tA&m3}e|eS|{6H&t82iAwuxi8UyBAt}#B&tTfU$iH z1=@2rZrn)gEdnAi?~IVK=5PeazoHal5i*3Ld-1-99!}_(la~a&grAk1$7ZP)8HTmNc9T@sPJ!` zO`1CIYf^w59@E6nu*n~cOyy=u-Mr1F;)@bHm9ucw2%$qSs(c>S>N66oBQQ04DEA!) zTf3A*xcL=b#TC##A&l%c^#N^zWqeT3)$zQ6aj8y|{2Ml0Y99h=6iCh?u@0_t$k|Nl zI;71(L)W7gTYNhy{|%`|$$yJqtx5Fla_P52JhoD3XhiTDu-^@ko$SEA3%{3zWHN*k zqa>Sa!^wB^>c`~&ZFGpwxgK~42i^6a>j=Byqah3kqSy8M^pIikbz5w0?~u}v)Y~Lr z1CIO!(G|DbMdhv)jR#P+2%JyVTwMg;^Asn0r`C4OcVn+_9bwRL;o80 z`DcV69Ty|D7fv+FtiRy=+HujP`fxg{UoC>RX%GS+WnDz3V6bxg6MIuI(TA{@iF`Ic z@*N8h(nWC~m~=~!SrWj8+JG!osi~J!)^|XyZ3DZKcOHYESqKs#tXTy>Fp9{#zFvRM zN&wYm$HF8pjftUm-q)-Qv7LRvJf4mQo5EmK>!#M8D_73hg!fB8Uh1Q=Y?^X7bI&6G z;Emq008dSJ)}*WXoiG3K)nlh`=dj#qw>o!DIokk1?>Ss|0F~_RH#FRBuA|v!1qrPqU<4e%fbM2<$ra` zYrwV5p4g;N&;poCFmsV2$HE^-k;_##?$jcaC@5<>Reu9g1+&?weN9uysPp$;Pu4eV zSjMlfs~UU#9w^oPb5Qn7Q$Kvk73C&dooX!rgEizy_nsVnQa^;uP5q)F8L3f93vwgC zgE%lnW>VTuX@f>DP^^s7&iZ%Gyf%Nhcc|5MY`yZl@%^&*J=gVl`q8D3IWLDiyep3y z?rC@LS_9zr54aoWz_l=eK?E-pvoOjKAAssM1mti#Q%5z6d(-8LqbmXD53g`FTBrZD z4*)x9jIg~>3t!5sNz(%lFxnmW13R8@737lZipF7Wjduw;3)BPWTwRdL2wjCWCTPK^ z!DJyoX6*nZ2Zxk2g5-b_K@4@KysemUElRIR1CR82PS4>B?99q*RTwc>?%E=?f#r)B z^11V{Z;J)YfuIVS4eGeiwgJrACrO4Xap@pu$YZI;ci3qII$KG;#xy zcmG8p@oM~2Qj{@}Wb{ZU9c<0cAdxvgM^ym0dR5A*sx&AJ&S1YHoR(=Lh&~2P4cgNq zyPhP`o$;|<=zv166h#PWRj?`8MC@0w1*ucmI2@>F0zzs7A?6fHpv6?4o$-FZ= z=AEsEFo~Xv?IJcsaK%}rE^=YvP$7bD2$rL(N2#F$%34p7wx}d{1BW2HAnY6$QM0SZ zETUou!q9k2n4OEyC4V!fbHc}W#@e9(sr2uyFS!ix6v_&CLC}WBB@V3xq7U-0B}fG5 zbD94O=%sn0w}|!Jzf6)FeU(w7wRHI+Sfl_Dm8yl(Un8$v`GPmz@20`U~UeXABR z?ufgHYyX4tIth9ZJd-wKJQG$fz0b78d;`*XesD>w5HpY}qCje!Gu+xp zLWP?eBtJwLgu=*nB||6CgzAGRSuMgVmDh&d0`-H&`FDJRnr`R|*T8fhrxvlv)I5JK zg2I6$6CfaxsW{>yuKqsn8fc%WQs5(n?}5=Dce=S`+a6tSCNYO|3GLITufOXY;?W>Y zxAXzTK{#p4Y*48}&8d5M){29CVEPdv2h^v(QJSvI-dvow6zC?^C()+vdlmOHX*--udXL`C=ljSf8gWEI4!av@t}d^J?j<#OGI|aNIIN}*^J@v&*_L&!65P7mv85mVqU^`o3YYeUXl#%yZpPu7c zC;+3X3y&PsX(&#_DMfW|=#Wq<#bRA3XuNS_OVJ7{HM)WA3}FW8QXqGnD$bw5rk~nE zHD$;(P%5fzzkKOZSWL_XOmg~4I5?2+s*#Z%e85coisra)mnPy=ToKhDg@+?cTEZ;2 z3}p>~s{PJz4pY`dn|DudtN5yyMH_GzIN(W71cy(6qa_d`99dPKnrQ3rm7TZb%?y@oUhbj@-|Mh5x4FvC+c5ZGG!k^svkR7 zrfSTN&2`V73-2uJ{##zFKx64CrWW6qtONs%L)K|07wIWU}8w&QR|QQ;}hWwa_qys3a}rvP%>TI0FS zwYt>@AK!|Pmv2_Xa1qa)@$ASd&j8tKd+@E|t2$Pq8N$oG(;QRK2TH_S>f#0gGL@Y{xnPA1ZalA(yeu&Y z6KBqCjcs2B+*mK{x%1AQL)t_k?zaWc21o=@4Ffj?=^ajW;Gy8L!_5$KAeF-HLEv(D z0Oe?L%|R9isR>Edn53-$z=o;)YqLVHJZ&%AizX{91yJQEH$UC=S<8rjwpWl+>Mxa9 zd{oraa0%vI%p3+y8irtx4eA4O!^z2BXVh~aK3vuzI&V50O1Y%V7;|sb`UfT^B=mpf z6BZ75b8=j)!^OCdYvG)(Rok-n>1G|>u62q(se-ddr=6Nk`Cy31SHBad-^iy!vvM^Y%ftP-PeUt}{19VI%lI=E;Gdj&L%@ zKB4IcQg39NP2ftUPp-$MoiAO{lc%IfM<@R$Kp zAK-}l9P&?rlp(8ozAQVKGruM5EWS9Y!R4eGM*5#Wcb#mt--B<*6kD4yuiCZPP6fJN zounGXTvMbwI5y*NMlEX;ye|ZE&SP%s{Y>^Czc1K@z(MR_MqJku_~zhcV>d;M3OKc9 zjSIHDTGZB#+p&gda`fgV-k|r#ck*li?f|>CcYYggx#%Ib=9B3mBKH}S`Nui@ zBq|wUr)M&be`IwFQY!Pj&pz&8^RN823&wH*+WLAsVr@*#9Thh2UDzyn*RY#k#_eUS z#7z+aMi?7wbCc>V&StS$?Bl)p4^GMn*DtJ{-D0(416Y;J&9acmH_|WJoOb1{-^euM zPH&mfX~v3MS+ccT6ayB~U$wp3X>(G!tgm-T8DqViRu?cW{+{P`=Ej zat2RlS9D{Sk@l~$FvZ>8tBV@0?;J5K8+*E>E%L{sxm!o{%53yDuAVfCD8HsZTV_bC zO+)JY*~K;rclpG;+HKl25_84ZW*t#zud{BF{9dL4V#-+}6!G)XNvE%0bw{Ifk>x#l z_)A+YvbokAOF7c1yv^s1$sS{mpm#RA(vF>3SovzmY3R1+%8hA$3jcWLMd_$DFgTLz zV~-83e9hw;sS_)+@V(My-D$J2sJnJPAKndB=3U1rVk*CYNyZ8l6-r}?GlZsa;yw4N zjBdD0Qw*H`F3qVM(a+m%W)=*hihhnb?&~yD3DBj=T-R9H=t0Yk(9!P5k@K!Qu+*pK z@B1ZF7ZD!bj9M_G8TO#tQl^2h+Ds1U!EzVqECA`MsqO1mnboVWHjos6qlo$06!~6w z+gGAp0G+8yA=Y~A)DH&!{lNnWSq6BBsx3qBbesMZ!CCHXE#cyT^QcW|9xRq@i5iAe!ZMV^CcHC zjk{(}(ahsIl+Z1U$=V=p`dwyl7yI8O1u#0fr~datJi$|AUDdn|695{1=(tx*-Kz@S zYq<2^>zy{juwlDJtAaR7QHYMCKG-E>1u7${7xAhGgU>4q--9ar%iphg0d zag)Yh%5l)v$L{y{vexife8%LXiqPeVX-AQkZ0y~;!KU;Vigf$pE&tsdf1fYLBLvw;U z_8IU-fOjYg+Wvj0C+H_jB!q>Cff)>(U%??E136W0FfVXcw^X^04m~0(zsH>owhIR1 zh`cyh803J&G+O)Lvot5|nOI2TfdcBg)!5j(V?9vfOGe7GJMLq}uam@Nh?DIFDC1Xi zIC7Hm=8GGo-2c-5tClW>)fCJ#o6teVt8zK=Efmel7#~Pa;Iws`to{=v%;P-jVFAw) z1o(v~U9=!5CwKq9YdSEKXprbF03@e*9J7$p?B3iTZ&^}iV*~mp`HLt%3{FU9W?_cOu$zX$qD2zT=5+tksWb(N+>B1tK}d08 zv7YU+KszA>iOme^X8byWt86r?D?jq@n1O^M;Ag zKJ$T>1eLj1+8iLM_$96mBP{sSv8ILrX&T_fTvgdO^|RF86B(UGbIqJ(%a%duKpj4p z_zdv=vvVie8+ERNx*oscik6@p0USNI_874$K{2_cKyN|8gO(=$TH@#+wap7eYj5z* zsN)1tBFL@*UfO)(q4N#Xsj(*p(<0MJmMYOrPPy^%r&VVyK;sYQTon2Nvn@%$Lh~@3 zjF()i;E+^^ZixXPVg2m9l{g#f&PRQM9k}%wVK3ETx&u58%Ue z1`Tn%Msk{la~@$oWBw3eRFS6N-&EVidpG~PRQB@@+|5~@Rekf~)`IRwm0bS5@88dq zwDiwWK7-lVb1WBSlYOeSz3AIwWMriOVje1@h^F|meuGCx_V|oKP~rx_GZF(%!pR`| z47gnQR}B}aYYAxOj&96IQm?S$-#6dFy0K_5_?6(J)jMP~^;?(DE;?h8zh+9r8~QSn zRq`A-Rx^OwOCd@J6eICdZP>&6S<0^uoz7Hedzm>E-~IaCa7$tiPKC-l)5Fz&Y|x*; zLBb1*AV%d>#7-&?1_P)&)MSi5Ybp`0BkPQsyrT84_7T}vc64x?tumV(GN@WvX$#l& z8Lhs{tYc5}HCeCQg*6J9>8n0uRzSvw?>`vSd6V(r)d4cJ{&jw64z&ERp(?(~O^-8S zkX0bafIoWgwU?~}&~udcjm3O5UG;N7b8Slfq~LqEmnZ8Di^PQkJo$tkuxvXSdNrcp z=3P~&|B(l=<%>PoYnrwcXb&ispFyWsZ_}{S>4)Z1p7zYrlerj7tC4;GT&Nov;Tq@1 zLVdOnyX9H~F0See1y3F;Yl4uEo|k27K2|>-Waxh$Fy&-7S>5(FS7l4v+B1&Lm2>hJ z??mgsdhc*Yd+#R6Sf?^h^;eP)(l@1De%a8|!BO|>pAXCa?M*T4;BRVbG{q2NUdcwf zWbG#M7I27J{S(%vIioxoE*5EQ#x|qhlq%Pz_W36dW{iK(yz!_(^5w`C=d{@Ru_*IP zitRhviu_b=E^PN!+#3FE&b?d}<<4C^P6>UX2kg}`;j(qIjFo#V*u`(xFSztmDPnxI z?1g4SPyEnR49vKhxA5C(TSJ~KX;rG9`6F-jEr}z0v@b1)I6ZBI=Txu$;MZfZ`-QQU zP{G{|hJ_{KrgP`Sj0HM*S6x@KE9S31Rik>z-y&^)inZx5yLqp--ukA=U2{E^wwfqk zZc#De9saEs+p5^M^w8LLpY^}2+Op?fGUXSp3d6}2IP;KgDYOjeHG^yli9Zr5{4b^o zwN$L@8GIY^giY3ar^gl7!wJ#sovS}yFj!i>euu}-UIx4R#)Xl*Pqvx%$|#()(mU!R z)p>bLUoU!4Ur)_ck3+pvRx($ibhg5ch!3)5Y_d(UD*sfk^?#CUR8g(IR(+J}#lQ3x zE=WF!ycF>OGOzz>CUP71j_ijXYEME>%oEGVr{QHsA3X`>Q`wZ|9r+@$UciX|0xSRa zn7iMN&iNj)cu-$z8uR4bvsYS$lh4wZoAn=+NzfRR+QRE7o{vqXuSB&t;6%U`$Kbii zsw|VSiA(q^P6cFZCYP2ZYBb3u|A^>*)BB;dY;X0$E5|j(J9eK}*<@a7)cwO+R!Mkx z4X4C=ZB+BHd*e6c5vK!%u&ii!J{>tudWp8syU+K98>3K&J5^S5U)aEZv3kfcs*Yk4RYTA6sr3Mw%9>(fwSh#~MXCK|5WRG=Y zYovgj?&^E;$$gvVU(U^6Asz}>L=+JSv%nu<5rAHLb}B3-GdjKFt7bhJhlu;E)S)@D z(e;;pW<{<&Q`+iZb9lHe#@Te|XU?%J{81v=M&nIomq+}?+1JIjIT|l`fy30=MeLsq zzYKGAN)nEm-5r@2ns>A$q368w?gOi?PZWpcNAM?Z;EfZ8FP4Ak4^r8 zD^*oT+&IoaP=j8Lrj_3Ai!~vX7#P$?WFBFfG?tQ6;@-37!JYnH=C($HZ5|r$_wFv3 zQDuNe0BuTGr$u?mt(e!Wf-Z^qNn^!NPau1IlYh}Z&4Vf2NFl zmxtutNhd&p+#;MO#Y9eyoP^}&;)vCcyfQVj_?y-hx309QqkXoWQ-6<%rdfP?OpNEk zx_5bNJrDayy!AvKL^v;1QFxXUpB6A?!r!1+xv9s$h_zv^l9pC}-3)D}bH^*CFaodO z7xHSZjdTia#T$7v6AJY{)!br&Rej4c1)m*Q9w2cRY+9Mci}?}wuXPMI)YmhDTo3S4 zeP$`zQo@(Sav9tJ_dYZOT(OWV!z8#41`XHWd}y7BNSGN8fdtebm~+QQ{Vey18DXsY$QkY`#Fh zal?Gm2!$N|RaZ9wZTo)z+$^UdRYgUV@&UG{o7Qge4e{#Ziy zja?>+5o}%7EvJWKoJChSc5K2I$w$AJjCx;l8%Q$mwurSGjrq4^=VT;2xj27VOMYej z6_1DkZ{yh)3_|N?UE({$r&dhZH9@HF-^b?XO98CjfR1qpilHd#I5`~9H_r-~3bm$# ztrelD+nH*if}fHx*RGYFM$i+-LXLcZO;NyeJ6fA~G^ej0|5fl|BM!I0RT^-Y@_GC6 zr4G!_2>e7_XOjHfx%1=TcNICDZ9f;fMWl4`==03?5;RXtia0G<3EkD|^Gu*^9tAgd zRYB8`ApeW3IbU@`tyotE!z6Z)ztel;cvy=D07^KZxNC@c^Qkd(xc$)xqo6PjiW$h1 z{&v8Fa}StKd0I-*X~=Txv-k>`Ern}624^WUk>=Rskia7L()r0?e`UD%9 z#=jI1#-*XMp32bg>QakHnn=7}IKEsw6gqaY74y>iIMOmM<=7~-twg&Sxf{uepjSct zzzKaBK&fv*ddw6Y;f4Tp1GpN)H*xF`$^m<|R~tm8w^@+NTa>~T758c;#UKqNR%?_{Q`Q9LLq#lfL z=^0D!OZ?@LXQh>PDP_ID2f58WOX)s?U)~gwv+i%HP47&j&jo@%vv1uhO0|_c zG^zFRgq2mJllsp&8Z3ar!%KKOWjVx6ZsyStFr=Zds$aOxqr*8{VUmYtV$nJ>Lo-ih zBs_X#(pamGide3m2GXt6!u`KT2dLDC2H@^(r3{oI^rrmTa-~e%;CaTPKdcT8t0twsSrkPan`@PlbLJZ#T$z`{_um=?ar*qd< z!(hnC@r0m_X-+CO=kPiIA8B76j%B;{`)Jf4Qc1>W9uS2R4N|12RAj285}6}&G@(ox zQ)rN+%reiBAwmf$Q>J7Np+ffWRO{PoAIIK*?RC7z_r330Z_jf-_kG>hb)LWTH)Mx^ z5<}|5;&zr<)2D`f_!XkY^;>BQ3;Epj&aH8d(>-B=2D zB}kEmB%9p}M6sOZ4@#;?g_Oru=>AP~gSroqhtrWiCIW*|zNcKXMiIN!s@e3L!)e}Q zztVQDcm0kOhmP<$P>f{%^bsX0BI3fXZc%o!(Eo2GS@-3ihZptQ+_N?LFZEZQLeE8? zh*R+BFTN^|L>e;GMwdt!Tviq@!0=S)ipUk1e7{fqDp4csffRHZT}P?`Fo0D0=Bl^Y zJMf5oG?hKL#OK0-^5pCVmHux)qG*;9I!LYSNr&O%AlU9%&_TwP5IKN7yZ|hie7qfS zm7f)*JUuIC=bf?Qi7b&+xTTK61N}8p#BO8Zfm=wolXB&rccQE!)=(xdjdsd0uFo1Dh8um%i zGBN$ry7Q0ju9UJBpFrL)h5z&ziwKm3aM}L236mXi$=&F8w0On2AZaa(4x2IXKl!)_ zybmnwTUatU`WOu2PX+~T7)@A-LDEmrTs5!QYp!f?00#wQ-IbA-4{vE2r|rcO1@m_G z>V1GcZxa_9l#zYou<>1r{lfeAXMz6QtIXAx|C14Lb^0_Xa=2%cb;XWG{CDD4ov(Nx z#Bc>5q6q+W#7-Oj-6V&k_$b*w=#MYm(1_-Hmrmw2AQVy39_;w#@N*zE@FOqe*WIF= zKfX>@^23c(5cx#1d^@Use9SyJVFFJ2G$+jN+yMXXbH__WFCE$69@(gwd=SEjQy}f( z7r^3~OfKtT*xUj`^N!T(k?xt#KnT?tkTQj%SlNmGoj9du!53MC_{ph zLR|4j)q3hu4#9rmf|^4uPOlbl$R88QYs$0P^otXiYDDrPmJL#XfGTOw|fjn<-yt52qj zoC49D6B*nymV;l%Rlw!B5yl!zP?^G1Vh>Rnko|^Lmof1c0wY1y*ps{?RxEcf?QJV- zH@}4!+%W7?93$P%%fvAGh8J>=d^hc@9gl!WnypTtPF2e~+ijJi4D zpJkarRkj%};t*=6ZU@cvIzk;}MmW(};xE(`C)>pjWkerB|^3RBe+~U zbM>Ql`!y71O$_Pj}Sv4=M8iYMLUWuLVhp1bc!6|BLyf`300n(8Ml8=hc_m zx_|-?K{-@Nj9gN+i?_q$M(djg0U~{BvpAwVec%iO)=A4D$KQ((6gQP*0M0B{!gLKU z?{5f;C{mJaAQwr>O3R04=PIJ0rb1B8oH;XIf^uFLG7en0_F{tr*S$5O1NuLZN-1^} zMJ0*{Q>b$2&~sV9n}=v86e_d7$c|EE+Ayj-nx`l z`eIOef!J=~k0W^^9Ah~!M-WsIO{Y6W>j*IgZI+*O9MK`eDfn29$4;Jx>b+8j5A5H+ zta$z2veUnFFhsCi18-;?oa8snq*ZHGpJ64kW8%kAVpCeTdCOytO9r*j+n#}$yMxrW zPY-Xf!I-o_@1etLatvn!dkDvMYeK1TK9=Ov2?A%M+3iQnVeL&qPxuRs&Xu$m!i|Hv zu98u+(Zc(46aRv-VlZi}!8E4y`|E{PiEx@(zhPM_?zKGlxVC=(w~D@YlcLfpAP4tI)O)b-yNf1x#^{dqk+`v zigs+x$B(U`)ecUirWk&@20027fU-dFp~-HYP)jh5mjExTjqG2bZ-UomzDef5EV2_v zzd@rsc;GIJwSWP(UiAk;XtTZLG-fZ54lmfW^C zpMOiAIPrT$_%|Dn>fU45DR5hArCEMf44HjKP6kUJDBz8AacKMhR$IQ8m##R@#$sGK zSTg20oHN?w$ZwFug)+d`r2!Ke+B@T~O#F6YD*8R#P5$>RXT|k76%kX7x|o!uyOO&4VnncWY@s} z*Rs_D<8yb>Fn-sYcE5@4E6{rmeupe6wgNew15fxT6sQh_APlv~M&s;X=Sg1cR$g8n z=lIMd%Zq=fFob~{(YChhfM}$nM)_5ytO=MWz`-Xr?&W!YhUkaD8)3bQrtLw2Lwj_>ei}W#ixf?Hily4auCF+eOA~ zF)W&1?t;+}?(~Bj8TFSXO>Rng$cBi>hAePUUwY#=Z>7BjOvZ_{O}PxXumbFQE1{}K z66>4cqbtL0ww9W&9Xg)con?CE=%JyrE5psKCav5GS|rCoJzpfN6=>z3pMyj>8;=bj zHTN`RsA++TNl^sQx104QeVo;kpCvN z$)o3U)R`w8US%JQC8{rj4eH9y_#W&H&}@O6`m4Gf&$a~{hvogEru{S17Iamh}7#5G6LII_23;28uj)=WpoeFq7!l1ronCDbPuxS7==@yXs$yDO75jPFZZ_Wd^}@yOy1e_&b1o5DJ6%w4Z@{!^ z2}f%x#S@i+wrKkfja_fbI&b7FVU(Wv0253lW8*%Drn-#aOHCd1b@dk&l!WvWtA0O9 zeu_9nstT#x{L%gK&{S}+pt$&Pl(pgU4`UPWf5FXfK~R|6_mL3}%w35?uPUi(u)}V> zG=9)vxv-4iD!ip&k?(IBOti)}$JxwjbbzpwE3X0?ch@5W1 zN~~;#{GL)nli*~9B^juol+bozWVxyls_o{!K4JX%v!dB6<}A<;Lc-Zn;5VU}nOY>o zKsTnHnwEA8={+a-tgz}3^B1Rc{mmAdAu?QXfCbKUOy}DwJjeNY8Unb_TnsX| z_+_MDa^>R1I`gx<+tRhSB=QAYZoF`TudwtX+=s6G`K3o8Ifw(>3*&!u4#(VHx4pGA z?$7S|cDcRStm47B1gjuJkI6BZcHhXz$fz!9Mm4w5a}D&UOXl8`C3$h~}VSaWC2juRbzkc1?;qcoPjN#-GdlBvQm88F`udfH8H~2)heHung z7Ljj*f>*%ll);9c+4N_MXJ5ZZh?k+h$6z*Fa%pinvcjbtYuB%kIOni!aFQa)+S|oE z_dY*%8{VEoxd(yIkgxw{Tz0v}iwD(Jz4FWgl-D5&#NgLUoC_yUp3M93;V78f_uMa< z927D;nUZqwL%pp#Tg_-B+Pg^BWhS?5gSM2T?<)Xt{01Z@&~8AW3e$WbaU6&vaKm=n z0&9ZB3@W>Y0-kIemX@!1lJskS zF;5boNk!wEs?p&75@>B~Y()M3@9?On2qo=^=%s|8DJgc&l?nP|cp&@su&z&e@P#sBS7v5q70~MDsH_s} zdHx-1(`{}AtWAuELrr(@zWRM&U?EnppUeKGw=D#(poU5%Da}U<;4v7*ppeWAqzV%YK((eX~Atz;b)6eWP~c;s%xINYfW4Q0XOYw z9QhQ^-HCp3NjoXn#x?`gc0C3?0V z@4Ox*Q`jTjpYMnw^`OSvt(#Zt#ayx*Jtv6q;fkkTk{`Ter+68HIVt%_Zr3g+>IvM+FM^6MxP1Ap z`FzqRkmJ0UbG|c22!GQ2=N~ zi4y$sr2)w$^*M-4+E`K_t*vHcd@aAxM*OMg*B&WFyB8nk>NuS8KZ&v|r+U_br~})q zKHX%aSn<5FG9}2&)!io{;+@A>eM=I`7eB?PD4J8H-~R7~IDwvGYPryp`&RkXEm|t{ z+_hH7jPe>98rr4_Ch=gmMl=K)z=|nPd;q=SexAL?oe5C`F*XeX<>YB;|v!YCOh~Q zO>;t)N8krt^RH4?ZGo-Dm#eE}ZT6I&t&sSnF*%BMzPZ2Ogx$p4JmEx=fqy}&3hRQ4 zkVhO8UMscXiUH`UQlgi8PN3%x;|Owjb(#%q*_Kzc`7PcE#TVP`^W@PV7JQNhjMz;q z<;j@cfz?~@Yc?*;8xTu)(lJt_V5%^A$j*4%>W0vgpY@U!-wro-cV86O(ZBLP3+ZUe zL-0dx;U)sD(ia|5o6Xlh2>L}IlD~Ts$mu5 z#CQ%VxlW&c^gjzHDSEp~a^mr?Cjm+Ay_b>H{i1BY=~l7W@T&L0+Vc8`EHwn8`Xk~0 zvk1)u8{;+Hd!ovNEZ21iWw6NtDpdc$i3(p^ldH(z=Mz684vDLF3FL&3Jow2vmy%<>&qwR(v66KSC zM6(O2lO$fFZ0y0UW$MZ|W#1c^Nrb^$hjQ968d=EBE?ATewxxH`GGCnRY zgW;=wg++Fn8ZRH5i^UnxkF)OZ+QqBm6wuXhaY>RA8twEYjq8X zNdfwM&;GKN6^fhL;}a7~&UV(;#pfyu6ANt(l|NNxz7-0Q_qZDyU2{BWb8L9uP!bTo`BJRh8#*(6}HrEPrTpU|{#@)5|diL{TJ^Eg~e8#M#tXtKplG zu^q!cA?L_y12-LGV`J-{_@eJXU-m?+lFbd9ETIF|&|5JQJ=zo3lsn@!Xog1-wP_@} zL23cBK-~Ei4~&kB7fRIlQis=Bd^gi+(Z`KN{Hj zKNXx_kYU;67~1}Ye0-kxK32?=C~56B`C}okK($C@-MV;NEni^^H2u*^JawJ>61oUo z!ukB+%n&mROF@HG(^N1PKr|rH#-a}&dZAecczNGm?c_=0Vacflm++w4Zy2g#7hq%AWIBzC)9zP?@4y6l*@eWtBs$ImO)|>599mmMTZ!SKY&HZP;qReHy_oU zp_u2(7=ce2#+n8WhsP3uuaGqX*LEuYfv{Bvw9DA;fId`>4U4{`lp(fWN?F1~HF ztn&M}?!q41Y<-b5qACAX_kTJEz7b>J=wU~^Q?JMf44GN2v5pfP$gTo`Qb8XgV`7rm zei(-knl>(AYA|8$tor%J4D)zvaQ`*|wfoW6z#R*e*{z&rSTy>$11J`zc_q=Wo;#%B zpW}diLuktmCyC^34^GCWaDM&vr|<2Mx2T@qC|aMi2K5fF@TgccV67C{3#*&&KnB!# z<)3{ZM@3rNcrr!}ZWVL{#aQdv8OqUDh=UNi~z{le;f}OeRW( z2W*Y4(+t;FmI+_?xh^d$spiS%u8n2dvn~c}uhIWzC*RTjR_cDdr^Yj*w^$ag7y#pPvv~kb*G2xXL~BNSfF{Ku!4-(`Lx9SwS&D*fSl)PB*0FbA|9qF0 z*wxv5xoGY1>z9v;B`i0jYJ{-bn?XTA*54kxyvF`;_Tn*vSwmwByM}GyExD2`iNNqx zX4*y088}pYo3QCjbz=B#H~4I*B1z?lii#lF9#H)<_$3tl*!PiYB6t+*;F%)`U{}uA zI0lYw*~qJ2surW=U6gd$q#U@|`=128M>xOqGy&fMp z^v5)^Y?A_(YEJc!p0Q1 z<3##XuR}`ryt2j;p49oTD3Y-Yc++TX3mC5Xd)< z;y^aC`Zg*&(X+*DIHHBFj1S1$Xz3Lk8i_<|E}ACqZ%sKl--m~nV8~=tnU?UJhJeoV zmkBalv1o5&R^p1N#N^N8&wn9+=R~G;JiccUS!`iyz>a!~ZV|`>ZWxnLEG`wkG>83V zg}!8j=Wf*BUfQeG^FbZ2%v3LJ=`cs&HGaB?w6rvJv<1-r;xJ4C5WWcD!x?N=f>Kf% zu+b|v*obBySmo`Bu~A9u%#@_5HrsEQN}hPz;jURlX;{aA-6|aae0UtF(UNIwaxXk> zm{WkqZkGIksyaiD&6s%MqI5+6fZhl4aucpg`-_?4K?3%jbu8rP7eP#+2y8(OhepXSfRIeg={Nu=2qFxN4rz|rO9XDDUYSUzR{a|q zF%+(pVl|bU3|UbyCc6+3ln4gU)|Imp{E$?bpUMGpp@tY#6?UMIRHWW1dbn9n+4sz5 zy$u`}^O?x)LR?BINka&k;yYc7ixrwXI>>}z@8!$M8V@hw3KvIwSqzTZbj zmujb5EKF&%jr<8q0wKN=7b?vA>QX8U>PIeon`}`CuEDIBqI%zF*;%1WUqu~*CkG4T^M-bSU3mS_7f>-5`RD35;>Z*xNPiaz%i z{wvt#rB;OppbYLQ^)yr);Tz>q4=+sKuNS4eU$-vcELuJQT}U`D)8Buyn?|Z+e~K=L zZUfn79c$oZW|KIK5h*_{vJ(4r?9A>XS%IT zy07_d?p9Y)=f|{Sb$7}phR1)n0G24tIa;;SE#91&Kux`UvG2fi2bdc`N7V&UBM z=vC9!$j0-LBj705`5qk#M1V=tRsFpmd8tPdV8*iH}bFMVpFHJKtX1%`QqyZgC z)qYa{f2MxdygWe5 z$d2XB`@bhqIM_O5Ogqr?vf?%dH(&^C*>VgM;3k7#Ww-r}WoxZ`6G8u&i5fB=ZkPOk zH;KN58FxN0UvQxBc;pQZltu$wA+ABca9=w3U45KRzUjnoORbE{(MwjWxP-cg92l~H zedQ+O226}FiOXMfNct)?6mP!{9o5j(*5)8D#mff??o#qjk!NBvYfn+3aKZ|aKy;$FyvK3JV|8pfE1BJvNA&X zM&m-@7~j8t&jqeI#n}mwS_0(_{+l?fgvcIcQw6H@;2%hv%1=}=2#8ySLP-~WE76b0 z)d>4`$!NtIl=%khP;c#nWjdct+rpsMO|P1{Fl|MCNFH3@2C#fuu=c+H`0*N50?k1Y zH_4J^J8W(l=z;7Na__}THwE_r4c=_bOPS}-mjez*Mz8piGw&Yl<`g@taGiD2YQc|O z($<@Bcwc)UV>gYl&zT zd2ro?y}1sq<}C*ZX-8g0oyy_E{FbJ~&SZZ|Es`nD*jc5V2Tc>Dk+q9MviZxa>u}oJ z2j(Y+>t8xMZvnknhUy?6=foYjF5!JwbE(^iy6`7LX34pNs>YwlnlKyxX$C466C>TK z-xDaze6B6b0I>D|CVC%xYA38QQ@5H6(hVVD5?SKz9REI@U?B{R*(oN)@&YCUa=o6& zKr}WM21~~D&$tatUy3cmPzy13p`~a1rKI7r1ruoanX5d)IsQX6b9+OK%grERfOPKIYSz?rjT;KPEiD7MLw_?kd#hBfEYsg3$ zzwPdh$nnLq=5xN&XWvVYPp--qROCD0nPG=Q_Yzp84Pu_zufcODdl^n%UaV-(ukXG- z>t2Hn7w=U|*K9Rhw|>2kX38?P2eDdd)2_c_ps~W%*RZl#6x#_#Q>=Ik zuK~Q=khhxd7h9DR3ZhJe8Y7RbXGq$zq8Y0*Fwxi{nU@5wvEc9MPS*>c%67+5|Hj`Je~zq0 zTF1u5$i@$s{|z6GD_OW`(RGxglB>L=A|&yjUL49!iccY?lBKlfxpT1*-@srW z9HEl^?$iO#I+~rGZO%Fn5wRAx=@AC{=7QKo`3PyAcQ@+I=abi-2tZ`7d>IJek(k5- z{yUxr?KEv=T8#ok9>0+0cfYcJY!ei`HmZR*xX{b{pM7Y?Q!vlV`ze^ZIKX+@h?w95otaz1qHBxloVG( zx@D^nCwpO zd4$j%b^(^-0d##8g&2{x%efAeZe4h0hcw{uy$2NOxwJ_ED=|;|{PWz&uM&JGRaMW6 zu{<9)I@y?9vv!@dbmmLR6Wu4~coveG3a(k%Nnv#P<{azO*+=%PZ)y#b$DP@KCJdW? zPv0SY90!4ED$fs=aN%5EJ@sH|1Xpid3^W5j$XByY!DADaiIUH<-b8NEBpoo);6DU$ zDNJ-_VNDcsDn~dctOBL?;DOkWK?m~z`%%zlB(`t!f{j2$4f5n{+44&t)U|TFJ~jt_7HYI(edeX6wgZ4qYWMhcD*5%}k+8(X zD#1>jVCMMa%M!yM&u~Q>2viZ(eSux4T|hK(m8B%HabnDfmK%S8wEPH@-7CkB9orSH z`Xnmq;Gc`*V6mhGhGU+$KkeB1mzO&$3&M1~%*0k~+~}TSXJm8Gbc-5p2S$a&#KO~e zQ#Ar|ByVOGkEPfwoa<3@PbFFT^Y{F`yn_k0h1-=(O*bJV>fReHB!h5#x9_y*AETh! zpq=LEu<%zrH+;gmKEvbdjk4S~JpCHoy7KDPtE!8Z zt8CNw&BMvb?C9u7`LlQq=n4Ns=j7}J@~dfMM4OhSF*;EaWL?+-VlXV>u;d`6Hf z1e=)BYbp-qsrGBLVxyuGr5twd-03z;Y$Q7{;=;?oFBgoEZ<+q z*VED)aa`c25k6rn_~QBVc#T)$G4)(IYLV5eg+>!KqRUD|7?`FD01uvfbK0Lje^5^0 ziTU~R18ZYuW_H3)!slV)&~AqDJpJwAwfKvThi5*1{OYZEq7nI^KwndSwg*O4Q0swL zi8(*KKH9O-?VSlkWIPRzmG97#_m4tD^V+Of<}fqgDb-T($x~%L)%nsw=GgDIdW$YA zpbnZ{soYpQllx*5mcxmVaI=;bYu7R}F)^9Di9b)^;N-0RvZ-+z9Ov(czIZVg27Zus zAp8S&cu-G2a6qqBr%?M=ncd!Ll6@uyhbo&?S1?v@aFya8QcOMeK45)wjRrd=Dkb~b zLzHJntIkW(U z{fBp}&f$Tly?2pm=X<`}wQ8%J;#q~J_|X~SPIEjxm2KC0npNgYFFRw;wBMk8wL`#y z3&{%FzdSZaRO&tV530JR)MeR%wl8ONc-WuS0A~Z9)P;hiJ#um$qMY;1U#WJ93M}y~ zMHCF|T;ZyPmn?AQs<#y)5VRk z%;vm!?rLH7JQkLlUS5ah#qJhdwut8}|GG{A?M$)0&m!8HKE~5e+lwBsz2oI4lsvp? zzpjed%C&2Y!wT*vy{5eaFta_=+oB@*@;|?S{@nHWaBf|lX3PzAVgpyB<*FVl+*EzO z$`gJ(=zD<39X@(=h1KjBoHZbOYkg1hkHAuZJS4zTO;fY(%lK2(*D7L~ii&}wY<}#E zYMl4?+jMgX3U&kCr9TbpRot9kCxm&2aIYZx!=i<1h!rU_5O}4nxoxon2~Mzp2;k4u zk39ZN=B=F(#Kp87^AEO`i5%XDaV@^IspkMjAKKdDSga&lr=+t>^QEAlce;;H%_Ha#6*CQ`DW z^|l}TYLdD{L~Kf1s~0^CZ_i^K&( zJ&S%OFDXA5!}(C;sq-OEtsc=e{zX@tN=7|ce9N_KoYgmENJ<=hu~{KZifQ2yz4Is4 zM6*M@EsXDU?M`;yzu(HvW!ajQTwFDaRUArw+InqytG<60D=VvS-4S;0hQKe6JolzA zUwb?>tmIy#h%nb?V~5q}zIbfdSNSF`UhY;>CnJ1`%us(=o5ySGbjCs3)IhZwR}D8a zfyGXHQ#4xh;u9Y#zMU6cm{l0oALhWnDJw!y>El*W0p0^qOWZx4wMGOSOyC+l?d!7$ zPpkK;MWckUUft%mKZEOobyV&>+16owsnCNd>{6Osdfd$1upZVeTFR0+KUal}twP;1 zXxAz={het;u7-J`^m*OFA%W0BaSOxv%iJHGeP(RPPiSzY&vo56G={;Dubb61{Vy;tLE-2@{x8B}t zG>A9)^D}1+uIT|w$K6H5Bvk*13g-u%I%^p5-q|KC`mvk4&~eENuF-mlwJ*50RB3!t zH96ASc1Lum@T5<8KvS9TuCnGR^GDIc-~SE=;y!~6mk*0Sjwo4(c4m} z-u?$tC8&eJW;rjOYJPsjIz5c})Kkt~>@u=3td=ocmBFQ`@##fV;Hl!fwJ$WqkL`Tv z&qz$><9;!Fz;m9QoEUzDYjGtA#NP0}1LnT_`LUKaYaSAqY?Fby1OJ%~jRgylP)y+y z+gvJ=)3*67?tZY|@u3gHXx*A=$OH8xwMGx@2lrDp6O)TML?Hz)dKi*OY4L1AvxlkmXWanEP5Ix0|dfpcTN98 zxDLPz7(qLojJ2|K#W%{y3B`b(PH8_-f5d?sOi8bQKW8p|j`vZ8EJ;tEZP%d6(}m`W zbF1lcBy6~#9a3|Vrw^zSM8mNO3_GG&z;SpV41pu};C6Ry3H$* zV_Zp=p+HHeL&puWKZb>LDRN~#At4?>fboITc24|Q1VpH>>kgip6fZ5(h`q!3BecxW zkUy~PT1Uw|05N8hQu*%Pj(^LHCmBdLCN@lHGz)QC-l1zybD^KQ4*QgxTy!W(W!O6A z!`mhf&@l1#0ZK^1HIlTr|L)7#yR=v#d?A$oJ20!frlzL9cUEKS2}RCjX5IxfQ21n~ zD=3|uvswAb-4sG{({Jwt{_`mx$PEXCaUiTyNi|;p{Qdn&;#2S4D!|R;5(!*f2O|Kq zOs^4dMu-`huKzw{<)W!23u!JmXse*CZtg2TupU1srtqaGtw)@s_}V+Tc`|k*xfKOF~8Y_ zdC1zub7|hR2Oxv?)K#db+)jxggy9J~Us@kPXa=x}oWb41Kxiqg4*-k*9!jqkuuihF zMcni__M?Lo2AyO!wKOsoadNt1Kn}!q4&msa3~n<0vWwn#nz2Ua)2h#%ck2kVm)$ZtVIS zG#U?iEB1)|hLF4a@smC;dXRR@HDZsCtqJ18M1XWNL+ay!kv=^s?DzlnXDx-;kGjYr zgctctQry5MJauZ38BCLWHFg<0;~K&j@yWVC9uBYfC!g|oWY=NN_wNZuN5BvO23D^z zvUY)dPp8Ch-QW9q|NN4v-RSv0@8?`h6j%giU^eK5;}7^`RrO=KsYm8*fQ*P#TR<^! zm*7eNYU-vQ`7pJEgd9bCNaCE#fkJLn?S-Jc$00m{P{;p#0>sY$w{>dp;JE!PEOkpo z1eTN1H%2S%8m7HpB4e{<0eRD2fNM|vyRVvu;_tse(XiLZNC^JR6;o%`?5X8pX@I_$ zy!>Ev1rCrq=F$Y6!{CAhQvcT2`I7STLd+xZqpm)@^81#|WvnkLHrjezr!ZN>GpsrE z;5BGI6cR{I0ivP{F*pAAIPRbRf34AAS9;$BR{#p56$uPI4uce63Ut78ik_K)GXsU3 zHm@Mv(NE3L-7JN!(;X@huwIs+HU9fdg59S+hdZp18!3OUFh>wYVA*`0t!#L6_Q2BM z?=KPLrWGm;%?m}(k*p2vN7~<&!9+`Rp*W4YaX9AU{WgWZx~22k!+l^^!_jvE{E`12 z4pRPqo5~Xt$b2K~;P7y=*M{STOU8B)2Yig>G3io3{-2(kG-dxpG9SJ2ps}^yTzYaB zhIAApi`Mw>CQ!95bGSw`P{N1{*waDh?qORvwX<$ejmo75LQ8k8Ebftkkg+UtbJucu z4OSrb978h-NZO57klq3Od&{K|$vL(3EENEpeM1%~IYWR@tc%SD^Qv8#dr=M{&Y}fD z5=MDbTjzS**rd$kQ{_{Y9DL3HZCW(%{O>~zsPVt+ZHC~?aW^a?7+)}-A+aSIM^S9a z<6y1VW;<;6CCAPXW{T5UxNScc9oe{Jc~Y<`B0F9o!eT00?eE1V*@5vXi{rk1#%x9^ z3Kk3s0jSp|8*v+_cdlN#k4~RxcNto3!3A}7++e?v7Zo|P18c@Oe=Y`?Bt!oDkPSXU z6FLp>y{`^Nc@!6i7b_5+;DTK@riu}BF;I^&3KW1h0nRG0MMa>~bN#oMg{+~?ljjnS zU;6pr2)_L7fZYi4$*PhgxLMwjQ?GB;HB8?JK#ikRO+tcEkkEh#JX7Dg4fy2?y^Sb< z(#1vodMoM7@B+zin3_@;q1&b3w5u!244TOK+!FIaE82})K*cjE@qah^JQd8Sri|mv zT-m1KAYzsN&cGn3@%DTA_zi!r<2Gg}K!>k_hes|;lHEGfxGLeJc!f!!hY|_W8xoTKA7@{iIm8h7 zZv(3J0{7qYz?(=UISfRjr_PeJn)Orr!e@#ivd6Y+jpG95?YHUBCweVvxbDBluomL9 zIB2*8^L$L77`ZrPWSMU`JGW4j%+W(KH$m-KDo3hP7d^S49@RUO4#uLYSuxP0(0rZFH*nT7RExOin{<=>^yR(l;aO9Ts0>3oob zJZU6IV_#^b-5@laVopTvp(A$t909`}x(A+pK&W!znN-XNF|d8|AqH3%29Ymyx2R5G zUHw)1)0`eYuTmU@nq;s;&H0A~gj*C3>VS5d?{Kfdy#Qd6C z`R1;Fks-z-RP(tWb!^8~Ri`lsdDGOqD9RI;`N%|CD0i?WbBjZ+m_A91qg6LJ5@lNX zneWaz#T}f7KAbqPk~^X|-v1bCgsV9@IR&OeD-}&m8L8?-ftjtC<1heAF{w=1y6`3u-H z`M5>V$vaT}O}mn@JXSRl=RQDG*wY1*n-{>RyS_73uD#kSK)FnKFBo@yyS-L_n* zD7E97O=#%zx0*FUqjPcNpbiVzxqYZ5;dRZ;)4=&>%$lX)p_!g)7_%;GUXRDKZSErO z+xHy(Gl@L`E;8T-B;G%~>5%cKO23n0h5IFR@p@s`QFYYaz$foxSU7essrISEA;I3# zUHLLMc~(tKdW=f8Ivn`jXgwzW=j7)K_nf;UO!{{Ig?D`XYs(!5;EnGV3;mfY#b_vkY zjF~gl?M+|`*`xQs-P=c?FyF(DcmJG2t^FR0geymtlE+Ud4-{DfIjn(5&bOx|Q)Cq|-L=>hUTKDms>#?ACJw5(kttc=5pK zs61MATq_$V=h`)<9$p`4`HhS?W05XO#1Ar;U4=3>Y?Kp+5bxB6+pDdkBS0KS@PTGw z{z+XZc~dO^SFA*Cx9il5z&a-QC@8xXQ@>Uf%P6vSe75V7eCW z&Az74(W7E|jkEYj){m61u-9GDW$ycn96Hb03!AoG!mKW;am3R#!uJeyM-fjz3zI?$ zxJ)K^*SIIIK;R&A45B6wG!cm{5Hsb1$jr?8w%A`|*gmlo($?G*q5;5$&p~H<G{_w^FVuU=uaqRY%}NMp@s~&O)~6f;`mV~W_%)(ASpiuhost+#ZpyK^(5r==;3k^A zppH@e-;o0R@P-h*b5a@Or5gpO_VfjBN01bFouVo zM5%G?_wRJmIkzHi{#`2fLbjSs1M#8||R-paxDq>U*h-dYhjZs;# zurn%RU9e!^-;6~3+pAJexPxe7ZM`)wFOLm>8Z4xx!em8!q#Mc-bFnZ?zx!tT;QBz! zK*~#r$6m5{Zo(GHA}T6szH9>u^Oh`ZTl4O^yWV%2YE`CD%LaPpJY<%;$Ue>`W<2_c zgbYdV5Y!}Q&3QAy{wa36WNv;3%mZ9JSiNsrxz>n89gjj-%HzXpwNkgBG?MFm$Tkg= z#?>;q(OHtp*N86wiU5eI`-uDm?D9u%-BK#EEG)M0`zcqAOx+W?oFmVVkt&8H#~6vV z-dgh@7XmIeUfy23JzC0<)%RD5xHp~3xU7_IVqsyCsI{yQD4Fk4`c9)0SW&lfKBaX4RV;!H}lHln}d5cUC~Z8 zWdbFT@ujzyXgrS(J>0^P!)I&qmOo9Tm&4vI=K-3u@njUUL>wuT10RIHJ zH#6QI410BQotOe)Fh+`TV8um`^+8<>0?A6$i972w7FZ4Y;|#+qRc140%y^WLPh*7}0?ZFc8)1&3|mSwqkG2ZRRU6Rng*=IwC)X94r)vbnP_S z>z}~j-Qhl_i-aZ0xtW4~S0reHK}J-?FS$%SVM z?3BZ>|K3k|-X~x#NXrVf7=n&U_2W~*$QcIDa|VONDG)gddlp;19o@hHDWV9*S59C7 zvSWz<6ZUS@Loby#(7edYy1msbCF_0na4JzO0lKB>eFvmXFaomxh(W?@w!`V{I+_4{ zQ<{`v=*R{CR&jz-x-9A&8W3G`1Ba45T7P;XXU>r69o^uAAyWRV^-m-^us+d`&L%Au zEFrOPf$dCl0diM-aOJnYJI^+D7@@Su`1bz5Z)_%pBDU&HZearQ3AF)2 z){(bX^At))fRHuD!VywIY|~I@&$|Aq`f;i|1c5j=2wJ3O5lss=Gh#=ffv<17)CMi{ z@*9MK(>xwDHc)QX$eZMZ8+Vu96)AdgJn}n~Z)bq!4Vr>ghhMOS0^SKUC7U69ag2HB^+Yv$*)pQH5?E9mMp9o&MT`*1d(BBNAk~?&0difq;-C+AA(%Sx&>@o1 zB)Qc?z0(+m#?~gO)2-<%{%HZ4s3^^p1<)kq5o;H7j)aZp3h+KM)qiUbRgF|K)~g9f ztQojd)G)FEJQb^Yv)T0K*qp#CgoQ;&9`1k+JSu1($0CIN9L=8w)LrFROsy;#*v_kV zteP5WEuvlt(l0XEp@#tQ0k4?3rFGRULaZU;+k*p{lH~wTp8;{0RxcP(WS0qMKd{xS zZ#>SEAsEVNxQM-)Rm6>@e1k1>mwX7=$=tN48M$NqIZbVyptI}UY@-Zt0Z_NOWiHoW z8S8bueLK&ScRO(50@d5)Nff=Hix5v@@RL%9z+M2omX;@sdV$C!1&E-3iCOS6|0e)SMtyAu zFZsPXLLi$8hedR1OgNJ;*8ncw@L2OAs&i_%_du8UrM2}sh=BAFTz#@OWD z^3NhY4K>l9;C970{q5aj56=xAka+O9^@HVn9mnNTG!m%2$+C2$uVI5@4$g_ly3p6& z6LImaN|$O}z}#C5z}g!5m`n_s_c(FyXT8Yf_U8RSk2XJ=6|&h7#rOrh>L&o7=&|A9 z>iRgnw8{+sjY$&|>;dOC*I=iEY34F!)SWn?!<9n}-tP%}I$87sGDkLPAazq9a_?vHp8B*! zI7FEc1+Yfuhb{;M4Go%vJq$Ly zsxD;Da`V+`Q_B;)C(oV@V=M=u;LE#y7~H~ggu-8828#LEYc%^SaHJH3?seN($S-9P z;p*uru}l@guP6|}r4^Jre?A;U9m;=ifzo*i<28AXn86bUre$$~edrGMUbqmUJ#=Zy zdCj54vaaAU6XO{YWMP0o>q#?c)^Y<|kX%bC;&}F*f06olL!=T-8(41Gs_87)-G;@S#8v(Ikp1I+R+<=JIpSK5@RoN@! zvE}$=yj915Qq`}?+*A5NjYeFGCc75QY+w9)@0|p}+pY@H-xm$Y9+u1GaNEGaQ8BZf zZ6>SgF1do~OVqBa)Gs-rRVpyrsj`lF@i(QQa7m-aoSh@0FSpf&DFp>&lhe`u^Q$-a z|2q41^P3Kt&HVCBkr@Hq#psu3I013q790+BB7>PRy!Bhx$d?GMh9r;lgi}@G57Sds ztY|Okvb|Rn`l0hIrVu`$Eh4rR^Y#^}-k0F)`;=@HR3P2se{Vy3pXcwwW&N2$p7Z&4 zXgNS?NZdAnAuEwwenvx2*Zi`ST1hJ+OBRye(Qz`%@9y0L%F3S7V?8gY?IO+0-Di<* zSra8_p|Flu06-3{HaLfURyg*0@no`_PQLRSNJ&?sG)aIEdI0bmo|~IKm!?T=-K?Nc zo?apOPqW}`u@YuYK0q_LIG4IZ3SlJg< zZ3Txn0p-XocXvNvyy{SPKHDQ`Fz4%L>g?r|U}04ZsRE9MeUNXpL8j}E5tg;oMuT=# z#vZob~3*UUByf% zd%VCBL(5=nAZ%Xy(c@5$1TmUW{{zUKQ7c`r$kVRISbTM zT+-Qj`fB$DZGP2!u;KB_t(Xy-ES$&qgjq#FA`*!>7?tQL+?q#9-ujzc$vd>VLz7dC z*Jq=%2ckb2#pthuoVRoPzWk7;!UsX0H;~iXx3Q>MIXpg>E2}L%mm}r~LG2t?*1NEm z%|F9!@GU#hX6U?2sg+umjtRHnZS%wwo^#xB%5n(pR5UbN;8J*6yUDa)>vSZElRtcCJ+$l^qm zViu;C?9iD5JRh-GYov@tnB}o2hG74hPG#!JBV4MMQXvdL^ggy7-7(HuYG-01y^lho z3J#{y^_Rtt+*_Fxz)Q_4RpojdRne18@=+(iaO(4EyTLH9YWt~$Mcu0e#ZVkDE#Koj z-&<6-PyyMFAp_eKO}9w&Im0F;G*d44fGLV>6$YNYKm5!WnmO2+9*glzP4|$HzqaT3 z_G~acY@cQICfChyq9kOFc<5#-8OxpmJgKh32Jje*oD^;7Bc*xylEiRY5#J;xwPo%hm&&g+L}E~>dUppvDr)dT z(GkO!r)wfxuRM4T^&7E6L)ZmrDgy8nn{)m(t0TI)s%zte4z7ki#%(O*;ufx+rW}5T zY0K+5&ve0LO|tH9Z=Z>Cp78Yfqa!29ovmR4-Qws2Xif|Rs$5ir&F$53Id?p6Wr#{A zX)!Pdoz2j4oESz%f^h?1eUgX7?5BOE;T89w@nT{aXAbOhYgTleQv>HKCI(8*1s$D= zX_9IVFKvenI6d|ekp0@ch}Vk2Ktbk=npX2Q3jY}8j-Jb@{~T^%K%9r3#2pm|4FH?2 zj71mNhlG^#a=jD*UAB7rWO#(+{UgdV2Vz|UV{h@{u!!856=BXGEZ;JWNP01Vrmk*4D3?O0+JdoYis4@QZ*T<|hKx?C%%9bZ+w*KhaK9 z{|veH#=leR(*kiW78;qNf@T7yNM5>fGf1b0a#8;XNBO~y1wzrrmisRG={nSroQ{Fn zbo%~}SMQV4I3Ym7+Uca@d9c8x_{kJT6M7z-=1r7?RN=s3Z5~L<*fL1VNoYNMxF0O= z)`-K4e;Owu3rJW8XLkHsKfixo-<*ltlg@C`QX+m_mgM@LS+F z;L-Wv8K!!&Mr=_L5vI1Ez%`o5fQ{;>^IDj{;^XHJlb8o^h>55YAPiJ;-Bk%(?3bYC z-P>x0d~>o~XXN6n18{pCMuBzq#?5&*zg0b7g!z5&?PyW1gp-cr1GA~yaU5^uuT3>u zf!3BF8XRV;y*_H_=6w7r0e(VHV-`2QpL(k5=Du1!u0iee$nh?07)QE1(T3`RfOz@Y zI>bt&gG38W*4{w_F!+&plSDujc8+f!WBCEgbh*F60rE6kU%>_-Vkou?aARB>1~6@B zVnk_Ys7~w%@p$v8Q)`_U&RcPv=xPJAQlS*0C!!7qMsRdzM~_8crAn8op19h!^>t3e ziP$P?(=9jP(oG@Ol<1T?{DFNTQ57*7tj%%UNrc1U+uWfNr45oF5CMF&W`9qp~MgnLtZxA94>B=vZtxqxaoVE+f)-$4xcB6kP%FBVmr(<(; zCreXBMa7jHHXI<2a8$!SC>$a_>=>>(I&Bw0ouXVGJ}?UfW|0Dna9hJir$|vRI07Ky zfm|al_tXl|U=yw0Ems9NURZS3C_%!x9xze>;OBK4H~OKKIe^vBQ0~-gR<$%gI;C+v zhPM(QSh*z*Vm!^2c@kwC#@rh~sygg~8NL#fCiSNIECvtRhYLD9Q}=33o@_|cl8+jj zi-qYAz(YOfN|r`Bs@XWyX`1%s)xEFY+v40x*Ue#jZl@VrfngD-51MpxpbjDa3F#F9 z6?DQY0zc#pz^L9r_Qi`=VvqHQ@#KDe{pa{Y@^l^8^Ad0wwxv{MOf3>JYXmR$SjQGn zad9}K(yMwJ7#vdWKL~t842n!T0@3v;;ud70+Mc!xdm91P`zsMYJ~>W>W3o3@E`BRC#(b zp#fA3DZM0dz5uq9?eGKl#j&*?MbWuW3FkOOk!ktA+WYdboY!{k$COzzq%;vSq=*J8 zg)$^mXwW30QAL_(W08uIR0>6dMw;hn$CcNB8KC(gq$^AF%jsWcb?IYP+YcJe?%@EC37gj}N+zuSFf#56j!rxI`bVJ^g52q5ob3J5=od)4*GijhH9R+c!To{=0i= zwM6`#eQIiV_hc+sF8anGNOtT`LBvRSSeW(=95VNX$PDQnm~Y=;#(oeEj>D=rOFKtyZtc=bILz1>{IX8fV%t;JdL3_Tq1O%K=uQ0%lr?|AJ=IyI z{HL~#03fw3vOO3Nmy}y1A>RVSk=gU-Q)0x4+!1k0W5px3l-2!W{Mlc`Fykp3aqAO1 zj!0h!dz*-ljvKQ)UPnsFeXmd@=mJ{-# ziNg!zawcesR30OzXshwA{H^2dA-`EpBI%_43r_%@etL!ocaGL+MZ zPdC}gr$3KX1uByjwBr&0eegN`m;#S!Qri;enFtH#;g07hDQfZs_0wnIgpUk2ju+w% zB@~^SKVg-DpRLY^?^ot}jhJJ&#GNM zj>!U*uN;EEHXMsi0@5N*D;5s1kr2qx@RR{_!!OSRg_y6vL6|~*RGA5ydFU~3;i#6l%`7Q-sV8u`?As{hAxWxKqV%~^FgutId`c8$dn0nG}Q-QTZbw%d= z2~;so3q7aUg|$71txBaR)Hn#H51p~c%Le5{ZYi622#e^WVUBze+Wn`l+Ec)NICjY9 z-r8LV4zIyapEY3$who(^ysGL_I6*uS5H9xPL;|r3#T!P^;*<1aG4YvmYP2uRCz=^{ zH*3NSm0)IpoK1(9xJfhSvNr*y+Y6`I%~<8sH3UIypOukSph)0BcwIdITM#3S^lusi zOosA|3x?PTQvhori1I5j1<&$J3TehH_C@?yOw4SznpWeNkYk0-P& ztfp&6wz#|*FLSL}*>89F#kBncH8Kp>Aky4Il(XzvmWl-fB8r;rgIHh%XhORTr6ff2MQ@j2FnxAH|A=OO{+&8)`QdH>&9S=lnj1Z&dtvm?M9kMG=h*STp!Q zylvc>OAxyOti6aYg6%Zo(y1sI1BoU!$IP0W_@O9c+)pbedorLHgx!d~GoAqRQB#jj zxNzYD*^My96?HWpNPl=FH&g63I;4P0)b%B0RoGrV;+}X2TOgm*NIlEh;4*B6&D-?I zop(2UEKzyf!L$6f911o3eYe5<$NnGiaYR8DUN&%2*(kG&oBJj%KVY`}(7eMF-exgj zMbcd4-XdLyRskq}A36pjyj8NYd^m4GBvv`m*4oOyX_L|+O@_K1sd5=1;-kdG zg{XDIB%~0h40mp6Nr`IjnmDAnXvcgJf|fsE0jNfT!P#`&8%WaWM`$d)Y?H3MipuSJ z_rJZ1T5dmhkkBA-;N)1A{NK@&V^Z?=Je-_wU4DD)pQvi42;pnU-;YT9(Aq4f8Y;9( zHxV;nM^`?^ZmdjN30GudkV6ChS$a}yk4+sG8(VB3gMx>gon87+q6;4{FIdCw2)R8C z8)QK8k2(X!0NPdTg;sm$v)<-yBXJK$bdj2;1qKXQOzUc#i{pA9>H`{^IJm3; z(sqHqlcR|N94eu5a&kMAr(#y((5%aA&!v~TVPWxY(2r;J4-5{bDJUnSu-Pyj=bLfs zq7`A{Of3YzNv-^JA`3%7kqA7G9AMV0nL#a{__l_zY*@ek{8N!vD$@?Cs`{5m=VWK& z;s#?I&V$#mO9oDk$)GfZEEWt|l}5qYzHm^4hIH$3G$a=yOV^uwS5dDQNbM(^Po<}8 zIP2gaF|L7>Ee%GZPZQ8%3$S0e@T%3TA2;~TLd_W8(CytnIB3y&1eft_=KhzzfyxMR zQGpA#S46Uop_Nn2<5iVFFHuY+;Rq9pVPP9}(G z(Y+A_{%bGvl>JzdogmLX>+ip;o8S)Z>StwgD!9E45z|!=o_EX1Rmoq6 zA|EVN{24xUaWd{#u59i&Ab)zVg7~_DNWd>*lLFb{*UF`s39{vFKYo)%Mue^Fg@Y>CHPCDe|avt#ZXn#I&Roq@h zcN@{Ch-{2P30bL<90a=s8%>_~Yx~)Hd_Tn78lsP@Y_BEQHwXLPJg)}+8{+gK?j=je zWkoDHOj>aEVu;pAe|F(~%q-`UJH z)+v>AT%lO>im&{Xhq~v(w9TgOJQTrDPLKxVYT~P*@RXs<#W7_C+)=uxz0Lem<`mf4 zuX@i_&A9B?=IwGq{`S5Mw@g;S*ukS`^3>K1xV_9yGU|W7Vc?4W^IZzLn(x)4FWiyg zXJ}}@)yp}kzHZ>^fWOJRu~=!Xwdc5k-n96GK@-4KjDbn7dgRC@B%BM8VNv`@rB&iK zAho7wC`#qdUgiF+iT*6bL#1UbV>J&=8aA7{Xl+^}a`c3Lw6$D9QW}fttp4fqe&nt8 z^nkO$R20c@ONN(>c9kTY6^Rrr{@fgOF(v-7=ZE&LjkXOR3Z=hPavZpvDRs}nvGiPW zw}yp&YwY5gbJheJ`Gm*JiVd*PVLveS(fWH9QmwTbN7t??8JyDZa{Z23h4d5!C?W-z zCm~w~4&XUpzle~fA?}@Km`A@rURMT>7g{$~$75n{r;8ZA0N#BHR|jm{XF)|mbxwF% zAe85qmagMx=}&4dsj`0HqAsiNaxG`8bm0CdpU6dTmF#! z!0qsF+#q{#{X-l;HWfMG@XWqMI1z7wcaK<6A7w@kX}iQoxmEmO4lrYBMzCLiP>J{` zxNr5~?@8D#K%;YL;bbo&(R2jy@3cVNM4cz*MNjpx$fmfL!fOF|b3T zyn{}55^)5!bO9lsh%iaRuwlcy3Z`o6c0cnL<+qHSJO=5|h6S!CT0%5I%Vygl(}`J> zL5j*8nR&e=rBsN(Uqk(f4A%n&r(Qfhi}8#px)XCPc9kqgiTgnmd5|odVd}V**YUfE z=di_Mw%fx*!Ni!T?mh+==O#qy?R6Pji3UJP6Y@qIso7+E7N+LTJmbP5te}Qs@_Yc# z5yt1|*H?K|Y5Vto?m&b9GhlBj@DsHkuo-Ik6l3C1iNcQ~#$;wG?k{<(Pm}v@J2-NB z@ba`ntN^n=CYc79;66;FG&Y_}%s+=;lAPnSG&2$N2qHo#rGwf1rBbB1g6r>1&?_ih zWG?$x`fImX*l+kn6t!v_J$9;3b$m2M}z- z1YS>!KWfUv%QZ0un}CFB0J>%)^UBAGnS8kjfi#^B0CW_NR!a`ID5>JsBjV2yp+$tHF24tV*XRd`@p{1=dm#H(wJ^pfH z;z^T&(zhEBKOS%f3gPlc51Vpoaxj|fCLUH;g8vd_RvgFk;?=i$gK)vzcM)-!O2rai)uI2mkYGQJ*aMMMk^HZ{sRt1>qh$D ze*X2uDWqlDIUyV)`ZGLdXj7uNKMhSp@wh5m^(NM_73WE21`s9m4klhi90Vx4TYfY8 zdO|GD1)DMY^tzi9qbWZ#5%Yzm#-e8_@nhIGYA{e|CvG)*Y3;$`K^L0X!pU7NeraNx zOa)(_C`u${Bq<>fw96ncHUs}b+9&^Q`sDPOEu5I1U$UsEzJx@FXjlLY^(d`}v9<^t zIcaICO}^a;DJ&!vLMUuN(Ud*Z8AF6f;!FP9HVG5=nixJ?^u#U+%X|WwA3*t!$;OL8 zGxY)Qj9?k?seWTLW>Y6d&;Q(WV)T}!0Im~Hzg4KkjEdkfjb`I=eo%^P`P?yj`#=v=aVYx_~bK(8B8QbY+~~#-T^rn zlEnLeyQb>AC!bhMYGS)Yb^QA~@C#}uULluLwCd#XD$kpeUsSq}m?DW`>S!Pl5x-zndBhp;{-l`o93c~KD5nCVuc|#3 z0wN#T4#EKiXQJ#Qwt>+W zb72(yLR#N+jmtdBRuX0#B+-QR=5{}Bvob*X)TITYZOMaIrtE|vgTTRiZeT(!2KnG( zTAJcqw@1VHv~l$74OctYurG&(EVj8vCdH}gvMCx=#_8Arq!`3 z77D8BmIXC6%LeN%umW+dyIIa0mCDiPrKAa!ul!2jEsB5c$jtBoAwxIu2kH!oqvn!= zcab(AMbyx)5v!?3DEd3#`htuLZ9yv~X%ze>0@-_*4=R=bJQGRHM;>*wEryzid%NXy zkgK-Bt+0J#8StfeO~` zofPU57XR%a2+Cl+cHM7~1|IV ztM{U5JrB!`P)3Nz1#tqzzNn#wa?T&#%QwWyS_t#=zYKd;c|UyXU|jRoHYm)1jAS*( za-HJha@2|CvW7(!x^)UIchM;?+tzuieqp^v_4Tc`i4B|T9<5X__~^ zdne_#1X=I?kSV++VP-JIm4yx`27ms9vE9)|t(raYs|}0W&d6v-+ZMkLe!q{?f>%pN zVLfxjY1z#{VpM)+zcKf*yPwIuExe_*WBc)X(e?Ub&h2&kekU6q60rDFp8Pd%-77fKqRa&Ea}UvKLC zM9o><@Az8F*u}3f5biaRaS1LL{C(?0Wm)dk^tQfLdeR`qXQ3M)*bM*k)@FZ)I;U*Q zv&!Dv58dV_jv~Lio#zH*ArX&7+1I~6FwJKm$#;ozsQ=#8U4~CY-VS|o(2%RFI;Stw zAg!V&qq}`oqf@rM?@msOhCli;y2cz^_$-`FVV#yK9k^D#c=3t@FAJTr|2{j+X%QML z!k4hx4U@9g;7(ub+Nt+^EZVCa-#t6HT|iS-@U>>kafM6`S;4oqU4|`xj7AUA9xr4b z(q>8kQSfH;HglZSMYj6X&@V_5YMSh6?&R6>lr;f0q_Dj)v9VXmjqpFovQ`08dl%^TQhJfdJGI%zSwXqy*uKBLVDz6SY6AIu;^GoS1;%Y);fVT8!a7wP`c$RSL=3`h|N`Wgct*08b@c zqZ=X2ApDne*!?T|W6JSc#9c97}Mez%GAiEDZDZX-|q7uH&T>-97v#4|dM+qugsNBE=twMYnWkx|1)+)*z zq_hh*JfltJ?3tfkTwK`Il_3y-i88-{Kw-}?K%)l30OsTd-T%q=dc@WHXG23G3NZI1 zW@B5#jGrkUuh3v^cIC$Hy9+m6SdkK(UFf5cqKO%w92-LXBR=>~RoB1**Zg2sPn0T9 zLo5rT$AI$^?y;rVXl93hK9}i(XUyEa;pJbGphw3>QyrH$o|pUeh9H%v!dd~HZrOh# z|6g1HwiIFhODJtMq0H6UOm#!s9&S={A={vap&>FGH_oG&7YQXg%S7gSW9m_Op^6Nu z9(;`yamdRrKoH4BwHu^}D65dlh+M59lV^S&w6&n94BS`~(EeI-LQQ%ohkQygdH=BqMeR zU(}pWsHnWiy(GN&cc+-w-f1Y+pyUZ+{uJ=0b~!m^Yuz1$B|)?9+zQ@GexA z>$kXGIF#eli$+TneG(4kPM4Bs-qJpAOpskY2Oe=iZ1O-K<8&LP@yJdbBMKH{x*HbqbswJq#IuSA4%|Qlxtp5# z03Nx6;7}>y<(W7@-l5LFkE1+$8#vfI5G(l5p!g1+=P&YwGYFkK2SJTlqvT$D7BI;Q z#_IL!6?oKCRo8&g1Cs3YDJuXg{nEP<;Evxv0O0K#nA=-WTc5H5rY6z-TS;tyvP@aa z83-YikiVkET#UZx@)p#u?f`YEZ+S1UX3cCybX1hlr8k<_3hyYHp3zCDs;nfQG6-k7 zP;-HC3rrm@=+#jz(C~S}5&>U#qul6Daq+>9vPYK@-TuQ9^F{gS_hurNfw8J^`0!n@ z~P2${Ba~GC@EPS+X(u>2dHBe_U}Ju`u&hGScRPymq8@5m*n<&KIr%e zg(zx00gn0-FnG|GrBCn5fNA_tqEK~~*(czEXGjqP#lu?w!Ay=i%>4J`9iv12>#weQ z&_R+Kn|SV^1bHIfc9e9&5n8tuy< z=#eGdkG_-EmA>4vF5Faj!5Op1vfw_7!uTs$n`D7*&UY_rp!b4u=& z8+h;wprlFZI(CaOb^>~#uHMiuPNg;$)Hbv~5L2Ot?TSLUanCue5F}?{vwWyHnXIvq zPm7!?>5TQ_k^mZ=n-80t+J}GFy}bzyo9(rlSddNnsGbbo2>aXl7f?FXcz${|%{&@T z^FTo2eEIH^DibZM=CqXFym4ME5&|As7I1qg$^4xTi@i1rX{kGnGl3Aw0eN`UU99Qb z`jqu}uP@qNh2gr@C)_k1mxf;n+oO&d99JG^z)%}PT*qQld?6xa804o08$ERP(=x1 z?1N@K=f!Mq9F!9Ksz>f_I^i7@6y)IJ<2qFFfV5Xowa~o_n+DUZd)l{?y#RzJeXiis zQR@ZtiMk1PSTovc{;)C<^8RbF_V=ef-?*P7S@t(x1jztv*3IEmJ!vbcst+6`{r6{6 z5!`viXvZSFiYD4K!`C8fIqm2(6FwC!t*xZ6+5@6r86*jGvmvaZx+7Yttfv491a;)@ zQ)!+BBs6c69+2S%pFhb_&X&|Q@5p8kCxZm2M^z_5lV?z{M=u!0f!9#qM4Yx6Z4J4l z?aEGt0(~PM1o4Ey-d>J`f~x8b4qZZ?wH)-_6Yk?M{L0Fd?n>GlqGK)>vcr-6)2B~l z*nxesJo!7Wr)=~zNe6C=qss$ox0S#bpsGkV=H3XKN|IFL)_#Gb2>}l=??{_u9c16% z8r?!tF6%$CYWwEXY2Wj)km(!tjTq!Nh4erDF&hJ`X-Cc;d$a)bKJ8ISd2LrUP zn*|}vUVIV#OEkPd@$RLOsAh4|r(S!?yNjFv>M5h)sf}?TQbR9Bz8ve0 z=}mbGtd940xTFtnYd$+#d(YuBXKkw4GzL|TP*LcxKG({T1AITNlFPeO&Ne__r)bLk z;W+&ri=YP3x<6&+Wk=vIm#z+>+6H2@&^FnImqa#)W)<7z};*o zc^VhuoY1cE%O09AzL5@;w0;V0rvm6R(tp4C{e&4paEQwZ%;%};Zq(~X*j26LiXEoq zC%!@9`0+s4fGWcMbd9X+39y1!sB53U3M&Q$P0b*H9TXWs7;_LA@fjRUo!NNk8E)Cw zW|koD5ThKkr3J0VHxxHgj@v*mSx~B>bKG3#yY+HSL}NBvdb+v<0o)n?c+Q80O+bcz z;sjCz*8-KtH;_mOGQLGVa5)lLG)Y3A;6dMbp?3>LaKuZ+sv7XuN63>~FRczI7iSTA~~FQY_x%xlS2}4q}p)Fn;1Fsz3Dygxb~6 zK05by+B8R1oKSxkyFOQcAI#YV7~e3GBn}x=b*8L9i87I643-A(06w1;DONH3V%;s* z`T!B2FXHz7NRp{zCm2GEV73GI;CYf}o=>QT1OXmljqodCh6q)mT_v!T)jNaJmTxhp$Dm&l(T?8g6PPtstW;U7y!;#@fbO4${;~mJ@TN++ ze0Z#2!)2I+mT>RiD?$BVbrR6GCD#Av;%4;lL@p%==gjk@BR zty_~+ih9u41|9?d81N#dNc&R|2j#3pDKv8bLBJ=O{b>GE@7#T7{=(?sNl7~TZAH&l zioZLI3KKEw!MrtVML4cGMX!86*+HSF2JWQT1sANd&hNVvPHP8Q=PO7u(5~yr0syMZ za&$N0Dtdw}434qaCC%aH`xEJ#R&n^V+1?Nvcz!{h{Q*cS)t%wRYlVbLPTAp@$IgU9 z275u4RR=%9)I^Tf&cP8(VYHXCfS&@0C98=~+;#K4%B66T^PZwk%$0Fo-~~oy?$>nA zdOTk6#TW0)-0h3GOS$>{r@uxuN9fcP;;tv(`wbrY)SU<*4WZ=>%sA3hT3yBOrFahV z`h0;5S-|vDRv;2i<>)zk@X-1D=Tpbb&h8L8H9mL=IRc`a4BWsQQy={|i-4OaoH(+< z`gf#q^-XjR3iypc)9DMDCE`OLBup5; z#?ITw|GjWrSy|6E`*7r9ij`ReZ;y-LV%&<2jg<`O!?`t=5xjMIm&yI}uPyg{mzW+Z zWqTMUg%yl%Q01FeJ_n!W{FD`_Zu#RTJ^*%J!2n*{tvJ}pgfSA0D$R{9o9Hx#hqq`c zwH?SWX4~5i!L|6OEzMz-{Zk^$Vy2G33KmLC;9(;1foj;4QUQiHc z3hrPKFV34Zc;_0j-3CQy7K0PoA_V7!U;Nz%)@)nOWh*!MI%3@>wzfswNG+EzAjNo+ znW-tS-I&MYAG0dHdZ6TXld`u@BZwC{6%7dG#jVf7wdSA3#uJ$Fl3(DJvd>=4HhiY_ zK!%i-x~Hi03o=x|_dffyKmy%Q8IRQyblD4Zwol$rUEU6#14o~(>{@YTT;#J;P+>LK z@6;C&>-O!d%@oYD##@C_=H!K&malCO#`(QH?TZS@4G@k|Y9?7Lze)CA0`~8#!Rr#~ zE4j_G4;Driy+;c|1_Q~M`44H5R$N1z2KE>@8oMGZj@NBEj?x%N6%04%IT;KfkGf8M zdq{-mkfR%7j$EGM28~kWsq@wu@t`#p?BjF3g7Ai1Kwjg3<;wmJb>2y2Rg~MC=l(T7 z&5E2p$o<8vwWGI}DvQB(Bv~9udvK-jX_uo_vQt;beH}pYmgKJr-N|z)S!74(Te*WV zW_w}~2Gh+5WmE5!>ePBA(VKry@mVw3xcS?VqKP3#a5Ca*k8g#u#=0I}~v#q_?oZb^V1+g{}KyUKN>U!0x{+D9U zIQ3x12WInH{*^9lve{50gp1pggGN{l{S^*Uj4)RzGyue75A4m{C z`;!ZONWD*juf^UcKS}M?GQHstzWv=Zkv!{I9~FR)jEz1j z5OE$Y3WL2Ayru~|RT;Mi#kPgGLH8qSx`@+6x=V1e`mMHAUP0B21=JVvueLsn`rG># z=sX2qB3qMOz<#sl&ILJx6$J0;Y|n-{;8)K;t3x(=azy#0Jt)8`kSCe|!_7mZxKa1A zirn4Wg&=6yb*I#<;72a4b~zxf+=x^l^r}oEU-MtW)k@|$$J(MRI?x%=IBnGzfN6}K zFw~MP#`gn-5U$`wMSqF z{F-9J8QWL$7Py8zk=0CCe86n8P|v=TChNQ}7rd5+-g*PxzNZP!74p8Q9^ z#JJzM2C#yx&kj)B(Kn+F-nn=e~n1!STlzV-6mmrZ;<~o5{|6VGEvSC(U z66ynfK>GODFq~7S=jbMQTfDJp_7FT%y`=HH4#@K&$Vrf^EhO_`l+Z!bVlZ$p$-{A3 z7lJY(M?yYn=@8OI01dYBe=kdIoyX$_-=m2CQy+**=bARm5=4@2MVSqPIo}rZ}fe32#gQaP0DG;CQH%41q=6IO0%%LC=@gOc7z@F|0hk;<2Knka+!NLd3*Uvc zG{wE7d$$sBs5m4sn{hnZ=r+im6#dgsK13f~J7ooc!Dsgd(QW|}ytm*yQKEr(ZxsNG z;G&{9Md!iF!-|TF8C#%a9^mbY->8M3!!<+t|08ILg*wMiq}g*Bff5#>k~(PTOiD!D z0A#E|TGmyocREkPDPv&0;csoG;`9;@%rr+H~G;1=_Tj@e?O) z<`TawpRN3*HF-Tzkvbih3v`Bkw^pQUT5Rj&DyVNUve+I!R(-yOqa|KnBt;u%&~sP} z*+Y!h0-75egTQ1snTQQ*ujJ3nPV_s^Z*m{tv^_3|$2dWz?!^8)4JW-VXuACu7xs6X zyZhscP|G+2$@B-9gO{76&|D+WzY9K)A_+}8fRIItrv}M>C*iSSsQq5jBEx|LFOfb= z+)Lx{cwWvht9MxL__nbF>DrbVS5}YA`nJqy;i6f|Zc`S|GI`x7Al~%GZWZ;OyIABho@lEp zJX_(7Pf1{#zCoLK!1o?UiMQQ7Z7IW_o^H^G=Y8lI9|VGs76tYJC$8S=+B@^$vZYHo zA(!0x-6jh>Jv}lVlZkAxDKt+@)5_zr$bMG;{tV)<++G(wQ`>;i#__QlI&DRey^>cM zWQtc{kZ+I;5jlI4_x^cNbiZ@!EroLs#e>BQ5Y@v z+WwZUEN{H(sP#AZL15q~5gs&TDXY&>KR(jk-Db6K91SQH3_~KMy2?VFtxhGkV0< z+q(1&Usb^Hsd)>8goFxl`qsdLbM*c(C%y?8Qs?_!3~_ z6qqxI!C;IUz_BLto3COrO#jS2J>P?fL>=|Dp1g6FB*kfNE=N^V9>HJ4@fz?sW8^r9 zhmPp$hp)z6co^l-zIhPRS0L5N*tvkQGk;3H6F3Vvfh7SEt^I?|RSmz*9W#^FVpOpZ z2e0rp6yQ-&9Xaz;6JP(U6zjkmh)E1)6On!uIwD&GxVF4KlaW_lR~HK;33HS@dkbL{ z5N2oAZ*Rmi-0}4d1AF&Sh@>iDdo}cjerq~~!SR@8#e9K#c>S(KNAMH;F%7HHn0KAH zxEd6cHy{E8WSG^5Q(?yR>G!htVhD^M1x;3x@WhY600A~?Q<^8?0;ijd;85JRlG#Q= zA|fiVF=@7!W4ML#H!+&>?jMeXEo>N#&fmWS_9o@1(xCz_LT+OS6IIb$q^+&nCX3bu zZlPEI{9^>v1OuqTEwvOicSt+&FV9KL!U)_}#zjXf;7*l<;Ta~_3KlUKP$y;zgoHAL zF*H2rtKN&E3Vj3eYHjWN^vQq@QB@RNxpEhVR{>FE0%kin{lX6?bq0guu!8)qV`>aH zz74pIDyGsE@HJWoGnPZ`#BlV24+Q3G`F6|4 z1Oj0IrnprE;(2Jktd!*BF5?zDcKmoW#)MSZe(K!b3*ee<5fc?n4iv}7lw_de%YDQ< zJ9b?guA9wpo3b~53gd(A=u0$QbTp6r?P9%+JG2iZw3O7;)WGU2N7$~c!@5Zs{yeIS z@)u4l1=HF1wkG$N!`y{m&e>h_ZU715DD0hrJ3t2d9Fk>cJKW{c!p*|i?7?=9u~TU~ zx3~D(d4^KaP;gWOZLU4oD|5TO2Su3}yaLobgOdyC0frPIj}5+Xy|h#$8}Z{)aob0V zJTuvKblgz+c(AI8;WnnGqf>7Hs>11Da(6Tv4DA*A^1=4~LQY&lh8{O>9)mR=?%K~@ zj(KgocKMR{)UrYBS=FOQ!;xX5NPXYBZb$n2DNu@kF4?qgTYAZP*L?-hdW$*yGV)q3 z_O9ZpIbh}4rmPINXslYj%_h(%E_3*^AS6UuOkCV%+j|`L3kq(*Y5c0YyD5y{&_bjV zpx07f-X6~E#%AF~_|g&O3wf?gd{s6JlbzM5B=D7}s2l zTYWsPdVxfgFBjU*`nq6ecEQ4|`gnk6P?5ehNV48ms%n5iw9j@gc+}czfGp~1L0?3K!29#@ zQV)O37pmK}*Kiq&0&%&rn(MqT-6-veO8sQldt!^8X>8QFwgM|2UE=I~V8F=G^TyYRNl3&*L`2j!hsS#=8}>U%uw%dJ44&R^Z@~Gph&k% z4E#zA`fozvxDI-EJn8e=?&q3u(~@W4%Z9wOv;=U%qMhCQF6@zGCrqxg2K}AzO_tlZ%?h3KdV11_|H;kDo_4Dt*Wp2> z?XS)S8Vp80tNUQzK@@2Cy6p07)NQAFgnFZ09xk**zO;3i8amt=Kd^{a<31`Z+?$e| zY}dnaKF{Gqy&b?Ladp{DZDG)yo~ERzBGB0~ub{v4+_u%uHMYrv!}S>-%FPgQW75*w zs_IMBvCP^s1VCfMlZ8qhs$+d>rPLOxHYD@#_G7%u;~Uv$u&{syxf=^y2Rcyy$Kvk~ zff?Kx>@}Z}&*;xxT$y8GZfx8q?eijMJmA|W^{m0+4}-5~`$`Wx4gNYDSbr$sN*Ng&8MWJ7zVXX>mA9j&!VYu2z80Q`cDD5`=IhQ&yxebcVdjmj7q6tw zok z)zFwR7~HUoEq&0Z?P<)9ysTy1>5&6Dib+Z4BA)S(N_`&`xY3kPMLk-aq1VJO6xyghtCGYoA`Y* zR_^lX{mJ+x+sop3BE)+Bx3RO<7hGiynAiq9u<&TglJ0$fEV|n;xl*R`_gI~OWqk17 z#?N&RN_eWOwQ_R86Jzr0hx?!7|FhU_n-<_|*md1)8V2R=ojJYF?0Z*HVJ7r# zo+gqM^O?ohqO7^3o};};qO7mA{s;b^-qHO$GkjB)vXqvGmGIC8yUwm3?+1I+(z2(O zgi6+ioaqr9bPkDoHmbdQW_15}d9L}#-u19%Y>dB>IY-xdTs>=!?(mi+zjGB6!j&;A zjBPXN1u-sPv?wsMjlUxkPDfV!`) zW4^lWrpPF82W^4 zajT+#={CNiiT-}@&aGRp(-ob;k}508I&WSjh+PMxD0*hF$Rf1Da89SySt@3=ozvLJ zu5+P83|F;i^alC?jygKa84N$bjEVJ*!U2k~RZW^b@%gTkpD&L5N5|!Fiy5yt@1jL; zi`clB`3P<=ylC??IHnWA$$4$10+PB9^Cjw5AW^fNcmTVJ2e_P%L7h&~T%!P2U+XdNly^`9OF0Pm-8|BE%J3vW za&+3K%`mNYDPk}v&x}CU19o);Zww9RqRYz4Tr`+Fnj=|lG4n+@|I=c*9_3q9OVwam zK{&_Iki+pfwL|x}sUY2>-v)yYQT!4fo;U>2s2^-VCMX_!2(}2xyr>#i)zm2Z0?M_9 zqS!wmAO`pzu(zXNAAvP#g~~0k_4VjKLlgz@eXQQD3246|7>~{p_ugtTM>E8{2pDBt zxXGc9R7DY)SY*i8U_HA5z#DAHgSHxa!^)4}^NC|lLFo1i5w)^{3Lt{2(5L~EfkESp zIt#t9SIbVI;J2|JHIL6W+$1(>FS0q=i;&+s8TnDxEb9SVYhtCIE7xqPCn!%_$xC8F#-K7ayU3q z#v>=C^{)w#`eC->%MPnf6bvc=oML7oQ5!Y}Sd$4oA!TGX_Vfv5T+DIpRG(K+hS)a_ zDraRtr9m(ybLkImTnFdy?;kSbzzF~L*1>%0MWaATt~u*PdN&>u^JY)kS0AQzfA3ZI#u%d zCYCpkk-2#_)T80}h<64_(QuccWKcN0X=;*Ump_8!9Vo3x!ki9_wG^}{)Pa4{1|cD_ zEKwRyJKMxIr6wUD;l`_&ZDS$m4g8nh4)4&-9Fi&+h`GLVRM{* zzs!s|CvE`*zyZTLiY1u)=j+^hhpsq-fXW2Q^MNTE!I%*<9Z2NN3~k}0B07iMgeM+h zy#J%Vk1-CjOjMp>=SRs~lH&4(h;N4q_{JXMTsXQZ_fHt?hbrsp&Q5&sIkhP)N=s-a ze!W@c(+;PyN*W~5W4~J-OmZAF*MW^?kcj>@Y9aOMtay?l^E6KlG+2lQ=}#NeoC7JSzKsHYl2NvjIY;x1L7A$QW8Lu>{Litb2WjOx zv{9fljY7px9<2u5KDE%#?{seuqgO1a2IdILs*g}r$^oCtAYf}d>3uabt)fX%FQk!} z5BLRt<#XvA!&=pArv)d5G;;^AyPQyUY&@LbnPTw0%wl~y-hk>zOQ0?M%^s8t-qkWM zCrkhpEC^HM-?uW)E9Z;Mb5ZUCl3;(t1^|-cm3SZ5mz6!F2lKsy+IGQas_61N5fKaiSUNVt=|dHgE);qUZPwGLH|?Tp z$ZcgC(4=yd4E=B47SSsz2BL#aFRoYAr3jM~&F81DlNdEgkv21fb>dZQNB#d9)1~E@f~Ue z$GD8xqhP9G%u!Pw9y0VSmxVATVVQ$_)5!|Z31IT;eyT(V`x!R-uQ?`Y~g zdaU-@6VC;pZq1f?a)1#>Q>nEq=e2SJ;#vk&#DR*A!xd>*CL9py7zA=J&N}DxCBlV>$>&}ju96^G=S^?cEwq*GJHYf?I zYV86$UBRS6=opUE)g7SboAf7vX%Hl8d?c@00_pkt-^^Pe>3Fd)eGcH}W6sVwfQ(`LRBb+lO9=qa;I0&&xpU_pg;puA zgpWSQ;gS@E0-GPBVaJiUxH#m91_2-Rk#(YXNDTsA$$87s@aR)QQ3CJ_z(m8=6HlTu z`6PAof8m&p*eHt%5WFm_w=21ph}G;L%8l8O1|SA^ZlZdM^^>r$Q_42o6g%k|F)xMu zTfR6{!5{#cw&?qj(zhrTJpn1*sOqUI7!H2RmoHC-dtW_Nw>&mlRqCKe6W&BE#sBk* z!(bsHtbk1YLuCK_xpON}cUi4~G7b8bx1WR0)USg{AOiqgTPGo*?u*bJZK+ume6ha? zU{v^kpNC#!jY81olb7gzI-X?E0j;ev>fShvBhV645rCo}rWCF{YOxySkzHvpOTjvV zoMW)ViMB_R_KbfIJ8z+w7Y?eOChi%oAMRemF|aN_3}MR$ERbShng+&dV=-HbF7)1H zz~mcJ=Er&CqrCTrsBs0JKBJ;a~8j z4CVYKfbwk=F26%tu4MF9Te@V)IuVib|8&M8*>}L9Nt*^OjG~`BdG+0w#S8k49CR*m z=r56&%{=?&9hg{LAK>{$Cn-vD#&Afu!tG04DR-d7gacYdP{0> z#SpM%*&rpQ1^me%;Pjk=&A-5K=z>I~29P?P+Ce&mQ!%V=Fn{e9N~;l|Kbr!w#zLZ? z?9-b0QP-}q=)f4<0Y}9Ep0gu9t7l8rYWlrxg3KeM$rW4o34nJTa7K9JnrY@C^9nX+ z#k!=SV9$ie5k-Mk^BBDG;K{FKX3mTsix7Kal$~v|;~C^YqvP0}!VC>!UCKXxjKW={ zL|6K$Q(>q8goBsebraU)Ph;QJh0 zw#T%B9MFD)3Jf3@2kI=RU$)|6UM*$UL69Pt{@vTR<!G+ zAqLVr;-MpuyCHZV_eJZ2cBdrVDZ(7NL( zsJ&hFwv7No{lH~KIQ7IdK4UK)GT_xI&axnAH3ZGz$PB?iuFTjUeOldAZlU!I-wy~Z z7Z~lJ*(>v5CQoh+Kv6%yXgCF{9njV;WEQv~z=u=4wM?zOifMA%8wt{O+bat==uZDUK#Qt z6s=%jxf10jg(HBpg)`gvO9Hp<1I~+~`&XHW*$dKB?#x@&M1LO&hA|qn9e~FkquBct zr3kQ))G=~g^Hm6KP(XUyVf7TH0#vzhy7;|1r2 b; + a -> c; + b -> d; + c -> d; + d -> e; + + e -> z; +} diff --git a/05-internals/design/api-admin/administration-fig2.dot.png b/05-internals/design/api-admin/administration-fig2.dot.png new file mode 100644 index 0000000000000000000000000000000000000000..29167f662cddb65626f5e8fdc5fee5215f8b64e4 GIT binary patch literal 45517 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 literal 0 HcmV?d00001 diff --git a/05-internals/design/api-admin/administration-fig3.dot b/05-internals/design/api-admin/administration-fig3.dot new file mode 100644 index 0000000000..1f9f94a6f0 --- /dev/null +++ b/05-internals/design/api-admin/administration-fig3.dot @@ -0,0 +1,14 @@ +digraph G { + a [label="Start"]; + + b [label="Get all groups for user"]; + c [label="Get all Project Administration Permissions received through group membership"]; + d [label="Decide if user is allowed to perform operation"]; + + z [label="End"]; + + a -> b; + b -> c; + c -> d; + d -> z; +} diff --git a/05-internals/design/api-admin/administration-fig3.dot.png b/05-internals/design/api-admin/administration-fig3.dot.png new file mode 100644 index 0000000000000000000000000000000000000000..1949abad12a36eca3c5051dfa75ea2f7045cc9cd GIT binary patch literal 37474 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 UXE*Jl8u@v*h88nR-PGrQ09oB)UjP6A literal 0 HcmV?d00001 diff --git a/05-internals/design/api-admin/administration-fig4.dot b/05-internals/design/api-admin/administration-fig4.dot new file mode 100644 index 0000000000..263377acac --- /dev/null +++ b/05-internals/design/api-admin/administration-fig4.dot @@ -0,0 +1,12 @@ +digraph G { + rankdir="BT" + + oc [label="owl:Class"] + p [label="knora-base:Permission"] + ap [label ="knora-base:AdministrativePermission"] + doap [label ="knora-base:DefaultObjectAccessPermission"] + + p -> oc [label="rdf:type"] + ap -> p [label="rdf:subClassOf"] + doap -> p [label="rdf:subClassOf"] +} diff --git a/05-internals/design/api-admin/administration-fig4.dot.png b/05-internals/design/api-admin/administration-fig4.dot.png new file mode 100644 index 0000000000000000000000000000000000000000..668e7a585460535e7691d51d43450c1dfee02101 GIT binary patch literal 35591 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 soBiikM+HksXz{EtTx kp [ label="knora-base:forProject" ] + ap -> ug [ label="knora-base:forGroup" ] + + ap -> "Administrative permissions compact format string" [ label="knora-base:hasPermissions" ] +} diff --git a/05-internals/design/api-admin/administration-fig5.dot.png b/05-internals/design/api-admin/administration-fig5.dot.png new file mode 100644 index 0000000000000000000000000000000000000000..823a271b817e37a65dbe3e324a96b49b8f4c7035 GIT binary patch literal 41817 zcmd?RcRZK<`#%0kOOg>uGK!``N;U~mWDD6TLbmMHBC;x>k_uS~$=(VfNp|+G?2*0t z9#`G>{rT<3_y1pS@9z69uGe)vujhH5$9Wvb`Sep(l-)+bL_s2vww*gGtx6(o%*MZ0 zlW)TBdaWr}@sCYL^0LyT-^Bl37RHB=NP9@qJ~e6GcA&HVK&R8s z=%bcV62@0}cI5cpIBNA-*M^zaxbgI9W)_w~{SKe%al1|v_3@tZ$&UNhF z<%<-bnhVdR^O-g5A6s57?G_5*(@Wd0SM=hCkdl&O*Ry#KCAo7&Kg1?f$oFpW{hwd1 zR1tUcbtI(!`_-sIneF%A-zQXD%2D|5@1(_o!t;0k`^}AXjm^!`d3kwF4t`ZvBz3Zd zl2TLeHkn&$b}|KSVr5MZR+*WemXwgV(U5iH2FcmQCHGBIllh_0PmWCr(v5n&9S7L| z{EB8xeEph&!G9yZLPJB3JvpC{oP6fOg&nVxl2mkbw)&To<#$rW)RE(N|8n-bbr&vN zNJvV$-D)8tCAI$i0XovlxVTOH5jDnz*>;q9u@2sn>ykCL#;R_~)ZS)bV6d>TP+5B| zQyX`%_t-HS&QOZAwYAA#ziww|3y`f}-#a!Ii2K{HapT@SdnCFx)2dum_03Y`*iQTR zm&3c)uQ?e5Wf&}Kc`}gD& z6n0Ck&o9eKd-w$Q^8a(QtL#|8Lx&IFRE)o^7%z41+!jtwPHoE6ZJXAcU%RF^N5{zM z`|{-;Q$8l41xnnuMpCGh^5GQ=vxwke>Xnt14jcNjMw!}|(pwGFv<#0w83@^4U*DXC zTf^h4U$~Gv+Fo0$M3u)PWo;&Q^e81hcDmNrmwaJ)IluQ1P2IK#w+d}zQ|}r_xI6f zPx41>+rNK*&h??~_x%0!nqyxC;f>Jj*x`)_mX?*x&SBlXduyoNVBB-sRpxv0np9_t zYq^p~t_yz~b6m_67Z)e4Yh=V89UZOP91|UlAKmCJ+53@od)@Dfe;+F$o0pN2_zZ5n zygSw5Jk=wbDY~aGU5aWrdo5YR|M6qSvhwo1!op0pwzj^0ey6Wr=UbW`IT&oSe>jk7 z_ihz^{h+=+Bl;aXqF%lvm6w+vI&?@vMTHi3Y&+I=GXAjY%Ia!es==v!`}XbO<*ggM z+OXK-mr#A|-(VT`OVP{s`Sqi=KmLWM-IlZ(lM|$ph6Xx(+}ZQzrE&Xx{r$8%ci#Q> zO-rcY`%0s<<%x)zLr0HF;~trv<$re(H~#S9_Qg%{mo8nh`^x3rb?)4`vx@UxRZa2g$l^UgyY@W+R4LyAJ?6c4vKdT#g zdBXGz48j|`>g}fb&bYAJU^QO7+PBz!RZfoLVMqwC>DN8ZuC95xJEg^_N-h5h{qdep zp+^L5`!)ozof@Y%X=!OGEiGL?H8sU3X!DZ!&Ne1K^4puKWzL@U&5ux&w#3eUpKJfa zW^Kh~@yFt?A1Yc}<(DyJphim`kGpko0 zKg#G9IMY@HvsL)f9UPEoH#}B?k6XWqvgB)&6mf_94j#PRQ*slZzDL%OZdMY}R9RbF z(VBjBuxGh3Q7y-Akb<-auebCrb$ID`Z|PkQaq+HX%LBtQ|LsJF{UKF%Iy!Wj1#L*V zxw(Qa)BE0N9C;+SAFB{~E9p|H&*@~1{QN5E0h3L)Pm8ZRuv*|e#g5HE%gh|0W0kw{ z^2dPpcec>kj3j5*c(k=JO0 z59Ka0YinyKfpA|}a{uyMYVnG_3se1qt}}<`Cc1-@G*cxL)%(J9tloc1yUcs(!-fDB z5e6ibaVze+!2iPcXE;*N`|NH{f6Ml)OY`HM#LF)zC^%+RMjo(RfU3VDxFW~4pN5HP zcsy>q3XdAL$@R_EGzFMp)Oj|2%Mz3RI6Z>Ca_#nN6{ zo*VmCL$KB$EKI; z*6rK8mTi2Wp9#_7*}OH99Gp)032*&xPt6g#1krKNYo(t}&~AXdps!lmp@?bn*$+?0&EAsHoMVezKD z%{FExY;7*glTS8TquRq>S5#D#hJnEc>(gKPfMeXsbbNz$g<#E8;X>Hc%Ck|7vY%$@NuyJO|39kdTm`s;rU;f5g<{j~D&7sl`j8r0yQO zQb{8^RYsTddu=&NowKu3G z^Bwj|+1s-GT*(4uZVTCeH|)%FNJves2vHJmjYSUUk4{TVlOMUC&}5E1Gw##aw2O~v z8>{Qjz09J{G_t|0XIx!{Sv_V{D3KZ>_$~7;RRsPFH~JT)Y%u)2wt7}xzSL{&hnG?B z2k#vB#pBJ%I(LzZoCE?BG^;*;-avXLWWVV^NTU3(GG}OIb#>|c+ne*R{4P9)ON*~e zN)7z@!ExdQ9ktjD4Y3uG{c`fnq%HsZ5Ra!cWJwyyk|rhxtn!8q5LZhroMV!dl!x})kP@p zZ!KDn@7ursbgb%LpuvVX1^YZ&Jq?YphN54;e%VeG&a>~^C*2j-GIA-qJG8&d!$K-z)Xjw*TYEQ;Ob|#b1xbJ%q8?fC2ZPJn=&Yi$Bhin4Xozz*DrqzG)lN zhEu0bZP>i|GBz0zH-IhAJ`G%p24rjk2yNY3+L3E-J3UZEH7`}avn$(Ud2Ss^ zRaNz6ooQRA&)l3DVpwrGDKXLZbuq_8#AOe_CEvina_qXPI$5^&Ch1iIo04C@mb9`; z(Txue*Ss5a&guB|pUMLR1BO)(_d8F%-<;;T>gpummtcJBFVaW|ZhL#__T=>R_SV+c zajQ=}VPRnhjEsy1Djf6mj_PEc#{-`Me2IUTZc?+IRQBd#dKuohca!;!e5VP9qM{?ga4U`75D8AWT&F7&8hD?w11t%8-rqf?vaTJ zo{vE+BX-QLc@87ZTZjj_TtVd|;GH1U^lvduP&&>OD4EoBZ^sdhoczO)A9(kjWC}DI zZcOa+JNTT&F~2kR4gJ!|ZL#0TekbIR+tu`iFC@2I1Z4ql9osrRK z+>Oj*krjz$H|i_%<8J>^`-10@Te5qqlW*BV z>(u2Ezp%DEp)+bAZ<*62F67hB;?n(UiQl?wv_1?;wNU9!yCgX;5-+dwq+#9HuRY^& zG$$|An4SA)zbOgZ^pH4@97(%Ar0OIPt2X%KM}M=9wfEh-oB1uik(88b8LESrh3bcF zb#<9ZFLQFVy0VO`8Av5~ipWo{Zf=+BU!8l~YOye!l&U+onq;v0x>fk<=f}N#-gowK zac!HOot;(~MRC`S`{BGYRS~J*-`{^*$GWh|tQ`?c!@?4X!WZ@G)hj6nvXZgv?jT^K zzTUfRAAv^(6VFcn`o(M8C!MRSp}~N9a}4!2-a|%4hJFA3jTJ#GQb2+Q9@u=x7%3UW zT(75B#AX**E7UwaxmA*!eDBw9-^dH~gOhc#^Jb#N{;be&6Or$C&Yos6Wctvx*bthm@K-Qj7C$s4_V z2AwPmK<&Nf4}>)QYHDgC-Dqr7kKawrFZ(nkHxV11e&^1Zf&yk06_v3RI#QSG2v-2B z7!#_*hgav&aTAz@BUtnn$_{Cv#de);a8!){P9AoC{;Vc(QsIcl2xU!XZ}?2&kob+P z?(Da3-)fAE$iE6Xi2j9<&-8wTj?_Q^$3N|Hf|8t~qEFS84=ClGosSgz2M4{y+~y2N znv)riUm<7U(!RqX8>BnG2J{hCXR55Gw%)(IZ`%Fh#a%aE$QEX`e139bs$QPwQeE^J z0@VQj?Y(o~TDwK#<=9yY&InE(p3Rf?m7R6MJ190X9M!ski=#2zd*le-(&tE#o%o>j zlfP{1%rlYtBt1L|MUUqWJ$&+{HN|r#bAHVAy37mV>7vXF25L2tSBAJ=?KVcT_|~bg z*Y5ql&CJp(U^BySZ!c-(T~8F9l~&qGLvsTy42rKsd)7AdOs4d!wPEo;a#-t42U$cM z1uavPlgoiQ)}yUHA1R!vw`^`|Dq&^C&CbD*cBN`NdbFyjmo+9MHtm4Cijl&D8Dn?Z zJSA*xdF$)z(NHz@3TJ9_eR*+;nuOZ>__#5}yLaziDj#|l^d5x+1?oXW#K^ng3rQML z2F0Fl+sDR+WewcAQ#7y6B%)rZcYlc#(fdTjCf;Et$ANN$hPf(uGZnM%e3x5lq}WK& zQHHJ0z1CbhP%Ec@I!BM+`4@1`o?~TYb)N5ZLL$D6d&=oNeMO0ujV&0(jZ8R_%Kpcf zGnSTP4r4zuTlA$QCCQ$`_>l z(d=;3*O6I-^S68_9u(_Hs_dHXZnof4Yl3TwwO-NSHUL}7QD37}6aQ4(6#J>ZazT$J zKD6Wn;`_an`ui3QS$3ymM1$=)Ik^u2S-yJtj_)n_OAU|p0Q#1rOG-1TVRCj^y~h8o z-70?@5F#p&O_Im()`|An;Q(=m0gsSjoxJOZ9Y?>d1ML6sK~i+-XAI)dmLgj=fbr(m zo!l?cbKa$5`4B4~e#~=afm@7KFZtcO?e^b4-^50Kdh%LFCv)`o&XRo1f5;C95uy@y zcN<(WF}a5;Itj#=im%S7tt&CRSnOFSc>U-7>N!BGaLd|LzYAz2b1Ytnd*tcf)lc1t zB=PF(*|Riqv8rGjcpZk-r)mVcD~+EfrRIJ+9pB(5%jzPHUU^Hb>R~j4Wkhv&?lE_9 z@g%Z0*PIiU)h-u%acXtG+aCokN+ZcTH8r)evXX$LEqXtyLJpQAn%Or|vmOOxk+!jU z%XrfKk@N4>`7@U<$252z;p8lPXIzb*I2wD6{piv2EA7Rr5#I{kvgPy91M+|#Ab^0| z>hkxAiHUc`H`i~@T6mt7y=`nP{*<5Kz+1v3Z}^fyT2O z9hG-6s7R-u#i-~MU%*X!4>2~1glnEHzB zGC5iD!FwwaDw_H(8-*jkbSmtNcGN0#J&734vTXMWIjCfW9X)QPn(eqaZ7jMv(|~m; z1vZ$>?_Q+>P^DX&yn6~XMMGx|hdJG!PqNEDd97I@N*P}>esy~b(~2VmtUtcJRN6B# za%7&1hbL8SL^-Kxx`<^b5C{^>rMb~opr^C(&F7>&Wbw8OQW}PA20!iKL(>3~>4?S~ z33YY)kAb`IVlzIA$@R-iEM6V67PS9PiAHL&QBA2A7>$5dotV0Z z4GP~1TuwaqTr$(mwcAL5dsEW{bcu~t&+G|8D=&~}+f!R&-oE|XsgS$ZRo=_q-k#TU z#rdc~5i^00KYjXi3>kr_Z&>z7?H24$UPS0;l+}wDFOo>s|+YOK6R#L$YZ=N z(*ughnyLl{!DtLNfZ02EFkXIm5Bq$=>({rmldYy)czAd~PLXb?CQ5@v884jI7oD!; zP<$^)tKy`ts(NdzJ^M1zL#JP*9(5FnQ+g4!nbny@^w9BEQP1z${~^cfcz&UClOn%) z@VPS?aysZ9uueZ`4D7nXduH+ZO4ivRw^UUaXXm;)L+qjjX2m3=HI#F8Ma=T;?B10?JZofy8~efLam~67KIDN(&BF%8z5Fl_WSENpb*(J%A0s$R!nQ zUI7u-MZ1WC4GM?Pg`hmY=khxW|XQwLI@;gK)Bb~ZzUEL8Q9e7T}GVt&FfL$jh8G^+wn(0 zhy4Iuc-Q>gW5nv?ZGkN=ZE4xb%gakZxdV#NeDlZi zw#tVceZSkf;3g__FQ_9L$vwc+02FKl;Ba5)y-PI3RLp`m3JOFCf;TUZ>CBlkM4g`- z@5CZ3kZswrg)8eqqPk?1vLSk8R3ZVz7vh0HBaEP*NuJL`L^wFsBSwycsiOvq2u7_3 zukvoW(fb#_SFXN_jol0OKjeVI2V}9Ss)H|jfSNkL@7qi3poFf0AX3-nvWt81GZkR> zqMFQkO+GUc&>5-+k)?uIL^j=ie}j00+#k=SKzJY$S2ut{R}pyd|KqlKbn0EJg`R7N zHx2qvy6I(Z-iVq$uzmEsy}h7I?{(%oIhhu>v@2GuISy#a&7P5wxi>m$0g>V`(XPw$ z6z(JW&W^NH8?UaemSgERswgR=m-k#6I%wNdvM$ZCou4SpX_rbjr5Tk|5MVjY@I4u7 zz?BEjo*hMjx+536ounHEv4Z#mbl^u!K0n?IJXcN&^rMw;d|2GQYn90?vB9_I=Cm&Qb#?91N-(7`7h@Y%Q3?nYB{Uz-D?`StoyW|S}w#5XnI`r4Goc5SFcB0FlzbUdKe3XEm`@V=w(06%VZy@m+mXM~#^C#{N4-a!ErWO_H6I_l$1i#;Y`7mG5 zEX3PeCjq6>58NrSIfz&J=O=K5PxzK$7UKN<$<;Ej)f|u(28-iw z-n?l9lGO-AnGtxvzMpk5qC;l}UO#O)`KK&|ym%2TGEqPW1c0VbD#=(jhSSH^{X~jC5u!u5EZ3T!Ne_YCklF-8l5R7*uedbJN zz9Q)lbv@T^-B0irMC0>-L-qp%t;NMf#nc+G>v!+ot@h;L;CS%x;jPORK~Znt(je87 z)=rMex;f0*I`RGGvKe z)Rd1u|7`7U%1zL(^F}KwDmJ6``rf-I3Aq+k@c!e+hf?MJ)ek_OE5=NC!I0 zqr++hEI$8~FHxRnXdX>BFd4Ybfnwfm+qOX_lGWE|1+Ke`RFzFW6^5SJoTBH? zrIYm%3w6@x=i;$o7kw*e!%K3Tn4nX~>$1)`4p8hI{w!4Ulw} z4kz#2xwG0Bn&Y5XyHlsbPBfDNcv)5JPx$^^`Xhu!Ta{N=Z*`j+y(ts(9=zjQ#4{zc z;8){2j&3e)Zc;IIC1}%)(sDN3Gd4CRd9q$=*N0+IhGr7YzRb!}OR`UZQL9wgpt->ArV5mWr?&acA=$b2~J_Rn8(ag*Y!9Hvgsh!Mlmzs@`j$f*C@*01l zCv;6XI#9hg6RS>oEaJp1zRnP&ePg8v_~%yfs47<*tSBh*(snDooYQy>+c6r59unfbAKyO>Z=k zbh~P6Yxl1NA%6jugJ~e-MR1`IYPu`Aw>vQH-Edu)1z*J5(bm2`^DZ z7%Bs|v6JpVz|PZE2f@!kRJw^AyE3HYB?;$A7dSXagV)3kgxcN*X1#p4DQSwJ1hC3r zua5nn*)lLLw?XJW6LF#fR|Poq0dPDu{|gdF|7?pv1+pKoz!Yi)dRcH_HG?^#3q7}; zp`Q{cmk;_ZSdt2?&J=2i@Wyr!YP*SI1Lo4OF+s(0F8M^To91wUBLU%z@eV06wFA*? zA%OeA44lC|hjHt1PB;PafZC$Lz8$bJ2QJcc6lNrbu14&Q;$UA!6yA(o28X7E;#F;Z2^*tAj zEjsgdKxT%qsWd?)X0qbcnhKRWHJkXTDjO+$QZBWnzt(H*1Q7%E^{RwKi1G^_tju6- zdM8N&T}BYASeu1c3*InwXe_o(-THfpdstm!-$s(B3j<;d$_Xlk98 z$Fc{j>pa}uj{!Cv)y<*7wzw{=xasz~)PiY(I966xCP5H|>d`+G|KcM=#K<-=I2r(| zE?TS_Kx1>3YAj9$# zezA50bwu+{CZ>B3+TQ5q)|;htqaQx1ok0%f5bV=2f~zD5)|$ESXRQ`lj=^!`l`D;0 zHS#P-j37P~mroalby|hrK5h2u+O>5?@@hkTdVm*CJ6UOH_V8#YH!Bpz?T$@Lqcut2 zg)fby9dJb0X<70yMSi$eamF=e==YeXrzglKo4mG?sWSh5S1m2Z_;nn^xfcJ(aKeP% z|1H=4Ac$lUj}$v|{cEQk?AzPv)U)YTPb3@|X2vD4ySRKFa9P?vyI1vq{yG+bU`h@h zI;-zQ`5vaSm#T>`o6LJ5U%&;2XD>nL``6coUK`2#4H&<5U{@?|B7|8W9xZSDd0 zMf6zUP7c*tcGtVYn&=+gU|Tq}ro-Vqnaum-yk*zhHVgjzmBKekNg=7O=CyhB+UxJ% z9)Sapu;%6e{*Dfd{n#;O@#hLkGLT8Y+Cc>sj(mwYy(1IzfNk^U&Gu~v*vppn*vc!0fC!AtJrjC@65nErz3hQt*buxjlicfso zrt^_k&`CF(%yh`1zHmQtc9J?LoOz{SUZArRw-_G2Geg_b|KP?9ZLau*J<+@G{iA1T zPa%ToYDIrhqQd&XZb!r$@FJZipXP4)%PmKbzfMV^0)_V%qF`eZUn8^J z?V#$FRaAQI)VP(Dl>Wgg2`g&a%rC+j^feR-ny{1kpNs4+M=Cs>L4ST^*7Z?%xIjK6 zjQXKj3hxj5A5m@Fb_TblW;4ck1#cohF`M{NX}y1JM|HENR!hO(a+HI0W@aY9 zv+2oajvX56>UY}OwBtSaBG+P)4@-Rb@Bx6N^Y4$an{W1MC!XQ@<#REw+eJ2>g@y8| z=at#1DKmS|;kfocX59qMe|)+vwYE#abLZDZHw+nOw@1$P3ck)0Q@eqm|BImiSZ<@O zZvDNDRsT9u3wuvs>Uo-yAU(RlB`BCx2CrdY?wI_aXI2ln7p8I9P z5b@PA64f$-E`SPZ@x6N#@s+m;K0Nzed#vTUb?dB#xrn_$ zJInibZCxoU4of@@dS$hgldICCVEy`AGyR@|MD{=5KySHNJ2j=hPU@dK|5}IiDooNdcd5&_16Y7> zpO|s=Y5KFk(v4()UUH-7*p{T&3fIEtm;M9}iuR5_f8p_@$s8OB;hl|Y7<$%R{ppjk zhQ_8seQJC~D&B>$F}~$4RvngHqJ4%D|u33vs%5}T4GCA+AIRU;|0G&KYdk4`+jG!;6NH^}z%S~ET-XJ_Zi;KIVf z-XA|&%y+Rb8AG_nJz+yAqaj53kDra(n^j|C?^+0R@%kY^QK2_sWY>m-hNfm$IziF1 z4-YXH_dlsIfp8;9zAmI{K>f>=<59`qV#SQXlF-o5e2qFz;Z24TIhgysC>(o6nKC=^ z$NdlO2orTp%~F%}sJJ+pHRZjQn@NA%;Xzmc7+y%Gb1oIsY?flwBy{8nZ{A!t*KFu{ z>iOimxT#sDHkvTf7q+h;yJ50jNBUC^rgxs=X`1-)V>5azm*rWX-_nt|_9iqz#uWFz zH#-Qkj5_8wjNFE|`|v5|_}`|&JI)q+uC}ez|A`E}bKTwW&|!aq3iLy#jJsG|eqL^L zT2GG!e_?KJZip1pVUpdhqN#Zob%b=k`1afZ6xeA#n|deKA-9Lx$v$$iw=|M09V2Es zt861)ykLV13(j;}Mn>{Lnf~v9aXc^}3*VhNje_<89x1jxh(y@qFJ)>Ip9_WHam{!B z+ruchfWalEe8L+W$M$awDJj0C@~8TBru<;}ecOprZT==+|9Ue%?@+^!$(M_??2d=5Y`J#k*=rZaps zy8I}E+`H-N30D}pFv*xY-T7r%F*O}~O_7xFurT4k?+?BwTXDS!Yvy2QcQ*1tUUj8} z$>VRjP*+zkF+BDX8iYyuMXKb8P2cKWR}^;vK`9kB&n#cQrkN+lJm2(iPPex`BcR`jtzyDGXz&#c+d>QZ^mj?G zp;_Q62L}hh7rV*s<{Lc88YA?MA}R8<*be}z9Q*cdAOdE~mecSUudqb=CTyh4UOqll zdfMK9W-t6`QPA%Xgls_(wlmecaAE(8*)Yk{uzz5{8g(&8?@K=8Ggy!UwxN^tcj<;s z2KDl($et^%Q0>9@d!zkx$;W&I+SAV_>7vQ!Wfi}iWm{>>8&F;nYc}Pxo8E{e(Q(Iv$z5gRNERO5} ztL&LGgfX7z0s;c0LC)}Spf*Lb0x!`*Xg+l0h!i|zgjzcAwT-tVB_Y8kmrMa}LD&M< z0*-8qs?WQuHN5aFLvM*vL9f=74?`VoL$5Gj0ej2CY@z1?Hts}#f?wFL1AA4Nly$`! z3W#o{v@q8LD!43(vJa~mc?`@fP8 zK`#?lXNWfdwc}enmSe%+kF% zRBpf5H%H3&h%Z;UyuUH)5e`~0g4Muxpntf5iUAjg@WyY18UM%;`$hKw2+&>(6kE2~ zZsB5)9rr<66%>5Do_~okq-tMqhm+_~uQR)JUaJe5BP8TVnWQ73a(C|DMH8*PHVXL9 zW$o|lD*=HK>r?J_iguQYGCO~LM9l$%hh5jrT&waj_ypoPd)yQAGR}sdKH1r&`vfgt zynKRh!qxk0L1)8hvStKgV~@KQ7PZQ6iC7ym6_&NPmseU4slP5qV^%nnb?X*cct87W zTJn$tn2E)kPl(vs7gKl0i$Cx0Y{J0I0-9~bCrgRB0CE6NaAS|WG$X_hL|X;-I%>l5FkLBb#%EwZ0=*S^aQ~~h>FI~HS_1PY1O>H< zHpsSpIZW>RGyEaz~CQjY5^rv-n6 zES+3V=m)Y203<_#smae-1wdY{>3?%^?3}UUn34@;{s6x-tG( z$EF(~yurwe=%ujhS?y0Y$akzUyORl|5fT1sGv=}WLhZmp4)$UFSBF*Fn2gaK>v6NF zAEKY$21Ybl)F5-l*y88cD1yFpcFu9Ha2;-SmH*bRUl>~q2hu)%s}5gmFtC)@&GcXk z5!LsYy-)zRyjFp;ZMreh#G^MO+JjkbaOYRQJbO>fdc25NjJ%~7zrIIw^;Z8wbf?I2 z0@=?KejH;8oK_dBxBLEi*IyI)mXg}rP7nd^L!AH>4Nssg?@Q5-Q?N+80&!} z=3i1D{IoK_K0%P~*a3G}wK0GcL8O8&AjXC`IVt`d8_Fn9NL0^Dla-eCkizRiwz?l4 zz8Ot5Al9O_6EeCx9Y=*rnv|5(U~vniYTw{sS&aW|-@g6+{re>%3G>Ga_m5hpcGY(i z;^49iIt@+3 zbD?*$3#T{aAO#H7*RhJHYlq`4&Il z1UI7G$TDO~liz&z?l=~$>L7P)&ocZSWzWUjo~0DQX`y(@3Do|IATKX1?8E}E-J}b{ z`V~Ir)kA(EfN_U?typqcgL$UnuZr!ov-BXf%fUHK!dFI&U=UIPOoMQ59K*x}F+fD< z0K^-8`t;L8y0jHNE$vOa!F@WCpZ1N{zFUaU7q zfuHc%85%&2J}^psko{>uR^3~e_xkO`3-=N&6B8$?QXVrXj3SP29-s0mat5(l4hz5` zkg5j}N}TZ3cXV!JXScfzTxUB}zn?J9`ObHH8Hi$fqOYZREi(t&>>2F$hTj|@U5#db z*7Z3RFGp%+nuo%K5Rv0N6%Fs?__)jq)V9A~c(32f-H}~9q&`TSj;?T~8xx}e6!4v6 zo~9gxUpbLB-w`>AAVDE45jwGUvPOsJ@)$whhE`j&zAHEDhBtdB?jx9-iYhF7=(;c* zEMOUxYXfIXe?vM3shs9uE) z+_~3#XBntn!rX_M#_gEUq0z~1ID#rzlz#CH-6D0Di^57A8&{0f2|=;Wm4mzO_mwbKgoqP85d=Y43n)k*N=v2o9XN1LWIRWT7*{Bm`ncN&A4qHc?RgE0A^0ZYn{I43P|qt2Axz-u*=;I4_;ushnx zVM=#+wBAa%!*9`tf;etb=1sjDBV8Y)a5Ns&2y_Va%DM)>o=(6S1R8?gMOM;=TyoNbY>9q9p1KVA* z>8+gRY=Z*=EKYWW1;uB;Bbn6dn3eH6C~MyJgC&VOrZ2*+*e}5eV3hsH5qZLS0Nwx* zhOL1yJ~blro{73V)MTc6K-2dlX$Hz)IkbzTFz*r8G}uJ$-`~UPHp)xn&dFib=-s=l z!o$P;BSoC{GnoJKUs_t)-Nc7BiYh5NdB>@h z$=eGnziJ5|b~&*n03!!zxc2TnO;i`7rq>tx;5Vd|iK**U7=Q4}hR~pmfOm|bgK&j~ z-jb_$i@|#$uabPBM^?3?u_f&RYoIrm4j0fm35&LjDr0@U+vfjz0lESHrN+YJUfloC z&E~oA-uP2c1*_ZV#9|o5Fd|oHYyi^&*^NWo+~dlTc$LfDzx7Ep{tR5(VemGe^1qKr zL)g{$Ox4rxLBC`<_tydAhBralgW#z%cOzz0%yT;H5fEJ?EV-S}=8C$d8&@&6O^k{C zDGxB~gT5?-BwGIZLQ)wbzt-lSZ(A(rm(liYC1Pxi$dl8dtk7oY0WIjkA&pzHKM+xO zs@k?6_>)Llghoi<3#dT%Fn>x$0!Xo`=E^1}y3Q&o$wD9kE3L_Q8&q<2f;#7`xH$Hc zC!5UNTwH_*Iyy!+xDU7BjHIBVuD$^zBhdI3fQmB0-3h^m5|a%I$rBgR#8gA96_P;f0LcUkqLWBf%8kXf83vipV7;8WSh%T>b zTzFkia(34TIBtkAT|6NB|2b^J7k?yZnHcdM{l?3D%99z6UD>42rsdHFhDB_h8Kns!Xro2)0^)N zOOTTS0jH&9Wcpy#EXVX+Fi^9TKw&#j<_BQEx2S^z8pV!ZI`f+fIQsuGWJB6>{P?@h zWuWu}#Bdv-++mDE;__vVJ2YCwo?@g7!iPcj{U0BONb~>pppDoani_7DnXz&Im=wWr z+yOjFoAK!BR4n~-InU=@ot#bP&xHn{Bw=6!Tl)UUAJHD`ck&K<3JI0fR-p82Uo7Rb*`3#H1{WGmQGAtx%@4w@T zm4C=@)=+5nqMOZqBJz!8y?4f-OR>JoNr0*OXAvQM^Kf*k8K#eiO$c0m;{b;MVN1M& zEGIhiRf^~fG2lS}bPN*pq zZ)(mgpDV)l=ritt|H)x#7AWNaHFdB_LhD%d4w36WC8)(04E+zq$J(56!=0EpEavH_ z#>0W6a`r5F)u3G)un9|&l2k|HYIE~adn70&1ptK%IJjJUZf>q@Z;v1;qj@*OonHqw z)6`5Wf4gFEeRlW)==o?M{-hzMQ3dZbn_kHzm%!b^^XbXuNr21eVpSpFr@M}$vg{*K zd0i#9KL$(ur=y*AR3=xm6V*9~fTWLAYiel7Z1=l^x!HYjxUE3aH{D8`q54>Q7M8KE zjkXG6KOFV^eTvbuZ@7WVU@oA95xvNUhu@BLw=TiosEkJWVi%m^4{=_`mt0GstAe$; zHCiL~u+lumq^^szvoah#uwr^$OWRtUS>9iemk~PWiMf&uHyF5ewXPOrWbh?z4Ax7G zi}N8o$`7lq5N0`H97q6N_<>@43=-?TVlmQJI1hF8I{EjWI1yq}^Yje*s8{No#L6ft zC0A%2QT;wsIR@NLc#_}%`Utq5X5B4L>?JUdTY3j$cf+^h*1mdq%z`=0{uc)Or=v1Lp2Xz zULPLLIt1I-0=yzf3z&6sR@czrPk07r&>pxQVbCi_DWirH8fB{oPPNmRVbe&~-mfU4 z!uI6659~VZJUrAGaJ;LLbOu$3I5`2mpRk?)MihyW4x%-NAcJEof)1<2m2`Hpz#L>g z$&cqWdnWF|gatO%)wF_Kywgc;hBnz7>a zHsZJo7`3rYsWOuf&*%3L)=OgcZ>PTVI(RaPQ!AkR_`t)nf(h1toiCMFj-vxCO?(%b zJb`m8hygbcHZhoq3Fk5RhzvN)?2)X_IfZVt55bwa?0Mp&HaBQ^fSxFlaH@)$Xh{g0(tZlJ|=L!4|KT?#;Tqx_1P9fbTcj%mbJ~b2LolKVB&lA^QS4IkDiH1 zPDylX1DAHjS$741_0Bm8e+jaeAccf+szz*le28S!9-wh>i7~i|lg<&~kD@WqrHX;B zDr6dnIf+Uy#Ao13(&o~?sH`l3HZcYbe~2!3Jd9pU=vHd#egHqegbBlT>QhaGKzoNl zF($&(N1fE*;C=~Pj|%Kr;94H!=Zk=By=OcKVGjOhk1$Wm-0A3zo6}|VJJ6};E zFnsjd&%C9et<6^7qfO3Dr@wLxo8*ByXYwxr8d{_c4v6%uxt-^6G)Lj|ry~RX{Zb%> zX222T=E((|jD6>NyB#fjETG#%b3a-QSY5?j`Z|h2{fS#`Y5C{iHyP_HjKE0@633qefJ`)nK`dCW;n@W_@z(3NCvPnR z>GP*ApFVv6)j)K-d^n>Drex4ZMqmtabi!?zGvMP+GjDpmNr8npYU-cH9_xWcyQD+{tQiFsoapv1>f>AuG>9DFPKi69qWTDS*mk(_ zaD1DxmXLt=Q2LF?iDi|*ZWSZk_ z9Af^AVDRqWzah}&ydIiB;=BXVmQJEw>jmb0k2JU~RL)_udAs{U&RntflC7oGNe4X^ z4{9$=Y>*`6I%K$)q={!^NOQ^|uHn*nTc-SZYEV=STst|$KpVm=ObO#nzDN8? z;tUI*(#g*!Y7L=C0ALm-C6#G4yxlQf1Q7yrKt%BJm>YkX4oIyteT6+zhf)3nj1wMB zeJfE1WAV>$1J5X^Q2;Iih;o(M=VCR}-@kuX#UTRTK0fsrnu24*7lt-dz@>c;&c6AQ zM`0Wv8(Rl|VPZzcBlHGm4}?6BiHX8XrX{(etxbIU_CBg};jb?u`$FZ+)>al3Gcj?m ziroZ9oG$_x86qIhaZC<-#l&AhD7_~Bx$8ZgRkXU$AB>tQgF7KIESUsm)pq_G92ii} zcN{y!$M*!7^|oGx`UgWZDKeh6X(b2D0Jjh+?(r1HML85~ep#!n6IIx-L-;=i93@|PtqHArNy{Pgl~^Gd z{H`2hG{w;Bh8qNRpFgO@Z83P>>z!s$%yMMH+Ji>yHI~ljW^O*zY>KLhk8sx2mC$1A z?xGn~QXThE3xjtj?eY^6D!<=)_$5rQyXZts1M_NCooCN^ue8iaAJ0^wwu%W8JYqDu zA~`v^Xy6R!_PovHmd1R0FDKW5D6N9zVqwnSYl|UqF1@@)^IoIqc1?cyecP9yIZe37 zMv$|$WPRyx`xww+m6F#y&k7}{U01MGWj1ue;zhbs$CIZ|&7FF$BHo7Evs1tQ9-ED9 zHbL3MDxQm1dg17Bf$`eW5wmk32o9e-849-EMf~E{xKm`X@giLXfbNk3*T9)Nx!=NN zaRDvcc~aRP2HHA0CDGHQpCCf`s&!OUPJ<_d6%zQxMZ(odpOx!8rOs&f8( zK&$)km%06Wb1Yp$&hC4qnrI5#V{&ly8CQOh$JM9tLQ5ert0hm?jIN1nTh+JE2<{#O zdwH0jzu98V^rP0uCE!<5*hfi~&S7~U04M~>NV+hVo;CBFY@ zZ2PcCvI6SW?9aN}P)#mrYI>)ArnPt(cdR2@`JFC#+>gzvS;APrsY*hEPz@dJp5M0=OZShAA^3hvp zq-7sJ<^iPe9?ZDbLPhYl7nYz=_TOqd=IE5?I{Uiwhws^Eum2pF=D8w>Q%Z>0Yy!~# zUiooqLj7dK4#aj!zxI>!n@AcBzFMyn6KQ`@JWWa=bDOvXvmfY*vcu9xx2Q#e*Xej2 zETrlwwfyV^M3Jw_Is)l@Iv(+v59DH-hznWsu9L_om%N zg-3=P`XH_lXR|?^BRsyu_y}5!Z#6uhtB%+>Ic+A{7NtN(Bcw!_z|pg5q*8C&wvmL8 zzbN*jzyGp*1nLe^3vskf0Nxjl155t_^&e-F=3QS$+nOvwvQ<1Hk6}2>#NO0SmVu&F z+P>iircYiXXD)ziCN>=jMCSTq_TSGF^AROp^IHuIsTK4Joa=_!l41cMHozn>z9tMg zjNtc(P7G&Cz@&}srhJH=zg}-6V;Jfa~ zrf=fkw1|=NxbshLd998ZEMT6`hiJ{<5;z_q^5*dJ!`P3HEUmkrmRuHu)VFRDh{#Ww>na8RP7R!0f*E}u3@N_+;@VQKu^2dH|K+W~&xUss z88RT+K#gNc;9Sz0_~p;TjUe$ofT=1uWJhi6?MsRJk1lDikPwFBK9``UX3~8QW(d_3 zY4$V29Xb%p>vKHf8i85@KXm_Ib0W_1BB&AwyuReb6cwp)Ik@}LWNi&xVVi80w|2H# z%I({ZqgHkh6G-~06^KL$X$*=N2>!3q-a8)aH+&nvB~)ZIY-N;`T}GKHMTL?=WJgA3 zRzf6FL|Q~cDJq0)vR6ez_6{kMJtO%YSL5@%p4aR7neYi;5jtp7O$x_UFjsa2=<_ z8g=#c`$r4yY`9xS;?HoEwJ0@z7}AWES`I{6AFd8KbqHvKYb*O+rKvNu(J(sw`Ps20$WefjZ~; z6P=JRgM%U1{D7^9dI1n6$?6>(90ID>yu0DhRoEd?fOUFyW;hUyfrd34)AjZBpOCW> z6ElEQEHKofWdxh|?sG$Amkq9TMT@`WQ8JNEKS+%U*#jdZ;ZWC6Q$D-wfaxOt^Pp3C zOwfQZ#noD$UfV<52O-PwueDA}|AmreH{^xH!6D{7y|Qi5&+!9k&tX+b8SNU_w-jCn z+B%*&(Q)%U6hOLfe+_IB6zltrpzav)%3$Gw;sE_^>~2v*R(=s|z26xWzMF1^R( zMZ%712ga~z>XUOJqMAPnDwBMsTTYU;YAVWarG3TN6w)Ya9b&c{Ko#v4_KPvj)Wqi%E@?s9?c;O zB9U>0?CEKhebqB3 z&=B8n{dLkfGWH1Q;L7^8*WLf#=iyqknq}pBr8|fc9XZYcfbZByu8fMi!En8Qx=*TP zo3NOeARr2WiR9dmnR3n&UrxW@K+O8%8q22ak#BG6*8Hy=Hh#`Hy{T$M7b(PKvqgA> zD*uB(dbY#%_Q@znNP)Ef7XAJeGqA}}2h6|4DA%Rp%OGe6`&Cp_fafu3TUz$BpEjycXRvP91oxoaMey+ zDIm|iP|75Lt%7(GhZ4OG-U%w`;o~OsBOA}x>635!O3+41KceQwfRdf)H#`Kwg}eBu zgJvU$dn?x|L=ikwZeGg{jP@s}+Us*qpS;LsWtl`HoX*kC>W$14d7%2^!?j2Zpn~jr zdO1_5^jUd)c6O&%i0{IbUg9JeONklq>%0{FYRf_i-TF1zFh;OJWCSj)hLwg}PqJ#b zGzfo5%TzS{x(PMY+dDh1qanIaEK&z3t0HVnGNAk%lfIS69b-`Fof`!Qy=yq|_QS5| z(IFx9p+m5;0FCcn+4%+4sWrAMx!CdP>3Ebx-|7;WeBcqG>mQAhB3jmQ9a(3H95i%v zb$F5eud5u8vgbUT1oZQES{v{~^0-NXSA(qy2#Bj#wBh9jLc=XM9g&a1fwm9gbw%7E z{Tg|nIoFtx*FgJKQOT$8H-UBN0=kvD1LO(YcfM@dvVf90)3C7M*NGJFlQZ+^=Gx#? zC&&$geg>X`)lk56mY&{O4N?76KguC1tN4b~NVQR-B-#rK3bu+i)xO|q@p#*DKbU)j zF6?vS$bwD(Ote7PZI76jFBQD-lq%l8LjGc8w6T)iBI#%hjG$(@1d!sBEe6$qOMfPD z0s@bKAXnIXMYru*U1xK$rg)lKU3$uwN24UEsI0t(BQrNYUk8X3033gUdQ3=b8tJKZ z?XLDZ2p}B^^K0CK_KuFtA|j!{*Hy87W#k`x*7y-NxdVq}0;yqfI+C9P#C#ApB@V(u zXD-sCoS@%C!j~EVKY>5RdnU18>p&kD$h;=XQ&%@PcDogps~+ZUQbLp{{rLC*@!mqJ zW=`afk`}Zm$OgSQEJ7tKIUzM*C6-#GLxt3V6--_NQNvj17oD-O@$={F@MDe72u?;? zFvPG*?Bn-P><0@Ru*fHfCK7tla;qmBEoyFpfkF#K8QCzyNFoLOk5 zl06@k6U}*U!p5H6G=$DZ%tVa6$M(GHbJ5egk`{m1Av5-oBEJ3X{ly>aiEJH#vIKQW znnQ;iSaGo^0!Y$3hP_Ul3wH?DkYKbKKqj$497WU=0EyXWZn6Y$TR5>QB4j)W$+7be z=7^*gz%@gC!z%nn*^&E*(c`e8O-icz4W~r#nfEEe-0_&=g_t8-_CT8l^9;L8_0@QP z;xLH?LI8n=lqa98aOH!Ca#15p5EKrA?juMdpHB5vPa z4(||rs2L>Bp6EImd|s<&%S+oCRuqW6?YPP^J0;q$C1XRaI!HvB2a~MfQCGGLO%hK(-bT#kkgc~ z9>3s4jmNp~-zsN;VgmV61-_c|=qDBOkdaU2V99)lQ)5EY{vnL+NC(Ko;4SX$TVePx zBN94+&2k4yS7N)3qliKw3_{#HXwidFT*2alttrdFeq;0C6SN|4aU!Y%X&~N!ggFYP zWn}$(7St1P3f>KZBjGN5%PwQLGbRfJ{8c{$Z{jkKKFoHG4u-Lc`I?ttZ!$glT9P1~H4>7XUsAtY4O31(xk*QoH~!UOqv=%7&vSLNgDe z0IvX#i+lxeT~@)|gTMs@S0L^Bt+#9NW8bwld)U4E2vma5AV?-xJap;1IAAaLPergF zfbDHgem==2`s<&rmh%`E=>+%UQ+IdmorV)wvfKcZf4j*O(*$I5Ko^~0I{}|NDrsqH zCDo?GYi-m!Qa0McPbUv`*OO~ z&J$TE@$A4OCSJ|NC<%wxaU;u0efr0`iNqBL6cQ%bmz5#K1X(2v6_a_(3rn&#+S{Y0 z%d7N5`bN)R(^TP)h{e+(?oI%g(3@l23B@s*ti^CFJC8aC)(1;WyvJyWFSP4W>soMR zU_Ds;*R6qo2gEqq*?H`4k{l|;d<_r|aISe;gA87@vhl3vYz_ zDDt6hplRiVxC>+-L>wwO=?Egp@3Nw9$QI`2^xY!^uL1Q5kwULaH5TO%VZEIjr`I3*VOI_VU^b#?C* z&OoH$598x2ML@YLA>|BaACN16HXGu@lPQ2svbLbJ2A0_{WKo}DfHo{K$nSU3Utrp(E=d) z?Q%im=%K#%w|Do5V}17G#Wes?ngDgA7eIm$M@f4LaOSJJy6Y5X%H`nT zSODd9U^EP%xO@z2<5~o=0Yv>HIy$}I1SN1*mOxWA0FGA%oR^{P4)2HO!6Phh9bBXk zScN}L;tmNt!D5nvpCtj<0hDRFqEiE5tGnCk;U_Q;1G2qlJrv6%$6Lv<^#aHOZ^y$p zwgpjsW7z+HQT~3QyBWva;q@}qRdgR6#?1l(0e~$b#cPG%7*#CbtLylTeQ~uP;O(;; zs5elnkt1i3KLdZSLt7l)0i?tK1ihQj!^2vzOJ$yr`+q?C_n~?XIhKofyM~=zoir&6 zMk-*7{Te9Gw*u=hcV?Em3TF-{1;nCX0mCX)AWRz~t8G98SZV9wvrr=S{(lVdCo1vX z02y<5($~rATuZCgZskp3-n4h0a#dl%Cpc+RZCHs z9Q$zeY2frxi^hvJD&|S_c0N!uDeOedmZA5~M~Vs%gA@+;(DOGyr{4z)!WD0D+Pbqz8$6g79>ld)Stz~?;NSm$c zh?);w!Yk_(qfr#KesXVWTCXty|J)7{#m$>9Q9fX=z5UqR(<6kbCJsB|RZgnS1Zx0ie2YcRK2)J3 zjlb_R%>n1?5U-hGP4FE-C;ItQ2=W=icWHfL8PY&mRT-senLM0FgZvMbAdrnVZ{vhI z;-X@ejpy4<)CB0lno4m}QScVz&{I`i+M4Yc4wxr#9?}YL8#?5Yhe~IBw6qur)wF0= zD_(Kv@ZlvC;9$hbyr}E!WWPTe93k0gp4=O0Qu#l_`+*Iur(Il_A)BN$!*P`I2^ox3 z^FCpX?k)}6=mbwarhxYIJ5*5HDVL<7u3Zu*^5V9Ml3lrVq{i=1$IG0a5v@zwAf{z zYFYC1i0x4a1X_}FA_a zH7RkH8~O-v`wSkd!C`#cw)D<%O4ZEn-P4gzgM78Pe=x{oIUrA9!%xBScWJo7_%gq? zy1l?^{$*RFNPmeAC2>84_LWpIXNPm?fV1{=;fChttPM@Wd=8SAV?VE5ya)eL$fj`P z`(dc!pi=y0l77oY06=$&8eNz&tTCsFFPfMr zz$-7$rM&oa8$tE%-xvSl0Voy4K3s^Hak(h9P-^huP7;MEB-J36K`ZftK3K9c8nkct zJrK|w%pt%9(5_t~=>f53f%Q4Oc>o@j@9+a>nlQ&l07}YRjD9L15>04hh=CHsft!S5 z{In9vKw}|NN?gA=%2Gnn@Az5D{bmUcYzlK%{{I2wcRE{WeE?~WO!hGdijba|gHQtQ zeUNdA>{;WevJ5P2s}PP>{+g~+o1t+98U#Ah-&Rj5s@ch*Ha4<%NDrIBE@4WsdUxj% z(oZyWe5sOV9y~=&Z9sEoC{09dw!>U5(p@LJ?AR5X?1EpWZ(JV8K(~Mn2sG2_uD3P5 zjQ;!{Hhi)2drGCZ*0=dTPh7t2?c0@jhEQg$I%s|qd;r2F#BuFRv{UF&p{CmT+xZnT zL_|SSMxb963ew0!bo;QUzO0@Da0!Y8Qiom?;b=vbqN!E>{!yy#aUgA2sUH#!t|yBb z#-OC``0SD!V)tIZ%}I}E0P&e{aRA5!bSQw0g%(E%p8VCjcduYEwZA;G8f>Og)R&}J zg_a5IIt{$9{HY)Dlv&`S1i=%L2*U>sVm{p&^x%e7Pa}ihgG^VJUN@$*$yy3KED%Og z>tjGA*@^9grBqYsK^08@7QGiJY?tDtK$N%Tujl4wxVgW=e@L+B%aLG z12l4dklDD@K=f&YEhRgk{hfmje+1zmfcd`#=?uxUp*UDV_{a!(WUK)Qxy8s+F)RyT zq{w0+`)OOZh+byCBzFhXl@^n?V>@irx!5g4Ltqj|Z~zprw;vFVWL@O5v~}7 zJkxdHBMo6+J5X8J8&)gZ=9GbEP6!=2IXQ9@&}K`rUx(Zc1Khws?<~U9B{bHsM;$Xi zWA4+;4Omslzi4S_jy*OE+hQInsmHumi;a~PhAfw7L>F0ESub~mm)7$xL0*qY zKK3ROW>CZmOhHBH(Z#?(fRIoSPq#byl?pk!Ds7EGOcW1NAxj z=slAg;NoaygNw#4`pTl|4$b@Jx?`lbfQLyK@!WZA5YgmGSOcohVx)?=0WH_!JsOHJw737eTLjXb4aM&P!WnQ;#cv1$o zqJ-#;Z=fO;X#v7eKj>ZPDw2UQl2^Bb;pmON>vouG0fnr2GYg9*fAsOlcr8sX@KHA(EGtHQB^qbNNFw7|34k=|x@4 zmVF^DU#EKeR_j2xAeHB?7zFEn3vC|gA<+9qAp9B|r06E%6VFA_1c{vS@@i!WqW5Kq2&h~iO^!v$T1(CLpGLkW+MI=L**Z-7As7d`t4Os^z6P1a=>e$ZSo_HPCRO> zc~HEV9bb;o5^xxV5e#csPvY!(8v3NYpK+l+M4C$&)7Xry?Iu&dQ+6z1G-lF=HUc;V z@*^`-6gTAlNV&O<4me9@^!}4r>?FX@GO(N8`i1-S5cERb(+8DN6r+z7P&Qu@;SIS! zT0T!~_xqY{-q2;)(xR6K z76|QaPunTYE9N7<$S&WXc?}dXP1irT+@DhF7>oaQ_VXK+m6c_~Y=!TcrAPgy9dN|= z_;hd@&hlI^RipR%=FrT2 z-0fD4u5v~NRI+CE);=XU*gxsj&EHv;e09m?MjISShWUqfa0l>bm)v$M)8n3^6v_J% zE7tnyvpUVM62O(w!7Jr-_T6DK z2X9cx;mi|5Wy@!Rt&5&X`3qtYtD~diNHO4@9GcT&-QmK&Z<%iTt%PUK_H)xX>=3=_ zWWvt#yw2>kttMl&vx4l(CzrY!d+l?h0yC_}S@%|)BpO zvolylZi+5E`0g`H=UG&O9O!|*{boAo_6}@~01z=K^=FnKz6Y)^dUwa0MeD_=r9;g< zL<=vq0Q$H}(S!#sR`*7M0XDYaPSs}`mF^wZ`{!5@o2W- z9LS!r1Z=H)K-Oni6 z7n*g0{NKf^uhYkGTKD}iz21#yN4EUB`-c5AD_!=nwi8mEm@zMof=6snorC^b)2~(S+AKHv}w!4&QKu8CfngLCLJxw{tZ+wx} zM$LywKPoMrk0EbW*jG?QK}oOqNR|`~b+Gx;d!@U#YYS0JC{J%y+?%1`yY!oK*6GjN zpBGxN8CIQ)uTm=Y4J`4ne4KH-XbKG_nI{)+^@er zA!aN3_x&wj!n!ithP1fToG#$UM`|07|w~yVze(B#!H%P?R zk)!@}%O>m{mxH*_It~t!G_qyh`g^Nu{@#P{4xkZmb8>)ALwc-m0=-?(>Ei0?<3EOC z@1FeM8`;SH=Y~sGen0K*>WQa{sPOiUla;F{vR~50s5kg?d-a9?E&|9YqR+bK^jWOq zdH4JBnvE{~dAt@inHOri!^GlmqoAq2pNfo!@d`sY9D>l{#{Mw+@4Z%c|M~vxc1DPy zFy#bI0Uomz^QEFV9ABFJc00Apyc!Rb1fT*$1n}+zl(gX&YG4dkhZ47HP=AV7aXee%gqg_aZ*Bekh1{F|J_B}( ztmbI>_Rb@lr{fQ#WkPwAX{(+On#FleJ-cK zH0P=we?(4f#ou+d=I`~epI&Pwsi}6p8)+o8Jgg)%zJbqZ#tP4-wG0r26D@v-0cj6o zDO~^WbCNGv?tJ;&)Du+^%qwyJynU0pmN~_4?goGwl(acd{(e$R`Ja6$S=lOA=jZ8D z;&fMw4htK!EZrcyM`3O`?A#E%haa+TBi}kLpYre8EWSWTlFW)wYjqCC4`kX$^Y+H2 z$)AJe88L^)4X<%PG=Tf4?tAcJ*fOAQVr7naJMs`GAkK;%cN`F`2tK8GxCr?uMuti4 zJGKNwnO7%X$m{9?K0O+(%AdBQ<0j~kho7FhmM2;HZ{Oltr0>;QXK+krFoRNs8Vr{ZZWjXBKr-_3IN` zXMgmT53`lr;PUF}l10-<&7{Lx1+flc(@VMB;T@RS= z>js^8y?88YHvZdC?5FQSy_T=@xH)=nMZ{*EZ!vNkQDLLD zHsAS3noG)>8T1Z9@WsHM+&sA?Mr1yis>#4WU($;glKRBoIG}_AuPfTnz^|HW8|lwz z22|`~KGw`gNlS`nmpsKen$ECm4pSL69TQO-gb`85>1p}ZPckx%bawgGUMr}rn*OLs z9XlPB^&ld}F-$LiSt7c=@H`$A+5cdvS8ox>H zdqWk+F6FH&Q|T94GVaq0biq~;{?0bjx0&aHn5Ed>tQuc&e_Qu9zDXOy`&^a7{C^`M zuw${X8a{`)<0>lt>IH-84o;EPODy6`EFXx}nYtPYXltrvk3Tu$p1rkTe@Wv_#?p!S5>GyThrts!MitHG zjChw0*xwC(@$;VZ1?CNGN{gjm4QDmzyEtz7yL6{xJes)DdbsX=Sv`y#sO64VP#UY> z-}r`8^t}}Cu==5&NZw`CB)z=68h7xwkLRM&j)^-EbNT-L`|Rw_NPKFo3HEvK%oh%r zIHbR&5xC%&USj%t{yEIpU>}KRfy^Ea@{o~CW>0j@>&5K?wH2`l#7w@VqiOwKp#f zy-@t3FL=M1)Jd|LKD_Si*QjLQW;ybV7?ENZ;vJkXw*7oNa^)`PtQhwI*_nfeyaf6h!qpi^lK!A)#y*zRR- z2=zTJCA5y4`}+sX%9EA`0IfU00@=sd_$(MlE5O7N0j?Wkn=KVAv81+9$xW&NUdQi> zLzt~)c+|lt6bX$^)|4^9*gc=WJl>$*sJ)fRpduRM7vy# z1ak9xj&29-f}ks6VgQ!e*3-X-ZSL6OC7_e?%6SqC*GA8kch*~!ilPSpE=gBuD9Y&Y zJE9__C4#+vk*%SAz!ktVidyF!@7&{Ih=|zOW|$m;$~j!8#MUsR;&mU+Zkk6E zMTA6;Uw#)7i!Es3eiS_$bZF0f$&OUY>7ud3yzpT)Rr;Dv!U<>vlC0^}@p)e&W` z<_!I}6eSy5;T}zt!Jt^%x*l^AeSWOzia6CtkgzygqE}Q$#3T1TW4Hr4?WrUAZoV#x5p*W-b`VC_Ecvu68pqwa z^(3yQOaa2i*t=PIUUYttp~m42g05-aMuy zb)VcccW@fYfC7Py$k-K^lRxfW;b>*D~K-tn+?M%iZmL@d^AF>!K7S5ts!$YFyMOo)Ww8^1WzYx zFH@m*+_CO2m29s_9#)fy3k8V0GF|wM#=#HJ!^R<}pn#J^+C+dSLHLU9z&CHYM&0$_ zA=9B)Z<~3HVwiId=sR`+p~|VL2>?rk733EkDvi_x#$XXS+!4fHo@)z0C;gl@_%Vz(n>@Ij4~)E%r1DlkhUCJov`ty zP*8)D7x3{>p&P$SZ4-uu6t}gtRb*oOVMB`|K7)eED=bV;OvF-bp+#AhU_p1oCme$6ZE~i0gJ(Gf{}tUWH09MfPrl; z(<8KX>&J@B!U(KW&V(3GeRUPScLfMZP9dI~52KfM%=j+ou9j6lpyH%ahS7j`ytZBmOPJG(>go7DH zCWvyk7gEnocz$JOA;ydtojUd{7hD^RIixzo zsw+Rw08UMyEaf;Q2v=iTBB552$>dM+q$-HfLu%V_{jbk6$@aGW9%Ue}Q1h3pVJ>J!4!)HHqY=D zB=hMnkQO@NNvMuiwu=3i(u=-B-;c1;$oN7+K?du3Zh9yLPnLMF^+WvE-ahM8sZH#2 z5N4n)SRac{GjWN*=(UgL(+_~yh?x|&o4>Ky+-h+4_>k7nLEo;Z&3spr4?jJA{CfWC zbL))6Vfu;i6(wP|gc1v|kj$0==9&sc0&xOEwg87VA)w|LF}Q4d=Ap+Kxm*5}itHBe zVDL}$!(@UeqLMkZ6{F}C5PBPqAwrWQLjj>4>117f1GgQcjmTh4xD64u$Yt^~kaspT zm}6C^fc4dI)HG?&*z|NIG{&h|VPq|$^dBi&R6?Ik0wy2`RTk*vVRC5r?!N!Boi8rn zckaPVaB0L0A?IWYJuo@BXmh%njCs){9ye;F6D=u!Z1uCA=`3} z{2zw0l9tco!)7?Xtm4ML-=wCXiAGlX2ZSZUfRm75CNe7IoE61&@Vvvphl$~r%Pum7 z^ex+TSfu*>|43`UCB3@mKY98wlx8JB_^Bw6*NQBFiou%w7zQF3MTEx!4k!-}a;UEq z(1$zfxXAKtbA&pkS_c9(H$!uuB$L3JF?o(S;w3iic%i8_J)pMUr#@++ruJ92bzxo> zH3h|G6u4oibGnCz!;pQ2vP&)jWjNcgX>P7?oBizKP{$dk)n9+mjixXiyU4VU)=;Uq z`9qrKYTN5hfih)g%cifc+12)-?phG{1{Z5zUOCEMbJJG}?4G|}>p3-S+qHXS*z10W z&)P7@7Sz@-QM&-A6jKC(QBQ@kXJv)0Tx{skw?z+f8CG43ebig@9F7z^zbPEdHEuL95)x*7jQ0!m!6GE-qob&5`0c{0De<9v7#pAFijr`dseoniq?Uc-Ia7Eyx`1IMcRgu*jL5PmPINo5bgzJP{S<|M6 z(g(T18yFWp_GLnpzLDbHCwvXwcxWwlUY+26qUjUKamAO_W|3V(dBv@R7+DA|#H9-J z2!IIAa(55It%uwwWJ@gw!5`dIKhDtUWSQQ0VR_<&I!2OYWM*E%l$(?HeRL_Wz}(uN zB*!pwmP=!it44<1reF_kr|$0MnT}kxhGEn0TR+aHnpV2p|DIpt6eeC07EUf0D^1YH{lu}Hu7g5#2BQski8hvel0mx6f_A8*V+xsKYc9oUNe&{hcbbD?^21j_ znwfjt0Y3baooIpeME**4^f^FzrM&p#V9_KDRBLTB%>vqxhxrbW0qc~jIKqDrHp4zt zW3Q$ztWbi@!QA6>6ER(DD7K^g?OwnVPvBIgI`if0SEe0TU*IT+odC(!5`IWj1JGKq zzy(Sx;k5dXAB|s$IVfcujovxYv)J<>vP6)sz!1)mHI#95Xy--SK78PXkLoZuPFK&& z1KC?eff?0Mq%YD6DqgfRcfUIwD>G$eB{g^K(Sn7t+rpDgHDqG%z@L9W!@A_Qoyua^9mVw_W7-1Q*qkW4nDvu=E%xEXj%Jmw`Q7L0BLlq$GwHG(lB^`x+odPl2i3ChIw@%R$*k zeh*Qxc64-rlm7kc_{34nx+cdpB9gU@jdq<0R470R=2z0E!rv94nJ{Ul48cI7b;uu* z@t&+zgZHJLblFo>>M+#VGtahiiTA7-yXH%~s1nUdyQ5c&8^vfcNHwl)<-ADS+c zJh(j}?NV6B)Ct#HzxR7S&Zs>*g|;8n1exKBm0{LkwxKXveZI>yi$p`tpg*^{Lg|#q z%^3v&zB&;*iD{7O0_~g<8y9Es>df36%>F{d!WfC^-%<)X885*Q@$D^ecXuxxaDAAP!n8L| z()8sp==batnAH3T9+$eUp;C9Vu-j?-|8`^V_&&-A(Mmuv?^5iIF&z|G5>rj^56s6M z%ZhkXrta++F{#WuZZGlCD?F$>qtDuLlSLX6SGAAJ2HMt2S~;cYw_o_aYDT~oJs|iK zIh7~af6t-efA|C(JO8roL+6;o_v(6h$Qqwpa3eVm|Ekf$!|F$dI~#2?K^zZi8Vqb3 zV$|Q2dQ(!YrD<*|e3g*u7WMpNTgAK^c0_w$zq91P^m)znBBO-7D;~=S^!)a7l zs1&@6sGKN%!J+EDu&yLC#)$PU)!n;yi5v<)_?1nFkoRwE5Cd*dIX?LE^6O_A}FH7bI@g=4pLwr zkYhNK1@_g_ni$wT!XQE7n;X0Oh6Tq|a{Fk5vK^NRM%#0|(H|&K})J@q!E29pk#6C|G)?Mz4xT@Jje6nxvPfE zJJt{}qXO)|`M$#3WGD)>?K@hV$edeBF}&`=p&udg9ynGz<#){DSOC{DIyT%qd=oJc zBR&~OX0~%PlChvc!KUy+@~!T0uHs2GNX`MtjhLN+c-aH_NtjSLPC;VWkEsUYFGrU| z$Ha7xc{)LOMc5@O%G>VzBywOB`U(>@+w@`c0A(NbtroC~@%V!-VyHL~x7Q7nWA%?h zAo3})=;uaqM#}E>*p3CL4CfXi49v*R?ggQ|oY+HxSpuP~&5?0#;fU#Q^+0*#=KQ1P9HIcf8*s_WFlg(o`P8)LP2rDBtE%9$_6f!zm*4PA%jOe)A*^hb0BZWj z#|y&JSz@yA)P{27$TqZEDMQj6~ol%Gv?r^LEU@MDipAdzf2rWx5o+RP<}nA$2V`PkRM0 zr*D(;k4tm6A>ue){Ij&7stL6sjUQYIE_`1tDk?f2w|+q#E?isSfeen{=X+;|BcN@+ zICP*8dbJJm@`j`=JO+<%@V`ThQzDTGz5>bc;*FCV?B!Y)G&YR?VtMUC?c)glqQl0< zVz31wA8sx6=7nYTXDEQE8;@=9>{_qEQ#xRh1>E2VM#+onCQ5&I33ys&`nv`waR`WL zl&{a?+@D%V*@@*U^F50@dFX`DkZiL%3rD`sxH^x?n!+lzfD&FPt0IwXy#^+Nk!=k6 zjw@0gKi-4mkPn$KGiCg-xX(T^jsYF-=C@wtiN+TmOUzZdTdCPey>_+7(u!r zPKvtEk6%K8@T_bdb8Yh$aCARqF}*1jSzS3%Dcor1ZMYp z;XFnNR4__^fU=zIL)dLzZf>Tc;~8t$e^2%MGiycR=1fH*JoLD=&CS7t69)SM;$)bY zmnQ*N_Xn-qK^(lmgNEt%Siy))>6fr<(Y4y(zXsm-Zt zZGCo6#0MA#(MBRwkFB*PR&r<}6J8V&HEdycnA>KAXh@0Kx4fW%S;FLjvxLkDzqLJ2 zRb7S67UQ^HBXFm}}g80GJuNJ{jGYU?mozVCFA(ax>V8~g) z?_e7n<4z_>xX_*F&&7y#6;9O%yZB8GJtC4u0Y)KgPHd<87zRATK;RZvtkV8v9Wjv| z4r<6CQGyP7@Hc+=K>0KwSqRTrRw=a5N-qdSlHq~Yr&>zZk9oEe}6xPLUf(j zt%SmkA>==eL0D$+#nY+HvG_Ar4Bmr@=Lnq>)26(kyL8GuPC<(_7#}oMTI8~t5bePU zyJ7dh{P&Q%;9zw=ek{%xoc+35(>GS{w2WF!0Ww&Mx4(+vceKSfi%>0-TY2i#sWo=H zu{N{emcQ;e90|lthq%h0Cng3o4bo7^*phAAbQX&C{777yF3Nh~hTUqGzX?e&f8UhX z?#>}R@QbL#CMPG6&c3=1)#C|E%M$Z6BEMh_p@GNXE*R1Qb-?6MA{WK97S&uUe57mK zw}AoVd46xLFy@3B{@0l1)76FdY94Y&0p{7&Kf1emX z=Vpx30la{aP=?5Xp?m8mHyq)ZTS`1@0n;>m@_>wY>$YtR#;9P_4;;wn(AtFzy?^mc zfiaG0jEF4jcKU>nV14S8s*g{>T$4jK{v|dg<>10`;AB{u4IzDRx&V|yPx9p8)s7`> z?>YWtsr;OF>%!?Ui0&JYK608SBy8%~tD}mRbpx&vF>mqPmRX_xY%l?=^Lc>zI0Jwnv%tx61=|oa^}ki5`PzpYuvb}f^BL(kP-kOPTRSy z9UOE`7%x)eZ{&|vwMWnhCGt{8)#1xm1=@at9_}*)GYjXtF>w}o{QgW#3d@rW4mLSt zaOTIlb1^Y7)M3>|Mn=Aa`!qDl@e;E%{hwhag;jkh1*Zl?lXbZsbA}uK-F_?`BJB>c zNK8n;{PM*L1#W(d}vVBMEWHB+4rC!n*QOM4|iT@$jo+lKy4JnO{jj@B1D-T`F z_q=oKRuKF?cBM3hJ10Bt`0q`h&CSgPdG{zEGHu7WyHhd(&<>!mCcrxy129F<5Y*Y3 zhnZ@400dD-BQUU$7oQMV)$3o~x69Cw3rX1>t%Nz_9~c?@Cho-6fyjoZU!yzVy|Umm;h= zBalA0L@Sr?Q3E zMQBeU7X|N@Hh}MQ#_JOpyQGtV+db*!^UCI-cIjXIhecZmaDcD>aATwHu?W?NJFD0c5v^S%^RB&k+XkGWqp$se<-Wk|I2273ySU4W)Jz5x8mDN zxJBN|UR7j&<8CX(+0aD{KLcy6k7S?RD8%#ayupV1M{n_Qp8OYg`17q294Xdz zcDq48{~*=1^LT1T3GG+PBBfhhdsstnmbP&Iy^au7-Y;+JvBF(61G{Ki1XdObtCVz) z7eq-MdE+6=&A)1#Zf0(9{ZidYrY*wW^H0RPlsNX~jnu8~UeYX3F;iM|NQ^Ns-}KSa zh~1AjFX(O#SQRVyF!jI7csN?x(fy3!Ci80r%U3kK5;@P7PWuF|C=S{`a^K|1xbQBT zlL6XdoD6!8cB@|4c6fK)EUg~hs&D)|Q`h&0T)MPeZk^AQ$wO?6pkQJ^!-w}lF>J$6 z1Dqy;t=rB1?H`f{Rq`;=)%}5M$ufHAeDU9UB7f!d`0s*#|L3N4#mWzj2p|0KuZJrA abINK`FBb%Rx-BXAwQrA>>hoQu=l?%5y&!e~ literal 0 HcmV?d00001 diff --git a/05-internals/design/api-admin/administration-fig6.dot b/05-internals/design/api-admin/administration-fig6.dot new file mode 100644 index 0000000000..6163784bee --- /dev/null +++ b/05-internals/design/api-admin/administration-fig6.dot @@ -0,0 +1,16 @@ +digraph DefaultObjectAccessPermissions { + rankdir="LR" + + doap [label="knora-base:DefaultObjectAccessPermission"] + kp [label="knora-base:knoraProject"] + ug [label="knora-base:UserGroup"] + rc [label="Resource Class Name"] + pr [label="Resource Property Name"] + + doap -> kp [ label="knora-base:forProject" ] + doap -> ug [ label="knora-base:forGroup" ] + doap -> rc [ label="knora-base:forResourceClass" ] + doap -> pr [ label="knora-base:forProperty" ] + + doap -> "Default object access permission compact format string" [ label="knora-base:hasPermissions"] +} diff --git a/05-internals/design/api-admin/administration-fig6.dot.png b/05-internals/design/api-admin/administration-fig6.dot.png new file mode 100644 index 0000000000000000000000000000000000000000..fd1e4f23e40208333f5d9a1d0422e2f44487d31c GIT binary patch literal 74379 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�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 + + + + + + + + + + + + + + + + + + + + + Admin API Design - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + + + + + +
+
+ + + + + + +

Administration

+

Permissions

+

The permissions API endpoint is described here.

+

The default permissions when a project is created are described +here.

+

DSP's concept of access control is that permissions +can only be granted to groups and not to individual users. +There are two distinct ways of granting permission.

+
    +
  1. An object (a resource or value) can grant permissions to groups of users.
  2. +
  3. Permissions can be granted directly to a group of users (not bound to a specific object).
  4. +
+

There are six built-in groups: +UnknownUser, KnownUser, Creator, ProjectMember, ProjectAdmin, and SystemAdmin. +These groups can be used in the same way as normal user created groups for permission +management, i.e. can be used to give certain groups of users, certain +permissions, without the need to explicitly create them.

+

A user becomes implicitly a member of such a group by satisfying certain conditions:

+
    +
  • +

    knora-admin:UnknownUser:
    + Any user who has not logged into the DSP is automatically assigned to this group.
    + Group IRI: http://www.knora.org/ontology/knora-admin#UnknownUser

    +
  • +
  • +

    knora-admin:KnownUser:
    + Any user who has logged into the DSP is automatically assigned to this group.
    + Group IRI: http://www.knora.org/ontology/knora-admin#KnownUser

    +
  • +
  • +

    knora-admin:Creator:
    + When checking a user’s permissions on an object, the user is automatically assigned to this group + if they are the creator of the object.
    + Group IRI: http://www.knora.org/ontology/knora-admin#Creator

    +
  • +
  • +

    knora-admin:ProjectMember:
    + When checking a user’s permissions, the user is automatically assigned to this group + by being a member of a project designated by the knora-admin:isInProject property.
    + Group IRI: http://www.knora.org/ontology/knora-admin#ProjectMember

    +
  • +
  • +

    knora-admin:ProjectAdmin:
    + When checking a user's permission, the user is automatically assigned to this group + through the knora-admin:isInProjectAdminGroup property, which points to the project in question.
    + Group IRI: http://www.knora.org/ontology/knora-admin#ProjectAdmin

    +
  • +
  • +

    knora-admin:SystemAdmin:
    + Membership is received by setting the property knora-admin:isInSystemAdminGroup to true on a knora-admin:User.
    + Group IRI: http://www.knora.org/ontology/knora-admin#SystemAdmin

    +
  • +
+

There are three kinds of permissions:

+
    +
  1. object access permissions, which contain permissions + that point from explicit objects (resources/values) to groups.
  2. +
  3. administrative permissions, which contain permissions + that are put on instances of knora-admin:Permission objects directly affecting groups.
  4. +
  5. default object access permissions which are also put on instances of knora-admin:Permission, + and which also directly affect groups.
  6. +
+

Object Access Permissions

+

An object (resource / value) can grant the following permissions, which +are stored in a compact format in a single string, which is the object +of the predicate knora-base:hasPermissions:

+
    +
  1. Restricted view permission (RV): Allows a restricted view of + the object, e.g. a view of an image with a watermark.
  2. +
  3. View permission (V): Allows an unrestricted view of the + object. Having view permission on a resource only affects the + user's ability to view information about the resource other than + its values. To view a value, she must have view permission on the + value itself.
  4. +
  5. Modify permission (M): For values, this permission allows a + new version of a value to be created. For resources, this allows + the user to create a new value (as opposed to a new version of an + existing value), or to change information about the resource other + than its values. When he wants to make a new version of a value, + his permissions on the containing resource are not relevant. + However, when he wants to change the target of a link, the old + link must be deleted and a new one created, so he needs modify + permission on the resource.
  6. +
  7. Delete permission (D): Allows the item to be marked as deleted.
  8. +
  9. Change rights permission (CR): Allows the permissions granted by the object to be changed.
  10. +
+

Each permission in the above list implies all lower-numbered +permissions.

+

A user's permission level on a particular object is calculated in +the following way:

+
    +
  1. Make a list of the groups that the user belongs to, including + Creator and/or ProjectMember and/or ProjectAdmin if applicable.
  2. +
  3. Make a list of the permissions that she can obtain on the + object, by iterating over the permissions that the object + grants. For each permission, if she is in the specified group, + add the specified permission to the list of permissions she can + obtain.
  4. +
  5. From the resulting list, select the highest-level permission.
  6. +
  7. If the result is that she would have no permissions, give her + whatever permission UnknownUser would have.
  8. +
+

The format of the object of knora-base:hasPermissions is as +follows:

+
    +
  • Each permission is represented by the one-letter or two-letter + abbreviation given above.
  • +
  • Each permission abbreviation is followed by a space, then a + comma-separated list of groups that the permission is granted + to.
  • +
  • The IRIs of built-in groups are shortened using the knora-admin + prefix.
  • +
  • Multiple permissions are separated by a vertical bar (|).
  • +
+

For example, if an object grants view permission to unknown and known +users, and modify permission to project members, the resulting +permission literal would be: V knora-admin:UnknownUser,knora-admin:KnownUser|M knora-admin:ProjectMember.

+

Administrative Permissions

+

The following permissions can be set via instances of +knora-admin:AdministrativePermission on any group belonging to a +project. For users that are members of a number of groups with +administrative permissions attached, the final set of permissions is +additive and most permissive. The administrative permissions are stored +in a compact format in a single string, which is the object of the +predicate knora-base:hasPermissions attached to an instance of the +knora-admin:AdministrativePermission class. The following permission +values can be used:

+
    +
  1. Resource / Value Creation Permissions: + 1) ProjectResourceCreateAllPermission: + - description: gives the permission to create resources inside the project. + - usage: used as a value for knora-base:hasPermissions. + 2) ProjectResourceCreateRestrictedPermission: + - description: gives restricted resource creation permission inside the project. + - usage: used as a value for knora-base:hasPermissions. + - value: RestrictedProjectResourceCreatePermission + followed by a comma-separated list of ResourceClasses + the user should only be able to create instances of.
  2. +
  3. Project Administration Permissions: + 1) ProjectAdminAllPermission: + - description: gives the user the permission to do anything + on project level, i.e. create new groups, modify all + existing groups (group info, group membership, + resource creation permissions, project administration + permissions, and default permissions). + - usage: used as a value for knora-base:hasPermissions. + 2) ProjectAdminGroupAllPermission: + - description: gives the user the permission to modify + group info and group membership on all groups + belonging to the project. + - usage: used as a value for the knora-base:hasPermissions property. + 3) ProjectAdminGroupRestrictedPermission: + - description: gives the user the permission to modify + group info and group membership on certain groups + belonging to the project. + - usage: used as a value for knora-base:hasPermissions + - value: ProjectGroupAdminRestrictedPermission followed by + a comma-separated list of knora-admin:UserGroup. + 4) ProjectAdminRightsAllPermission: + - description: gives the user the permission to change the + permissions on all objects belonging to the project + (e.g., default permissions attached to groups and + permissions on objects). + - usage: used as a value for the knora-base:hasPermissions property.
  4. +
+

The administrative permissions are stored in a compact format in a +single string, which is the object of the predicate +knora-base:hasPermissions attached to an instance of the +knora-admin:AdministrativePermission class.

+
    +
  • The format of the object of knora-base:hasPermissions is as follows:
      +
    • Each permission is represented by the name given above.
    • +
    • Each permission is followed by a space, then if applicable, by comma separated list of IRIs, as defined above.
    • +
    • The IRIs of built-in values (e.g., built-in groups, resource + classes, etc.) are shortened using the knora-admin prefix knora-admin:.
    • +
    • Multiple permissions are separated by a vertical bar (|).
    • +
    +
  • +
+

For example, if an administrative permission grants the +knora-admin:ProjectMember group the permission to create all resources +(ProjectResourceCreateAllPermission), the resulting administrative +permission object with the compact form literal would be: :

+
<http://rdfh.ch/permissions/001
+        rdf:type knora-admin:AdministrativePermission ;
+        knora-admin:forProject <http://rdfh.ch/projects/00FF>;
+        knora-admin:forGroup knora-admin:ProjectMember ;
+        knora-base:hasPermissions "ProjectResourceCreateAllPermission"^^xsd:string .
+
+

Default Object Access Permissions

+

Default Object Access Permissions are used when new objects (resources +and/or values) are created. They represent object access permissions +with which the new object will be initially outfitted. As with +administrative permissions, these default object access permissions can +be defined for any number of groups. Additionally, they can be also +defined for resource classes and properties.

+

The following default object access permissions can be attached to +groups, resource classes and/or properties via instances of +knora-admin:DefaultObjectAccessPermission (described further bellow). +The default object access permissions correspond to the earlier +described object access permission:

+
    +
  1. Default Restricted View Permission (RV):
      +
    • description: any object, created by a user inside a group + holding this permission, is restricted to carry this permission
    • +
    • value: RV followed by a comma-separated list of knora-admin:UserGroup
    • +
    +
  2. +
  3. Default View Permission (V):
      +
    • description: any object, created by a user inside a group + holding this permission, is restricted to carry this permission
    • +
    • value: V followed by a comma-separated list of knora-admin:UserGroup
    • +
    +
  4. +
  5. Default Modify Permission (M) accompanied by a list of groups.
      +
    • description: any object, created by a user inside a group + holding this permission, is restricted to carry this permission
    • +
    • value: M followed by a comma-separated list of knora-admin:UserGroup
    • +
    +
  6. +
  7. Default Delete Permission (D) accompanied by a list of groups.
      +
    • description: any object, created by a user inside a group + holding this permission, is restricted to carry this permission
    • +
    • value: D followed by a comma-separated list of knora-admin:UserGroup
    • +
    +
  8. +
  9. Default Change Rights Permission (CR) accompanied by a list of groups.
      +
    • description: any object, created by a user inside a group + holding this permission, is restricted to carry this permission
    • +
    • value: CR followed by a comma-separated list of knora-admin:UserGroup
    • +
    +
  10. +
+

A single instance of knora-admin:DefaultObjectAccessPermission must +always reference a project, but can only reference either a group +(knora-admin:forGroup property), a resource class +(knora-admin:forResourceClass), a property (knora-admin:forProperty), +or a combination of resource class and property.

+

Example default object access permission instance:

+
<http://rdfh.ch/permissions/002
+        rdf:type knora-admin:DefaultObjectAccessPermission ;
+        knora-admin:forProject <http://rdfh.ch/projects/00FF>;
+        knora-admin:forGroup knora-admin:ProjectMember ;
+        knora-base:hasPermissions "CR knora-admin:Creator|M knora-admin:ProjectMember|V knora-admin:KnownUser"^^xsd:string .
+
+

This instance is setting default object access permissions to the +project member group of a project, giving change right permission to the +creator, modify permission to all project members, and view permission +to known users. Further, this implicitly applies to all resource +classes and all their properties inside the project.

+

Permission Precedence Rules

+

For both administrative permissions and default object access +permissions, the resulting permissions are derived by applying +precedence rules, for the case that the user is member of more than one +group.

+

The following list is sorted by the permission precedence level in +descending order:

+
    +
  • permissions on knora-admin:ProjectAdmin (highest level)
  • +
  • permissions on resource classes and property combination (own project)
  • +
  • permissions on properties (own project, when creating a Value)
  • +
  • permissions on resource classes (own project, when creating a Resource)
  • +
  • permissions on custom groups
  • +
  • permissions on knora-admin:ProjectMember
  • +
+

The permissions on resource classes / properties are only relevant for +default object access permissions.

+

Administrative Permissions: When a user performs an operation +requiring administrative permissions, then only the permissions from +the highest level are taken into account. If a user is a member of +more than one group on the same level (only possible for custom groups) +then the defined permissions are summed up and all are taken into +account.

+

Default Object Access Permissions: When a user creates a resource or +value, then only the default object permissions from the highest +level are applied. If a user is a member of more than one group on the +same level (only possible for custom groups) then the defined +permissions are summed up and the most permissive are applied.

+

In the case of the user belonging to the SystemAdmin group, but which +is not member of a project and thus not member of any group belonging +to the project, the default object access permissions from the +ProjectAdmin, or ProjectMember group will be +applied in the order of precedence. If no permissions are defined on +either of these groups, then the resulting permission will be CR knora-admin:Creator.

+

Implicit Permissions

+

The knora-admin:SystemAdmin group receives implicitly the following +permissions:

+
    +
  • receives implicitly ProjectAdminAllPermission for all projects.
  • +
  • receives implicitly ProjectResourceCreateAllPermission for all projects.
  • +
  • receives implicitly CR on all objects from all projects.
  • +
+

These permissions are baked into the system, and cannot be changed.

+

Default Permissions Matrix for new Projects

+

The access control matrix defines what are the default operations a +subject (i.e. User), being a member of a built-in group (represented +by row headers), is permitted to perform on an object (represented by +column headers). The different operation abbreviations used are defined +as follows:

+
    +
  • +

    C: Create - the subject inside the group is allowed to create the object.

    +
  • +
  • +

    U: Update - the subject inside the group is allowed to update the object.

    +
  • +
  • +

    R: Read - the subject inside the group is allowed to read all information about the object.

    +
  • +
  • +

    D: Delete - the subject inside the group is allowed to delete the object.

    +
  • +
  • +

    P: Permission - the subject inside the group is allowed to change the permissions on the object.

    +
  • +
  • +

    -: none - none or not applicable

    +
  • +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Built-In GroupProjectGroupUserResourceValue
SystemAdminCRUDCRUDPCRUDP allCRUDP allCRUDP all
ProjectAdmin-RUDCRUDPCRUDP +/- projectCRUDP (in project)CRUDP (in project)
ProjectMember--------------CRU-- (in project)----- (in project)
Creator------------------- (his resource)----- (his value)
KnownUserC---C----CRUD- himself----- (in project)----- (in project)
+

Default Permissions Matrix for new Projects

+

The explicitly defined default permissions for a new project are as follows:

+
    +
  • +

    knora-admin:ProjectAdmin group:

    +
      +
    • Administrative Permissions:
        +
      • ProjectResourceCreateAllPermission.
      • +
      • ProjectAdminAllPermission.
      • +
      +
    • +
    • Default Object Access Permissions:
        +
      • CR for the knora-admin:ProjectAdmin group
      • +
      • D for the knora-admin:ProjectAdmin group
      • +
      • M for the knora-admin:ProjectAdmin group
      • +
      • V for the knora-admin:ProjectAdmin group
      • +
      • RV for the knora-admin:ProjectAdmin group
      • +
      +
    • +
    +
  • +
  • +

    The knora-admin:ProjectMember group:

    +
      +
    • Administrative Permissions:
        +
      • ProjectResourceCreateAllPermission.
      • +
      +
    • +
    • Default Object Access Permissions:
        +
      • M for the knora-admin:ProjectMember group
      • +
      • V for the knora-admin:ProjectMember group
      • +
      • RV for the knora-admin:ProjectMember group
      • +
      +
    • +
    +
  • +
+

Basic Workflows involving Permissions

+

Creating a new Resource

+

Figure 1

+

Accessing a Resource/Value

+

Figure 1

+

Project / Group Administration

+

Figure 1

+

Implementation

+

The requirements for defining default permissions imposed by all the +different use cases are very broad. Potentially, we need to be able to +define default permissions per project, per group, per resource class, +per resource property, and all their possible combinations.

+

For this reason, we introduce the knora-admin:Permission class with two +sub-classes, namely knora-admin:AdministrativePermission and +knora-admin:DefaultObjectAccessPermission, which instances will carry +all the necessary information.

+

Permission Class Hierarchy and Structure

+

The following graphs show the class hierarchy and the structure of each +permission class.

+

Permission Class Hierarchy:

+

Figure 1

+

Administrative Permission Structure:

+

Figure 5

+

and the same as RDF:

+
<http://rdfh.ch/permissions/[UUID]> rdf:type knora-admin:AdministrativePermission ;
+     knora-admin:forProject <http://rdfh.ch/projects/[shortcode]> ;
+     knora-admin:forGroup <http://rdfh.ch/groups/[shortcode]/[UUID]> ;
+     knora-base:hasPermissions "ProjectResourceCreateAllPermission|
+                                ProjectResourceCreateRestrictedPermission "<Resource Class IRI>"|
+                                ProjectAdminAllPermission|
+                                ProjectAdminGroupAllPermission|
+                                ProjectAdminGroupRestrictedPermission "<http://rdfh.ch/groups/[shortcode]/[UUID]>, <http://rdfh.ch/groups/[shortcode]/[UUID]>"|
+                                ProjectAdminRightsAllPermission"^^xsd:string .
+
+

Default Object Access Permission Structure:

+

Figure 5

+

and the same as RDF:

+
<http://rdfh.ch/permissions/[UUID]> rdf:type knora-admin:DefaultObjectAccessPermission ;
+     knora-admin:forProject <http://rdfh.ch/projects/[shortcode]> ;
+     knora-admin:forGroup <http://rdfh.ch/groups/[shortcode]/[UUID]> ;
+     knora-admin:forResourceClass "Resource Class Name" ;
+     knora-admin:forProperty "Resource Property Name" ;
+     knora-base:hasPermissions "RV <http://rdfh.ch/groups/[shortcode]/[UUID]>|
+                                 V <http://rdfh.ch/groups/[shortcode]/[UUID]>|
+                                 M <http://rdfh.ch/groups/[shortcode]/[UUID]>|
+                                 D <http://rdfh.ch/groups/[shortcode]/[UUID]>|
+                                CR <http://rdfh.ch/groups/[shortcode]/[UUID]>"^^xsd:string .
+
+

Querying Permission Instances

+

The properties forProject and either of forGroup, +forResourceClass, and forProperty form together a compound +key, allowing finding existing permission instances, that address the +same set of Project / Group / ResourceClass / Property combination, thus +making it possible to extend or change the attached permissions.

+

Administrative Permission Instances: For each group inside the +project, there can be zero or one instance holding +administrative permission information. Querying is straitforward by +using the knora-admin:forProject and knora-admin:forGroup properties +as the compound key.

+

Default Object Access Permission Instances: For each group, resource +class, or property inside the project, there can be zero or one +instances holding default object access permission informations. +Querying is straitforward by using the knora-admin:forProject and +either knora-admin:forGroup, knora-admin:forResourceClass, or +knora-admin:forProperty properties as part of the compound key.

+

Example Data stored in the permissions graph

+

Administrative permissions on a 'ProjectAdmin' group:

+
<http://rdfh.ch/permissions/[UUID]> rdf:type knora-admin:AdministrativePermission ;
+     knora-admin:forProject <http://rdfh.ch/projects/00FF> ;
+     knora-admin:forGroup knora-admin:ProjectAdmin ;
+     knora-base:hasPermissions "ProjectResourceCreateAllPermission|
+                                ProjectAdminAllPermission"^^xsd:string .
+
+

Administrative permissions on a 'ProjectMember' group:

+
<http://rdfh.ch/permissions/[UUID]> rdf:type knora-admin:AdministrativePermission ;
+     knora-admin:forProject <http://rdfh.ch/projects/00FF> ;
+     knora-admin:forGroup knora-admin:ProjectMember ;
+     knora-base:hasPermissions "ProjectResourceCreateAllPermission"^^xsd:string .
+
+

Administrative permission restricting project admin permission on a group:

+
<http://rdfh.ch/permissions/[UUID]> rdf:type knora-admin:Permission ;
+     knora-admin:forProject <http://rdfh.ch/projects/[shortcode]> ;
+     knora-admin:forGroup <http://rdfh.ch/groups/[shortcode]/[UUID]> ;
+     knora-base:hasPermissions "ProjectGroupAdminRestrictedPermission <http://rdfh.ch/groups/[shortcode]/[UUID]>"^^xsd:string .
+
+

Administrative permission restricting resource creation for a group:

+
<http://rdfh.ch/permissions/[UUID]> rdf:type knora-admin:AdministrativePermission ;
+     knora-admin:forProject <http://rdfh.ch/projects/[shortcode]> ;
+     knora-admin:forGroup <http://rdfh.ch/groups/[shortcode]/[UUID]> ;
+     knora-base:hasPermissions "ProjectResourceCreateRestrictedPermission <http://www.knora.org/ontology/00FF/images#Person>"^^xsd:string .
+
+

Default object access permission on a 'ProjectMember' group:

+
<http://rdfh.ch/permissions/[UUID]> rdf:type knora-admin:DefaultObjectAccessPermission ;
+     knora-admin:forProject <http://rdfh.ch/projects/00FF> ;
+     knora-admin:forGroup knora-admin:ProjectMember ;
+     knora-base:hasPermissions "CR knora-admin:Creator|
+                                 M <http://rdfh.ch/groups/[shortcode]/[UUID]>|
+                                 V knora-admin:KnownUser"^^xsd:string .
+
+

Default object access permission on a resource class:

+
<http://rdfh.ch/permissions/[UUID]> rdf:type knora-admin:DefaultObjectAccessPermission ;
+     knora-admin:forProject <http://rdfh.ch/projects/[shortcode]> ;
+     knora-admin:forResourceClass <http://www.knora.org/ontology/00FF/images#person> ;
+     knora-base:hasPermissions "CR knora-admin:Creator,knora-admin:ProjectMember|
+                                 V knora-admin:KnownUser,knora-admin:UnknownUser"^^xsd:string .
+
+

Default object access permission on a resource property:

+
<http://rdfh.ch/permissions/[UUID]> rdf:type knora-admin:DefaultObjectAccessPermission ;
+     knora-admin:forProject <http://rdfh.ch/projects/[shortcode]> ;
+     knora-admin:forProperty <http://www.knora.org/ontology/00FF/images#lastname> ;
+     knora-base:hasPermissions "D knora-admin:ProjectMember,knora-admin:Creator|
+                                V knora-admin:KnownUser,knora-admin:UnknownUser"^^ .
+
+

Default object access permission on a resource class and property:

+
<http://rdfh.ch/permissions/[UUID]> rdf:type knora-admin:DefaultObjectAccessPermission ;
+     knora-admin:forProject <http://rdfh.ch/projects/[shortcode]> ;
+     knora-admin:forResourceClass <http://www.knora.org/ontology/00FF/images#person> ;
+     knora-admin:forProperty <http://www.knora.org/ontology/00FF/images#lastname> ;
+     knora-base:hasPermissions "CR knora-admin:Creator,knora-admin:ProjectMember|
+                                 V knora-admin:KnownUser,knora-admin:UnknownUser"^^xsd:string .
+
+

When the user's UserProfile is queried, all permissions for all +projects and groups the user is a member of are also queried. This +information is then stored as an easy accessible object inside the +UserProfile, being readily available wherever needed. As this is a +somewhat expensive operation, built-in caching mechanism at different +levels (e.g., UsersResponder, PermissionsResponder), will be applied.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/05-internals/design/api-v2/ark/index.html b/05-internals/design/api-v2/ark/index.html new file mode 100644 index 0000000000..9371e367f0 --- /dev/null +++ b/05-internals/design/api-v2/ark/index.html @@ -0,0 +1,3121 @@ + + + + + + + + + + + + + + + + + + + + + + + Archival Resource Key (ARK) - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + +

Archival Resource Key (ARK) Identifiers

+

Requirements

+

Knora must produce an ARK URL for each resource and each value. The ARK identifiers used +by Knora must respect +the draft ARK specification. +The format of Knora’s ARK URLs must be able to change over +time, while ensuring that previously generated ARK URLs still work.

+

Design

+

ARK URL Format

+

The format of a Knora ARK URL is as follows:

+
http://HOST/ark:/NAAN/VERSION/PROJECT/RESOURCE_UUID[/VALUE_UUID][.TIMESTAMP]
+
+
    +
  • +

    HOST: the hostname of the ARK resolver.

    +
  • +
  • +

    NAAN: the Name Assigning Authority Number (NAAN) that the ARK resolver uses.

    +
  • +
  • +

    VERSION: the version of the Knora ARK URL format being used (always 1 for now).

    +
  • +
  • +

    PROJECT: the short code of the + project that the resource belongs to.

    +
  • +
  • +

    RESOURCE_UUID: the resource's unique ID, which is normally a + base64url-encoded UUID, as described in + IRIs for Data.

    +
  • +
  • +

    VALUE_UUID: optionally, the knora-base:valueHasUUID of one of the + resource's values, normally a + base64url-encoded UUID, as described in + IRIs for Data.

    +
  • +
  • +

    TIMESTAMP: an optional timestamp indicating that the ARK URL represents + the state of the resource at a specific time in the past. The format + of the timestamp is an ISO 8601 + date in Coordinated universal time (UTC), including date, time, and an optional + nano-of-second field (of at most 9 digits), without the characters -, :, and . (because + - and . are reserved characters in ARK, and : would have to be URL-encoded). + Example: 20180528T155203897Z.

    +
  • +
+

Following the ARK ID spec, / +represents object hierarchy +and . represents an object variant. +A value is thus contained in a resource, which is contained in its project, +which is contained in a repository (represented by the URL version number). +A timestamp is a type of variant.

+

Since sub-objects are optional, there is also implicitly an ARK URL +for each project, as well as for the repository as a whole.

+

The RESOURCE_UUID and VALUE_UUID are processed as follows:

+
    +
  1. +

    A check digit is calculated, using the algorithm in + the Scala class org.knora.webapi.util.Base64UrlCheckDigit, and appended + to the UUID.

    +
  2. +
  3. +

    Any - characters in the resulting string are replaced with =, because + base64url encoding uses -, which is a reserved character in ARK URLs.

    +
  4. +
+

For example, given a project with ID 0001, and using the DaSCH's ARK resolver +hostname and NAAN, the ARK URL for the project itself is:

+
http://ark.dasch.swiss/ark:/72163/1/0001
+
+

Given the Knora resource IRI http://rdfh.ch/0001/0C-0L1kORryKzJAJxxRyRQ, +the corresponding ARK URL without a timestamp is:

+
http://ark.dasch.swiss/ark:/72163/1/0001/0C=0L1kORryKzJAJxxRyRQY
+
+

The same ARK URL with an optional timestamp is:

+
http://ark.dasch.swiss/ark:/72163/1/0001/0C=0L1kORryKzJAJxxRyRQY.20180528T155203897Z
+
+

Given a value with knora-api:valueHasUUID "4OOf3qJUTnCDXlPNnygSzQ" in the resource +http://rdfh.ch/0001/0C-0L1kORryKzJAJxxRyRQ, and using the DaSCH's ARK resolver +hostname and NAAN, the corresponding ARK URL without a timestamp is:

+
http://ark.dasch.swiss/ark:/72163/1/0001/0C=0L1kORryKzJAJxxRyRQY/4OOf3qJUTnCDXlPNnygSzQX
+
+

The same ARK URL with an optional timestamp is:

+
http://ark.dasch.swiss/ark:/72163/1/0001/0C=0L1kORryKzJAJxxRyRQY/4OOf3qJUTnCDXlPNnygSzQX.20180604T085622513Z
+
+

Serving ARK URLs

+

SmartIri converts Knora resource IRIs to ARK URLs. This conversion is invoked in ReadResourceV2.toJsonLD, +when returning a resource's metadata in JSON-LD format.

+

Resolving Knora ARK URLs

+

A Knora ARK URL is intended to be resolved by the Knora ARK resolver.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/05-internals/design/api-v2/content-wrappers/index.html b/05-internals/design/api-v2/content-wrappers/index.html new file mode 100644 index 0000000000..107923122d --- /dev/null +++ b/05-internals/design/api-v2/content-wrappers/index.html @@ -0,0 +1,2941 @@ + + + + + + + + + + + + + + + + + + + + + + + Content Wrappers - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + +

Content Wrappers

+

Whenever possible, the same data structures are used to represent the same +types of data, regardless of the API operation (reading, creating, or +modifying). However, often more data is available in output than in input. For +example, when a value is read from the triplestore, its IRI is +available, but when it is being created, it does not yet have an IRI.

+

The implementation of API v2 therefore uses content wrappers. For each type, +there is a case class that represents the lowest common denominator of the +type, the data that will be present regardless of the API operation. For +example, the trait ValueContentV2 represents a Knora value, regardless +of whether it is received as input or returned as output. Case classes +such as DateValueContentV2 and TextValueContentV2 implement this trait.

+

An instance of this lowest-common-denominator class, or "content class", can then +be wrapped in an instance of an operation-specific class that carries additional +data. For example, when a Knora value is returned from the triplestore, a +ValueContentV2 is wrapped in a ReadValueV2, which additionally contains the +value's IRI. When a value is created, it is wrapped in a CreateValueV2, which +has the resource IRI and the property IRI, but not the value IRI.

+

A read wrapper can be wrapped in another read wrapper; for +example, a ReadResourceV2 contains ReadValueV2 objects.

+

In general, DSP-API v2 responders deal only with the internal schema. +(The exception is OntologyResponderV2, which can return ontology information +that exists only in an external schema.) Therefore, a content class needs +to be able to convert itself from the internal schema to an external schema +(when it is being used for output) and vice versa (when it is being used for +input). Each content class class should therefore extend KnoraContentV2, and +thus have a toOntologySchema method or converting itself between internal and +external schemas, in either direction:

+
/**
+  * A trait for content classes that can convert themselves between internal and internal schemas.
+  *
+  * @tparam C the type of the content class that extends this trait.
+  */
+trait KnoraContentV2[C <: KnoraContentV2[C]] {
+    this: C =>
+    def toOntologySchema(targetSchema: OntologySchema): C
+}
+
+

Since read wrappers are used only for output, they need to be able convert +themselves only from the internal schema to an external schema. Each read wrapper class +should extend KnoraReadV2, and thus have a method for doing this:

+
/**
+  * A trait for read wrappers that can convert themselves to external schemas.
+  *
+  * @tparam C the type of the read wrapper that extends this trait.
+  */
+trait KnoraReadV2[C <: KnoraReadV2[C]] {
+    this: C =>
+    def toOntologySchema(targetSchema: ApiV2Schema): C
+}
+
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/05-internals/design/api-v2/figures/query_graph.png b/05-internals/design/api-v2/figures/query_graph.png new file mode 100644 index 0000000000000000000000000000000000000000..a8db48a7e9d2950d0571fe19bc58843dd64e135e GIT binary patch literal 45468 zcmeFZgFs(jc9K(%s#lf`SSNNQcth-6|!ibeD9;fb_dZ zJ)fiJocH$^e7!Don3-ok``P=Bb+2`AUns~uz=M&)FfcIiBqi=CVqiew7#NrdIOoAT zj-k7O7#OfYQ!z0GNii{61v_gaQwu{342c&Jk=V*%ZKN#=M_(ye2rwDmIj0aIq!!=d zd=*u`OZZ0Nt^^LFo*1c`4NJ!JM;c#9E<@GS5CeYd1qC?Vs}u$g6$YF9@FGqi!3EVD zHTzxF3o`T0R_kMx&g}MGA{YvHhxKf^bIv1P)9Vrv&B)73$-SFBkBKFLfVw~+u{TIK zl9O*>=qc??u8mvXBrl|J3e-M3J@MwkW0n7mi6JG<8_zWNjdtwyOJmByn=}}G*FISn z(d*_+Q9tFnCE<&6miFlMrniF4Ay#r5(H+}6m^i(d4PnC;7ichwSZ316Y`#lS7rn>E zzN|)nw*u!e&1;`d@$WZ3l=1OZ!l>^K5xyWhhY*#+X8U^fChV;Ic6N*!V6o8$^_^4zaf^S|lC*JRQ5sqWs>xuP7G zRNV%Bh8;543}Jc&B8ts8Fjb>)y7vyIRQ)~Ds|N>OyhIufnSA! z;l}FHq3iW|2RYL>Mck}#HWU8a$gA+KeYN#lU9VM}cZ$Tqy-Y=O>@0=t_|gaOGj+3t zQIQHYA#ko^QrIkJDPbXmt!?Yxhx%x55xxk4x2AK14mKwj-=lQbstS7&b^{}@T)>rT zqUZL+&3o1CYwhOP4apa6x6?f>h%n>?F?|lLMvS+~E2StfdHX+xO2Te?nlxdbKR_w_ z-tNIX-+-kK5tzan^C8Ipqb{0%I4s~3#5HP= z;iY{2WZ|O+FFxy2=_!;Ai8d~cU+i@8rpk9x=77YH$@D(g-DJop0 zzhK6fby4L-mN?h@5ry~+3VOa}=<*HnptSc(CITg7{KQnj^GQ2B?O#@U`WMeF8tuC7 z;yH-8VV#hOH7-83U`x0{di%o17UmD(dW?6D?zG$?V=HHS66LJU{MNs;p-Nw@ux&_Y zRdJPnRnCH_jA}H9s^RsF4KGz3UKa(~GyU0Z+tiA+3b6`~ij@k{F>JvL*3X?kV9zRT zUiY|DN9ax9P3}!~Ml5n);YQSD!3z(uSRY?_eC{#LyH_@^*d(sp$Rc8SKJkfH@3t*T zVc?KN4Z;KAA$C3Vr6hGq<;`oRw=x4Ao;tkflRuOgpw$XH*P3Z?)m5nS^_X0pw3paB zg$@RE(Y=oX*No$b4w3TA8=47?EU__E}jcNi#z;(@h2y zvy98-7gMR}L#}06srhQ;LaA`+L&vPDWVdj)*N6P5C(Duj0h~7E^W>uB+OG&-)sio8 zp3k7qy1?c0`CVSxdNMNUl9?VC3#Ud*bj(~#09Q5FgA&dX?GnNgQuBV3_^)qz6*%q5 zgWk%HA_SzWWsf+;ywBU8w{9M}`idj3+a+H}X;eNoT_ALo~cvZCne6cPnldsqOwz1K0M>5C8Qlr~|+Z{J))ZVh=(yL{P#el^iRQXC` zulHjF$0kQB=a8Pw$fKbUvqgP+&M`fg=FO`*L0u`vz1fQkOE>Pj-G6tVJz41f_FNR$VW4TRr`$n37T4Jy>)$C`j#iRK=ooab9TI{&_F?HHn5fE!x%h^S)&^z!=}CF zL4~LSlHq}oz2VTcC?}{Bp3})5=Mm14-Vy0hWU-8KYR3p?w*7z_wpxHifaj%sDlW>8 zltEOZl)3^M0=98xaaR0FaZlpac+2_g?FwzDD_89*XQdopIq1xeOdmFNj?2yrEOM_} zEho&^eXI?B*Y?~fM_+rp!R5Pq&L;2D)|cK+j>(;j1sbFiQUi%y>u;phG2c1CQ)L}raSGViD8Tp-N-*LUqz1s+7ybG|E)F^h3N+G-CvUgfrwtoGC)YMC8;}3?;#--7^Kt8aE!VKW_if z6%h7O|6}$?ng{9+B(9HKpKdK^?F_}AkLtYKY5D^4Fejt)A$~H;`1z;L_mH zh#HIWla`biPGskYn@kM2KFQ3>OwBA`(CW|?JllqhLx*wYSd?{IkuJ=5VQ-_H*w#1% z0(IJ{WsOreBxt6wY|3mC>`yARDn1HYBcU6n{?7Nsn+Yak>!U@OH%XLXNSt#|`#-2f zzl*Nsm^2nQ>^FR6OlQP1H)a3TPVPD9J&pG}mFFvi?A@EVXA}zsyE&}QC!XKbF4Bcb zE=X(ba9s}VyHy$&kVDy@3Alm%^syAn~B;x9V_>>TjlxZKm<1zew{*3k1Fl zR3$;d^;t)YDK!)7YV@DA1->D9!X&0jtuC$|QMw$d7cdhzQ=UzvRvxh!nZtbb`|WSB z{)!QblBSd7`CQfY;@(WhW$w8)fA= z`s+{>QixMnTW^m$B;BojU!eEM{@eUK%Pxzd)`XQ#14_eG3%BQstsp5XXNBudA4o&>H79~VjY>6x3PR{!o23r$miOjTBv*C zs`Sv{!MWLh!;`9`_I>Y6qW(7gPn5j68%SMmg^ely^A(~4Y##I|h3@HwkGZd$Ub)AZ z$j&`zxI7$cERuHOa%A%T%WM6Y`maQyPfBKaQ7#%BeKjerDdIiXt!1s&gf2V1PwvcK z``*1LG8oUvuVF8>(&yj%srOcTOE+=CRZFt+dfs*sfu6#G+0)7td!FuYp-Inc#~)II z8p*mH*#)|_x9c3Xix%dH)UK#$=2hufuG_8gp9ZbKTdK#aV)H9?&DXXTO;_T_-4Cla zP{lkDYweo0Dp%A%oK|i5to7uQ^jg^D^u*PwSkL|bT0eLFeKp|*L3;O$y@Kt~iR2O8 zTrbNv)ot=9>^*0p*Pb5UJ{+6JJWJMz*wP6K3ChA;9-1QGI34VGT`CraYmA?CH+8ol z!%y>0k6uT{-6qS-rBSLf4=Qtv(#=7%n;iCbI_j1Zb<`c&!z+ zSbc4S2?4D zUeZf<1Z-{b9AZq3V0^!Rm4;@NPx#c3MsZaKV`S$xSM7&_=Wj*)9x6mO+HK0m_8oaI zZ6$IjC{IC7`OYq+3XlyY#MG1kq^oMEE@>nyi@^w9<6vM0m||doSD4_39QosNq`ir7UVv>^JUnPAzLqjWj6KjWWOI5L8s6kU@bq94> z8Ge0hOV-B*)_R7lE|xavOE3go_`yp{Lx;z-E|wNn_WUkF*MEG2AG}7t4ZlwN<0}s4 zLf6%06==n*?F?zTSUFkQt_#CxX=w%R42<{{@7@1(IrvTJx`~5>4L=<2?Ci|y%)x4H zXAHl?$Hxa}V~4Y|vw&}~*t=ReJa%ERvcK_jkiW*cXK1f)XKLeMYHdY}9`~`HwWEX3 z_3P*x{qN7uc^bNy{(UDa`(KX*9uSWH1b&B=4gSBe!KH%ecli}eT?{SM@0nVH7XlJyb= zG7npa?lmHONr;FENpUW!v)!?2?CFD&X>4IW#X5gp5P|v3CxnEMkQhR&ile}cBPk)F zECIujp=TUZC=^dEn&0Glf)W-SGk7x;`z=!X0NZFtL`#SVkSn$g8 z|9MjcZ8-Q)OoPP$_U{>?XNiNf!~3t<(E1?gp*TqYBF$Ff|DG>F%{TJ@dQJp}uL6vq z=AvO~2*ZD`1g%RO*MBSkdK&MDXBg*|Ib5zIcyRs)=yu#Cpy*hPRwa_=#KkByz^>n=nbctPZ##J^Ov^T!syl(za;0; zR}I=H9&?|%E*(`lu4vY}p`_|9O3eq$&f}4*=W3SbJpSl!xL*1ZN~ZnDINtH?sNCqA zf5ZhCosA}=#4`cP2S1%RX&VCLrWSPRxkMvu0aIk;UD`k;_yxl*E~gY%t+kR|eU(9*2Z=t~ z-*9f!9;Sbu9qU&PR0bw_j5}v{otVYW^ z%d98Yt;p}MJ+Xm(;QW2*0Z1W_%9z9#V+)!ims5lVeN0lB2c1k^pOkPJ59^`2EKDlOwH2R-N|`G3?MA{dZzFz#*vVXqdVN-V3>hi6@GzaVcal8P0fk zqk1VVHb*{DnAIivUNCRO0dP0gkV?Bbsqzm8x#bgP=gwbzB=?n9h22o}?<7Y%4-8iy z*+`6!-j~}+{S71q+69k%mkJ?oVP>Y{Hj0AKlAi8B5+;i;@5QZNE7G(Y)O~ds;7R>0 zQ_`}6L1q=h!q1@x5q&h6r^D^MuB{|5*!h^xq=%L#;8wQEf)81;Y>CwI@xjh`j~z5G z0FR>iuE?D%-9W#;9}p3TB}|z9L4g#k5{B<8L^Ha|exb{$lWS1@$$2~ruV&V%S1iW3_V=0-YCRbWEm)NSW=ATGJneum1~}6+?{ZNL8$58 z-wTG}%Z3Xuk^Nc-511pZysvSh=RotztNJi0*#yDiyz2ET!Qf9;l0=)B)}7Dz3_la= zryiu}V1|>SL&MK;d~JYq--1O>E3`W6fTg8P zMBV(~Hla5xNgZ;L0{)h{MI3BhAT67I^Tk*}*CHWQpOV$%gzIsBV%I~88@l2J)(%(l z%P$b!9%}GCXFm~)_ow%30|Y+L*yMzs3LdTr*A^ZHcSVC?u~DZPFHan`uQ!efPNmx; zGwKcorL>0M90F_-v9izOS?JuiN9c=fv4|_iDr}Q$H$ULspDN;QrsNXw1-Y_f#cpLF zm)myc)A6Mb$lq7e2f+s^{p=ba`C~?RuP6ERfK0o3u#m{p$s=)>)&f$+$`v6RaES_? zYcF2I*Mf%9{I&+ynE@RC5b$ z6D->!;m%4_eOXPk!3Be42V#GFENusbd5CC!};CwQKVAq3agDkTP(;5}o3%a$Hl$xWN9{p2?%2~GO5BC20I z3Wfdleeif5Xe(iA@j`EOC>FKb;x!6BJA=^I)SVws*Q~vZbp*ngiO?7M`5@$G*`JnYXl5qtyM>&Z zuNte*HowZ1j%0Oegpv&{2=DX7vOWF~Kw;>*yEke*I^P*Pz6P?#=OQSaM5{r!<+O@* z?|@hMcTf8y56Z6N<#57lK8UB#fgBC}TKE0eHWy%tD1Zejn{?gwR!z@gUn<$@66n4} z$@_?iPOjvZ^jqT7r;V4(t;Wrg9|V_;T2<%Lx5$4Lbrf2uy8UMXcYw}$4_4 zjDVPpT-6k%d+P=J6Ylw$3*Ue}TQvGX*XMCTT)K2tkhE_;m{*ET?b49oGV{WZn&$;} zFG{An{pNt6AsXKNTJ;jlNDt9&Lk5@`lZ*a>rrMXM}jvfU#|Wz4$nz-Zz4OR!fT>f7-=Prd0z&Ccu5 z)zAmjg%4;v`-HqUYWG(IneqzqJ=e^m0}52KRfkp7bPOGr`wDluMJCT*yz+=VO^%T% zX+>j@>rY(P`T#7hu-Pg)$`VT=#8N0YO%zg+ADk6rDu2c!QZGMae0ONVxo0f@-nkiJ!gD;iMiR6FIVErc^D$=I7SdTusir$PNZ z_+7VCP7b=g_vF_ECJ$bt)Hz#Q<>ChkGyti=53Dc^1Y z7p39aL&J)|n>NSaZQEBh)Khxz?G*sqDh9Yqqc=@<4O`^9?@DOqMCksccRf=W>Gng6 zoyhuQ!%E!4jL5kSuYG}D*f)`bHu zdqpKMAf#$76Tc8`oM7ASeb}2g(hjd*rQYcdfK(+o>ipBKu*~L)iH?3?DB=eQ-vqIM zOB$dM2(=EiHw*s^A^@&Gj&7{D z9)J5yfQq~{DrXfSq!-8D$Fnr@B4?e}USVEweAcPn53`Z@RQ!FXhlBMaAcKvs1&AC! zt`zGaVeXXC6l_hO{unSi)%fH@$=Q3tbs@r~E6jWMWxu2BZzvG#{`TcZUF{xyL)gH_ z=-(g!bg@|IiWld1E5Qd#sqFrJI$$kZ_r&alAE(tA?}P66()RHr9niHWrUI>NngzRFOULRu=J^+euIK8X@PlFaaY- zPqLrO^h!*bv<5{;<*jkwZ8XmND+D6E(9zFcAC8WG^bi30OXk`mt4Z>M?7;3T+e@0U zDzH?9MH36I_Pl%IzSKmfTY?L(>FE+V^C*v!n|E>>1Ma>nT~xRGRob#Ej&HrR{&)_~ zt@jCM|NDq}zN~fnM1u2#Yr1>hM4~3A#FAS5VMM(9dZksw7Tj}5+G%gtc=TIa*tq-g z4n8LIX(Y3TUeW(EzLi*wk1P-5ns*ByS%h{GjDJjU8Zl+vITbFx87#D??)Hw7C8@W_ zQ2J@6%!sm^z>WrCT4K;f@QF&kGuLT;Wlht@Avx z*qUit(l;&LI@npz0(e?x;p+zxO&N(=E)w2bp7cp8>Vw63=6|B7kl+T>Mi1mIy4}wU z^gp5ytpc0xRSu(}y|vM`Ho8RSp*vxAw7Jx$p}`)XprlNU#r{vsZR3Mjt6DA74(_1Q zxnGoK=NKKTd92>Mel!o1dZ%-{Cp2f@AM_G9LRmnpj`xbkJ|n1@_NT}Juz=g{n}o#g z-h<&=1L)29re-;`QEy?rrV+6Mz^^b@r+NVD73h5X^-J(BvCrV9JM`HJ<@+W9iU+^N zc?{nQ7@LJ)9+z|_K6(~7+rFWJ`JLgbgW8c*UXD~m6*7CJh^60vTL!u& z&Vm(*piwavW<8<o7+J=|H|E94_EJ-ehOX<~?#Vl9eVE`6k?iLLJYQy;ay-Al@JTd~* z=y#ut?JU=WU2Rv@iEwzL?)XY6sG_w1YA-r3d2&$k0K<11TJjn7^a7DKMi>q3v-3>6 z4bI{jE0mQ>+heN1ce<6h@{dwj0u)fpb|{9$bR>O#?OseKS%hDNTb@rMkQBJb! zP7q?1SbE}EHOTU!_A)9})wkp1XuosA8v#55|oi?@`>y0$qYA$Yxa3c;mhxGFy^0MzF`3}{$2-1cZI9r z$53~>P-RS1#s$aC+Jf9{Tt37q!F&V=M_(~2a%2^APrj+b>v9fd!zHNXqGZe}np+J2ba6DVi z&PRg*3v`kk-^mf!ybcj3Rfx@bHv)*x3urzQ6N}&SGNGdp}jQd>_@9tHm=&ROVmYvUIssx&a?gx6;nA@+iAy z>w(DOLka<>9HHGFF)Nh?fsLBtu{GCozIr$v@dAUl7)C`iSg-Z?lGEw!jSbHYO*l9F_=QK|73P7Hd@`?0L93S0AOO#YLs1n+L3N zgA4l9surcH)J;2oGdB%3#cB1BO2<6_pN3l}*e%XgX;X1cZeG^61(&s=p%zqn0_BP6 zIcoU{z_MFqL#K3i_75?QMoLVrDk}ZsdU3njZFEh1Q>7zE0Qwon7sD6+p46YGQ{9t3 z{LcB#F-KUTsheqUlf z$XZTbIX@rIXMcOALG@{qdjz3^K-Ph}V?K4=OQ{TE8j3#xJ_(fYa!p^PTW5D_f=kRt z#UNahMk>|pyqSKY!f_Jf7!mI}3eCI*RKeqqIGgu!E@d-SKM1B~A&Tp`sF>9f4S55* zci51!?%Cazh1FtRf8w-%F6i~Ugz)k)JL#?_VSvlcSJLF-m)%-k(TJRei+0E1clo~{ zQV8*y`Sha9ppCHlXuaC$^LZ+&Ub`?tG!%Sq`r~DS8N7PnJeU#mNixNT2EgEe@T7$c(2^kT)@=g%6U z?EeP9fk(qUIx%tS_UqXM)^iwUN`p=@9XlkFvF+eYk3aFG=rR6W2nZvZhjK zzQ*&#jbgKSvK2Y_e8r|S&#E1&a?D;ED*OoT!+nVBRgv%2@J0LC6Kwo67G^99nc#Ox zscz}nvV9JWFwJFb>OYZ;LKvhFh7>+pEzXM!^&?xpV>j+N*q_3(@H)f?-^Dy*9n?fo zy)2&`(=nutY!rhz&V`e2$FuM*oeOh==P2FJSYy0DQGyuu+#ffFy}ks{GW5>UGwPY3 znwa9W`l~c0t9_Yauc(D$xC>%de0qN`VG#$ALLB5ekOWw6Csnd=4aSmAGu+2W^0+_o zBFM)tYB@K1;yz5zY>P+{1v7cf0=?ncEjg(LmL65-CiC`^g3)=pY@U`ce6enNT~T*F za>i-z)R{59GU|*GPsjLHk_0)dSK1LZzjcJHb*oIeCB%X&)zSDngi6AIgkD0LseiBC zpNK`uAaD!%`fR!(eb4}$7d~$Foe4st&<~~jmHu*eIwW~^$5P{SojeR@Uq4o&#<1y@ z?x>@x6yyb{@5%08-w{YgRcFiV%}INZDgU|GhB5ueoU4}>1P55)iBTgP|@E~ z9w8IK@YEbANXIu@&;rCqe36d8su#6SgVb!G!}nj28-gUr!;=j9 z`4B5qf^z<1$5e{M`WS||0H;;WpcFp&;rb1ob9-{wKkDn@J9D2*ypMwrfhj>sESNEG(mrsuAv4XO4~ z%^f83tY5bJTEBYq$YAO5_^D$jg{GTCIV60UFLMwj%-{im@tb2Zp+%3?$@=`n2XxVP*4?a>?>)gfuhtL7!ld z^SEQA>2z3nf*WJm4i=-y+>?;hCt+S)l6Y{HO|fziv}gw6cc-i<^ITA0m4anZUwhf~ zQLW1GS^&N|5^bI{se9LJhD+M-FJlYe>W@#uN?LGv&h$Fx5950V3B7>K+J8PjA0zBp zMKPfMIMam)5Gl;anxR~idJscazNSitb}80;G|KB+dlH^X_G!yk(tG1vxG-;PPtXQX(J5^u|86o?YKG=>Pjf4@Ob%7wP8EyC}1UXk+mcJFP1a3%B@(3 zDE*kw8q>MV-a(!Sct_Yt-6{LbsEZtrBH z*;Co8RZX>^tn5$1+;U>^6|+DGAw%@lxZT>@8V@U^j#ss%5cZ6WA!&#-tEze8jy^xO zNFAr>*qP)$R>9m9pET*=TKDqUqPxw@Ct1@+|CO zD06<*GUI;KBSZE)Y^gtlr85E?%S}6wQ_@_aBo!&;S0c^Tp_~`10axO*KkmH1`E+bQ z1k?{Ad%lw6gSlFRC}jI8S0-&Lz8pI9umBFuP*JLWb-y3~XXf1{Dn^z2H3r9KK$KS;aH7D=6 ztmL%SM3(*pF3h{+F2_Dr%y0h8UR)MY8%)yIaq;_7VWOO+6nVgjTT9hBWKq#B1!&%6t|hR&e}&=Ms=$qJ-SbSaj>gWE~M9MFnM) zc$gRHpD#XnDjb#J1M>S9Y_if^v=Ba7x4Uv$iSPH;E3e)ZdLx23PMJWt+tIs=Z=s^) z)Uh7E{|6kyfT)n+sBGGu9v^U<4=}r<`qeaqN|znmFPk9{jr*}yRc+_-skP4;FNFW& zI`Au^2J0?Sjk0yLG;8Ij1dnaW@+`BOCtBHRe~+QJ>J zaVeMHVS&6i z;<^yO;I@ut%ic0;D5e&pMfm%{)RyJrPFm5k%Dc$uSFYELF?G7D^8Q5nzu2(@+^5%F zGO5k#$~8~LU+g8I+4Ne}fEHTk)&d%E^#LIoYl(EMc&&|;?lqjlA0m<$d}wqQIKfnW z2mXyYX(c)#lFz;nEk^%FxuJ&-QK2PnYzH${N5e}aHU_wvS9`GMs{YbUg5!Y3QVSrd zWJJ359)aq{sb57+10;i05D3dL&z&C{wXR>|_5?-y>X!#Jj=_`e8$#%?wrZ|>G{P|1 zd!B@9kc#%ZG0?%*qjV2GtF6+B9J~NzdRv6pj`MB4CAWcp5|clnP^)f|>S;Bpl{{Xw zRZo)W^rb6XH&PWDdTne|neuDCT2;=ywUgeB-|%Sh$D^2^sQ>mxdUde=wAAzLXtEr{ zpn?`xt&J?D*aafI%w8d~+nu&aG#FyG_?O>jcwXQP-B8nqClV=X@ zeIV^VA8kCg1Bm@})(l>QRsvATgt*J%LQKCT{@};wY9rfi$1&MYT|v;6WlAw0s-FKM zc(U8eF(Er4_Wv@4_Y0{Ip=E}ljEBj`(u83`Bqed|hJl_lM2R-O4FJ4FYO$kS1Z`)Y zx}Smi-a%9nm9uNQzdpVPWP=Hj&I94Z*@0}e?gY<04ZohVbQy&3Li?*fWzZj0x33)( zShez0(A1pBvI(dI(;m-)B<3J=wLQ0T3NQMA6SNNWvT&SC<9oMy#O%y^ymkj1Dp5rT zfw0?d#?n8g7jd^^!w&Cx69_E zv%c{}z}MbNV4~MVe)h;OYGK)klJwH~xbsip;1@}-O@<@BSp*PX8Q^1JWNB^n&%cb= zFZX3yg;L>Bh^V}YRiz(<2!f8H64@BeHbC9RPOP2mPdW#mc)WMZLqDH2qFER1q%AvYxyP`18+Q zLi^e){n?R#U)E*En@s?UwEG6gb&mUo4{G^=`qZ_%W3e&kHnuD3qHq_HT>;l9`t(nw z;E%_1Tp7q~Nh0--bmLzu>813o@7~?aKX9*2?{8k{PPE1&=VW6UC# zXI9R5y3`y-FJqtBPS$yrxopksK5lo1N6s$O3d2u@J*TildK`183;utDPaJ87qx$K+ z=La<9U)|AF4QMs80^+b_xsH_q`^uy+YsKTI+N(WkutknY}vfQ%azC(|(i&d#vq zCB6~ATyg8tC!*@#m}Ac0%bvf)zARdTn5j7+`>xFd!OH-lU)3N_^7&I9PG6J{WRpD5 zd#V9bRX4v-bL!K-LKy*>ufjzNvNV4_^V8;^w6S(x-qQ#%d!6OOe#cd^yHZy$o6!9M z|F|=Z5!^IYYL4s;=rXnv#cgXO$hd^*J$|@S!Qa)!_m6LbUwwITpBfESJeUAIV~*=% z!(f@Apk$8rj&{eo%aZgg1fUM%SRU&#P_94Y&o{XAuUis44@6|RAz`w#IUf}mD z3^_?hH-ZHTvuZ-G{_AQ4?K0#Y9ul?(lwA8-cqs%eHomu#J=MSc2Os)M<3y42UsnUF zq6d$n`{qM=Zm2)!O*Nr037n_mh{5DMX-MSb%*)%pzjD^!yJJg?g~@=($*jBu>u*{Kp=BI@!SqeEJ3Rw6COLV0<$kUR#%I=S(jb;c>gspZHTh30(>Ye zR}l?qNVmUeKM58-%;2&ZVjDH8@kcaby{6=w$*TljG3*D$T?Ij=JQC^F1`@UzD51;4 z=zcUOFDdR>+H>XlxC%-ZTqa$Twu%IqaVbtzXUvY-oIfZTac>{Z`1Aat>x|RZx#oQFO&FsxC!#fz0{d ziPdH4A<1#&M%|G%hRI^jyEIxOK!P8Sj?rmPfv~WYWC+&GVt4UNM9g4O)puZYk(W%e zoYVYvU`32cnIv6YW7;3P{{uTBD4}{3HM18*7mWCGHgB|9fZAWF0=z zO&e9B)MExZj`9{p&^?Smgul@`>#OIH|8AN|HOB^1T9%FtI4}jbg}Q~?j9Fes$D=d| zIuF}6%Ak6bH)Mq9ey=Kj?Z87K37O5WY8}9|AFT}Lm;b>h`P;P?baU(^^8LBKwbLkcGU!MH*FQ@yr8$ zMTb^Nv=iOd2}mb1i^jJdHCwzQn9wzJUmD~szn|OCr7LU=K$Hug#MCc}%yUF_?KaAE zUdUb|BJM+hSE-W!;l&?rhAd7Q8i{8($G91oS;?Rjf6_$n>2ucO7)bJ3VEjz9usQSV4$aC(T=#BlGXBTIcz|v? zjh9@;Np2gtTIF52>tn#|SAOz9cerjizJJd?u<6-Azex z9ofHAcoqOzj*q_D(>H^F87-$F+cYm`h(0+_v)*vyU)ceXgM$zB1#S zk?;MYVe|AM%{9IeSe-?c5F$F z&JJb{m``Pd(T5xZ5+*eurdP|GWJtN26KZ{|Fv^ry@d4c^V(E;;#UhT{ZDg}n2Z9)((2;=#zq$tX#7t8VI!5KG z%>yobkwl$Z8B=$V6SwXX=%9{ge4g)<=4QNXO}m79ni+Ov;DosGMx)(>8;gZUH=>+vB?pXoI^cgqgi{J**z` z1%{5;_2*K7r!Q+YUMGYg5o;+UPd^6WSJU_s$Mr?pjQ`TOYdt*?f?9~J-ClX;Q6qC* zlBAr)ksZv3iTNEqiy$3ML*9E)&=9Cl_wTJ#Zs*i6=nB_Y4Vt4FmNPN~+&70iw!t7` zfZlZhjf9K&zjPnO7--W|6~kKz%JXwX>(^S-!`SN%`S4Ph#d1*I*@x^FG{uxJJ}sSB zSFqAvT{pCXplcDa~&Hwi-6W5;9D>96)vQDvPQQ^$wA2P1kq+a4OLnw_o`F ztxQ?v5K-Tu4(^9@%F!eQ{iyZPd*gIV*tr>fHxBM4-NrJZGo>@1shW-ZxkFENfSutD zhSYU1W<+1z?A7<&>aP|4bO_(}Qctc|+qf}KJk=LC>gA%pbp2pWx_;dqFTzV_VIXn^ zbR-R;ZYl;}pUjpx*g86Z&y7s(GbdPJ>`?XE@X5q#PBHXJpODp-w~Y`VCbK9tdmeNQ-c?Q{t6vrD@dO5CMQxz$j=g#a=I10`Odqh5fp-5E z*&(_12LFR;3{Ld{SDTx6r`k6G(NDvQ0g}YrLfOx(@wj&gr2; z(8iN!;iTvkYWHVqT^r923G*st&=UUga8Apz_;98Y9oeIu-n-wN9rhSmlHSdOIOXIk zQ&0ak&)bzLN+VjlQ;H^b0W_3Q0(YIMcjohk+DTmV3)dh`#j~!Q(e<*Ccjy>Pv1adqL2XzlD~k zv?%ZIJT_ar#ejrpN{H&-<51%nGzV6ICltKXV**|I{kX^-$GbIosE)7n&+GM?VC9dZ z-6D?=w}m=6B3xcJ1VBo{Xf$umU0yR#G>ftOaj5B@EO^{LvzN!Ju|A}9SA{()w2t*a zO~&l^&~ls0{yM5=6WobwP&-ER`zQGMl!@r&+^Zp$pKn#3avLgmTw)usso(1YEUmfP%bta5%^*+FA^>o2>G4jQrvk-v zkPBoIsfsTMXA!m)MC|f$yLJ|4Rpkg+;8GoI01oOqP8EN*X*rycO3=68Tv9@e3l6cBgxwNy zd8-3lq8c~UKVSizo|Bn%0N;GvN3`#R}i>^>E=lFd5t2;hD%Fr=su8ao4UwBri7HOg3UL zEQG%KUM{v-G^9q-5}fLzx}ow&qIPw64rzbm4MB*H|6Akp93(x;pr3{lRH}|j6O>_^ zyo+P@-CU^fK0nczB7|6ty{x8<6s8k&q%NGbdW|NyEi<68@)GXOTKS}vae`}_<6=)ETKk4Q%`Q)qN5d;2 zI7%C{Fh-WKbPrpsOM_K(Usil(q-mXPcMVp`Woo4=9GBOJ~S>uUcF?vy1~E+iPb& zUXEUvx&xG0ldOwSxMQvG;bQW|TX6iqK`|x}&_=Re$TpkM=_^GLr;tP647ul!yYi{L z{JCN5&19V7*+@+2`@S7np)jMaxVFIB{&t#!Vk$uwHmV+v)xwrl^jQPVG=R-3SER*0 zlVGW!wR$qr8{ofm`1yYUL|B!Ypm1(q1IK%En{)b?x!@})l40t{nNdTO)wIB9ppU=N zMi3;$=U|b>-bT{Cz>NB&#*YELEHN{A>0>jl-I5IfRtMfS@6&^YaY|cs@7$8pV$U@b zf>ueyPMVpQRO&V)(oMb=4$dc2Fw0PWX)p9!)ee*zlK z#$=x)`3|Zd@iKzCTzzAF%2!=L^s0+{MX;pYp5T#(^kD}Pkl zkc~rp4}n`~BHRJaT(Z_~+lyZ65Y?k&bKkQ-pJ>8WU{uKbaW)hZsrjiT9d!6std-z| zkj`Jb28!_**4bYNoCqZH+XAP?Zh;6UZL^u;4>h4PuYmA+WVA(6|zl6Pq@ zLY6Op4qIa$e02TtA>`I}$Rm)Yu++Ss2g#wcvki z1pu5?iK_vPR=AwM(mT-|tLVb74pd{2!!N-&+D7MQO3BF-5IRDBpr_9Ymy9)M>o~;s z8-T92^ShE&^+wt<`mY@P$htUT;H1z;Wr}aN9zrx7WPr8+5C$f8fIXW>qfwq<5j3SAbQXYZ?+DXG zw}{yh_u#V&x$PE^Azd2Lh372N!XGr$1M99VRO^HRdiHmk4uMX1fG^2+ z9^WtG#tk#=q{wJHX?abh6?M*z7%S`HBY*;Mx6ED>^U^oz53suU58)U!)U7 z?0hm!5Myz>0}^2Me2lpTXgQXo=Qq5FMG8l*`n| zfb-Bnt)#|1t)k~I#W-R4m3K_(1`D|w!ntiy@iDma`} z8u4bdJ7^ovr__GD1wniUp3iA^5?l@?I5|ln3d2m{3y6^sZq z|3h{@oh8`Tq(HmD=m4cSqS@@Zf?L4}Loyvk3FMvG;630v=lzi2TYhYN69coA#V=pJ z0ay#1vNCj}9#*Q2xTM5pXJ17(Nl?A{KBFBoAMYuYy6WHxGf4?%Lb0oWd4I;`rZR9s zjV&WCqOoNpoxMK4hg}dCjyf2d7YaYv46ltDt#U@a#q7|ag*+yqWDqiPtjy*H79!T* zGZgC(B(M}NLn2gX;%HxJ^HX37*sEImq5OHLdKF@sap#wp+>Lez26kQm|ZtdkJ*5NDLHytTob7C86VP8^$Bype~UR=_na<>Hj@6@;U zN_?b|DqIMC0^w$;gsmn09VL%itBBFT1Sk1}w$VV(BZGJ`r}%Gf3UO9rB#=0 zf1+qxXtZn6x@x0wd*9AIK|i`nbgr5|-H;Ab*Ow$lP-@lP*6*$gmF`SeT`>RkLm|B{ zdcI)Qb-g*@}UaH)uoai z;d1S!#eh365>T`(w0YkovYxhHzwfPoT&4_3MJ4kHKFeXE%1zp8k%PcBSl&O7h_YwX zJAh3x1x$>Q_@rr);OTH)#Ev1cta|8B*lk)WpOgM|yTwLu&9`-xQ%rWGX4h zUR({t2CFTb$_YCc7F7Ipw6lP`R~BSUGeNu%T87yzt!1(0-pTEECV8}7y#s26S^JwW z&A#=b=POpBzA=6bW_HIVu(d5>cJv{4vvz3s#Y_F5ik7$eMNnHw`CJPnFBy3DX4x_k zW0nUQS%_+&$~_&p5F}Y%YHw;p8ZhY}ZN+1&+E?%B?Z0blxWG3yB|8q)s6FkW8o3Ew zXUw9U=aQ}v6i)X92dY0r7JZ8ee~=SQ^d?B;7j0df^W3%4k8<5t`dHp1`no^aAnKmM z)aN;DFtlSse@?ir7ne@Bw1JA$1kr%=>4|h42BmOAS)aheo;`;%Iwa+fh0=Qy*N2ja zdBOeJgA+~1i}A-Th)ILMWjVC8yfW_Rplq1dF#g0FNpuuUdLQ$)1JYGPRZ`ve2_i&w zwkU-qEJnZL4uQ+PG&1TOb6X!>OVaZV4o&^}+t}B=;GAAxqjX*2AaEhqWcT&eVymlG z?-WL2`f)g9lWvbn+t^|;d+C&9)83uVV5SdN5k#=I}+sW!x9Nk$>+3k*~ZZM&%0;b`ju{X4yQfsyO~?B zK+vYbLA#02w4Utbd{9^GjV&;%Mig6)6ny(5OTkQ?5q>_DG^cjKC1w;3VoRF|&KmAP ztBdLJYjLNm1;;U&xdtHVGJ;%Y7|#z9+*{NMjq+K)Pmg!AM7VzU`EfCAKuw~DwEL?x zi0=X&sU>H1DT}r#Yvt;-*^d(ssS@ZRwkkw2(mr||NY-UARf=ryfh1{tUfAL)<|V`x ze>|@BdBba>7VLZqZ_jmb1(LNp8zMFn=k9Og^?9YF=Pe4Bb1OTAV7=D-B~|2pycJ&x zk-$MirK{kO$HDU(=LhojYp4&`oNBY;?@3vPJG08%@>ne%iV}K*w{=E?{YJ^R5?JP# z@s(1bY;TbKcL?P&a@gnv>-8N}h{kYn~m#4KyRVkJc zuPdG?1ItzOMUNWi{u~pB=szo|V-_N+vA&^Gu%fLpPKYphxscOiKzAgC2 z4g_buBP&~mi zM0{RQ&PH>kiwXaQ8HcKS4YSRqo9-nSUZ+0g8Wy)J^#AY3uZL$)p^H$zCCXsRi-`a=b;=uIH$mco$hg<1ol z_JzR$I_JToG+P<+-AlN1<6rP)gx2QQHbh;xQyw>H`e1V;$9xD~%z{P=P0}X`gwCh? z5aO-vlhyq4-R7O8kV9<<{Hi-;eK@5y7DA^pG$DLeF|8|+IuL?NDPck( z?$px0Q=Yk0`jPk^7&)7CPSZ(C3Dm$M=G`1=Yl$AQUf&;kaa|_v5m8;QCpPMebc6Xz z!s9g}TN`@0*^pJt=I9{Rn~&DPVQj6JM|C6^x9H1vZbQ_1sp1LYX6FGKXGNQZCc*1}k1 zOR3H5g_CV)dt)q`4A)ZNNm z0{$FjGcD|h+J18wQ=d@0Il6U5SdFa1B5E!in3$CAy3Vx?KGc!Q-f$R{~C_k5L) zWL$_{)E)Y`3o&;^;u=_9^!X?21C=AA)%NoRg2IB-ex?kt&&q^|bn6I`Y!jod2%4OB zz3fZ0@wE{noCI>9=rv(m86gk28GEaJ!Z0RmEe2g%-jeH05G%H6m7 ztdiLdqR7N0wj2(&3}qk3JG0{53-tp#6IZoW_w~Nj`2DU-A$cR~>wZlW0f#{koCTQH ze~=lxX_yqFZu^*HH4tN6!_xPYq$Z%vQp-JoW5`h&^#!k5TKh09)CCh`8Rgfn*L56` z+7@2qm}kF#$0crYo}xU@?a)iZzJ0XRCSDV&l@@$V2k7PC$cTPeha#|}T7I=)+xCw-{h z194n%XLOeTv0l&o^PIz}m;IUx(ga^a!qO@j*#Yq5@d?G_Qu;%D+rYn_gyZ+aez0JZd zq38)!0*w&a^aBwUmqP~Oba90ci#(StU663vTG4M^V#~8q$s?XL4!CiT)7`XK;@E-G zw7r<(aHPv4Y(mW{Q*PwL;^fwzg!!IZB&s?+wq51jY7$k#i7>sYZ>2mHYTXjIzxR)P zrLWd~lTu6VncGVcb+DULHD$y;RDk9yG#Sg>RfyX$h*GWTbR>A~8m`5RVOVpmx9I;s z7-8-QM~vmgs)Z(M4a8izSg_w!9y;#0*qgd`6~D^JqjNVh`(I;HD_mNe*Zkck*%j|| z@n+?c)}&LL6v=Giwov&ErTr}j4zu2rUccvE0}2mM4(eMg@%2hia%@vPcCLmPykISO z-QV{B-LiMYlTV4#JzXsOkjfedLN(jq(-xg%9e&Q>hGeHSe#E4)b>}9(J;SZ?9Btlo zndmgRjKO>ZaRMPr!|{9Sp#p;W#k}1y=8{o{+Khe10NEd`_4MTXQQ^wt}Y{rq82F@LE^n%dPVJk}+rr zwK~aTC0+DE^yCqpI}OX=M=5@l`;KrA+fO;s-?se)n&Cjr$;Ru5pIHZb1}WwW(rqgH zE!`!qsJSeJ>Qs-)?Q)4~(l!Iy|2;}9gb0qC`kD1GdUQ%w1S087#m(;>pX3RsAxQmS{ zSV;aPr81pds+`s*skxGRc@)8G%gS({A0ug6DoU(P{Xb=qIu&a33%Q_#d09}ISMgj@8|R3B$Ax<7%$RiC2^e%RgdpBt3Iq!qJp~ zyzu>^sN|eq#9fj+IDA#9F>yv7+3OpP(QTW7y9t&hZ}etQ8XAiu%0U6r(*HdBO7z=fHCjC{K18 zLs%Wnle|}T=dBNXl7={yV$dz^c5?@1RV4%1h@@%55~F&7k@A}r?T(tOgX!&48KkUK zvuq;wBWo#KUrSL%Of>o2v`Ozb3A*cH7i?t`XJ7PC;EP;uBJ$}fwI~$ z+4tUc@%?gD3FVKswqB|&ZZ0%*pBKt~@4>fffYT@O_&Ci5^K9Ip1AlfLQF(Bdy!y$d$CUkoz8|LNxfSdOcGjIwbyE)HGtB|idypT+pER8 z6U=F#^c)AY7$%9C4}vFD1TD9}>#Z88sJY2dawig+(qGZs;9z$Ak`S(ir!ClbMA$W; zB8}(gv7JmADb%-!dbX&*zBHRbS-ZV2D>z*g5ae?Ac*ql@R^jAn?12%A%v;Rw+yHA@ z+IE{p{Bq$+c+EDgQeKt*-F(Ccb;Ll4_s!?KYww{MoC8VCxF14&VBDl1k+)H9ZSRBh zdn0s0)u`JfjiS0JMGyH9z*`0@dLxYeCtthSC%x!7tg_ON!` z^x^*gL~d*FvG7(h=e9OuxSQ&3#F7}JIBgD2JWEF;R})6>dVAo~lEzSys<@gLkGeqK zLj9qo^Sf~i9uC!5)GaTOj&r6T>JmQ5;nk9VceMT<)t7S+$rI`H>$_msoyIe@%;`SZ zN8@hdsi{X}4_&Zu29?Ildmfv(e7M>XTn@B`ZPqB0$LPhh{b1xwTmeZe#rnJiMi$M) znZR^BT1k2xEWdbnP%Iy?fGt;hmcHsB0Q9&9?6I<_aS_{xVkf( zPIVXR@rjHqw^F9FEM0Q7er1(SGV|_5?MeRC&d;6`z#eVQR)_BFz(8vdxVxK51h)9N^p9E%K)4;KX)Q2~~U`U|6YZKaqfvce!4h zGpEF&V>4PpBr*R)Q&RVBuxdjHnKv`ef&L|X135F>2;1q#R3E*d0?Y4GJhTaHVVXDS ztQoJ4E*vXSavDB~OxkDb#J7h$+#O7OEouEZk3`n|YE?~;5qdB!sKiXjQa&U8h@cS0 zN{&U-Re9KAixg9EVk0S;ee{x)>e=cRWnSvdD%A_vErz-j=hUPuH?)Cbx(~hhpaf-> zD&=|9uEK`e7g6~+b;&d7|I61EL%uFEsYC@knKiEHnmO>im_d48T)U0Vc zb)1bi(NQ)Kau{Jk#@$lm6n)s>BFC=q`$MjyE!wHWtRHa9Me!qxTpYTCd)$o)(w;KS zBxb?lTyy0;gCt({#ux^YLux-Zwl$Q5`|+yJ>pbT{Da7~QS1rov%nZ%jDKF(0WNKA1 zK1Mlw3ip@^_aptVMPO)rGpiub-&Wc^{o>qr`~Ch~BHyKbkI{_Ax&#g@ef9|nQ-FGV zlHf&0H26%2Tr%OQNqu-YF4L>LX7aU!AGhl99e%WFf3i!lkZU045fIzjH1)nY&izQC zfu&U{s#2yw=4G8xr1M5Ax~VqT{UxCqX}0=;UaL!<^EfwO(Cg2pXXzN7PO`l22h+&5 zTT=OYOW0Xu=8xYT3!Z&iSvQY5e+c#aTP z(rFv|5WJ3NaNnFifAiKy<&$`=+>~iSa}CO0yp>TnLJ4VX;S!ntz4dKTee>f!&YC+CETVF%6s9hMe>#4)^x83HCDOYxuf1>t>z{iNyjCmZcY94hn0z~-<(C6yiJ$KI zwOAK_MOia?R2B=1ENOfBEUBw{g?;8>tq#Eou4v2Z@!@*cDwU-QF{H|qzSzm*#(1gz zl69FhCpP=t z57>?k>c>p1f0w0AH{W=y8#-NJ^M6C?ddXbtq~#_`&oMl< z`}Pa^_np?>>q{g>8{v6?>e~pZ??55)aVgb|00&NmtV6YIyijbN(KGXEV*<(h8imI( z)tfL4L-`B{|Ed)ioc~b2(}}ygtAG`O2J%Zb)ZTc3jcef0qf|g*`4WIPqflYemg9YW zK=MBH6p6Zsl59r$7axg0fz2o0ft^2yGSs2W^Ne!hf*;ha?k;(2zY?c)rQ91$jBDQH_Y0o-B*$!CQYkCd&0cmtUnT+_4mpZ*9pgEZBV@3 z(s5?h&~9011u8%1T`zn>=z1r-zaVVTKmYcSp*uz5iV|TRX#GaYY^PVEEOKqLB3`p+ z<+lX6XnhusCSB`cn$eVh`$|NHV1d7X2c(>WF4}|kM$bKlro$bB2&gULwLi_ewE2gy zNhAiEB!z6A&G#Zta6v}&EU#+w9Rg~@WA{6M?HQE32qe~ihF`#ApKp&efT|EDsr)-V z%;TI#nsriH@0Qo&6MrgXRsWs~cjT;bxc)t;NA_|4U^5p|q!zgfX~5U{s?Aq$E?w>> z`wn^|^hC9*PF^@t`Z8{hcp8O%t9-*71S}OQ%{)z02nPvu`NKOAJe-O(dyJWiEz6V` z!jeR8_|wd+pChNUgY4T&h%EgbeVvcs_rh5y3o9a189`_9Wjlj91rnU4kNB0v6OD54 zn7D_gk^_az!Q7qwq0jCEF2Rj^cHeYROHVPsrvtUX*>ySlK~FLjhzxu+->KaMb%siO zNLm?=gtmQ3S<($bMr2GA=ZzF|ty|y1N@FV92r1ddo%8+gW;B~c^=?Y|l6@>Dl>_5e zFp{t?v0v={8vp9{tzVuv6*cy;ixsXve96vg+ZjE22p`ww0pe)sUfISpCdRXWUQsi$ zh!o&c-#_~eFnmoQinCHmmn{ZGcjb>%&HNbUKa8f40KN%RO=&YEd0z9&jT?3(l(HlRK|1eL+mYP~_T^R@pL6KJ%^{OL*R?@9RecR$w=*ObvdDaFz$ zHpMBSCUVp&dH-51f6n6N9@#ow?(*e0U+pDO;8jU^^s zH~Wr~HA&)5C~s6Hdl#6EH_W1y(wJ|erL&gKT zY2fumiY1>2&uel7+?BHwiaUABA`J~YFTfeQ#!vnHTB0OP79OnQ%vX)F zFFv||Eo&)-othYAX^j_7<$Aa3osuBX{=9$d#kH@GW0ejfGXZnp$IE_68^#=tif%H@~ zIHussQXSBE`V>TuGe2bh?kDETpaKloMA`izQ0o$EuBvZ6Wol0PF}p86A~Nygp;495yE6%qT;zkC!u z>iI_@Zeo)ng7v_;{)ux0@*_uwB!0wGO2A7dcq#_g(=i`4ka$%SnbJ3C@y+}p&Y$r9 zH(*$P8i#x^d!HSEi-u8zg~0UXiA$$35)phla2o}PtzD>bmy1L$CBc@>8j&gH_2fIr zU5}$O0@VY4`B;XCY<~H=pnK2!m%Dl{-3^70AoJBbtkA0AM!>yO$g`cm8DIfebjA03 zpl?!^K;kJ7NO8L^B>GuG(#cw=9bAfPixDd^@m_QIN_oPdn^u~Vu9s#xiyAQs*MOCL z^FF(4D&FqOhymn%N@DLj@f+-T4E(}Cq^t?h^D#lu{XT605h{CFQNHJ02Bq?K)aifC z6-}5cGD9ck0XtWP3jyiOTtolIO+>EgjM?NTx=->*Wa|xMT?r7~obuRKJ|`n+BmFcV zE5xY=`2G~CdH?AL#1U?bso~N?Ma)LXwmYBhH48x2*_&6g-y5tdrO})PX>xU#8GV*@ z^QFH&%{NJqeqtCTcYb`ryU2@_p~o#^$vtzQePB6|_~OY6<4WwZfN-0!&ns^t{x9-{ zplR`mpnsDuwtclxZ$6iP&V7o2FN}11o@=+w;CMenH0`0OvCI}<@BDemXK4_DesA81 z)|`vO@WyWdGI{xvMvqVx+0B!9`^10g7A_V` zx_S%lB1+yucwCrjQi5KYyn#%mrUBQI6D5;1_L(I1{TovBv0Bw$6YhIDeY_Qo_FL#f z*I79}+Ss8pdJgN9eAZ*bcq~%!FF~X3C4xvm%O&&w&-nLE0&XY9Jh*_$%j=3fVJRYu zy`VJc76Iwo2Xv=#@NXSZB@)sxO+{Q&-mVw3%BnM1oGE3)RCunvOh}Elh?BsR{r{(0 zh&Uix^wPWY|KfdkFCk49C|Y9xXm9>VALzBYXVP4zA-&=^kY|xXdYAFYJ4 zfg250XXFYjHfKvkU=pu@4ksUi12m|Y4Mbm`x2@j(8f#(qzaBtcuc_4VDIn54V@&u_ z0|lWH5Lr}E*Mw`^z3l*3bWt#+MaQcR2z(?Hm26jZ*K07#=&4H56nWHNEKkhg0DA0uc z3xNNS=?j?C`5;=V?{|v;|KB+?*%s1&j?xCH{_u;c;Km5vA2YB$U z3wRCc2nuvCidye16%iA{?<^;2k&C(e<8_b|xYw2UZ*%>7`uzRVH^lpO!y=RuZm$Oy zcy><>8sFz5fdoJ&Oo83cG+KU_{htpdK?V=?XQ4QO6MA`JC@+3>ymCmh*xU%=8O^Q2OxZ1P%vTw_5~Ko7{SO6ZS?Vy3?w9VcRYxv+<7!L6qSEW29Dl z&je;f#5t%-j6Z&Vbpwm8yl$HL`2ahOE=nr;n)2;yN)-(a9UToZ?rXePr(e^(N~NJo zWj0JSlVIBSBE@}^%}&d6TS1@tXHBGX7Ok8Ch)>Mx0vqK0ARf@ z4lo-Wrk|Q~#=}WI8up76_He_0eox*@=en(`Tn1y{FBDnX0Y6)4h34(+?$-Zsf9)<8 zoNEi6)+a*dqgMXuCGB>B-=)_TAXfe}0zvpMy*#Uvpx- zvF-0^nkv5zzP+&*5%}h^;KH_FpAg)rv4kP{ub&bb#4~k{+_~d*1ivN=e;b@F0s!06%BwcEfqo zxSRIz&wq^bLsKR^-SG0izmY$G@(w%8 zK4&EL7yq2$RR_6>b}&H5z^%a(f(9t7PT?Nze?Qs@oW)BCvqmnhK>*hgi9NTyJk-@8 zDFmKBF0l2YK%*T!UgkSQ-e=lDyJg7_2^A2sn*l#eJMlK^>OWuqlDL=k^p28h3h_x?P8xPF z;A}w)fhZ991B>mTY%qeY_Q>uvZu9>*ZX2O18xyh`n{+E&oUHZCit&5-$9wZ1 z#2%t|5ZlO0`q(4??Hpbhh|OT`-i?5LkL$vP3+MI>x&G(5q>$%Q(M=(Rp?}Wx(FP_J zGIrZwpwkBS=<5yka`t~rs$K?|iUFyTaWEBkaL5T!UtgWGR;0vZt%Pg_e9#RqA~M;W zIsbe18zR4GgvrJZMud@M7(({zgi7Ah4zy}n?P*~!H=+T@#k0e){-0D%WblaIpI~8o z$%ua$>84Snod9u;F+}gi00b}wiS-;nY`6iMz~)kiD3DAyDgX4G`Ohi+5LU=*F6TZ8 zA$!w#Z-}I?1^9u{rm^8@u(ZYq;@2zpAHuiM0bUsLYD)AQl7GG>9ON?+q5g=ATpkbTo2eJ}@=y!WvWS=ba~5BvPS;|e=@^cI949QbvgcQOWdx|boMh(b1?D~lS- z9vkT2J74ETFWyU8h=|8OK=waV&J%C*+XO-x+~b7RHzLge8ZFz zMJ%x_S=gIqzrVetu}-IJD>m}rW0-}=);NnXT(YR4cEAHoHAIS?~AAP)6foMymv z8%m0tY*3QDN6Q--=wk_V0ETM|cgQ3j)Pg%b0!a&*(%HLT8>&FMaxKNUF#MW->FG!5 zQRbR6rB}_2|BPvvN)30#C91VygFqgb77hlF!vxeDg_VI&AQK?*c?j|}w&U$aBXBV7E49(P!Q~O~ z5p!_4JMd9|U??NkQd8?)(ANL?y8mN)IpKW^XQ{Ue`ZEn3$g!Ll2-WCvseRt_hzAa_ zybx=>7wQeS#bZQb)I#$CrajFZhQpoZc^pf8W%JlnP8_Cq`nVTg|IkG$T1Ec=r?c%q zzv(?nATO+1dOm|PYq?|O@0xNJISM>UeV~af=1k{)uep$C^_=0}$-dT-SGmSt2wkrV z5sFf_@}4nXm)nVe+zu5c8dvhrU`=E5*S`@|*4iAtKG?D{krh98*?C8?A(BW$L{wfolWx-+(#5-X zcnq8pG$gGGwvBX*QtcFfJu*tRBWKt5vN#t#`aYNg*PKQKqkj80X-wEbKA!2y-#$Mg zv5=3;4)(bfi3}hu-Vxa*P!C#*Yr#b|{-OP93SI}$s$NBiWXB-1{@%ZiU?ijv zGd`8Sh@4_x(It#Pv#_ew67+lBJNlUkVaB*766s!zY}H^eYDW@3+>bK}4LNnq_}ikj zi?!i`vyM9z^g9OCVK)~4@cEkyVCFK13pvASUYWphtgNRUtWg=XagAS~w?)zQhM0kMa6=&e`-6^kApB5sjdW!ud*%^tf+uqEG`7%41AS4CZyT9Y!d@*$r zwLcqv-F;EfzYU;N#OU{XM5Z)Tr})VUP{5>l9XWUX(#GRh_;d!HPY$y0_XqNPo9~aj z)C?|0E?=p~S}IijNHI!lC+H{AR!n619OMPRzo!(QFkLCRZe3O{^R?kcSk8Rx-0fwl z3eDxu_sb!1df|duC#!Rt7rgn?_~nusDIVFExzk%xkb8|}Hs#c@MeemK@#ni6M95y6 zpn})WqWz!^f}IFRN<eN>^}2Tctd%fcL#J*eqb z>TP6xCR3%+<=y@9>PkCg*&fPrnu$`;iD0fyL*GFdN|J9g@^C@8YLN(p7c3$MWPf)% zbD5OE=ZLbrP>c`?5u*}QZr84KXSYY?c!2*3ln%MnPvY`7^U_xog$I?)Qg7$<2QD&* z+bOtuGdsHHRP!@Fc_~7Qb%b#J^__45c&(rDAUkI0vc2#_vmsOEhIgAXnG<{DG5~~~ z!S2`&pmXgz(gD=XJ|d=YV~L?pczZ=L5dn5|;eT%M2doX})0v;ZS(>W*iT;nTzSfpf zGHINi$8LS_vyaigPUGazCTKLTS1hygMPr~Lhh_ih8$54$+zd)l#y2zDZc^O~PgZwXnwj)Fc z-@@EpiR|F^`)aeW^IV(*|9#=1L-Z?P_ouM%spfwQh_2EYA?I%AJO0;qcTB?$3uZbc>StaJ_c~ zrJaS3G3xVpPd5KNu@C88hK2r5cj30E3~=zzg8QjI8`L?b0xYC}AnkU@OgxV`cp;7# zA=~W6XZXID=pk+UBaOzQKai2}Nx>iR7*PzYQ&aC=;ljaO6_0!W8c! zMfBN=?nAG`XtFq=Q_jVk0(bjUf^tL7$_uBZP;q^{u+(&(m{a3V2f>Vr69&4f(7O)# zhy(Bt-kl3Hq6B*9Gf>iuyf_6OQIV4}iX3qC849gROr)+O26qE;sYK$!@H0zIE1~!9 zvFcIzPw$52eY<&<`_GH2Z)+SnxsFU{6_R0)x-I+M2Z1RHsG2G}V=?EwF(eTj2CpN* zgMNK!D&gfqcYbZ$3MB+D?_IyB>cOl-;`ovS9F6mJ%6gGpX$r`2N)HD&-iZ`|2i7^) z4zi-Eqs_KC=wX$SWgo1LOT!MS$mE37Tmw>ECKlM#%oIMT$-vAoH%GC;yFTH~P0+o` z*^w$W0Wbc=Nj#Q6F+Pw4q2nKgn~MY$EMkz(T&M_ylSAa&w09>rbp2tz^*$#r zd|H)?hMvKjx#T9n=Mzt)$MFrpQW_TS;94F8N8Beb>%fMyh`8nY~t`O|EIiUp48eTqRdkk4CEoSKWa;RV!mMq3eI=mPXm6P_C} ziRVFVEgeYfpMK-W7g+GBaX~7LE2`{=jpw1(=dC{uH3G=6JTbrwUyhbv>YqH`EuBO9 z?zjqUe7h1*5R`h5t1uVs{PH0G8kNvvD(^akmN)Q#t>$;qHQ3IyuwY|Ao35{WVh@cW z6CW^<7tW`=j6Vu$5a;@c*a6J#_H5nThrOsnSo972?#{=c#t#1| zMh~G~&imc1!`h7i8~Z&oqzxMi02c38^Fp5;{&qhE(Vywz+{E3VZ*G&PK4@|ss+<@w zRXa>Bm5LUQU!z6Lw{viQRoyK?;JeqhBxw1P_hju`P72=9AYj!dyM`~CK0G1 zJAujH5r8O}fdY~4AB&gMEK0jjG+op-6qD7^iXiO|<0n7@4gznamj*=sgFpLo96KSF zuWZpm>}Zi-F^ooB+;II!pmkq6{N54czB`iRxc2d4wq78Q?j+ECO_03g%7t`=tW?V5 zUw(5S$H|JkhcbTBlB2GPjDjkk1S#$&9?}OS641i_b4mWJoV)(1hn3CPs$UM|%S~Se z=rr>D_<6E+bb>b9CSMSeP&DybQ~lyPruvoH#*qTjJ3J z<%pV9D;qAbg4Q@U-Jf`B$v#q?yUmNZ=qlq?U68her!U?xMf3|EKw*qP?s^V!&W7}- zH1%JU*t|mV8>^c^A9?{-+~$ybDIjHWd&nwt`7ZxSwx2kpF@Hat(>S~S($>&lkmoLH zId&67B3+PR<>U9Rrhe}cTlBzx0aH}_MQ_f4g&Dh(=Q+C)P*V7!%XK1nbY&Sx#2r2& ziC(LZLzjU`b9ns=-%2^~p7{3Q>_uWtnv&*`pbikF>nW>rW*tNJFlauY-n3bB>GYs zKqoXFtCYh)ptUl$r?|Oyao2Byfk#NrZXaF)MRojk#3;3dN75-Y8HoG!P;mBt-}-PK zxL-gQ4)XfC)mq>WL;B3;XdqXUM`igGdilD&>9wzare zFwb@CJg}@hLLrS_|KwN?iiaIbId&WGjPAa=BFlatHo&$!H(ZRb?!)D*ZvIm{MGfRTFTV2wxtM`_?wT_-_4WZz+ zyum4*#?qpG!D!O)>*o8=eA2Lga}9Efyh|sQ&3me&F_${r)?Fw4c`J_(mXn8aHXhCk zEM+7=3;e1Y!&|o`YvsAkyL;yLo~H9)lB*FWekwc#{rP*E%eUdFXh7|`9<8nIL%oI< z%IeRXKDf&p{%h3bAgvlJ#==NI&$_dR*jc!chPr5376nWaHzg!St#^Qfn(ukPhXd0n zu{m8juy=BYJip$APtCh_?r45CrLcT?m@;_&7LJDhU=Y$?m5TUe!1yzI+jF${NaXx3 z+?cb}@5MaK%y)6~m&Ov5d3f*UTw3*%>tT!BuYERZP2F<{VD*-fx(qGsaFY;eYH8;5 z$o01|t2i?y!f*hzBTs&EI1*hOb0Ox@A)3m_{sX8X<}LY>O~)OdzAfn^@MLv86{SSb zdSq`gnMPWC`U{_iwJX{vJ+ou!*d1YHYY>@A)|G~|V9`AmhqT;IEwte?ajt9kN-aj0 zo6_7Qt0$FXp=IVw1}i`CPf)vOqD*y4JltCCme>wcIr(2>3SyKn(R#+m5#M{GLl1J* zC#3#w1nE8&<*HRHb|%>}ucmNXlNCQx)|t_|fKk(3XJNzK8`$g_vf}-+ zF!^C^@7?MZE9FLl;;NztSuwFs7)&bfRjRsucT|(32q4MhHoNhp_)U@Uaizofm3g*V zOA9{^yQVMR<42;8@_1?rIx|V*J6KXnWTNN>{3dj;lkM@s!cL%dnuE60!G+`Xr~|C5 z|Aoim(@hpP6l)jUCtDqXj=r{<0^!83u2dMpjY;|g@GU7VKf_Ygd73cN$MPFzE)T~S zmYeJwS+(eXC{+DA0}ZZyNS+*e@=rn!)bW58j;0&IXpjOZUp%H$+(*K!_`>P=nU%cp z9+~&2FAODFlaPPWLL&@oyY)pnm1URV!AEP=N7IZ?K;G6HW7V@LRLJ5pR)Xw(;}yp} zGJfkHl31x6-6%=}YJM%JN%_~d^f|+!V0ofXcz<5;qmo&7N0?l&Rlqf?Wxa)nU9xAT z0X});%>o_%rBnOZGc)-NUC$uUUR$T_@T6yH(aPsn(V=vwFxHZI?4aclyL2i*VwufB zMPTJigZ4GkpB$488*m8vu*C1#{?*Mer{+$(Cu+GLZ*~ChMJhTg$f4Rtr=&P8D;d;? zCByMad52N>kCvKDbS#!?w110MP7K*%rcY7+7FijVP$RBtuZ`O|bqpufu)^wBTKK|B_i`D4{twwU3EH^GY1>FvjoQJ^Iyp9+mOm6$uB!%*!DQ@diQeT4)CZ$mt0%wFWzsnieiFWWm(xv*o0TbimGTE|1D zN9O*umsQ{_Ddw!5G1FdIacwL)&ABA>?B(0Wi3sl2w2D^KFILybxF>%%@+El>xtAKq z;3Pg6D9*?VsHmudeg!?YD{SjM7S-~5iAZbR^EU;Chp#b=o5cVAMn6_a*Vg0e*v?^~ z_4Kh$#cIHZ{KCr>R#gY2^y7_pDqnNY_HNiBb5;6r z`kGor|LS<>!9qpdyiIW0P*lp3q2kSsQ!k$ldC}csC|Ot^Dyib$l?p7M@*x;=2pK%c zS3i!1*1!BJJE?gMmdn8z)`dCk(E^63op8FbFI@W-7zb$?&NMMmixABM)ydEThTUsB zw;i74^K;~^)8;JuV{(dS1kpe5lY2Z0-V7ReVWVqfD=77xXG0s0yR9wd2V{IQ zyBsL*fl$iHX10{gM9bz@I?@_|GU;a*Y?^QVj-GkG;zBY&NCo~H_-b5TLB^#(=H$Sp zcJBya`i_&=R?32{eQ0ZI>GpdRJ2@~l9fHd>9*DT+DwBhpTDZ;O?O3g$8kd}>pNnW@ z($Nu~nvm}+5VKrC%DgMJUNzb2J8k9G&Gw?!m1<=gjs9kf1o@PCkK-*Yd05DU#ieRG zpoTQo@v@PA)8F`AyB>F3Dvrs%zYn#?4T}2-r9I64C5Ooh`pW*+AxB9fDSF(pF?z(( zjN03?dh>lj!i^@!juqa0GQ&u>;SZqb<*P|=+>zLN=K0Cmk#v!JKE5iH^h?f%0IN$^ z(9IX0+pMr(Y;+vwDxvl53BSx@mP@H~y6q@Elb;8Bh9bZ$%+M_NxF8r;%&#SnAeqm< zs`;6_+N;DFt^Pn-=ilsNIJ5mbp{*s9w-uTSt1VjjvunF7OiiCZC^(AcxmdAAi4hfk zcqj&aD&h);MGds(*eaR^uukNjiqqMLuCnL=0sL2Hu4wYUaX$0++5u|Wlp|J7FPsmHT! zR!4UTkYoEwUOS*eQPQQNKA!zv0A%?6^3Lsm@=R9`LFIUho`^l9FU8n$%A)=CEjfQ& z&Gl9*1-oIS@Z9`C1dKp3$Kl_&XSMn4&GVB_76-GI9G0Q`C*5WUC37DX50KyS+^7wi zuT}f4+0;vOrJ|)LVFe+9BPGD=mRfu?2gPG-NW%e7GXN$;E;tSbFJHz+dUl$-&u_(VM;>rw5~BwSMamuAQ#U_T<_+M; zvGl;XJL>oGmWl9TVhOF(4j*g%o=VkxHpdt9B&hT8 zndyLUI7L;`(%)Yr`As9deo14H*@p_6Qi=Dmr62HU)TZzjFP!dka#9`=cQESt=@}3f zXfu!zEroY$z_(F&vsRza;i7}Pvf33)Z%)_=p@`4dZVU{F&i|?v$&w1x+pK&S?#h*A zFuZ{p%MN$Ri42*9p1c*TB1@-3Jh{@k`ie|u_zaH7le z)4&1iBvp&WQWK4&rP4Zbst#?>qu3jxkgac3QOTxrzSJsO?!EI#Xc z8R-sZGnPYlyrp<%GI&(NevDn(MX!NlKQ#ui3vM=LY@>R)TMj`=fJz?{tbumDNNNTk zXgW(Cibh6F_Z-H{+}oNkf@z%^Wu~SKJKIcdzwP9w&pMFVm@|fTrj^WMaB+4YKK)aW z%JBB0IBe|rl6B6ow`BM_$GC5q#wmiWxihju^Sj}5V?#B&#WBW(0~N-2rF^VCtV7zU z09U9KVQCPkNrOBR_u6(rIf94)S0o3&V)rA5}h;wk#;f z?fuc1WqTP$)W4+9|Ji(jcekl)^vPVzDtLDR_uU$ngb{Lz&w zW(C*pAG>#!oOf94{`SO!bRX%x6uBtm0S~lR=_Qv%=iaIpbW`atBzW%#wNQ-p?CRpp z-D{OdFPWSaJFTHr5I&t9$__9x?*zPUJf%W|bgO)w8{-{**8TWoo}w8d;juJLR_RzT ztI|&~6jBT&<;H>i0kO4$5t!<>f9P% z3)qWTcFTJ+4)-4t)`|uhn4@X-H=3B;cCqWTXI{3+nEc>q(+L+H3_BI_G}`u$9>JUZ zY(|!M1y>gOfhwu1=t2eG=yeW0k3hPG9#I_w%SF<8@ zF_!*fd<8b2*y^3^`ra>>=}wUorBry{DUUDzX4x0EK9 zMbIe~>!=y^!F)~pS3%Th4EU3Y7>ItIMxUd1`mXfVa{9Z@ z3poA|WxN9y8mcIMME7h$oKr|Fw7S@lbAS95)lrFsf1RDMM~UMy^pCLn(5nBPOEUFLe}l z+c;q+cBmwUNz&|-+vFC}=Zs{RU4+rjbtqj(r6If8p+tK>Yp|2u`TzXUKRz>FpZ8tw zTI*TwYyG~@^P7D3OOG@wF5KHEEsdgw5m{&S#!hWll*}e4v$`T%4Wkm%$)Is(YJR0D zhPvBWs`QyP62_G#(DwtkFT8k3B6;q7*c zWt^jmp$G7JAg%yvZJ3 z5E>jbNhM*R4b+nBx$1dSdRMHS8e0h5Y{F}7ye&MJnsOU(uFX>m>h)&i-cD1`~o zu}k-3OeL{8(gORMmNO(_@~+f7aVanzSL#)|P@pR@(xSG4Cyz}MAU|#{$NjMw;SQDc zh}(;L>B`GEL5>e0b-#PI`3mV$!DYsFC?OR#rEinQkOJwc%EM*{9R?qRE5V(CR*h7y zPz1qh@2uu(|L>T~$llC(HQnXnR!&cL4&CcC8AP9qghpZ)cTl`MOx>xxJ$<{zOb7@^ z@$$ULWo)Gp&O4h}9pNgu1a^|a3;PR55*#+ps~=%1f}nC9U#xZxyP2O+BBQttm#D%T zap9@a0l-p?eaVXB?mo-2OM`P1L+A33nY@>9wGj2$qAHMu ziE3C7m@*iutKgpY(}Bv7bJ+1yr6@8$?u7mFs32y4x0f$aQe!y}z)zC{jFvsTHizY@ zuSkHX;5Y5ns^jIr;FqymE3c@g-?rUWwWEHhW?Z-ma)Mf0d#>e~ATZEb4|5`(LmLn6 zgp`fQ1~CmLC-Q~+Xs;rUZiVsosl6NZu*~~f){OvV!iXi(o&KrFc9K91W=aS!Iblso zYpW1GNfm*A1xT|B2I6&(f`S4U3<~-q*{?oG(DSj#!4{!*GrNKYHo2)kL+(50${%1-m| zw=yVpB2hEL8#}@W#Xa~_DiM9I4ihB>(49KtoiY27LaxmbP|?M@fIj_2;|VykoYK9J zU$pipB4-XOv8hu9{{<9=GHr|boSd%itPpBC{mqcE|JMGQYZgNlCK z=?}kqujk)cd(!Z9!#R;5={0k4;Cc11j4`7KY!z2!x- z#s+9*Sy{D?a=fanf(A|r(lGbEnKDrt_d9%MCELCtL4C~t9mAu1;8AE{NrR?-SKkbh z>(Hu~Z$-gyq43vPD1~(nH256Y&*$ZWsp0VuW@?Add9mojb@K!a(*BVpBN(CtK|+xa zZJW6@aV<<+dD5^-Uw+&=M#C;a^KruK0FHdppd5lCzCalCp&(dB15utUgqA`ilptgR zM}IQwP$qWSunCeTBcF5iV2lkyLr^ts18@Vx_Fyt4ZN=??>jJjvp{(T+Jj$#>9!}6~Cq0$rFCGB!s95-Xvrv-QfScmd=!c;MDO+!CU?3hJ4 zol*7)X|*{@6VO*>+2Xrs|AK-*fw1Kqh+vE}ZjO5Jcn-+DB~-qo28R-mxT(_GT=3_9 z(Xu7L(D#OrZ1^%_iYkWQCGKqTqjz=J$vxT2*|TW}zVQI`j#VJ4AHY(nUQT3D*eMP$ zV~9W!iQ?>Q+ILl)m#>NRrZrBq{R1o=jPGa~cHXtJa*U z%83Aq_$;1Qj9d)nq;Qs_h+!a;Is>i{N3lWTfuUB+rzb5QwfXNZ^2Dq6Sf@gToWnUZQQ1afD(3)3QxS?LBi!53}N&AXtg%dJzBe+7VS~;#dEeQ2UxBS47Ok z9;Efi`HTAk-eF2pjO6N#MS~1YT`O<7+HEBR<7Y=2Q$A#fds2d@$4l5isq2Yf}7$OtM1d667%9#Iq|!k6kD z1(&uFMtP9gGK=Ym$x`>^pL8LA%vj;$7{W$>rIpDP)7%qWe{F&ECV+yw6=O#$$v?#2 zQ9hcOXVwACTA3zg#%88BHCy)RY)lZNfeUckneUI11aUqTOLGyU-6xOri7J~v_knQ8UC}= zcJZYtUa*w(A2IssEfH{A;3!eVQvZK6j0^)cc607IGvAH#mlj6(73mD3{Ne+%Eg>L= zeA0L6=Nno035&d6Y%J3yzTU88s3ri6j-ZtP;#&d^6`^7IL>mMh{{1NK7OZcLW*&=^ ztY!!N+c5uatcl--`OAq!`4-KK + + + + + + + + + + + + + + + + + + + + + Gravsearch Design - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + + + + + +
+
+ + + + + + +

Gravsearch Design

+

For a detailed overview of Gravsearch, see +Gravsearch: Transforming SPARQL to query humanities data.

+

Type Inspection

+

The code that converts Gravsearch queries into SPARQL queries, and processes the query results, needs to know the +types of the entities that are used in the input query. As explained in +Type Inference, these types can be inferred, +or they can be specified in the query using type annotations.

+

Type inspection is implemented in the package org.knora.webapi.messages.util.search.gravsearch.types. +The entry point to this package is GravsearchTypeInspectionRunner, which is instantiated by SearchResponderV2. +The result of type inspection is a GravsearchTypeInspectionResult, in which each typeable entity in the input query is +associated with a GravsearchEntityTypeInfo, which can be either:

+
    +
  • A PropertyTypeInfo, which specifies the type of object that a property is expected to have.
  • +
  • A NonPropertyTypeInfo, which specifies the type of a variable, or the type of an IRI representing a resource or value.
  • +
+

Identifying Typeable Entities

+

After parsing a Gravsearch query, SearchResponderV2 calls GravsearchTypeInspectionRunner.inspectTypes, passing +the WHERE clause of the input query. This method first identifies the entities whose types need to be determined. Each +of these entities is represented as a TypeableEntity. To do this, GravsearchTypeInspectionRunner uses QueryTraverser +to traverse the WHERE clause, collecting typeable entities in a visitor called TypeableEntityCollectingWhereVisitor. +The entities that are considered to need type information are:

+
    +
  • All variables.
  • +
  • All IRIs except for those that represent type annotations or types.
  • +
+

The Type Inspection Pipeline

+

GravsearchTypeInspectionRunner contains a pipeline of type inspectors, each of which extends GravsearchTypeInspector. +There are two type inspectors in the pipeline:

+
    +
  • AnnotationReadingGravsearchTypeInspector: reads + type annotations included in a Gravsearch query.
  • +
  • InferringGravsearchTypeInspector: infers the types of entities from the context in which they are used, as well + as from ontology information that it requests from OntologyResponderV2.
  • +
+

Each type inspector takes as input, and returns as output, an IntermediateTypeInspectionResult, which +associates each TypeableEntity with zero or more types. Initially, each TypeableEntity has no types. +Each type inspector adds whatever types it finds for each entity.

+

At the end of the pipeline, each entity should +have exactly one type. Therefore, to only keep the most specific type for an entity, +the method refineDeterminedTypes refines the determined types by removing those that are base classes of others. However, +it can be that inconsistent types are determined for entities. For example, in cases where multiple resource class types +are determined, but one is not a base class of the others. From the following statement

+
{ ?document a beol:manuscript . } UNION { ?document a beol:letter .}
+
+

two inconsistent types can be inferred for ?document: beol:letter and beol:manuscript. +In these cases, a sanitizer sanitizeInconsistentResourceTypes replaces the inconsistent resource types by +their common base resource class (in the above example, it would be beol:writtenSource).

+

Lastly, an error is returned if

+
    +
  • An entity's type could not be determined. The client must add a type annotation to make the query work.
  • +
  • Inconsistent types could not be sanitized (an entity appears to have more than one type). The client must correct the query.
  • +
+

If there are no errors, GravsearchTypeInspectionRunner converts the pipeline's output to a +GravsearchTypeInspectionResult, in which each entity is associated with exactly one type.

+

AnnotationReadingGravsearchTypeInspector

+

This inspector uses QueryTraverser to traverse the WHERE clause, collecting type annotations in a visitor called +AnnotationCollectingWhereVisitor. It then converts each annotation to a GravsearchEntityTypeInfo.

+

InferringGravsearchTypeInspector

+

This inspector first uses QueryTraverser to traverse the WHERE clause, assembling an index of +usage information about typeable entities in a visitor called UsageIndexCollectingWhereVisitor. The UsageIndex contains, +for example, an index of all the entities that are used as subjects, predicates, or objects, along with the +statements in which they are used. It also contains sets of all the Knora class and property IRIs +that are used in the WHERE clause. InferringGravsearchTypeInspector then asks OntologyResponderV2 for information +about those classes and properties, as well as about the classes that are subject types or object types of those properties.

+

Next, the inspector runs inference rules (which extend InferenceRule) on each TypeableEntity. Each rule +takes as input a TypeableEntity, the usage index, the ontology information, and the IntermediateTypeInspectionResult, +and returns a new IntermediateTypeInspectionResult. For example, TypeOfObjectFromPropertyRule infers an entity's type +if the entity is used as the object of a statement and the predicate's knora-api:objectType is known. For each TypeableEntity, +if a type is inferred from a property, the entity and the inferred type are added to +IntermediateTypeInspectionResult.entitiesInferredFromProperty.

+

The inference rules are run repeatedly, because the output of one rule may allow another rule to infer additional +information. There are two pipelines of rules: a pipeline for the first iteration of type inference, and a +pipeline for subsequent iterations. This is because some rules can return additional information if they are run +more than once on the same entity, while others cannot.

+

The number of iterations is limited to InferringGravsearchTypeInspector.MAX_ITERATIONS, but in practice +two iterations are sufficient for most realistic queries, and it is difficult to design a query that requires more than +six iterations.

+

Transformation of a Gravsearch Query

+

A Gravsearch query submitted by the client is parsed by GravsearchParser and preprocessed by GravsearchTypeInspector +to get type information about the elements used in the query (resources, values, properties etc.) +and do some basic sanity checks.

+

In SearchResponderV2, two queries are generated from a given Gravsearch query: a prequery and a main query.

+

Query Transformers

+

The Gravsearch query is passed to QueryTraverser along with a query transformer. Query transformers are classes +that implement traits supported by QueryTraverser:

+
    +
  • WhereTransformer: instructions how to convert statements in the WHERE clause of a SPARQL query + (to generate the prequery's Where clause).
  • +
+

To improve query performance, this trait defines the method optimiseQueryPatterns whose implementation can call +private methods to optimise the generated SPARQL. For example, before transformation of statements in WHERE clause, query +pattern orders must be optimised by moving LuceneQueryPatterns to the beginning and isDeleted statement patterns to the end of the WHERE clause.

+
    +
  • AbstractPrequeryGenerator (extends WhereTransformer): converts a Gravsearch query into a prequery; + this one has two implementations for regular search queries and for count queries.
  • +
  • SelectTransformer (extends WhereTransformer): transforms a Select query into a Select query with simulated RDF inference.
  • +
  • ConstructTransformer: transforms a Construct query into a Construct query with simulated RDF inference.
  • +
+

Prequery

+

The purpose of the prequery is to get an ordered collection of results representing only the IRIs of one page of matching resources and values. +Sort criteria can be submitted by the user, but the result is always deterministic also without sort criteria. +This is necessary to support paging. +A prequery is a SPARQL SELECT query.

+

The classes involved in generating prequeries can be found in org.knora.webapi.messages.util.search.gravsearch.prequery.

+

If the client submits a count query, the prequery returns the overall number of hits, but not the results themselves.

+

In a first step, before transforming the WHERE clause, query patterns must be further optimised by removing +the rdfs:type statement for entities whose type could be inferred from their use with a property IRI, since there would be no need +for explicit rdfs:type statements for them (unless the property IRI from which the type of an entity must be inferred from +is wrapped in an OPTIONAL block). This optimisation takes the Gravsearch query as input (rather than the generated SPARQL), +because it uses type information that refers to entities in the Gravsearch query, and the generated SPARQL might +have different entities.

+

Next, the Gravsearch query's WHERE clause is transformed and the prequery (SELECT and WHERE clause) is generated from this result. +The transformation of the Gravsearch query's WHERE clause relies on the implementation of the abstract class AbstractPrequeryGenerator.

+

AbstractPrequeryGenerator contains members whose state is changed during the iteration over the statements of the input query. +They can then be used to create the converted query.

+
    +
  • mainResourceVariable: Option[QueryVariable]: + SPARQL variable representing the main resource of the input query. + Present in the prequery's SELECT clause.
  • +
  • dependentResourceVariables: mutable.Set[QueryVariable]: + a set of SPARQL variables representing dependent resources in the input query. + Used in an aggregation function in the prequery's SELECT clause (see below).
  • +
  • dependentResourceVariablesGroupConcat: Set[QueryVariable]: + a set of SPARQL variables representing an aggregation of dependent resources. + Present in the prequery's SELECT clause.
  • +
  • valueObjectVariables: mutable.Set[QueryVariable]: + a set of SPARQL variables representing value objects. + Used in an aggregation function in the prequery's SELECT clause (see below).
  • +
  • valueObjectVarsGroupConcat: Set[QueryVariable]: + a set of SPARQL variables representing an aggregation of value objects. + Present in the prequery's SELECT clause.
  • +
+

The variables mentioned above are present in the prequery's result rows because they are part of the prequery's SELECT clause.

+

The following example illustrates the handling of variables. +The following Gravsearch query looks for pages with a sequence number of 10 that are part of a book:

+
PREFIX incunabula: <http://0.0.0.0:3333/ontology/0803/incunabula/simple/v2#>
+PREFIX knora-api: <http://api.knora.org/ontology/knora-api/simple/v2#>
+
+    CONSTRUCT {
+        ?page knora-api:isMainResource true .
+
+        ?page knora-api:isPartOf ?book .
+
+        ?page incunabula:seqnum ?seqnum .
+    } WHERE {
+
+        ?page a incunabula:page .
+
+        ?page knora-api:isPartOf ?book .
+
+        ?book a incunabula:book .
+
+        ?page incunabula:seqnum ?seqnum .
+
+        FILTER(?seqnum = 10)
+
+    }
+
+

The prequery's SELECT clause is built by +NonTriplestoreSpecificGravsearchToPrequeryTransformer.getSelectColumns, +based on the variables used in the input query's CONSTRUCT clause. +The resulting SELECT clause looks as follows:

+
SELECT DISTINCT
+    ?page
+    (GROUP_CONCAT(DISTINCT(IF(BOUND(?book), STR(?book), "")); SEPARATOR='') AS ?book__Concat)
+    (GROUP_CONCAT(DISTINCT(IF(BOUND(?seqnum), STR(?seqnum), "")); SEPARATOR='') AS ?seqnum__Concat)
+    (GROUP_CONCAT(DISTINCT(IF(BOUND(?book__LinkValue), STR(?book__LinkValue), "")); SEPARATOR='') AS ?book__LinkValue__Concat)
+    WHERE {...}
+    GROUP BY ?page
+    ORDER BY ASC(?page)
+    LIMIT 25
+
+

?page represents the main resource. When accessing the prequery's result rows, ?page contains the IRI of the main resource. +The prequery's results are grouped by the main resource so that there is exactly one result row per matching main resource. +?page is also used as a sort criterion although none has been defined in the input query. +This is necessary to make paging work: results always have to be returned in the same order (the prequery is always deterministic). +Like this, results can be fetched page by page using LIMIT and OFFSET.

+

Grouping by main resource requires other results to be aggregated using the function GROUP_CONCAT. +?book is used as an argument of the aggregation function. +The aggregation's result is accessible in the prequery's result rows as ?book__Concat. +The variable ?book is bound to an IRI. +Since more than one IRI could be bound to a variable representing a dependent resource, the results have to be aggregated. +GROUP_CONCAT takes two arguments: a collection of strings (IRIs in our use case) and a separator +(we use the non-printing Unicode character INFORMATION SEPARATOR ONE). +When accessing ?book__Concat in the prequery's results containing the IRIs of dependent resources, +the string has to be split with the separator used in the aggregation function. +The result is a collection of IRIs representing dependent resources. +The same logic applies to value objects.

+

Each GROUP_CONCAT checks whether the concatenated variable is bound in each result in the group; if a variable +is unbound, we concatenate an empty string. This is necessary because, in Apache Jena (and perhaps other +triplestores), "If GROUP_CONCAT has an unbound value in the list of values to concat, the overall result is 'error'" +(see this Jena issue).

+

If the input query contains a UNION, and a variable is bound in one branch +of the UNION and not in another branch, it is possible that the prequery +will return more than one row per main resource. To deal with this situation, +SearchResponderV2 merges rows that contain the same main resource IRI.

+

Main Query

+

The purpose of the main query is to get all requested information +about the main resource, dependent resources, and value objects. +The IRIs of those resources and value objects were returned by the prequery. +Since the prequery only returns resources and value objects matching the input query's criteria, +the main query can specifically ask for more detailed information on these resources and values +without having to reconsider these criteria.

+

Generating the Main Query

+

The main query is a SPARQL CONSTRUCT query. Its generation is handled by the +method GravsearchMainQueryGenerator.createMainQuery. +It takes three arguments: +mainResourceIris: Set[IriRef], dependentResourceIris: Set[IriRef], valueObjectIris: Set[IRI].

+

These sets are constructed based on information about variables representing +dependent resources and value objects in the prequery, which is provided by +NonTriplestoreSpecificGravsearchToPrequeryTransformer:

+
    +
  • dependentResourceVariablesGroupConcat: Set(QueryVariable(book__Concat))
  • +
  • valueObjectVariablesGroupConcat: Set(QueryVariable(seqnum__Concat), QueryVariable(book__LinkValue__Concat))
  • +
+

From the given Iris, statements are +generated that ask for complete information on exactly these resources and +values. For any given resource Iri, only the values present in +valueObjectIris are to be queried. This is achieved by using SPARQL's +VALUES expression for the main resource and dependent resources as well as +for values.

+

Processing the Main Query's results

+

To do the permission checking, the results of the main query are passed to +ConstructResponseUtilV2.splitMainResourcesAndValueRdfData, +which transforms a SparqlConstructResponse (a set of RDF triples) +into a structure organized by main resource Iris. In this structure, dependent +resources and values are nested and can be accessed via their main resource, +and resources and values that the user does not have permission to see are +filtered out. As a result, a page of results may contain fewer than the maximum +allowed number of results per page, even if more pages of results are available.

+

MainQueryResultProcessor.getRequestedValuesFromResultsWithFullGraphPattern +then filters out values that the user did not explicitly ask for in the input +query.

+

Finally, ConstructResponseUtilV2.createApiResponse transforms the query +results into an API response (a ReadResourcesSequenceV2). If the number +of main resources found (even if filtered out because of permissions) is equal +to the maximum allowed page size, the predicate +knora-api:mayHaveMoreResults: true is included in the response.

+

Inference

+

Gravsearch queries support a subset of RDFS reasoning +(see Inference in the API documentation on Gravsearch). +This is implemented as follows:

+

To simulate RDF inference, the API expands all rdfs:subClassOf and rdfs:subPropertyOf statements +using UNION statements for all subclasses and subproperties from the ontologies +(equivalent to rdfs:subClassOf* and rdfs:subPropertyOf*). +Similarly, the API replaces knora-api:standoffTagHasStartAncestor with knora-base:standoffTagHasStartParent*.

+

Optimisation of generated SPARQL

+

The triplestore-specific transformers in SparqlTransformer.scala can run optimisations on the generated SPARQL, in +the method optimiseQueryPatterns inherited from WhereTransformer. For example, moveLuceneToBeginning moves +Lucene queries to the beginning of the block in which they occur.

+

Query Optimization by Topological Sorting of Statements

+

In Jena Fuseki, the performance of a query highly depends on the order of the query statements. +For example, a query such as the one below:

+
PREFIX beol: <http://0.0.0.0:3333/ontology/0801/beol/v2#>
+PREFIX knora-api: <http://api.knora.org/ontology/knora-api/v2#>
+
+CONSTRUCT {
+  ?letter knora-api:isMainResource true .
+  ?letter ?linkingProp1  ?person1 .
+  ?letter ?linkingProp2  ?person2 .
+  ?letter beol:creationDate ?date .
+} WHERE {
+  ?letter beol:creationDate ?date .
+
+  ?letter ?linkingProp1 ?person1 .
+  FILTER(?linkingProp1 = beol:hasAuthor || ?linkingProp1 = beol:hasRecipient )
+
+  ?letter ?linkingProp2 ?person2 .
+  FILTER(?linkingProp2 = beol:hasAuthor || ?linkingProp2 = beol:hasRecipient )
+
+  ?person1 beol:hasIAFIdentifier ?gnd1 .
+  ?gnd1 knora-api:valueAsString "(DE-588)118531379" .
+
+  ?person2 beol:hasIAFIdentifier ?gnd2 .
+  ?gnd2 knora-api:valueAsString "(DE-588)118696149" .
+} ORDER BY ?date
+
+

takes a very long time with Fuseki. The performance of this query can be improved +by moving up the statements with literal objects that are not dependent on any other statement:

+
  ?gnd1 knora-api:valueAsString "(DE-588)118531379" .
+  ?gnd2 knora-api:valueAsString "(DE-588)118696149" .
+
+

The rest of the query then reads:

+
  ?person1 beol:hasIAFIdentifier ?gnd1 .
+  ?person2 beol:hasIAFIdentifier ?gnd2 .
+  ?letter ?linkingProp1 ?person1 .
+  FILTER(?linkingProp1 = beol:hasAuthor || ?linkingProp1 = beol:hasRecipient )
+
+  ?letter ?linkingProp2 ?person2 .
+  FILTER(?linkingProp2 = beol:hasAuthor || ?linkingProp2 = beol:hasRecipient )
+ ?letter beol:creationDate ?date .
+
+

Since users cannot be expected to know about performance of triplestores in order to write efficient queries, +an optimization method to automatically rearrange the statements of the given queries has been implemented. +Upon receiving the Gravsearch query, the algorithm converts the query to a graph. For each statement pattern, +the subject of the statement is the origin node, the predicate is a directed edge, and the object +is the target node. For the query above, this conversion would result in the following graph:

+

query_graph

+

The Graph for Scala library is used to construct the graph and sort it using Kahn's +topological sorting algorithm.

+

The algorithm returns the nodes of the graph ordered in several layers, where the +root element ?letter is in layer 0, [?date, ?person1, ?person2] are in layer 1, [?gnd1, ?gnd2] in layer 2, and the +leaf nodes [(DE-588)118531379, (DE-588)118696149] are given in the last layer (i.e. layer 3). +According to Kahn's algorithm, there are multiple valid permutations of the topological order. The graph in the example +above has 24 valid permutations of topological order. Here are two of them (nodes are ordered from left to right with the +highest order to the lowest):

+
    +
  • (?letter, ?date, ?person2, ?person1, ?gnd2, ?gnd1, (DE-588)118696149, (DE-588)118531379)
  • +
  • (?letter, ?date, ?person1, ?person2, ?gnd1, ?gnd2, (DE-588)118531379, (DE-588)118696149).
  • +
+

From all valid topological orders, one is chosen based on certain criteria; for example, the leaf node should not +belong to a statement that has predicate rdf:type, since that could match all resources of the specified type. +Once the best order is chosen, it is used to re-arrange the query statements. Starting from the last leaf node, i.e. +(DE-588)118696149, the method finds the statement pattern which has this node as its object, and brings this statement +to the top of the query. This rearrangement continues so that the statements with the fewest dependencies on other +statements are all brought to the top of the query. The resulting query is as follows:

+
PREFIX beol: <http://0.0.0.0:3333/ontology/0801/beol/v2#>
+PREFIX knora-api: <http://api.knora.org/ontology/knora-api/v2#>
+
+CONSTRUCT {
+  ?letter knora-api:isMainResource true .
+  ?letter ?linkingProp1  ?person1 .
+  ?letter ?linkingProp2  ?person2 .
+  ?letter beol:creationDate ?date .
+} WHERE {
+  ?gnd2 knora-api:valueAsString "(DE-588)118696149" .
+  ?gnd1 knora-api:valueAsString "(DE-588)118531379" .
+  ?person2 beol:hasIAFIdentifier ?gnd2 .
+  ?person1 beol:hasIAFIdentifier ?gnd1 .
+  ?letter ?linkingProp2 ?person2 .
+  ?letter ?linkingProp1 ?person1 .
+  ?letter beol:creationDate ?date .
+  FILTER(?linkingProp1 = beol:hasAuthor || ?linkingProp1 = beol:hasRecipient )
+  FILTER(?linkingProp2 = beol:hasAuthor || ?linkingProp2 = beol:hasRecipient )
+} ORDER BY ?date
+
+

Note that position of the FILTER statements does not play a significant role in the optimization.

+

If a Gravsearch query contains statements in UNION, OPTIONAL, MINUS, or FILTER NOT EXISTS, they are reordered +by defining a graph per block. For example, consider the following query with UNION:

+
{
+    ?thing anything:hasRichtext ?richtext .
+    FILTER knora-api:matchText(?richtext, "test")
+    ?thing anything:hasInteger ?int .
+    ?int knora-api:intValueAsInt 1 .
+}
+UNION
+{
+    ?thing anything:hasText ?text .
+    FILTER knora-api:matchText(?text, "test")
+    ?thing anything:hasInteger ?int .
+    ?int knora-api:intValueAsInt 3 .
+}
+
+

This would result in one graph per block of the UNION. Each graph is then sorted, and the statements of its +block are rearranged according to the topological order of graph. This is the result:

+
{
+   ?int knora-api:intValueAsInt 1 .
+    ?thing anything:hasRichtext ?richtext .
+    ?thing anything:hasInteger ?int .
+    FILTER(knora-api:matchText(?richtext, "test"))
+} UNION {
+    ?int knora-api:intValueAsInt 3 .
+    ?thing anything:hasText ?text .
+    ?thing anything:hasInteger ?int .
+    FILTER(knora-api:matchText(?text, "test"))
+}
+
+

Cyclic Graphs

+

The topological sorting algorithm can only be used for DAGs (directed acyclic graphs). However, +a Gravsearch query can contains statements that result in a cyclic graph, e.g.:

+
PREFIX anything: <http://0.0.0.0:3333/ontology/0001/anything/simple/v2#>
+PREFIX knora-api: <http://api.knora.org/ontology/knora-api/simple/v2#>
+
+CONSTRUCT {
+    ?thing knora-api:isMainResource true .
+} WHERE {
+  ?thing anything:hasOtherThing ?thing1 .
+  ?thing1 anything:hasOtherThing ?thing2 .
+  ?thing2 anything:hasOtherThing ?thing . 
+}
+
+

In this case, the algorithm tries to break the cycles in order to sort the graph. If this is not possible, +the query statements are not reordered.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/05-internals/design/api-v2/how-to-add-a-route/index.html b/05-internals/design/api-v2/how-to-add-a-route/index.html new file mode 100644 index 0000000000..d7f9600e0a --- /dev/null +++ b/05-internals/design/api-v2/how-to-add-a-route/index.html @@ -0,0 +1,3035 @@ + + + + + + + + + + + + + + + + + + + + + + + How to Add an API v2 Route - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + +

How to Add an API v2 Route

+

Write SPARQL templates

+

Add any SPARQL templates you need to src/main/twirl/queries/sparql/v2, +using the Twirl template +engine.

+

Write Responder Request and Response Messages

+

Add a file to the org.knora.webapi.messages.v2.responder +package, containing case classes for your responder's request and +response messages. Add a trait that the responder's request messages +extend. Each request message type should contain a UserADM.

+

Request and response messages should be designed following the patterns described +in JSON-LD Parsing and Formatting. Each responder's +request messages should extend a responder-specific trait, so that +ResponderManager will know which responder to route those messages to.

+

Write a Responder

+

Write a Pekko actor class that extends org.knora.webapi.responders.Responder, +and add it to the org.knora.webapi.responders.v2 package.

+

Give your responder a receive(msg: YourCustomType) method that handles each of your +request message types by generating a Future containing a response message.

+

Add the path of your responder to the org.knora.webapi.responders package object, +and add code to ResponderManager to instantiate the new responder. Then add a case to +the receive method in ResponderManager, to match messages that extend your request +message trait, and pass them to that responder's receive method. +The responder's resulting Future must be passed to the ActorUtil.future2Message. +See Error Handling for details.

+

Write a Route

+

Add a class to the org.knora.webapi.routing.v2 package for your +route, using the Pekko HTTP Routing DSL. +See the routes in that package for examples. Typically, each route +route will construct a responder request message and pass it to +RouteUtilV2.runRdfRouteWithFuture to handle the request.

+

Finally, add your route's knoraApiPath function to the apiRoutes member +variable in KnoraService. Any exception thrown inside the route will +be handled by the KnoraExceptionHandler, so that the correct client +response (including the HTTP status code) will be returned.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/05-internals/design/api-v2/json-ld/index.html b/05-internals/design/api-v2/json-ld/index.html new file mode 100644 index 0000000000..ab42ea768c --- /dev/null +++ b/05-internals/design/api-v2/json-ld/index.html @@ -0,0 +1,3184 @@ + + + + + + + + + + + + + + + + + + + + + + + JSON-LD Parsing and Formatting - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+ +
+ + + +
+
+ + + + + + +

JSON-LD Parsing and Formatting

+

JsonLDUtil

+

Knora provides a utility object called JsonLDUtil, which wraps the +titanium-json-ld Java library, and parses JSON-LD text to a +Knora data structure called JsonLDDocument. These classes provide commonly needed +functionality for extracting and validating data from JSON-LD documents, as well +as for constructing new documents.

+

Parsing JSON-LD

+

A route that expects a JSON-LD request must first parse the JSON-LD using +JsonLDUtil . For example, this is how ValuesRouteV2 parses a JSON-LD request to create a value:

+
post {
+            entity(as[String]) { jsonRequest =>
+                requestContext => {
+                    val requestDoc: JsonLDDocument = JsonLDUtil.parseJsonLD(jsonRequest)
+
+

The result is a JsonLDDocument in which all prefixes have been expanded +to full IRIs, with an empty JSON-LD context.

+

The next step is to convert the JsonLDDocument to a request message that can be +sent to the Knora responder that will handle the request.

+
val requestMessageFuture: Future[CreateValueRequestV2] = for {
+                        requestingUser <- getUserADM(requestContext)
+                        requestMessage: CreateValueRequestV2 <- CreateValueRequestV2.fromJsonLD(
+                            requestDoc,
+                            apiRequestID = UUID.randomUUID,
+                            requestingUser = requestingUser,
+                            responderManager = responderManager,
+                            storeManager = storeManager,
+                            settings = settings,
+                            log = log
+                        )
+                    } yield requestMessage
+
+

This is done in a Future, because the processing of JSON-LD input +could in itself involve sending messages to responders.

+

Each request message case class (in this case CreateValueRequestV2) has a companion object +that implements the KnoraJsonLDRequestReaderV2 trait:

+
/**
+  * A trait for objects that can generate case class instances based on JSON-LD input.
+  *
+  * @tparam C the type of the case class that can be generated.
+  */
+trait KnoraJsonLDRequestReaderV2[C] {
+    /**
+      * Converts JSON-LD input into a case class instance.
+      *
+      * @param jsonLDDocument   the JSON-LD input.
+      * @param apiRequestID     the UUID of the API request.
+      * @param requestingUser   the user making the request.
+      * @param responderManager a reference to the responder manager.
+      * @param storeManager     a reference to the store manager.
+      * @param settings         the application settings.
+      * @param log              a logging adapter.
+      * @param timeout          a timeout for `ask` messages.
+      * @param executionContext an execution context for futures.
+      * @return a case class instance representing the input.
+      */
+    def fromJsonLD(jsonLDDocument: JsonLDDocument,
+                   apiRequestID: UUID,
+                   requestingUser: UserADM,
+                   responderManager: ActorRef,
+                   storeManager: ActorRef,
+                   settings: KnoraSettingsImpl,
+                   log: LoggingAdapter)(implicit timeout: Timeout, executionContext: ExecutionContext): Future[C]
+}
+
+

This means that the companion object has a method fromJsonLD that takes a +JsonLDDocument and returns an instance of the case class. The fromJsonLD method +can use the functionality of the JsonLDDocument data structure for extracting +and validating the content of the request. For example, JsonLDObject.requireStringWithValidation +gets a required member of a JSON-LD object, and validates it using a function +that is passed as an argument. Here is an example of getting and validating +a SmartIri:

+
for {
+      valueType: SmartIri <- Future(jsonLDObject.requireStringWithValidation(JsonLDConstants.TYPE, stringFormatter.toSmartIriWithErr))
+
+

The validation function (in this case stringFormatter.toSmartIriWithErr) has to take +two arguments: a string to be validated, and a function that that throws an exception +if the string is invalid. The return value of requireStringWithValidation is the +return value of the validation function, which in this case is a SmartIri. If +the string is invalid, requireStringWithValidation throws BadRequestException.

+

It is also possible to get and validate an optional JSON-LD object member:

+
val maybeDateValueHasStartEra: Option[DateEraV2] = jsonLDObject.maybeStringWithValidation(
+    OntologyConstants.KnoraApiV2Complex.DateValueHasStartEra, DateEraV2.parse
+)
+
+

Here JsonLDObject.maybeStringWithValidation returns an Option that contains +the return value of the validation function (DateEraV2.parse) if it was given, +otherwise None.

+

Returning a JSON-LD Response

+

Each API response is represented by a message class that extends +KnoraJsonLDResponseV2, which has a method toJsonLDDocument that specifies +the target ontology schema. The implementation of this method constructs a JsonLDDocument, +in which all object keys are full IRIs (no prefixes are used), but in which +the JSON-LD context also specifies the prefixes that will be used when the +document is returned to the client. The function JsonLDUtil.makeContext +is a convenient way to construct the JSON-LD context.

+

Since toJsonLDDocument has to return an object that uses the specified +ontology schema, the recommended design is to separate schema conversion as much +as possible from JSON-LD generation. As a first step, schema conversion (or at the very +least, the conversion of Knora type IRIs to the target schema) can be done via an +implementation of KnoraReadV2:

+
/**
+  * A trait for read wrappers that can convert themselves to external schemas.
+  *
+  * @tparam C the type of the read wrapper that extends this trait.
+  */
+trait KnoraReadV2[C <: KnoraReadV2[C]] {
+    this: C =>
+    def toOntologySchema(targetSchema: ApiV2Schema): C
+}
+
+

This means that the response message class has the method toOntologySchema, which returns +a copy of the same message, with Knora type IRIs (and perhaps other content) adjusted +for the target schema. (See Smart IRIs on how to convert Knora +type IRIs to the target schema.)

+

The response message class could then have a private method called generateJsonLD, which +generates a JsonLDDocument that has the correct structure for the target schema, like +this:

+
private def generateJsonLD(targetSchema: ApiV2Schema, settings: KnoraSettingsImpl, schemaOptions: Set[SchemaOption]): JsonLDDocument
+
+

This way, the implementation of toJsonLDDocument can call toOntologySchema, +then construct a JsonLDDocument from the resulting object. For example:

+
    override def toJsonLDDocument(targetSchema: ApiV2Schema, settings: KnoraSettingsImpl, schemaOptions: Set[SchemaOption] = Set.empty): JsonLDDocument = {
+        toOntologySchema(targetSchema).generateJsonLD(
+            targetSchema = targetSchema,
+            settings = settings,
+            schemaOptions = schemaOptions
+        )
+    }
+
+

Selecting the Response Schema

+

Most routes complete by calling RouteUtilV2.runRdfRouteWithFuture, which calls +the response message's toJsonLDDocument method. The runRdfRouteWithFuture function +has a parameter that enables the route to select the schema that should be used in +the response. It is up to each route to determine what the appropriate response schema +should be. Some routes support only one response schema. Others allow the client +to choose. To use the schema requested by the client, the route can call +RouteUtilV2.getOntologySchema:

+
RouteUtilV2.runRdfRouteWithFuture(
+    requestMessageF = requestMessageFuture,
+    requestContext = requestContext,
+    settings = settings,
+    responderManager = responderManager,
+    log = log,
+    targetSchema = targetSchema,
+    schemaOptions = schemaOptions
+)
+
+

If the route only supports one schema, it can specify the schema directly instead:

+
RouteUtilV2.runRdfRouteWithFuture(
+    requestMessageF = requestMessageFuture,
+    requestContext = requestContext,
+    settings = settings,
+    responderManager = responderManager,
+    log = log,
+    targetSchema = ApiV2Complex,
+    schemaOptions = RouteUtilV2.getSchemaOptions(requestContext)
+)
+
+

Generating Other RDF Formats

+

RouteUtilV2.runRdfRouteWithFuture implements +HTTP content negotiation. After +determining the client's preferred format, it asks the KnoraResponseV2 to convert +itself into that format. KnoraResponseV2 has an abstract format method, whose implementations +select the most efficient conversion between the response message's internal +representation (which could be JSON-LD or Turtle) and the requested format.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/05-internals/design/api-v2/ontology-management/index.html b/05-internals/design/api-v2/ontology-management/index.html new file mode 100644 index 0000000000..b091d69b32 --- /dev/null +++ b/05-internals/design/api-v2/ontology-management/index.html @@ -0,0 +1,2924 @@ + + + + + + + + + + + + + + + + + + + + + + + Ontology Management - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + +

Ontology Management

+

The core of Knora's ontology management logic is OntologyResponderV2. +It is responsible for:

+
    +
  • Loading ontologies from the triplestore when Knora starts.
  • +
  • Maintaining an ontology cache to improve performance.
  • +
  • Returning requested ontology entities from the cache. Requests for ontology + information never access the triplestore.
  • +
  • Creating and updating ontologies in response to API requests.
  • +
  • Ensuring that all user-created ontologies are consistent and conform to knora-base.
  • +
+

When Knora starts it will load all ontologies from the triplestore into the ontology cache:

+
    +
  1. Loads all ontologies found in the triplestore into suitable Scala data structures, + which include indexes of relations between entities (e.g. rdfs:subClassOf relations), + to facilitate validity checks.
  2. +
  3. Checks user-created ontologies for consistency and conformance to knora-base, + according to the rules described in + Summary of Restrictions on User-Created Ontologies.
  4. +
  5. Caches all the loaded ontologies using CacheUtil.
  6. +
+

The ontology responder assumes that nothing except itself modifies ontologies +in the triplestore while Knora is running. Therefore, the ontology cache is updated +only when the ontology responder processes a request to update an ontology.

+

By design, the ontology responder can update only one ontology entity per request, +to simplify the necessary validity checks. This requires the client to +construct an ontology by submitting a sequence of requests in a certain order, +as explained in +Ontology Updates.

+

The ontology responder mainly works with ontologies in the internal schema. +However, it knows that some entities in built-in ontologies have hard-coded +definitions in external schemas, and it checks the relevant +transformation rules and returns those entities directly when they are requested +(see Generation of Ontologies in External Schemas).

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/05-internals/design/api-v2/ontology-schemas/index.html b/05-internals/design/api-v2/ontology-schemas/index.html new file mode 100644 index 0000000000..1425805892 --- /dev/null +++ b/05-internals/design/api-v2/ontology-schemas/index.html @@ -0,0 +1,3149 @@ + + + + + + + + + + + + + + + + + + + + + + + Ontology Schemas - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + +

Ontology Schemas

+

OntologySchema Type

+

As explained in API Schema, +Knora can represent the same RDF data in different forms: an "internal schema" +for use in the triplestore, and different "external schemas" for use in Knora +API v2. Different schemas use different IRIs, as explained in +Knora IRIs. Internally, +Knora uses a SmartIri class to convert IRIs between +schemas.

+

The data type representing a schema itself is OntologySchema, which +uses the sealed trait +pattern:

+
package org.knora.webapi
+
+/**
+  * Indicates the schema that a Knora ontology or ontology entity conforms to.
+  */
+sealed trait OntologySchema
+
+/**
+  * The schema of DSP ontologies and entities that are used in the triplestore.
+  */
+case object InternalSchema extends OntologySchema
+
+/**
+  * The schema of DSP ontologies and entities that are used in API v2.
+  */
+sealed trait ApiV2Schema extends OntologySchema
+
+/**
+  * The simple schema for representing DSP ontologies and entities. This schema represents values as literals
+  * when possible.
+  */
+case object ApiV2Simple extends ApiV2Schema
+
+/**
+  * The default (or complex) schema for representing DSP ontologies and entities. This
+  * schema always represents values as objects.
+  */
+case object ApiV2Complex extends ApiV2Schema
+
+/**
+  * A trait representing options that can be submitted to configure an ontology schema.
+  */
+sealed trait SchemaOption
+
+/**
+  * A trait representing options that affect the rendering of markup when text values are returned.
+  */
+sealed trait MarkupRendering extends SchemaOption
+
+/**
+  * Indicates that markup should be rendered as XML when text values are returned.
+  */
+case object MarkupAsXml extends MarkupRendering
+
+/**
+  * Indicates that markup should not be returned with text values, because it will be requested
+  * separately as standoff.
+  */
+case object MarkupAsStandoff extends MarkupRendering
+
+/**
+  * Indicates that no markup should be returned with text values. Used only internally.
+  */
+case object NoMarkup extends MarkupRendering
+
+/**
+  * Utility functions for working with schema options.
+  */
+object SchemaOptions {
+    /**
+      * A set of schema options for querying all standoff markup along with text values.
+      */
+    val ForStandoffWithTextValues: Set[SchemaOption] = Set(MarkupAsXml)
+
+    /**
+      * A set of schema options for querying standoff markup separately from text values.
+      */
+    val ForStandoffSeparateFromTextValues: Set[SchemaOption] = Set(MarkupAsStandoff)
+
+    /**
+      * Determines whether standoff should be queried when a text value is queried.
+      *
+      * @param targetSchema the target API schema.
+      * @param schemaOptions the schema options submitted with the request.
+      * @return `true` if standoff should be queried.
+      */
+    def queryStandoffWithTextValues(targetSchema: ApiV2Schema, schemaOptions: Set[SchemaOption]): Boolean = {
+        targetSchema == ApiV2Complex && !schemaOptions.contains(MarkupAsStandoff)
+    }
+
+    /**
+      * Determines whether markup should be rendered as XML.
+      *
+      * @param targetSchema the target API schema.
+      * @param schemaOptions the schema options submitted with the request.
+      * @return `true` if markup should be rendered as XML.
+      */
+    def renderMarkupAsXml(targetSchema: ApiV2Schema, schemaOptions: Set[SchemaOption]): Boolean = {
+        targetSchema == ApiV2Complex && !schemaOptions.contains(MarkupAsStandoff)
+    }
+
+    /**
+      * Determines whether markup should be rendered as standoff, separately from text values.
+      *
+      * @param targetSchema the target API schema.
+      * @param schemaOptions the schema options submitted with the request.
+      * @return `true` if markup should be rendered as standoff.
+      */
+    def renderMarkupAsStandoff(targetSchema: ApiV2Schema, schemaOptions: Set[SchemaOption]): Boolean = {
+        targetSchema == ApiV2Complex && schemaOptions.contains(MarkupAsStandoff)
+    }
+}
+
+

This class hierarchy allows method declarations to restrict the schemas +they accept. A method that can accept any schema can take a parameter of type +OntologySchema, while a method that accepts only external schemas can take +a parameter of type ApiV2Schema. For examples, see Content Wrappers.

+

Generation of Ontologies in External Schemas

+

Ontologies are stored only in the internal schema, and are converted on the fly +to external schemas. For each external schema, there is a Scala object in +org.knora.webapi.messages.v2.responder.ontologymessages that provides rules +for this conversion:

+
    +
  • KnoraApiV2SimpleTransformationRules for the API v2 simple schema
  • +
  • KnoraApiV2WithValueObjectsTransformationRules for the API v2 complex schema
  • +
+

Since these are Scala objects rather than classes, they are initialised before +the Akka ActorSystem starts, and therefore need a special instance of +Knora's StringFormatter class (see Smart IRIs).

+

Each of these rule objects implements this trait:

+
/**
+  * A trait for objects that provide rules for converting an ontology from the internal schema to an external schema.
+  * * See also [[OntologyConstants.CorrespondingIris]].
+  */
+trait OntologyTransformationRules {
+    /**
+      * The metadata to be used for the transformed ontology.
+      */
+    val ontologyMetadata: OntologyMetadataV2
+
+    /**
+      * Properties to remove from the ontology before converting it to the target schema.
+      * See also [[OntologyConstants.CorrespondingIris]].
+      */
+    val internalPropertiesToRemove: Set[SmartIri]
+
+    /**
+      * Classes to remove from the ontology before converting it to the target schema.
+      */
+    val internalClassesToRemove: Set[SmartIri]
+
+    /**
+      * After the ontology has been converted to the target schema, these cardinalities must be
+      * added to the specified classes.
+      */
+    val externalCardinalitiesToAdd: Map[SmartIri, Map[SmartIri, KnoraCardinalityInfo]]
+
+    /**
+      * Classes that need to be added to the ontology after converting it to the target schema.
+      */
+    val externalClassesToAdd: Map[SmartIri, ReadClassInfoV2]
+
+    /**
+      * Properties that need to be added to the ontology after converting it to the target schema.
+      * See also [[OntologyConstants.CorrespondingIris]].
+      */
+    val externalPropertiesToAdd: Map[SmartIri, ReadPropertyInfoV2]
+}
+
+

These rules are applied to knora-base as well as to user-created ontologies. +For example, knora-base:Resource has different cardinalities depending on its +schema (knora-api:Resource has an additional cardinality on knora-api:hasIncomingLink), +and this is therefore also true of its user-created subclasses. The transformation +is implemented:

+
    +
  • In the implementations of the toOntologySchema method in classes defined in + OntologyMessagesV2.scala: ReadOntologyV2, ReadClassInfoV2, ClassInfoContentV2, + PropertyInfoContentV2, and OntologyMetadataV2.
  • +
  • In OntologyResponderV2.getEntityInfoResponseV2, which handles requests for + specific ontology entities. If the requested entity is hard-coded in a transformation + rule, this method returns the hard-coded external entity, otherwise it returns the relevant + internal entity.
  • +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/05-internals/design/api-v2/overview/index.html b/05-internals/design/api-v2/overview/index.html new file mode 100644 index 0000000000..27ab061a8f --- /dev/null +++ b/05-internals/design/api-v2/overview/index.html @@ -0,0 +1,3257 @@ + + + + + + + + + + + + + + + + + + + + + + + API v2 Design Overview - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+ +
+ + + +
+
+ + + + + + +

API v2 Design Overview

+

General Principles

+
    +
  • DSP-API v2 requests and responses are RDF documents. Any API v2 + response can be returned as JSON-LD, + Turtle, + or RDF/XML.
  • +
  • Each class or property used in a request or response has a definition in an ontology, which Knora can serve.
  • +
  • Response formats are reused for different requests whenever + possible, to minimise the number of different response formats a + client has to handle. For example, any request for one or more + resources (such as a search result, or a request for one specific + resource) returns a response in the same format.
  • +
  • Response size is limited by design. Large amounts of data must be + retrieved by requesting small pages of data, one after the other.
  • +
  • Responses that provide data are distinct from responses that provide + definitions (i.e. ontology entities). Data responses indicate which + types are used, and the client can request information about these + types separately.
  • +
+

API Schemas

+

The types used in the triplestore are not exposed directly in the API. +Instead, they are mapped onto API 'schemas'. Two schemas are currently +provided.

+
    +
  • A complex schema, which is suitable both for reading and for editing + data. The complex schema represents values primarily as complex objects.
  • +
  • A simple schema, which is suitable for reading data but not for + editing it. The simple schema facilitates interoperability between + DSP ontologies and non-DSP ontologies, since it represents + values primarily as literals.
  • +
+

Each schema has its own type IRIs, which are derived from the ones used +in the triplestore. For details of these different IRI formats, see +Knora IRIs.

+

Implementation

+

JSON-LD Parsing and Formatting

+

Each API response is represented by a class that extends +KnoraResponseV2, which has a method toJsonLDDocument that specifies +the target schema. It is currently up to each route to determine what +the appropriate response schema should be. Some routes will support only +one response schema. Others will allow the client to choose, and there +will be one or more standard ways for the client to specify the desired +response schema.

+

A route calls RouteUtilV2.runRdfRoute, passing a request message and +a response schema. When RouteUtilV2 gets the response message from the +responder, it calls toJsonLDDocument on it, specifying that schema. +The response message returns a JsonLDDocument, which is a simple data +structure that is then converted to Java objects and passed to the +JSON-LD Java library for formatting. In general, toJsonLDDocument is +implemented in two stages: first the object converts itself to the +target schema, and then the resulting object is converted to a +JsonLDDocument.

+

A route that receives JSON-LD requests should use +JsonLDUtil.parseJsonLD to convert each request to a JsonLDDocument.

+

Generation of Other RDF Formats

+

RouteUtilV2.runRdfRoute implements +HTTP content negotiation, and converts JSON-LD +responses into Turtle +or RDF/XML as appropriate.

+

Operation Wrappers

+

Whenever possible, the same data structures are used for input and +output. Often more data is available in output than in input. For +example, when a value is read from the triplestore, its IRI is +available, but when it is being created, it does not yet have an IRI. In +such cases, there is a class like ValueContentV2, which represents the +data that is used both for input and for output. When a value is read, a +ValueContentV2 is wrapped in a ReadValueV2, which additionally +contains the value's IRI. When a value is created, it is wrapped in a +CreateValueV2, which has the resource IRI and the property IRI, but +not the value IRI.

+

A Read* wrapper can be wrapped in another Read* wrapper; for +example, a ReadResourceV2 contains ReadValueV2 objects.

+

Each *Content* class should extend KnoraContentV2 and thus have a +toOntologySchema method or converting itself between internal and +external schemas, in either direction.

+

Each Read* wrapper class should have a method for converting itself to +JSON-LD in a particular external schema. If the Read* wrapper is a +KnoraResponseV2, this method is toJsonLDDocument.

+

Smart IRIs

+

Usage

+

The SmartIri trait can be used to parse and validate IRIs, and in +particular for converting Knora type IRIs between internal and external +schemas. It validates each IRI it parses. To use it, import the +following:

+
import org.knora.webapi.messages.{SmartIri, StringFormatter}
+import org.knora.webapi.messages.IriConversions.*
+
+

Ensure that an implicit instance of StringFormatter is in scope:

+
implicit val stringFormatter: StringFormatter = StringFormatter.getGeneralInstance
+
+

Then, if iriStr is a string representing an IRI, you can can convert +it to a SmartIri like this:

+
val iri: SmartIri = iriStr.toSmartIri
+
+

If the IRI came from a request, use this method to throw a specific +exception if the IRI is invalid:

+
val iri: SmartIri = iriStr.toSmartIriWithErr(
+    () => throw BadRequestException(s"Invalid IRI: $iriStr")
+)
+
+

You can then use methods such as SmartIri.isKnoraApiV2EntityIri and +SmartIri.getProjectCode to obtain information about the IRI. To +convert it to another schema, call SmartIri.toOntologySchema. +Converting a non-Knora IRI returns the same IRI.

+

If the IRI represents a Knora internal value class such as +knora-base:TextValue, converting it to the ApiV2Simple schema will +return the corresponding simplified type, such as xsd:string. But this +conversion is not performed in the other direction (external to +internal), since this would require knowledge of the context in which +the IRI is being used.

+

The performance penalty for using a SmartIri instead of a string is +very small. Instances are automatically cached once they are +constructed. Parsing and caching a SmartIri instance takes about 10-20 +µs, and retrieving a cached SmartIri takes about 1 µs.

+

There is no advantage to using SmartIri for data IRIs, since they are +not schema-specific (and are not cached). If a data IRI has been +received from a client request, it is better just to validate it using +StringFormatter.validateAndEscapeIri.

+

Smart IRI Implementation

+

The smart IRI implementation, SmartIriImpl, is nested in the +StringFormatter class, because it uses Knora's +hostname, which isn't available until the Akka ActorSystem has started. +However, this means that the type of a SmartIriImpl instance is +dependent on the instance of StringFormatter that constructed it. +Therefore, instances of SmartIriImpl created by different instances of +StringFormatter can't be compared directly.

+

There are in fact two instances of StringFormatter:

+
    +
  • one returned by StringFormatter.getGeneralInstance which is + available after Akka has started and has the API server's hostname + (and can therefore provide SmartIri instances capable of parsing + IRIs containing that hostname). This instance is used throughout the + DSP-API server.
  • +
  • one returned by StringFormatter.getInstanceForConstantOntologies, + which is available before Akka has started, and is used only by the + hard-coded constant knora-api ontologies.
  • +
+

This is the reason for the existence of the SmartIri trait, which is a +top-level definition and has its own equals and hashCode methods. +Instances of SmartIri can thus be compared (e.g. to use them as unique +keys in collections), regardless of which instance of StringFormatter +created them.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/05-internals/design/api-v2/query-design/index.html b/05-internals/design/api-v2/query-design/index.html new file mode 100644 index 0000000000..5df0df4fc6 --- /dev/null +++ b/05-internals/design/api-v2/query-design/index.html @@ -0,0 +1,3055 @@ + + + + + + + + + + + + + + + + + + + + + + + SPARQL Query Design - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + +

SPARQL Query Design

+

Inference

+

DSP-API does not require the triplestore to perform inference, +as different triplestores implement inference quite differently, +so that taking advantage of inference would require triplestore specific code, which is not well maintainable. +Instead, the API simulates inference for each Gravsearch query, so that the expected results are returned.

+

Gravsearch queries currently need to do the following:

+
    +
  • Given a base property, find triples using a subproperty as predicate, and + return the subproperty used in each case.
  • +
  • Given a base class, find triples using an instance of subclass as subject or + object, and return the subclass used in each case.
  • +
+

Without inference, this can be done using property path syntax.

+
CONSTRUCT {
+  ?resource a ?resourceClass .
+  ?resource ?resourceValueProperty ?valueObject.
+WHERE {
+  ?resource a ?resourceClass .
+  ?resourceType rdfs:subClassOf* knora-base:Resource .
+  ?resource ?resourceValueProperty ?valueObject .
+  ?resourceValueProperty rdfs:subPropertyOf* knora-base:hasValue .
+
+

This query:

+
    +
  • +

    Checks that the queried resource belongs to a subclass of knora-base:Resource.

    +
  • +
  • +

    Returns the class that the resource explicitly belongs to.

    +
  • +
  • +

    Finds the Knora values attached to the resource, and returns each value along with + the property that explicitly attaches it to the resource.

    +
  • +
+

However, such a query is very inefficient. +Instead, the API does inference on the query, so that the relevant information can be found in a timely manner.

+

For this, the query is analyzed to check which project ontologies are relevant to the query. +If an ontology is not relevant to a query, +then all class and property definitions of this ontology are disregarded for inference.

+

Then, each statement that requires inference (i.e. that could be phrased with property path syntax, as described above) +is cross-referenced with the relevant ontologies, +to see which property/class definitions would fit the statement according to the rules of RDF inference. +And each of those definitions is added to the query as a separate UNION statement.

+

E.g.: Given the resource class B is a subclass of A and the property hasY is a subproperty of hasX, +then the following query

+
SELECT {
+  ?res ?prop .
+} WHERE {
+  ?res a <A> .
+  ?res <hasX> ?prop .
+}
+
+

can be rewritten as

+
SELECT {
+  ?res ?prop .
+} WHERE {
+  {?res a <A>} UNION {?res a <B>} .
+  {?res <hasX> ?prop} UNION {?res <hasY> ?prop} .
+}
+
+

Querying Past Value Versions

+

Value versions are a linked list, starting with the current version. Each value points to +the previous version via knora-base:previousValue. The resource points only to the current +version.

+

Past value versions are queried in getResourcePropertiesAndValues.scala.txt, which can +take a timestamp argument. Given the current value version, we must find the most recent +past version that existed at the target date.

+

First, we get the set of previous values that were created on or before the target +date:

+
?currentValue knora-base:previousValue* ?valueObject .
+?valueObject knora-base:valueCreationDate ?valueObjectCreationDate .
+FILTER(?valueObjectCreationDate <= "@versionDate"^^xsd:dateTime)
+
+

The resulting versions are now possible values of ?valueObject. Next, out of this set +of versions, we exclude all versions except for the most recent one. We do this by checking, +for each ?valueObject, whether there is another version, ?otherValueObject, that is more +recent and was also created before the target date. If such a version exists, we exclude +the one we are looking at.

+
FILTER NOT EXISTS {
+    ?currentValue knora-base:previousValue* ?otherValueObject .
+    ?otherValueObject knora-base:valueCreationDate ?otherValueObjectCreationDate .
+
+    FILTER(
+        (?otherValueObjectCreationDate <= "@versionDate"^^xsd:dateTime) &&
+        (?otherValueObjectCreationDate > ?valueObjectCreationDate)
+    )
+}
+
+

This excludes all past versions except the one we are interested in.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/05-internals/design/api-v2/sipi/index.html b/05-internals/design/api-v2/sipi/index.html new file mode 100644 index 0000000000..6a803317de --- /dev/null +++ b/05-internals/design/api-v2/sipi/index.html @@ -0,0 +1,3191 @@ + + + + + + + + + + + + + + + + + + + + + + + DSP-API and Sipi - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + + + + + +
+
+ + + + + + +

DSP-API and Sipi

+

Configuration

+

The DSP-API specific configuration and scripts for Sipi are in the +sipi subdirectory of the DSP-API source tree. See the README.md for +instructions on how to start Sipi with DSP-API.

+

Lua Scripts

+

DSP-API v2 uses custom Lua scripts to control Sipi. These scripts can be +found in sipi/scripts in the DSP-API source tree.

+

Each of these scripts expects a JSON Web Token in the +URL parameter token. In all cases, the token must be signed by DSP-API, +it must have an expiration date and not have expired, its issuer must equal +the hostname and port of the API, and its audience must include Sipi. +The other contents of the expected tokens are described below.

+

upload.lua

+

The upload.lua script is available at Sipi's upload route. It processes one +or more file uploads submitted to Sipi. It converts uploaded images to JPEG 2000 +format, and stores them in Sipi's tmp directory. The usage of this script is described in +Upload Files to Sipi.

+

upload_without_processing.lua

+

The upload_without_processing.lua script is available at Sipi's upload_without_processing route. +It receives files submitted to Sipi but does not process them. +Instead, it stores them as is in Sipi's tmp directory.

+

store.lua

+

The store.lua script is available at Sipi's store route. It moves a file +from temporary to permanent storage. It expects an HTTP POST request containing +application/x-www-form-urlencoded data with the parameters prefix (the +project shortcode) and filename (the internal Sipi-generated filename of the file +to be moved).

+

The JWT sent to this script must contain the key knora-data, whose value +must be a JSON object containing:

+
    +
  • permission: must be StoreFile
  • +
  • prefix: the project shortcode submitted in the form data
  • +
  • filename: the filename submitted in the form data
  • +
+

delete_temp_file.lua

+

The delete_temp_file.lua script is available at Sipi's delete_temp_file route. +It is used only if DSP-API rejects a file value update request. It expects an +HTTP DELETE request, with a filename as the last component of the URL.

+

The JWT sent to this script must contain the key knora-data, whose value +must be a JSON object containing:

+
    +
  • permission: must be DeleteTempFile
  • +
  • filename: must be the same as the filename submitted in the URL
  • +
+

clean_temp_dir.lua

+

The clean_temp_dir.lua script is available at Sipi's clean_temp_dir route. +When called, it deletes old temporary files from tmp and (recursively) from any subdirectories. +The maximum allowed age of temporary files can be set in Sipi's configuration file, +using the parameter max_temp_file_age, which takes a value in seconds.

+

The clean_temp_dir route requires basic authentication.

+

SipiConnector

+

In DSP-API, the org.knora.webapi.iiif.SipiConnector handles all communication +with Sipi. It blocks while processing each request, to ensure that the number of +concurrent requests to Sipi is not greater than +akka.actor.deployment./storeManager/iiifManager/sipiConnector.nr-of-instances. +If it encounters an error, it returns SipiException.

+

The Image File Upload Workflow

+
    +
  1. The client uploads an image file to the upload route, which runs + upload.lua. The image is converted to JPEG 2000 and stored in Sipi's tmp + directory. In the response, the client receives the JPEG 2000's unique, + randomly generated filename.
  2. +
  3. The client submits a JSON-LD request to a DSP-API route (/v2/values or /v2/resources) + to create or change a file value. The request includes Sipi's internal filename.
  4. +
  5. During parsing of this JSON-LD request, a StillImageFileValueContentV2 + is constructed to represent the file value. During the construction of this + object, a GetFileMetadataRequestV2 is sent to SipiConnector, which + uses Sipi's built-in knora.json route to get the rest of the file's + metadata.
  6. +
  7. A responder (ResourcesResponderV2 or ValuesResponderV2) validates + the request and updates the triplestore. (If it is ResourcesResponderV2, + it asks ValuesResponderV2 to generate SPARQL for the values.)
  8. +
  9. The responder that did the update calls ValueUtilV2.doSipiPostUpdate. + If the triplestore update was successful, this method sends + MoveTemporaryFileToPermanentStorageRequestV2 to SipiConnector, which + makes a request to Sipi's store route. Otherwise, the same method sends + DeleteTemporaryFileRequestV2 to SipiConnector, which makes a request + to Sipi's delete_temp_file route.
  10. +
+

If the request to DSP-API cannot be parsed, the temporary file is not deleted +immediately, but it will be deleted during the processing of a subsequent +request by Sipi's upload route.

+

If Sipi's store route fails, DSP-API returns the SipiException to the client. +In this case, manual intervention may be necessary to restore consistency +between DSP-API and Sipi.

+

If Sipi's delete_temp_file route fails, the error is not returned to the client, +because there is already a DSP-API error that needs to be returned to the client. +In this case, the Sipi error is simply logged.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/05-internals/design/api-v2/smart-iris/index.html b/05-internals/design/api-v2/smart-iris/index.html new file mode 100644 index 0000000000..59b73ff2a3 --- /dev/null +++ b/05-internals/design/api-v2/smart-iris/index.html @@ -0,0 +1,3031 @@ + + + + + + + + + + + + + + + + + + + + + + + Smart IRIs - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + +

Smart IRIs

+

Usage

+

The SmartIri trait can be used to parse and validate IRIs, and in +particular for converting Knora type IRIs +between internal and external schemas. It validates each IRI it parses. To use it, +import the following:

+
import org.knora.webapi.messages.SmartIri
+import org.knora.webapi.messages.IriConversions._
+
+

Ensure that an implicit instance of StringFormatter is in scope:

+
import org.knora.webapi.messages.StringFormatter
+implicit val stringFormatter: StringFormatter = StringFormatter.getGeneralInstance
+
+

Then, if you have a string representing an IRI, you can can convert +it to a SmartIri like this:

+
val propertyIri: SmartIri = "http://0.0.0.0:3333/ontology/0001/anything/v2#hasInteger".toSmartIri
+````
+
+If the IRI came from a request, use this method to throw a specific
+exception if the IRI is invalid:
+
+```scala
+val propertyIri: SmartIri = propertyIriStr.toSmartIriWithErr(throw BadRequestException(s"Invalid property IRI: <$propertyIriStr>"))
+
+

You can then use methods such as SmartIri.isKnoraApiV2EntityIri and +SmartIri.getProjectCode to obtain information about the IRI. To +convert it to another schema, call SmartIri.toOntologySchema. +Converting a non-Knora IRI returns the same IRI.

+

If the IRI represents a Knora internal value class such as +knora-base:TextValue, converting it to the ApiV2Simple schema will +return the corresponding simplified type, such as xsd:string. But this +conversion is not performed in the other direction (external to +internal), since this would require knowledge of the context in which +the IRI is being used.

+

The performance penalty for using a SmartIri instead of a string is +very small. Instances are automatically cached once they are +constructed.

+

There is no advantage to using SmartIri for data IRIs, since they are +not schema-specific (and are not cached). If a data IRI has been +received from a client request, it is better just to validate it using +StringFormatter.validateAndEscapeIri, and represent it as an +org.knora.webapi.IRI (an alias for String).

+

Implementation

+

The smart IRI implementation, SmartIriImpl, is nested in the +StringFormatter class, because it uses Knora's +hostname, which isn't available until the Akka ActorSystem has started. +However, this means that the Scala type of a SmartIriImpl instance is +dependent on the instance of StringFormatter that constructed it. +Therefore, instances of SmartIriImpl created by different instances of +StringFormatter can't be compared directly.

+

There are in fact two instances of StringFormatter:

+
    +
  • one returned by StringFormatter.getGeneralInstance, which is + available after Akka has started and has the API server's hostname + (and can therefore provide SmartIri instances capable of parsing + IRIs containing that hostname). This instance is used throughout the + DSP-API server.
  • +
  • one returned by StringFormatter.getInstanceForConstantOntologies, + which is available before Akka has started, and is used only by the + hard-coded constant knora-api ontologies (see + Generation of Ontologies in External Schemas).
  • +
+

This is the reason for the existence of the SmartIri trait, which is a +top-level definition and has its own equals and hashCode methods. +Instances of SmartIri can thus be compared (e.g. to use them as unique +keys in collections), regardless of which instance of StringFormatter +created them.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/05-internals/design/api-v2/standoff/index.html b/05-internals/design/api-v2/standoff/index.html new file mode 100644 index 0000000000..51830675c7 --- /dev/null +++ b/05-internals/design/api-v2/standoff/index.html @@ -0,0 +1,3055 @@ + + + + + + + + + + + + + + + + + + + + + + + Standoff Markup - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + +

Standoff Markup

+

Requirements

+

In Knora, text with markup is stored using standoff markup, i.e. markup that +is stored separately from the content it applies to.

+

Knora's standoff design is based on these requirements:

+
    +
  • +

    Overlapping markup should be supported.

    +
  • +
  • +

    Markup should be stored as RDF, so it can be searched and analysed using the same tools that are used + with other data managed by Knora.

    +
  • +
  • +

    In particular, Gravsearch queries should be able + to specify search criteria that refer to the markup tags attached to a text, together with + any other search criteria relating to the resource that contains the text.

    +
  • +
  • +

    It should be possible to import any XML document into Knora, store the markup as standoff, and + at any time export the document as an equivalent XML document.

    +
  • +
+

RDF Design

+

See Text with Standoff Markup.

+

Querying Standoff

+

Since the number of standoff tags that can be attached to a text value is unlimited, standoff is queried +in pages of a limited size, to avoid requesting huge SPARQL query results from the triplestore.

+

When ResourcesResponderV2 or SearchResponderV2 need to return a text value with all its markup, +they first query the text value with at most one page of standoff. If the text value has more than one page of +standoff, ConstructResponseUtilV2.makeTextValueContentV2 then sends a GetRemainingStandoffFromTextValueRequestV2 +message to StandoffResponderV2, which queries the rest of the standoff in the text value, one page at a time. +The resulting standoff is concatenated together and returned.

+

To optimise query performance:

+
    +
  • +

    Each text value with standoff has the predicate knora-base:valueHasMaxStandoffStartIndex, so that when Knora + queries a page of standoff, it knows whether it has reached the last page.

    +
  • +
  • +

    The last path component of the IRI of a standoff tag is the integer object of its + knora-base:standoffTagHasStartIndex predicate. When querying standoff, it is necessary to convert + the IRI objects of knora-base:standoffTagHasStartParent and knora-base:standoffTagHasEndParent to + integer indexes (the start indexes of those tags). Including each tag's start index in its IRI makes it + unnecessary to query the parent tags to determine their start indexes.

    +
  • +
+

Conversion Between Standoff and XML

+

XMLToStandoffUtil does the low-level conversion of documents between standoff and XML, using a simple +data structure to represent standoff. This data structure knows nothing about RDF, and each standoff tag +contains its XML element name and namespace and those of its attributes.

+

In DSP-API, it is possible to define mappings to +control how standoff/RDF is converted to XML and vice versa. Different mappings can be used to convert the same +standoff/RDF to different sorts of XML documents. StandoffTagUtilV2 converts between standoff/RDF and XML using +mappings, delegating the lower-level work to XMLToStandoffUtil.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/05-internals/design/domain/class-and-property-hierarchies/index.html b/05-internals/design/domain/class-and-property-hierarchies/index.html new file mode 100644 index 0000000000..8a3a51e18b --- /dev/null +++ b/05-internals/design/domain/class-and-property-hierarchies/index.html @@ -0,0 +1,3775 @@ + + + + + + + + + + + + + + + + + + + + + + + Class and Property Hierarchies - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + + + + + +
+
+ + + + +

Class and Property Hierarchies

+

Class Hierarchy

+

While knora-admin and salsah-gui have relatively flat class hierarchies, +in knora-base there are very complicated - yet highly relevant - inheritance structures. +The following class diagrams try to model these structures. +For the sake of comprehensibility, it was necessary to split the ontology into multiple diagrams, +even though this obliterates the evident connections between those diagrams.

+
+

Legend

+

dotted lines: the boxes are copies from another diagram.

+
+

Resources

+
classDiagram
+  %% Classes
+  class Resource {
+    string label
+    boolean isDeleted
+    Resource hasStandoffLinkTo
+    LinkValue hasStandoffLinkToValue
+    User attachedToUser
+    Project attachedToProject
+    string hasPermissions
+    date creationDate
+    date lastModificationDate
+    date deleteDate
+    User deletedBy
+    string deleteComment
+  }
+  class Annotation {
+    TextValue hasComment
+    Resource isAnnotationOf
+    LinkValue isAnnotationOfValue
+  }
+  class LinkObj{
+    TextValue hasComment
+    Resource hasLinkTo
+    LinkValue hasLinkToValue
+  }
+  class Representation {
+    FileValue hasFileValue
+  }
+  class ExternalResource {
+    ExternalResValue hasExternalResValue
+  }
+  class Region {
+    ColorValue hasColor
+    Representation isRegionOf
+    GeomValue hasGemoetry
+    LinkValue isRegionOfValue
+    TextValue hasComment
+  }
+  class ArchiveRepresentation {
+    ArchiveFileValue hasArchiveFileValue
+  }
+  class AudioRepresentation {
+    AudioFileValue hasAudioFileValue
+  }
+  class DDDRepresentation {
+    DDDFileValue hasDDDFileValue
+  }
+  class DocumentRepresentation {
+    DocumentFileValue hasDocumentFileValue
+  }
+  class MovingImageRepresentation {
+    MovingImageFileValue hasMovingImageFileValue
+  }
+  class StillImageRepresentation {
+    StillImageFileValue hasStillImageFileValue
+  }
+  class TextRepresentation {
+    TextFileValue hasTextFileValue
+  }
+
+  %% Relationships
+  Resource <|-- Annotation
+  Resource <|-- Representation
+  Resource <|-- LinkObj
+  Resource <|-- ExternalResource
+  Resource <|-- DeletedResource
+  Resource <|-- Region
+  Representation <|-- ArchiveRepresentation
+  Representation <|-- AudioRepresentation
+  Representation <|-- DDDRepresentation
+  Representation <|-- DocumentRepresentation
+  Representation <|-- MovingImageRepresentation
+  Representation <|-- StillImageRepresentation
+  Representation <|-- TextRepresentation
+  TextRepresentation <|-- XSLTransformation
+

Values

+
classDiagram
+  %% Classes
+  class Value {
+    date valueCreationDate
+    User attachedToUser
+    string hasPermissions
+    integer valueHasOrder
+    string valueHasComment
+    boolean isDeleted
+    date deleteDate
+    User deletedBy
+    string deleteComment
+    Value previousValue
+    string valueHasString
+    string valueHasUUID
+  }
+  class ColorBase {
+    string valueHasColor
+  }
+  class DateBase {
+    string valueHasCalendar
+    string valueHasEndPrecision
+    integer valueHasEndJDN
+    string valueHasStartPrecision
+    integer valueHasStartJDN
+  }
+  class IntBase {
+    integer valueHasInteger
+  }
+  class BooleanBase {
+    boolean valueHasBoolean
+  }
+  class DecimalBase {
+    decimal valueHasDecimal
+  }
+  class UriBase {
+    URI valueHasUri
+  }
+  class IntervalBase {
+    decimal valueHasIntervalStart
+    decimal valueHasIntervalEnd
+  }
+  class TimeBase {
+    date valueHasTimeStamp
+  }
+  class ListValue {
+    ListNode valueHasListNode
+  }
+  class TextValue {
+    StandoffTag valueHasStandoff
+    integer valueHasMaxStandoffStartIndex
+    string valueHasLanguage
+    XSLToStandoffMApping valueHasMapping
+  }
+  class LinkValue {
+    integer valueHasRefCount
+  }
+  class GeomValue {
+    string valueHasGeometry
+  }
+  class GeonameValue {
+    string valueHasGeonameCode
+  }
+  class ExternalResValue {
+    string extResId
+    string extResProvider
+    string extResAccessInfo
+  }
+  class FileValue {
+    string internalFileName
+    string internalMimeType
+    string originalFileName
+    string originalMimeType
+  }
+  class ArchiveFileValue {
+
+  }
+  class AudioFileValue {
+    decimal duration
+  }
+  class DDDFileValue
+  class DocumentFileValue {
+    integer pageCount
+    integer dimX
+    integer dimY
+  }
+  class MovingImageFileValue
+  class StillImageFileValue {
+    integer dimX
+    integer dimY
+  }
+  class StillImageExternalFileValue {
+    anyUri externalUrl
+  }
+  class TextFileValue
+
+
+  %% Relationships
+  ValueBase <|-- Value
+  ValueBase <|-- ColorBase
+  ValueBase <|-- DateBase
+  ValueBase <|-- IntBase
+  ValueBase <|-- BooleanBase
+  ValueBase <|-- DecimalBase
+  ValueBase <|-- UriBase
+  ValueBase <|-- IntervalBase
+  ValueBase <|-- TimeBase
+  Value <|-- ListValue
+  Value <|-- TextValue
+  Value <|-- LinkValue
+  Value <|-- GeomValue
+  Value <|-- GeonameValue
+  Value <|-- ExternalResValue
+  Value <|-- FileValue
+  Value <|-- DeletedValue
+  Value <|-- ColorValue
+  ColorBase <|-- ColorValue
+  Value <|-- DateValue
+  DateBase <|-- DateValue
+  Value <|-- IntValue
+  IntBase <|-- IntValue
+  Value <|-- BooleanValue
+  BooleanBase <|-- BooleanValue
+  Value <|-- DecimalValue
+  DecimalBase <|-- DecimalValue
+  Value <|-- UriValue
+  UriBase <|-- UriValue
+  Value <|-- IntervalValue
+  IntervalBase <|-- IntervalValue
+  Value <|-- TimeValue
+  TimeBase <|-- TimeValue
+  FileValue <|-- ArchiveFileValue
+  FileValue <|-- AudioFileValue
+  FileValue <|-- DDDFileValue
+  FileValue <|-- DocumentFileValue
+  FileValue <|-- MovingImageFileValue
+  FileValue <|-- StillImageFileValue
+  FileValue <|-- StillImageExternalFileValue
+  FileValue <|-- TextFileValue
+  ValueBase .. StandoffInternalReferenceTag
+  ColorBase .. StandoffColorTag
+  DateBase .. StandoffDateTag
+  IntBase .. StandoffIntegerTag
+  BooleanBase .. StandoffBooleanTag
+  DecimalBase .. StandoffDecimalTag
+  UriBase .. StandoffUriTag
+  IntervalBase .. StandoffIntervalTag
+  TimeBase .. StandoffTimeTag
+

Standoff in knora-base

+
classDiagram
+  %% Classes
+  class StandoffTag {
+    integer standoffHasStartTag
+    integer standoffHasEndTag
+    string standoffHasUUID
+    string standoffHasOriginalXMLID
+    integer standoffHasStartIndex
+    integer standoffHasEndIndex
+    StandoffTag standoffTagHasStartParent
+    StandoffTag standoffTagHasEndParent
+    ??? standoffParentClassConstraint
+  }
+  class StandoffInternalReferenceTag {
+    StandoffTag standoffHasInternalReference
+  }
+  class StandoffLinkTag {
+    Resource standoffHasLink
+  }
+
+
+  %% Relationships
+  StandoffTag <|-- StandoffDataTypeTag
+  StandoffTag <|-- StandoffLinkTag
+  StandoffDataTypeTag <|-- StandoffColorTag
+  StandoffDataTypeTag <|-- StandoffDateTag
+  StandoffDataTypeTag <|-- StandoffIntegerTag
+  StandoffDataTypeTag <|-- StandoffBooleanTag
+  StandoffDataTypeTag <|-- StandoffDecimalTag
+  StandoffDataTypeTag <|-- StandoffUriTag
+  StandoffDataTypeTag <|-- StandoffIntervalTag
+  StandoffDataTypeTag <|-- StandoffTimeTag
+  ValueBase .. ColorBase
+  ValueBase .. DateBase
+  ValueBase .. IntBase
+  ValueBase .. BooleanBase
+  ValueBase .. DecimalBase
+  ValueBase .. UriBase
+  ValueBase .. IntervalBase
+  ValueBase .. TimeBase
+  ValueBase .. StandoffInternalReferenceTag
+  ColorBase .. StandoffColorTag
+  DateBase .. StandoffDateTag
+  IntBase .. StandoffIntegerTag
+  BooleanBase .. StandoffBooleanTag
+  DecimalBase .. StandoffDecimalTag
+  UriBase .. StandoffUriTag
+  IntervalBase .. StandoffIntervalTag
+  TimeBase .. StandoffTimeTag
+

Standoff Ontology

+
flowchart BT
+  StandoffRootTag["StandoffRootTag \n ----- \n string standoffRootTagHasDocumentType"]
+  StandoffHyperlinkTag["StandoffHyperlinkTag \n ----- \n string standoffHyperlinkTagHasTarget"]
+  StandoffVisualTag -..-> StandoffTag 
+  StandoffRootTag -.-> StandoffTag 
+  StandoffHyperlinkTag -.-> StandoffTag 
+  StandoffStructuralTag -....-> StandoffTag 
+
+  StandoffItalicTag --> StandoffVisualTag 
+  StandoffBoldTag --> StandoffVisualTag 
+  StandoffCiteTag --> StandoffVisualTag 
+  StandoffUnderlineTag --> StandoffVisualTag 
+  StandoffStrikethroughTag --> StandoffVisualTag 
+  StandoffSuperscriptTag --> StandoffVisualTag 
+  StandoffSubscriptTag --> StandoffVisualTag 
+  StandoffLineTag --> StandoffVisualTag 
+  StandoffPreTag --> StandoffVisualTag 
+  StandoffBlockquoteTag --> StandoffStructuralTag 
+  StandoffCodeTag --> StandoffStructuralTag 
+  StandoffParagraphTag --> StandoffStructuralTag 
+  StandoffHeader_1_to_6_Tag --> StandoffStructuralTag 
+  StandoffOrderedListTag --> StandoffStructuralTag 
+  StandoffUnorderedListTag --> StandoffStructuralTag 
+  StandoffListElementTag --> StandoffStructuralTag 
+  StandoffTableBodyTag --> StandoffStructuralTag 
+  StandoffTableTag --> StandoffStructuralTag 
+  StandoffTableRowTag --> StandoffStructuralTag 
+  StandoffTableCellTag --> StandoffStructuralTag 
+  StandoffBrTag --> StandoffStructuralTag 
+

Property Hierarchy

+

Properties and Values

+
flowchart BT
+  hasValue ---> resourceProperty
+  hasLinkTo --> resourceProperty
+
+  hasFileValue ----> hasValue
+  hasColor ---> hasValue
+  hasGeometry ---> hasValue
+  hasComment ---> hasValue
+  seqnum ---> hasValue
+  hasExtResValue ---> hasValue
+  hasLinkToValue ----> hasValue 
+
+  hasArchiveFileValue ---> hasFileValue
+  hasDocumentFileValue ---> hasFileValue
+  hasTextFileValue ---> hasFileValue
+  hasStillImageFileValue ---> hasFileValue
+  hasMovingImageFileValue ---> hasFileValue
+  hasAudioFileValue ---> hasFileValue
+  hasDDDFileValue ---> hasFileValue
+
+  isPartOfValue ---> hasLinkToValue
+  hasAnnotationOfValue ---> hasLinkToValue
+  hasRepresentationValue ---> hasLinkToValue
+  hasStandoffLinkToValue ---> hasLinkToValue
+  isRegionOfValue ---> hasLinkToValue
+
+  isPartOf ---> hasLinkTo
+  isAnnotationOf ---> hasLinkTo
+  hasRepresentation ---> hasLinkTo
+  hasStandoffLinkTo ---> hasLinkTo
+  isRegionOf ---> hasLinkTo
+

Resource Metadata

+
flowchart BT
+  creationDate ---> objectCannotBeMarkedAsDeleted
+  deleteDate --> objectCannotBeMarkedAsDeleted
+  isDeleted ---> objectCannotBeMarkedAsDeleted
+  isRootNode ---> objectCannotBeMarkedAsDeleted
+  hasRootNode ---> objectCannotBeMarkedAsDeleted
+  lastModificationDate ---> objectCannotBeMarkedAsDeleted
+  listNodePosition ---> objectCannotBeMarkedAsDeleted
+  listNodeName ---> objectCannotBeMarkedAsDeleted
+  deleteComment ---> objectCannotBeMarkedAsDeleted
+  hasPermissions ---> objectCannotBeMarkedAsDeleted
+  deletedBy --> objectCannotBeMarkedAsDeleted
+  standoffTagHasLink ---> objectCannotBeMarkedAsDeleted 
+  hasSubListNode --> objectCannotBeMarkedAsDeleted
+  standoffTagHasEnd ---> objectCannotBeMarkedAsDeleted
+  standoffTagHasInternalReference --> objectCannotBeMarkedAsDeleted 
+  valueHas ----> objectCannotBeMarkedAsDeleted
+  standoffTagHasStart --> objectCannotBeMarkedAsDeleted 
+  standoffTagHasStartIndex ---> objectCannotBeMarkedAsDeleted
+  standoffTagHasEndIndex --> objectCannotBeMarkedAsDeleted
+  standoffTagHasUuid ---> objectCannotBeMarkedAsDeleted
+  standoffTagHasEndParent --> objectCannotBeMarkedAsDeleted
+  standoffTagHasOriginalXMLID ---> objectCannotBeMarkedAsDeleted
+  targetHasOriginalXMLID --> objectCannotBeMarkedAsDeleted
+  standoffTagHasStartAncestor ----> objectCannotBeMarkedAsDeleted 
+  standoffTagHasStartParent --> objectCannotBeMarkedAsDeleted
+  standoffTagHasStartParent --> standoffTagHasStartAncestor
+  hasMappingElement ---> objectCannotBeMarkedAsDeleted
+  mappingHasXMLTagname --> objectCannotBeMarkedAsDeleted
+  mappingHasXMLNamespace ---> objectCannotBeMarkedAsDeleted
+  mappingHasXMLClass --> objectCannotBeMarkedAsDeleted
+  mappingHasStandoffClass ---> objectCannotBeMarkedAsDeleted
+  mappingHasXMLAttribute --> objectCannotBeMarkedAsDeleted
+  mappingHasXMLAttributename ---> objectCannotBeMarkedAsDeleted
+  mappingHasStandoffProperty --> objectCannotBeMarkedAsDeleted
+  mappingHasStandoffDataTypeClass ---> objectCannotBeMarkedAsDeleted
+  mappingElementRequiresSeparator --> objectCannotBeMarkedAsDeleted
+  mappingHasDefaultXSLTransformation ---> objectCannotBeMarkedAsDeleted
+
+  duration --> valueHas
+  pageCount ---> valueHas
+  dimY --> valueHas
+  dimX ---> valueHas
+  valueHasStandoff --> valueHas
+  valueHasMaxStandoffStartIndex ---> valueHas
+  previousValue --> valueHas
+  ValueHasMapping ---> valueHas
+  extResAccessInfo --> valueHas
+  extResId ---> valueHas
+  extResProvider --> valueHas
+  fps ---> valueHas
+  internalFilename --> valueHas
+  internalMimeType ---> valueHas
+  originalFilename ---> valueHas
+  originalMimeType ---> valueHas
+  valueHasComment ---> valueHas
+  valueCreationDate ---> valueHas
+  valueHasUUID ---> valueHas
+  valueHasCalendar ---> valueHas
+  valueHasColor ---> valueHas
+  valueHasEndJDN ---> valueHas
+  valueHasEndPrecision ---> valueHas
+  valueHasDecimal ---> valueHas
+  valueHasGeometry ---> valueHas
+  valueHasGeonameCode ---> valueHas
+  valueHasInteger ---> valueHas
+  valueHasBoolean ---> valueHas
+  valueHasUri ---> valueHas
+  valueHasIntervalEnd ---> valueHas
+  valueHasIntervalStart ---> valueHas
+  valueHasTimeStamp ---> valueHas
+  valueHasListNode ---> valueHas
+  valueHasOrder ---> valueHas
+  valueHasRefCount ---> valueHas
+  valueHasStartJDN ---> valueHas
+  valueHasStartPrecision ---> valueHas
+  valueHasString ---> valueHas
+
+  valueHasLanguage
+

Property Triple Structure

+ +
flowchart LR
+  %% Classes
+  MappingComponent(MappingComponent)
+  MappingElement(MappingElement)
+  MappingXMLAttribute(MappingXMLAttribute)
+  MappingStandoffDataTypeClass(MappingStandoffDataTypeClass)
+  TextValue(TextValue)
+  XMLToStandoffMapping(XMLToStandoffMapping)
+  XSLTransformation(XSLTransformation)
+  StandoffTag(StandoffTag)
+  StandoffInternalReferenceTag(StandoffInternalReferenceTag)
+  Resource(Resource)
+
+  %% Duplicates
+  _StandoffTag{{StandoffTag}}
+
+  %% Values
+  string1([xsd:string])
+  string2([xsd:string])
+  string3([xsd:string])
+  boolean1([xsd:boolean])
+  integer1([xsd:integer])
+
+  %% Relations
+  TextValue --> valueHasMapping --> XMLToStandoffMapping
+  XMLToStandoffMapping --> hasMappingElement --> MappingElement
+  XMLToStandoffMapping --> mappingHasDefaultXSLTransformation --> XSLTransformation
+  TextValue --> valueHasStandoff --> StandoffTag
+  subgraph standoffProperties
+    standoffTagHasEndIndex
+    standoffTagHasStartIndex
+    standoffTagHasEnd
+    standoffTagHasStart
+    standoffTagHasLink
+    standoffTagHasOriginalXMLID
+    targetHasOriginalXMLID
+    standoffTagHasUuid
+    standoffTagHasEndParent
+    standoffTagHasStartAncestor
+    standoffTagHasStartParent
+    standoffTagHasInternalReference
+  end
+  StandoffTag --> standoffTagHasEndIndex --> integer1
+  StandoffTag --> standoffTagHasStartIndex --> integer1
+  StandoffTag --> standoffTagHasEnd --> integer1
+  StandoffTag --> standoffTagHasStart --> integer1
+  StandoffTag --> standoffTagHasLink --> Resource
+  StandoffTag --> standoffTagHasOriginalXMLID --> string2
+  StandoffTag --> targetHasOriginalXMLID --> string2
+  StandoffTag --> standoffTagHasUuid --> string2
+  StandoffTag --> standoffTagHasEndParent --> _StandoffTag
+  StandoffTag --> standoffTagHasStartAncestor --> _StandoffTag
+  StandoffTag --> standoffTagHasStartParent --> _StandoffTag
+  StandoffInternalReferenceTag --> standoffTagHasInternalReference --> _StandoffTag
+  TextValue --> valueHasLanguage --> string3
+
+  MappingComponent --> mappingHasXMLAttributename --> string1
+  MappingComponent --> mappingHasStandoffClass --> string1
+  MappingComponent --> mappingHasXMLNamespace --> string1
+  MappingElement --> mappingHasXMLClass --> string1
+  MappingElement --> mappingHasXMLTagname --> string1
+  MappingElement --> mappingHasXMLAttribute --> MappingXMLAttribute --> mappingHasStandoffProperty
+  MappingElement --> mappingHasStandoffDataTypeClass --> MappingStandoffDataTypeClass
+  MappingElement --> mappingElementRequiresSeparator --> boolean1
+

Resource Triples Structure

+
+

Legend

+
    +
  • round boxes: resources
  • +
  • square boxes: properties
  • +
  • hexagonal boxes: resoures that are duplicated for graphical reasons
  • +
  • oval boxes: xsd values
  • +
  • grey squares: thematic units
  • +
+
+
flowchart LR
+  LinkValue(LinkValue)
+  GeomValue(GeomValue)
+  ColorValue(ColorValue)
+  ExternalResValue(ExternalResValue)
+
+  date([xsd:dateTime])
+  string([xsd:string])
+  _Representation{{Representation}}
+  _Representation2{{Representation}}
+  _TextValue{{TextValue}}
+  _Value{{Value}}
+  _Resource{{Resource}}
+
+  subgraph Resources
+    Resource(Resource)
+    Annotation(Annotation)
+    Region(Region)
+    ExternalResource(ExternalResource)
+    Representation(Representation)
+    StillImageRepresentation("StillImageRepresentation etc.")
+  end
+
+  subgraph Links
+    hasRepresentation
+    hasLinkTo
+    hasStandoffLinkTo
+    isPartOf
+  end
+
+  subgraph LinkValues
+    hasRepresentationValue
+    hasLinkToValue
+    hasStandoffLinkToValue
+    isPartOfValue
+  end
+
+  subgraph FileValues
+    direction LR
+    hasFileValue
+    FileValue(FileValue)
+    hasStillImageRepresentation["hasStillImageRepresentation etc."]
+    StillImageFileValue("StillImageFileValue etc.")
+  end
+
+  Resource --> creationDate --> date
+  Resource --> hasComment --> _TextValue
+  Resource --> hasValue --> _Value
+
+  Resource --> hasRepresentation --> _Representation
+
+  Resource --> hasLinkTo --> _Resource
+  Resource --> hasStandoffLinkTo --> _Resource
+  Resource --> isPartOf --> _Resource
+
+  Resource --> hasLinkToValue --> LinkValue
+  Resource --> hasStandoffLinkToValue --> LinkValue
+  Resource --> hasRepresentationValue --> LinkValue
+  Resource --> isPartOfValue --> LinkValue
+
+  Annotation --> isAnnotationOfValue --> LinkValue
+  Annotation --> isAnnotationOf --> _Resource
+
+  Region --> isRegionOfValue --> LinkValue
+  Region --> isRegionOf --> _Representation2
+  Region --> hasGeometry --> GeomValue
+  Region --> hasColorValue --> ColorValue
+
+  ExternalResource --> hasExtResValue --> ExternalResValue
+  ExternalResValue --> extResId --> string
+  ExternalResValue --> extResAccessInfo --> string
+  ExternalResValue --> extResProvider --> string
+
+  Representation --> hasFileValue --> FileValue
+  StillImageRepresentation --> hasStillImageRepresentation --> StillImageFileValue
+

Properties without Subject Class Constraint

+
flowchart LR
+  na[[no subject class constraint defined]]
+
+  %% Classes
+  User(admin:User)
+  IntValue(IntValue)
+  IntervalValue(IntervalValue)
+
+  %% Values
+  date([xsd:dateTime])
+  boolean([xsd:boolean])
+
+  %% Relations
+  na --> deletedBy --> User
+  na --> seqnum --> IntValue
+  na --> deleteDate --> date
+  na --> isDeleted --> boolean
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/05-internals/design/domain/domain-entities-and-relations/index.html b/05-internals/design/domain/domain-entities-and-relations/index.html new file mode 100644 index 0000000000..09666e2a8a --- /dev/null +++ b/05-internals/design/domain/domain-entities-and-relations/index.html @@ -0,0 +1,3204 @@ + + + + + + + + + + + + + + + + + + + + + + + Domain Entities and Relations - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Domain Entities and Relations

+

In the context of DEV-1415: Domain Model +we attempted to gain a clear overview over the DSP's domain, +as implicitly modelled by the ontologies, code, validations and documentation of the DSP-API.

+

The following document aims to give a higher level overview of said domain.

+
+

Note

+
    +
  • As a high level overview, this document does not aim for exhaustivity.
  • +
  • Naming is tried to be kept as simple as possible, + while trying to consolidate different naming schemes + (ontologies, code, API), + which in result means that no naming scheme is strictly followed.
  • +
  • The split between V2 and Admin is arbitrary as those are intertwined within the system. + It merely serves the purpose of organizing the presented entities.
  • +
+
+

Domain Entities

+

The following Diagrams visualize the top level entities present in the DSP. +The attributes of these entities should be exhaustive. +Cardinalities or validation constraints are normally not depicted. +The indicated relationships are of conceptual nature and are more complicated in the actual system.

+

Admin

+
erDiagram
+    %% entities
+    User {
+        IRI id
+        string userName "unique"
+        string email "unique"
+        string givenName
+        string familyName
+        string password
+        string language "2 character ISO language code"
+        boolean status
+        boolean systemAdmin
+    }
+    Project {
+        IRI id
+        string shortcode "4 character hex"
+        string shortname "xsd:NCNAME"
+        string longname "optional"
+        langstring description
+        string keywords
+        boolean status
+        boolean selfjoin
+        string logo "optional"
+        string restrictedViewSize
+        string restrictedViewWatermark
+    }
+    Group {
+        IRI id
+        string name
+        langstring description
+        boolean status
+        boolean selfjoin
+    }
+    ListNode {
+        IRI id
+        IRI projectIri "only for root node"
+        langstring labels
+        langstring comments
+        string name
+        boolean isRootNode
+        integer listNodePosition
+    }
+    DefaultObjectAccessPermission {
+        IRI id
+        string hasPermission "the 'RV, V, M, D, CR' string"
+    }
+    AdministrativePermission {
+        IRI id
+        string hasPermission "a different string representation"
+    }
+    Property {}
+    ResourceClass {}
+
+    %% relations
+    User }|--|{ Project: "is member/admin of"
+    User }o--|{ Group: "is member of"
+    Group }o--|| Project: "belongs to"
+    ListNode }o--|| Project: "belongs to"
+    ListNode }o--o{ ListNode: "hasSubListNode"
+    ListNode |o--o| ListNode: "hasRootNode"
+    AdministrativePermission |{--o| Project: "points to"
+    AdministrativePermission |{--|{ Group: "points to"
+
+    DefaultObjectAccessPermission |{--o{ Group: "points to"
+    DefaultObjectAccessPermission |{--|| Project: "points to"
+    DefaultObjectAccessPermission |{--o{ Property: "points to"
+    DefaultObjectAccessPermission |{--o{ ResourceClass: "points to"
+
+

Overview V2

+
erDiagram
+    Ontology ||--o{ ResourceClass: "consists of"
+    Ontology ||--o{ Property: "consists of"
+    ResourceClass o{--o{ Cardinality: defines
+    Cardinality ||--|| Property: on
+    ResourceClass ||--o{ Resource: "can be instantiated as"
+    Property ||--o{ Value: "can be instantiated as"
+    Resource ||--o{ Value: has
+    Value }o--|| ObjectAccessPermission: grants
+    Resource }o--|| ObjectAccessPermission: grants
+    Resource }o--|| User: "attached to"
+    Resource }o--|| Project: "attached to"
+

Ontology

+
erDiagram
+    Project {}
+    Ontology {
+        IRI id
+        string ontologyName
+        string label
+        string comment "optional"
+        boolean isShared
+        date lastModificationDate
+    }
+    ResourceClass {
+        IRI id
+        langstring label
+        langstring comment
+    }
+    Property {
+        IRI id
+        langstring label
+        langstring comment
+        string guiAttribute
+    }
+    GuiElement {}
+    Cardinality {
+        owl_cardinality cardinality "1, 0-1, 0-n, 1-n"
+        integer guiOrder
+    }
+    Ontology o{--|| Project: "attached to"
+    Ontology ||--o{ ResourceClass: "consists of"
+    Ontology ||--o{ Property: "consists of"
+    ResourceClass }o--o{ ResourceClass: subClassOf
+    ResourceClass ||--o{ Cardinality: defines
+    Cardinality ||--|| Property: specifies
+    Property }o--o{ Property: subPropertyOf
+    Property }o--o| ResourceClass: subjectType
+    Property }o--o| ResourceClass: objectType
+    Property }o--|| GuiElement: has
+    Cardinality ||--|| Property: specifies
+

Data

+
erDiagram
+    User {}
+    Project {}
+    Resource {
+        IRI id
+        string label
+        boolean isDeleted
+        string hasPermission
+        date creationDate
+        date lastModificationDate
+        date deleteDate
+        string deleteComment
+    }
+    Value {
+        IRI id
+        date valueCreationDate
+        string hasPermission
+        integer valueHasOrder
+        langstring valueHasComment
+        boolean isDeleted
+        date deleteDate
+        langstring deleteComment
+        string valueHasString
+        UUID valueHasUUID
+    }
+    Resource ||--o{ Value: contains
+    Resource o{--o{ Value: hasStandoffLinkTo
+    Resource o{--|| User: attachedToUser
+    Resource o{--o| User: deletedBy
+    Resource o{--|| Project: attachedToProject
+    Value ||--|| ValueLiteral: "is represented by"
+    Value }o--o{ Resource: "links to"
+    Value }o--o{ ListNode: "links to"
+    Value o{--|| User: attachedToUser
+    Value o{--o| User: deletedBy
+    Value o|--o| Value: previousValue
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/05-internals/design/domain/system-instances/index.html b/05-internals/design/domain/system-instances/index.html new file mode 100644 index 0000000000..399dd186b7 --- /dev/null +++ b/05-internals/design/domain/system-instances/index.html @@ -0,0 +1,3042 @@ + + + + + + + + + + + + + + + + + + + + + + + System Instances - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

System Instances

+

Apart from class and property definitions, +knora-base and knora-admin provide a small number of class instances +that should be present in any running DSP stack:

+

Built-in User Groups

+
classDiagram
+%% Classes
+  class UserGroup {
+
+  }
+  class UnknownUser {
+
+  }
+  class KnownUser {
+
+  }
+  class Creator {
+
+  }
+  class ProjectMember {
+
+  }
+  class ProjectAdmin {
+
+  }
+  class SystemAdmin {
+
+  }
+%% Relationships
+  UserGroup <|-- UnknownUser
+  UserGroup <|-- KnownUser
+  UserGroup <|-- Creator
+  UserGroup <|-- ProjectMember
+  UserGroup <|-- ProjectAdmin
+  UserGroup <|-- SystemAdmin
+

Built-in Users

+
classDiagram
+%% Classes
+  class User {
+
+  }
+  class AnonymousUser {
+
+  }
+  class SystemUser {
+
+  }
+%% Relationships
+  User <|-- AnonymousUser
+  User <|-- SystemUser
+

Built-in Projects

+
classDiagram
+%% Classes
+  class Project {
+
+  }
+  class SystemProject {
+
+  }
+  class DefaultSharedOntologiesProject {
+
+  }
+%% Relationships
+  Project <|-- SystemProject
+  Project <|-- DefaultSharedOntologiesProject
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/05-internals/design/principles/authentication/index.html b/05-internals/design/principles/authentication/index.html new file mode 100644 index 0000000000..bd6213e619 --- /dev/null +++ b/05-internals/design/principles/authentication/index.html @@ -0,0 +1,3003 @@ + + + + + + + + + + + + + + + + + + + + + + + Authentication - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + +

Authentication in Knora

+

Scope

+

Authentication is the process of making sure that if someone is +accessing something then this someone is actually also the person they +pretend to be. The process of making sure that someone is authorized, +(i.e. has the permission to access something, is handled as described +in Authorisation).

+

Implementation

+

The authentication in Knora is based on Basic Auth HTTP basic +authentication, +URL parameters, JSON Web Token, and cookies. This means +that on every request (to any of the routes), credentials need to be +sent either via authorization header, URL parameters or cookie header.

+

All routes are always accessible and if there are no credentials +provided, a default user is assumed. If credentials are sent and they +are not correct (e.g., wrong username, password incorrect, token +expired), then the request will end in an error message.

+

Skipping Authentication

+

There is the possibility to turn skipping authentication on and use a +hardcoded user (Test User). In application.conf set the +skip-authentication = true and Test User will be always assumed.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/05-internals/design/principles/consistency-checking/index.html b/05-internals/design/principles/consistency-checking/index.html new file mode 100644 index 0000000000..fb032d92d4 --- /dev/null +++ b/05-internals/design/principles/consistency-checking/index.html @@ -0,0 +1,3346 @@ + + + + + + + + + + + + + + + + + + + + + + + Consistency Checking - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + +

Consistency Checking

+

Attention! GraphDB is not supported anymore, therefore parts related +to it in this document are redundant.

+

Requirements

+

Knora is designed to prevent inconsistencies in RDF data, +as far as is practical, in a triplestore-independent way (see +Triplestore Updates). However, it is also +useful to enforce consistency constraints in the triplestore itself, for +two reasons:

+
    +
  1. To prevent inconsistencies resulting from bugs in the DSP-API server.
  2. +
  3. To prevent users from inserting inconsistent data directly into the triplestore, bypassing Knora.
  4. +
+

The design of the knora-base ontology supports two ways of specifying +constraints on data (see knora-base: Consistency Checking +for details):

+
    +
  1. A property definition should specify the types that are allowed as + subjects and objects of the property, using + knora-base:subjectClassConstraint and (if it is an object + property) knora-base:objectClassConstraint. Every subproperty of + knora-base:hasValue or a knora-base:hasLinkTo (i.e. every + property of a resource that points to a knora-base:Value or to + another resource) is required have this constraint, because the + DSP-API server relies on it to know what type of object to expect + for the property. Use of knora-base:subjectClassConstraint is + recommended but not required.
  2. +
  3. A class definition should use OWL cardinalities + (see OWL 2 Quick Reference Guide) + to indicate the properties that instances of the class are allowed to + have, and to constrain the number of objects that each property can + have. Subclasses of knora-base:Resource are required to have a + cardinality for each subproperty of knora-base:hasValue or a + knora-base:hasLinkTo that resources of that class can have.
  4. +
+

Specifically, consistency checking should prevent the following:

+
    +
  • An object property or datatype property has a subject of the wrong + class, or an object property has an object of the wrong class + (GraphDB's consistency checke cannot check the types of literals).
  • +
  • An object property has an object that does not exist (i.e. the + object is an IRI that is not used as the subject of any statements + in the repository). This can be treated as if the object is of the + wrong type (i.e. it can cause a violation of + knora-base:objectClassConstraint, because there is no compatible + rdf:type statement for the object).
  • +
  • A class has owl:cardinality 1 or owl:minCardinality 1 on an + object property or datatype property, and an instance of the class + does not have that property.
  • +
  • A class has owl:cardinality 1 or owl:maxCardinality 1 on an + object property or datatype property, and an instance of the class + has more than one object for that property.
  • +
  • An instance of knora-base:Resource has an object property pointing + to a knora-base:Value or to another Resource, and its class has + no cardinality for that property.
  • +
  • An instance of knora-base:Value has a subproperty of + knora-base:valueHas, and its class has no cardinality for that + property.
  • +
  • A datatype property has an empty string as an object.
  • +
+

Cardinalities in base classes are inherited by derived classes. Derived +classes can override inherited cardinalities by making them more +restrictive, i.e. by specifying a subproperty of the one specified in +the original cardinality.

+

Instances of Resource and Value can be marked as deleted, using the +property isDeleted. This must be taken into account as follows:

+
    +
  • With owl:cardinality 1 or owl:maxCardinality 1, if the object of + the property can be marked as deleted, the property must not have + more than one object that has not been marked as deleted. In other + words, it's OK if there is more than one object, as long only one of + them has knora-base:isDeleted false.
  • +
  • With owl:cardinality 1 or owl:minCardinality 1, the property + must have an object, but it's OK if the property's only object is + marked as deleted. We allow this because the subject and object may + have different owners, and it may not be feasible for them to + coordinate their work. The owner of the object should always be able + to mark it as deleted. (It could be useful to notify the owner of + the subject when this happens, but that is beyond the scope of + consistency checking.)
  • +
+

Design

+

Ontotext GraphDB provides a +mechanism for checking the consistency of data in a repository each time +an update transaction is committed. Knora provides GraphDB-specific +consistency rules that take advantage of this feature to provide an +extra layer of consistency checks, in addition to the checks that are +implemented in Knora.

+

When a repository is created in GraphDB, a set of consistency rules can +be provided, and GraphDB's consistency checker can be turned on to +ensure that each update transaction respects these rules, as described +in the section +Reasoning +of the GraphDB documentation. Like custom inference rules, consistency +rules are defined in files with the .pie filename extension, in a +GraphDB-specific syntax.

+

We have added rules to the standard RDFS inference rules file +builtin_RdfsRules.pie, to create the file KnoraRules.pie. The .ttl +configuration file that is used to create the repository must contain +these settings:

+
owlim:ruleset "/path/to/KnoraRules.pie" ;
+owlim:check-for-inconsistencies "true" ;
+
+

The path to KnoraRules.pie must be an absolute path. The scripts +provided with Knora to create test repositories set this path +automatically.

+

Consistency checking in GraphDB relies on reasoning. GraphDB's reasoning +is +Forward-chaining, +which means that reasoning is applied to the contents of each update, +before the update transaction is committed, and the inferred statements +are added to the repository.

+

A GraphDB rules file can contain two types of rules: inference rules and +consistency rules. Before committing an update transaction, GraphDB +applies inference rules, then consistency rules. If any of the +consistency rules are violated, the transaction is rolled back.

+

An inference rule has this form:

+
Id: <rule_name>
+    <premises> <optional_constraints>
+    -------------------------------
+    <consequences> <optional_constraints>
+
+

The premises are a pattern that tries to match statements found in the +data. Optional constraints, which are enclosed in square brackets, make +it possible to specify the premises more precisely, or to specify a +named graph (see examples below). Consequences are the statements that +will be inferred if the premises match. A line of hyphens separates +premises from consequences.

+

A GraphDB consistency rule has a similar form:

+
Consistency: <rule_name>
+    <premises> <optional_constraints>
+    -------------------------------
+    <consequences> <optional_constraints>
+
+

The differences between inference rules and consistency rules are:

+
    +
  • A consistency rule begins with Consistency instead of Id.
  • +
  • In a consistency rule, the consequences are optional. Instead of + representing statements to be inferred, they represent statements + that must exist if the premises are satisfied. In other words, if + the premises are satisfied and the consequences are not found, the + rule is violated.
  • +
  • If a consistency rule doesn't specify any consequences, and the + premises are satisfied, the rule is violated.
  • +
+

Rules use variable names for subjects, predicates, and objects, and they +can use actual property names.

+

Empty string as object

+

If subject i has a predicate p whose object is an empty string, the +constraint is violated:

+
Consistency: empty_string
+    i p ""
+    ------------------------------------
+
+

Subject and object class constraints

+

If subject i has a predicate p that requires a subject of type t, +and i is not a t, the constraint is violated:

+
Consistency: subject_class_constraint
+    p <knora-base:subjectClassConstraint> t
+    i p j
+    ------------------------------------
+    i <rdf:type> t
+
+

If subject i has a predicate p that requires an object of type t, +and the object of p is not a t, the constraint is violated:

+
Consistency: object_class_constraint
+    p <knora-base:objectClassConstraint> t
+    i p j
+    ------------------------------------
+    j <rdf:type> t
+
+

Cardinality constraints

+

A simple implementation of a consistency rule to check +owl:maxCardinality 1, for objects that can be marked as deleted, could +look like this:

+
Consistency: max_cardinality_1_with_deletion_flag
+    i <rdf:type> r
+    r <owl:maxCardinality> "1"^^xsd:nonNegativeInteger
+    r <owl:onProperty> p
+    i p j
+    i p k [Constraint j != k]
+    j <knora-base:isDeleted> "false"^^xsd:boolean
+    k <knora-base:isDeleted> "false"^^xsd:boolean
+    ------------------------------------
+
+

This means: if resource i is a subclass of an owl:Restriction r +with owl:maxCardinality 1 on property p, and the resource has two +different objects for that property, neither of which is marked as +deleted, the rule is violated. Note that this takes advantage of the +fact that Resource and Value have owl:cardinality 1 on isDeleted +(isDeleted must be present even if false), so we do not need to check +whether i is actually something that can be marked as deleted.

+

However, this implementation would be much too slow. We therefore use +two optimisations suggested by Ontotext:

+
    +
  1. Add custom inference rules to make tables (i.e. named graphs) of + pre-calculated information about the cardinalities on properties of + subjects, and use those tables to simplify the consistency rules.
  2. +
  3. Use the [Cut] constraint to avoid generating certain redundant + compiled rules (see Entailment + rules).
  4. +
+

For example, to construct a table of subjects belonging to classes that +have owl:maxCardinality 1 on some property p, we use the following +custom inference rule:

+
Id: maxCardinality_1_table
+    i <rdf:type> r
+    r <owl:maxCardinality> "1"^^xsd:nonNegativeInteger
+    r <owl:onProperty> p
+    ------------------------------------
+    i p r [Context <onto:_maxCardinality_1_table>]
+
+

The constraint [Context <onto:_maxCardinality_1_table>] means that the +inferred triples are added to the context (i.e. the named graph) +http://www.ontotext.com/_maxCardinality_1_table. (Note that we have +defined the prefix onto as http://www.ontotext.com/ in the +Prefices section of the rules file.) As the GraphDB documentation on +Rules +explains:

+
+

If the context is provided, the statements produced as rule +consequences are not ‘visible’ during normal query answering. Instead, +they can only be used as input to this or other rules and only when +the rule premise explicitly uses the given context.

+
+

Now, to find out whether a subject belongs to a class with that +cardinality on a given property, we only need to match one triple. The +revised implementation of the rule +max_cardinality_1_with_deletion_flag is as follows:

+
Consistency: max_cardinality_1_with_deletion_flag
+    i p r [Context <onto:_maxCardinality_1_table>]
+    i p j [Constraint j != k]
+    i p k [Cut]
+    j <knora-base:isDeleted> "false"^^xsd:boolean
+    k <knora-base:isDeleted> "false"^^xsd:boolean
+    ------------------------------------
+
+

The constraint [Constraint j != k] means that the premises will be +satisfied only if the variables j and k do not refer to the same +thing.

+

With these optimisations, the rule is faster by several orders of +magnitude.

+

Since properties whose objects can be marked as deleted must be handled +differently to properties whose objects cannot be marked as deleted, the +knora-base ontology provides a property called +objectCannotBeMarkedAsDeleted. All properties in knora-base whose +objects cannot take the isDeleted flag (including datatype properties) +should be derived from this property. This is how it is used to check +owl:maxCardinality 1 for objects that cannot be marked as deleted:

+
Consistency: max_cardinality_1_without_deletion_flag
+    i p r [Context <onto:_maxCardinality_1_table>]
+    p <rdfs:subPropertyOf> <knora-base:objectCannotBeMarkedAsDeleted>
+    i p j [Constraint j != k]
+    i p k [Cut]
+    ------------------------------------
+
+

To check owl:minCardinality 1, we do not care whether the object can +be marked as deleted, so we can use this simple rule:

+
Consistency: min_cardinality_1_any_object
+    i p r [Context <onto:_minCardinality_1_table>]
+    ------------------------------------
+    i p j
+
+

This means: if a subject i belongs to a class that has +owl:minCardinality 1 on property p, and i has no object for p, +the rule is violated.

+

To check owl:cardinality 1, we need two rules: one that checks whether +there are too few objects, and one that checks whether there are too +many. To check whether there are too few objects, we don't care whether +the objects can be marked as deleted, so the rule is the same as +min_cardinality_1_any_object, except for the cardinality:

+
Consistency: cardinality_1_not_less_any_object
+    i p r [Context <onto:_cardinality_1_table>]
+    ------------------------------------
+    i p j
+
+

To check whether there are too many objects, we need to know whether the +objects can be marked as deleted or not. In the case where the objects +can be marked as deleted, the rule is the same as +max_cardinality_1_with_deletion_flag, except for the cardinality:

+
Consistency: cardinality_1_not_greater_with_deletion_flag
+    i p r [Context <onto:_cardinality_1_table>]
+    i p j [Constraint j != k]
+    i p k [Cut]
+    j <knora-base:isDeleted> "false"^^xsd:boolean
+    k <knora-base:isDeleted> "false"^^xsd:boolean
+    ------------------------------------
+
+

In the case where the objects cannot be marked as deleted, the rule is +the same as max_cardinality_1_without_deletion_flag, except for the +cardinality:

+
Consistency: cardinality_1_not_less_any_object
+    i p r [Context <onto:_cardinality_1_table>]
+    ------------------------------------
+    i p j
+
+

Knora allows a subproperty of knora-base:hasValue or +knora-base:hasLinkTo to be a predicate of a resource only if the +resource's class has some cardinality for the property. For convenience, +knora-base:hasValue and knora-base:hasLinkTo are subproperties of +knora-base:resourceProperty, which is used to check this constraint in +the following rule:

+
Consistency: resource_prop_cardinality_any
+    i <knora-base:resourceProperty> j
+    ------------------------------------
+    i p j
+    i <rdf:type> r
+    r <owl:onProperty> p
+
+

If resource i has a subproperty of knora-base:resourceProperty, and +i is not a member of a subclass of an owl:Restriction r with a +cardinality on that property (or on one of its base properties), the +rule is violated.

+

A similar rule, value_prop_cardinality_any, ensures that if a value +has a subproperty of knora-base:valueHas, the value's class has some +cardinality for that property.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/05-internals/design/principles/design-overview/index.html b/05-internals/design/principles/design-overview/index.html new file mode 100644 index 0000000000..23a9743445 --- /dev/null +++ b/05-internals/design/principles/design-overview/index.html @@ -0,0 +1,3162 @@ + + + + + + + + + + + + + + + + + + + + + + + Design Overview - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + +

DSP-API Server Design Overview

+

Introduction

+

DSP-API's responsibilites are:

+
    +
  • Querying, creating, updating, and deleting data
  • +
  • Creating, updating and deleting data models (ontologies)
  • +
  • Managing projects and users
  • +
  • Authentication of clients
  • +
  • Authorisation of clients' requests
  • +
+

DSP-API is developed with Scala and uses the +Akka framework for message-based concurrency. It is +designed to work with the Apache Jena Fuseki triplestore +which is compliant to the SPARQL 1.1 Protocol. +For file storage, it uses Sipi.

+

DSP-API Versions

+
    +
  • DSP-API v2: the latest DSP-API that should be used.
  • +
  • DSP-API v1: has been removed after a long period of deprecation.
  • +
+

There is also an Admin API for administrating DSP projects.

+

Error Handling

+

The error-handling design has these aims:

+
    +
  1. Simplify the error-handling code in actors as much as possible.
  2. +
  3. Produce error messages that clearly indicate the context in which + the error occurred (i.e. what the application was trying to do).
  4. +
  5. Ensure that clients receive an appropriate error message when an + error occurs.
  6. +
  7. Ensure that ask requests are properly terminated with an + akka.actor.Status.Failure message in the event of an error, + without which they will simply time out (see + Ask: Send and Receive Future).
  8. +
  9. When a actor encounters an error that isn't the client's fault (e.g. + a triplestore failure), log it, but don't do this with errors caused + by bad input.
  10. +
  11. When logging errors, include the full JVM stack trace.
  12. +
+

A hierarchy of exception classes is defined in Exceptions.scala, +representing different sorts of errors that could occur. The hierarchy +has two main branches:

+
    +
  • RequestRejectedException, an abstract class for errors that are + the client's fault. These errors are not logged.
  • +
  • InternalServerException, an abstract class for errors that are not + the client's fault. These errors are logged.
  • +
+

Exception classes in this hierarchy can be defined to include a wrapped +cause exception. When an exception is logged, its stack trace will be +logged along with the stack trace of its cause. It is therefore +recommended that low-level code should catch low-level exceptions, and +wrap them in one of our higher-level exceptions, in order to clarify the +context in which the error occurred.

+

To simplify error-handling in responders, a utility method called +future2Message is provided in ActorUtils. It is intended to be used +in an actor's receive method to respond to messages in the ask +pattern. If the responder's computation is successful, it is sent to the +requesting actor as a response to the ask. If the computation fails, +the exception representing the failure is wrapped in a Status.Failure, +which is sent as a response to the ask. If the error is a subclass of +RequestRejectedException, only the sender is notified of the error; +otherwise, the error is also logged and rethrown (so that the +KnoraExceptionHandler can handle the exception).

+

In many cases, we transform data from the triplestore into a Map +object. To simplify checking for required values in these collections, +the class ErrorHandlingMap is provided. You can wrap any Map in an +ErrorHandlingMap. You must provide a function that will generate an +error message when a required value is missing, and optionally a +function that throws a particular exception. Rows of SPARQL query +results are already returned in ErrorHandlingMap objects.

+

If you want to add a new exception class, see the comments in +Exceptions.scala for instructions.

+

Transformation of Exception to Client Responses

+

The org.knora.webapi.KnoraExceptionHandler is brought implicitly into +scope of pekko-http, and by doing so registered and used to handle the +transformation of all KnoraExceptions into HttpResponses. This +handler handles only exceptions thrown inside the route and not the +actors. However, the design of reply message passing from actors (by +using future2Message), makes sure that any exceptions thrown inside +actors, will reach the route, where they will be handled.

+

API Routing

+

The API routes in the routing package are defined using the DSL +provided by the +pekko-http +library. A routing function has to do the following:

+
    +
  1. Authenticate the client.
  2. +
  3. Figure out what the client is asking for.
  4. +
  5. Construct an appropriate request message and send it to the appropriate responder.
  6. +
  7. Return a result to the client.
  8. +
+

To simplify the coding of routing functions, they are contained in +objects that extend org.knora.webapi.routing.Authenticator. Each +routing function performs the following operations:

+
    +
  1. Authenticator.getUserADM is called to authenticate the user.
  2. +
  3. The request parameters are interpreted and validated, and a request + message is constructed to send to the responder. If the request is + invalid, BadRequestException is thrown. If the request message is + requesting an update operation, it must include a UUID generated by + UUID.randomUUID, so the responder can obtain a write lock on the + resource being updated.
  4. +
+

The routing function then passes the message to a function in an API-specific +routing utility: RouteUtilV2 or RouteUtilADM. +This utility function sends the message to ResponderManager (which +forwards it to the relevant responder), returns a response to the client +in the appropriate format, and handles any errors.

+

Logging

+

Logging in DSP-API is configurable through logback.xml, allowing fine +grain configuration of what classes / objects should be logged from which level.

+

The Akka Actors use Akka Logging +while logging inside plain Scala Objects and Classes is done through +Scala Logging.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/05-internals/design/principles/rdf-api/index.html b/05-internals/design/principles/rdf-api/index.html new file mode 100644 index 0000000000..5cb7934e8e --- /dev/null +++ b/05-internals/design/principles/rdf-api/index.html @@ -0,0 +1,3096 @@ + + + + + + + + + + + + + + + + + + + + + + + RDF Processing API - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + +

RDF Processing API

+

DSP provides an API for parsing and formatting RDF data and +for working with RDF graphs. This allows DSP developers to use a single, +idiomatic Scala API as a façade for a Java RDF library.

+

Overview

+

The API is in the package org.knora.webapi.messages.util.rdf. It includes:

+
    +
  • +

    RdfModel, which represents a set of RDF graphs (a default graph and/or one or more named graphs). + A model can be constructed from scratch, modified, and searched.

    +
  • +
  • +

    RdfNode and its subclasses, which represent RDF nodes (IRIs, blank nodes, and literals).

    +
  • +
  • +

    Statement, which represents a triple or quad.

    +
  • +
  • +

    RdfNodeFactory, which creates nodes and statements.

    +
  • +
  • +

    RdfModelFactory, which creates empty RDF models.

    +
  • +
  • +

    RdfFormatUtil, which parses and formats RDF models.

    +
  • +
  • +

    JsonLDUtil, which provides specialised functionality for working + with RDF in JSON-LD format, and for converting between RDF models + and JSON-LD documents. RdfFormatUtil uses JsonLDUtil when appropriate.

    +
  • +
  • +

    ShaclValidator, which validates RDF models using SHACL shapes.

    +
  • +
+

To work with RDF models, start with RdfFeatureFactory, which returns instances +of RdfNodeFactory, RdfModelFactory, RdfFormatUtil, and ShaclValidator. +JsonLDUtil does not need a feature factory.

+

To iterate efficiently over the statements in an RdfModel, use its iterator method. +An RdfModel cannot be modified while you are iterating over it. +If you are iterating to look for statements to modify, you can +collect a Set of statements to remove and a Set of statements +to add, and perform these update operations after you have finished +the iteration.

+

RDF stream processing

+

To read or write a large amount of RDF data without generating a large string +object, you can use the stream processing methods in RdfFormatUtil.

+

To parse an InputStream to an RdfModel, use inputStreamToRdfModel. +To format an RdfModel to an OutputStream, use rdfModelToOutputStream.

+

To parse RDF data from an InputStream and process it one statement at a time, +you can write a class that implements the RdfStreamProcessor trait, and +use it with the RdfFormatUtil.parseWithStreamProcessor method. +Your RdfStreamProcessor can also send one statement at a time to a +formatting stream processor, which knows how to write RDF to an OutputStream +in a particular format. Use RdfFormatUtil.makeFormattingStreamProcessor to +construct one of these.

+

SPARQL queries

+

In tests, it can be useful to run SPARQL queries to check the content of +an RdfModel. To do this, use the RdfModel.asRepository method, which +returns an RdfRepository that can run SELECT queries.

+

The configuration of the default graph depends on which underlying +RDF library is used. If you are querying data in named graphs, use FROM +or quad patterns rather than the default graph.

+

SHACL validation

+

On startup, graphs of SHACL shapes are loaded from Turtle files in a directory specified +by app.shacl.shapes-dir in application.conf, and in subdirectories of +that directory. To validate the default graph of an RdfModel using a graph of +SHACL shapes, call ShaclValidator.validate, specifying the relative path of the +Turtle file containing the graph of shapes.

+

Implementations

+
    +
  • +

    The Jena-based implementation, in package org.knora.webapi.messages.util.rdf.jenaimpl.

    +
  • +
  • +

    The RDF4J-based implementation, in package org.knora.webapi.messages.util.rdf.rdf4jimpl.

    +
  • +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/05-internals/design/principles/store-module/index.html b/05-internals/design/principles/store-module/index.html new file mode 100644 index 0000000000..94caa9f52d --- /dev/null +++ b/05-internals/design/principles/store-module/index.html @@ -0,0 +1,3021 @@ + + + + + + + + + + + + + + + + + + + + + + + Store Module - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + +

Store Module

+

Overview

+

GraphDB and embedded Jena TDB triplestores support is deprecated since +v20.1.1 of DSP-API.

+

The store module houses the different types of data stores supported by +Knora. At the moment, only triplestores and IIIF servers (Sipi) are supported. +The triplestore support is implemented in the +org.knora.webapi.store.triplestore package and the IIIF server support in +org.knora.webapi.store.iiif package.

+

Lifecycle

+

At the top level, the store package houses the StoreManager-Actor +which is started when Knora starts. The StoreManager then starts the +TriplestoreManager and IIIFManager, which each in turn starts their +correct actor implementation.

+

Triplestores

+

Currently, the only supported triplestore is Apache Jena Fuseki, a HTTP-based triplestore.

+

HTTP-based triplestore support is implemented in the org.knora.webapi.triplestore.http package.

+

An HTTP-based triplestore is one that is accessed remotely over the HTTP +protocol. HttpTriplestoreConnector supports the open source triplestore Apache Jena Fuseki.

+

IIIF Servers

+

Currently, only support for SIPI is implemented in org.knora.webapi.store.iiifSipiConnector.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/05-internals/design/principles/triplestore-updates/index.html b/05-internals/design/principles/triplestore-updates/index.html new file mode 100644 index 0000000000..dc2a5de1f1 --- /dev/null +++ b/05-internals/design/principles/triplestore-updates/index.html @@ -0,0 +1,3667 @@ + + + + + + + + + + + + + + + + + + + + + + + Triplestore Updates - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + + + + + +
+
+ + + + + + +

Triplestore Updates

+

Requirements

+

General

+

The supported update operations are:

+
    +
  • Create a new resource with its initial values.
  • +
  • Add a new value.
  • +
  • Change a value.
  • +
  • Delete a value (i.e. mark it as deleted).
  • +
  • Delete a resource (i.e. mark it as deleted).
  • +
+

Users must be able to edit the same data concurrently.

+

Each update must be atomic and leave the database in a consistent, +meaningful state, respecting ontology constraints and permissions.

+

The application must not use any sort of long-lived locks, because they +tend to hinder concurrent edits, and it is difficult to ensure that they +are released when they are no longer needed. Instead, if a user requests +an update based on outdated information (because another user has just +changed something, and the first user has not found out yet), the update +must be not performed, and the application must notify the user who +requested it, suggesting that the user should check the relevant data +and try again if necessary. (We may eventually provide functionality to +help users merge edits in such a situation. The application can also +encourage users to coordinate with one another when they are working on +the same data, and may eventually provide functionality to facilitate +this coordination.)

+

We can assume that each SPARQL update operation will run in its own +database transaction with an isolation level of 'read committed'. +We cannot assume that it is possible to run more than one SPARQL update +in a single database transaction. The SPARQL 1.1 Protocol does not provide a +way to do this, and currently it +can be done only by embedding the triplestore in the application and +using a vendor-specific API, but we cannot require this in Knora.)

+

Permissions

+

To create a new value (as opposed to a new version of an existing +value), the user must have permission to modify the containing resource.

+

To create a new version of an existing value, the user needs only to +have permission to modify the current version of the +value; no permissions on the resource are needed.

+

Since changing a link requires deleting the old link and creating a new +one (as described in Linking), a user wishing +to change a link must have modify permission on both the containing +resource and the knora-base:LinkValue for the existing link.

+

When a new resource or value is created, it can be given default permissions +specified the project's admin data, or (only in API v2) custom permissions +can be specified.

+

Ontology Constraints

+

Knora must not allow an update that would violate an ontology +constraint.

+

When creating a new value (as opposed to adding a new version of an +existing value), Knora must not allow the update if the containing +resource's OWL class does not contain a cardinality restriction for the +submitted property, or if the new value would violate the cardinality +restriction.

+

It must also not allow the update if the type of the submitted value +does not match the knora-base:objectClassConstraint of the property, +or if the property has no knora-base:objectClassConstraint. In the +case of a property that points to a resource, Knora must ensure that the +target resource belongs to the OWL class specified in the property's +knora-base:objectClassConstraint, or to a subclass of that class.

+

Duplicate and Redundant Values

+

When creating a new value, or changing an existing value, Knora checks +whether the submitted value would duplicate an existing value for the +same property in the resource. The definition of 'duplicate' depends on +the type of value; it does not necessarily mean that the two values are +strictly equal. For example, if two text values contain the same Unicode +string, they are considered duplicates, even if they have different +Standoff markup. If resource R has property P with value V1, and +V1 is a duplicate of V2, the API server must not add another +instance of property P with value V2. However, if the requesting +user does not have permission to see V2, the duplicate is allowed, +because forbidding it would reveal the contents of V2 to the user.

+

When creating a new version of a value, Knora also checks whether the +new version is redundant, given the existing value. It is possible for +the definition of 'redundant' can depend on the type of value, but in +practice, it means that the values are strictly equal: any change, +however trivial, is allowed.

+

Versioning

+

Each Knora value (i.e. something belonging to an OWL class derived from +knora-base:Value) is versioned. This means that once created, a value +is never modified. Instead, 'changing' a value means creating a new +version of the value --- actually a new value --- that points to the +previous version using knora-base:previousValue. The versions of a +value are a singly-linked list, pointing backwards into the past. When a +new version of a value is made, the triple that points from the resource +to the old version (using a subproperty of knora-base:hasValue) is +removed, and a triple is added to point from the resource to the new +version. Thus the resource always points only to the current version of +the value, and the older versions are available only via the current +version's knora-base:previousValue predicate.

+

Unlike values, resources (members of OWL classes derived from +knora-base:Resource) are not versioned. The data that is attached to a +resource, other than its values, can be modified.

+

Deleting

+

Knora does not actually delete resources or values; it only marks them +as deleted. Deleted data is normally hidden. All resources and values +must have the predicate knora- base:isDeleted, whose object is a +boolean. If a resource or value has been marked as deleted, it has +knora-base:isDeleted true and has a knora-base:deleteDate. An +optional knora-base:deleteComment may be added to explain why the +resource or value has been marked as deleted.

+

Normally, a value is marked as deleted without creating a new version of +it. However, link values must be treated as a special case. Before a +LinkValue can be marked as deleted, its reference count must be +decremented to 0. Therefore, a new version of the LinkValue is made, +with a reference count of 0, and it is this new version that is marked +as deleted.

+

Since it is necessary to be able to find out when a resource was +deleted, it is not possible to undelete a resource. Moreover, to +simplify the checking of cardinality constraints, and for consistency +with resources, it is not possible to undelete a value, and no new +versions of a deleted value can be made. Instead, if desired, a new +resource or value can be created by copying data from a deleted resource +or value.

+

Linking

+

Links must be treated differently to other types of values. Knora needs +to maintain information about the link, including permissions and a +version history. Since the link does not have a unique IRI of its own, +Knora uses RDF +reifications for +this purpose. Each link between two resources has exactly one +(non-deleted) knora-base:LinkValue. The resource itself has a +predicate that points to the LinkValue, using a naming convention in +which the word Value is appended to the name of the link predicate to +produce the link value predicate. For example, if a resource +representing a book has a predicate called hasAuthor that points to +another resource, it must also have a predicate called hasAuthorValue +that points to the LinkValue in which information about the link is +stored. To find a particular LinkValue, one can query it either by +using its IRI (if known), or by using its rdf:subject, +rdf:predicate, and rdf:object (and excluding link values that are +marked as deleted).

+

Like other values, link values are versioned. The link value predicate +always points from the resource to the current version of the link +value, and previous versions are available only via the current +version's knora-base:previousValue predicate. Deleting a link means +deleting the triple that links the two resources, and making a new +version of the link value, marked with knora-base:isDeleted. A triple +then points from the resource to this new, deleted version (using the +link value property).

+

The API allows a link to be 'changed' so that it points to a different +target resource. This is implemented as follows: the existing triple +connecting the two resources is removed, and a new triple is added using +the same link property and pointing to the new target resource. A new +version of the old link's LinkValue is made, marked with +knora-base:isDeleted. A new LinkValue is made for the new link. The +new LinkValue has no connection to the old one.

+

When a resource contains knora-base:TextValue with Standoff markup +that includes a reference to another resource, this reference is +materialised as a direct link between the two resources, to make it +easier to query. A special link property, +knora-base:hasStandoffLinkTo, is used for this purpose. The +corresponding link value property, knora-base:hasStandoffLinkToValue, +points to a LinkValue. This LinkValue contains a reference count, +indicated by knora-base:valueHasRefCount, that represents the number +of text values in the containing resource that include one or more +Standoff references to the specified target resource. Each time this +number changes, a new version of this LinkValue is made. When the +reference count reaches zero, the triple with +knora-base:hasStandoffLinkTo is removed, and a new version of the +LinkValue is made and marked with knora-base:isDeleted. If the same +resource reference later appears again in a text value, a new triple is +added using knora-base:hasStandoffLinkTo, and a new LinkValue is +made, with no connection to the old one.

+

For consistency, every LinkValue contains a reference count. If the +link property is not knora-base:hasStandoffLinkTo, the reference count +will always be either 1 (if the link exists) or 0 (if it has been +deleted, in which case the link value will also be marked with +knora-base:isDeleted).

+

When a LinkValue is created for a standoff resource reference, it is +given the same permissions as the text value containing the reference.

+

Design

+

Responsibilities of Responders

+

The resources responder (ResourcesResponderV2) has sole responsibility for generating SPARQL to +create and updating resources, and the values responder (ValuesResponderV2) has sole responsibility for generating +SPARQL to create and update values. When a new resource is created with its values, the values responder +generates SPARQL statements that can be included in the INSERT +clause of a SPARQL update to create the values, and +the resources responder adds these statements to the SPARQL update that +creates the resource. This ensures that the resource and its values are +created in a single SPARQL update operation, and hence in a single +triplestore transaction.

+

Application-level Locking

+

The 'read committed' isolation level cannot prevent a scenario where two +users want to add the same data at the same time. It is possible that +both requests would do pre-update checks and simultaneously find that it +is OK to add the data, and that both updates would then succeed, +inserting redundant data and possibly violating ontology constraints. +Therefore, Knora uses short-lived, application-level write locks on +resources, to ensure that only one request at a time can update a given +resource. Before each update, the application acquires a lock on a resource. +To prevent deadlocks, Knora locks only one resource per API operation. +It then does the pre-update checks and the update, then releases the +lock. The lock implementation (in IriLocker) requires each API +request message to include a random UUID, which is generated in the +API Routing package. Using +application-level locks allows us to do pre-update checks in their own +transactions, and finally to do the SPARQL update in its own +transaction.

+

Ensuring Data Consistency

+

Knora enforces consistency constraints using three redundant mechanisms:

+
    +
  1. By doing pre-update checks using SPARQL SELECT queries and cached + ontology data.
  2. +
  3. By doing checks in the WHERE clauses of SPARQL updates.
  4. +
  5. Deprecated: By using GraphDB's built-in consistency checker (see + Consistency Checking).
  6. +
+

We take the view that redundant consistency checks are a good thing.

+

Pre-update checks are SPARQL SELECT queries that are executed while +holding an application-level lock on the resource to be updated. These +checks should work with any triplestore, and can return helpful, +Knora-specific error messages to the client if the request would violate +a consistency constraint.

+

However, the SPARQL update itself is our only chance to do pre-update +checks in the same transaction that will perform the update. The design +of the SPARQL 1.1 Update +standard makes it possible to ensure that if certain conditions are not +met, the update will not be performed. In our SPARQL update code, each +update contains a WHERE clause, possibly a DELETE clause, and an +INSERT clause. The WHERE clause is executed first. It performs +consistency checks and provides values for variables that are used in +the DELETE and/or INSERT clauses. In our updates, if the +expectations of the WHERE clause are not met (e.g. because the data to +be updated does not exist), the WHERE clause should return no results; +as a result, the update will not be performed.

+

Regardless of whether the update changes the contents of the +triplestore, it returns nothing. If the update did nothing because the +conditions of the WHERE clause were not met, the only way to find out is +to do a SELECT afterwards. Moreover, in this case, there is no +straightforward way to find out which conditions was not met. This is +one reason why Knora does pre-update checks using separate SELECT +queries and/or cached ontology data, before performing the update. +This makes it possible to return specific error messages to the user to +indicate why an update cannot be performed.

+

Moreover, while some checks are easy to do in a SPARQL update, others +are difficult, impractical, or impossible. Easy checks include checking +whether a resource or value exists or is deleted, and checking that the +knora-base:objectClassConstraint of a predicate matches the rdf:type +of its intended object. Cardinality checks are not very difficult, but +they perform poorly on Jena. Knora does not do permission checks in +SPARQL, because its permission-checking algorithm is too complex to be +implemented in SPARQL. For this reason, Knora's check for duplicate +values cannot be done in SPARQL update code, because it relies on +permission checks.

+

In a bulk import operation, which can create a large number of resources +in a single SPARQL update, a WHERE clause can become very expensive +for the triplestore, in terms of memory as well as execution time. +Moreover, RDF4J (and hence GraphDB) uses a recursive algorithm to parse +SPARQL queries with WHERE clauses, so the size of a WHERE clause is +limited by the stack space available to the Java Virtual Machine. +Therefore, in bulk import operations, Knora uses INSERT DATA, which +does not involve a WHERE clause. Bulk imports thus rely on checks (1) +and (3) above.

+

SPARQL Update Examples

+

The following sample SPARQL update code is simpler than what Knora +actually does. It is included here to illustrate the way Knora's SPARQL +updates are structured and how concurrent updates are handled.

+

Finding a value IRI in a value's version history

+

We will need this query below. If a value is present in a resource +property's version history, the query returns everything known about the +value, or nothing otherwise:

+
prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
+prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
+prefix knora-base: <http://www.knora.org/ontology/knora-base#>
+
+SELECT ?p ?o
+WHERE {
+    BIND(IRI("http://rdfh.ch/c5058f3a") as ?resource)
+    BIND(IRI("http://www.knora.org/ontology/0803/incunabula#book_comment") as ?property)
+    BIND(IRI("http://rdfh.ch/c5058f3a/values/testComment002") as ?searchValue)
+
+    ?resource ?property ?currentValue .
+    ?currentValue knora-base:previousValue* ?searchValue .
+    ?searchValue ?p ?o .
+}
+
+

Creating the initial version of a value

+
prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
+prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
+prefix knora-base: <http://www.knora.org/ontology/knora-base#>
+
+WITH <http://www.knora.org/ontology/0803/incunabula>
+INSERT {
+    ?newValue rdf:type ?valueType ;
+              knora-base:valueHasString """Comment 1""" ;
+              knora-base:attachedToUser <http://rdfh.ch/users/91e19f1e01> ;
+              knora-base:attachedToProject <http://rdfh.ch/projects/77275339> ;
+              knora-base:hasPermissions "V knora-admin:KnownUser,knora-admin:UnknownUser|M knora-admin:ProjectMember"  ;
+              knora-base:valueTimestamp ?currentTime .
+
+    ?resource ?property ?newValue .
+} WHERE {
+    BIND(IRI("http://rdfh.ch/c5058f3a") as ?resource)
+    BIND(IRI("http://www.knora.org/ontology/0803/incunabula#book_comment") as ?property)
+    BIND(IRI("http://rdfh.ch/c5058f3a/values/testComment001") AS ?newValue)
+    BIND(IRI("http://www.knora.org/ontology/knora-base#TextValue") AS ?valueType)
+    BIND(NOW() AS ?currentTime)
+
+    # Do nothing if the resource doesn't exist.
+    ?resource rdf:type ?resourceClass .
+
+    # Do nothing if the submitted value has the wrong type.
+    ?property knora-base:objectClassConstraint ?valueType .
+}
+
+

To find out whether the insert succeeded, the application can use the +query in Finding a value IRI in a value's version history +to look for the new IRI in the property's version history.

+

Adding a new version of a value

+
prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
+prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
+prefix knora-base: <http://www.knora.org/ontology/knora-base#>
+
+WITH <http://www.knora.org/ontology/0803/incunabula>
+DELETE {
+    ?resource ?property ?currentValue .
+} INSERT {
+    ?newValue rdf:type ?valueType ;
+              knora-base:valueHasString """Comment 2""" ;
+              knora-base:previousValue ?currentValue ;
+              knora-base:attachedToUser <http://rdfh.ch/users/91e19f1e01> ;
+              knora-base:attachedToProject <http://rdfh.ch/projects/77275339> ;
+              knora-base:hasPermissions "V knora-admin:KnownUser,knora-admin:UnknownUser|M knora-admin:ProjectMember"  ;
+              knora-base:valueTimestamp ?currentTime .
+
+    ?resource ?property ?newValue .
+} WHERE {
+    BIND(IRI("http://rdfh.ch/c5058f3a") as ?resource)
+    BIND(IRI("http://rdfh.ch/c5058f3a/values/testComment001") AS ?currentValue)
+    BIND(IRI("http://rdfh.ch/c5058f3a/values/testComment002") AS ?newValue)
+    BIND(IRI("http://www.knora.org/ontology/knora-base#TextValue") AS ?valueType)
+    BIND(NOW() AS ?currentTime)
+
+    ?resource ?property ?currentValue .
+    ?property knora-base:objectClassConstraint ?valueType .
+}
+
+

The update request must contain the IRI of the most recent version of +the value (http://rdfh.ch/c5058f3a/values/c3295339). If this is +not in fact the most recent version (because someone else has done an +update), this operation will do nothing (because the WHERE clause will +return no rows). To find out whether the update succeeded, the +application will then need to do a SELECT query using the query in +Finding a value IRI in a value's version history. +In the case of concurrent updates, there are two possibilities:

+
    +
  1. Users A and B are looking at version 1. User A submits an update and + it succeeds, creating version 2, which user A verifies using a + SELECT. User B then submits an update to version 1 but it fails, + because version 1 is no longer the latest version. User B's SELECT + will find that user B's new value IRI is absent from the value's + version history.
  2. +
  3. Users A and B are looking at version 1. User A submits an update and + it succeeds, creating version 2. Before User A has time to do a + SELECT, user B reads the new value and updates it again. Both users + then do a SELECT, and find that both their new value IRIs are + present in the value's version history.
  4. +
+

Getting all versions of a value

+
prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
+prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
+prefix knora-base: <http://www.knora.org/ontology/knora-base#>
+
+SELECT ?value ?valueTimestamp ?previousValue
+WHERE {
+    BIND(IRI("http://rdfh.ch/c5058f3a") as ?resource)
+    BIND(IRI("http://www.knora.org/ontology/0803/incunabula#book_comment") as ?property)
+    BIND(IRI("http://rdfh.ch/c5058f3a/values/testComment002") AS ?currentValue)
+
+    ?resource ?property ?currentValue .
+    ?currentValue knora-base:previousValue* ?value .
+
+    OPTIONAL {
+        ?value knora-base:valueTimestamp ?valueTimestamp .
+    }
+
+    OPTIONAL {
+        ?value knora-base:previousValue ?previousValue .
+    }
+}
+
+

This assumes that we know the current version of the value. If the +version we have is not actually the current version, this query will +return no rows.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/05-internals/development/building-and-running/index.html b/05-internals/development/building-and-running/index.html new file mode 100644 index 0000000000..bdf1d755b8 --- /dev/null +++ b/05-internals/development/building-and-running/index.html @@ -0,0 +1,3247 @@ + + + + + + + + + + + + + + + + + + + + + + + Build and Running - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + + + + + +
+
+ + + + + + +

Building and Running

+

Setting up Docker

+
    +
  1. Install Docker
  2. +
  3. Go to Docker preferences and increase the memory allocation. + screenshot 'Docker Desktop' + The stack's memory usage is limited to ~20GB, though it should only use that much during heavy workloads. You should + be good to go in any case if you allocate 22GB or more.
  4. +
+

Running the stack

+

With Docker installed and configured,

+
    +
  1. Run the following:
  2. +
+
make init-db-test
+
+

to create the knora-test repository and initialize it with loading some test data into the triplestore (Fuseki).

+
    +
  1. Start the entire knora-stack (fuseki (db), sipi, api, salsah1) with the following command:
  2. +
+
make stack-up
+
+

Note: To delete the existing containers and for a clean start, before creating the knora-test repository explained +in the first step above, run the following:

+
make stack-down-delete-volumes
+
+

This stops the knora-stack and deletes any created volumes (deletes the database!).

+

To only shut down the Knora-Stack without deleting the containers:

+
make stack-down
+
+

To restart the knora-api use the following command:

+
make stack-restart-api
+
+

If a change is made to knora-api code, only its image needs to be rebuilt. In that case, use

+
make stack-up-fast
+
+

which starts the knora-stack by skipping rebuilding most of the images (only api image is rebuilt).

+

To work on Metadata, use

+
make stack-up-with-metadata
+
+

which will put three example metadata sets to the projects anything, images and dokubib. +This data can then be consumed +from localhost:3333/v2/metadata/http%3A%2F%2Frdfh.ch%2Fprojects%2F0001, localhost:3333/v2/metadata/http%3A%2F%2Frdfh.ch%2Fprojects%2F00FF +and localhost:3333/v2/metadata/http%3A%2F%2Frdfh.ch%2Fprojects%2F0804.

+

Managing Containers in Docker Dashboard

+

The Docker Desktop is installed on your computer during the installation of docker, it enables easy management of docker +containers and access to Docker Hub. To manage your docker containers, docker desktop provides a dashbord.

+

screenshot 'Docker Desktop'

+

In docker dashboard, you can see all the running containers, stop, start, restart, or completely delete them. For +example, when +you start the knora-stack as explained above, in the docker dashboard you will see following:

+

screenshot 'Docker Dashboard'

+

Access the logs

+

To read information logged out of any container (db, api, etc.), click on the container in the dashboard and choose +logs. The example, below shows the logs of the database (db) container that includes the last SPARQL query sent to the +triplestore.

+

screenshot 'Docker Logs'

+

Note that, you can also print out the log information directly from the command line. For example, the same logs of the +database container can be printed out using the following command:

+
make stack-logs-db
+
+

Similarly, the logs of the other containers can be printed out by running make with stack-logs-api +or stack-logs-sipi. +These commands print out and follow the logs, to only print the logs out without following, use +-no-follow version of the commands for example:

+
make stack-logs-db-no-follow
+
+

Lastly, to print out the entire logs of the running knora-stack, use

+
make stack-logs
+
+

With the Docker plugin installed, you can attach a terminal to the docker container within VS Code. This will stream the +docker logs to the terminal window of the editor.

+

screenshot 'VSCode Docker'

+

The docker plugin also allows for a number of other useful features, like inspecting the container's file system or +attaching a shell to the container.

+

Running the automated tests

+

To run all test targets, use the following in the command line:

+
make test-all
+
+

To run a single test from the command line, for example SearchV2R2RSpec, +run the following:

+
sbt " webapi / testOnly *SearchV2R2RSpec* "
+
+

Note: to run tests, the api container must be stopped first!

+

Build and Publish Documentation

+

First, you need to install the requirements through:

+
make docs-install-requirements
+
+

Then, to build docs into the local site folder, run the following command:

+
make docs-build
+
+

At this point, you can serve the docs to view them locally using

+
make docs-serve
+
+

Lastly, to build and publish docs to Github Pages, use

+
make docs-publish
+
+

Build and Publish Docker Images

+

To build and publish all Docker images locally

+
make docker-build
+
+

To publish all Docker images to Dockerhub

+
make docker-publish
+
+

Continuous Integration

+

For continuous integration testing, we use Github CI Actions. Every commit +pushed to the git repository or every pull request, triggers the build. +Additionally, in Github there is a small checkmark beside every commit, +signaling the status of the build (successful, unsuccessful, ongoing).

+

The build that is executed on Github CI Actions is defined in the .github/workflows/*.yml files.

+

Webapi Server Startup-Flags

+

The Webapi-Server can be started with a number of flags.

+

loadDemoData - Flag

+

When the webapi-server is started with the loadDemoData flag, then at +startup, the data which is configured in application.conf under the +app.triplestore.rdf-data key is loaded into the triplestore, and any +data in the triplestore is removed beforehand.

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/05-internals/development/docker-cheat-sheet/index.html b/05-internals/development/docker-cheat-sheet/index.html new file mode 100644 index 0000000000..16113adc98 --- /dev/null +++ b/05-internals/development/docker-cheat-sheet/index.html @@ -0,0 +1,3083 @@ + + + + + + + + + + + + + + + + + + + + + + + Docker Cheat Sheet - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + +

Docker Cheat Sheet

+

A complete cheat sheet can be found +here

+

Lifecycle

+ +

If you want a transient container, docker run --rm will remove the +container after it stops.

+

If you want to map a directory on the host to a docker container, +docker run -v $HOSTDIR:$DOCKERDIR.

+

Starting and Stopping

+ +

Info

+
    +
  • docker ps + shows running containers.
  • +
  • docker logs gets + logs from container. (You can use a custom log driver, but logs is + only available for json-file and journald in 1.10)
  • +
  • docker inspect + looks at all the info on a container (including IP address).
  • +
  • docker events + gets events from container.
  • +
  • docker port shows + public facing port of container.
  • +
  • docker top + shows running processes in container.
  • +
  • docker stats shows + containers' resource usage statistics.
  • +
  • docker diff shows + changed files in the container's FS.
  • +
+

docker ps -a shows running and stopped containers.

+

docker stats --all shows a running list of containers.

+

Executing Commands

+ +

To enter a running container, attach a new shell process to a running +container called foo, use: docker exec -it foo /bin/bash.

+

Images

+ + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/05-internals/development/docker-compose/index.html b/05-internals/development/docker-compose/index.html new file mode 100644 index 0000000000..2ac9c905d0 --- /dev/null +++ b/05-internals/development/docker-compose/index.html @@ -0,0 +1,2895 @@ + + + + + + + + + + + + + + + + + + + + + + + Starting the DSP-Stack inside Docker Container - DSP-API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + +

Starting the Knora Stack inside Docker Container

+

To run Knora locally, we provide docker-compose.yml which can be used to start Fuseki, Sipi, +Webapi running each in its own Docker container.

+

To run the whole stack:

+
make stack-up
+
+

For additional information please see the Docker Compose documentation

+ + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/05-internals/development/figures/DockerLog.png b/05-internals/development/figures/DockerLog.png new file mode 100644 index 0000000000000000000000000000000000000000..788b8d8830b056eb68f4f013b7cc0ac83fff52dc GIT binary patch literal 219426 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
T(j1kXX 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%0D$eYENeiJ;*6c1!!M#5F~+ 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ℑ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

yW- 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

c1;up;UTySF}Hc9s)kG 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

(@Ky%D}d>rT4d{%1K)v--%Z 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

^VDyn;j5_h~Rs~ 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 VE;Bjtmw3RxJE|Hgxi_Ky{{yQb(|iB` literal 0 HcmV?d00001 diff --git a/05-internals/development/figures/dockerDesktop.png b/05-internals/development/figures/dockerDesktop.png new file mode 100644 index 0000000000000000000000000000000000000000..508f92e4d181ccf8d7adb688e02578a68c6d0327 GIT binary patch literal 148671 zcmZ^K1z1#1_dklD(t?0=NY_e9gGxzDH!Iz&l=QBGbV-XeNSBCoEZwkl!_rH4EU@hU z`M&S3{&nwjpE-BV`OM5YbM8EI?>RU8gSsLi9yJ~o78aq>dpWK9@(c^>0q6^pq9H_F>|JCDAT`f`ky z7JXx3$?5t|qSF<^Q?X)1^6Y`zoQapq5vKxzMbP`apw2HDQWD<)(B@81wpYy0@QHl*e9MMs8+ftETD@^4*(MYu+ z;$~E>67e%b3fVph{1GAQGgNQCrToyc(6CulA&y&iANIp0*;@ec%sf?y+iVr#o*IF~ zLDhHJk5IAH(1PA z_`mJBCLX<^_p;AyeunAJwYGQ=o26*USQ)Kii8uH8wUDBpq94`<$ZJ=;IbXe1Da_ZW zCuQO37eCImjbWrg4;C#14{P%-3Wg+fOL~p{=}#;#IYQ%l^pu$3bgvkTFq`oFEB|k- z+O}u)4>eZsAHL-Xd*sSU#Utmi8AQv7tMZ1)09*MD)ht2nSBKv;`wwp0nLa)G`;}~k zpdPE@i}WY5#m54#9+`d7Jf@G5CHWTAM}jjRLcplqNA31)`@6{VC&9A(9|RI{PZ*h4 zg7I={K2Yfp>B@S3czG`9K`V}J8hDe_G>Rqku;r_CC&!ORj%~ibsU#m4bP|XX!~{{c zNs3bPeTiI+{zPs<%<#>4Rq&V`$;J}|Y_sI}qV-NwGlawVIo)P#gj{~Mzz2&-WgX5E zQr%bw1<&k8%^6LBNtH=4y~%x%#;x*`;H*W98fK+k4v&&N*&q zLZZgH4J;*Jsj8BOgc=5Nw(D42n#Y)rSh`q*ygI5f;30R6@$3xwm{65EyE#iZn=wn_ z#9qrF5k}X!`e|O&F`bf+w6|k(Rr!;|r^l{^t}~xx>tnrHn;$GcWB8`gj(;MLR7O2O zaiWA#f+*3qNgtJu8RbYtzgd4%`_}S}s6)4d#5}!7L5SV=*?L%Nmv9%Ch2V+g$%B*f z`1ts^_$IBt@o(&Fw35cn^COk9m9yUOvT(=Ca3-;^Id_H z#3B+8i)VN3qb;Ht`vIgW z0~=54{?VOL1J*k$bF7xO8=gL$T60KpsIgm`yeU(gAetN*U(Q`Bxcl(9+%li6yjspS zWyB{VrCQj=Z^Q=1ml0rfDP?Lfqb#D})o@6^M8Cu@70~igDsGvmrP>#8QGC;SlX^pb zQ+TdOz=6Ar`!EPEXaW~z|5FH;H%(7oLXk#zQkZ~0k$Rfyk~)Sam8P49oT}!9ln@*B zM6_TOcT`i9q8foJvnrn2Pu0UzQq`RT|A~Wwr2>Ybp<&YD>C~E3!ZgQJ!D0NNv>^tA z@4WszZoIp^E(R97JIRL061=x%AGs;HTXmzSbRB2sr;I+fOfV|qpLpQaL&Sqz3Q`VbcS5%$xas8rw-kY{Z?3WT-SMBglNHD|}i;Gb-TPR!PgVZbO z-{Qxb-!(}9MVxj*v#j1epKPD7vG7=_^f?#MCk#7T#e_5lS3HrTRKSZQEG6=zbs^^? zItu&p^4-f?1<4<_;u@lryrgmhFY6SfqXc3HqHlz$Y3RsJ$?k-DmcDI5(P_L;ffZi)@6RwFmXE6 z8U3L|#X)Je9A^tZnXmru2V3*Yj)X`ZiYf{^wa#Cx1$6IkJ0h&6s(Z#$cWQR>oFJE< zFY#jlg@J+{7i-DxS=QdxiM9l1&ECd7FZ~(7teE^Z;0Ips4667Bi8EO}D?Qn1xz84# zRfwe7c@gy=OnC-22I@p|ddvMsZJWx;1T@SzTSzZ+-t9-2V3 z;fI*nfSAPp-q_Zv$?wRQ8Z1jL2VRyj7OfO+Zg1{yng)jiJK{aod!;v7{!Oo-a^J|h zxx{;Fba!Ryc7|les{FdVueGRoduhI_hOXPUyEO7K6dzqtEY~1s;^vouXk3ElK`H&= zP0RLoF&A)UvHX<5{Xwq5R;Q1kdQ?y+v964&)6nc}Q@`g##qjKK$8cRO(rFG@p=b6% zx?b4A(GjOS_wU+Lt^5L?uDJf;vic(55??7^r32jjkL6hmU<$RHCJYwlt!b>;bClWN z*l(^K^wK|bX<4#vlEH8wPt;96nL4%@25i#rXQHGuuGsbu(BWw9b?J-%>)Y1XPiU-e zEibbiJsh1Rv;975lP$71Q;YrZ{eASIE$7l^VXKkCL1oVTlYuYt8fGs87bpGvYmej3 z?hH@>outpB<#rA>N~wvdJz20i=s&pYm5ufC^!`kHJ9Rh{LKedApze^l=n>&vf}HHy z37oLZ$Q?T}slP2EMw!qlboRcj2o;jXaa+C;)#YUL)FW{5`LWu$2i!i}EJSSYTu z_7e39IkJHV1OPD0$h#@xSH#K;CDLX7zix}rUW0IBtBOAf*blI!Vl5fq3|7Rg-poFy z)G|&Dz?<-45iTCE0Y1h4oO%UdO=0KuuNL66DNhZUwTi=JR&`^bZ6} z(p&tVbhh>|XY_VF77Y?-N=8oBWLYy>1O}Q!ye?q_)oj$79dX#DQ4z>I{L5U-{Z9Qw*T**T-^Ud zt$PIl|8M~Oe6IliFPMkD&Ho4X59i;of9dt_?j-+dOkCI9+D#VZ>}>7gA^qRRmHbyv z{~Pna$N6vI2YYX8Cj&YAd!+llPSOHGg8zZ~KRN$Tq~U)f1z(H&PvrmL{14i z+24=T{2v=i^GgE$ue$$`mjwJ{;QwLpf6wN>YVW608c!1NU#=mI7w!FX6ASANmXh3C z9q$MGEsyInVrzbIu2jnkiH{*m*9fKNg?+$j4+=oH(N{hSRSW1;;sfO;t7D_ zO~m_W`B%&DG+qXuFRR}k`VB85(uE#{BcZL_8UxF>oM&mew!=StY#eUrJt4-Elk$IS z6y((Yo)~Hy_rj8kii=m%L$jQ(qa*#x{VOxM_3NV@Gad8G{HJfZU=gdrna=CL_43~1 zreHx&P2=jsGt*PAzf(6U0zA3Gl?Y<>O-&S_B(Y3|uj%~N`*Dgk zwQ_*s8}j1}geE!k!o!mKF!xjFD8uRN$eP6tOmhm*=e^98fuANGsATdcs&BeT7Vi{V zQ+r&Z42g5b_v(Nr^~ua>$6=sBaCI4BUS!60==A5CILPC>4>%`E5K@jnMTxsi zPI2Cg&0{8H%Af2a$?Kcb*e*r%!3_{uNuolBufUl_N(Pl?)jm#gTZPgVWM7uNdqK&S zq{P}!bH)aKXUC2Ad!W-T!uu>)hY|W9ulhZ0c6(8dmT)lv*YAj5YoG8RPBJ!U!Z-<_ z)?<=|<7dCV6}W8`s<+$fekPw3sOL^vIAg34)_+b#{UI~3GKa!n7ohfPkJY^-kO!Bs zb;i*MuXRQ^u|(^at8oZ2(f%n8+!T-+kaIfOGaTLzq?a7-N@E)6!V;V5r*_d=>X&@@CG%Nis=uP1m?(OxIp^a$yx8$`ES{F~Gx$+ufA3BO>Rbu^3Sp@|bbR1VM9h2qi zEe6PZ+8G=kU?oN>%)z~yj0JmoISbSblA^VYWT)odFjgVL$ zlpRb2f`>H*FFk@YwfJ{aASEb$*9O+48Zv2(>G?*3z?stX%0P^+e_W|zTs2ez2~2{< zrJ;%kWOfj9pKls!AGS75P{9$!`r~^L-J5GOw#DHGINO0GaP7k$WOF+>kGu_Os1%S)ZdOlLr#?QiB+rrH7$ zEjsUl7lzZ7x|PQ58gJX0@xWX}FyYr8(XkBY?V`x+yIfF~G{4X3Mm-8s5#i`kpTt}S zQ4uG{E6|!Qc3>g*Cy#UV1@Sw6;4nV(hzUP3gbhCESpSR~kQy~e=*j!I6SKmR|6A^n z85t1As|E{}0R@7*6y=OF>Fozl$uTUj{ntObYTbF#Tzru6 zaN}McQ!!o`WL4SJ6XvwlzvLrN0k1P+}wN zywm+izwmw;zjzazrE9rfy;T1o?{fZS%}S+0S*}m6F!*?9c&++~iliyy+Cx$doFn4e z?}%D&7{^?uZeSsNrjs)Ss9mJQld3u5z6raw@LeuC#)_T|9d#@0d7QZPMI(pvXL`gC z8I<^xd@FKl=i6i4>SEX5kc+l5TqOPwLBW3-%eD}tgWm7OcQFJuykoA4K1p0k=bXz>QX8bNED-xBXiswKscwIhj;5CTDz4=Cr`Xzxw zuOd}xI*~EH5OgJy-KBlzzF!G(cnv#_X zBXYF<$=>>4FN72Qx%1*=e6aGkEMh(}E4kret3PgD1{(4e4h2Gys4-xKERnS6&Bdk| z(Y2P8#gVrAMCfj;#RpV59HKgiJsAOWodzw;pZmu01k@vbBvv?D32vUO;m zo&qn9{ha-8v!mBmGH$!S%J@rX2GqQ84?WR0$S0X+aK;4kGvM$Gw3(@>lts3uUoU}r zL$BtGwIYdZBE@}-wEfTiPEBU_y8IFQaoiph)W-B_u2V{FAeNhXU@4EVaCszD+cGUPqoXvs5SpoNt)I> zi4ExIZ&^48gTZwZmAR2M1g&c;w9PlW;l16tI4W!HkLjZn>HU8AO+BJ3zfOQe6O*!* zhe0M+L%WsO16X}8vR}lE0a_^P;Gg{@Pr5AmSErti{q=Y%aB#nH8_Lwu*Elyru9hs% za#HqwZUc0^QM+<#dLjC5BgIGzF@b5Ll zMtY*W6Y*Ra%&o>BLCVrcJD5+j_MV3L1?g_Ka(oUp1S=DjA>l%~;8HD5KvV1UC%1vh zvQV0rH?do=#>%o3SIS|s2s!Vn*rN++;6JS2YyTnbPNe&RmPPNQK!bZ}qUT`p-_z13 zJw}wWW8W*A4pUC@0e2kWn~C)WnOM=aW`nCa2>5p@c^3&HaMs5gXM5CLEDi&#D*aqW$F2C(+2=%tlgn=op2l; z1A6%qvzO;}RKsolTGgzUoKK$IdrzAzw6zIhf=pFgFNONC@=1DBd;2d2dRr`ZDF3+A zd0IUYU!+uZ!`1TCk%o`5k9SM(H1#bfSXbx zGW}e5(xD_cC6Sp@OX~gBmy7D7a%~%i4&U|3SEW>{YkA#KChKr&lE6Gcj}3w%r>_ zWIF&ET1cUBt<{N^!8nB<=1i@43a#ip{SA6*>2iI`>pHXKb-xs5y^vu3 z0?PFDmAu}_Bk9(ajL)=h4@^d8O~ArR(H@@Z?w5wHm^+rXR>*?@2Xgu8=SPlPA7q_g zK1;sq)getv`0~xK3l3h;?P>(iq zyyz%Ck8rM?N51C zIx8Um?(Db|79HD)Ec?z)d-^vf`P#zBrh8BG1|%nv`ukAfin zd|k{Q5PsM(;W~mN6Y~{YB#I&3Pl48>Ep$B>Zl>N(1RPru*iXQ4Rm8=G;5&=QZ`9m8 ztagvetjr{nN7GFG2s8Qn$=)CJU3P7^6is`!#k=M!kKTE{k^s}rT$KWPE3_O(A1tJ;$6dw3hJBt+he7+s9k+%Op2L5A9d5`==D|)6Iw9R*0MZPvL~)Px$^oh z3`X}{5RpM9bJq{ER|3SOxwHyr1{`*}?o&cvATl7}zoU3FHnZ?YCONfqz#EBGW4M4~ zb{}TPHml%Jd_MVylFZlSHYG8odOu+%CFrk!Kn+A!k%yY?5tZXeSx zqX9ka#Mj=m;I3yU<0^pe84Wb<<{J$P;IYJcC6}nr^4CfTck@@9-CgpAI8#BWW-k$1 zq!)LuGD|bOSu^w0J0W^H-1D|F0WRaWZM!Z}2oa`-IQW~m4+AZ)u8!!T$nM}OIG7=_ zFl)LWp*>AH?-G&b(qic1{_8_o^pO5)xpJ`wgVFp0M`5`-KF=iBPt^WIwY0A%_e|q! zk_tDC%8CnqpW3^EFn1Y#jvkEFZT1=j<7{Rw@BvPk&Awd#UX=TphaJX4Lg+ zD*6l629H5nF6&%-yjr7O%USzB6)`nlnQ*tBEeWpo?D0iAD^xH5Mfcn4_p-ct==~1D zANJ8U`;2c~={x{aj=9UOg&)p0Ux5GrJanRC#W@rnAj z)W{$C$$4b4fn)tqBK-Rko<#WjH~zzVo$4DNY>QY$4=Lc%XWf)pw9)?a;`%bqN>F~`yG^BYNN>wH}~mJjPHc=NfLmLJO#DeA-X>r z+xsn?%nm0rBt`(0YfhnW1^j(1<4&BYdE+=uj^er-UrYs8WO@t~pP(XPB!`D@k$x)v ztN6eu6+SeMW?$8dYpJR|zNQ|0fHYlUx*MK66;7KVZMXu@6`r)DivK(P+x&2lN8a-> z#*^!UF6e1Zf(1tiYUnJ%0*)PBzwIHZr;iF*`@ zC3(!e?TrYQ%Ygoyr9d2b5nk6Xs315PO`H1aUD-I`{`(5(r@?q7`+HL!6ikleLN$xU zbUFP>Kb^8pB@?-P+wfAF2GAlPbt&^v2I=KSdm65xsPERwuymFE3%WviLph;l(D*4l zz~;}K01IKcPT>m=W7>LIIHM6aqrbQD!<&q}zi+q*okB$Sr4*bO1!ESSGYsYzDFCWw z&)LnSU(@>rGv!P2WYb1lRXYx0*&s4iPkpi1B;eQdbNdISbsL4p^a%yL(GwcC6z_Qn zOf%?c2wv&%O%;QE;Xn}Q+Cyq&wg?b2uO0aidc`7oUqW2##;eA-M7orNzhLGvf9zt;Ln zkT%r^f`A`T4&U?r+M&X~s6lD>0LZ6b^ui;jjuzF!uVZ9@C#ADzL63XS4bR%@#GOyt zOhra*rKJx2R>sQGPG2w1*ey3q5LMl}97QcDq3++3dDTTP7F=gqh^_E7y=^%2tvSt` zh=8rhhq4l_%Vo+?T+LO?896!qa<=T4o{wr2i1# zZPA72;*tb6D?qN>>sRNY-TOX*)xnZC+j(o0(B`l>oTezyBZiyREF#{6><*0ejw0IN zfR&}QcG)Iv_Va>s5qGyX!q}xn*hVdj@-bxX4Y)9Itve+%Tn2p-f;>#M?ZSsiss4R- zvi(xyR4xZ2)#O562fs7$KTXKmG9ia+902m)@_LZ%aOp%1fLzdX=4tY>MuLU#t`n|+ z?F@B@0EI}gl@@1bf{`>=#0OoJB;aglDCxLTP$yr($MnP++Ta$%TJdQ`M|pN9LDIaa z&t$hOgldcyv_IF%;dBjJPC9bL%-|18vYOufu1M{l3c?r4V#=MCXTIt~ZB-t<9SSioNUsu}G$PQ7Yt2U(A@Iq> z+4>6hWpvY#564?U_l!wVvdF{m^4ve`DIO63dwcJd!mn@hn(y7QUp}RKRT0d_*RUNi z>oM{6?*KHmGX^O%)<@3ovHc-80sd@_egKhQBubUm}BKN{uL&Q z`!a5dAw5K-vs8E8@l7zAXAbcl!e6|(39wmhI)#N{)BimGMMAGJT#!TZhqZAsA@2cr z*Rk3X^-bxzj1`3@uI!0~LEG*~i7^W&4OIR=>mtSro_WW^4Z+5$T^x@I?KU>jB-C%$ z>n-}E_3Aq)@h;v=LLKdDiMZrVn=j`RMelu1Fzs&XC~nw>w&7F`b@Rt@9pyffH$@fS z-QrcZB)}qp61-&@I}KQyEI{_y17nRr*X%GQvXDHaPE^EK6@N`R9KCohYQu@~*FRp1 zv8n$gJ@Q2m+4o&05$02l!Or}y4ww4t`TD?rnXcnm>(z*VfOMEmOMa?u%Al`{E#|Ly z&ZkAeX(1~$1>P%Xy>cqC3B{l!Ep_NuS@LR_i8eg6Ntd>F@j!OECy{f)a(rWE%@K%x zm+o^I`zQZ;ASE_1rknq!0byT5y^gO)uPoLO(Y;|f* z-TLJMnZps445qtst-|jxs+R%6CH;96?JA?$)_^em-k6=aQ7;lZKxr$Ly7Jl(0a)eE zFl6QiX-$9ApPb1l96_ZVJf=P7x1w;Jxr24p=mTX%ESSSvqu1N8WvC^NM45>eF<