Compare commits

...

108 Commits

Author SHA1 Message Date
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
109 changed files with 81904 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,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

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 @@
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

View File

@@ -0,0 +1,13 @@
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .
@prefix ns2: <http://mu.semte.ch/vocabularies/ext/> .
@prefix ns3: <http://mu.semte.ch/vocabularies/core/> .
@prefix ns4: <http://data.vlaanderen.be/id/conceptscheme/> .
@prefix ns5: <http://data.lblod.info/id/conceptscheme/> .
<http://data.vlaanderen.be/id/concept/BestuursfunctieCode/855489b9-b584-4f34-90b2-39aea808cd9f>
rdf:type skos:Concept , ns2:BestuursfunctieCode ;
ns3:uuid "855489b9-b584-4f34-90b2-39aea808cd9f" ;
skos:prefLabel "Leidend ambtenaar" ;
skos:topConceptOf ns4:BestuursfunctieCode , ns5:LocalOfficerMandateRole ;
skos:inScheme ns5:LocalOfficerMandateRole .

View File

@@ -0,0 +1,149 @@
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX person: <http://www.w3.org/ns/person#>
PREFIX persoon: <https://data.vlaanderen.be/ns/persoon#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX schema: <http://schema.org/>
PREFIX mandaat: <http://data.vlaanderen.be/ns/mandaat#>
PREFIX locn: <http://www.w3.org/ns/locn#>
PREFIX adres: <https://data.vlaanderen.be/ns/adres#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX generiek: <https://data.vlaanderen.be/ns/generiek#>
DELETE {
GRAPH ?g {
?person foaf:familyName ?fn.
?person foaf:givenName ?gn.
?person persoon:gebruikteVoornaam ?gvn.
}
} INSERT {
GRAPH ?g {
?person foaf:givenName ?gn_s.
?person foaf:familyName ?fn_s.
?person persoon:gebruikteVoornaam ?gvn_s.
}
} WHERE {
VALUES ?g { <http://mu.semte.ch/graphs/organisatieportaal> <http://redpencil.data.gift/id/deltas/producer/organizations>}
GRAPH ?g {
BIND("njbyevfeRTE8651B" AS ?salt).
?person a person:Person.
OPTIONAL {
?person foaf:givenName ?gn.
BIND(SHA1(CONCAT(?salt, ?gn)) AS ?gn_s).
}
OPTIONAL {
?person foaf:familyName ?fn.
BIND(SHA1(CONCAT(?salt, ?fn)) AS ?fn_s).
}
OPTIONAL {
?person persoon:gebruikteVoornaam ?gvn.
BIND(SHA1(CONCAT(?salt, ?gvn)) AS ?gvn_s).
}
}
}
;
DELETE {
GRAPH ?h {
?birth persoon:datum ?dob.
?identificator generiek:lokaleIdentificator ?rrn .
?person persoon:heeftNationaliteit ?nationality .
?person persoon:geslacht ?gender .
}
} INSERT {
GRAPH ?h {
?birth persoon:datum "1977-01-01T00:00:00Z"^^xsd:dateTime .
?identificator generiek:lokaleIdentificator "42012205181" .
}
} WHERE {
VALUES ?g { <http://mu.semte.ch/graphs/organisatieportaal> <http://redpencil.data.gift/id/deltas/producer/organizations>}
VALUES ?h { <http://mu.semte.ch/graphs/privacy-centric-graph> }
GRAPH ?g {
?person a person:Person.
}
GRAPH ?h {
OPTIONAL {
?person persoon:heeftGeboorte ?birth .
?birth persoon:datum ?dob.
}
OPTIONAL {
?person persoon:registratie/generiek:gestructureerdeIdentificator ?identificator .
?identificator generiek:lokaleIdentificator ?rrn .
}
OPTIONAL {
?person persoon:geslacht ?gender .
}
OPTIONAL {
?person persoon:heeftNationaliteit ?nationality .
}
}
}
;
DELETE {
GRAPH ?g {
?cp schema:telephone ?phone.
?cp schema:email ?mail.
?address locn:fullAddress ?fa.
?address adres:Adresvoorstelling.huisnummer ?huisnr.
?address adres:Adresvoorstelling.busnummer ?busnr.
?address locn:thoroughfare ?street.
?address locn:postCode ?postCode.
?address adres:gemeentenaam ?gemeente.
}
} INSERT {
GRAPH ?g {
?cp schema:telephone ?phone_s.
?cp schema:email ?mail_s.
?address locn:fullAddress ?fa_s.
?address adres:Adresvoorstelling.huisnummer ?huisnr_s.
?address adres:Adresvoorstelling.busnummer ?busnr_s.
?address locn:thoroughfare ?street_s.
?address locn:postCode ?postCode_s.
?address adres:gemeentenaam ?gemeente_s.
}
} WHERE {
VALUES ?g { <http://mu.semte.ch/graphs/organisatieportaal> <http://redpencil.data.gift/id/deltas/producer/organizations>}
GRAPH ?g {
BIND("njbyevfeRTE8651B" AS ?salt).
?cp a <http://schema.org/ContactPoint> .
OPTIONAL {
?cp schema:telephone ?phone.
BIND(SHA1(CONCAT(?salt, ?phone)) AS ?phone_s).
}
OPTIONAL {
?cp schema:email ?mail.
BIND(CONCAT(SHA1(CONCAT(?salt, ?mail)), "@email.com") AS ?mail_s).
}
OPTIONAL {
?cp locn:address ?address.
OPTIONAL {
?address locn:fullAddress ?fa.
BIND(SHA1(CONCAT(?salt, ?fa)) AS ?fa_s).
}
OPTIONAL {
?address adres:Adresvoorstelling.huisnummer ?huisnr.
BIND(SHA1(CONCAT(?salt, ?huisnr)) AS ?huisnr_s).
}
OPTIONAL {
?address adres:Adresvoorstelling.busnummer ?busnr.
BIND(SHA1(CONCAT(?salt, ?busnr)) AS ?busnr_s).
}
OPTIONAL {
?address locn:thoroughfare ?street.
BIND(SHA1(CONCAT(?salt, ?street)) AS ?street_s).
}
OPTIONAL {
?address locn:postCode ?postCode.
BIND(SHA1(CONCAT(?salt, ?postCode)) AS ?postCode_s).
}
OPTIONAL {
?address adres:gemeentenaam ?gemeente.
BIND(SHA1(CONCAT(?salt, ?gemeente)) AS ?gemeente_s).
}
}
}
}

View File

@@ -293,16 +293,6 @@ PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
?s persoon:datumVanAfstamming ?o
}.
{
{
?s persoon_loket:gebruikteVoornaam ?o
} e:becomes {
?s persoon:gebruikteVoornaam ?o
}
} => {
?s persoon:gebruikteVoornaam ?o
}.
{
{
?s persoon_loket:geslacht ?o

View File

@@ -49,12 +49,6 @@
?s a <http://data.vlaanderen.be/ns/besluit#Bestuursorgaan>
}.
{
?s a <http://data.vlaanderen.be/ns/mandaat#Fractie>
} => {
?s a <http://data.vlaanderen.be/ns/mandaat#Fractie>
}.
{
?s a <http://data.vlaanderen.be/ns/mandaat#Mandaat>
} => {

View File

@@ -18,7 +18,6 @@ PREFIX skos:<http://www.w3.org/2004/02/skos/core#>
PREFIX string: <http://www.w3.org/2000/10/swap/string#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
# Inverse properties
{
?s org:holds ?o.

View File

@@ -18,7 +18,6 @@ PREFIX skos:<http://www.w3.org/2004/02/skos/core#>
PREFIX string: <http://www.w3.org/2000/10/swap/string#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
# DL and OP both use persoon:gebruikteVoornaam but with different semantics (!)
# Hence the mapping is in two steps.
# The first step maps the DL persoon:gebruikteVoornaam to the OP counterpart
@@ -92,6 +91,31 @@ PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
?s mandaat:einde ?eindeDate
}.
{
?s mandaat:bindingStart ?bindingStartDateTime.
# use backward arrow rule defined below
?bindingStartDateTime :dateFromDateTime ?bindingStartDate.
{
?s mandaat:bindingStart ?bindingStartDateTime
} e:becomes {
?s mandaat:bindingStart ?bindingStartDate
}.
} => {
?s mandaat:bindingStart ?bindingStartDate
}.
{
?s mandaat:bindingEinde ?bindingEindeDateTime.
# use backward arrow rule defined below
?bindingEindeDateTime :dateFromDateTime ?bindingEindeDate.
{
?s mandaat:bindingEinde ?bindingEindeDateTime
} e:becomes {
?s mandaat:bindingEinde ?bindingEindeDate
}.
} => {
?s mandaat:bindingEinde ?bindingEindeDate
}.
# Backward arrow rule is like a function call.
# Removes time info in the returned date

View File

@@ -18,7 +18,6 @@ PREFIX skos:<http://www.w3.org/2004/02/skos/core#>
PREFIX string: <http://www.w3.org/2000/10/swap/string#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
# Map from http persoon to https persoon namespace.
## classes:
@@ -293,16 +292,6 @@ PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
?s persoon:datumVanAfstamming ?o
}.
{
{
?s persoon_loket:gebruikteVoornaam ?o
} e:becomes {
?s persoon:gebruikteVoornaam ?o
}
} => {
?s persoon:gebruikteVoornaam ?o
}.
{
{
?s persoon_loket:geslacht ?o

View File

@@ -0,0 +1,188 @@
# Filtering classes to ingest
@prefix log: <http://www.w3.org/2000/10/swap/log#> .
{
?s a <http://www.w3.org/ns/person#Person> ;
?p ?o .
} => {
?s a <http://www.w3.org/ns/person#Person> ;
?p ?o .
}.
{
?s a <http://www.w3.org/ns/locn#Address> ;
?p ?o .
} => {
?s a <http://www.w3.org/ns/locn#Address> ;
?p ?o .
}.
{
?s a <http://schema.org/ContactPoint> ;
?p ?o .
} => {
?s a <http://schema.org/ContactPoint> ;
?p ?o .
}.
# Functionarissen should be linked to a agb, apb, gemeente, district, provincie or ocmw only (FOR NOW)
{
?s a <http://data.lblod.info/vocabularies/leidinggevenden/Functionaris> ;
<http://www.w3.org/ns/org#holds> ?bestuursfunctie ;
?p ?o .
?orgaanInTime <http://data.lblod.info/vocabularies/leidinggevenden/heeftBestuursfunctie> ?bestuursfunctie ;
<https://data.vlaanderen.be/ns/generiek#isTijdspecialisatieVan> ?orgaan .
?orgaan <http://data.vlaanderen.be/ns/besluit#bestuurt> ?bestuur .
?bestuur <http://www.w3.org/ns/org#classification> <http://data.vlaanderen.be/id/concept/BestuurseenheidClassificatieCode/5ab0e9b8a3b2ca7c5e000000> .
} => {
?s a <http://data.lblod.info/vocabularies/leidinggevenden/Functionaris> ;
?p ?o .
}.
{
?s a <http://data.lblod.info/vocabularies/leidinggevenden/Functionaris> ;
<http://www.w3.org/ns/org#holds> ?bestuursfunctie ;
?p ?o .
?orgaanInTime <http://data.lblod.info/vocabularies/leidinggevenden/heeftBestuursfunctie> ?bestuursfunctie ;
<https://data.vlaanderen.be/ns/generiek#isTijdspecialisatieVan> ?orgaan .
?orgaan <http://data.vlaanderen.be/ns/besluit#bestuurt> ?bestuur .
?bestuur <http://www.w3.org/ns/org#classification> <http://data.vlaanderen.be/id/concept/BestuurseenheidClassificatieCode/5ab0e9b8a3b2ca7c5e000001> .
} => {
?s a <http://data.lblod.info/vocabularies/leidinggevenden/Functionaris> ;
?p ?o .
}.
{
?s a <http://data.lblod.info/vocabularies/leidinggevenden/Functionaris> ;
<http://www.w3.org/ns/org#holds> ?bestuursfunctie ;
?p ?o .
?orgaanInTime <http://data.lblod.info/vocabularies/leidinggevenden/heeftBestuursfunctie> ?bestuursfunctie ;
<https://data.vlaanderen.be/ns/generiek#isTijdspecialisatieVan> ?orgaan .
?orgaan <http://data.vlaanderen.be/ns/besluit#bestuurt> ?bestuur .
?bestuur <http://www.w3.org/ns/org#classification> <http://data.vlaanderen.be/id/concept/BestuurseenheidClassificatieCode/5ab0e9b8a3b2ca7c5e000002> .
} => {
?s a <http://data.lblod.info/vocabularies/leidinggevenden/Functionaris> ;
?p ?o .
}.
{
?s a <http://data.lblod.info/vocabularies/leidinggevenden/Functionaris> ;
<http://www.w3.org/ns/org#holds> ?bestuursfunctie ;
?p ?o .
?orgaanInTime <http://data.lblod.info/vocabularies/leidinggevenden/heeftBestuursfunctie> ?bestuursfunctie ;
<https://data.vlaanderen.be/ns/generiek#isTijdspecialisatieVan> ?orgaan .
?orgaan <http://data.vlaanderen.be/ns/besluit#bestuurt> ?bestuur .
?bestuur <http://www.w3.org/ns/org#classification> <http://data.vlaanderen.be/id/concept/BestuurseenheidClassificatieCode/5ab0e9b8a3b2ca7c5e000003> .
} => {
?s a <http://data.lblod.info/vocabularies/leidinggevenden/Functionaris> ;
?p ?o .
}.
{
?s a <http://data.lblod.info/vocabularies/leidinggevenden/Functionaris> ;
<http://www.w3.org/ns/org#holds> ?bestuursfunctie ;
?p ?o .
?orgaanInTime <http://data.lblod.info/vocabularies/leidinggevenden/heeftBestuursfunctie> ?bestuursfunctie ;
<https://data.vlaanderen.be/ns/generiek#isTijdspecialisatieVan> ?orgaan .
?orgaan <http://data.vlaanderen.be/ns/besluit#bestuurt> ?bestuur .
?bestuur <http://www.w3.org/ns/org#classification> <http://data.vlaanderen.be/id/concept/BestuurseenheidClassificatieCode/36a82ba0-7ff1-4697-a9dd-2e94df73b721> .
} => {
?s a <http://data.lblod.info/vocabularies/leidinggevenden/Functionaris> ;
?p ?o .
}.
{
?s a <http://data.lblod.info/vocabularies/leidinggevenden/Functionaris> ;
<http://www.w3.org/ns/org#holds> ?bestuursfunctie ;
?p ?o .
?orgaanInTime <http://data.lblod.info/vocabularies/leidinggevenden/heeftBestuursfunctie> ?bestuursfunctie ;
<https://data.vlaanderen.be/ns/generiek#isTijdspecialisatieVan> ?orgaan .
?orgaan <http://data.vlaanderen.be/ns/besluit#bestuurt> ?bestuur .
?bestuur <http://www.w3.org/ns/org#classification> <http://data.vlaanderen.be/id/concept/BestuurseenheidClassificatieCode/80310756-ce0a-4a1b-9b8e-7c01b6cc7a2d> .
} => {
?s a <http://data.lblod.info/vocabularies/leidinggevenden/Functionaris> ;
?p ?o .
}.
# Mandatarissen should be linked to a gemeente, district, provincie or ocmw only (FOR NOW)
{
?s a <http://data.vlaanderen.be/ns/mandaat#Mandataris> ;
<http://www.w3.org/ns/org#holds> ?mandate ;
?p ?o .
?orgaanInTime <http://www.w3.org/ns/org#hasPost> ?mandate ;
<https://data.vlaanderen.be/ns/generiek#isTijdspecialisatieVan> ?orgaan .
?orgaan <http://data.vlaanderen.be/ns/besluit#bestuurt> ?bestuur .
?bestuur <http://www.w3.org/ns/org#classification> <http://data.vlaanderen.be/id/concept/BestuurseenheidClassificatieCode/5ab0e9b8a3b2ca7c5e000000> .
} => {
?s a <http://data.vlaanderen.be/ns/mandaat#Mandataris> ;
?p ?o .
}.
{
?s a <http://data.vlaanderen.be/ns/mandaat#Mandataris> ;
<http://www.w3.org/ns/org#holds> ?mandate ;
?p ?o .
?orgaanInTime <http://www.w3.org/ns/org#hasPost> ?mandate ;
<https://data.vlaanderen.be/ns/generiek#isTijdspecialisatieVan> ?orgaan .
?orgaan <http://data.vlaanderen.be/ns/besluit#bestuurt> ?bestuur .
?bestuur <http://www.w3.org/ns/org#classification> <http://data.vlaanderen.be/id/concept/BestuurseenheidClassificatieCode/5ab0e9b8a3b2ca7c5e000001> .
} => {
?s a <http://data.vlaanderen.be/ns/mandaat#Mandataris> ;
?p ?o .
}.
{
?s a <http://data.vlaanderen.be/ns/mandaat#Mandataris> ;
<http://www.w3.org/ns/org#holds> ?mandate ;
?p ?o .
?orgaanInTime <http://www.w3.org/ns/org#hasPost> ?mandate ;
<https://data.vlaanderen.be/ns/generiek#isTijdspecialisatieVan> ?orgaan .
?orgaan <http://data.vlaanderen.be/ns/besluit#bestuurt> ?bestuur .
?bestuur <http://www.w3.org/ns/org#classification> <http://data.vlaanderen.be/id/concept/BestuurseenheidClassificatieCode/5ab0e9b8a3b2ca7c5e000002> .
} => {
?s a <http://data.vlaanderen.be/ns/mandaat#Mandataris> ;
?p ?o .
}.
{
?s a <http://data.vlaanderen.be/ns/mandaat#Mandataris> ;
<http://www.w3.org/ns/org#holds> ?mandate ;
?p ?o .
?orgaanInTime <http://www.w3.org/ns/org#hasPost> ?mandate ;
<https://data.vlaanderen.be/ns/generiek#isTijdspecialisatieVan> ?orgaan .
?orgaan <http://data.vlaanderen.be/ns/besluit#bestuurt> ?bestuur .
?bestuur <http://www.w3.org/ns/org#classification> <http://data.vlaanderen.be/id/concept/BestuurseenheidClassificatieCode/5ab0e9b8a3b2ca7c5e000003> .
} => {
?s a <http://data.vlaanderen.be/ns/mandaat#Mandataris> ;
?p ?o .
}.
{
?s a <http://www.w3.org/ns/org#Membership> ;
?p ?o .
} => {
?s a <http://www.w3.org/ns/org#Membership> ;
?p ?o .
}.
{
?s a <http://www.w3.org/ns/prov#Location> ;
?p ?o .
} => {
?s a <http://www.w3.org/ns/prov#Location> ;
?p ?o .
}.

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