Compare commits

..

117 Commits

Author SHA1 Message Date
Boris De Vloed
db769f80a6 cleanup leidinggevenden 2023-09-11 11:40:48 +02:00
Claire Lovisa
29bd4c9d56 Merge pull request #324 from lblod/hotfix/duplicated-primary-sites
Fix duplicated primary sites
2023-09-08 11:15:53 +02:00
Claire Lovisa
2587ba6daf Fix double sites in the data 2023-09-07 13:42:57 +02:00
Claire Lovisa
4070bde4ab Bump frontend 2023-09-07 13:41:55 +02:00
Nordine Bittich
a9f02a148b bump frontend 2023-08-14 19:38:42 +02:00
Claire Lovisa
61924d37d9 Import contact info of AGBs and APBs (#315) 2023-08-04 11:01:58 +02:00
Claire Lovisa
43caffdce8 Merge pull request #314 from lblod/fix/add-missing-organen-and-functies-to-agbs-and-apbs
Fix date format and missing data on AGBs/APBs
2023-08-02 10:04:40 +02:00
Claire Lovisa
0d3ba99048 Fix date format and missing data on AGBs/APBs 2023-08-01 20:53:52 +02:00
Claire Lovisa
8b40cf597f Split too big migrations 2023-07-31 18:04:48 +02:00
Claire Lovisa
f78e7ad99a Bump frontend 2023-07-31 17:22:40 +02:00
Claire Lovisa
8fb0bd245a Merge branch 'development' 2023-07-31 17:14:41 +02:00
Claire Lovisa
cdfe850b47 Link admin units with OVO uris (#312) 2023-07-31 16:14:01 +02:00
Claire Lovisa
ab6da30578 Remove outdated mandatarissen data (#311) 2023-07-31 11:28:27 +02:00
Claire Lovisa
33740d1749 Remove torii redirect dispatching (#309)
* Remove torii redirect dispatching

* Add Caddy dev config
2023-07-31 10:44:09 +02:00
Claire Lovisa
245786a94a Add worship editor to dev search index 2023-07-27 12:05:38 +02:00
Claire Lovisa
5d30fa368d Merge pull request #310 from lblod/feature/import-agb-apb-addresses
Import agb/apb addresses
2023-07-27 11:45:17 +02:00
Oscar
8bc16f1551 changed to correct uris 2023-07-27 11:35:55 +02:00
Oscar
412ebf3220 fix agb names, and match first on kbo 2023-07-27 11:35:50 +02:00
Oscar
46da33334a change casing of provinces and fix missing data 2023-07-27 11:35:43 +02:00
Oscar
d27a99cdee changed to primary site, and changed wrong uuid of agb brugge 2023-07-27 11:35:37 +02:00
Oscar
04b689b9d2 fix migration 2023-07-27 11:35:30 +02:00
Oscar
29d0203311 Add agb brugge and the address of other agbs 2023-07-27 11:35:07 +02:00
Claire Lovisa
af56734cde Merge branch 'hotfix/v1.17.x' 2023-07-26 14:51:26 +02:00
Claire Lovisa
e948aea401 Merge pull request #308 from lblod/fix/variable-name-worship-consumer
Variable name worship consumer
2023-07-26 14:23:58 +02:00
Claire Lovisa
e89aba8d53 Fix wrong variable name in consumer config 2023-07-26 14:22:28 +02:00
Claire Lovisa
43948054aa Merge pull request #307 from lblod/feature/import-ovo-districts-eb-cb
Import OVO codes for districts, worship and central worship services
2023-07-25 10:26:08 +02:00
Elena Poelman
024a090453 Merge pull request #302 from lblod/feature/ldes-data-pusher-include-identifiers
Include local-identifier and label for each identifier of organizations sent to ldes feed
2023-07-20 10:44:55 +02:00
Claire Lovisa
f34672d697 Import OVO codes for districts, worship and central worship services 2023-07-20 10:11:59 +02:00
Elena Poelman
14f18793e7 Merge pull request #305 from lblod/internal/update-ldes-backend
Update ldes-backend image to 0.4.0
2023-07-17 19:06:39 +02:00
b7f70202bd add BASE_URL env var to docker-compose dev 2023-07-14 10:30:20 +02:00
1aa950a521 update ldes-backend image to 0.4.0 2023-07-14 10:28:45 +02:00
Claire Lovisa
f81e591238 Merge branch 'hotfix/v1.17.x' 2023-07-13 14:16:34 +02:00
Claire Lovisa
c82317e2bb Bump frontend 2023-07-13 14:15:10 +02:00
Claire Lovisa
e38769fb1f Merge pull request #303 from lblod/hotfix/1.17.x
Hotfix/1.17.x
2023-07-13 14:12:17 +02:00
Boris De Vloed
f4ea1e7307 Merge branch 'master' into hotfix/1.17.x 2023-07-13 10:17:04 +02:00
Boris De Vloed
cc49c6c5b7 Merge pull request #301 from lblod/hotfix-1.17.3
Hotfix 1.17.3
2023-07-13 10:07:58 +02:00
4581fd0b61 include local-identifier and label for each identifier of organizations sent to ldes feed 2023-07-13 09:04:19 +02:00
Elena Poelman
a8d16d966f Merge pull request #299 from lblod/internal/update-ldes-backend
Update ldes-backend image to 0.3.3
2023-07-12 06:41:46 +02:00
e34561f4e7 update ldes-backend image to 0.3.3 2023-07-11 14:04:04 +02:00
Claire Lovisa
9f4ec2f3d9 Bump construct-administrative-unit-relationships-service 2023-07-07 14:40:41 +02:00
Claire Lovisa
90c4105c10 Add missing links between concept schemes for agb and apb positions (#297) 2023-07-07 11:05:02 +02:00
Nordine Bittich
35a11c917d AGB/APB: import organen from loket (#293) 2023-07-06 11:39:13 +02:00
Boris De Vloed
996be3625c add country to addresses (#291)
* added country

* Bump adressenregister

---------

Co-authored-by: Claire Lovisa <lovisa.claire@gmail.com>
2023-07-04 14:41:37 +02:00
Claire Lovisa
5b742e1161 Add migration updating RO status (#294) 2023-07-04 14:04:38 +02:00
Nordine Bittich
4b92e0a9a6 agb apb migration (#292) 2023-06-29 13:03:15 +02:00
Boris De Vloed
768b1bc5df add missing fulladdress 2023-06-27 10:57:27 +02:00
Boris De Vloed
8083deffe3 add missing fulladdress 2023-06-23 10:43:03 +02:00
Boris De Vloed
8c869af7f1 uuid 2023-06-23 10:11:36 +02:00
Boris De Vloed
7c5ab8ec4f added moslimraad 2023-06-23 10:11:26 +02:00
Nordine Bittich
91e06501d3 remove municipality for Kerkfabriek St.-Martinus van Lievegem (Zomergem) (#285) 2023-06-23 09:04:59 +02:00
Boris De Vloed
aa06ae84c5 Merge pull request #289 from lblod/fix/add-moslimraad
added moslimraad
2023-06-23 09:04:09 +02:00
Nordine Bittich
ba802bfaf6 bump mu search 2023-06-23 08:54:02 +02:00
Boris De Vloed
496f52512a uuid 2023-06-22 17:03:15 +02:00
Boris De Vloed
8f14716eb4 added moslimraad 2023-06-22 16:14:34 +02:00
Boris De Vloed
1a1b0937c2 Merge pull request #286 from lblod/fix/street-and-bus-number-concatination
add missing space
2023-06-16 12:58:14 +02:00
Boris De Vloed
523247b4da add missing space 2023-06-16 10:11:43 +00:00
Nordine Bittich
ba14cdf1e8 bump mu search 2023-06-16 10:00:45 +02:00
Nordine Bittich
08f3424e11 remove municipality for Kerkfabriek St.-Martinus van Lievegem (Zomergem) (#285) 2023-06-15 17:31:04 +02:00
Nordine Bittich
a9efd0564a add founded by / is founder of (#283) 2023-06-13 11:05:49 +02:00
Nordine Bittich
9fa3e6e30d sharepoint id for district, municipality, province & ocmw (#282) 2023-06-07 16:11:10 +02:00
Nordine Bittich
2662c962f9 rename concept (#281) 2023-05-31 11:59:34 +02:00
Nordine Bittich
313c13e28c bump frontend 2023-05-25 09:56:29 +02:00
Nordine Bittich
5948f3ece6 bump frontend 2023-05-25 09:47:13 +02:00
Nordine Bittich
da4bece141 bump construct-administrative-unit-relationships 2023-05-24 10:26:59 +02:00
Nordine Bittich
0c0a644225 Feat/onboarding agb apb (#255) 2023-05-24 10:20:08 +02:00
Nordine Bittich
80b72fe09d bump frontend prerelease 2023-05-24 09:46:51 +02:00
Claire Lovisa
b7b6d2bc40 Add dev profile to ldes feed (#279)
* Add dev profile to ldes feed

* Comment out ldes rules from main delta config
2023-05-22 14:40:51 +02:00
Nordine Bittich
fc22377b28 adjust change event (#280) 2023-05-22 14:21:32 +02:00
Nordine Bittich
b13d6f7b03 adjust change event (#280) 2023-05-22 14:20:55 +02:00
Nordine Bittich
4078f8149d bump mu-cl-resource 2023-05-22 13:48:29 +02:00
Nordine Bittich
4c356113aa bump mu-cl-resource 2023-05-22 13:47:58 +02:00
Claire Lovisa
e617b471c4 Merge branch 'master' into development 2023-05-22 09:46:33 +02:00
Nordine Bittich
3a23aa3c2d Fix/limit positions to types we already onboarded rebased (#278)
* rebased

* Fix n3q query for mandatarissen

---------

Co-authored-by: Claire Lovisa <lovisa.claire@gmail.com>
2023-05-15 18:21:05 +02:00
Nordine Bittich
7c136c5494 Fix/limit positions to types we already onboarded rebased (#278)
* rebased

* Fix n3q query for mandatarissen

---------

Co-authored-by: Claire Lovisa <lovisa.claire@gmail.com>
2023-05-15 18:20:54 +02:00
Nordine Bittich
68b5c67a16 Fix/limit positions to types we already onboarded rebased (#278)
* rebased

* Fix n3q query for mandatarissen

---------

Co-authored-by: Claire Lovisa <lovisa.claire@gmail.com>
2023-05-15 18:16:54 +02:00
Nordine Bittich
21532f17c0 autocommit 2023-05-14 12:44:38 +02:00
Nordine Bittich
ae53746323 bump frontend 2023-05-14 12:43:40 +02:00
Nordine Bittich
73ff073540 bump mu-cl-resource 2023-05-12 14:20:13 +02:00
Nordine Bittich
2dbc29adeb bump mu-cl-resource 2023-05-12 14:19:44 +02:00
Nordine Bittich
22cc8ad09e bump resource 2023-05-10 16:29:13 +02:00
Nordine Bittich
622dae7969 bump resource 2023-05-10 16:28:45 +02:00
Nordine Bittich
47a2ca5072 bump front 2023-05-10 12:14:16 +02:00
Nordine Bittich
a4098a5b84 feat/delete-dup-change-events (#275) 2023-05-10 12:11:03 +02:00
Nordine Bittich
dfb7bbd7dc adjust change event (#276) 2023-05-10 12:10:32 +02:00
Elena Poelman
70d6add28d Merge pull request #269 from lblod/feature/ldes-service
Addition of ldes services to publish organization contact information
2023-05-10 11:39:26 +02:00
Claire Lovisa
cc4a842281 Remove deprecated delta-producer-json-diff-file-publisher service (#274) 2023-05-10 11:15:27 +02:00
Nordine Bittich
d01168989f feat/delete-dup-change-events (#275) 2023-05-10 11:12:22 +02:00
Nordine Bittich
b518a5ea79 adjust change event (#276) 2023-05-09 16:08:24 +02:00
c62c0aa4a9 add migration to add org:Organization type to all existing organizations 2023-05-08 11:50:37 +02:00
8a779c5d9f remove unnecessary spaces from compose file 2023-05-08 10:25:58 +02:00
a7334e161d limit pushes to ldes-feed to 3 main graphs 2023-05-08 10:12:56 +02:00
Nordine Bittich
6293b77492 bump front 2023-05-08 10:00:23 +02:00
Claire Lovisa
12bacd7391 Remove wrong organen labels (#266)
* Remove wrong organen labels

* Only remove necessary data, and add correct label
2023-05-04 16:18:44 +02:00
Claire Lovisa
627b4950dd Merge branch 'master' into development 2023-05-04 16:16:43 +02:00
Claire Lovisa
1fbe0f2fda Fix migration removing too much data (#272) 2023-05-04 14:59:09 +02:00
Claire Lovisa
d1925167b3 Remove imported fracties and update reasoner config (#273) 2023-05-04 14:57:54 +02:00
Claire Lovisa
f7df3a3cb0 Ensure organen dates are datetimes (#271) 2023-05-04 14:57:31 +02:00
539e88f604 Merge branch 'development' into feature/ldes-service 2023-05-04 09:49:47 +02:00
ed321540ba update fragmentation-producer to 0.3.2 2023-05-04 09:11:04 +02:00
Claire Lovisa
b32930f4bb Produce public data as done in prod (#270) 2023-05-03 18:52:08 +02:00
Nordine Bittich
4454a95137 updating end date bestuursorgaan triggers too many deletes (#268) 2023-05-03 09:10:47 +02:00
a94ddafb98 add organization name to data to be pushed to ldes feed 2023-05-03 09:09:55 +02:00
e887c6ffeb add gracePeriod to ldes-delta-pusher rule 2023-05-03 09:09:26 +02:00
96175d3de2 update ldes-backend image to 0.3.1 2023-05-03 09:08:56 +02:00
Nordine Bittich
4ed997dabd change date change event (#267) 2023-05-02 12:01:30 +02:00
Claire Lovisa
02de06921e Remove conflicting rule
If the prefix rule applies before the rule fixing the difference between
Loket and OP's names first/last names models, it breaks the flow
2023-04-21 16:33:54 +02:00
Boris De Vloed
fefb103cb5 Consume mandatarissen, leidinggevenden and worship positions from Loket (#239)
* loket filter

* cleanup previously migrated data before sync

* increase mu-auth timouts

* split up deletion migration to avoid timouts

* identical utls added catch statements

* deletes before inserts

* Adapt migrations to splitted graphs

* Adapt consumers to the delta-consumer with contexts

* Bump consumers and cache

* Resolve cache not getting cleared

* Flush ministers of non active worship services too

---------

Co-authored-by: Claire Lovisa <lovisa.claire@gmail.com>
2023-04-21 11:57:15 +02:00
Nordine Bittich
3aadf0960e bump role service 2023-04-21 07:43:06 +02:00
Boris De Vloed
666945f077 Merge pull request #265 from lblod/feature/bump-adressenregister-search-service
Bump adressenregister fuzzy search service version
2023-04-19 13:46:38 +02:00
Boris De Vloed
e3883db087 0.6.2 -> 0.6.3 2023-04-19 11:13:42 +00:00
Nordine Bittich
86e4304b7e reset elastic script (#264) 2023-04-19 09:26:04 +02:00
Nordine Bittich
64a2c22afc change date change event (#263) 2023-04-18 16:03:04 +02:00
Boris De Vloed
8d0686926e Merge pull request #262 from lblod/fix/add-org-post-type
Add missing post type
2023-04-18 12:03:07 +02:00
Boris De Vloed
d08c88f312 Add missing post type 2023-04-18 08:14:48 +00:00
7774283905 update LDES dispatch query to take contact info into account 2023-02-14 12:57:32 +01:00
335501ede6 use custom dispatch method to send organization details to ldes endpoint 2023-02-14 12:34:57 +01:00
a538b42abd add initial ldes services 2023-02-14 11:40:17 +01:00
117 changed files with 88999 additions and 865 deletions

1
.gitignore vendored
View File

@@ -11,6 +11,7 @@ docker-compose.override.yml
*.iml
/data/elasticsearch/**
/data/ldes-feed/*
/tmp
.DS_STORE
.env

View File

@@ -279,48 +279,21 @@
},
{
"type": "http://data.vlaanderen.be/ns/besluit#Bestuursorgaan",
"strictTypeExport": "true",
"graphsFilter": [
"http://mu.semte.ch/graphs/shared",
"http://mu.semte.ch/graphs/worship-service",
"http://mu.semte.ch/graphs/administrative-unit"
],
"pathToConceptScheme": [
"http://www.w3.org/ns/org#classification",
"http://www.w3.org/2004/02/skos/core#inScheme"
"http://mu.semte.ch/graphs/administrative-unit",
"http://mu.semte.ch/graphs/worship-service"
],
"properties": [
"http://mu.semte.ch/vocabularies/core/uuid",
"http://data.vlaanderen.be/ns/mandaat#bindingEinde",
"http://data.vlaanderen.be/ns/mandaat#bindingStart",
"http://data.vlaanderen.be/ns/besluit#bestuurt",
"http://www.w3.org/ns/org#classification",
"https://data.vlaanderen.be/ns/generiek#isTijdspecialisatieVan",
"http://www.w3.org/ns/org#hasPost"
]
},
{
"type": "http://data.vlaanderen.be/ns/besluit#Bestuursorgaan",
"strictTypeExport": "true",
"graphsFilter": [
"http://mu.semte.ch/graphs/shared",
"http://mu.semte.ch/graphs/worship-service",
"http://mu.semte.ch/graphs/administrative-unit"
],
"pathToConceptScheme": [
"https://data.vlaanderen.be/ns/generiek#isTijdspecialisatieVan",
"http://www.w3.org/ns/org#classification",
"http://www.w3.org/2004/02/skos/core#inScheme"
],
"properties": [
"http://mu.semte.ch/vocabularies/core/uuid",
"http://data.vlaanderen.be/ns/mandaat#bindingEinde",
"http://data.vlaanderen.be/ns/mandaat#bindingStart",
"http://data.vlaanderen.be/ns/besluit#bestuurt",
"http://www.w3.org/ns/org#classification",
"https://data.vlaanderen.be/ns/generiek#isTijdspecialisatieVan",
"http://www.w3.org/ns/org#hasPost"
]
],
"additionalFilter": "?subject (<https://data.vlaanderen.be/ns/generiek#isTijdspecialisatieVan>/<http://www.w3.org/ns/org#classification>/<http://www.w3.org/2004/02/skos/core#inScheme>)|(<http://www.w3.org/ns/org#classification>/<http://www.w3.org/2004/02/skos/core#inScheme>) <http://lblod.data.gift/concept-schemes/10caf4a4-1ff5-4c05-917e-56489910d68b> ."
},
{
"type": "http://lblod.data.gift/vocabularies/organisatie/TypeEredienst",

View File

@@ -105,24 +105,6 @@ export default [
]
}
},
{
match: {
graph: {
type: 'uri',
value: 'http://redpencil.data.gift/id/deltas/producer/organizations'
}
},
callback: {
url: 'http://delta-producer-json-diff-publisher-organizations/delta',
method: 'POST'
},
options: {
resourceFormat: 'v0.0.1',
gracePeriod: 1000,
ignoreFromSelf: true,
optOutMuScopeIds: ["http://redpencil.data.gift/id/concept/muScope/deltas/initialSync"]
}
},
{
match: {
},
@@ -140,24 +122,6 @@ export default [
]
}
},
{
match: {
graph: {
type: 'uri',
value: 'http://redpencil.data.gift/id/deltas/producer/public'
}
},
callback: {
url: 'http://delta-producer-json-diff-publisher-public/delta',
method: 'POST'
},
options: {
resourceFormat: 'v0.0.1',
gracePeriod: 1000,
ignoreFromSelf: true,
optOutMuScopeIds: ["http://redpencil.data.gift/id/concept/muScope/deltas/initialSync"]
}
},
{
match: {
// anything
@@ -197,5 +161,56 @@ export default [
ignoreFromSelf: true,
optOutMuScopeIds: ["http://redpencil.data.gift/id/concept/muScope/deltas/initialSync"]
}
},
/*
Commenting ldes rules until ready to go to qa/prod. In the meantime, we override the configuration on dev.
{
match: {
graph: {
type: 'uri',
value: 'http://mu.semte.ch/graphs/shared',
}
},
callback: {
url: 'http://ldes-delta-pusher/publish',
method: 'POST',
},
options: {
resourceFormat: 'v0.0.1',
gracePeriod: 1000,
}
},
{
match: {
graph: {
type: 'uri',
value: 'http://mu.semte.ch/graphs/worship-service',
}
},
callback: {
url: 'http://ldes-delta-pusher/publish',
method: 'POST',
},
options: {
resourceFormat: 'v0.0.1',
gracePeriod: 1000,
}
},
{
match: {
graph: {
type: 'uri',
value: 'http://mu.semte.ch/graphs/administrative-unit',
}
},
callback: {
url: 'http://ldes-delta-pusher/publish',
method: 'POST',
},
options: {
resourceFormat: 'v0.0.1',
gracePeriod: 1000,
}
}
*/
]

View File

@@ -0,0 +1,4 @@
{$SITE_ADDRESS}:443 {
reverse_proxy identifier:80
tls internal
}

View File

@@ -305,6 +305,10 @@ defmodule Dispatcher do
forward conn, path, "http://construct-administrative-unit-relationships/create-relationships/"
end
get "/ldes/*path", %{ layer: :api_services } do
forward conn, path, "http://ldes-backend/"
end
#################################################################
# ERROR REPORT
#################################################################
@@ -337,21 +341,12 @@ defmodule Dispatcher do
Proxy.forward conn, path, "http://resource/distributions/"
end
#################################################################
# DELTA: administrative-units
#################################################################
get "/sync/administrative-units/files/*path" do
Proxy.forward conn, path, "http://delta-producer-json-diff-file-publisher-administrative-units/files/"
end
#################################################################
# DELTA: organizations
#################################################################
get "/sync/organizations/files/*path" do
Proxy.forward conn, path, "http://delta-producer-json-diff-file-publisher-organizations/files/"
Proxy.forward conn, path, "http://delta-producer-pub-graph-maintainer-organizations/files/"
end
#################################################################
@@ -359,7 +354,7 @@ defmodule Dispatcher do
#################################################################
get "/sync/public/files/*path" do
Proxy.forward conn, path, "http://delta-producer-json-diff-publisher-public/files/"
Proxy.forward conn, path, "http://delta-producer-pub-graph-maintainer-public/files/"
end
#################################################################
@@ -374,10 +369,6 @@ defmodule Dispatcher do
# frontend layer
###############################################################
match "/authorization/callback/*_path", %{ accept: [:html], layer: :api } do
Proxy.forward conn, [], "http://frontend/torii/redirect.html"
end
match "/assets/*path", %{ layer: :api } do
Proxy.forward conn, path, "http://frontend/assets/"
end

View File

@@ -0,0 +1,73 @@
import { moveTriples } from "../support";
import { Changeset } from "../types";
import { query, sparqlEscapeUri } from 'mu';
export default async function dispatch(changesets: Changeset[]) {
for (const changeset of changesets) {
const subjects = new Set(changeset.inserts.map((insert) => insert.subject.value));
for (const subject of subjects) {
const { results: { bindings } } = await query(`
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX code: <http://telegraphis.net/ontology/measurement/code#>
PREFIX org: <http://www.w3.org/ns/org#>
PREFIX adms: <http://www.w3.org/ns/adms#>
PREFIX generiek: <https://data.vlaanderen.be/ns/generiek#>
CONSTRUCT {
?organization a org:Organization;
skos:prefLabel ?prefLabel;
adms:identifier ?identifier;
org:hasPrimarySite ?site.
?identifier skos:notation ?identifierLabel;
generiek:gestructureerdeIdentificator ?gestructureerdeIdentificator.
?gestructureerdeIdentificator generiek:lokaleIdentificator ?lokaleIdentificator.
?site org:siteAddress ?siteAddress.
?siteAddress ?p ?o.
} WHERE {
{
VALUES ?organization { ${sparqlEscapeUri(subject)} }
?organization a org:Organization;
skos:prefLabel ?prefLabel;
adms:identifier ?identifier;
org:hasPrimarySite ?site.
?identifier skos:notation ?identifierLabel;
generiek:gestructureerdeIdentificator ?gestructureerdeIdentificator.
?gestructureerdeIdentificator generiek:lokaleIdentificator ?lokaleIdentificator.
?site org:siteAddress ?siteAddress.
?siteAddress ?p ?o.
} UNION {
VALUES ?site { ${sparqlEscapeUri(subject)} }
?organization a org:Organization;
skos:prefLabel ?prefLabel;
adms:identifier ?identifier;
org:hasPrimarySite ?site.
?identifier skos:notation ?identifierLabel;
generiek:gestructureerdeIdentificator ?gestructureerdeIdentificator.
?gestructureerdeIdentificator generiek:lokaleIdentificator ?lokaleIdentificator.
?site org:siteAddress ?siteAddress.
?siteAddress ?p ?o.
} UNION {
VALUES ?siteAddress { ${sparqlEscapeUri(subject)} }
?organization a org:Organization;
skos:prefLabel ?prefLabel;
adms:identifier ?identifier;
org:hasPrimarySite ?site.
?identifier skos:notation ?identifierLabel;
generiek:gestructureerdeIdentificator ?gestructureerdeIdentificator.
?gestructureerdeIdentificator generiek:lokaleIdentificator ?lokaleIdentificator.
?site org:siteAddress ?siteAddress.
?siteAddress ?p ?o.
}
}
`);
if(bindings.length){
console.log('SUCCESS')
await moveTriples([
{
inserts: bindings.map(({ s, p, o}) => { return { subject: s, predicate: p, object: o} }),
}
])
}
}
}
}

View File

@@ -1,18 +1,20 @@
const BATCH_SIZE = parseInt(process.env.BATCH_SIZE) || 100;
const MU_CALL_SCOPE_ID_INITIAL_SYNC = process.env.MU_CALL_SCOPE_ID_INITIAL_SYNC || 'http://redpencil.data.gift/id/concept/muScope/deltas/consumer/initialSync';
const BYPASS_MU_AUTH_FOR_EXPENSIVE_QUERIES = process.env.BYPASS_MU_AUTH_FOR_EXPENSIVE_QUERIES == 'true' ? true : false;
const DIRECT_DATABASE_ENDPOINT = process.env.DIRECT_DATABASE_ENDPOINT || 'http://virtuoso:8890/sparql';
const DIRECT_DATABASE_ENDPOINT = process.env.DIRECT_DATABASE_ENDPOINT || 'http://triplestore:8890/sparql';
const MAX_DB_RETRY_ATTEMPTS = parseInt(process.env.MAX_DB_RETRY_ATTEMPTS || 5);
const MAX_REASONING_RETRY_ATTEMPTS = parseInt(process.env.MAX_REASONING_RETRY_ATTEMPTS || 5);
const SLEEP_BETWEEN_BATCHES = parseInt(process.env.SLEEP_BETWEEN_BATCHES || 1000);
const SLEEP_TIME_AFTER_FAILED_REASONING_OPERATION = parseInt(process.env.SLEEP_TIME_AFTER_FAILED_REASONING_OPERATION || 10000);
const SLEEP_TIME_AFTER_FAILED_DB_OPERATION = parseInt(process.env.SLEEP_TIME_AFTER_FAILED_DB_OPERATION || 60000);
const INGEST_GRAPH = process.env.INGEST_GRAPH || `http://mu.semte.ch/graphs/administrative-unit`;
// Graphs
const TARGET_GRAPH = process.env.TARGET_GRAPH || `http://mu.semte.ch/graphs/administrative-unit`;
const LANDING_ZONE_GRAPH = process.env.DCR_LANDING_ZONE_GRAPH || `http://mu.semte.ch/graphs/landing-zone/leidinggevenden`;
if (!process.env.FILE_SYNC_GRAPH)
throw `Expected 'FILE_SYNC_GRAPH' to be provided.`;
const FILE_SYNC_GRAPH = process.env.FILE_SYNC_GRAPH;
// ENDPOINTS
const LANDING_ZONE_DATABASE = process.env.DCR_LANDING_ZONE_DATABASE || 'db';
const LANDING_ZONE_DATABASE_ENDPOINT = process.env.DCR_LANDING_ZONE_DATABASE_ENDPOINT || `http://${LANDING_ZONE_DATABASE}:8890/sparql`;
module.exports = {
BATCH_SIZE,
@@ -24,6 +26,7 @@ module.exports = {
SLEEP_BETWEEN_BATCHES,
SLEEP_TIME_AFTER_FAILED_DB_OPERATION,
SLEEP_TIME_AFTER_FAILED_REASONING_OPERATION,
INGEST_GRAPH,
FILE_SYNC_GRAPH
LANDING_ZONE_GRAPH,
TARGET_GRAPH,
LANDING_ZONE_DATABASE_ENDPOINT
};

View File

@@ -0,0 +1,72 @@
const PREFIXES = `
PREFIX org: <http://www.w3.org/ns/org#>
PREFIX mandaat: <http://data.vlaanderen.be/ns/mandaat#>
PREFIX lblodlg: <http://data.lblod.info/vocabularies/leidinggevenden/>
PREFIX besluit: <http://data.vlaanderen.be/ns/besluit#>`
const contextConfig = {
addTypes: {
scope: 'all', // 'inserts, 'deletes', 'all' or none. To add rdf:type to subjects of inserts, deletes or both
exhausitive: false, // true or false: find all types for a subject, even if one is already present in delta
},
contextQueries: [
// Case Leidnggevenden
// They can be triggered when being inserted or when their link to a bestuursfunctie is added
{
trigger: { // subjectType or predicateValue
subjectType: "lblodlg:Functionaris"
},
queryTemplate: (subject) => `
${PREFIXES}
CONSTRUCT {
?functionaris org:holds ?bestuursfunctie ;
?p ?o .
?orgaanInTime lblodlg:heeftBestuursfunctie ?bestuursfunctie ;
mandaat:isTijdspecialisatieVan ?orgaan .
?orgaan besluit:bestuurt ?eenheid .
?eenheid besluit:classificatie ?classification .
} WHERE {
GRAPH <http://mu.semte.ch/graphs/landing-zone/leidinggevenden> {
VALUES ?functionaris { ${subject} }
?functionaris org:holds ?bestuursfunctie ;
?p ?o .
?orgaanInTime lblodlg:heeftBestuursfunctie ?bestuursfunctie ;
mandaat:isTijdspecialisatieVan ?orgaan .
?orgaan besluit:bestuurt ?eenheid .
?eenheid besluit:classificatie ?classification .
}
}`
},
{
trigger: {
predicateValue: "org:holds"
},
queryTemplate: (subject) => `
${PREFIXES}
CONSTRUCT {
?functionaris org:holds ?bestuursfunctie ;
?p ?o .
?orgaanInTime lblodlg:heeftBestuursfunctie ?bestuursfunctie ;
mandaat:isTijdspecialisatieVan ?orgaan .
?orgaan besluit:bestuurt ?eenheid .
?eenheid besluit:classificatie ?classification .
} WHERE {
GRAPH <http://mu.semte.ch/graphs/landing-zone/leidinggevenden> {
VALUES ?functionaris { ${subject} }
?functionaris org:holds ?bestuursfunctie ;
?p ?o .
?orgaanInTime lblodlg:heeftBestuursfunctie ?bestuursfunctie ;
mandaat:isTijdspecialisatieVan ?orgaan .
?orgaan besluit:bestuurt ?eenheid .
?eenheid besluit:classificatie ?classification .
}
}`
}
]
}
module.exports = {
contextConfig,
PREFIXES
};

View File

@@ -1,11 +1,8 @@
const { transformStatements, batchedDbUpdate, deleteFromAllGraphs } = require('./util');
const {
BATCH_SIZE,
MAX_DB_RETRY_ATTEMPTS,
SLEEP_BETWEEN_BATCHES,
SLEEP_TIME_AFTER_FAILED_DB_OPERATION,
INGEST_GRAPH
} = require('./config');
transformStatements,
deleteFromTargetGraph,
insertIntoTargetGraph,
} = require('./util');
/**
* Dispatch the fetched information to a target graph.
@@ -23,43 +20,61 @@ const {
* @return {void} Nothing
*/
async function dispatch(lib, data) {
const { mu, muAuthSudo, fetch } = lib;
const { termObjectChangeSets } = data;
const { mu, fetch } = lib;
let { termObjectChangeSets, termObjectChangeSetsWithContext } = data;
for (let { deletes, inserts } of termObjectChangeSets) {
const deleteStatements = deletes.map(o => `${o.subject} ${o.predicate} ${o.object}.`);
const insertStatements = inserts.map(o => `${o.subject} ${o.predicate} ${o.object}.`);
// Both arrays are the same length, so we can zip them together for easier processing
zippedChangeSets = termObjectChangeSets.map((o, i) => ({
original: o,
withContext: termObjectChangeSetsWithContext[i]
}));
if (deleteStatements.length) {
const transformedStatementsToDelete = await transformStatements(fetch, deleteStatements);
if (transformedStatementsToDelete.length) {
await deleteFromAllGraphs(
muAuthSudo.updateSudo,
transformedStatementsToDelete,
{ 'mu-call-scope-id': 'http://redpencil.data.gift/id/concept/muScope/deltas/write-for-dispatch' },
process.env.MU_SPARQL_ENDPOINT, //Note: this is the default endpoint through auth
MAX_DB_RETRY_ATTEMPTS,
SLEEP_BETWEEN_BATCHES,
SLEEP_TIME_AFTER_FAILED_DB_OPERATION,
);
console.log(`Received ${zippedChangeSets.length} change sets`)
for (let { original, withContext } of zippedChangeSets) {
let originalDeletes, originalInserts, insertsWithContext, deletesWithContext;
try {
originalInserts = original.inserts.map(o => `${o.subject} ${o.predicate} ${o.object}.`);
originalDeletes = original.deletes.map(o => `${o.subject} ${o.predicate} ${o.object}.`);
} catch (e) {
console.log(`Error while processing change set: ${e}`);
console.log(`Original change set: ${JSON.stringify(original)}`);
throw e;
}
// Extra context needed for mapping from DL to OP model and filtering based on type.
try {
insertsWithContext = withContext.inserts.map(o => `${o.subject} ${o.predicate} ${o.object}.`);
deletesWithContext = withContext.deletes.map(o => `${o.subject} ${o.predicate} ${o.object}.`);
} catch (e) {
console.log(`Error while processing change set with context: ${e}`);
console.log(`Change set with context: ${JSON.stringify(withContext)}`);
throw e;
}
if (originalDeletes.length) {
// Map deletes from DL to OP model
const transformedDeletes = await transformStatements(fetch, deletesWithContext);
if (!transformedDeletes.length) {
console.log(`Warn: Delete statements mapped to empty result.`);
console.log(`Input: ${deletesWithContext}`);
console.log(`Output: ${transformedDeletes}`);
} else {
await deleteFromTargetGraph(lib, transformedDeletes);
}
}
if (insertStatements.length) {
const transformedStatementsToInsert = await transformStatements(fetch, insertStatements);
if (transformedStatementsToInsert.length) {
await batchedDbUpdate(
muAuthSudo.updateSudo,
INGEST_GRAPH,
transformedStatementsToInsert,
{ 'mu-call-scope-id': 'http://redpencil.data.gift/id/concept/muScope/deltas/write-for-dispatch' },
process.env.MU_SPARQL_ENDPOINT, //Note: this is the default endpoint through auth
BATCH_SIZE,
MAX_DB_RETRY_ATTEMPTS,
SLEEP_BETWEEN_BATCHES,
SLEEP_TIME_AFTER_FAILED_DB_OPERATION,
"INSERT"
);
if (originalInserts.length) {
// Map inserts from DL to OP model
const transformedInserts = await transformStatements(fetch, insertsWithContext);
if (!transformedInserts.length) {
console.log(`Warn: Insert statements mapped to empty result.`);
console.log(`Input: ${insertsWithContext}`);
console.log(`Output: ${transformedInserts}`);
} else {
await insertIntoTargetGraph(lib, transformedInserts);
}
}
}

View File

@@ -1,13 +1,17 @@
const { transformStatements, batchedDbUpdate } = require('./util');
const { BYPASS_MU_AUTH_FOR_EXPENSIVE_QUERIES,
const { batchedDbUpdate, transformLandingZoneGraph } = require('./util');
const {
BYPASS_MU_AUTH_FOR_EXPENSIVE_QUERIES,
DIRECT_DATABASE_ENDPOINT,
MU_CALL_SCOPE_ID_INITIAL_SYNC,
BATCH_SIZE,
MAX_DB_RETRY_ATTEMPTS,
SLEEP_BETWEEN_BATCHES,
SLEEP_TIME_AFTER_FAILED_DB_OPERATION,
INGEST_GRAPH
TARGET_GRAPH,
LANDING_ZONE_GRAPH,
LANDING_ZONE_DATABASE_ENDPOINT
} = require('./config');
const endpoint = BYPASS_MU_AUTH_FOR_EXPENSIVE_QUERIES ? DIRECT_DATABASE_ENDPOINT : process.env.MU_SPARQL_ENDPOINT;
/**
@@ -24,34 +28,58 @@ const endpoint = BYPASS_MU_AUTH_FOR_EXPENSIVE_QUERIES ? DIRECT_DATABASE_ENDPOINT
* @return {void} Nothing
*/
async function dispatch(lib, data) {
const { mu, muAuthSudo, fetch } = lib;
const { mu, muAuthSudo } = lib;
const { termObjects } = data;
// Steps:
// 1. Write the triples to the landing zone graph - withouth any mapping or filtering
// 2. One-time reasoning run with the full landing zone graph and write the results to the target graph (on-finish)
if (BYPASS_MU_AUTH_FOR_EXPENSIVE_QUERIES) {
console.warn(`Service configured to skip MU_AUTH!`);
}
console.log(`Using ${endpoint} to insert triples`);
if (termObjects.length) {
originalInsertTriples = termObjects.map(o => `${o.subject} ${o.predicate} ${o.object}.`)
const originalInsertTriples = termObjects.map(o => `${o.subject} ${o.predicate} ${o.object}.`);
const transformedStatementsToInsert = await transformStatements(fetch, originalInsertTriples);
if (transformedStatementsToInsert.length) {
await batchedDbUpdate(
muAuthSudo.updateSudo,
INGEST_GRAPH,
transformedStatementsToInsert,
{ 'mu-call-scope-id': MU_CALL_SCOPE_ID_INITIAL_SYNC },
endpoint,
BATCH_SIZE,
MAX_DB_RETRY_ATTEMPTS,
SLEEP_BETWEEN_BATCHES,
SLEEP_TIME_AFTER_FAILED_DB_OPERATION
);
}
await batchedDbUpdate(
muAuthSudo.updateSudo,
LANDING_ZONE_GRAPH,
originalInsertTriples,
{ 'mu-call-scope-id': MU_CALL_SCOPE_ID_INITIAL_SYNC },
LANDING_ZONE_DATABASE_ENDPOINT,
BATCH_SIZE,
MAX_DB_RETRY_ATTEMPTS,
SLEEP_BETWEEN_BATCHES,
SLEEP_TIME_AFTER_FAILED_DB_OPERATION
);
}
}
async function onFinishInitialIngest(lib) {
const { muAuthSudo, fetch } = lib;
console.log(`!! On-finish triggered !!`);
const transformedInsertTriples = await transformLandingZoneGraph(fetch, endpoint);
console.log(`Transformed ${transformedInsertTriples.length} triples`);
await batchedDbUpdate(
muAuthSudo.updateSudo,
TARGET_GRAPH,
transformedInsertTriples,
{ 'mu-call-scope-id': MU_CALL_SCOPE_ID_INITIAL_SYNC },
endpoint,
BATCH_SIZE,
MAX_DB_RETRY_ATTEMPTS,
SLEEP_BETWEEN_BATCHES,
SLEEP_TIME_AFTER_FAILED_DB_OPERATION
);
}
module.exports = {
dispatch
dispatch,
onFinishInitialIngest
};

View File

@@ -1,9 +1,16 @@
const {
MAX_REASONING_RETRY_ATTEMPTS,
SLEEP_TIME_AFTER_FAILED_REASONING_OPERATION
SLEEP_TIME_AFTER_FAILED_REASONING_OPERATION,
MAX_DB_RETRY_ATTEMPTS,
SLEEP_BETWEEN_BATCHES,
SLEEP_TIME_AFTER_FAILED_DB_OPERATION,
TARGET_GRAPH,
LANDING_ZONE_GRAPH,
BATCH_SIZE,
} = require('./config');
async function batchedDbUpdate(muUpdate,
async function batchedDbUpdate(
muUpdate,
graph,
triples,
extraHeaders,
@@ -37,39 +44,6 @@ ${batch}
}
}
async function deleteFromAllGraphs(muUpdate,
triples,
extraHeaders,
endpoint,
maxAttempts,
sleepBetweenBatches = 1000,
sleepTimeOnFail = 1000,
) {
for (const triple of triples) {
console.log(`Deleting a triple from all graphs in triplestore`);
const deleteCall = async () => {
await muUpdate(`
DELETE {
GRAPH ?g {
${triple}
}
} WHERE {
GRAPH ?g {
${triple}
}
}
`, extraHeaders, endpoint);
};
await operationWithRetry(deleteCall, 0, maxAttempts, sleepTimeOnFail);
console.log(`Sleeping before next query execution: ${sleepBetweenBatches}`);
await new Promise(r => setTimeout(r, sleepBetweenBatches));
}
}
async function operationWithRetry(callback,
attempt,
maxAttempts,
@@ -110,18 +84,16 @@ function partition(arr, fn) {
return { passes, fails };
}
/**
* Send triples to reasoning service for conversion
*
*/
function transformTriples(fetch, triples) {
return operationWithRetry(mainConversion(fetch, triples), 0,
async function transformTriples(fetch, triples, mapping) {
return await operationWithRetry(mainConversion(fetch, triples, mapping), 0,
MAX_REASONING_RETRY_ATTEMPTS, SLEEP_TIME_AFTER_FAILED_REASONING_OPERATION);
}
function mainConversion(fetch, triples) {
async function mainConversion(fetch, triples, mapping) {
let formdata = new URLSearchParams();
formdata.append("data", triples);
@@ -131,23 +103,66 @@ function mainConversion(fetch, triples) {
redirect: 'follow'
};
return fetch("http://reasoner/reason/dl2op/main", requestOptions)
.then(response => response.text());
const response = await fetch(`http://reasoner/reason/dl2op/${mapping}`, requestOptions)
return await response.text();
}
function transformStatements(fetch, triples) {
return transformTriples(fetch, triples.join('\n')).then(
graph => {
statements = graph.replace(/\n{2,}/g, '').split('\n')
console.log(`CONVERSION: FROM ${triples.length} triples to ${statements.length}`)
return statements
}
)
async function transformStatements(fetch, triples, mapping = 'main') {
console.log(`Received ${JSON.stringify(triples)} to transform`);
const transformedTriples = await transformTriples(fetch, triples.join('\n'), mapping);
statements = transformedTriples ? transformedTriples.replace(/\n{2,}/g, '').split('\n') : [];
console.log(`CONVERSION: FROM ${triples.length} triples to ${statements.length}`);
return statements;
}
async function deleteFromTargetGraph(lib, statements) {
console.log(`Deleting ${statements.length} statements from target graph`);
console.log(`Statements: ${JSON.stringify(statements)}`)
await batchedDbUpdate(
lib.muAuthSudo.updateSudo,
TARGET_GRAPH,
statements,
{},
process.env.MU_SPARQL_ENDPOINT,
BATCH_SIZE,
MAX_DB_RETRY_ATTEMPTS,
SLEEP_BETWEEN_BATCHES,
SLEEP_TIME_AFTER_FAILED_DB_OPERATION,
'DELETE');
}
async function insertIntoTargetGraph(lib, statements) {
console.log(`Inserting ${statements.length} statements into target graph`);
console.log(`Statements: ${JSON.stringify(statements)}`)
await batchedDbUpdate(
lib.muAuthSudo.updateSudo,
TARGET_GRAPH,
statements,
{},
process.env.MU_SPARQL_ENDPOINT,
BATCH_SIZE,
MAX_DB_RETRY_ATTEMPTS,
SLEEP_BETWEEN_BATCHES,
SLEEP_TIME_AFTER_FAILED_DB_OPERATION,
'INSERT');
}
async function transformLandingZoneGraph(fetch, endpoint, mapping = 'main') {
console.log(`Transforming landing zone graph: ${LANDING_ZONE_GRAPH}`);
const response = await fetch(`http://reasoner/reason/dl2op/${mapping}?data=${encodeURIComponent(`${endpoint}?default-graph-uri=&query=CONSTRUCT+%7B%0D%0A%3Fs+%3Fp+%3Fo%0D%0A%7D+WHERE+%7B%0D%0A+GRAPH+<${LANDING_ZONE_GRAPH}>+%7B%0D%0A%3Fs+%3Fp+%3Fo%0D%0A%7D%0D%0A%7D&should-sponge=&format=text%2Fplain&timeout=0&run=+Run+Query`)}`);
const text = await response.text();
const statements = text.replace(/\n{2,}/g, '').split('\n');
return statements;
}
module.exports = {
batchedDbUpdate,
deleteFromAllGraphs,
partition,
transformStatements
transformStatements,
transformLandingZoneGraph,
deleteFromTargetGraph,
insertIntoTargetGraph
};

View File

@@ -1,18 +1,20 @@
const BATCH_SIZE = parseInt(process.env.BATCH_SIZE) || 100;
const MU_CALL_SCOPE_ID_INITIAL_SYNC = process.env.MU_CALL_SCOPE_ID_INITIAL_SYNC || 'http://redpencil.data.gift/id/concept/muScope/deltas/consumer/initialSync';
const BYPASS_MU_AUTH_FOR_EXPENSIVE_QUERIES = process.env.BYPASS_MU_AUTH_FOR_EXPENSIVE_QUERIES == 'true' ? true : false;
const DIRECT_DATABASE_ENDPOINT = process.env.DIRECT_DATABASE_ENDPOINT || 'http://virtuoso:8890/sparql';
const DIRECT_DATABASE_ENDPOINT = process.env.DIRECT_DATABASE_ENDPOINT || 'http://triplestore:8890/sparql';
const MAX_DB_RETRY_ATTEMPTS = parseInt(process.env.MAX_DB_RETRY_ATTEMPTS || 5);
const MAX_REASONING_RETRY_ATTEMPTS = parseInt(process.env.MAX_REASONING_RETRY_ATTEMPTS || 5);
const SLEEP_BETWEEN_BATCHES = parseInt(process.env.SLEEP_BETWEEN_BATCHES || 1000);
const SLEEP_TIME_AFTER_FAILED_REASONING_OPERATION = parseInt(process.env.SLEEP_TIME_AFTER_FAILED_REASONING_OPERATION || 10000);
const SLEEP_TIME_AFTER_FAILED_DB_OPERATION = parseInt(process.env.SLEEP_TIME_AFTER_FAILED_DB_OPERATION || 60000);
const INGEST_GRAPH = process.env.INGEST_GRAPH || `http://mu.semte.ch/graphs/administrative-unit`;
// Graphs
const TARGET_GRAPH = process.env.TARGET_GRAPH || `http://mu.semte.ch/graphs/administrative-unit`;
const LANDING_ZONE_GRAPH = process.env.DCR_LANDING_ZONE_GRAPH || `http://mu.semte.ch/graphs/landing-zone/leidinggevenden`;
if (!process.env.FILE_SYNC_GRAPH)
throw `Expected 'FILE_SYNC_GRAPH' to be provided.`;
const FILE_SYNC_GRAPH = process.env.FILE_SYNC_GRAPH;
// ENDPOINTS
const LANDING_ZONE_DATABASE = process.env.DCR_LANDING_ZONE_DATABASE || 'db';
const LANDING_ZONE_DATABASE_ENDPOINT = process.env.DCR_LANDING_ZONE_DATABASE_ENDPOINT || `http://${LANDING_ZONE_DATABASE}:8890/sparql`;
module.exports = {
BATCH_SIZE,
@@ -24,6 +26,8 @@ module.exports = {
SLEEP_BETWEEN_BATCHES,
SLEEP_TIME_AFTER_FAILED_DB_OPERATION,
SLEEP_TIME_AFTER_FAILED_REASONING_OPERATION,
INGEST_GRAPH,
FILE_SYNC_GRAPH
LANDING_ZONE_GRAPH,
LANDING_ZONE_DATABASE_ENDPOINT,
TARGET_GRAPH
};

View File

@@ -0,0 +1,72 @@
const PREFIXES = `
PREFIX org: <http://www.w3.org/ns/org#>
PREFIX mandaat: <http://data.vlaanderen.be/ns/mandaat#>
PREFIX lblodlg: <http://data.lblod.info/vocabularies/leidinggevenden/>
PREFIX besluit: <http://data.vlaanderen.be/ns/besluit#>`
const contextConfig = {
addTypes: {
scope: 'all', // 'inserts, 'deletes', 'all' or none. To add rdf:type to subjects of inserts, deletes or both
exhausitive: false, // true or false: find all types for a subject, even if one is already present in delta
},
contextQueries: [
// Case Mandatarissen
// They can be triggered when being inserted or when their link to a mandate is added
{
trigger: { // subjectType or predicateValue
subjectType: "mandaat:Mandataris"
},
queryTemplate: (subject) => `
${PREFIXES}
CONSTRUCT {
?mandataris org:holds ?mandate ;
?p ?o .
?orgaanInTime org:hasPost ?mandate ;
mandaat:isTijdspecialisatieVan ?orgaan .
?orgaan besluit:bestuurt ?eenheid .
?eenheid besluit:classificatie ?classification .
} WHERE {
GRAPH <http://mu.semte.ch/graphs/landing-zone/mandatarissen> {
VALUES ?mandataris { ${subject} }
?mandataris org:holds ?mandate ;
?p ?o .
?orgaanInTime org:hasPost ?mandate ;
mandaat:isTijdspecialisatieVan ?orgaan .
?orgaan besluit:bestuurt ?eenheid .
?eenheid besluit:classificatie ?classification .
}
}`
},
{
trigger: {
predicateValue: "org:holds"
},
queryTemplate: (subject) => `
${PREFIXES}
CONSTRUCT {
?mandataris org:holds ?mandate ;
?p ?o .
?orgaanInTime org:hasPost ?mandate ;
mandaat:isTijdspecialisatieVan ?orgaan .
?orgaan besluit:bestuurt ?eenheid .
?eenheid besluit:classificatie ?classification .
} WHERE {
GRAPH <http://mu.semte.ch/graphs/landing-zone/mandatarissen> {
VALUES ?mandataris { ${subject} }
?mandataris org:holds ?mandate ;
?p ?o .
?orgaanInTime org:hasPost ?mandate ;
mandaat:isTijdspecialisatieVan ?orgaan .
?orgaan besluit:bestuurt ?eenheid .
?eenheid besluit:classificatie ?classification .
}
}`
}
]
}
module.exports = {
contextConfig,
PREFIXES
};

View File

@@ -0,0 +1,85 @@
const {
transformStatements,
deleteFromTargetGraph,
insertIntoTargetGraph,
} = require('./util');
/**
* Dispatch the fetched information to a target graph.
* Note: <share://file/data> will be ADDED to it's own graph.
* We take only care of adding them, not updating triples, this is a TODO
* @param { mu, muAuthSudo } lib - The provided libraries from the host service.
* @param { termObjectChangeSets: { deletes, inserts } } data - The fetched changes sets, which objects of serialized Terms
* [ {
* graph: "<http://foo>",
* subject: "<http://bar>",
* predicate: "<http://baz>",
* object: "<http://boom>^^<http://datatype>"
* }
* ]
* @return {void} Nothing
*/
async function dispatch(lib, data) {
const { mu, fetch } = lib;
let { termObjectChangeSets, termObjectChangeSetsWithContext } = data;
// Both arrays are the same length, so we can zip them together for easier processing
zippedChangeSets = termObjectChangeSets.map((o, i) => ({
original: o,
withContext: termObjectChangeSetsWithContext[i]
}));
console.log(`Received ${zippedChangeSets.length} change sets`)
for (let { original, withContext } of zippedChangeSets) {
let originalDeletes, originalInserts, insertsWithContext, deletesWithContext;
try {
originalInserts = original.inserts.map(o => `${o.subject} ${o.predicate} ${o.object}.`);
originalDeletes = original.deletes.map(o => `${o.subject} ${o.predicate} ${o.object}.`);
} catch (e) {
console.log(`Error while processing change set: ${e}`);
console.log(`Original change set: ${JSON.stringify(original)}`);
throw e;
}
// Extra context needed for mapping from DL to OP model and filtering based on type.
try {
insertsWithContext = withContext.inserts.map(o => `${o.subject} ${o.predicate} ${o.object}.`);
deletesWithContext = withContext.deletes.map(o => `${o.subject} ${o.predicate} ${o.object}.`);
} catch (e) {
console.log(`Error while processing change set with context: ${e}`);
console.log(`Change set with context: ${JSON.stringify(withContext)}`);
throw e;
}
if (originalDeletes.length) {
// Map deletes from DL to OP model
const transformedDeletes = await transformStatements(fetch, deletesWithContext);
if (!transformedDeletes.length) {
console.log(`Warn: Delete statements mapped to empty result.`);
console.log(`Input: ${deletesWithContext}`);
console.log(`Output: ${transformedDeletes}`);
} else {
await deleteFromTargetGraph(lib, transformedDeletes);
}
}
if (originalInserts.length) {
// Map inserts from DL to OP model
const transformedInserts = await transformStatements(fetch, insertsWithContext);
if (!transformedInserts.length) {
console.log(`Warn: Insert statements mapped to empty result.`);
console.log(`Input: ${insertsWithContext}`);
console.log(`Output: ${transformedInserts}`);
} else {
await insertIntoTargetGraph(lib, transformedInserts);
}
}
}
}
module.exports = {
dispatch
};

View File

@@ -0,0 +1,85 @@
const { batchedDbUpdate, transformLandingZoneGraph } = require('./util');
const {
BYPASS_MU_AUTH_FOR_EXPENSIVE_QUERIES,
DIRECT_DATABASE_ENDPOINT,
MU_CALL_SCOPE_ID_INITIAL_SYNC,
BATCH_SIZE,
MAX_DB_RETRY_ATTEMPTS,
SLEEP_BETWEEN_BATCHES,
SLEEP_TIME_AFTER_FAILED_DB_OPERATION,
TARGET_GRAPH,
LANDING_ZONE_GRAPH,
LANDING_ZONE_DATABASE_ENDPOINT
} = require('./config');
const endpoint = BYPASS_MU_AUTH_FOR_EXPENSIVE_QUERIES ? DIRECT_DATABASE_ENDPOINT : process.env.MU_SPARQL_ENDPOINT;
/**
* Dispatch the fetched information to a target graph.
* @param { mu, muAuthSudo } lib - The provided libraries from the host service.
* @param { termObjects } data - The fetched quad information, which objects of serialized Terms
* [ {
* graph: "<http://foo>",
* subject: "<http://bar>",
* predicate: "<http://baz>",
* object: "<http://boom>^^<http://datatype>"
* }
* ]
* @return {void} Nothing
*/
async function dispatch(lib, data) {
const { mu, muAuthSudo } = lib;
const { termObjects } = data;
// Steps:
// 1. Write the triples to the landing zone graph - withouth any mapping or filtering
// 2. One-time reasoning run with the full landing zone graph and write the results to the target graph (on-finish)
if (BYPASS_MU_AUTH_FOR_EXPENSIVE_QUERIES) {
console.warn(`Service configured to skip MU_AUTH!`);
}
console.log(`Using ${endpoint} to insert triples`);
if (termObjects.length) {
const originalInsertTriples = termObjects.map(o => `${o.subject} ${o.predicate} ${o.object}.`);
await batchedDbUpdate(
muAuthSudo.updateSudo,
LANDING_ZONE_GRAPH,
originalInsertTriples,
{ 'mu-call-scope-id': MU_CALL_SCOPE_ID_INITIAL_SYNC },
LANDING_ZONE_DATABASE_ENDPOINT,
BATCH_SIZE,
MAX_DB_RETRY_ATTEMPTS,
SLEEP_BETWEEN_BATCHES,
SLEEP_TIME_AFTER_FAILED_DB_OPERATION
);
}
}
async function onFinishInitialIngest(lib) {
const { muAuthSudo, fetch } = lib;
console.log(`!! On-finish triggered !!`);
const transformedInsertTriples = await transformLandingZoneGraph(fetch, endpoint);
console.log(`Transformed ${transformedInsertTriples.length} triples`);
await batchedDbUpdate(
muAuthSudo.updateSudo,
TARGET_GRAPH,
transformedInsertTriples,
{ 'mu-call-scope-id': MU_CALL_SCOPE_ID_INITIAL_SYNC },
endpoint,
BATCH_SIZE,
MAX_DB_RETRY_ATTEMPTS,
SLEEP_BETWEEN_BATCHES,
SLEEP_TIME_AFTER_FAILED_DB_OPERATION
);
}
module.exports = {
dispatch,
onFinishInitialIngest
};

View File

@@ -1,9 +1,16 @@
const {
MAX_REASONING_RETRY_ATTEMPTS,
SLEEP_TIME_AFTER_FAILED_REASONING_OPERATION
SLEEP_TIME_AFTER_FAILED_REASONING_OPERATION,
MAX_DB_RETRY_ATTEMPTS,
SLEEP_BETWEEN_BATCHES,
SLEEP_TIME_AFTER_FAILED_DB_OPERATION,
TARGET_GRAPH,
LANDING_ZONE_GRAPH,
BATCH_SIZE
} = require('./config');
async function batchedDbUpdate(muUpdate,
async function batchedDbUpdate(
muUpdate,
graph,
triples,
extraHeaders,
@@ -37,39 +44,6 @@ ${batch}
}
}
async function deleteFromAllGraphs(muUpdate,
triples,
extraHeaders,
endpoint,
maxAttempts,
sleepBetweenBatches = 1000,
sleepTimeOnFail = 1000,
) {
for (const triple of triples) {
console.log(`Deleting a triple from all graphs in triplestore`);
const deleteCall = async () => {
await muUpdate(`
DELETE {
GRAPH ?g {
${triple}
}
} WHERE {
GRAPH ?g {
${triple}
}
}
`, extraHeaders, endpoint);
};
await operationWithRetry(deleteCall, 0, maxAttempts, sleepTimeOnFail);
console.log(`Sleeping before next query execution: ${sleepBetweenBatches}`);
await new Promise(r => setTimeout(r, sleepBetweenBatches));
}
}
async function operationWithRetry(callback,
attempt,
maxAttempts,
@@ -110,18 +84,16 @@ function partition(arr, fn) {
return { passes, fails };
}
/**
* Send triples to reasoning service for conversion
*
*/
function transformTriples(fetch, triples, mapping) {
return operationWithRetry(mainConversion(fetch, triples, mapping), 0,
async function transformTriples(fetch, triples, mapping) {
return await operationWithRetry(mainConversion(fetch, triples, mapping), 0,
MAX_REASONING_RETRY_ATTEMPTS, SLEEP_TIME_AFTER_FAILED_REASONING_OPERATION);
}
function mainConversion(fetch, triples, mapping) {
async function mainConversion(fetch, triples, mapping) {
let formdata = new URLSearchParams();
formdata.append("data", triples);
@@ -131,24 +103,66 @@ function mainConversion(fetch, triples, mapping) {
redirect: 'follow'
};
return fetch(`http://reasoner/reason/dl2op/${mapping}`, requestOptions)
.then(response => response.text());
const response = await fetch(`http://reasoner/reason/dl2op/${mapping}`, requestOptions)
return await response.text();
}
async function transformStatements(fetch, triples, mapping = 'main') {
console.log(`Received ${JSON.stringify(triples)} to transform`);
const transformedTriples = await transformTriples(fetch, triples.join('\n'), mapping);
statements = transformedTriples ? transformedTriples.replace(/\n{2,}/g, '').split('\n') : [];
console.log(`CONVERSION: FROM ${triples.length} triples to ${statements.length}`);
return statements;
}
function transformStatements(fetch, triples, mapping) {
return transformTriples(fetch, triples.join('\n'), mapping).then(
graph => {
statements = graph ? graph.split('\n') : [];
console.log(`CONVERSION ${mapping}: FROM ${triples.length} triples to ${statements.length}`)
return statements
}
)
async function deleteFromTargetGraph(lib, statements) {
console.log(`Deleting ${statements.length} statements from target graph`);
console.log(`Statements: ${JSON.stringify(statements)}`)
await batchedDbUpdate(
lib.muAuthSudo.updateSudo,
TARGET_GRAPH,
statements,
{},
process.env.MU_SPARQL_ENDPOINT,
BATCH_SIZE,
MAX_DB_RETRY_ATTEMPTS,
SLEEP_BETWEEN_BATCHES,
SLEEP_TIME_AFTER_FAILED_DB_OPERATION,
'DELETE');
}
async function insertIntoTargetGraph(lib, statements) {
console.log(`Inserting ${statements.length} statements into target graph`);
console.log(`Statements: ${JSON.stringify(statements)}`)
await batchedDbUpdate(
lib.muAuthSudo.updateSudo,
TARGET_GRAPH,
statements,
{},
process.env.MU_SPARQL_ENDPOINT,
BATCH_SIZE,
MAX_DB_RETRY_ATTEMPTS,
SLEEP_BETWEEN_BATCHES,
SLEEP_TIME_AFTER_FAILED_DB_OPERATION,
'INSERT');
}
async function transformLandingZoneGraph(fetch, endpoint, mapping = 'main') {
console.log(`Transforming landing zone graph: ${LANDING_ZONE_GRAPH}`);
const response = await fetch(`http://reasoner/reason/dl2op/${mapping}?data=${encodeURIComponent(`${endpoint}?default-graph-uri=&query=CONSTRUCT+%7B%0D%0A%3Fs+%3Fp+%3Fo%0D%0A%7D+WHERE+%7B%0D%0A+GRAPH+<${LANDING_ZONE_GRAPH}>+%7B%0D%0A%3Fs+%3Fp+%3Fo%0D%0A%7D%0D%0A%7D&should-sponge=&format=text%2Fplain&timeout=0&run=+Run+Query`)}`);
const text = await response.text();
const statements = text.replace(/\n{2,}/g, '').split('\n');
return statements;
}
module.exports = {
batchedDbUpdate,
deleteFromAllGraphs,
partition,
transformStatements
transformStatements,
transformLandingZoneGraph,
deleteFromTargetGraph,
insertIntoTargetGraph
};

View File

@@ -1,70 +0,0 @@
const { transformStatements, batchedDbUpdate, deleteFromAllGraphs } = require('./util');
const {
BATCH_SIZE,
MAX_DB_RETRY_ATTEMPTS,
SLEEP_BETWEEN_BATCHES,
SLEEP_TIME_AFTER_FAILED_DB_OPERATION,
INGEST_GRAPH
} = require('./config');
/**
* Dispatch the fetched information to a target graph.
* Note: <share://file/data> will be ADDED to it's own graph.
* We take only care of adding them, not updating triples, this is a TODO
* @param { mu, muAuthSudo } lib - The provided libraries from the host service.
* @param { termObjectChangeSets: { deletes, inserts } } data - The fetched changes sets, which objects of serialized Terms
* [ {
* graph: "<http://foo>",
* subject: "<http://bar>",
* predicate: "<http://baz>",
* object: "<http://boom>^^<http://datatype>"
* }
* ]
* @return {void} Nothing
*/
async function dispatch(lib, data) {
const { mu, muAuthSudo, fetch } = lib;
const { termObjectChangeSets } = data;
for (let { deletes, inserts } of termObjectChangeSets) {
const deleteStatements = deletes.map(o => `${o.subject} ${o.predicate} ${o.object}.`);
const insertStatements = inserts.map(o => `${o.subject} ${o.predicate} ${o.object}.`);
if (deleteStatements.length) {
const transformedStatementsToDelete = await transformStatements(fetch, deleteStatements);
if (transformedStatementsToDelete.length) {
await deleteFromAllGraphs(
muAuthSudo.updateSudo,
transformedStatementsToDelete,
{ 'mu-call-scope-id': 'http://redpencil.data.gift/id/concept/muScope/deltas/write-for-dispatch' },
process.env.MU_SPARQL_ENDPOINT, //Note: this is the default endpoint through auth
MAX_DB_RETRY_ATTEMPTS,
SLEEP_BETWEEN_BATCHES,
SLEEP_TIME_AFTER_FAILED_DB_OPERATION,
);
}
}
if (insertStatements.length) {
const transformedStatementsToInsert = await transformStatements(fetch, insertStatements);
if (transformedStatementsToInsert.length) {
await batchedDbUpdate(
muAuthSudo.updateSudo,
INGEST_GRAPH,
transformedStatementsToInsert,
{ 'mu-call-scope-id': 'http://redpencil.data.gift/id/concept/muScope/deltas/write-for-dispatch' },
process.env.MU_SPARQL_ENDPOINT, //Note: this is the default endpoint through auth
BATCH_SIZE,
MAX_DB_RETRY_ATTEMPTS,
SLEEP_BETWEEN_BATCHES,
SLEEP_TIME_AFTER_FAILED_DB_OPERATION,
"INSERT"
);
}
}
}
}
module.exports = {
dispatch
};

View File

@@ -1,57 +0,0 @@
const { transformStatements, batchedDbUpdate } = require('./util');
const { BYPASS_MU_AUTH_FOR_EXPENSIVE_QUERIES,
DIRECT_DATABASE_ENDPOINT,
MU_CALL_SCOPE_ID_INITIAL_SYNC,
BATCH_SIZE,
MAX_DB_RETRY_ATTEMPTS,
SLEEP_BETWEEN_BATCHES,
SLEEP_TIME_AFTER_FAILED_DB_OPERATION,
INGEST_GRAPH
} = require('./config');
const endpoint = BYPASS_MU_AUTH_FOR_EXPENSIVE_QUERIES ? DIRECT_DATABASE_ENDPOINT : process.env.MU_SPARQL_ENDPOINT;
/**
* Dispatch the fetched information to a target graph.
* @param { mu, muAuthSudo } lib - The provided libraries from the host service.
* @param { termObjects } data - The fetched quad information, which objects of serialized Terms
* [ {
* graph: "<http://foo>",
* subject: "<http://bar>",
* predicate: "<http://baz>",
* object: "<http://boom>^^<http://datatype>"
* }
* ]
* @return {void} Nothing
*/
async function dispatch(lib, data) {
const { mu, muAuthSudo, fetch } = lib;
const { termObjects } = data;
if (BYPASS_MU_AUTH_FOR_EXPENSIVE_QUERIES) {
console.warn(`Service configured to skip MU_AUTH!`);
}
console.log(`Using ${endpoint} to insert triples`);
if (termObjects.length) {
originalInsertTriples = termObjects.map(o => `${o.subject} ${o.predicate} ${o.object}.`)
const transformedStatementsToInsert = await transformStatements(fetch, originalInsertTriples);
if (transformedStatementsToInsert.length) {
await batchedDbUpdate(
muAuthSudo.updateSudo,
INGEST_GRAPH,
transformedStatementsToInsert,
{ 'mu-call-scope-id': MU_CALL_SCOPE_ID_INITIAL_SYNC },
endpoint,
BATCH_SIZE,
MAX_DB_RETRY_ATTEMPTS,
SLEEP_BETWEEN_BATCHES,
SLEEP_TIME_AFTER_FAILED_DB_OPERATION
)
}
}
}
module.exports = {
dispatch
};

View File

@@ -1,153 +0,0 @@
const {
MAX_REASONING_RETRY_ATTEMPTS,
SLEEP_TIME_AFTER_FAILED_REASONING_OPERATION
} = require('./config');
async function batchedDbUpdate(muUpdate,
graph,
triples,
extraHeaders,
endpoint,
batchSize,
maxAttempts,
sleepBetweenBatches = 1000,
sleepTimeOnFail = 1000,
operation = 'INSERT'
) {
for (let i = 0; i < triples.length; i += batchSize) {
console.log(`Inserting triples in batch: ${i}-${i + batchSize}`);
const batch = triples.slice(i, i + batchSize).join('\n');
const insertCall = async () => {
await muUpdate(`
${operation} DATA {
GRAPH <${graph}> {
${batch}
}
}
`, extraHeaders, endpoint);
};
await operationWithRetry(insertCall, 0, maxAttempts, sleepTimeOnFail);
console.log(`Sleeping before next query execution: ${sleepBetweenBatches}`);
await new Promise(r => setTimeout(r, sleepBetweenBatches));
}
}
async function deleteFromAllGraphs(muUpdate,
triples,
extraHeaders,
endpoint,
maxAttempts,
sleepBetweenBatches = 1000,
sleepTimeOnFail = 1000,
) {
for (const triple of triples) {
console.log(`Deleting a triple from all graphs in triplestore`);
const deleteCall = async () => {
await muUpdate(`
DELETE {
GRAPH ?g {
${triple}
}
} WHERE {
GRAPH ?g {
${triple}
}
}
`, extraHeaders, endpoint);
};
await operationWithRetry(deleteCall, 0, maxAttempts, sleepTimeOnFail);
console.log(`Sleeping before next query execution: ${sleepBetweenBatches}`);
await new Promise(r => setTimeout(r, sleepBetweenBatches));
}
}
async function operationWithRetry(callback,
attempt,
maxAttempts,
sleepTimeOnFail) {
try {
if (typeof callback === "function")
return await callback();
else // Catch error from promise - not how I would do it normally, but allows re use of existing code.
return await callback;
}
catch (e) {
console.log(`Operation failed for ${callback.toString()}, attempt: ${attempt} of ${maxAttempts}`);
console.log(`Error: ${e}`);
console.log(`Sleeping ${sleepTimeOnFail} ms`);
if (attempt >= maxAttempts) {
console.log(`Max attempts reached for ${callback.toString()}, giving up`);
throw e;
}
await new Promise(r => setTimeout(r, sleepTimeOnFail));
return operationWithRetry(callback, ++attempt, maxAttempts, sleepTimeOnFail);
}
}
/**
* Splits an array into two parts, a part that passes and a part that fails a predicate function.
* Credits: https://github.com/benjay10
* @public
* @function partition
* @param {Array} arr - Array to be partitioned
* @param {Function} fn - Function that accepts single argument: an element of the array, and should return a truthy or falsy value.
* @returns {Object} Object that contains keys passes and fails, each representing an array with elemets that pass or fail the predicate respectively
*/
function partition(arr, fn) {
let passes = [], fails = [];
arr.forEach((item) => (fn(item) ? passes : fails).push(item));
return { passes, fails };
}
/**
* Send triples to reasoning service for conversion
*
*/
function transformTriples(fetch, triples) {
return operationWithRetry(mainConversion(fetch, triples), 0,
MAX_REASONING_RETRY_ATTEMPTS, SLEEP_TIME_AFTER_FAILED_REASONING_OPERATION);
}
function mainConversion(fetch, triples) {
let formdata = new URLSearchParams();
formdata.append("data", triples);
let requestOptions = {
method: 'POST',
body: formdata,
redirect: 'follow'
};
return fetch("http://reasoner/reason/dl2op/main", requestOptions)
.then(response => response.text());
}
function transformStatements(fetch, triples) {
return transformTriples(fetch, triples.join('\n')).then(
graph => {
statements = graph.replace(/\n{2,}/g, '').split('\n')
console.log(`CONVERSION: FROM ${triples.length} triples to ${statements.length}`)
return statements
}
)
}
module.exports = {
batchedDbUpdate,
deleteFromAllGraphs,
partition,
transformStatements
};

View File

@@ -1,51 +0,0 @@
const BATCH_SIZE = parseInt(process.env.BATCH_SIZE) || 100;
const MU_CALL_SCOPE_ID_INITIAL_SYNC =
process.env.MU_CALL_SCOPE_ID_INITIAL_SYNC ||
"http://redpencil.data.gift/id/concept/muScope/deltas/consumer/initialSync";
const BYPASS_MU_AUTH_FOR_EXPENSIVE_QUERIES =
process.env.BYPASS_MU_AUTH_FOR_EXPENSIVE_QUERIES == "true" ? true : false;
const DIRECT_DATABASE_ENDPOINT =
process.env.DIRECT_DATABASE_ENDPOINT || "http://virtuoso:8890/sparql";
const MAX_DB_RETRY_ATTEMPTS = parseInt(process.env.MAX_DB_RETRY_ATTEMPTS || 5);
const MAX_REASONING_RETRY_ATTEMPTS = parseInt(
process.env.MAX_REASONING_RETRY_ATTEMPTS || 5
);
const SLEEP_BETWEEN_BATCHES = parseInt(
process.env.SLEEP_BETWEEN_BATCHES || 1000
);
const SLEEP_TIME_AFTER_FAILED_REASONING_OPERATION = parseInt(
process.env.SLEEP_TIME_AFTER_FAILED_REASONING_OPERATION || 10000
);
const SLEEP_TIME_AFTER_FAILED_DB_OPERATION = parseInt(
process.env.SLEEP_TIME_AFTER_FAILED_DB_OPERATION || 60000
);
const INGEST_GRAPH =
process.env.INGEST_GRAPH || `http://mu.semte.ch/graphs/worship-service`;
const PRIVACY_SENSITIVE_GRAPH =
process.env.PRIVACY_SENSITIVE_GRAPH ||
`http://mu.semte.ch/graphs/worship-privacy-centric-graph`;
const UNFILTERED_MAPPING = "main";
const MAIN_INFO_MAPPING = "main-info";
const PRIVATE_INFO_MAPPING = "private-info";
if (!process.env.FILE_SYNC_GRAPH)
throw `Expected 'FILE_SYNC_GRAPH' to be provided.`;
const FILE_SYNC_GRAPH = process.env.FILE_SYNC_GRAPH;
module.exports = {
BATCH_SIZE,
MU_CALL_SCOPE_ID_INITIAL_SYNC,
BYPASS_MU_AUTH_FOR_EXPENSIVE_QUERIES,
DIRECT_DATABASE_ENDPOINT,
MAX_DB_RETRY_ATTEMPTS,
MAX_REASONING_RETRY_ATTEMPTS,
SLEEP_BETWEEN_BATCHES,
SLEEP_TIME_AFTER_FAILED_DB_OPERATION,
SLEEP_TIME_AFTER_FAILED_REASONING_OPERATION,
INGEST_GRAPH,
PRIVACY_SENSITIVE_GRAPH,
UNFILTERED_MAPPING,
MAIN_INFO_MAPPING,
PRIVATE_INFO_MAPPING,
FILE_SYNC_GRAPH,
};

View File

@@ -1,88 +0,0 @@
const { transformStatements, batchedDbUpdate, deleteFromAllGraphs } = require('./util');
const {
BATCH_SIZE,
MAX_DB_RETRY_ATTEMPTS,
SLEEP_BETWEEN_BATCHES,
SLEEP_TIME_AFTER_FAILED_DB_OPERATION,
INGEST_GRAPH,
PRIVACY_SENSITIVE_GRAPH,
UNFILTERED_MAPPING,
MAIN_INFO_MAPPING,
PRIVATE_INFO_MAPPING,
} = require('./config');
/**
* Dispatch the fetched information to a target graph.
* Note: <share://file/data> will be ADDED to it's own graph.
* We take only care of adding them, not updating triples, this is a TODO
* @param { mu, muAuthSudo } lib - The provided libraries from the host service.
* @param { termObjectChangeSets: { deletes, inserts } } data - The fetched changes sets, which objects of serialized Terms
* [ {
* graph: "<http://foo>",
* subject: "<http://bar>",
* predicate: "<http://baz>",
* object: "<http://boom>^^<http://datatype>"
* }
* ]
* @return {void} Nothing
*/
async function dispatch(lib, data) {
const { mu, muAuthSudo, fetch } = lib;
const { termObjectChangeSets } = data;
for (let { deletes, inserts } of termObjectChangeSets) {
const deleteStatements = deletes.map(o => `${o.subject} ${o.predicate} ${o.object}.`);
const insertStatements = inserts.map(o => `${o.subject} ${o.predicate} ${o.object}.`);
if (deleteStatements.length) {
const transformedStatementsToDelete = await transformStatements(fetch, deleteStatements, UNFILTERED_MAPPING);
if (transformedStatementsToDelete.length) {
await deleteFromAllGraphs(
muAuthSudo.updateSudo,
transformedStatementsToDelete,
{ 'mu-call-scope-id': 'http://redpencil.data.gift/id/concept/muScope/deltas/write-for-dispatch' },
process.env.MU_SPARQL_ENDPOINT, //Note: this is the default endpoint through auth
MAX_DB_RETRY_ATTEMPTS,
SLEEP_BETWEEN_BATCHES,
SLEEP_TIME_AFTER_FAILED_DB_OPERATION,
);
}
}
if (insertStatements.length) {
const transformedStatementsToInsert = await transformStatements(fetch, insertStatements, MAIN_INFO_MAPPING);
if (transformedStatementsToInsert.length) {
await batchedDbUpdate(
muAuthSudo.updateSudo,
INGEST_GRAPH,
transformedStatementsToInsert,
{ 'mu-call-scope-id': 'http://redpencil.data.gift/id/concept/muScope/deltas/write-for-dispatch' },
process.env.MU_SPARQL_ENDPOINT, //Note: this is the default endpoint through auth
BATCH_SIZE,
MAX_DB_RETRY_ATTEMPTS,
SLEEP_BETWEEN_BATCHES,
SLEEP_TIME_AFTER_FAILED_DB_OPERATION
);
}
const transformedStatementsToInsertPrivate = await transformStatements(fetch, insertStatements, PRIVATE_INFO_MAPPING);
if (transformedStatementsToInsertPrivate.length) {
await batchedDbUpdate(
muAuthSudo.updateSudo,
PRIVACY_SENSITIVE_GRAPH,
transformedStatementsToInsertPrivate,
{ 'mu-call-scope-id': 'http://redpencil.data.gift/id/concept/muScope/deltas/write-for-dispatch' },
process.env.MU_SPARQL_ENDPOINT, // Note: this is the default endpoint through auth
BATCH_SIZE,
MAX_DB_RETRY_ATTEMPTS,
SLEEP_BETWEEN_BATCHES,
SLEEP_TIME_AFTER_FAILED_DB_OPERATION
);
}
}
}
}
module.exports = {
dispatch
};

View File

@@ -1,75 +0,0 @@
const { transformStatements, batchedDbUpdate, } = require('./util');
const { BYPASS_MU_AUTH_FOR_EXPENSIVE_QUERIES,
DIRECT_DATABASE_ENDPOINT,
MU_CALL_SCOPE_ID_INITIAL_SYNC,
BATCH_SIZE,
MAX_DB_RETRY_ATTEMPTS,
SLEEP_BETWEEN_BATCHES,
SLEEP_TIME_AFTER_FAILED_DB_OPERATION,
INGEST_GRAPH,
PRIVACY_SENSITIVE_GRAPH,
MAIN_INFO_MAPPING,
PRIVATE_INFO_MAPPING
} = require('./config');
const endpoint = BYPASS_MU_AUTH_FOR_EXPENSIVE_QUERIES ? DIRECT_DATABASE_ENDPOINT : process.env.MU_SPARQL_ENDPOINT;
/**
* Dispatch the fetched information to a target graph.
* @param { mu, muAuthSudo } lib - The provided libraries from the host service.
* @param { termObjects } data - The fetched quad information, which objects of serialized Terms
* [ {
* graph: "<http://foo>",
* subject: "<http://bar>",
* predicate: "<http://baz>",
* object: "<http://boom>^^<http://datatype>"
* }
* ]
* @return {void} Nothing
*/
async function dispatch(lib, data) {
const { mu, muAuthSudo, fetch } = lib;
const { termObjects } = data;
if (BYPASS_MU_AUTH_FOR_EXPENSIVE_QUERIES) {
console.warn(`Service configured to skip MU_AUTH!`);
}
console.log(`Using ${endpoint} to insert triples`);
if (termObjects.length) {
originalInsertTriples = termObjects.map(o => `${o.subject} ${o.predicate} ${o.object}.`)
const transformedStatementsToInsert = await transformStatements(fetch, originalInsertTriples, MAIN_INFO_MAPPING);
if (transformedStatementsToInsert.length) {
await batchedDbUpdate(
muAuthSudo.updateSudo,
INGEST_GRAPH,
transformedStatementsToInsert,
{ 'mu-call-scope-id': MU_CALL_SCOPE_ID_INITIAL_SYNC },
endpoint,
BATCH_SIZE,
MAX_DB_RETRY_ATTEMPTS,
SLEEP_BETWEEN_BATCHES,
SLEEP_TIME_AFTER_FAILED_DB_OPERATION
);
}
const transformedStatementsToInsertPrivate = await transformStatements(fetch, originalInsertTriples, PRIVATE_INFO_MAPPING);
if (transformedStatementsToInsertPrivate.length) {
await batchedDbUpdate(
muAuthSudo.updateSudo,
PRIVACY_SENSITIVE_GRAPH,
transformedStatementsToInsertPrivate,
{ 'mu-call-scope-id': MU_CALL_SCOPE_ID_INITIAL_SYNC },
endpoint,
BATCH_SIZE,
MAX_DB_RETRY_ATTEMPTS,
SLEEP_BETWEEN_BATCHES,
SLEEP_TIME_AFTER_FAILED_DB_OPERATION
);
}
}
}
module.exports = {
dispatch
};

View File

@@ -0,0 +1,40 @@
const BATCH_SIZE = parseInt(process.env.BATCH_SIZE) || 100;
const MU_CALL_SCOPE_ID_INITIAL_SYNC = process.env.MU_CALL_SCOPE_ID_INITIAL_SYNC || 'http://redpencil.data.gift/id/concept/muScope/deltas/consumer/initialSync';
const BYPASS_MU_AUTH_FOR_EXPENSIVE_QUERIES = process.env.BYPASS_MU_AUTH_FOR_EXPENSIVE_QUERIES == 'true' ? true : false;
const DIRECT_DATABASE_ENDPOINT = process.env.DIRECT_DATABASE_ENDPOINT || 'http://triplestore:8890/sparql';
const MAX_DB_RETRY_ATTEMPTS = parseInt(process.env.MAX_DB_RETRY_ATTEMPTS || 5);
const MAX_REASONING_RETRY_ATTEMPTS = parseInt(process.env.MAX_REASONING_RETRY_ATTEMPTS || 5);
const SLEEP_BETWEEN_BATCHES = parseInt(process.env.SLEEP_BETWEEN_BATCHES || 1000);
const SLEEP_TIME_AFTER_FAILED_REASONING_OPERATION = parseInt(process.env.SLEEP_TIME_AFTER_FAILED_REASONING_OPERATION || 10000);
const SLEEP_TIME_AFTER_FAILED_DB_OPERATION = parseInt(process.env.SLEEP_TIME_AFTER_FAILED_DB_OPERATION || 60000);
// Graphs
const TARGET_GRAPH = process.env.TARGET_GRAPH || `http://mu.semte.ch/graphs/worship-service`;
const PRIVACY_SENSITIVE_GRAPH = process.env.PRIVACY_SENSITIVE_GRAPH || `http://mu.semte.ch/graphs/worship-privacy-centric-graph`;
const LANDING_ZONE_GRAPH = process.env.DCR_LANDING_ZONE_GRAPH || `http://mu.semte.ch/graphs/landing-zone/leidinggevenden`;
// Mappings
const MAIN_INFO_MAPPING = "main-info";
const PRIVATE_INFO_MAPPING = "private-info";
// ENDPOINTS
const LANDING_ZONE_DATABASE = process.env.DCR_LANDING_ZONE_DATABASE || 'db';
const LANDING_ZONE_DATABASE_ENDPOINT = process.env.DCR_LANDING_ZONE_DATABASE_ENDPOINT || `http://${LANDING_ZONE_DATABASE}:8890/sparql`;
module.exports = {
BATCH_SIZE,
MU_CALL_SCOPE_ID_INITIAL_SYNC,
BYPASS_MU_AUTH_FOR_EXPENSIVE_QUERIES,
DIRECT_DATABASE_ENDPOINT,
MAX_DB_RETRY_ATTEMPTS,
MAX_REASONING_RETRY_ATTEMPTS,
SLEEP_BETWEEN_BATCHES,
SLEEP_TIME_AFTER_FAILED_DB_OPERATION,
SLEEP_TIME_AFTER_FAILED_REASONING_OPERATION,
LANDING_ZONE_GRAPH,
LANDING_ZONE_DATABASE_ENDPOINT,
TARGET_GRAPH,
PRIVACY_SENSITIVE_GRAPH,
MAIN_INFO_MAPPING,
PRIVATE_INFO_MAPPING
};

View File

@@ -0,0 +1,11 @@
const contextConfig = {
addTypes: {
scope: 'all', // 'inserts, 'deletes', 'all' or none. To add rdf:type to subjects of inserts, deletes or both
exhausitive: false, // true or false: find all types for a subject, even if one is already present in delta
},
contextQueries: []
}
module.exports = {
contextConfig
};

View File

@@ -0,0 +1,114 @@
const {
transformStatements,
deleteFromTargetGraph,
insertIntoTargetGraph,
deleteFromPrivateGraph,
insertIntoPrivateGraph
} = require('./util');
const {
MAIN_INFO_MAPPING,
PRIVATE_INFO_MAPPING
} = require('./config');
/**
* Dispatch the fetched information to a target graph.
* Note: <share://file/data> will be ADDED to it's own graph.
* We take only care of adding them, not updating triples, this is a TODO
* @param { mu, muAuthSudo } lib - The provided libraries from the host service.
* @param { termObjectChangeSets: { deletes, inserts } } data - The fetched changes sets, which objects of serialized Terms
* [ {
* graph: "<http://foo>",
* subject: "<http://bar>",
* predicate: "<http://baz>",
* object: "<http://boom>^^<http://datatype>"
* }
* ]
* @return {void} Nothing
*/
async function dispatch(lib, data) {
const { mu, fetch } = lib;
let { termObjectChangeSets, termObjectChangeSetsWithContext } = data;
// Both arrays are the same length, so we can zip them together for easier processing
zippedChangeSets = termObjectChangeSets.map((o, i) => ({
original: o,
withContext: termObjectChangeSetsWithContext[i]
}));
console.log(`Received ${zippedChangeSets.length} change sets`)
for (let { original, withContext } of zippedChangeSets) {
let originalDeletes, originalInserts, insertsWithContext, deletesWithContext;
try {
originalInserts = original.inserts.map(o => `${o.subject} ${o.predicate} ${o.object}.`);
originalDeletes = original.deletes.map(o => `${o.subject} ${o.predicate} ${o.object}.`);
} catch (e) {
console.log(`Error while processing change set: ${e}`);
console.log(`Original change set: ${JSON.stringify(original)}`);
throw e;
}
// Extra context needed for mapping from DL to OP model and filtering based on type.
try {
insertsWithContext = withContext.inserts.map(o => `${o.subject} ${o.predicate} ${o.object}.`);
deletesWithContext = withContext.deletes.map(o => `${o.subject} ${o.predicate} ${o.object}.`);
} catch (e) {
console.log(`Error while processing change set with context: ${e}`);
console.log(`Change set with context: ${JSON.stringify(withContext)}`);
throw e;
}
if (originalDeletes.length) {
// Map main deletes from DL to OP model
const transformedMainDeletes = await transformStatements(fetch, deletesWithContext, MAIN_INFO_MAPPING);
if (!transformedMainDeletes.length) {
console.log(`Warn: Delete main statements mapped to empty result.`);
console.log(`Input: ${deletesWithContext}`);
console.log(`Output: ${transformedMainDeletes}`);
} else {
await deleteFromTargetGraph(lib, transformedMainDeletes);
}
// Map private deletes from DL to OP model
const transformedPrivateDeletes = await transformStatements(fetch, deletesWithContext, PRIVATE_INFO_MAPPING);
if (!transformedPrivateDeletes.length) {
console.log(`Warn: Delete private statements mapped to empty result.`);
console.log(`Input: ${deletesWithContext}`);
console.log(`Output: ${transformedPrivateDeletes}`);
} else {
await deleteFromPrivateGraph(lib, transformedPrivateDeletes);
}
}
if (originalInserts.length) {
// Map main inserts from DL to OP model
const transformedMainInserts = await transformStatements(fetch, insertsWithContext, MAIN_INFO_MAPPING);
if (!transformedMainInserts.length) {
console.log(`Warn: Insert statements mapped to empty result.`);
console.log(`Input: ${insertsWithContext}`);
console.log(`Output: ${transformedMainInserts}`);
} else {
await insertIntoTargetGraph(lib, transformedMainInserts);
}
// Map private inserts from DL to OP model
const transformedPrivateInserts = await transformStatements(fetch, insertsWithContext, PRIVATE_INFO_MAPPING);
if (!transformedPrivateInserts.length) {
console.log(`Warn: Insert statements mapped to empty result.`);
console.log(`Input: ${insertsWithContext}`);
console.log(`Output: ${transformedPrivateInserts}`);
} else {
await insertIntoPrivateGraph(lib, transformedPrivateInserts);
}
}
}
}
module.exports = {
dispatch
};

View File

@@ -0,0 +1,106 @@
const { batchedDbUpdate, transformLandingZoneGraph } = require('./util');
const {
BYPASS_MU_AUTH_FOR_EXPENSIVE_QUERIES,
DIRECT_DATABASE_ENDPOINT,
MU_CALL_SCOPE_ID_INITIAL_SYNC,
BATCH_SIZE,
MAX_DB_RETRY_ATTEMPTS,
SLEEP_BETWEEN_BATCHES,
SLEEP_TIME_AFTER_FAILED_DB_OPERATION,
TARGET_GRAPH,
PRIVACY_SENSITIVE_GRAPH,
LANDING_ZONE_GRAPH,
LANDING_ZONE_DATABASE_ENDPOINT,
MAIN_INFO_MAPPING,
PRIVATE_INFO_MAPPING
} = require('./config');
const endpoint = BYPASS_MU_AUTH_FOR_EXPENSIVE_QUERIES ? DIRECT_DATABASE_ENDPOINT : process.env.MU_SPARQL_ENDPOINT;
/**
* Dispatch the fetched information to a target graph.
* @param { mu, muAuthSudo } lib - The provided libraries from the host service.
* @param { termObjects } data - The fetched quad information, which objects of serialized Terms
* [ {
* graph: "<http://foo>",
* subject: "<http://bar>",
* predicate: "<http://baz>",
* object: "<http://boom>^^<http://datatype>"
* }
* ]
* @return {void} Nothing
*/
async function dispatch(lib, data) {
const { mu, muAuthSudo } = lib;
const { termObjects } = data;
// Steps:
// 1. Write the triples to the landing zone graph - withouth any mapping or filtering
// 2. One-time reasoning run with the full landing zone graph and write the results to the target graph (on-finish)
if (BYPASS_MU_AUTH_FOR_EXPENSIVE_QUERIES) {
console.warn(`Service configured to skip MU_AUTH!`);
}
console.log(`Using ${endpoint} to insert triples`);
if (termObjects.length) {
const originalInsertTriples = termObjects.map(o => `${o.subject} ${o.predicate} ${o.object}.`);
await batchedDbUpdate(
muAuthSudo.updateSudo,
LANDING_ZONE_GRAPH,
originalInsertTriples,
{ 'mu-call-scope-id': MU_CALL_SCOPE_ID_INITIAL_SYNC },
LANDING_ZONE_DATABASE_ENDPOINT,
BATCH_SIZE,
MAX_DB_RETRY_ATTEMPTS,
SLEEP_BETWEEN_BATCHES,
SLEEP_TIME_AFTER_FAILED_DB_OPERATION
);
}
}
async function onFinishInitialIngest(lib) {
const { muAuthSudo, fetch } = lib;
console.log(`!! On-finish triggered !!`);
const transformedMainInsertTriples = await transformLandingZoneGraph(fetch, endpoint, MAIN_INFO_MAPPING);
console.log(`Transformed ${transformedMainInsertTriples.length} main triples`);
if (transformedMainInsertTriples.length) {
await batchedDbUpdate(
muAuthSudo.updateSudo,
TARGET_GRAPH,
transformedMainInsertTriples,
{ 'mu-call-scope-id': MU_CALL_SCOPE_ID_INITIAL_SYNC },
endpoint,
BATCH_SIZE,
MAX_DB_RETRY_ATTEMPTS,
SLEEP_BETWEEN_BATCHES,
SLEEP_TIME_AFTER_FAILED_DB_OPERATION
);
}
const transformedPrivateInsertTriples = await transformLandingZoneGraph(fetch, endpoint, PRIVATE_INFO_MAPPING);
console.log(`Transformed ${transformedPrivateInsertTriples.length} private triples`);
if (transformedPrivateInsertTriples.length) {
await batchedDbUpdate(
muAuthSudo.updateSudo,
PRIVACY_SENSITIVE_GRAPH,
transformedPrivateInsertTriples,
{ 'mu-call-scope-id': MU_CALL_SCOPE_ID_INITIAL_SYNC },
endpoint,
BATCH_SIZE,
MAX_DB_RETRY_ATTEMPTS,
SLEEP_BETWEEN_BATCHES,
SLEEP_TIME_AFTER_FAILED_DB_OPERATION
);
}
}
module.exports = {
dispatch,
onFinishInitialIngest
};

View File

@@ -0,0 +1,204 @@
const {
MAX_REASONING_RETRY_ATTEMPTS,
SLEEP_TIME_AFTER_FAILED_REASONING_OPERATION,
MAX_DB_RETRY_ATTEMPTS,
SLEEP_BETWEEN_BATCHES,
SLEEP_TIME_AFTER_FAILED_DB_OPERATION,
TARGET_GRAPH,
PRIVACY_SENSITIVE_GRAPH,
LANDING_ZONE_GRAPH,
BATCH_SIZE
} = require('./config');
async function batchedDbUpdate(
muUpdate,
graph,
triples,
extraHeaders,
endpoint,
batchSize,
maxAttempts,
sleepBetweenBatches = 1000,
sleepTimeOnFail = 1000,
operation = 'INSERT'
) {
for (let i = 0; i < triples.length; i += batchSize) {
console.log(`Inserting triples in batch: ${i}-${i + batchSize}`);
const batch = triples.slice(i, i + batchSize).join('\n');
const insertCall = async () => {
await muUpdate(`
${operation} DATA {
GRAPH <${graph}> {
${batch}
}
}
`, extraHeaders, endpoint);
};
await operationWithRetry(insertCall, 0, maxAttempts, sleepTimeOnFail);
console.log(`Sleeping before next query execution: ${sleepBetweenBatches}`);
await new Promise(r => setTimeout(r, sleepBetweenBatches));
}
}
async function operationWithRetry(callback,
attempt,
maxAttempts,
sleepTimeOnFail) {
try {
if (typeof callback === "function")
return await callback();
else // Catch error from promise - not how I would do it normally, but allows re use of existing code.
return await callback;
}
catch (e) {
console.log(`Operation failed for ${callback.toString()}, attempt: ${attempt} of ${maxAttempts}`);
console.log(`Error: ${e}`);
console.log(`Sleeping ${sleepTimeOnFail} ms`);
if (attempt >= maxAttempts) {
console.log(`Max attempts reached for ${callback.toString()}, giving up`);
throw e;
}
await new Promise(r => setTimeout(r, sleepTimeOnFail));
return operationWithRetry(callback, ++attempt, maxAttempts, sleepTimeOnFail);
}
}
/**
* Splits an array into two parts, a part that passes and a part that fails a predicate function.
* Credits: https://github.com/benjay10
* @public
* @function partition
* @param {Array} arr - Array to be partitioned
* @param {Function} fn - Function that accepts single argument: an element of the array, and should return a truthy or falsy value.
* @returns {Object} Object that contains keys passes and fails, each representing an array with elemets that pass or fail the predicate respectively
*/
function partition(arr, fn) {
let passes = [], fails = [];
arr.forEach((item) => (fn(item) ? passes : fails).push(item));
return { passes, fails };
}
/**
* Send triples to reasoning service for conversion
*
*/
async function transformTriples(fetch, triples, mapping) {
return await operationWithRetry(mainConversion(fetch, triples, mapping), 0,
MAX_REASONING_RETRY_ATTEMPTS, SLEEP_TIME_AFTER_FAILED_REASONING_OPERATION);
}
async function mainConversion(fetch, triples, mapping) {
let formdata = new URLSearchParams();
formdata.append("data", triples);
let requestOptions = {
method: 'POST',
body: formdata,
redirect: 'follow'
};
const response = await fetch(`http://reasoner/reason/dl2op/${mapping}`, requestOptions)
return await response.text();
}
async function transformStatements(fetch, triples, mapping = 'main') {
console.log(`Received ${JSON.stringify(triples)} to transform`);
const transformedTriples = await transformTriples(fetch, triples.join('\n'), mapping);
statements = transformedTriples ? transformedTriples.replace(/\n{2,}/g, '').split('\n') : [];
console.log(`CONVERSION: FROM ${triples.length} triples to ${statements.length}`);
return statements;
}
async function deleteFromTargetGraph(lib, statements) {
console.log(`Deleting ${statements.length} statements from target graph`);
console.log(`Statements: ${JSON.stringify(statements)}`)
await batchedDbUpdate(
lib.muAuthSudo.updateSudo,
TARGET_GRAPH,
statements,
{},
process.env.MU_SPARQL_ENDPOINT,
BATCH_SIZE,
MAX_DB_RETRY_ATTEMPTS,
SLEEP_BETWEEN_BATCHES,
SLEEP_TIME_AFTER_FAILED_DB_OPERATION,
'DELETE');
}
async function deleteFromPrivateGraph(lib, statements) {
console.log(`Deleting ${statements.length} statements from target graph`);
console.log(`Statements: ${JSON.stringify(statements)}`)
await batchedDbUpdate(
lib.muAuthSudo.updateSudo,
PRIVACY_SENSITIVE_GRAPH,
statements,
{},
process.env.MU_SPARQL_ENDPOINT,
BATCH_SIZE,
MAX_DB_RETRY_ATTEMPTS,
SLEEP_BETWEEN_BATCHES,
SLEEP_TIME_AFTER_FAILED_DB_OPERATION,
'DELETE');
}
async function insertIntoTargetGraph(lib, statements) {
console.log(`Inserting ${statements.length} statements into target graph`);
console.log(`Statements: ${JSON.stringify(statements)}`)
await batchedDbUpdate(
lib.muAuthSudo.updateSudo,
TARGET_GRAPH,
statements,
{},
process.env.MU_SPARQL_ENDPOINT,
BATCH_SIZE,
MAX_DB_RETRY_ATTEMPTS,
SLEEP_BETWEEN_BATCHES,
SLEEP_TIME_AFTER_FAILED_DB_OPERATION,
'INSERT');
}
async function insertIntoPrivateGraph(lib, statements) {
console.log(`Inserting ${statements.length} statements into target graph`);
console.log(`Statements: ${JSON.stringify(statements)}`)
await batchedDbUpdate(
lib.muAuthSudo.updateSudo,
PRIVACY_SENSITIVE_GRAPH,
statements,
{},
process.env.MU_SPARQL_ENDPOINT,
BATCH_SIZE,
MAX_DB_RETRY_ATTEMPTS,
SLEEP_BETWEEN_BATCHES,
SLEEP_TIME_AFTER_FAILED_DB_OPERATION,
'INSERT');
}
async function transformLandingZoneGraph(fetch, endpoint, mapping = 'main') {
console.log(`Transforming landing zone graph: ${LANDING_ZONE_GRAPH}`);
const response = await fetch(`http://reasoner/reason/dl2op/${mapping}?data=${encodeURIComponent(`${endpoint}?default-graph-uri=&query=CONSTRUCT+%7B%0D%0A%3Fs+%3Fp+%3Fo%0D%0A%7D+WHERE+%7B%0D%0A+GRAPH+<${LANDING_ZONE_GRAPH}>+%7B%0D%0A%3Fs+%3Fp+%3Fo%0D%0A%7D%0D%0A%7D&should-sponge=&format=text%2Fplain&timeout=0&run=+Run+Query`)}`);
const text = await response.text();
const statements = text.replace(/\n{2,}/g, '').split('\n');
return statements;
}
module.exports = {
batchedDbUpdate,
partition,
transformStatements,
transformLandingZoneGraph,
deleteFromTargetGraph,
insertIntoTargetGraph,
deleteFromPrivateGraph,
insertIntoPrivateGraph
};

View File

@@ -0,0 +1,2 @@
http://mu.semte.ch/graphs/public

View File

@@ -0,0 +1,26 @@
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .
<http://data.vlaanderen.be/id/concept/BestuurseenheidClassificatieCode/80310756-ce0a-4a1b-9b8e-7c01b6cc7a2d>
rdf:type <http://mu.semte.ch/vocabularies/ext/BestuurseenheidClassificatieCode> , skos:Concept ;
<http://mu.semte.ch/vocabularies/core/uuid> "80310756-ce0a-4a1b-9b8e-7c01b6cc7a2d" ;
skos:topConceptOf <https://data.vlaanderen.be/id/conceptscheme/BestuurseenheidClassificatieCode> ;
skos:prefLabel "Autonoom provinciebedrijf" ;
skos:inScheme <https://data.vlaanderen.be/id/conceptscheme/BestuurseenheidClassificatieCode> ;
<http://schema.org/publication> <http://lblod.data.gift/concepts/83f7b480-fcaf-4795-b603-7f3bce489325> .
<http://data.vlaanderen.be/id/concept/BestuurseenheidClassificatieCode/36a82ba0-7ff1-4697-a9dd-2e94df73b721>
rdf:type <http://mu.semte.ch/vocabularies/ext/BestuurseenheidClassificatieCode> , skos:Concept ;
<http://mu.semte.ch/vocabularies/core/uuid> "36a82ba0-7ff1-4697-a9dd-2e94df73b721" ;
skos:topConceptOf <https://data.vlaanderen.be/id/conceptscheme/BestuurseenheidClassificatieCode> ;
skos:prefLabel "Autonoom gemeentebedrijf" ;
skos:inScheme <https://data.vlaanderen.be/id/conceptscheme/BestuurseenheidClassificatieCode> ;
<http://schema.org/publication> <http://lblod.data.gift/concepts/83f7b480-fcaf-4795-b603-7f3bce489325> .
<http://lblod.data.gift/concepts/dcc01338-842c-4fbd-ba68-3ca6f3af975c> a <http://lblod.data.gift/vocabularies/organisatie/TypeVestiging>;
<http://mu.semte.ch/vocabularies/core/uuid> "dcc01338-842c-4fbd-ba68-3ca6f3af975c";
<http://www.w3.org/2004/02/skos/core#prefLabel> "Correspondentieadres";
<http://www.w3.org/2004/02/skos/core#inScheme> <http://lblod.data.gift/concept-schemes/f8319ccf40fc2a1697edc5cf7e03018f>;
<http://www.w3.org/2004/02/skos/core#inScheme> <http://lblod.data.gift/concept-schemes/10caf4a4-1ff5-4c05-917e-56489910d68b>;
<http://www.w3.org/2004/02/skos/core#topConceptOf> <http://lblod.data.gift/concept-schemes/f8319ccf40fc2a1697edc5cf7e03018f>.

View File

@@ -0,0 +1,2 @@
http://mu.semte.ch/graphs/public

View File

@@ -0,0 +1,31 @@
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .
<http://lblod.data.gift/concepts/b85363df-b598-4a21-b8ae-0dea78db73cb>
rdf:type <http://lblod.data.gift/vocabularies/organisatie/Veranderingsgebeurtenis> ;
<http://mu.semte.ch/vocabularies/core/uuid> "b85363df-b598-4a21-b8ae-0dea78db73cb" ;
skos:prefLabel "In ontbinding" ;
skos:inScheme <http://lblod.data.gift/concept-schemes/e1ff33ee76b5662ec8486f0e2abec384> , <http://lblod.data.gift/concept-schemes/10caf4a4-1ff5-4c05-917e-56489910d68b> ;
skos:topConceptOf <http://lblod.data.gift/concept-schemes/e1ff33ee76b5662ec8486f0e2abec384> .
<http://lblod.data.gift/concepts/e8dc166e-4769-4f28-bcf8-af2fb8cb7d15>
rdf:type <http://lblod.data.gift/vocabularies/organisatie/Veranderingsgebeurtenis> ;
<http://mu.semte.ch/vocabularies/core/uuid> "e8dc166e-4769-4f28-bcf8-af2fb8cb7d15" ;
skos:prefLabel "In vereffening" ;
skos:inScheme <http://lblod.data.gift/concept-schemes/e1ff33ee76b5662ec8486f0e2abec384> , <http://lblod.data.gift/concept-schemes/10caf4a4-1ff5-4c05-917e-56489910d68b> ;
skos:topConceptOf <http://lblod.data.gift/concept-schemes/e1ff33ee76b5662ec8486f0e2abec384> .
<http://lblod.data.gift/concepts/b5f471a8-eb2e-4ec3-9f84-2c179134e2be>
rdf:type <http://lblod.data.gift/vocabularies/organisatie/Veranderingsgebeurtenis> ;
<http://mu.semte.ch/vocabularies/core/uuid> "b5f471a8-eb2e-4ec3-9f84-2c179134e2be" ;
skos:prefLabel "Ontbonden en vereffend" ;
skos:inScheme <http://lblod.data.gift/concept-schemes/e1ff33ee76b5662ec8486f0e2abec384> , <http://lblod.data.gift/concept-schemes/10caf4a4-1ff5-4c05-917e-56489910d68b> ;
skos:topConceptOf <http://lblod.data.gift/concept-schemes/e1ff33ee76b5662ec8486f0e2abec384> .
<http://lblod.data.gift/concepts/f0e2706a-3b64-4464-ad9c-4e65dc976288>
rdf:type <http://lblod.data.gift/vocabularies/organisatie/Veranderingsgebeurtenis> ;
<http://mu.semte.ch/vocabularies/core/uuid> "f0e2706a-3b64-4464-ad9c-4e65dc976288" ;
skos:prefLabel "Oprichting" ;
skos:inScheme <http://lblod.data.gift/concept-schemes/e1ff33ee76b5662ec8486f0e2abec384> , <http://lblod.data.gift/concept-schemes/10caf4a4-1ff5-4c05-917e-56489910d68b> ;
skos:topConceptOf <http://lblod.data.gift/concept-schemes/e1ff33ee76b5662ec8486f0e2abec384> .

View File

@@ -0,0 +1,27 @@
# AGB AG2B has been added in Loket in the meantime. I'm adapting to Loket's URI
DELETE {
GRAPH ?g {
<http://data.lblod.info/id/bestuurseenheden/a7aaef2f-6e8f-4351-9303-bdc4288bc6f0> ?p ?o .
}
} INSERT {
GRAPH ?g {
<http://data.lblod.info/id/bestuurseenheden/e0920e46-85b9-4736-a906-b254cc7f1855> ?p ?o .
}
} WHERE {
GRAPH ?g {
<http://data.lblod.info/id/bestuurseenheden/a7aaef2f-6e8f-4351-9303-bdc4288bc6f0> ?p ?o .
}
}
;
DELETE DATA {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
<http://data.lblod.info/id/bestuurseenheden/e0920e46-85b9-4736-a906-b254cc7f1855> <http://mu.semte.ch/vocabularies/core/uuid> "a7aaef2f-6e8f-4351-9303-bdc4288bc6f0" .
}
}
;
INSERT DATA {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
<http://data.lblod.info/id/bestuurseenheden/e0920e46-85b9-4736-a906-b254cc7f1855> <http://mu.semte.ch/vocabularies/core/uuid> "e0920e46-85b9-4736-a906-b254cc7f1855" .
}
}

View File

@@ -0,0 +1,301 @@
# Classification Raad van bestuur
INSERT {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
?orgaanInTime a <http://data.vlaanderen.be/ns/besluit#Bestuursorgaan> ;
<http://mu.semte.ch/vocabularies/core/uuid> ?uuidOrgaanInTime ;
<https://data.vlaanderen.be/ns/generiek#isTijdspecialisatieVan> ?orgaan ;
<http://data.vlaanderen.be/ns/mandaat#bindingStart> "2019-01-01T00:00:00"^^xsd:dateTime .
?orgaan a <http://data.vlaanderen.be/ns/besluit#Bestuursorgaan> ;
<http://mu.semte.ch/vocabularies/core/uuid> ?uuidOrgaan ;
<http://www.w3.org/2004/02/skos/core#prefLabel> ?orgaanLabel ;
<http://www.w3.org/ns/org#classification> ?classificationOrgaan ;
<http://data.vlaanderen.be/ns/besluit#bestuurt> ?bestuurseenheid .
}
} WHERE {
VALUES ?classificationBestuurseenheid {
<http://data.vlaanderen.be/id/concept/BestuurseenheidClassificatieCode/36a82ba0-7ff1-4697-a9dd-2e94df73b721>
<http://data.vlaanderen.be/id/concept/BestuurseenheidClassificatieCode/80310756-ce0a-4a1b-9b8e-7c01b6cc7a2d>
}
VALUES ?classificationOrgaan {
<http://data.vlaanderen.be/id/concept/BestuursorgaanClassificatieCode/013cc838-173a-4657-b1ae-b00c048df943>
}
VALUES ?bestuurseenheid {
<http://data.lblod.info/id/bestuurseenheden/e0d71bad-4684-4796-9f76-c3babb972a0f>
<http://data.lblod.info/id/bestuurseenheden/cec30867-e378-4e86-9568-1efebb6ccd7d>
<http://data.lblod.info/id/bestuurseenheden/b206763c-d8d2-45bd-ba1b-b5462bdd823c>
<http://data.lblod.info/id/bestuurseenheden/70285c2d-2045-414e-bd49-56155a736e56>
<http://data.lblod.info/id/bestuurseenheden/2908c8ed-0f67-44c0-b69e-5a8b07238d15>
<http://data.lblod.info/id/bestuurseenheden/f4228a39-de89-4a50-925f-d5d8d5109e79>
<http://data.lblod.info/id/bestuurseenheden/8d6609b4-1a20-46b8-97ed-150c6d53acd6>
<http://data.lblod.info/id/bestuurseenheden/b25f4408-0b7c-46d0-a234-0936cac4eb7c>
<http://data.lblod.info/id/bestuurseenheden/b81fdc5f-d1ba-49f2-831f-ed549ad94394>
<http://data.lblod.info/id/bestuurseenheden/3deaa042-58f3-474f-abc2-9cb3e15f4221>
<http://data.lblod.info/id/bestuurseenheden/863673c6-7bc9-4bbd-a42a-9ef1d2dc4c05>
<http://data.lblod.info/id/bestuurseenheden/e0920e46-85b9-4736-a906-b254cc7f1855>
<http://data.lblod.info/id/bestuurseenheden/99509194-025b-4292-9add-aa98b4867350>
<http://data.lblod.info/id/bestuurseenheden/6479BE11E20833AEA681F731>
<http://data.lblod.info/id/bestuurseenheden/648C3D65190444E254CA3901>
<http://data.lblod.info/id/bestuurseenheden/648C4C67190444E254CA390E>
<http://data.lblod.info/id/bestuurseenheden/6479B935E20833AEA681F719>
<http://data.lblod.info/id/bestuurseenheden/5c6ab343-3405-475d-a184-d44bbe7e787a>
<http://data.lblod.info/id/bestuurseenheden/646DCAC8E20833AEA681F608>
<http://data.lblod.info/id/bestuurseenheden/648C3BB7190444E254CA38F4>
<http://data.lblod.info/id/bestuurseenheden/646F2BB5E20833AEA681F62C>
<http://data.lblod.info/id/bestuurseenheden/8e448f7f-5a1d-44b0-a99d-274b2cc66f58>
<http://data.lblod.info/id/bestuurseenheden/5202c9ba-40fb-44e2-8116-6eceadc1e60a>
<http://data.lblod.info/id/bestuurseenheden/6478831EE20833AEA681F690>
<http://data.lblod.info/id/bestuurseenheden/646F25AEE20833AEA681F61A>
<http://data.lblod.info/id/bestuurseenheden/646F2609E20833AEA681F623>
<http://data.lblod.info/id/bestuurseenheden/6488403F190444E254CA3891>
<http://data.lblod.info/id/bestuurseenheden/648C3B22190444E254CA38EB>
<http://data.lblod.info/id/bestuurseenheden/646F2295E20833AEA681F611>
<http://data.lblod.info/id/bestuurseenheden/6479B670E20833AEA681F702>
<http://data.lblod.info/id/bestuurseenheden/6488488C190444E254CA38A5>
<http://data.lblod.info/id/bestuurseenheden/648841E2190444E254CA389A>
}
?bestuurseenheid a <http://data.vlaanderen.be/ns/besluit#Bestuurseenheid> ;
skos:prefLabel ?bestuurseenheidLabel .
?classificationOrgaan skos:prefLabel ?classificationOrgaanLabel .
BIND(CONCAT(?bestuurseenheidLabel, " Leidend ambtenaar") as ?functieLabel)
BIND(CONCAT(?classificationOrgaanLabel, " ", ?bestuurseenheidLabel) as ?orgaanLabel)
BIND(MD5(CONCAT(?bestuurseenheid, ?classificationOrgaan, "orgaanInTime")) as ?uuidOrgaanInTime)
BIND(MD5(CONCAT(?bestuurseenheid, ?classificationOrgaan, "orgaan")) as ?uuidOrgaan)
BIND(IRI(CONCAT("http://data.lblod.info/id/bestuursorganen/", ?uuidOrgaanInTime)) AS ?orgaanInTime)
BIND(IRI(CONCAT("http://data.lblod.info/id/bestuursorganen/", ?uuidOrgaan)) AS ?orgaan)
}
;
# Classification Bevoegd beslissingsorgaan
INSERT {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
?orgaanInTime a <http://data.vlaanderen.be/ns/besluit#Bestuursorgaan> ;
<http://mu.semte.ch/vocabularies/core/uuid> ?uuidOrgaanInTime ;
<https://data.vlaanderen.be/ns/generiek#isTijdspecialisatieVan> ?orgaan ;
<http://data.vlaanderen.be/ns/mandaat#bindingStart> "2019-01-01T00:00:00"^^xsd:dateTime .
?orgaan a <http://data.vlaanderen.be/ns/besluit#Bestuursorgaan> ;
<http://mu.semte.ch/vocabularies/core/uuid> ?uuidOrgaan ;
<http://www.w3.org/2004/02/skos/core#prefLabel> ?orgaanLabel ;
<http://www.w3.org/ns/org#classification> ?classificationOrgaan ;
<http://data.vlaanderen.be/ns/besluit#bestuurt> ?bestuurseenheid .
}
} WHERE {
VALUES ?classificationBestuurseenheid {
<http://data.vlaanderen.be/id/concept/BestuurseenheidClassificatieCode/36a82ba0-7ff1-4697-a9dd-2e94df73b721>
<http://data.vlaanderen.be/id/concept/BestuurseenheidClassificatieCode/80310756-ce0a-4a1b-9b8e-7c01b6cc7a2d>
}
VALUES ?classificationOrgaan {
<http://data.vlaanderen.be/id/concept/BestuursorgaanClassificatieCode/0dbc70ec-6be9-4997-b8e1-11b6c0542382>
}
VALUES ?bestuurseenheid {
<http://data.lblod.info/id/bestuurseenheden/e0d71bad-4684-4796-9f76-c3babb972a0f>
<http://data.lblod.info/id/bestuurseenheden/cec30867-e378-4e86-9568-1efebb6ccd7d>
<http://data.lblod.info/id/bestuurseenheden/b206763c-d8d2-45bd-ba1b-b5462bdd823c>
<http://data.lblod.info/id/bestuurseenheden/70285c2d-2045-414e-bd49-56155a736e56>
<http://data.lblod.info/id/bestuurseenheden/2908c8ed-0f67-44c0-b69e-5a8b07238d15>
<http://data.lblod.info/id/bestuurseenheden/f4228a39-de89-4a50-925f-d5d8d5109e79>
<http://data.lblod.info/id/bestuurseenheden/8d6609b4-1a20-46b8-97ed-150c6d53acd6>
<http://data.lblod.info/id/bestuurseenheden/b25f4408-0b7c-46d0-a234-0936cac4eb7c>
<http://data.lblod.info/id/bestuurseenheden/b81fdc5f-d1ba-49f2-831f-ed549ad94394>
<http://data.lblod.info/id/bestuurseenheden/3deaa042-58f3-474f-abc2-9cb3e15f4221>
<http://data.lblod.info/id/bestuurseenheden/863673c6-7bc9-4bbd-a42a-9ef1d2dc4c05>
<http://data.lblod.info/id/bestuurseenheden/e0920e46-85b9-4736-a906-b254cc7f1855>
<http://data.lblod.info/id/bestuurseenheden/99509194-025b-4292-9add-aa98b4867350>
<http://data.lblod.info/id/bestuurseenheden/6479BE11E20833AEA681F731>
<http://data.lblod.info/id/bestuurseenheden/648C3D65190444E254CA3901>
<http://data.lblod.info/id/bestuurseenheden/648C4C67190444E254CA390E>
<http://data.lblod.info/id/bestuurseenheden/6479B935E20833AEA681F719>
<http://data.lblod.info/id/bestuurseenheden/5c6ab343-3405-475d-a184-d44bbe7e787a>
<http://data.lblod.info/id/bestuurseenheden/646DCAC8E20833AEA681F608>
<http://data.lblod.info/id/bestuurseenheden/648C3BB7190444E254CA38F4>
<http://data.lblod.info/id/bestuurseenheden/646F2BB5E20833AEA681F62C>
<http://data.lblod.info/id/bestuurseenheden/8e448f7f-5a1d-44b0-a99d-274b2cc66f58>
<http://data.lblod.info/id/bestuurseenheden/5202c9ba-40fb-44e2-8116-6eceadc1e60a>
<http://data.lblod.info/id/bestuurseenheden/6478831EE20833AEA681F690>
<http://data.lblod.info/id/bestuurseenheden/646F25AEE20833AEA681F61A>
<http://data.lblod.info/id/bestuurseenheden/646F2609E20833AEA681F623>
<http://data.lblod.info/id/bestuurseenheden/6488403F190444E254CA3891>
<http://data.lblod.info/id/bestuurseenheden/648C3B22190444E254CA38EB>
<http://data.lblod.info/id/bestuurseenheden/646F2295E20833AEA681F611>
<http://data.lblod.info/id/bestuurseenheden/6479B670E20833AEA681F702>
<http://data.lblod.info/id/bestuurseenheden/6488488C190444E254CA38A5>
<http://data.lblod.info/id/bestuurseenheden/648841E2190444E254CA389A>
}
?bestuurseenheid a <http://data.vlaanderen.be/ns/besluit#Bestuurseenheid> ;
skos:prefLabel ?bestuurseenheidLabel .
?classificationOrgaan skos:prefLabel ?classificationOrgaanLabel .
BIND(CONCAT(?bestuurseenheidLabel, " Leidend ambtenaar") as ?functieLabel)
BIND(CONCAT(?classificationOrgaanLabel, " ", ?bestuurseenheidLabel) as ?orgaanLabel)
BIND(MD5(CONCAT(?bestuurseenheid, ?classificationOrgaan, "orgaanInTime")) as ?uuidOrgaanInTime)
BIND(MD5(CONCAT(?bestuurseenheid, ?classificationOrgaan, "orgaan")) as ?uuidOrgaan)
BIND(IRI(CONCAT("http://data.lblod.info/id/bestuursorganen/", ?uuidOrgaanInTime)) AS ?orgaanInTime)
BIND(IRI(CONCAT("http://data.lblod.info/id/bestuursorganen/", ?uuidOrgaan)) AS ?orgaan)
}
;
# Classification Algemene vergadering
INSERT {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
?orgaanInTime a <http://data.vlaanderen.be/ns/besluit#Bestuursorgaan> ;
<http://mu.semte.ch/vocabularies/core/uuid> ?uuidOrgaanInTime ;
<https://data.vlaanderen.be/ns/generiek#isTijdspecialisatieVan> ?orgaan ;
<http://data.vlaanderen.be/ns/mandaat#bindingStart> "2019-01-01T00:00:00"^^xsd:dateTime .
?orgaan a <http://data.vlaanderen.be/ns/besluit#Bestuursorgaan> ;
<http://mu.semte.ch/vocabularies/core/uuid> ?uuidOrgaan ;
<http://www.w3.org/2004/02/skos/core#prefLabel> ?orgaanLabel ;
<http://www.w3.org/ns/org#classification> ?classificationOrgaan ;
<http://data.vlaanderen.be/ns/besluit#bestuurt> ?bestuurseenheid .
}
} WHERE {
VALUES ?classificationBestuurseenheid {
<http://data.vlaanderen.be/id/concept/BestuurseenheidClassificatieCode/36a82ba0-7ff1-4697-a9dd-2e94df73b721>
<http://data.vlaanderen.be/id/concept/BestuurseenheidClassificatieCode/80310756-ce0a-4a1b-9b8e-7c01b6cc7a2d>
}
VALUES ?classificationOrgaan {
<http://data.vlaanderen.be/id/concept/BestuursorgaanClassificatieCode/b52094ff-21a2-4da8-8dbe-f513365d1528>
}
VALUES ?bestuurseenheid {
<http://data.lblod.info/id/bestuurseenheden/e0d71bad-4684-4796-9f76-c3babb972a0f>
<http://data.lblod.info/id/bestuurseenheden/cec30867-e378-4e86-9568-1efebb6ccd7d>
<http://data.lblod.info/id/bestuurseenheden/b206763c-d8d2-45bd-ba1b-b5462bdd823c>
<http://data.lblod.info/id/bestuurseenheden/70285c2d-2045-414e-bd49-56155a736e56>
<http://data.lblod.info/id/bestuurseenheden/2908c8ed-0f67-44c0-b69e-5a8b07238d15>
<http://data.lblod.info/id/bestuurseenheden/f4228a39-de89-4a50-925f-d5d8d5109e79>
<http://data.lblod.info/id/bestuurseenheden/8d6609b4-1a20-46b8-97ed-150c6d53acd6>
<http://data.lblod.info/id/bestuurseenheden/b25f4408-0b7c-46d0-a234-0936cac4eb7c>
<http://data.lblod.info/id/bestuurseenheden/b81fdc5f-d1ba-49f2-831f-ed549ad94394>
<http://data.lblod.info/id/bestuurseenheden/3deaa042-58f3-474f-abc2-9cb3e15f4221>
<http://data.lblod.info/id/bestuurseenheden/863673c6-7bc9-4bbd-a42a-9ef1d2dc4c05>
<http://data.lblod.info/id/bestuurseenheden/e0920e46-85b9-4736-a906-b254cc7f1855>
<http://data.lblod.info/id/bestuurseenheden/99509194-025b-4292-9add-aa98b4867350>
<http://data.lblod.info/id/bestuurseenheden/6479BE11E20833AEA681F731>
<http://data.lblod.info/id/bestuurseenheden/648C3D65190444E254CA3901>
<http://data.lblod.info/id/bestuurseenheden/648C4C67190444E254CA390E>
<http://data.lblod.info/id/bestuurseenheden/6479B935E20833AEA681F719>
<http://data.lblod.info/id/bestuurseenheden/5c6ab343-3405-475d-a184-d44bbe7e787a>
<http://data.lblod.info/id/bestuurseenheden/646DCAC8E20833AEA681F608>
<http://data.lblod.info/id/bestuurseenheden/648C3BB7190444E254CA38F4>
<http://data.lblod.info/id/bestuurseenheden/646F2BB5E20833AEA681F62C>
<http://data.lblod.info/id/bestuurseenheden/8e448f7f-5a1d-44b0-a99d-274b2cc66f58>
<http://data.lblod.info/id/bestuurseenheden/5202c9ba-40fb-44e2-8116-6eceadc1e60a>
<http://data.lblod.info/id/bestuurseenheden/6478831EE20833AEA681F690>
<http://data.lblod.info/id/bestuurseenheden/646F25AEE20833AEA681F61A>
<http://data.lblod.info/id/bestuurseenheden/646F2609E20833AEA681F623>
<http://data.lblod.info/id/bestuurseenheden/6488403F190444E254CA3891>
<http://data.lblod.info/id/bestuurseenheden/648C3B22190444E254CA38EB>
<http://data.lblod.info/id/bestuurseenheden/646F2295E20833AEA681F611>
<http://data.lblod.info/id/bestuurseenheden/6479B670E20833AEA681F702>
<http://data.lblod.info/id/bestuurseenheden/6488488C190444E254CA38A5>
<http://data.lblod.info/id/bestuurseenheden/648841E2190444E254CA389A>
}
?bestuurseenheid a <http://data.vlaanderen.be/ns/besluit#Bestuurseenheid> ;
skos:prefLabel ?bestuurseenheidLabel .
?classificationOrgaan skos:prefLabel ?classificationOrgaanLabel .
BIND(CONCAT(?bestuurseenheidLabel, " Leidend ambtenaar") as ?functieLabel)
BIND(CONCAT(?classificationOrgaanLabel, " ", ?bestuurseenheidLabel) as ?orgaanLabel)
BIND(MD5(CONCAT(?bestuurseenheid, ?classificationOrgaan, "orgaanInTime")) as ?uuidOrgaanInTime)
BIND(MD5(CONCAT(?bestuurseenheid, ?classificationOrgaan, "orgaan")) as ?uuidOrgaan)
BIND(IRI(CONCAT("http://data.lblod.info/id/bestuursorganen/", ?uuidOrgaanInTime)) AS ?orgaanInTime)
BIND(IRI(CONCAT("http://data.lblod.info/id/bestuursorganen/", ?uuidOrgaan)) AS ?orgaan)
}
;
# Classification Leidend Ambtenaar
INSERT {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
?orgaanInTime a <http://data.vlaanderen.be/ns/besluit#Bestuursorgaan> ;
<http://mu.semte.ch/vocabularies/core/uuid> ?uuidOrgaanInTime ;
<https://data.vlaanderen.be/ns/generiek#isTijdspecialisatieVan> ?orgaan ;
<http://data.vlaanderen.be/ns/mandaat#bindingStart> "2019-01-01T00:00:00"^^xsd:dateTime .
?orgaan a <http://data.vlaanderen.be/ns/besluit#Bestuursorgaan> ;
<http://mu.semte.ch/vocabularies/core/uuid> ?uuidOrgaan ;
<http://www.w3.org/2004/02/skos/core#prefLabel> ?orgaanLabel ;
<http://www.w3.org/ns/org#classification> ?classificationOrgaan ;
<http://data.vlaanderen.be/ns/besluit#bestuurt> ?bestuurseenheid .
}
} WHERE {
VALUES ?classificationBestuurseenheid {
<http://data.vlaanderen.be/id/concept/BestuurseenheidClassificatieCode/36a82ba0-7ff1-4697-a9dd-2e94df73b721>
<http://data.vlaanderen.be/id/concept/BestuurseenheidClassificatieCode/80310756-ce0a-4a1b-9b8e-7c01b6cc7a2d>
}
VALUES ?classificationOrgaan {
<http://data.vlaanderen.be/id/concept/BestuursorgaanClassificatieCode/41caf7e6-b040-4720-9cc2-a96cfffed5b4>
}
VALUES ?bestuurseenheid {
<http://data.lblod.info/id/bestuurseenheden/e0d71bad-4684-4796-9f76-c3babb972a0f>
<http://data.lblod.info/id/bestuurseenheden/cec30867-e378-4e86-9568-1efebb6ccd7d>
<http://data.lblod.info/id/bestuurseenheden/b206763c-d8d2-45bd-ba1b-b5462bdd823c>
<http://data.lblod.info/id/bestuurseenheden/70285c2d-2045-414e-bd49-56155a736e56>
<http://data.lblod.info/id/bestuurseenheden/2908c8ed-0f67-44c0-b69e-5a8b07238d15>
<http://data.lblod.info/id/bestuurseenheden/f4228a39-de89-4a50-925f-d5d8d5109e79>
<http://data.lblod.info/id/bestuurseenheden/8d6609b4-1a20-46b8-97ed-150c6d53acd6>
<http://data.lblod.info/id/bestuurseenheden/b25f4408-0b7c-46d0-a234-0936cac4eb7c>
<http://data.lblod.info/id/bestuurseenheden/b81fdc5f-d1ba-49f2-831f-ed549ad94394>
<http://data.lblod.info/id/bestuurseenheden/3deaa042-58f3-474f-abc2-9cb3e15f4221>
<http://data.lblod.info/id/bestuurseenheden/863673c6-7bc9-4bbd-a42a-9ef1d2dc4c05>
<http://data.lblod.info/id/bestuurseenheden/e0920e46-85b9-4736-a906-b254cc7f1855>
<http://data.lblod.info/id/bestuurseenheden/99509194-025b-4292-9add-aa98b4867350>
<http://data.lblod.info/id/bestuurseenheden/6479BE11E20833AEA681F731>
<http://data.lblod.info/id/bestuurseenheden/648C3D65190444E254CA3901>
<http://data.lblod.info/id/bestuurseenheden/648C4C67190444E254CA390E>
<http://data.lblod.info/id/bestuurseenheden/6479B935E20833AEA681F719>
<http://data.lblod.info/id/bestuurseenheden/5c6ab343-3405-475d-a184-d44bbe7e787a>
<http://data.lblod.info/id/bestuurseenheden/646DCAC8E20833AEA681F608>
<http://data.lblod.info/id/bestuurseenheden/648C3BB7190444E254CA38F4>
<http://data.lblod.info/id/bestuurseenheden/646F2BB5E20833AEA681F62C>
<http://data.lblod.info/id/bestuurseenheden/8e448f7f-5a1d-44b0-a99d-274b2cc66f58>
<http://data.lblod.info/id/bestuurseenheden/5202c9ba-40fb-44e2-8116-6eceadc1e60a>
<http://data.lblod.info/id/bestuurseenheden/6478831EE20833AEA681F690>
<http://data.lblod.info/id/bestuurseenheden/646F25AEE20833AEA681F61A>
<http://data.lblod.info/id/bestuurseenheden/646F2609E20833AEA681F623>
<http://data.lblod.info/id/bestuurseenheden/6488403F190444E254CA3891>
<http://data.lblod.info/id/bestuurseenheden/648C3B22190444E254CA38EB>
<http://data.lblod.info/id/bestuurseenheden/646F2295E20833AEA681F611>
<http://data.lblod.info/id/bestuurseenheden/6479B670E20833AEA681F702>
<http://data.lblod.info/id/bestuurseenheden/6488488C190444E254CA38A5>
<http://data.lblod.info/id/bestuurseenheden/648841E2190444E254CA389A>
}
?bestuurseenheid a <http://data.vlaanderen.be/ns/besluit#Bestuurseenheid> ;
skos:prefLabel ?bestuurseenheidLabel .
?classificationOrgaan skos:prefLabel ?classificationOrgaanLabel .
BIND(CONCAT(?bestuurseenheidLabel, " Leidend ambtenaar") as ?functieLabel)
BIND(CONCAT(?classificationOrgaanLabel, " ", ?bestuurseenheidLabel) as ?orgaanLabel)
BIND(MD5(CONCAT(?bestuurseenheid, ?classificationOrgaan, "orgaanInTime")) as ?uuidOrgaanInTime)
BIND(MD5(CONCAT(?bestuurseenheid, ?classificationOrgaan, "orgaan")) as ?uuidOrgaan)
BIND(IRI(CONCAT("http://data.lblod.info/id/bestuursorganen/", ?uuidOrgaanInTime)) AS ?orgaanInTime)
BIND(IRI(CONCAT("http://data.lblod.info/id/bestuursorganen/", ?uuidOrgaan)) AS ?orgaan)
}

View File

@@ -0,0 +1,24 @@
DELETE {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
?orgaanInTime <http://data.vlaanderen.be/ns/mandaat#bindingStart> ?start .
}
} INSERT {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
?orgaanInTime <http://data.vlaanderen.be/ns/mandaat#bindingStart> ?startDateTime .
}
} WHERE {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
VALUES ?classificationBestuurseenheid {
<http://data.vlaanderen.be/id/concept/BestuurseenheidClassificatieCode/36a82ba0-7ff1-4697-a9dd-2e94df73b721>
<http://data.vlaanderen.be/id/concept/BestuurseenheidClassificatieCode/80310756-ce0a-4a1b-9b8e-7c01b6cc7a2d>
}
?orgaanInTime <https://data.vlaanderen.be/ns/generiek#isTijdspecialisatieVan>/<http://data.vlaanderen.be/ns/besluit#bestuurt> ?bestuurseenheid ;
<http://data.vlaanderen.be/ns/mandaat#bindingStart> ?start .
?bestuurseenheid <http://www.w3.org/ns/org#classification> ?classificationBestuurseenheid .
# The hour is arbitrary, but there is a bug in virtuoso when if the time is `T00:00:00` it doesn't apply the type change at all
BIND(IF(strlen(str(?start)) = 10, strdt(concat(str(?start), 'T02:00:00'), xsd:dateTime), ?start) as ?startDateTime)
}
}

View File

@@ -0,0 +1,54 @@
PREFIX adms: <http://www.w3.org/ns/adms#>
PREFIX adres: <https://data.vlaanderen.be/ns/adres#>
PREFIX besluit: <http://data.vlaanderen.be/ns/besluit#>
PREFIX ch: <http://data.lblod.info/vocabularies/contacthub/>
PREFIX code: <http://lblod.data.gift/vocabularies/organisatie/>
PREFIX dbpedia: <http://dbpedia.org/ontology/>
PREFIX dc_terms: <http://purl.org/dc/terms/>
PREFIX ere: <http://data.lblod.info/vocabularies/erediensten/>
PREFIX euro: <http://data.europa.eu/m8g/>
PREFIX euvoc: <http://publications.europa.eu/ontology/euvoc#>
PREFIX ext: <http://mu.semte.ch/vocabularies/ext/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX generiek: <https://data.vlaanderen.be/ns/generiek#>
PREFIX lblodlg: <http://data.lblod.info/vocabularies/leidinggevenden/>
PREFIX locn: <http://www.w3.org/ns/locn#>
PREFIX mandaat: <http://data.vlaanderen.be/ns/mandaat#>
PREFIX org: <http://www.w3.org/ns/org#>
PREFIX organisatie: <https://data.vlaanderen.be/ns/organisatie#>
PREFIX person: <http://www.w3.org/ns/person#>
PREFIX persoon: <https://data.vlaanderen.be/ns/persoon#>
PREFIX prov: <http://www.w3.org/ns/prov#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX regorg: <http://www.w3.org/ns/regorg#>
PREFIX schema: <http://schema.org/>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX vcard: <http://www.w3.org/2006/vcard/ns#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
DELETE {
GRAPH <http://mu.semte.ch/graphs/shared> {
?person
?p ?o
}
} WHERE {
GRAPH <http://mu.semte.ch/graphs/shared> {
?person a person:Person ;
?p ?o.
}
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
VALUES ?typePosition {
<http://data.lblod.info/vocabularies/leidinggevenden/Functionaris>
<http://data.vlaanderen.be/ns/mandaat#Mandataris>
}
?position mandaat:isBestuurlijkeAliasVan ?person ;
a ?typePosition .
}
FILTER NOT EXISTS {
GRAPH <http://mu.semte.ch/graphs/worship-service> {
?worshipPosition <http://data.vlaanderen.be/ns/mandaat#isBestuurlijkeAliasVan> ?person .
}
}
}

View File

@@ -0,0 +1,52 @@
PREFIX adms: <http://www.w3.org/ns/adms#>
PREFIX adres: <https://data.vlaanderen.be/ns/adres#>
PREFIX besluit: <http://data.vlaanderen.be/ns/besluit#>
PREFIX ch: <http://data.lblod.info/vocabularies/contacthub/>
PREFIX code: <http://lblod.data.gift/vocabularies/organisatie/>
PREFIX dbpedia: <http://dbpedia.org/ontology/>
PREFIX dc_terms: <http://purl.org/dc/terms/>
PREFIX ere: <http://data.lblod.info/vocabularies/erediensten/>
PREFIX euro: <http://data.europa.eu/m8g/>
PREFIX euvoc: <http://publications.europa.eu/ontology/euvoc#>
PREFIX ext: <http://mu.semte.ch/vocabularies/ext/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX generiek: <https://data.vlaanderen.be/ns/generiek#>
PREFIX lblodlg: <http://data.lblod.info/vocabularies/leidinggevenden/>
PREFIX locn: <http://www.w3.org/ns/locn#>
PREFIX mandaat: <http://data.vlaanderen.be/ns/mandaat#>
PREFIX org: <http://www.w3.org/ns/org#>
PREFIX organisatie: <https://data.vlaanderen.be/ns/organisatie#>
PREFIX person: <http://www.w3.org/ns/person#>
PREFIX persoon: <https://data.vlaanderen.be/ns/persoon#>
PREFIX prov: <http://www.w3.org/ns/prov#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX regorg: <http://www.w3.org/ns/regorg#>
PREFIX schema: <http://schema.org/>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX vcard: <http://www.w3.org/2006/vcard/ns#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
DELETE {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
?functionaris ?p ?o.
}
} WHERE {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
?functionaris a <http://data.lblod.info/vocabularies/leidinggevenden/Functionaris> ;
org:holds ?bestuursFunctie ;
?p ?o .
}
?bestuursorgaanInTime lblodlg:heeftBestuursfunctie ?bestuursFunctie ;
generiek:isTijdspecialisatieVan ?bestuursorgaan .
?bestuursorgaan besluit:bestuurt ?bestuurseenheid .
FILTER NOT EXISTS {
VALUES ?typeBestuur {
<http://data.lblod.info/vocabularies/erediensten/BestuurVanDeEredienst>
<http://data.lblod.info/vocabularies/erediensten/CentraalBestuurVanDeEredienst>
}
?bestuurseenheid a ?typeBestuur .
}
}

View File

@@ -0,0 +1,53 @@
PREFIX adms: <http://www.w3.org/ns/adms#>
PREFIX adres: <https://data.vlaanderen.be/ns/adres#>
PREFIX besluit: <http://data.vlaanderen.be/ns/besluit#>
PREFIX ch: <http://data.lblod.info/vocabularies/contacthub/>
PREFIX code: <http://lblod.data.gift/vocabularies/organisatie/>
PREFIX dbpedia: <http://dbpedia.org/ontology/>
PREFIX dc_terms: <http://purl.org/dc/terms/>
PREFIX ere: <http://data.lblod.info/vocabularies/erediensten/>
PREFIX euro: <http://data.europa.eu/m8g/>
PREFIX euvoc: <http://publications.europa.eu/ontology/euvoc#>
PREFIX ext: <http://mu.semte.ch/vocabularies/ext/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX generiek: <https://data.vlaanderen.be/ns/generiek#>
PREFIX lblodlg: <http://data.lblod.info/vocabularies/leidinggevenden/>
PREFIX locn: <http://www.w3.org/ns/locn#>
PREFIX mandaat: <http://data.vlaanderen.be/ns/mandaat#>
PREFIX org: <http://www.w3.org/ns/org#>
PREFIX organisatie: <https://data.vlaanderen.be/ns/organisatie#>
PREFIX person: <http://www.w3.org/ns/person#>
PREFIX persoon: <https://data.vlaanderen.be/ns/persoon#>
PREFIX prov: <http://www.w3.org/ns/prov#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX regorg: <http://www.w3.org/ns/regorg#>
PREFIX schema: <http://schema.org/>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX vcard: <http://www.w3.org/2006/vcard/ns#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
DELETE {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
?mandataris ?p ?o.
}
} WHERE {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
?mandataris a <http://data.vlaanderen.be/ns/mandaat#Mandataris> ;
org:holds ?mandaat ;
?p ?o .
}
?bestuursorgaanInTime org:hasPost ?mandaat ;
generiek:isTijdspecialisatieVan ?bestuursorgaan .
?bestuursorgaan besluit:bestuurt ?bestuurseenheid .
FILTER NOT EXISTS {
VALUES ?typeBestuur {
<http://data.lblod.info/vocabularies/erediensten/BestuurVanDeEredienst>
<http://data.lblod.info/vocabularies/erediensten/CentraalBestuurVanDeEredienst>
}
?bestuurseenheid a ?typeBestuur .
}
}
LIMIT 1000000

View File

@@ -0,0 +1,53 @@
PREFIX adms: <http://www.w3.org/ns/adms#>
PREFIX adres: <https://data.vlaanderen.be/ns/adres#>
PREFIX besluit: <http://data.vlaanderen.be/ns/besluit#>
PREFIX ch: <http://data.lblod.info/vocabularies/contacthub/>
PREFIX code: <http://lblod.data.gift/vocabularies/organisatie/>
PREFIX dbpedia: <http://dbpedia.org/ontology/>
PREFIX dc_terms: <http://purl.org/dc/terms/>
PREFIX ere: <http://data.lblod.info/vocabularies/erediensten/>
PREFIX euro: <http://data.europa.eu/m8g/>
PREFIX euvoc: <http://publications.europa.eu/ontology/euvoc#>
PREFIX ext: <http://mu.semte.ch/vocabularies/ext/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX generiek: <https://data.vlaanderen.be/ns/generiek#>
PREFIX lblodlg: <http://data.lblod.info/vocabularies/leidinggevenden/>
PREFIX locn: <http://www.w3.org/ns/locn#>
PREFIX mandaat: <http://data.vlaanderen.be/ns/mandaat#>
PREFIX org: <http://www.w3.org/ns/org#>
PREFIX organisatie: <https://data.vlaanderen.be/ns/organisatie#>
PREFIX person: <http://www.w3.org/ns/person#>
PREFIX persoon: <https://data.vlaanderen.be/ns/persoon#>
PREFIX prov: <http://www.w3.org/ns/prov#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX regorg: <http://www.w3.org/ns/regorg#>
PREFIX schema: <http://schema.org/>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX vcard: <http://www.w3.org/2006/vcard/ns#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
DELETE {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
?mandataris ?p ?o.
}
} WHERE {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
?mandataris a <http://data.vlaanderen.be/ns/mandaat#Mandataris> ;
org:holds ?mandaat ;
?p ?o .
}
?bestuursorgaanInTime org:hasPost ?mandaat ;
generiek:isTijdspecialisatieVan ?bestuursorgaan .
?bestuursorgaan besluit:bestuurt ?bestuurseenheid .
FILTER NOT EXISTS {
VALUES ?typeBestuur {
<http://data.lblod.info/vocabularies/erediensten/BestuurVanDeEredienst>
<http://data.lblod.info/vocabularies/erediensten/CentraalBestuurVanDeEredienst>
}
?bestuurseenheid a ?typeBestuur .
}
}
LIMIT 1000000

View File

@@ -0,0 +1,52 @@
PREFIX adms: <http://www.w3.org/ns/adms#>
PREFIX adres: <https://data.vlaanderen.be/ns/adres#>
PREFIX besluit: <http://data.vlaanderen.be/ns/besluit#>
PREFIX ch: <http://data.lblod.info/vocabularies/contacthub/>
PREFIX code: <http://lblod.data.gift/vocabularies/organisatie/>
PREFIX dbpedia: <http://dbpedia.org/ontology/>
PREFIX dc_terms: <http://purl.org/dc/terms/>
PREFIX ere: <http://data.lblod.info/vocabularies/erediensten/>
PREFIX euro: <http://data.europa.eu/m8g/>
PREFIX euvoc: <http://publications.europa.eu/ontology/euvoc#>
PREFIX ext: <http://mu.semte.ch/vocabularies/ext/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX generiek: <https://data.vlaanderen.be/ns/generiek#>
PREFIX lblodlg: <http://data.lblod.info/vocabularies/leidinggevenden/>
PREFIX locn: <http://www.w3.org/ns/locn#>
PREFIX mandaat: <http://data.vlaanderen.be/ns/mandaat#>
PREFIX org: <http://www.w3.org/ns/org#>
PREFIX organisatie: <https://data.vlaanderen.be/ns/organisatie#>
PREFIX person: <http://www.w3.org/ns/person#>
PREFIX persoon: <https://data.vlaanderen.be/ns/persoon#>
PREFIX prov: <http://www.w3.org/ns/prov#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX regorg: <http://www.w3.org/ns/regorg#>
PREFIX schema: <http://schema.org/>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX vcard: <http://www.w3.org/2006/vcard/ns#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
DELETE {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
?mandataris ?p ?o.
}
} WHERE {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
?mandataris a <http://data.vlaanderen.be/ns/mandaat#Mandataris> ;
org:holds ?mandaat ;
?p ?o .
}
?bestuursorgaanInTime org:hasPost ?mandaat ;
generiek:isTijdspecialisatieVan ?bestuursorgaan .
?bestuursorgaan besluit:bestuurt ?bestuurseenheid .
FILTER NOT EXISTS {
VALUES ?typeBestuur {
<http://data.lblod.info/vocabularies/erediensten/BestuurVanDeEredienst>
<http://data.lblod.info/vocabularies/erediensten/CentraalBestuurVanDeEredienst>
}
?bestuurseenheid a ?typeBestuur .
}
}

View File

@@ -0,0 +1,22 @@
PREFIX org: <http://www.w3.org/ns/org#>
PREFIX ere: <http://data.lblod.info/vocabularies/erediensten/>
DELETE {
GRAPH <http://mu.semte.ch/graphs/worship-service> {
?minister ?p ?o .
}
} WHERE {
GRAPH <http://mu.semte.ch/graphs/worship-service> {
?minister a ere:RolBedienaar ;
org:holds ?ministerPosition ;
?p ?o .
VALUES ?status {
<http://lblod.data.gift/concepts/63cc561de9188d64ba5840a42ae8f0d6> # Actief
<http://lblod.data.gift/concepts/d02c4e12bf88d2fdf5123b07f29c9311> # Niet Actief
}
?worshipService <http://data.lblod.info/vocabularies/erediensten/wordtBediendDoor> ?ministerPosition ;
<http://www.w3.org/ns/regorg#orgStatus> ?status .
}
}

View File

@@ -0,0 +1,19 @@
INSERT {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
?s a <http://www.w3.org/ns/org#Post> .
}
} WHERE {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
?s a <http://data.vlaanderen.be/ns/mandaat#Mandaat> .
}
}
INSERT {
GRAPH <http://mu.semte.ch/graphs/worship-service> {
?s a <http://www.w3.org/ns/org#Post> .
}
} WHERE {
GRAPH <http://mu.semte.ch/graphs/worship-service> {
?s a <http://data.vlaanderen.be/ns/mandaat#Mandaat> .
}
}

View File

@@ -0,0 +1,17 @@
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
delete {
graph <http://mu.semte.ch/graphs/worship-service> {
<http://data.lblod.info/id/veranderingsgebeurtenissen/642E815DE025A7C706F41E5D> <http://purl.org/dc/terms/date> "2023-03-30"^^xsd:date .
}
}
insert {
graph <http://mu.semte.ch/graphs/worship-service> {
<http://data.lblod.info/id/veranderingsgebeurtenissen/642E815DE025A7C706F41E5D> <http://purl.org/dc/terms/date> "2023-04-06"^^xsd:date .
}
}
where {
graph <http://mu.semte.ch/graphs/worship-service> {
<http://data.lblod.info/id/veranderingsgebeurtenissen/642E815DE025A7C706F41E5D> <http://purl.org/dc/terms/date> "2023-03-30"^^xsd:date .
}
}

View File

@@ -0,0 +1,23 @@
DELETE DATA {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
<http://data.lblod.info/id/bestuursorganen/ad933a3247ab634eb1a8c7233e77d6ea8cd2b6e1950d302832d065dcb516bcf5> <http://www.w3.org/2004/02/skos/core#prefLabel> "OCMWraad(Rechtstreeksverkiezing) Voeren" .
<http://data.lblod.info/id/bestuursorganen/082976d57de0655ac4f123b57d5cb008f612956d0a6de1742c02913dcbfcf125> <http://www.w3.org/2004/02/skos/core#prefLabel> "OCMWraad(Rechtstreeksverkiezing) Drogenbos" .
<http://data.lblod.info/id/bestuursorganen/cc803c53b2e0b17aac1069f5566fb8e1c8dad2f702845515a662229721803c00> <http://www.w3.org/2004/02/skos/core#prefLabel> "OCMWraad(Rechtstreeksverkiezing) Wezembeek-Oppem" .
<http://data.lblod.info/id/bestuursorganen/f373ece36dc05b29737c0adc14de95682161bb78a55cb85f786fac3fbd5b1cfc> <http://www.w3.org/2004/02/skos/core#prefLabel> "OCMWraad(Rechtstreeksverkiezing) Sint-Genesius-Rode" .
<http://data.lblod.info/id/bestuursorganen/317126204426dc7cabb60ecb09cbe4ca4830882652884e1e5800e60231195f5c> <http://www.w3.org/2004/02/skos/core#prefLabel> "OCMWraad(Rechtstreeksverkiezing) Linkebeek" .
<http://data.lblod.info/id/bestuursorganen/db8c3e2da85d7621120a986adc19fd8d21f501b39c01952238073abfe7d4a7e7> <http://www.w3.org/2004/02/skos/core#prefLabel> "OCMWraad(Rechtstreeksverkiezing) Wemmel" .
<http://data.lblod.info/id/bestuursorganen/d7fffe5c17d1936d46b92620d1e454f38393736988514b5f339910a17c7134f0> <http://www.w3.org/2004/02/skos/core#prefLabel> "OCMWraad(Rechtstreeksverkiezing) Kraainem" .
}
}
;
INSERT DATA {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
<http://data.lblod.info/id/bestuursorganen/f373ece36dc05b29737c0adc14de95682161bb78a55cb85f786fac3fbd5b1cfc> <http://www.w3.org/2004/02/skos/core#prefLabel> "Raad voor Maatschappelijk Welzijn Sint-Genesius-Rode" .
<http://data.lblod.info/id/bestuursorganen/317126204426dc7cabb60ecb09cbe4ca4830882652884e1e5800e60231195f5c> <http://www.w3.org/2004/02/skos/core#prefLabel> "Raad voor Maatschappelijk Welzijn Linkebeek" .
<http://data.lblod.info/id/bestuursorganen/cc803c53b2e0b17aac1069f5566fb8e1c8dad2f702845515a662229721803c00> <http://www.w3.org/2004/02/skos/core#prefLabel> "Raad voor Maatschappelijk Welzijn Wezembeek-Oppem" .
<http://data.lblod.info/id/bestuursorganen/ad933a3247ab634eb1a8c7233e77d6ea8cd2b6e1950d302832d065dcb516bcf5> <http://www.w3.org/2004/02/skos/core#prefLabel> "Raad voor Maatschappelijk Welzijn Voeren" .
<http://data.lblod.info/id/bestuursorganen/082976d57de0655ac4f123b57d5cb008f612956d0a6de1742c02913dcbfcf125> <http://www.w3.org/2004/02/skos/core#prefLabel> "Raad voor Maatschappelijk Welzijn Drogenbos" .
<http://data.lblod.info/id/bestuursorganen/d7fffe5c17d1936d46b92620d1e454f38393736988514b5f339910a17c7134f0> <http://www.w3.org/2004/02/skos/core#prefLabel> "Raad voor Maatschappelijk Welzijn Kraainem" .
<http://data.lblod.info/id/bestuursorganen/db8c3e2da85d7621120a986adc19fd8d21f501b39c01952238073abfe7d4a7e7> <http://www.w3.org/2004/02/skos/core#prefLabel> "Raad voor Maatschappelijk Welzijn Wemmel" .
}
}

View File

@@ -0,0 +1,15 @@
delete {
graph <http://mu.semte.ch/graphs/worship-service> {
<http://data.lblod.info/id/veranderingsgebeurtenissen/644616FDF08BCC5A4747B5A2> <http://purl.org/dc/terms/date> ?date.
}
}
insert {
graph <http://mu.semte.ch/graphs/worship-service> {
<http://data.lblod.info/id/veranderingsgebeurtenissen/644616FDF08BCC5A4747B5A2> <http://purl.org/dc/terms/date> "2022-04-22".
}
}
where {
graph <http://mu.semte.ch/graphs/worship-service> {
<http://data.lblod.info/id/veranderingsgebeurtenissen/644616FDF08BCC5A4747B5A2> <http://purl.org/dc/terms/date> ?date.
}
}

View File

@@ -0,0 +1,58 @@
PREFIX mandaat: <http://data.vlaanderen.be/ns/mandaat#>
PREFIX ere: <http://data.lblod.info/vocabularies/erediensten/>
PREFIX besluit: <http://data.vlaanderen.be/ns/besluit#>
PREFIX generiek: <https://data.vlaanderen.be/ns/generiek#>
DELETE {
GRAPH ?g {
?orgaanInTime mandaat:bindingEinde ?end .
}
} INSERT {
GRAPH ?g {
?orgaanInTime mandaat:bindingEinde ?endDateTime .
}
} WHERE {
VALUES ?g {
<http://mu.semte.ch/graphs/worship-service>
<http://mu.semte.ch/graphs/administrative-unit>
}
GRAPH ?g {
?bestuurseenheid a ?type .
?bestuursorgaan besluit:bestuurt ?bestuurseenheid .
?orgaanInTime generiek:isTijdspecialisatieVan ?bestuursorgaan .
?orgaanInTime mandaat:bindingEinde ?end .
FILTER (datatype(?end) = xsd:date)
BIND(strdt(concat(str(?end), 'T01:00:00'), xsd:dateTime) as ?endDateTime)
}
}
;
DELETE {
GRAPH ?g {
?orgaanInTime mandaat:bindingStart ?start .
}
} INSERT {
GRAPH ?g {
?orgaanInTime mandaat:bindingStart ?startDateTime .
}
} WHERE {
VALUES ?g {
<http://mu.semte.ch/graphs/worship-service>
<http://mu.semte.ch/graphs/administrative-unit>
}
GRAPH ?g {
?bestuurseenheid a ?type .
?bestuursorgaan besluit:bestuurt ?bestuurseenheid .
?orgaanInTime generiek:isTijdspecialisatieVan ?bestuursorgaan .
?orgaanInTime mandaat:bindingStart ?start .
FILTER (datatype(?start) = xsd:date)
BIND(strdt(concat(str(?start), 'T01:00:00'), xsd:dateTime) as ?startDateTime)
}
}

View File

@@ -0,0 +1,60 @@
PREFIX mandaat: <http://data.vlaanderen.be/ns/mandaat#>
PREFIX ere: <http://data.lblod.info/vocabularies/erediensten/>
PREFIX besluit: <http://data.vlaanderen.be/ns/besluit#>
PREFIX generiek: <https://data.vlaanderen.be/ns/generiek#>
DELETE {
GRAPH ?g {
?orgaanInTime mandaat:bindingEinde ?end .
}
} INSERT {
GRAPH ?g {
?orgaanInTime mandaat:bindingEinde ?endDateTime .
}
} WHERE {
VALUES ?g {
<http://mu.semte.ch/graphs/worship-service>
<http://mu.semte.ch/graphs/administrative-unit>
}
GRAPH ?g {
?bestuurseenheid a ?type .
?bestuursorgaan besluit:bestuurt ?bestuurseenheid .
?orgaanInTime generiek:isTijdspecialisatieVan ?bestuursorgaan .
?orgaanInTime mandaat:bindingEinde ?end .
FILTER (HOURS(?end) = 1)
BIND(strdt(concat(xsd:date(?end), 'T00:00:00'), xsd:dateTime) as ?endDateTime)
}
}
;
DELETE {
GRAPH ?g {
?orgaanInTime mandaat:bindingStart ?start .
}
} INSERT {
GRAPH ?g {
?orgaanInTime mandaat:bindingStart ?startDateTime .
}
} WHERE {
VALUES ?g {
<http://mu.semte.ch/graphs/worship-service>
<http://mu.semte.ch/graphs/administrative-unit>
}
GRAPH ?g {
?bestuurseenheid a ?type .
?bestuursorgaan besluit:bestuurt ?bestuurseenheid .
?orgaanInTime generiek:isTijdspecialisatieVan ?bestuursorgaan .
?orgaanInTime mandaat:bindingStart ?start .
FILTER (HOURS(?start) = 1)
BIND(strdt(concat(xsd:date(?start), 'T00:00:00'), xsd:dateTime) as ?startDateTime)
}
}

View File

@@ -0,0 +1,11 @@
DELETE {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
?s ?p ?o .
}
}
WHERE {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
?s a <http://data.vlaanderen.be/ns/mandaat#Fractie> ;
?p ?o .
}
}

View File

@@ -0,0 +1,24 @@
PREFIX org: <http://www.w3.org/ns/org#>
PREFIX besluit: <http://data.vlaanderen.be/ns/besluit#>
PREFIX ere: <http://data.lblod.info/vocabularies/erediensten/>
INSERT {
GRAPH ?g {
?org a org:Organization .
}
} WHERE {
VALUES ?g {
<http://mu.semte.ch/graphs/shared>
<http://mu.semte.ch/graphs/worship-service>
<http://mu.semte.ch/graphs/administrative-unit>
}
GRAPH ?g {
VALUES ?type {
besluit:Bestuurseenheid
ere:RepresentatiefOrgaan
ere:EredienstBestuurseenheid
ere:BestuurVanDeEredienst
ere:CentraalBestuurVanDeEredienst
}
?org a ?type .
}
}

View File

@@ -0,0 +1,75 @@
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX org: <http://www.w3.org/ns/org#>
PREFIX mu: <http://mu.semte.ch/vocabularies/core/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX dct: <http://purl.org/dc/terms/>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX concepts: <http://lblod.data.gift/concepts/>
PREFIX bestuur: <http://data.lblod.info/id/besturenVanDeEredienst/>
PREFIX org: <http://www.w3.org/ns/org#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX contacthub: <http://data.lblod.info/vocabularies/contacthub/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX ce: <http://data.lblod.info/id/veranderingsgebeurtenissen/>
PREFIX cer: <http://data.lblod.info/id/veranderingsgebeurtenis-resultaten/>
PREFIX m8g: <http://data.europa.eu/m8g/>
PREFIX besluit: <http://data.vlaanderen.be/ns/besluit#>
PREFIX eli: <http://data.europa.eu/eli/ontology#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
DELETE {
graph <http://mu.semte.ch/graphs/administrative-unit> {
?decision ?decisionP ?decisionO.
}
}
INSERT {
graph <http://mu.semte.ch/graphs/worship-service> {
?decision ?decisionP ?decisionO.
}
}
WHERE {
graph <http://mu.semte.ch/graphs/worship-service> {
?changeEvent a <http://www.w3.org/ns/org#ChangeEvent>;
<http://data.europa.eu/m8g/hasFormalFramework> ?decision.
}
graph <http://mu.semte.ch/graphs/administrative-unit> {
?decision ?decisionP ?decisionO.
}
}
;
DELETE {
graph <http://mu.semte.ch/graphs/administrative-unit> {
?decisionActivity ?p ?o.
}
}
INSERT {
graph <http://mu.semte.ch/graphs/worship-service> {
?decisionActivity ?p ?o.
}
}
WHERE {
graph <http://mu.semte.ch/graphs/worship-service> {
?decision a <http://data.vlaanderen.be/ns/besluit#Besluit>.
}
graph <http://mu.semte.ch/graphs/administrative-unit> {
?decisionActivity a <https://data.vlaanderen.be/ns/besluitvorming#Beslissingsactiviteit>;
<http://www.w3.org/ns/prov#generated> ?decision;
?p ?o.
}
}

View File

@@ -0,0 +1,57 @@
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX org: <http://www.w3.org/ns/org#>
PREFIX mu: <http://mu.semte.ch/vocabularies/core/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX dct: <http://purl.org/dc/terms/>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX concepts: <http://lblod.data.gift/concepts/>
PREFIX bestuur: <http://data.lblod.info/id/besturenVanDeEredienst/>
PREFIX org: <http://www.w3.org/ns/org#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX contacthub: <http://data.lblod.info/vocabularies/contacthub/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX ce: <http://data.lblod.info/id/veranderingsgebeurtenissen/>
PREFIX cer: <http://data.lblod.info/id/veranderingsgebeurtenis-resultaten/>
PREFIX m8g: <http://data.europa.eu/m8g/>
PREFIX besluit: <http://data.vlaanderen.be/ns/besluit#>
PREFIX eli: <http://data.europa.eu/eli/ontology#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
DELETE {
graph ?g {
?changeEvent ?p ?o.
?changeEventResult ?cP ?cO.
?decision ?decisionP ?decisionO.
?decisionActivity ?decisionActivityP ?desitionActivityO.
}
}
WHERE {
graph ?g {
?changeEvent a <http://www.w3.org/ns/org#ChangeEvent>;
<http://lblod.data.gift/vocabularies/organisatie/veranderingsgebeurtenisResultaat> ?changeEventResult;
mu:uuid ?uuidChangeEvent;
?p ?o.
?changeEventResult a <http://lblod.data.gift/vocabularies/organisatie/VeranderingsgebeurtenisResultaat>;
mu:uuid ?uuidChangeEventResult;
?cP ?cO.
optional {
?changeEvent <http://data.europa.eu/m8g/hasFormalFramework> ?decision.
?decision ?decisionP ?decisionO.
optional {
?decisionActivity a <https://data.vlaanderen.be/ns/besluitvorming#Beslissingsactiviteit>;
<http://www.w3.org/ns/prov#generated> ?decision;
?decisionActivityP ?desitionActivityO.
}
}
filter(?uuidChangeEvent in ("63343865036B579F0A26FF5C", "63343E99036B579F0A26FF6F", "633446D6036B579F0A26FF87","63345772036B579F0A26FF93"))
}
}

View File

@@ -0,0 +1,16 @@
delete {
graph ?g {
<http://data.lblod.info/id/veranderingsgebeurtenissen/620E674C5747C883CA1D2EE4> <http://data.lblod.info/vocabularies/contacthub/typeWijziging> <http://lblod.data.gift/concepts/9f19f14910245f9b14737f1f1a2067f2>.
}
}
insert {
graph ?g {
<http://data.lblod.info/id/veranderingsgebeurtenissen/620E674C5747C883CA1D2EE4> <http://data.lblod.info/vocabularies/contacthub/typeWijziging> <http://lblod.data.gift/concepts/4297bc56c1a874240e4566e2c5b8816f>.
}
}
where {
graph ?g {
<http://data.lblod.info/id/veranderingsgebeurtenissen/620E674C5747C883CA1D2EE4> <http://data.lblod.info/vocabularies/contacthub/typeWijziging> <http://lblod.data.gift/concepts/9f19f14910245f9b14737f1f1a2067f2>.
}
}

View File

@@ -0,0 +1,21 @@
DELETE {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
?functionaris ?pfunctionaris ?ofunctionaris .
}
} WHERE {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
?functionaris a <http://data.lblod.info/vocabularies/leidinggevenden/Functionaris> ;
<http://www.w3.org/ns/org#holds> ?bestuursfunctie ;
?pfunctionaris ?ofunctionaris .
}
?orgaan <http://data.lblod.info/vocabularies/leidinggevenden/heeftBestuursfunctie> ?bestuursfunctie ;
<http://data.vlaanderen.be/ns/mandaat#isTijdspecialisatieVan>/<http://data.vlaanderen.be/ns/besluit#bestuurt>/<http://data.vlaanderen.be/ns/besluit#classificatie> ?classification .
FILTER(?classification NOT IN (
<http://data.vlaanderen.be/id/concept/BestuurseenheidClassificatieCode/5ab0e9b8a3b2ca7c5e000000>,
<http://data.vlaanderen.be/id/concept/BestuurseenheidClassificatieCode/5ab0e9b8a3b2ca7c5e000001>,
<http://data.vlaanderen.be/id/concept/BestuurseenheidClassificatieCode/5ab0e9b8a3b2ca7c5e000002>,
<http://data.vlaanderen.be/id/concept/BestuurseenheidClassificatieCode/5ab0e9b8a3b2ca7c5e000003>
))
}

View File

@@ -0,0 +1,19 @@
delete {
graph ?g {
<http://data.lblod.info/id/veranderingsgebeurtenissen/6380DDD34B5FEAF28DEDE982> <http://data.lblod.info/vocabularies/contacthub/typeWijziging>
<http://lblod.data.gift/concepts/3dd7550843eaf18e1fa1ca6c6c3f2610>.
}
}
insert {
graph ?g {
<http://data.lblod.info/id/veranderingsgebeurtenissen/6380DDD34B5FEAF28DEDE982> <http://data.lblod.info/vocabularies/contacthub/typeWijziging>
<http://lblod.data.gift/concepts/9f19f14910245f9b14737f1f1a2067f2>.
}
}
where {
graph ?g {
<http://data.lblod.info/id/veranderingsgebeurtenissen/6380DDD34B5FEAF28DEDE982> <http://data.lblod.info/vocabularies/contacthub/typeWijziging>
<http://lblod.data.gift/concepts/3dd7550843eaf18e1fa1ca6c6c3f2610>.
}
}

View File

@@ -0,0 +1,17 @@
DELETE {
graph <http://mu.semte.ch/graphs/public> {
<http://lblod.data.gift/concepts/dcc01338-842c-4fbd-ba68-3ca6f3af975c> <http://www.w3.org/2004/02/skos/core#prefLabel> "Correspondentieadres".
}
}
INSERT {
graph <http://mu.semte.ch/graphs/public> {
<http://lblod.data.gift/concepts/dcc01338-842c-4fbd-ba68-3ca6f3af975c> <http://www.w3.org/2004/02/skos/core#prefLabel> "Andere vestiging".
}
}
WHERE {
graph <http://mu.semte.ch/graphs/public> {
<http://lblod.data.gift/concepts/dcc01338-842c-4fbd-ba68-3ca6f3af975c> <http://www.w3.org/2004/02/skos/core#prefLabel> "Correspondentieadres".
}
}

View File

@@ -0,0 +1,22 @@
delete where {
graph ?g {
<http://data.lblod.info/id/betrokkenLokaleBesturen/f8979469220360bbfecaf66afe1b94ae> ?p ?o.
}
}
;
delete {
graph ?g {
<http://data.lblod.info/id/betrokkenLokaleBesturen/1de71abc7b02a6702960b403bf724ff8> <http://data.lblod.info/vocabularies/erediensten/financieringspercentage> ?percentage.
}
}
insert {
graph ?g {
<http://data.lblod.info/id/betrokkenLokaleBesturen/1de71abc7b02a6702960b403bf724ff8> <http://data.lblod.info/vocabularies/erediensten/financieringspercentage> 100.
}
}
where {
graph ?g {
<http://data.lblod.info/id/betrokkenLokaleBesturen/1de71abc7b02a6702960b403bf724ff8> <http://data.lblod.info/vocabularies/erediensten/financieringspercentage> ?percentage.
}
}

View File

@@ -0,0 +1,64 @@
PREFIX org: <http://www.w3.org/ns/org#>
PREFIX locn: <http://www.w3.org/ns/locn#>
PREFIX schema: <http://schema.org/>
PREFIX regorg: <http://www.w3.org/ns/regorg#>
PREFIX person: <http://www.w3.org/ns/person#>
PREFIX vcard: <http://www.w3.org/2006/vcard/ns#>
PREFIX dbpedia: <http://dbpedia.org/ontology/>
PREFIX adms: <http://www.w3.org/ns/adms#>
PREFIX euro: <http://data.europa.eu/m8g/>
PREFIX prov: <http://www.w3.org/ns/prov#>
PREFIX organisatie: <https://data.vlaanderen.be/ns/organisatie#>
PREFIX persoon: <https://data.vlaanderen.be/ns/persoon#>
PREFIX adres: <https://data.vlaanderen.be/ns/adres#>
PREFIX generiek: <https://data.vlaanderen.be/ns/generiek#>
PREFIX mandaat: <http://data.vlaanderen.be/ns/mandaat#>
PREFIX besluit: <http://data.vlaanderen.be/ns/besluit#>
PREFIX lblodlg: <https://data.lblod.info/vocabularies/leidinggevenden/>
PREFIX dc_terms: <http://purl.org/dc/terms/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX euvoc: <http://publications.europa.eu/ontology/euvoc#>
PREFIX ere: <http://data.lblod.info/vocabularies/erediensten/>
PREFIX ch: <http://data.lblod.info/vocabularies/contacthub/>
PREFIX code: <http://lblod.data.gift/vocabularies/organisatie/>
PREFIX ext: <http://mu.semte.ch/vocabularies/ext/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
DELETE {
GRAPH ?g {
?address
locn:fullAddress
?full_address.
}
}
INSERT {
GRAPH ?g {
?address
locn:fullAddress
?fixed_full_address.
}
}
WHERE {
GRAPH ?g {
?address
locn:thoroughfare
?street;
adres:Adresvoorstelling.huisnummer
?streetNumber;
adres:Adresvoorstelling.busnummer
?busNumber;
adres:gemeentenaam
?gemeente;
locn:postCode
?postalCode;
locn:fullAddress
?full_address.
FILTER (strlen(?busNumber) > 0 )
FILTER (CONTAINS(?full_address, CONCAT(?streetNumber, ?busNumber)))
FILTER (STRSTARTS(?full_address, CONCAT(?street, ' ',?streetNumber, ?busNumber, ', ', ?postalCode, ' ', ?gemeente)))
BIND (CONCAT(?street, ' ',?streetNumber, ' ' , ?busNumber, ', ', ?postalCode, ' ', ?gemeente, ", België") as ?fixed_full_address)
}
}

View File

@@ -0,0 +1 @@
http://mu.semte.ch/graphs/worship-service

View File

@@ -0,0 +1,33 @@
<http://data.lblod.info/id/representatieveOrganen/3b150a479c9e456a94b76c6a59a2f674>
a <http://data.lblod.info/vocabularies/erediensten/RepresentatiefOrgaan> ;
<http://mu.semte.ch/vocabularies/core/uuid> "3b150a479c9e456a94b76c6a59a2f674";
<http://www.w3.org/2004/02/skos/core#prefLabel> "Moslimraad van België";
<http://data.lblod.info/vocabularies/erediensten/typeEredienst> <http://lblod.data.gift/concepts/9d8bd472a00bf0a5c7b7186606365a52> ; # Islamitish
<http://www.w3.org/ns/regorg#orgStatus> <http://lblod.data.gift/concepts/63cc561de9188d64ba5840a42ae8f0d6> ; # Actief
<http://www.w3.org/ns/adms#identifier> <http://data.lblod.info/id/identificatoren/d116df8f3e1d48fbb846131cc48186b7> ;
<http://www.w3.org/ns/org#hasPrimarySite> <http://data.lblod.info/id/vestigingen/1a3cc52f51924d25ad7a2c6f0d4d342b> .
<http://data.lblod.info/id/identificatoren/d116df8f3e1d48fbb846131cc48186b7>
a <http://www.w3.org/ns/adms#Identifier> ;
<http://mu.semte.ch/vocabularies/core/uuid> "d116df8f3e1d48fbb846131cc48186b7" ;
<http://www.w3.org/2004/02/skos/core#notation> "KBO nummer" ;
<https://data.vlaanderen.be/ns/generiek#gestructureerdeIdentificator> <http://data.lblod.info/id/gestructureerdeIdentificatoren/be28d9316bfb4038bf557c0ec9a45ac1> .
<http://data.lblod.info/id/gestructureerdeIdentificatoren/be28d9316bfb4038bf557c0ec9a45ac1>
a <https://data.vlaanderen.be/ns/generiek#GestructureerdeIdentificator> ;
<http://mu.semte.ch/vocabularies/core/uuid> "be28d9316bfb4038bf557c0ec9a45ac1" ;
<https://data.vlaanderen.be/ns/generiek#lokaleIdentificator> "0802469122".
<http://data.lblod.info/id/vestigingen/1a3cc52f51924d25ad7a2c6f0d4d342b>
a <http://www.w3.org/ns/org#Site> ;
<http://mu.semte.ch/vocabularies/core/uuid> "1a3cc52f51924d25ad7a2c6f0d4d342b" ;
<https://data.vlaanderen.be/ns/organisatie#bestaatUit> <http://data.lblod.info/id/adressen/29ced73adcc4479b8e96dd20fd2bdc43> .
<http://data.lblod.info/id/adressen/29ced73adcc4479b8e96dd20fd2bdc43>
a <http://www.w3.org/ns/locn#Address> ;
<http://mu.semte.ch/vocabularies/core/uuid> "29ced73adcc4479b8e96dd20fd2bdc43" ;
<http://www.w3.org/ns/locn#thoroughfare> "Wetstraat" ;
<https://data.vlaanderen.be/ns/adres#Adresvoorstelling.huisnummer> "23" ;
<http://www.w3.org/ns/locn#postCode> "1040" ;
<https://data.vlaanderen.be/ns/adres#gemeentenaam> "Brussel" ;
<http://www.w3.org/ns/locn#adminUnitL2> "Vlaams-Brabant" .

View File

@@ -0,0 +1 @@
http://mu.semte.ch/graphs/worship-service

View File

@@ -0,0 +1,2 @@
<http://data.lblod.info/id/adressen/29ced73adcc4479b8e96dd20fd2bdc43>
<http://www.w3.org/ns/locn#fullAddress> "Wetstraat 23, 1040 Brussel, België".

View File

@@ -0,0 +1,51 @@
PREFIX org: <http://www.w3.org/ns/org#>
PREFIX locn: <http://www.w3.org/ns/locn#>
PREFIX schema: <http://schema.org/>
PREFIX regorg: <http://www.w3.org/ns/regorg#>
PREFIX person: <http://www.w3.org/ns/person#>
PREFIX vcard: <http://www.w3.org/2006/vcard/ns#>
PREFIX dbpedia: <http://dbpedia.org/ontology/>
PREFIX adms: <http://www.w3.org/ns/adms#>
PREFIX euro: <http://data.europa.eu/m8g/>
PREFIX prov: <http://www.w3.org/ns/prov#>
PREFIX organisatie: <https://data.vlaanderen.be/ns/organisatie#>
PREFIX persoon: <https://data.vlaanderen.be/ns/persoon#>
PREFIX adres: <https://data.vlaanderen.be/ns/adres#>
PREFIX generiek: <https://data.vlaanderen.be/ns/generiek#>
PREFIX mandaat: <http://data.vlaanderen.be/ns/mandaat#>
PREFIX besluit: <http://data.vlaanderen.be/ns/besluit#>
PREFIX lblodlg: <https://data.lblod.info/vocabularies/leidinggevenden/>
PREFIX dc_terms: <http://purl.org/dc/terms/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX euvoc: <http://publications.europa.eu/ontology/euvoc#>
PREFIX ere: <http://data.lblod.info/vocabularies/erediensten/>
PREFIX ch: <http://data.lblod.info/vocabularies/contacthub/>
PREFIX code: <http://lblod.data.gift/vocabularies/organisatie/>
PREFIX ext: <http://mu.semte.ch/vocabularies/ext/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
INSERT {
GRAPH ?g {
<http://data.lblod.info/id/adressen/15f057e425c2823809b079afe1ff82c4> adres:land "Frankrijk" .
}
} WHERE {
GRAPH ?g {
<http://data.lblod.info/id/adressen/15f057e425c2823809b079afe1ff82c4> ?p ?o.
}
};
INSERT {
GRAPH ?g {
?address adres:land "België" .
}
} WHERE {
GRAPH ?g {
?address
a locn:Address .
FILTER NOT EXISTS {
?address
adres:land ?land .
}
}
};

View File

@@ -0,0 +1,59 @@
PREFIX org: <http://www.w3.org/ns/org#>
PREFIX locn: <http://www.w3.org/ns/locn#>
PREFIX schema: <http://schema.org/>
PREFIX regorg: <http://www.w3.org/ns/regorg#>
PREFIX person: <http://www.w3.org/ns/person#>
PREFIX vcard: <http://www.w3.org/2006/vcard/ns#>
PREFIX dbpedia: <http://dbpedia.org/ontology/>
PREFIX adms: <http://www.w3.org/ns/adms#>
PREFIX euro: <http://data.europa.eu/m8g/>
PREFIX prov: <http://www.w3.org/ns/prov#>
PREFIX organisatie: <https://data.vlaanderen.be/ns/organisatie#>
PREFIX persoon: <https://data.vlaanderen.be/ns/persoon#>
PREFIX adres: <https://data.vlaanderen.be/ns/adres#>
PREFIX generiek: <https://data.vlaanderen.be/ns/generiek#>
PREFIX mandaat: <http://data.vlaanderen.be/ns/mandaat#>
PREFIX besluit: <http://data.vlaanderen.be/ns/besluit#>
PREFIX lblodlg: <https://data.lblod.info/vocabularies/leidinggevenden/>
PREFIX dc_terms: <http://purl.org/dc/terms/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX euvoc: <http://publications.europa.eu/ontology/euvoc#>
PREFIX ere: <http://data.lblod.info/vocabularies/erediensten/>
PREFIX ch: <http://data.lblod.info/vocabularies/contacthub/>
PREFIX code: <http://lblod.data.gift/vocabularies/organisatie/>
PREFIX ext: <http://mu.semte.ch/vocabularies/ext/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
DELETE {
GRAPH ?g {
?address locn:fullAddress ?fullAddress .
}
} WHERE {
GRAPH ?g {
?address locn:fullAddress ?fullAddress .
}
};
INSERT {
GRAPH ?g {
?address locn:fullAddress ?fullAddress .
}
} WHERE {
GRAPH ?g {
?address
a locn:Address;
locn:thoroughfare ?straatnaam;
adres:Adresvoorstelling.huisnummer ?huisnummer;
locn:postCode ?postcode;
adres:gemeentenaam ?gemeentenaam;
adres:land ?land .
OPTIONAL {
?address adres:Adresvoorstelling.busnummer ?busnummer .
}
BIND(IF(BOUND(?busnummer), CONCAT(?straatnaam, " ", ?huisnummer, " ", ?busnummer, ", ", ?postcode, " ", ?gemeentenaam, ", ", ?land), CONCAT(?straatnaam, " ", ?huisnummer, ", ", ?postcode, " ", ?gemeentenaam, ", ", ?land)) AS ?fullAddress)
}
};

View File

@@ -0,0 +1 @@
http://mu.semte.ch/graphs/administrative-unit

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,11 @@
DELETE DATA {
GRAPH <http://mu.semte.ch/graphs/worship-service> {
<http://data.lblod.info/id/representatieveOrganen/e224c637ba8bb0e5dfbb87da225b4652> <http://www.w3.org/ns/regorg#orgStatus> <http://lblod.data.gift/concepts/63cc561de9188d64ba5840a42ae8f0d6> .
}
}
;
INSERT DATA {
GRAPH <http://mu.semte.ch/graphs/worship-service> {
<http://data.lblod.info/id/representatieveOrganen/e224c637ba8bb0e5dfbb87da225b4652> <http://www.w3.org/ns/regorg#orgStatus> <http://lblod.data.gift/concepts/d02c4e12bf88d2fdf5123b07f29c9311> .
}
}

View File

@@ -0,0 +1,9 @@
PREFIX ext: <http://mu.semte.ch/vocabularies/ext/>
INSERT DATA {
GRAPH <http://mu.semte.ch/graphs/public> {
<http://data.vlaanderen.be/id/concept/BestuursfunctieCode/855489b9-b584-4f34-90b2-39aea808cd9f> ext:appliesTo <http://data.vlaanderen.be/id/concept/BestuursorgaanClassificatieCode/41caf7e6-b040-4720-9cc2-a96cfffed5b4> . # Leidend ambtenaar
<http://data.vlaanderen.be/id/concept/BestuursorgaanClassificatieCode/41caf7e6-b040-4720-9cc2-a96cfffed5b4> ext:appliesWithin <http://data.vlaanderen.be/id/concept/BestuurseenheidClassificatieCode/36a82ba0-7ff1-4697-a9dd-2e94df73b721> , <http://data.vlaanderen.be/id/concept/BestuurseenheidClassificatieCode/80310756-ce0a-4a1b-9b8e-7c01b6cc7a2d> .
}
}

