Compare commits

...

178 Commits

Author SHA1 Message Date
Claire Lovisa
848d3b893d Propagate contact info to pz secondary sites (#348) 2023-11-10 10:03:01 +01:00
Claire Lovisa
4443e7de5f Bump frontend 2023-11-08 16:07:07 +01:00
Claire Lovisa
7128591a49 Add contact info PZ & HVZ (#347) 2023-11-08 15:35:53 +01:00
Claire Lovisa
d19464ce36 Fix vast bureau concept data (#346) 2023-11-08 11:02:17 +01:00
Claire Lovisa
42cb016c47 Bump frontend 2023-10-31 14:04:33 +01:00
Claire Lovisa
bd9058d186 Merge branch 'development' 2023-10-31 14:04:07 +01:00
Claire Lovisa
fcbe6c60be Add hoofdcommissariaat addresses to PZ (#345) 2023-10-31 10:03:35 +01:00
Claire Lovisa
d0238045bd Primary sites and related organizations of Politiezones and Hulpverleningszones (#344)
* Add primary sites of PZ and HVZ

* Add related organizations of PZ and HVZ
2023-10-30 16:04:25 +01:00
Nordine Bittich
3f37d7ebbc Feature/non admin units (#342) 2023-10-30 09:05:06 +01:00
Claire Lovisa
ada7193f73 Add new site type hoofdcommissariaat (#343) 2023-10-26 11:02:21 +02:00
Claire Lovisa
ad20c5efb2 Remove empty administrative units (#341) 2023-10-20 15:17:15 +02:00
Claire Lovisa
36e638c262 Reorganize migrations 2023-10-10 13:30:32 +02:00
Alexander van den Berghe
1902b4b9e4 Merge pull request #340 from lblod/fix/identifier-index
Fix: add an alphanumeric only index field for identifiers
2023-10-09 11:07:32 +00:00
Alexander van den Berghe
81963cb4c8 Fix: add an alphanumeric only index field for identifiers 2023-10-06 19:27:21 +02:00
Claire Lovisa
60b9459854 Set up auto sync of OVO numbers (#333)
* Add delta rules

* Remove delta rules

We need to use a direct endpoint to trigger the update instead of the
deltas to be able to see in the frontend the direct result of our change

* Add dispatching rule to sync ovo service

* Add released sync-ovo-number service
2023-10-06 11:31:40 +02:00
Claire Lovisa
c35b3c6c3a Import PZ & HVZ basic data (#339) 2023-10-06 10:51:08 +02:00
Claire Lovisa
ef50e761f8 Bump privacy service 2023-10-05 19:03:29 +02:00
Alexander van den Berghe
b4804f1ef3 Merge pull request #338 from lblod/bump-mu-search
Bumped mu-search version to 0.9.1
2023-10-05 11:53:48 +00:00
Alexander van den Berghe
f6cc456483 Bumped mu-search version to 0.9.1 2023-10-05 12:32:24 +02:00
Alexander van den Berghe
8494a22621 Merge pull request #337 from lblod/feature/index-unit-identifiers
Feature: index identifiers for administrative units
2023-10-05 07:59:57 +00:00
Alexander van den Berghe
0265b73a27 Index identifiers for administrative units 2023-10-04 10:32:06 +02:00
Dachamelemon
281e7fcfe0 Merge pull request #335 from lblod/feature/abp-ovo-number-migration
Insert missing ovo numbers of APBs
2023-10-02 09:46:31 +02:00
Elias Papanikitas
76bbfb9300 feature: insert missing ovo numbers for every item found in wegwijs #REF: OP-2633 2023-09-26 09:25:04 +02:00
Aad Versteden
4b3ee6ef58 chore: bump mu-identifier (#334)
Bumps runtime and more aggressive header clearing for requests.
2023-09-25 10:02:44 +02:00
Claire Lovisa
c5699d6bf5 Merge branch 'master' into development 2023-09-19 18:19:22 +02:00
Claire Lovisa
ad8f2620da Bump frontend 2023-09-19 18:14:12 +02:00
Claire Lovisa
7e37be687b Onboarding PZ/HPZ - frontend compatibility changes (#330)
* Bump construct-administrative-unit-relationships

* Add change event
2023-09-18 16:51:31 +02:00
Claire Lovisa
2644c38743 Bump frontend 2023-09-14 13:43:19 +02:00
Claire Lovisa
cd2f4192d0 Fix related orgs igs migration (#329) 2023-09-14 10:15:08 +02:00
Claire Lovisa
aac58980d8 Add related municipalities of IGS (#328) 2023-09-13 15:35:45 +02:00
Claire Lovisa
b89fcc548c Add AGBs and APBs related organizations (#319) 2023-09-13 11:25:30 +02:00
Oscar Rodriguez Villalobos
190374cdcf Import igs contact data (#327) 2023-09-13 11:16:48 +02:00
Claire Lovisa
6b02956eb2 Remove wrong classification from IGS IW (#326) 2023-09-13 11:16:21 +02:00
Claire Lovisa
501973c4cf Merge pull request #320 from lblod/feature/add-related-orgs-igs
Add IGS related organizations
2023-09-13 11:16:06 +02:00
Claire Lovisa
075bde44af Merge pull request #325 from lblod/chore/missing-restart-always
Add missing restart statements
2023-09-12 12:38:47 +02:00
Claire Lovisa
328fcc5511 Add missing restart statements 2023-09-12 11:14:22 +02:00
Claire Lovisa
537274c6c0 Merge branch 'master' into development 2023-09-11 11:42:23 +02:00
Boris De Vloed
db769f80a6 cleanup leidinggevenden 2023-09-11 11:40:48 +02:00
Claire Lovisa
a732d788b7 Merge pull request #318 from lblod/fix/clear-leidinggevenden-outdated-data
cleanup leidinggevenden
2023-09-11 11:39:29 +02:00
Claire Lovisa
f9ebd17d17 Merge branch 'master' into development 2023-09-08 11:17:39 +02:00
Claire Lovisa
29bd4c9d56 Merge pull request #324 from lblod/hotfix/duplicated-primary-sites
Fix duplicated primary sites
2023-09-08 11:15:53 +02:00
Claire Lovisa
2587ba6daf Fix double sites in the data 2023-09-07 13:42:57 +02:00
Claire Lovisa
4070bde4ab Bump frontend 2023-09-07 13:41:55 +02:00
Oscar Rodriguez Villalobos
ffceadc491 Merge pull request #323 from lblod/feat/import-igs-addresses
Add migration to import igs address
2023-09-07 13:36:50 +02:00
Oscar Rodriguez Villalobos
be7625a31e Add migration to import igs address 2023-09-07 11:53:57 +02:00
Claire Lovisa
6b7672df9f Add IGS related organizations 2023-08-29 17:42:54 +02:00
Claire Lovisa
b1c2f12c71 Generate functies for new agbs and apbs (#317) 2023-08-28 12:47:33 +02:00
Oscar Rodriguez Villalobos
6895f75b2b Merge pull request #316 from lblod/feature/import-igs
add migration to import igs from csv
2023-08-28 12:21:56 +02:00
Oscar
7ccdbad0f1 fixed migrations 2023-08-28 11:25:08 +02:00
Boris De Vloed
a5a94769a7 cleanup leidinggevenden 2023-08-25 16:27:14 +02:00
Oscar
bed834e9b9 fixed migration and add bestuursorgaan 2023-08-24 10:48:56 +02:00
Oscar
5ebb1d3f03 add migration to import igs from csv 2023-08-16 15:40:48 +02:00
Nordine Bittich
20c240d481 bump frontend 2023-08-14 19:39:17 +02:00
Nordine Bittich
a9f02a148b bump frontend 2023-08-14 19:38:42 +02:00
Claire Lovisa
61924d37d9 Import contact info of AGBs and APBs (#315) 2023-08-04 11:01:58 +02:00
Claire Lovisa
913fd54da3 Import contact info of AGBs and APBs (#315) 2023-08-04 11:01:15 +02:00
Claire Lovisa
89572728bc Merge branch 'master' into development 2023-08-02 10:05:23 +02:00
Claire Lovisa
43caffdce8 Merge pull request #314 from lblod/fix/add-missing-organen-and-functies-to-agbs-and-apbs
Fix date format and missing data on AGBs/APBs
2023-08-02 10:04:40 +02:00
Claire Lovisa
0d3ba99048 Fix date format and missing data on AGBs/APBs 2023-08-01 20:53:52 +02:00
Claire Lovisa
b015497d93 Merge pull request #313 from lblod/feature/onboarding-igs
Onboarding igs
2023-08-01 14:47:59 +02:00
Claire Lovisa
8b40cf597f Split too big migrations 2023-07-31 18:04:48 +02:00
Claire Lovisa
f78e7ad99a Bump frontend 2023-07-31 17:22:40 +02:00
Claire Lovisa
8fb0bd245a Merge branch 'development' 2023-07-31 17:14:41 +02:00
Claire Lovisa
cdfe850b47 Link admin units with OVO uris (#312) 2023-07-31 16:14:01 +02:00
Claire Lovisa
ab6da30578 Remove outdated mandatarissen data (#311) 2023-07-31 11:28:27 +02:00
Claire Lovisa
33740d1749 Remove torii redirect dispatching (#309)
* Remove torii redirect dispatching

* Add Caddy dev config
2023-07-31 10:44:09 +02:00
Claire Lovisa
245786a94a Add worship editor to dev search index 2023-07-27 12:05:38 +02:00
Claire Lovisa
5d30fa368d Merge pull request #310 from lblod/feature/import-agb-apb-addresses
Import agb/apb addresses
2023-07-27 11:45:17 +02:00
Oscar
8bc16f1551 changed to correct uris 2023-07-27 11:35:55 +02:00
Oscar
412ebf3220 fix agb names, and match first on kbo 2023-07-27 11:35:50 +02:00
Oscar
46da33334a change casing of provinces and fix missing data 2023-07-27 11:35:43 +02:00
Oscar
d27a99cdee changed to primary site, and changed wrong uuid of agb brugge 2023-07-27 11:35:37 +02:00
Oscar
04b689b9d2 fix migration 2023-07-27 11:35:30 +02:00
Oscar
29d0203311 Add agb brugge and the address of other agbs 2023-07-27 11:35:07 +02:00
Claire Lovisa
af56734cde Merge branch 'hotfix/v1.17.x' 2023-07-26 14:51:26 +02:00
Claire Lovisa
e948aea401 Merge pull request #308 from lblod/fix/variable-name-worship-consumer
Variable name worship consumer
2023-07-26 14:23:58 +02:00
Claire Lovisa
e89aba8d53 Fix wrong variable name in consumer config 2023-07-26 14:22:28 +02:00
Claire Lovisa
43948054aa Merge pull request #307 from lblod/feature/import-ovo-districts-eb-cb
Import OVO codes for districts, worship and central worship services
2023-07-25 10:26:08 +02:00
Elena Poelman
024a090453 Merge pull request #302 from lblod/feature/ldes-data-pusher-include-identifiers
Include local-identifier and label for each identifier of organizations sent to ldes feed
2023-07-20 10:44:55 +02:00
Claire Lovisa
f34672d697 Import OVO codes for districts, worship and central worship services 2023-07-20 10:11:59 +02:00
Claire Lovisa
4416d35de1 Merge pull request #300 from lblod/feature/import-igs-leidinggevenden
Add IGS positions to the sync
2023-07-18 10:58:54 +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
Claire Lovisa
337e3fec87 Add IGS positions to the sync 2023-07-12 15:47:24 +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
ea03febb98 Merge branch 'development' into feature/onboarding-igs 2023-07-07 16:37:12 +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
Boris De Vloed
a340f1c175 Merge pull request #298 from lblod/feature/onboarding-igs-domain
added domain.json
2023-07-07 08:59:43 +02:00
Boris De Vloed
4ac08f9bb3 fixed typo 2023-07-07 06:56:41 +00:00
Boris De Vloed
346c1d129b added domain.json 2023-07-06 13:18:25 +00:00
Oscar Rodriguez Villalobos
88e54265b0 Merge pull request #295 from lblod/feature/add-new-classification-code
Add new classification code for "Opdrachthoudende vereniging met private deelname"
2023-07-06 13:46:52 +02:00
Claire Lovisa
f14debcc45 Add migration importing existing IGS data from Loket (#296) 2023-07-06 13:37:35 +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
Oscar
2c29edb363 Add new classification code for "Opdrachthoudende vereniging met private deelname" 2023-07-04 11:32:52 +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
149 changed files with 138790 additions and 893 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

@@ -84,6 +84,10 @@ defmodule Dispatcher do
Proxy.forward conn, path, "http://cache/administrative-unit-classification-codes/"
end
match "/organization-classification-codes/*path", %{ accept: [:json], layer: :api} do
Proxy.forward conn, path, "http://cache/organization-classification-codes/"
end
match "/worship-administrative-units/*path", %{ accept: [:json], layer: :api} do
Proxy.forward conn, path, "http://resource/worship-administrative-units/"
end
@@ -305,6 +309,14 @@ defmodule Dispatcher do
forward conn, path, "http://construct-administrative-unit-relationships/create-relationships/"
end
post "/sync-ovo-number/*path", %{ layer: :api_services, accept: %{ json: true } } do
forward conn, path, "http://sync-ovo-numbers/sync-from-kbo/"
end
get "/ldes/*path", %{ layer: :api_services } do
forward conn, path, "http://ldes-backend/"
end
#################################################################
# ERROR REPORT
#################################################################
@@ -337,21 +349,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 +362,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 +377,6 @@ defmodule Dispatcher do
# frontend layer
###############################################################
match "/authorization/callback/*_path", %{ accept: [:html], layer: :api } do
Proxy.forward conn, [], "http://frontend/torii/redirect.html"
end
match "/assets/*path", %{ layer: :api } do
Proxy.forward conn, path, "http://frontend/assets/"
end

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -0,0 +1,64 @@
# Classification Leidend Ambtenaar
INSERT {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
?orgaanInTime <http://data.lblod.info/vocabularies/leidinggevenden/heeftBestuursfunctie> ?functie .
?functie a <http://data.lblod.info/vocabularies/leidinggevenden/Bestuursfunctie> ;
<http://mu.semte.ch/vocabularies/core/uuid> ?uuidFunctie ;
<http://www.w3.org/2004/02/skos/core#prefLabel> ?functieLabel ;
<http://www.w3.org/ns/org#role> <http://data.vlaanderen.be/id/concept/BestuursfunctieCode/855489b9-b584-4f34-90b2-39aea808cd9f> .
}
} WHERE {
VALUES ?bestuurseenheid {
<http://data.lblod.info/id/bestuurseenheden/e0d71bad-4684-4796-9f76-c3babb972a0f>
<http://data.lblod.info/id/bestuurseenheden/cec30867-e378-4e86-9568-1efebb6ccd7d>
<http://data.lblod.info/id/bestuurseenheden/b206763c-d8d2-45bd-ba1b-b5462bdd823c>
<http://data.lblod.info/id/bestuurseenheden/70285c2d-2045-414e-bd49-56155a736e56>
<http://data.lblod.info/id/bestuurseenheden/2908c8ed-0f67-44c0-b69e-5a8b07238d15>
<http://data.lblod.info/id/bestuurseenheden/f4228a39-de89-4a50-925f-d5d8d5109e79>
<http://data.lblod.info/id/bestuurseenheden/8d6609b4-1a20-46b8-97ed-150c6d53acd6>
<http://data.lblod.info/id/bestuurseenheden/b25f4408-0b7c-46d0-a234-0936cac4eb7c>
<http://data.lblod.info/id/bestuurseenheden/b81fdc5f-d1ba-49f2-831f-ed549ad94394>
<http://data.lblod.info/id/bestuurseenheden/3deaa042-58f3-474f-abc2-9cb3e15f4221>
<http://data.lblod.info/id/bestuurseenheden/863673c6-7bc9-4bbd-a42a-9ef1d2dc4c05>
<http://data.lblod.info/id/bestuurseenheden/e0920e46-85b9-4736-a906-b254cc7f1855>
<http://data.lblod.info/id/bestuurseenheden/99509194-025b-4292-9add-aa98b4867350>
<http://data.lblod.info/id/bestuurseenheden/6479BE11E20833AEA681F731>
<http://data.lblod.info/id/bestuurseenheden/648C3D65190444E254CA3901>
<http://data.lblod.info/id/bestuurseenheden/648C4C67190444E254CA390E>
<http://data.lblod.info/id/bestuurseenheden/6479B935E20833AEA681F719>
<http://data.lblod.info/id/bestuurseenheden/5c6ab343-3405-475d-a184-d44bbe7e787a>
<http://data.lblod.info/id/bestuurseenheden/646DCAC8E20833AEA681F608>
<http://data.lblod.info/id/bestuurseenheden/648C3BB7190444E254CA38F4>
<http://data.lblod.info/id/bestuurseenheden/646F2BB5E20833AEA681F62C>
<http://data.lblod.info/id/bestuurseenheden/8e448f7f-5a1d-44b0-a99d-274b2cc66f58>
<http://data.lblod.info/id/bestuurseenheden/5202c9ba-40fb-44e2-8116-6eceadc1e60a>
<http://data.lblod.info/id/bestuurseenheden/6478831EE20833AEA681F690>
<http://data.lblod.info/id/bestuurseenheden/646F25AEE20833AEA681F61A>
<http://data.lblod.info/id/bestuurseenheden/646F2609E20833AEA681F623>
<http://data.lblod.info/id/bestuurseenheden/6488403F190444E254CA3891>
<http://data.lblod.info/id/bestuurseenheden/648C3B22190444E254CA38EB>
<http://data.lblod.info/id/bestuurseenheden/646F2295E20833AEA681F611>
<http://data.lblod.info/id/bestuurseenheden/6479B670E20833AEA681F702>
<http://data.lblod.info/id/bestuurseenheden/6488488C190444E254CA38A5>
<http://data.lblod.info/id/bestuurseenheden/648841E2190444E254CA389A>
}
VALUES ?classificationOrgaan {
<http://data.vlaanderen.be/id/concept/BestuursorgaanClassificatieCode/41caf7e6-b040-4720-9cc2-a96cfffed5b4>
}
?bestuurseenheid a <http://data.vlaanderen.be/ns/besluit#Bestuurseenheid> ;
skos:prefLabel ?bestuurseenheidLabel .
?orgaan <http://www.w3.org/ns/org#classification> ?classificationOrgaan ;
<http://data.vlaanderen.be/ns/besluit#bestuurt> ?bestuurseenheid .
?orgaanInTime <https://data.vlaanderen.be/ns/generiek#isTijdspecialisatieVan> ?orgaan .
BIND(CONCAT(?bestuurseenheidLabel, " Leidend ambtenaar") as ?functieLabel)
BIND(MD5(CONCAT(?bestuurseenheid, ?classificationOrgaan, "functieLabel")) as ?uuidFunctie)
BIND(IRI(CONCAT("http://data.lblod.info/id/bestuursfuncties/", ?uuidFunctie)) AS ?functie)
}

View File

@@ -0,0 +1,48 @@
INSERT {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
?municipality <http://mu.semte.ch/vocabularies/ext/isFounderOfOrganization> ?bestuur .
?municipality <http://www.w3.org/ns/org#hasSubOrganization> ?bestuur .
}
} WHERE {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
?bestuur a <http://data.vlaanderen.be/ns/besluit#Bestuurseenheid> ;
<http://www.w3.org/ns/org#classification> <http://data.vlaanderen.be/id/concept/BestuurseenheidClassificatieCode/36a82ba0-7ff1-4697-a9dd-2e94df73b721> ; # AGB
<http://www.w3.org/ns/org#hasPrimarySite>/<https://data.vlaanderen.be/ns/organisatie#bestaatUit> ?address .
?address <https://data.vlaanderen.be/ns/adres#gemeentenaam> ?municipalityLabel .
}
GRAPH <http://mu.semte.ch/graphs/shared> {
?municipality a <http://data.vlaanderen.be/ns/besluit#Bestuurseenheid> ;
skos:prefLabel ?municipalityLabel ;
<http://www.w3.org/ns/org#classification> <http://data.vlaanderen.be/id/concept/BestuurseenheidClassificatieCode/5ab0e9b8a3b2ca7c5e000001> .
}
}
;
INSERT {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
?province <http://mu.semte.ch/vocabularies/ext/isFounderOfOrganization> ?bestuur .
?province <http://www.w3.org/ns/org#hasSubOrganization> ?bestuur .
?municipality <http://www.w3.org/ns/org#linkedTo> ?bestuur .
}
} WHERE {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
?bestuur a <http://data.vlaanderen.be/ns/besluit#Bestuurseenheid> ;
<http://www.w3.org/ns/org#classification> <http://data.vlaanderen.be/id/concept/BestuurseenheidClassificatieCode/80310756-ce0a-4a1b-9b8e-7c01b6cc7a2d> ; # APB
<http://www.w3.org/ns/org#hasPrimarySite>/<https://data.vlaanderen.be/ns/organisatie#bestaatUit> ?address .
?address <http://www.w3.org/ns/locn#adminUnitL2> ?provinceLabel .
}
GRAPH <http://mu.semte.ch/graphs/shared> {
?municipality a <http://data.vlaanderen.be/ns/besluit#Bestuurseenheid> ;
skos:prefLabel ?municipalityLabel ;
<http://www.w3.org/ns/org#classification> <http://data.vlaanderen.be/id/concept/BestuurseenheidClassificatieCode/5ab0e9b8a3b2ca7c5e000001> .
?province a <http://data.vlaanderen.be/ns/besluit#Bestuurseenheid> ;
skos:prefLabel ?provinceLabel ;
<http://www.w3.org/ns/org#classification> <http://data.vlaanderen.be/id/concept/BestuurseenheidClassificatieCode/5ab0e9b8a3b2ca7c5e000000> .
}
}

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 @@
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,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 @@
http://mu.semte.ch/graphs/public

View File

@@ -0,0 +1,14 @@
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .
@prefix mu: <http://mu.semte.ch/vocabularies/core/> .
@prefix ns2: <http://mu.semte.ch/vocabularies/core/> .
@prefix ns3: <http://data.vlaanderen.be/id/conceptscheme/> .
@prefix ns4: <http://data.vlaanderen.be/id/concept/BestuurseenheidClassificatieCode/> .
@prefix ns5: <http://lblod.data.gift/vocabularies/organisatie/> .
ns4:4b8450cf-a326-4c66-9e63-b4ec10acc7f6
mu:uuid "4b8450cf-a326-4c66-9e63-b4ec10acc7f6";
rdf:type ns5:BestuurseenheidClassificatieCode ;
skos:prefLabel "Opdrachthoudende vereniging met private deelname" ;
skos:topConceptOf ns3:BestuurseenheidClassificatieCode ;
skos:inScheme ns3:BestuurseenheidClassificatieCode .

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,327 @@
# Classification Directiecomité
INSERT {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
?orgaanInTime a <http://data.vlaanderen.be/ns/besluit#Bestuursorgaan> ;
<http://mu.semte.ch/vocabularies/core/uuid> ?uuidOrgaanInTime ;
<https://data.vlaanderen.be/ns/generiek#isTijdspecialisatieVan> ?orgaan ;
<http://data.vlaanderen.be/ns/mandaat#bindingStart> "2019-01-01T00:00:00"^^xsd:dateTime .
?orgaan a <http://data.vlaanderen.be/ns/besluit#Bestuursorgaan> ;
<http://mu.semte.ch/vocabularies/core/uuid> ?uuidOrgaan ;
<http://www.w3.org/2004/02/skos/core#prefLabel> ?orgaanLabel ;
<http://www.w3.org/ns/org#classification> ?classificationOrgaan ;
<http://data.vlaanderen.be/ns/besluit#bestuurt> ?bestuurseenheid .
}
} WHERE {
VALUES ?classificationBestuurseenheid {
<http://data.vlaanderen.be/id/concept/BestuurseenheidClassificatieCode/36a82ba0-7ff1-4697-a9dd-2e94df73b721>
<http://data.vlaanderen.be/id/concept/BestuurseenheidClassificatieCode/80310756-ce0a-4a1b-9b8e-7c01b6cc7a2d>
}
VALUES ?classificationOrgaan {
<http://data.vlaanderen.be/id/concept/BestuursorgaanClassificatieCode/5733254e-73ff-4844-8d43-7afb7ec726e8>
}
VALUES ?bestuurseenheid {
<http://data.lblod.info/id/bestuurseenheden/c7c5afb0-33b6-4c12-9a91-0313c5e99e09>
<http://data.lblod.info/id/bestuurseenheden/0f3d264a-dc1e-4a67-b2dc-b16b8aa1320d>
<http://data.lblod.info/id/bestuurseenheden/cc175465-0aa7-4f86-b6c1-fb9e4968def9>
<http://data.lblod.info/id/bestuurseenheden/ab64b799-fc73-417a-9fde-ad15da02944e>
<http://data.lblod.info/id/bestuurseenheden/923b203c-b8e0-4f20-9076-c2381e0f4294>
<http://data.lblod.info/id/bestuurseenheden/8c8fb770-1b84-4d18-8bcc-3ed9440476d5>
<http://data.lblod.info/id/bestuurseenheden/2d7e83eb-ce57-4739-917c-66564653ad63>
<http://data.lblod.info/id/bestuurseenheden/dc0bae7b-c4b3-4318-a6d5-63da2026a19f>
<http://data.lblod.info/id/bestuurseenheden/47fe127d-40c9-4598-a651-fca0311d3546>
<http://data.lblod.info/id/bestuurseenheden/d0125202-c4b1-4372-ba12-d6de58b12660>
<http://data.lblod.info/id/bestuurseenheden/68691928-eb23-4cc4-a66a-9deb0a7228ac>
<http://data.lblod.info/id/bestuurseenheden/344ff196-00d6-4d31-8abf-bda1a3c06b23>
<http://data.lblod.info/id/bestuurseenheden/26009b3c-256e-4a6c-aa3f-48e37b5d5c64>
<http://data.lblod.info/id/bestuurseenheden/682c21df-fe6a-4266-8f97-109e5b5b4ae4>
<http://data.lblod.info/id/bestuurseenheden/989ffd59-fdc4-4faf-959b-929aadc42f00>
<http://data.lblod.info/id/bestuurseenheden/b8228e3a-13ab-40ff-9299-a547b408b296>
<http://data.lblod.info/id/bestuurseenheden/85594b7a-4637-417e-a8ae-6b77c1988dcd>
<http://data.lblod.info/id/bestuurseenheden/fcbcb79b-20d1-4ed0-8ef1-744ca783ab14>
<http://data.lblod.info/id/bestuurseenheden/42fe138a-47b0-426e-a319-66bbf7927168>
<http://data.lblod.info/id/bestuurseenheden/173816cd-8ab6-45b8-9e98-1b8a71ad7ba0>
}
?bestuurseenheid a <http://data.vlaanderen.be/ns/besluit#Bestuurseenheid> ;
skos:prefLabel ?bestuurseenheidLabel .
?classificationOrgaan skos:prefLabel ?classificationOrgaanLabel .
BIND(CONCAT(?bestuurseenheidLabel, " Leidend ambtenaar") as ?functieLabel)
BIND(CONCAT(?classificationOrgaanLabel, " ", ?bestuurseenheidLabel) as ?orgaanLabel)
BIND(MD5(CONCAT(?bestuurseenheid, ?classificationOrgaan, "orgaanInTime")) as ?uuidOrgaanInTime)
BIND(MD5(CONCAT(?bestuurseenheid, ?classificationOrgaan, "orgaan")) as ?uuidOrgaan)
BIND(IRI(CONCAT("http://data.lblod.info/id/bestuursorganen/", ?uuidOrgaanInTime)) AS ?orgaanInTime)
BIND(IRI(CONCAT("http://data.lblod.info/id/bestuursorganen/", ?uuidOrgaan)) AS ?orgaan)
}
;
# Classification Raad van bestuur
INSERT {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
?orgaanInTime a <http://data.vlaanderen.be/ns/besluit#Bestuursorgaan> ;
<http://mu.semte.ch/vocabularies/core/uuid> ?uuidOrgaanInTime ;
<https://data.vlaanderen.be/ns/generiek#isTijdspecialisatieVan> ?orgaan ;
<http://data.vlaanderen.be/ns/mandaat#bindingStart> "2019-01-01T00:00:00"^^xsd:dateTime .
?orgaan a <http://data.vlaanderen.be/ns/besluit#Bestuursorgaan> ;
<http://mu.semte.ch/vocabularies/core/uuid> ?uuidOrgaan ;
<http://www.w3.org/2004/02/skos/core#prefLabel> ?orgaanLabel ;
<http://www.w3.org/ns/org#classification> ?classificationOrgaan ;
<http://data.vlaanderen.be/ns/besluit#bestuurt> ?bestuurseenheid .
}
} WHERE {
VALUES ?classificationBestuurseenheid {
<http://data.vlaanderen.be/id/concept/BestuurseenheidClassificatieCode/36a82ba0-7ff1-4697-a9dd-2e94df73b721>
<http://data.vlaanderen.be/id/concept/BestuurseenheidClassificatieCode/80310756-ce0a-4a1b-9b8e-7c01b6cc7a2d>
}
VALUES ?classificationOrgaan {
<http://data.vlaanderen.be/id/concept/BestuursorgaanClassificatieCode/013cc838-173a-4657-b1ae-b00c048df943>
}
VALUES ?bestuurseenheid {
<http://data.lblod.info/id/bestuurseenheden/c7c5afb0-33b6-4c12-9a91-0313c5e99e09>
<http://data.lblod.info/id/bestuurseenheden/0f3d264a-dc1e-4a67-b2dc-b16b8aa1320d>
<http://data.lblod.info/id/bestuurseenheden/cc175465-0aa7-4f86-b6c1-fb9e4968def9>
<http://data.lblod.info/id/bestuurseenheden/ab64b799-fc73-417a-9fde-ad15da02944e>
<http://data.lblod.info/id/bestuurseenheden/923b203c-b8e0-4f20-9076-c2381e0f4294>
<http://data.lblod.info/id/bestuurseenheden/8c8fb770-1b84-4d18-8bcc-3ed9440476d5>
<http://data.lblod.info/id/bestuurseenheden/2d7e83eb-ce57-4739-917c-66564653ad63>
<http://data.lblod.info/id/bestuurseenheden/dc0bae7b-c4b3-4318-a6d5-63da2026a19f>
<http://data.lblod.info/id/bestuurseenheden/47fe127d-40c9-4598-a651-fca0311d3546>
<http://data.lblod.info/id/bestuurseenheden/d0125202-c4b1-4372-ba12-d6de58b12660>
<http://data.lblod.info/id/bestuurseenheden/68691928-eb23-4cc4-a66a-9deb0a7228ac>
<http://data.lblod.info/id/bestuurseenheden/344ff196-00d6-4d31-8abf-bda1a3c06b23>
<http://data.lblod.info/id/bestuurseenheden/26009b3c-256e-4a6c-aa3f-48e37b5d5c64>
<http://data.lblod.info/id/bestuurseenheden/682c21df-fe6a-4266-8f97-109e5b5b4ae4>
<http://data.lblod.info/id/bestuurseenheden/989ffd59-fdc4-4faf-959b-929aadc42f00>
<http://data.lblod.info/id/bestuurseenheden/b8228e3a-13ab-40ff-9299-a547b408b296>
<http://data.lblod.info/id/bestuurseenheden/85594b7a-4637-417e-a8ae-6b77c1988dcd>
<http://data.lblod.info/id/bestuurseenheden/fcbcb79b-20d1-4ed0-8ef1-744ca783ab14>
<http://data.lblod.info/id/bestuurseenheden/42fe138a-47b0-426e-a319-66bbf7927168>
<http://data.lblod.info/id/bestuurseenheden/173816cd-8ab6-45b8-9e98-1b8a71ad7ba0>
}
?bestuurseenheid a <http://data.vlaanderen.be/ns/besluit#Bestuurseenheid> ;
skos:prefLabel ?bestuurseenheidLabel .
?classificationOrgaan skos:prefLabel ?classificationOrgaanLabel .
BIND(CONCAT(?bestuurseenheidLabel, " Leidend ambtenaar") as ?functieLabel)
BIND(CONCAT(?classificationOrgaanLabel, " ", ?bestuurseenheidLabel) as ?orgaanLabel)
BIND(MD5(CONCAT(?bestuurseenheid, ?classificationOrgaan, "orgaanInTime")) as ?uuidOrgaanInTime)
BIND(MD5(CONCAT(?bestuurseenheid, ?classificationOrgaan, "orgaan")) as ?uuidOrgaan)
BIND(IRI(CONCAT("http://data.lblod.info/id/bestuursorganen/", ?uuidOrgaanInTime)) AS ?orgaanInTime)
BIND(IRI(CONCAT("http://data.lblod.info/id/bestuursorganen/", ?uuidOrgaan)) AS ?orgaan)
}
;
# Classification Bevoegd beslissingsorgaan
INSERT {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
?orgaanInTime a <http://data.vlaanderen.be/ns/besluit#Bestuursorgaan> ;
<http://mu.semte.ch/vocabularies/core/uuid> ?uuidOrgaanInTime ;
<https://data.vlaanderen.be/ns/generiek#isTijdspecialisatieVan> ?orgaan ;
<http://data.vlaanderen.be/ns/mandaat#bindingStart> "2019-01-01T00:00:00"^^xsd:dateTime .
?orgaan a <http://data.vlaanderen.be/ns/besluit#Bestuursorgaan> ;
<http://mu.semte.ch/vocabularies/core/uuid> ?uuidOrgaan ;
<http://www.w3.org/2004/02/skos/core#prefLabel> ?orgaanLabel ;
<http://www.w3.org/ns/org#classification> ?classificationOrgaan ;
<http://data.vlaanderen.be/ns/besluit#bestuurt> ?bestuurseenheid .
}
} WHERE {
VALUES ?classificationBestuurseenheid {
<http://data.vlaanderen.be/id/concept/BestuurseenheidClassificatieCode/36a82ba0-7ff1-4697-a9dd-2e94df73b721>
<http://data.vlaanderen.be/id/concept/BestuurseenheidClassificatieCode/80310756-ce0a-4a1b-9b8e-7c01b6cc7a2d>
}
VALUES ?classificationOrgaan {
<http://data.vlaanderen.be/id/concept/BestuursorgaanClassificatieCode/0dbc70ec-6be9-4997-b8e1-11b6c0542382>
}
VALUES ?bestuurseenheid {
<http://data.lblod.info/id/bestuurseenheden/c7c5afb0-33b6-4c12-9a91-0313c5e99e09>
<http://data.lblod.info/id/bestuurseenheden/0f3d264a-dc1e-4a67-b2dc-b16b8aa1320d>
<http://data.lblod.info/id/bestuurseenheden/cc175465-0aa7-4f86-b6c1-fb9e4968def9>
<http://data.lblod.info/id/bestuurseenheden/ab64b799-fc73-417a-9fde-ad15da02944e>
<http://data.lblod.info/id/bestuurseenheden/923b203c-b8e0-4f20-9076-c2381e0f4294>
<http://data.lblod.info/id/bestuurseenheden/8c8fb770-1b84-4d18-8bcc-3ed9440476d5>
<http://data.lblod.info/id/bestuurseenheden/2d7e83eb-ce57-4739-917c-66564653ad63>
<http://data.lblod.info/id/bestuurseenheden/dc0bae7b-c4b3-4318-a6d5-63da2026a19f>
<http://data.lblod.info/id/bestuurseenheden/47fe127d-40c9-4598-a651-fca0311d3546>
<http://data.lblod.info/id/bestuurseenheden/d0125202-c4b1-4372-ba12-d6de58b12660>
<http://data.lblod.info/id/bestuurseenheden/68691928-eb23-4cc4-a66a-9deb0a7228ac>
<http://data.lblod.info/id/bestuurseenheden/344ff196-00d6-4d31-8abf-bda1a3c06b23>
<http://data.lblod.info/id/bestuurseenheden/26009b3c-256e-4a6c-aa3f-48e37b5d5c64>
<http://data.lblod.info/id/bestuurseenheden/682c21df-fe6a-4266-8f97-109e5b5b4ae4>
<http://data.lblod.info/id/bestuurseenheden/989ffd59-fdc4-4faf-959b-929aadc42f00>
<http://data.lblod.info/id/bestuurseenheden/b8228e3a-13ab-40ff-9299-a547b408b296>
<http://data.lblod.info/id/bestuurseenheden/85594b7a-4637-417e-a8ae-6b77c1988dcd>
<http://data.lblod.info/id/bestuurseenheden/fcbcb79b-20d1-4ed0-8ef1-744ca783ab14>
<http://data.lblod.info/id/bestuurseenheden/42fe138a-47b0-426e-a319-66bbf7927168>
<http://data.lblod.info/id/bestuurseenheden/173816cd-8ab6-45b8-9e98-1b8a71ad7ba0>
}
?bestuurseenheid a <http://data.vlaanderen.be/ns/besluit#Bestuurseenheid> ;
skos:prefLabel ?bestuurseenheidLabel .
?classificationOrgaan skos:prefLabel ?classificationOrgaanLabel .
BIND(CONCAT(?bestuurseenheidLabel, " Leidend ambtenaar") as ?functieLabel)
BIND(CONCAT(?classificationOrgaanLabel, " ", ?bestuurseenheidLabel) as ?orgaanLabel)
BIND(MD5(CONCAT(?bestuurseenheid, ?classificationOrgaan, "orgaanInTime")) as ?uuidOrgaanInTime)
BIND(MD5(CONCAT(?bestuurseenheid, ?classificationOrgaan, "orgaan")) as ?uuidOrgaan)
BIND(IRI(CONCAT("http://data.lblod.info/id/bestuursorganen/", ?uuidOrgaanInTime)) AS ?orgaanInTime)
BIND(IRI(CONCAT("http://data.lblod.info/id/bestuursorganen/", ?uuidOrgaan)) AS ?orgaan)
}
;
# Classification Algemene vergadering
INSERT {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
?orgaanInTime a <http://data.vlaanderen.be/ns/besluit#Bestuursorgaan> ;
<http://mu.semte.ch/vocabularies/core/uuid> ?uuidOrgaanInTime ;
<https://data.vlaanderen.be/ns/generiek#isTijdspecialisatieVan> ?orgaan ;
<http://data.vlaanderen.be/ns/mandaat#bindingStart> "2019-01-01T00:00:00"^^xsd:dateTime .
?orgaan a <http://data.vlaanderen.be/ns/besluit#Bestuursorgaan> ;
<http://mu.semte.ch/vocabularies/core/uuid> ?uuidOrgaan ;
<http://www.w3.org/2004/02/skos/core#prefLabel> ?orgaanLabel ;
<http://www.w3.org/ns/org#classification> ?classificationOrgaan ;
<http://data.vlaanderen.be/ns/besluit#bestuurt> ?bestuurseenheid .
}
} WHERE {
VALUES ?classificationBestuurseenheid {
<http://data.vlaanderen.be/id/concept/BestuurseenheidClassificatieCode/36a82ba0-7ff1-4697-a9dd-2e94df73b721>
<http://data.vlaanderen.be/id/concept/BestuurseenheidClassificatieCode/80310756-ce0a-4a1b-9b8e-7c01b6cc7a2d>
}
VALUES ?classificationOrgaan {
<http://data.vlaanderen.be/id/concept/BestuursorgaanClassificatieCode/b52094ff-21a2-4da8-8dbe-f513365d1528>
}
VALUES ?bestuurseenheid {
<http://data.lblod.info/id/bestuurseenheden/c7c5afb0-33b6-4c12-9a91-0313c5e99e09>
<http://data.lblod.info/id/bestuurseenheden/0f3d264a-dc1e-4a67-b2dc-b16b8aa1320d>
<http://data.lblod.info/id/bestuurseenheden/cc175465-0aa7-4f86-b6c1-fb9e4968def9>
<http://data.lblod.info/id/bestuurseenheden/ab64b799-fc73-417a-9fde-ad15da02944e>
<http://data.lblod.info/id/bestuurseenheden/923b203c-b8e0-4f20-9076-c2381e0f4294>
<http://data.lblod.info/id/bestuurseenheden/8c8fb770-1b84-4d18-8bcc-3ed9440476d5>
<http://data.lblod.info/id/bestuurseenheden/2d7e83eb-ce57-4739-917c-66564653ad63>
<http://data.lblod.info/id/bestuurseenheden/dc0bae7b-c4b3-4318-a6d5-63da2026a19f>
<http://data.lblod.info/id/bestuurseenheden/47fe127d-40c9-4598-a651-fca0311d3546>
<http://data.lblod.info/id/bestuurseenheden/d0125202-c4b1-4372-ba12-d6de58b12660>
<http://data.lblod.info/id/bestuurseenheden/68691928-eb23-4cc4-a66a-9deb0a7228ac>
<http://data.lblod.info/id/bestuurseenheden/344ff196-00d6-4d31-8abf-bda1a3c06b23>
<http://data.lblod.info/id/bestuurseenheden/26009b3c-256e-4a6c-aa3f-48e37b5d5c64>
<http://data.lblod.info/id/bestuurseenheden/682c21df-fe6a-4266-8f97-109e5b5b4ae4>
<http://data.lblod.info/id/bestuurseenheden/989ffd59-fdc4-4faf-959b-929aadc42f00>
<http://data.lblod.info/id/bestuurseenheden/b8228e3a-13ab-40ff-9299-a547b408b296>
<http://data.lblod.info/id/bestuurseenheden/85594b7a-4637-417e-a8ae-6b77c1988dcd>
<http://data.lblod.info/id/bestuurseenheden/fcbcb79b-20d1-4ed0-8ef1-744ca783ab14>
<http://data.lblod.info/id/bestuurseenheden/42fe138a-47b0-426e-a319-66bbf7927168>
<http://data.lblod.info/id/bestuurseenheden/173816cd-8ab6-45b8-9e98-1b8a71ad7ba0>
}
?bestuurseenheid a <http://data.vlaanderen.be/ns/besluit#Bestuurseenheid> ;
skos:prefLabel ?bestuurseenheidLabel .
?classificationOrgaan skos:prefLabel ?classificationOrgaanLabel .
BIND(CONCAT(?bestuurseenheidLabel, " Leidend ambtenaar") as ?functieLabel)
BIND(CONCAT(?classificationOrgaanLabel, " ", ?bestuurseenheidLabel) as ?orgaanLabel)
BIND(MD5(CONCAT(?bestuurseenheid, ?classificationOrgaan, "orgaanInTime")) as ?uuidOrgaanInTime)
BIND(MD5(CONCAT(?bestuurseenheid, ?classificationOrgaan, "orgaan")) as ?uuidOrgaan)
BIND(IRI(CONCAT("http://data.lblod.info/id/bestuursorganen/", ?uuidOrgaanInTime)) AS ?orgaanInTime)
BIND(IRI(CONCAT("http://data.lblod.info/id/bestuursorganen/", ?uuidOrgaan)) AS ?orgaan)
}
;
# Classification Leidend Ambtenaar
INSERT {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
?orgaanInTime a <http://data.vlaanderen.be/ns/besluit#Bestuursorgaan> ;
<http://mu.semte.ch/vocabularies/core/uuid> ?uuidOrgaanInTime ;
<https://data.vlaanderen.be/ns/generiek#isTijdspecialisatieVan> ?orgaan ;
<http://data.vlaanderen.be/ns/mandaat#bindingStart> "2019-01-01T00:00:00"^^xsd:dateTime ;
<http://data.lblod.info/vocabularies/leidinggevenden/heeftBestuursfunctie> ?functie .
?orgaan a <http://data.vlaanderen.be/ns/besluit#Bestuursorgaan> ;
<http://mu.semte.ch/vocabularies/core/uuid> ?uuidOrgaan ;
<http://www.w3.org/2004/02/skos/core#prefLabel> ?orgaanLabel ;
<http://www.w3.org/ns/org#classification> ?classificationOrgaan ;
<http://data.vlaanderen.be/ns/besluit#bestuurt> ?bestuurseenheid .
?functie a <http://data.lblod.info/vocabularies/leidinggevenden/Bestuursfunctie> ;
<http://mu.semte.ch/vocabularies/core/uuid> ?uuidFunctie ;
<http://www.w3.org/2004/02/skos/core#prefLabel> ?functieLabel ;
<http://www.w3.org/ns/org#role> <http://data.vlaanderen.be/id/concept/BestuursfunctieCode/855489b9-b584-4f34-90b2-39aea808cd9f> .
}
} WHERE {
VALUES ?classificationBestuurseenheid {
<http://data.vlaanderen.be/id/concept/BestuurseenheidClassificatieCode/36a82ba0-7ff1-4697-a9dd-2e94df73b721>
<http://data.vlaanderen.be/id/concept/BestuurseenheidClassificatieCode/80310756-ce0a-4a1b-9b8e-7c01b6cc7a2d>
}
VALUES ?classificationOrgaan {
<http://data.vlaanderen.be/id/concept/BestuursorgaanClassificatieCode/41caf7e6-b040-4720-9cc2-a96cfffed5b4>
}
VALUES ?bestuurseenheid {
<http://data.lblod.info/id/bestuurseenheden/c7c5afb0-33b6-4c12-9a91-0313c5e99e09>
<http://data.lblod.info/id/bestuurseenheden/0f3d264a-dc1e-4a67-b2dc-b16b8aa1320d>
<http://data.lblod.info/id/bestuurseenheden/cc175465-0aa7-4f86-b6c1-fb9e4968def9>
<http://data.lblod.info/id/bestuurseenheden/ab64b799-fc73-417a-9fde-ad15da02944e>
<http://data.lblod.info/id/bestuurseenheden/923b203c-b8e0-4f20-9076-c2381e0f4294>
<http://data.lblod.info/id/bestuurseenheden/8c8fb770-1b84-4d18-8bcc-3ed9440476d5>
<http://data.lblod.info/id/bestuurseenheden/2d7e83eb-ce57-4739-917c-66564653ad63>
<http://data.lblod.info/id/bestuurseenheden/dc0bae7b-c4b3-4318-a6d5-63da2026a19f>
<http://data.lblod.info/id/bestuurseenheden/47fe127d-40c9-4598-a651-fca0311d3546>
<http://data.lblod.info/id/bestuurseenheden/d0125202-c4b1-4372-ba12-d6de58b12660>
<http://data.lblod.info/id/bestuurseenheden/68691928-eb23-4cc4-a66a-9deb0a7228ac>
<http://data.lblod.info/id/bestuurseenheden/344ff196-00d6-4d31-8abf-bda1a3c06b23>
<http://data.lblod.info/id/bestuurseenheden/26009b3c-256e-4a6c-aa3f-48e37b5d5c64>
<http://data.lblod.info/id/bestuurseenheden/682c21df-fe6a-4266-8f97-109e5b5b4ae4>
<http://data.lblod.info/id/bestuurseenheden/989ffd59-fdc4-4faf-959b-929aadc42f00>
<http://data.lblod.info/id/bestuurseenheden/b8228e3a-13ab-40ff-9299-a547b408b296>
<http://data.lblod.info/id/bestuurseenheden/85594b7a-4637-417e-a8ae-6b77c1988dcd>
<http://data.lblod.info/id/bestuurseenheden/fcbcb79b-20d1-4ed0-8ef1-744ca783ab14>
<http://data.lblod.info/id/bestuurseenheden/42fe138a-47b0-426e-a319-66bbf7927168>
<http://data.lblod.info/id/bestuurseenheden/173816cd-8ab6-45b8-9e98-1b8a71ad7ba0>
}
?bestuurseenheid a <http://data.vlaanderen.be/ns/besluit#Bestuurseenheid> ;
skos:prefLabel ?bestuurseenheidLabel .
?classificationOrgaan skos:prefLabel ?classificationOrgaanLabel .
BIND(CONCAT(?bestuurseenheidLabel, " Leidend ambtenaar") as ?functieLabel)
BIND(CONCAT(?classificationOrgaanLabel, " ", ?bestuurseenheidLabel) as ?orgaanLabel)
BIND(MD5(CONCAT(?bestuurseenheid, ?classificationOrgaan, "orgaanInTime")) as ?uuidOrgaanInTime)
BIND(MD5(CONCAT(?bestuurseenheid, ?classificationOrgaan, "orgaan")) as ?uuidOrgaan)
BIND(IRI(CONCAT("http://data.lblod.info/id/bestuursorganen/", ?uuidOrgaanInTime)) AS ?orgaanInTime)
BIND(IRI(CONCAT("http://data.lblod.info/id/bestuursorganen/", ?uuidOrgaan)) AS ?orgaan)
BIND(MD5(CONCAT(?bestuurseenheid, ?classificationOrgaan, "functieLabel")) as ?uuidFunctie)
BIND(IRI(CONCAT("http://data.lblod.info/id/bestuursfuncties/", ?uuidFunctie)) AS ?functie)
}

View File

@@ -0,0 +1,6 @@
DELETE DATA {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
<http://data.lblod.info/id/bestuurseenheden/ade6a3d0e031660258649f141b8f17015da01557581f74122147c738af83b0c4>
<http://www.w3.org/ns/org#classification> <http://data.vlaanderen.be/id/concept/BestuurseenheidClassificatieCode/d01bb1f6-2439-4e33-9c25-1fc295de2e71> .
}
}

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