View File

@@ -0,0 +1,51 @@
@prefix org: <http://www.w3.org/ns/org#>.
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix mu: <http://mu.semte.ch/vocabularies/core/> .
@prefix persoon: <https://data.vlaanderen.be/ns/persoon#> .
@prefix ext: <http://mu.semte.ch/vocabularies/ext/>.
@prefix person: <http://www.w3.org/ns/person#>.
@prefix session: <http://mu.semte.ch/vocabularies/session/>.
@prefix foaf: <http://xmlns.com/foaf/0.1/>.
@prefix besluit: <http://data.vlaanderen.be/ns/besluit#>.
@prefix ere: <http://data.lblod.info/vocabularies/erediensten/>.
@prefix mandaat: <http://data.vlaanderen.be/ns/mandaat#>.
@prefix dcterms: <http://purl.org/dc/terms/>.
@prefix generiek: <https://data.vlaanderen.be/ns/generiek#>.
@prefix skos: <http://www.w3.org/2004/02/skos/core#>.
<http://data.lblod.info/id/identificatoren/2aa74846-a99d-423b-8c9e-b2a344b39f2a> a <http://www.w3.org/ns/adms#Identifier>;
mu:uuid "2aa74846-a99d-423b-8c9e-b2a344b39f2a";
skos:notation "SharePoint identificator";
generiek:gestructureerdeIdentificator <http://data.lblod.info/id/gestructureerdeIdentificatoren/0edd4e8e-44b6-4e86-8717-cda144f91ebb>.
<http://data.lblod.info/id/gestructureerdeIdentificatoren/0edd4e8e-44b6-4e86-8717-cda144f91ebb> a <https://data.vlaanderen.be/ns/generiek#GestructureerdeIdentificator>;
mu:uuid "0edd4e8e-44b6-4e86-8717-cda144f91ebb";
<https://data.vlaanderen.be/ns/generiek#lokaleIdentificator> "666".
<http://data.lblod.info/id/vestigingen/29faec77-652a-4d8e-afbb-635b141b13f0> a <http://www.w3.org/ns/org#Site>;
mu:uuid "29faec77-652a-4d8e-afbb-635b141b13f0";
<http://data.lblod.info/vocabularies/erediensten/vestigingstype> <http://lblod.data.gift/concepts/f1381723dec42c0b6ba6492e41d6f5dd>;
<https://data.vlaanderen.be/ns/organisatie#bestaatUit> <http://data.lblod.info/id/adressen/2d6c327a-cf81-43a6-8536-17602781fb2f>;
org:siteAddress <http://data.lblod.info/id/contact-punten/bc66afca-f8cf-4e4d-b038-500906e9ffa9>,
<http://data.lblod.info/id/contact-punten/1d1da2b5-8f38-41b6-a81d-5bfa72e7d7db>.
<http://data.lblod.info/id/contact-punten/bc66afca-f8cf-4e4d-b038-500906e9ffa9> a <http://schema.org/ContactPoint>;
mu:uuid "bc66afca-f8cf-4e4d-b038-500906e9ffa9";
<http://schema.org/contactType> "Primary".
<http://data.lblod.info/id/contact-punten/1d1da2b5-8f38-41b6-a81d-5bfa72e7d7db> a <http://schema.org/ContactPoint>;
mu:uuid "1d1da2b5-8f38-41b6-a81d-5bfa72e7d7db";
<http://schema.org/contactType> "Secondary".
<http://data.lblod.info/id/adressen/2d6c327a-cf81-43a6-8536-17602781fb2f> a <http://www.w3.org/ns/locn#Address>;
mu:uuid "2d6c327a-cf81-43a6-8536-17602781fb2f".
<http://data.lblod.info/id/bestuurseenheden/5c6ab343-3405-475d-a184-d44bbe7e787a> a besluit:Bestuurseenheid, org:Organization;
mu:uuid "5c6ab343-3405-475d-a184-d44bbe7e787a";
org:classification <http://data.vlaanderen.be/id/concept/BestuurseenheidClassificatieCode/36a82ba0-7ff1-4697-a9dd-2e94df73b721>;
skos:prefLabel "AGB BRUGGE";
skos:altLabel "";
<http://www.w3.org/ns/regorg#orgStatus> <http://lblod.data.gift/concepts/d02c4e12bf88d2fdf5123b07f29c9311>;
<http://www.w3.org/ns/adms#identifier> <http://data.lblod.info/id/identificatoren/2aa74846-a99d-423b-8c9e-b2a344b39f2a>;
<http://www.w3.org/ns/org#hasPrimarySite> <http://data.lblod.info/id/vestigingen/29faec77-652a-4d8e-afbb-635b141b13f0> .

View File

@@ -0,0 +1,145 @@
INSERT DATA {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
<http://data.lblod.info/id/bestuurseenheden/33a1886b07b64ebe3a0e6c5ed8086f030ef1109492cb254832a716dd7e1b8d7b> <http://www.w3.org/ns/adms#identifier> <http://data.lblod.info/id/identificatoren/f3755e7e-01e0-4f32-a3ff-dfed24591701> .
<http://data.lblod.info/id/identificatoren/f3755e7e-01e0-4f32-a3ff-dfed24591701> a <http://www.w3.org/ns/adms#Identifier>;
<http://mu.semte.ch/vocabularies/core/uuid> "f3755e7e-01e0-4f32-a3ff-dfed24591701";
<http://www.w3.org/2004/02/skos/core#notation> "OVO-nummer";
<https://data.vlaanderen.be/ns/generiek#gestructureerdeIdentificator> <http://data.lblod.info/id/gestructureerdeIdentificatoren/eafe6bcd-46bf-4d2d-9616-79a7480d81ad>.
<http://data.lblod.info/id/gestructureerdeIdentificatoren/eafe6bcd-46bf-4d2d-9616-79a7480d81ad>
a <https://data.vlaanderen.be/ns/generiek#GestructureerdeIdentificator>;
<http://mu.semte.ch/vocabularies/core/uuid> "eafe6bcd-46bf-4d2d-9616-79a7480d81ad";
<https://data.vlaanderen.be/ns/generiek#lokaleIdentificator> "OVO003110".
}
}
INSERT DATA {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
<http://data.lblod.info/id/bestuurseenheden/43e3009526dac139a0abdcf75c1ddc5fa3fe9217391d6f64f7b7a30a99a4cda6> <http://www.w3.org/ns/adms#identifier> <http://data.lblod.info/id/identificatoren/1c509343-1c44-4ed6-8c9a-529e4909e638> .
<http://data.lblod.info/id/identificatoren/1c509343-1c44-4ed6-8c9a-529e4909e638> a <http://www.w3.org/ns/adms#Identifier>;
<http://mu.semte.ch/vocabularies/core/uuid> "1c509343-1c44-4ed6-8c9a-529e4909e638";
<http://www.w3.org/2004/02/skos/core#notation> "OVO-nummer";
<https://data.vlaanderen.be/ns/generiek#gestructureerdeIdentificator> <http://data.lblod.info/id/gestructureerdeIdentificatoren/9029d979-8b3f-427a-a3d6-053126aafd14>.
<http://data.lblod.info/id/gestructureerdeIdentificatoren/9029d979-8b3f-427a-a3d6-053126aafd14>
a <https://data.vlaanderen.be/ns/generiek#GestructureerdeIdentificator>;
<http://mu.semte.ch/vocabularies/core/uuid> "9029d979-8b3f-427a-a3d6-053126aafd14";
<https://data.vlaanderen.be/ns/generiek#lokaleIdentificator> "OVO003109".
}
}
INSERT DATA {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
<http://data.lblod.info/id/bestuurseenheden/859f08dcfbc8f68bac0879e7baf6463b260b6f4c16b734d0d1986f5f3af0407b> <http://www.w3.org/ns/adms#identifier> <http://data.lblod.info/id/identificatoren/25d915ea-ee4e-422c-9909-72b993e6e1c4> .
<http://data.lblod.info/id/identificatoren/25d915ea-ee4e-422c-9909-72b993e6e1c4> a <http://www.w3.org/ns/adms#Identifier>;
<http://mu.semte.ch/vocabularies/core/uuid> "25d915ea-ee4e-422c-9909-72b993e6e1c4";
<http://www.w3.org/2004/02/skos/core#notation> "OVO-nummer";
<https://data.vlaanderen.be/ns/generiek#gestructureerdeIdentificator> <http://data.lblod.info/id/gestructureerdeIdentificatoren/33e03e9e-928f-47dc-bbcf-f06b460e9ff1>.
<http://data.lblod.info/id/gestructureerdeIdentificatoren/33e03e9e-928f-47dc-bbcf-f06b460e9ff1>
a <https://data.vlaanderen.be/ns/generiek#GestructureerdeIdentificator>;
<http://mu.semte.ch/vocabularies/core/uuid> "33e03e9e-928f-47dc-bbcf-f06b460e9ff1";
<https://data.vlaanderen.be/ns/generiek#lokaleIdentificator> "OVO003107".
}
}
INSERT DATA {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
<http://data.lblod.info/id/bestuurseenheden/fb56bc40ce36390d2f12fc2057c89d4b6bc5b3217eabd41995b6401318ff648a> <http://www.w3.org/ns/adms#identifier> <http://data.lblod.info/id/identificatoren/36bf4d05-274b-46f0-8c30-1a4ca3e63ef5> .
<http://data.lblod.info/id/identificatoren/36bf4d05-274b-46f0-8c30-1a4ca3e63ef5> a <http://www.w3.org/ns/adms#Identifier>;
<http://mu.semte.ch/vocabularies/core/uuid> "36bf4d05-274b-46f0-8c30-1a4ca3e63ef5";
<http://www.w3.org/2004/02/skos/core#notation> "OVO-nummer";
<https://data.vlaanderen.be/ns/generiek#gestructureerdeIdentificator> <http://data.lblod.info/id/gestructureerdeIdentificatoren/4ec108c1-bf5e-4d5e-88be-755bf91ac1b0>.
<http://data.lblod.info/id/gestructureerdeIdentificatoren/4ec108c1-bf5e-4d5e-88be-755bf91ac1b0>
a <https://data.vlaanderen.be/ns/generiek#GestructureerdeIdentificator>;
<http://mu.semte.ch/vocabularies/core/uuid> "4ec108c1-bf5e-4d5e-88be-755bf91ac1b0";
<https://data.vlaanderen.be/ns/generiek#lokaleIdentificator> "OVO003106".
}
}
INSERT DATA {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
<http://data.lblod.info/id/bestuurseenheden/a2ee394059cce91526392e73e4de974d90caffb92f70cde23b9e9e1a965526fa> <http://www.w3.org/ns/adms#identifier> <http://data.lblod.info/id/identificatoren/86e98e72-e0a5-455f-813c-d95234e0d182> .
<http://data.lblod.info/id/identificatoren/86e98e72-e0a5-455f-813c-d95234e0d182> a <http://www.w3.org/ns/adms#Identifier>;
<http://mu.semte.ch/vocabularies/core/uuid> "86e98e72-e0a5-455f-813c-d95234e0d182";
<http://www.w3.org/2004/02/skos/core#notation> "OVO-nummer";
<https://data.vlaanderen.be/ns/generiek#gestructureerdeIdentificator> <http://data.lblod.info/id/gestructureerdeIdentificatoren/8b960e2f-d34f-44a1-86c1-edab0a267584>.
<http://data.lblod.info/id/gestructureerdeIdentificatoren/8b960e2f-d34f-44a1-86c1-edab0a267584>
a <https://data.vlaanderen.be/ns/generiek#GestructureerdeIdentificator>;
<http://mu.semte.ch/vocabularies/core/uuid> "8b960e2f-d34f-44a1-86c1-edab0a267584";
<https://data.vlaanderen.be/ns/generiek#lokaleIdentificator> "OVO003111".
}
}
INSERT DATA {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
<http://data.lblod.info/id/bestuurseenheden/73e8904d83f7324e39abc0adf639b0e48bc52533c4c243b6419cac8fb70784cf> <http://www.w3.org/ns/adms#identifier> <http://data.lblod.info/id/identificatoren/2d026045-d4e3-4268-810a-948f0cd38198> .
<http://data.lblod.info/id/identificatoren/2d026045-d4e3-4268-810a-948f0cd38198> a <http://www.w3.org/ns/adms#Identifier>;
<http://mu.semte.ch/vocabularies/core/uuid> "2d026045-d4e3-4268-810a-948f0cd38198";
<http://www.w3.org/2004/02/skos/core#notation> "OVO-nummer";
<https://data.vlaanderen.be/ns/generiek#gestructureerdeIdentificator> <http://data.lblod.info/id/gestructureerdeIdentificatoren/80950ff2-ff24-44ac-8e95-f4303efc1fed>.
<http://data.lblod.info/id/gestructureerdeIdentificatoren/80950ff2-ff24-44ac-8e95-f4303efc1fed>
a <https://data.vlaanderen.be/ns/generiek#GestructureerdeIdentificator>;
<http://mu.semte.ch/vocabularies/core/uuid> "80950ff2-ff24-44ac-8e95-f4303efc1fed";
<https://data.vlaanderen.be/ns/generiek#lokaleIdentificator> "OVO003113".
}
}
INSERT DATA {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
<http://data.lblod.info/id/bestuurseenheden/5be3ff820769b385a32e499d17bbf1f15feeacb65381d5384841732dd4a1209b> <http://www.w3.org/ns/adms#identifier> <http://data.lblod.info/id/identificatoren/8c6f7b9d-69e8-44f2-96ec-97171bd1cdde> .
<http://data.lblod.info/id/identificatoren/8c6f7b9d-69e8-44f2-96ec-97171bd1cdde> a <http://www.w3.org/ns/adms#Identifier>;
<http://mu.semte.ch/vocabularies/core/uuid> "8c6f7b9d-69e8-44f2-96ec-97171bd1cdde";
<http://www.w3.org/2004/02/skos/core#notation> "OVO-nummer";
<https://data.vlaanderen.be/ns/generiek#gestructureerdeIdentificator> <http://data.lblod.info/id/gestructureerdeIdentificatoren/8019744a-e4db-4d52-97c0-381a3c384891>.
<http://data.lblod.info/id/gestructureerdeIdentificatoren/8019744a-e4db-4d52-97c0-381a3c384891>
a <https://data.vlaanderen.be/ns/generiek#GestructureerdeIdentificator>;
<http://mu.semte.ch/vocabularies/core/uuid> "8019744a-e4db-4d52-97c0-381a3c384891";
<https://data.vlaanderen.be/ns/generiek#lokaleIdentificator> "OVO003105".
}
}
INSERT DATA {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
<http://data.lblod.info/id/bestuurseenheden/e7a75861661ee14ebe2bca0c79bda8b23f2f943d00a9693d2bff401a8f8dea65> <http://www.w3.org/ns/adms#identifier> <http://data.lblod.info/id/identificatoren/4f3c7aa4-c6f4-421a-85a7-e5cc5da429fa> .
<http://data.lblod.info/id/identificatoren/4f3c7aa4-c6f4-421a-85a7-e5cc5da429fa> a <http://www.w3.org/ns/adms#Identifier>;
<http://mu.semte.ch/vocabularies/core/uuid> "4f3c7aa4-c6f4-421a-85a7-e5cc5da429fa";
<http://www.w3.org/2004/02/skos/core#notation> "OVO-nummer";
<https://data.vlaanderen.be/ns/generiek#gestructureerdeIdentificator> <http://data.lblod.info/id/gestructureerdeIdentificatoren/aad1246a-1fd6-48e8-8551-ad873b7f6f74>.
<http://data.lblod.info/id/gestructureerdeIdentificatoren/aad1246a-1fd6-48e8-8551-ad873b7f6f74>
a <https://data.vlaanderen.be/ns/generiek#GestructureerdeIdentificator>;
<http://mu.semte.ch/vocabularies/core/uuid> "aad1246a-1fd6-48e8-8551-ad873b7f6f74";
<https://data.vlaanderen.be/ns/generiek#lokaleIdentificator> "OVO003108".
}
}
INSERT DATA {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
<http://data.lblod.info/id/bestuurseenheden/f1ad80291fbdc1f0b9b25d729ecc608a8e28fdddab01a1b8e135c841c75586e2> <http://www.w3.org/ns/adms#identifier> <http://data.lblod.info/id/identificatoren/b7bcbf7b-8674-48b0-beb0-1e6ac78a6272> .
<http://data.lblod.info/id/identificatoren/b7bcbf7b-8674-48b0-beb0-1e6ac78a6272> a <http://www.w3.org/ns/adms#Identifier>;
<http://mu.semte.ch/vocabularies/core/uuid> "b7bcbf7b-8674-48b0-beb0-1e6ac78a6272";
<http://www.w3.org/2004/02/skos/core#notation> "OVO-nummer";
<https://data.vlaanderen.be/ns/generiek#gestructureerdeIdentificator> <http://data.lblod.info/id/gestructureerdeIdentificatoren/d613b7f8-dcd9-4af0-bb44-04edd71095ad>.
<http://data.lblod.info/id/gestructureerdeIdentificatoren/d613b7f8-dcd9-4af0-bb44-04edd71095ad>
a <https://data.vlaanderen.be/ns/generiek#GestructureerdeIdentificator>;
<http://mu.semte.ch/vocabularies/core/uuid> "d613b7f8-dcd9-4af0-bb44-04edd71095ad";
<https://data.vlaanderen.be/ns/generiek#lokaleIdentificator> "OVO003112".
}
}

View File

@@ -0,0 +1 @@
http://mu.semte.ch/graphs/worship-service

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,65 @@
DELETE {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
<http://data.lblod.info/id/bestuurseenheden/e852a0c8-e610-4359-9d8f-baa42e1bf5cf> <http://www.w3.org/2004/02/skos/core#prefLabel> "AGB Begijnendijk ".
}
}
INSERT {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
<http://data.lblod.info/id/bestuurseenheden/e852a0c8-e610-4359-9d8f-baa42e1bf5cf> <http://www.w3.org/2004/02/skos/core#prefLabel> "AGB Begijnendijk".
}
}
DELETE {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
<http://data.lblod.info/id/bestuurseenheden/3a12adea-221a-4a11-8961-3503598bbaf7> <http://www.w3.org/2004/02/skos/core#prefLabel> "AGB Beleko ".
}
}
INSERT {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
<http://data.lblod.info/id/bestuurseenheden/3a12adea-221a-4a11-8961-3503598bbaf7> <http://www.w3.org/2004/02/skos/core#prefLabel> "AGB Beleko".
}
}
DELETE {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
<http://data.lblod.info/id/bestuurseenheden/f06cc0f693ac44d63dffbb8573da4b1ae2777decbaa9f3252aa50987ae6ed28b> <http://www.w3.org/2004/02/skos/core#prefLabel> "AGB Pelt ".
}
}
INSERT {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
<http://data.lblod.info/id/bestuurseenheden/f06cc0f693ac44d63dffbb8573da4b1ae2777decbaa9f3252aa50987ae6ed28b> <http://www.w3.org/2004/02/skos/core#prefLabel> "AGB Pelt".
}
}
DELETE {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
<http://data.lblod.info/id/bestuurseenheden/a782c3c4e64bceeef7707ad4175aca615843683fc32c1a50249feee5beb3c43e> <http://www.w3.org/2004/02/skos/core#prefLabel> "AGB  voor infrastructuur- en patrimoniumbeheer Turnhout".
}
}
INSERT {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
<http://data.lblod.info/id/bestuurseenheden/a782c3c4e64bceeef7707ad4175aca615843683fc32c1a50249feee5beb3c43e> <http://www.w3.org/2004/02/skos/core#prefLabel> "AGB voor infrastructuur- en patrimoniumbeheer Turnhout".
}
}
DELETE {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
<http://data.lblod.info/id/bestuurseenheden/807d593ab5dd6a809ae8e9b9b585e97af857cff3850ef62053a6c7df86a223e0> <http://www.w3.org/2004/02/skos/core#prefLabel> "Stadsontwikkelingsbedrijf Kortrijk ".
}
}
INSERT {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
<http://data.lblod.info/id/bestuurseenheden/807d593ab5dd6a809ae8e9b9b585e97af857cff3850ef62053a6c7df86a223e0> <http://www.w3.org/2004/02/skos/core#prefLabel> "Stadsontwikkelingsbedrijf Kortrijk".
}
}
DELETE {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
<http://data.lblod.info/id/bestuurseenheden/70285c2d-2045-414e-bd49-56155a736e56> <http://www.w3.org/2004/02/skos/core#prefLabel> "Stedelijk Parkeerbedrijf van de stad Gent ".
}
}
INSERT {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
<http://data.lblod.info/id/bestuurseenheden/70285c2d-2045-414e-bd49-56155a736e56> <http://www.w3.org/2004/02/skos/core#prefLabel> "Stedelijk Parkeerbedrijf van de stad Gent".
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,78 @@
# Every value that is in the admin unit graph but NOT in the landing graph means that it has not been
# ingested via the consumer, and has to be cleared out
DELETE {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
?s ?predicate ?value .
}
} WHERE {
VALUES ?predicate {
<http://www.w3.org/ns/org#hasMembership>
<http://www.w3.org/ns/org#holds>
<http://data.vlaanderen.be/ns/mandaat#status>
<http://data.vlaanderen.be/ns/mandaat#isBestuurlijkeAliasVan>
<http://data.vlaanderen.be/ns/mandaat#beleidsdomein>
<http://data.vlaanderen.be/ns/mandaat#rangorde>
}
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
?s a <http://data.vlaanderen.be/ns/mandaat#Mandataris> ;
?predicate ?value .
}
FILTER NOT EXISTS {
GRAPH <http://mu.semte.ch/graphs/landing-zone/mandatarissen> {
?s a <http://data.vlaanderen.be/ns/mandaat#Mandataris> ;
?predicate ?value .
}
}
}
;
# Now, handling dates is more complex as dates in OP are datetimes in Loket
DELETE {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
?s ?predicate ?date .
}
} WHERE {
VALUES ?predicate {
<http://data.vlaanderen.be/ns/mandaat#start>
<http://data.vlaanderen.be/ns/mandaat#einde>
}
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
?s a <http://data.vlaanderen.be/ns/mandaat#Mandataris> ;
?predicate ?date .
}
FILTER NOT EXISTS {
GRAPH <http://mu.semte.ch/graphs/landing-zone/mandatarissen> {
?s a <http://data.vlaanderen.be/ns/mandaat#Mandataris> ;
?predicate ?datetime .
}
BIND(?datetime + xsd:duration('PT2H') as ?dateInOurTimezone)
# convert to strings
BIND(STR(year(?dateInOurTimezone)) AS ?year)
BIND(STR(month(?dateInOurTimezone)) AS ?month)
BIND(STR(day(?dateInOurTimezone)) AS ?day)
# pad with zeros
BIND(CONCAT("00", ?year) AS ?paddedYear)
BIND(CONCAT("0000", ?month) AS ?paddedMonth)
BIND(CONCAT("00", ?day) AS ?paddedDay)
# extract the right number of digits from the padded strings
BIND(SUBSTR(?paddedYear, STRLEN(?paddedYear)-3) AS ?fourDigitYear)
BIND(SUBSTR(?paddedDay, STRLEN(?paddedDay)-1) AS ?twoDigitDay)
BIND(SUBSTR(?paddedMonth, STRLEN(?paddedMonth)-1) AS ?twoDigitMonth)
# put it all back together
BIND(xsd:date(CONCAT(?fourDigitYear, "-", ?twoDigitMonth, "-", ?twoDigitDay)) as ?datetimeToDate)
FILTER (?datetimeToDate = ?date)
}
}

View File

@@ -0,0 +1,25 @@
PREFIX owl: <http://www.w3.org/2002/07/owl#>
INSERT {
GRAPH ?g {
?s owl:sameAs ?ovoUriToInsert .
}
} WHERE {
VALUES ?g {
<http://mu.semte.ch/graphs/administrative-unit>
<http://mu.semte.ch/graphs/worship-service>
}
GRAPH ?g {
?s <http://www.w3.org/ns/adms#identifier> ?id .
?id <http://www.w3.org/2004/02/skos/core#notation> "OVO-nummer" ;
<https://data.vlaanderen.be/ns/generiek#gestructureerdeIdentificator>/<https://data.vlaanderen.be/ns/generiek#lokaleIdentificator> ?ovo .
}
?s <http://www.w3.org/ns/org#classification>/skos:prefLabel ?classif .
FILTER(strlen(str(?ovo)) > 0)
FILTER NOT EXISTS { ?s owl:sameAs ?ovoUri . }
BIND(URI(CONCAT("http://data.vlaanderen.be/id/organisatie/", ?ovo)) as ?ovoUriToInsert)
}

View File

@@ -0,0 +1,117 @@
# Every value that is in the admin unit graph but NOT in the landing graph means that it has not been
# ingested via the consumer, and has to be cleared out
DELETE {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
?contactPoint ?predicate ?value .
}
} WHERE {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
?s a <http://data.lblod.info/vocabularies/leidinggevenden/Functionaris> ;
<http://www.w3.org/ns/org#holds>/<http://schema.org/contactPoint> ?contactPoint.
?contactPoint ?predicate ?value .
}
FILTER NOT EXISTS {
GRAPH <http://mu.semte.ch/graphs/landing-zone/leidinggevenden> {
?contactPoint ?predicate ?value .
}
}
}
;
DELETE {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
?bestuursfunctie ?predicate ?value .
}
} WHERE {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
?s a <http://data.lblod.info/vocabularies/leidinggevenden/Functionaris> ;
<http://www.w3.org/ns/org#holds> ?bestuursfunctie.
?bestuursfunctie ?predicate ?value .
}
FILTER NOT EXISTS {
GRAPH <http://mu.semte.ch/graphs/landing-zone/leidinggevenden> {
?bestuursfunctie ?predicate ?value .
}
}
}
;
DELETE {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
?s ?predicate ?value .
}
} WHERE {
VALUES ?predicate {
<http://www.w3.org/ns/org#holds>
<http://data.vlaanderen.be/ns/mandaat#status>
<http://data.vlaanderen.be/ns/mandaat#isBestuurlijkeAliasVan>
<http://data.vlaanderen.be/ns/mandaat#beleidsdomein>
<http://data.vlaanderen.be/ns/mandaat#rangorde>
}
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
?s a <http://data.lblod.info/vocabularies/leidinggevenden/Functionaris> ;
?predicate ?value .
}
FILTER NOT EXISTS {
GRAPH <http://mu.semte.ch/graphs/landing-zone/leidinggevenden> {
?s a <http://data.lblod.info/vocabularies/leidinggevenden/Functionaris> ;
?predicate ?value .
}
}
}
;
# Now, handling dates is more complex as dates in OP are datetimes in Loket
DELETE {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
?s ?predicate ?date .
}
} WHERE {
VALUES ?predicate {
<http://data.vlaanderen.be/ns/mandaat#start>
<http://data.vlaanderen.be/ns/mandaat#einde>
}
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
?s a <http://data.lblod.info/vocabularies/leidinggevenden/Functionaris> ;
?predicate ?date .
}
FILTER NOT EXISTS {
GRAPH <http://mu.semte.ch/graphs/landing-zone/leidinggevenden> {
?s a <http://data.lblod.info/vocabularies/leidinggevenden/Functionaris> ;
?predicate ?datetime .
}
BIND(?datetime + xsd:duration('PT2H') as ?dateInOurTimezone)
# convert to strings
BIND(STR(year(?dateInOurTimezone)) AS ?year)
BIND(STR(month(?dateInOurTimezone)) AS ?month)
BIND(STR(day(?dateInOurTimezone)) AS ?day)
# pad with zeros
BIND(CONCAT("00", ?year) AS ?paddedYear)
BIND(CONCAT("0000", ?month) AS ?paddedMonth)
BIND(CONCAT("00", ?day) AS ?paddedDay)
# extract the right number of digits from the padded strings
BIND(SUBSTR(?paddedYear, STRLEN(?paddedYear)-3) AS ?fourDigitYear)
BIND(SUBSTR(?paddedDay, STRLEN(?paddedDay)-1) AS ?twoDigitDay)
BIND(SUBSTR(?paddedMonth, STRLEN(?paddedMonth)-1) AS ?twoDigitMonth)
# put it all back together
BIND(xsd:date(CONCAT(?fourDigitYear, "-", ?twoDigitMonth, "-", ?twoDigitDay)) as ?datetimeToDate)
FILTER (?datetimeToDate = ?date)
}
}

View File

@@ -0,0 +1,16 @@
DELETE {
GRAPH ?g {
?bestuur <http://www.w3.org/ns/org#hasSite> ?site .
}
} WHERE {
VALUES ?g {
<http://mu.semte.ch/graphs/administrative-unit>
<http://mu.semte.ch/graphs/worship-service>
}
GRAPH ?g {
?site a <http://www.w3.org/ns/org#Site> .
?bestuur <http://www.w3.org/ns/org#hasPrimarySite> ?site ;
<http://www.w3.org/ns/org#hasSite> ?site .
}
}

View File

@@ -0,0 +1 @@
http://mu.semte.ch/graphs/administrative-unit

View File

@@ -0,0 +1 @@
http://mu.semte.ch/graphs/administrative-unit

View File

@@ -0,0 +1 @@
http://mu.semte.ch/graphs/administrative-unit

View File

@@ -0,0 +1 @@
http://mu.semte.ch/graphs/public

Some files were not shown because too many files have changed in this diff Show More