Compare commits

...

47 Commits

Author SHA1 Message Date
mirdono
74327cc371 chore: release v1.34.0 2025-07-11 11:16:18 +02:00
mirdono
bfb28bb698 Merge branch 'development' 2025-07-11 11:12:57 +02:00
Kike Franssen
cc8125cb14 Migration - harmonize date formats of change events (#562) 2025-07-11 10:51:13 +02:00
mirdono
329a63a0b9 chore: pre-release v1.34.0-0 2025-07-10 17:16:56 +02:00
mirdono
4891b6829d Merge branch 'master' into development 2025-07-04 16:24:14 +02:00
mirdono
eef379f7ed feat: add AGB Havenbedrijf Antwerpen
This organisation was removed from OP as it is officially not an administrative
unit. But it needs to be recreated to allow them to finalise subsidies via the
subsidie app.
As the resources has to be created with the same URI as before we re-add it
using a migrations instead of creating it manually via the frontend.
2025-07-04 14:41:44 +02:00
mirdono
ea2d25d177 chore: bump frontend 2025-07-04 10:25:07 +02:00
Claire Lovisa
8c49134011 Merge pull request #560 from lblod/revert/remove-brussels-province-migrations
Remove migrations inserting/deleting Brussel as a province and municipality
2025-07-04 10:16:47 +02:00
Claire Lovisa
d203077364 Merge pull request #559 from lblod/revert/brussel-province-and-municipality
Add migrations to revert Brussels' province and municipality
2025-07-04 10:14:24 +02:00
Claire Lovisa
eee9f18561 Remove migrations inserting/deleting brussel 2025-07-04 08:47:16 +02:00
Alexander van den Berghe
a8681a02f3 Merge pull request #558 from lblod/fix/organisations-report
fix: organisations report
2025-07-03 17:33:21 +02:00
Claire Lovisa
edbba1eeaa Remove skos:note from organization 2025-07-03 16:48:49 +02:00
Claire Lovisa
0c9355c94f Add migrations to revert Brussels' province and municipality 2025-07-03 11:11:39 +02:00
mirdono
b6a42c66cf chore: update changelog 2025-07-02 16:25:56 +02:00
mirdono
96b36d2cf6 fix: reorder graph and optional clauses
Putting the optional clause within the graph clause causes to query causes,
using DEV data, some organisations to be missed by the query. Turning the order
around resolves this without losing any organisations, tested with DEV and PROD data.
2025-07-02 13:54:41 +02:00
mirdono
19a0804b56 chore: remove unnecessary graph
The `shared` graph does not contain triples for `org:hasPrimarySite` predicate.
2025-07-02 13:44:14 +02:00
mirdono
a4684811df refactor: remove values clauses with single value 2025-07-02 12:29:46 +02:00
mirdono
dc18662517 fix: remove unneeded resource type
All resources with type `besluit:Bestuurseenheid` also have `org:Organization`
as type. Including both types in the queries leads to some organisations,
specifically municipalities in the `shared` graph, being included twice in the
results. Once with all data and once without label etc. This leads to the
results of both queries being incorrectly combined and having entries in the
final result without label.
2025-07-02 12:26:51 +02:00
mirdono
c6ba52a6bc chore: formatted organisations report configuration 2025-07-02 12:26:51 +02:00
mirdono
ee1c92b5fe chore: bump report-generation service to latest version
This version comes, amongst others, with `curl` installed. This makes it easier
to manually trigger the report generation (during development.)
2025-07-02 12:26:51 +02:00
Claire Lovisa
32b6520bfa Merge pull request #557 from lblod/fix/membership-brussel-shared-graph
Move membership to shared graph
2025-06-30 11:18:09 +02:00
Claire Lovisa
0e9483b4f8 Move membership to shared graph 2025-06-30 10:22:38 +02:00
mirdono
b65e0cbeaa chore: add frontend bump to deploy instructions 2025-06-30 08:45:27 +02:00
mirdono
fbf8a4e2dc feat: include URI in responses for organisations
This includes an organisation's URI in the response from the resource
service. This allows to easily get the URI for an organisation without having to
determine it based to UUID and classification and/or explicitly querying the
triplestore.

This is mostly a convenience for developers, but can be leveraged to add a link
to Centrale Vindplaats in the frontend.
2025-06-27 10:34:23 +02:00
mirdono
1bff031596 chore: add missing ticket number
The ticked was created retroactively, adding it to the changelog for future reference.
2025-06-26 20:12:36 +02:00
Claire Lovisa
b2deb421bc Merge pull request #555 from lblod/feature/brussels-municipality
Add brussel municipality via migration
2025-06-26 16:17:59 +02:00
Claire Lovisa
e078ae48a7 Remove province-specific properties from municipality location 2025-06-26 15:51:06 +02:00
Niels Vandekeybus
e2479f626a feature: add script to generate exports
Script to export the data for administrative units and their governing bodies.
2025-06-26 13:05:51 +02:00
Claire Lovisa
df8512d8f9 Add brussel municipality via migration 2025-06-25 20:36:37 +02:00
Claire Lovisa
ed0863c0bf Merge pull request #553 from lblod/feature/brussels-gewest
Add Brussels Hoofdstedelijk Gewest
2025-06-23 14:44:46 +02:00
Claire Lovisa
4131395159 Merge branch 'development' into feature/brussels-gewest 2025-06-23 14:42:58 +02:00
Claire Lovisa
325ebe991c Update changelog 2025-06-23 10:46:18 +02:00
Claire Lovisa
179ba7b315 Add skos:note to domain.json 2025-06-23 10:34:56 +02:00
mirdono
714fda3dc8 chore: bump delta-notifier service 2025-06-20 16:50:46 +02:00
mirdono
b31d6c65e6 fix: update label for locations to match their merged municipality
As part of the 2025 municipality mergers, three municipalities kept their URI
but were renamed. This updates the labels for their scope of
operation (nl. werkingsgebied) locations accordingly. This way the label of the
location resources matches the name of the municipality administrative unit.
2025-06-20 12:52:41 +02:00
Claire Lovisa
0be27e1ef2 Add Brussels Hoofdstedelijk Gewest 2025-06-20 10:54:01 +02:00
cecemel
c77f1e9139 Merge pull request #551 from lblod/hotfix/add-vlaamse-regering-as-eenheid
Hotfix/add vlaamse regering as eenheid
2025-06-17 13:39:28 +02:00
felix
8a76be40e8 Release v1.33.1 2025-06-16 14:50:16 +02:00
felix
3dffca6623 Added migration for Vlaams Parlement
Note:
  `<http://mu.semte.ch/graphs/shared>` is only needed when data needs to
    be availible to worship and non-worship users
2025-06-16 14:49:13 +02:00
mirdono
f6fe8ac87d chore: update changelog 2025-06-05 14:00:34 +02:00
mirdono
7defbf9009 chore: bump frontend 2025-06-05 14:00:20 +02:00
mirdono
5f1bfe96c7 feat: cleanup jobs municipality and province relations
Add cleanup jobs to automatically insert and delete `org:hasSubOrganization`
relations between provinces and municipalities. These memberships were moved to
the `shared` graph causing the existing cleanup jobs to no longer work for them.
2025-06-04 11:41:21 +02:00
mirdono
d2ec188373 fix: relate provinces and municipalities in shared graph
The frontend relies on the memberships relating municipalities and province to
- automatically select the appropriate province given a municipality; and
- limit the municipality options to those in a given province.

This kind of functionality is used in both the worship and non-worship module so
the data should be readable by users with either roles. This moves the
appropriate data the `shared` graph, which can be read by all authenticated
users. Thereby fixing that that functionality was broken for users with the
worship role.
2025-06-04 11:41:21 +02:00
mirdono
9515aec9ad Merge branch 'master' into development 2025-06-04 11:40:58 +02:00
cecemel
d4cd0d5cbd Hotfix/add kabinet crevits as eenheid (#548)
* Added migration for Kabinet Crevits

Note: 
`<http://mu.semte.ch/graphs/shared>` is only needed when data needs to
be availible to worship and non-worship users

* Update CHANGELOG.md
2025-06-02 16:46:51 +02:00
mirdono
6036b030c1 Merge branch 'master' into development 2025-05-23 18:12:40 +02:00
mirdono
f2a65697db chore: remove deprecated version from docker compose configurations
The version property has been deprecated for a while. Now that the servers are
on a recent version of docker compose these can be removed from our
configurations. This avoids that the warnings are shown each time.
2025-05-23 14:40:09 +02:00
19 changed files with 843 additions and 49 deletions

View File

@@ -1,6 +1,74 @@
# Changelog
## Unreleased
## v1.34.0 (2025-07-11)
### Frontend
- Bump to version [v1.33.0](https://github.com/lblod/frontend-organization-portal/releases/tag/v1.33.0)
### Backend
- Add Brussels Hoofdstedelijk Gewest as province and location, update province of addresses in Brussel's area, update resource config to add `skos:note` on organizations [OP-3624]
- Add Brussel as a municipality [OP-3628]
- Revert Brussel as province and municipality and update back province of addresses in Brussel's area [OP-3637]
- Bump delta-notifier service to most recent version [OP-3190]
- Add URI to resource's organization responses
- Fix query for organizations report [OP-3636]
- Bump report-generation-service to most recent version
- Write migration to harmonize date formats of change events [OP-3559]
### Deploy notes
```
drc pull deltanotifier; drc up -d deltanotifier
drc restart migrations-triggering-indexing resource
drc pull frontend; drc up -d frontend
drc pull report-generation; drc up -d report-generation
drc restart migrations; drc logs -ft --tail=200 migrations
```
## v1.33.3 (2025-07-04)
### Backend
- datafix: re-add Havenbedrijf Antwerpen as an AGB [OP-3639]
### Deploy notes
```
drc restart migrations; drc logs -ft --tail=200 migrations
drc exec delta-producer-background-jobs-initiator curl -X POST http://localhost/public/healing-jobs
```
## v1.33.2 (2025-06-20)
### Backend
- datafix: correct name for locations whose municipalities kept their URI in the 2025 mergers [OP-3627]
### Deploy notes
```
drc restart migrations-triggering-indexing && drc logs -ft --tail=200
```
## v1.33.1 (2025-06-16)
### Backend
- Added Vlaams Parlement as bestuurseenheid. [DL-6686]
### Deploy Notes
```
drc restart migrations;
drc exec delta-producer-background-jobs-initiator curl -X POST http://localhost/public/healing-jobs
```
## v1.33.0 (2025-06-05)
### Frontend
- Bump to version [v1.32.0](https://github.com/lblod/frontend-organization-portal/releases/tag/v1.32.0)
### Backend
- datafix: move memberships involving provinces and municipalities to shared graph [OP-3619]
### Deploy notes
```
drc restart migrations; drc logs -ft --tail=200 migrations
drc exec db-cleanup curl -X POST "http://localhost/cleanup"
drc pull frontend; drc up -d frontend
```
## v1.32.1 (2025-06-02)
### Backend
- Added Kabinet Crevits as bestuurseenheid. [DL-6655]
### Deploy Notes
```
drc restart migrations;
drc exec delta-producer-background-jobs-initiator curl -X POST http://localhost/public/healing-jobs
```
## v1.32.0 (2025-05-23)
### Frontend
- Bump to version [v1.31.0](https://github.com/lblod/frontend-organization-portal/releases/tag/v1.31.0)

View File

@@ -0,0 +1,22 @@
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX prov: <http://www.w3.org/ns/prov#>
DELETE {
GRAPH <http://mu.semte.ch/graphs/public> {
?scope rdfs:label ?oldLabel .
}
} INSERT {
GRAPH <http://mu.semte.ch/graphs/public> {
?scope rdfs:label ?newLabel .
}
} WHERE {
GRAPH <http://mu.semte.ch/graphs/public> {
?scope a prov:Location ;
rdfs:label ?oldLabel .
VALUES (?scope ?newLabel) {
(<http://data.lblod.info/id/werkingsgebieden/1f5dd7043ad54d07751da8689d5b47ad9ae0e52dccce8f00cc8debab35f8e2b2> "Bilzen-Hoeselt")
(<http://data.lblod.info/id/werkingsgebieden/fc34bb0a1dbf157ac5e5f8e657dd774210f03d2efa21370dd3b9a6342906c7ab> "Tessenderlo-Ham")
(<http://data.lblod.info/id/werkingsgebieden/fabec9e745fc9efa32afadd8b7268938805b9679dcf3b032c9b9a9a3530d6b59> "Tongeren-Borgloon")
}
}
}

View File

@@ -0,0 +1,32 @@
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX dcterms: <http://purl.org/dc/terms/>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
INSERT DATA {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
<http://data.lblod.info/id/bestuurseenheden/a33d5059-d527-4c9a-a788-1b7f5c75d10e>
rdf:type <http://www.w3.org/ns/org#Organization> , <http://data.vlaanderen.be/ns/besluit#Bestuurseenheid> , dcterms:Agent ;
owl:sameAs <http://data.vlaanderen.be/doc/organisatie/OVO053550> ;
<http://www.w3.org/ns/org#classification> <http://data.vlaanderen.be/id/concept/BestuurseenheidClassificatieCode/52cc9d8d-1c9a-4d92-9936-da9d4a622ec4> ;
<http://www.w3.org/ns/org#linkedTo> <http://data.lblod.info/id/bestuurseenheden/141d9d6b-54af-4d17-b313-8d1c30bc3f5b> ;
<http://mu.semte.ch/vocabularies/core/uuid> "a33d5059-d527-4c9a-a788-1b7f5c75d10e" ;
skos:prefLabel "Kabinet Crevits" ;
<http://www.w3.org/2004/02/skos/core#note> """This is a special case, we consider (for now) Kabinet Crevits as a bestuurseenheid, of org:classification ABB.""";
<http://www.w3.org/ns/adms#identifier> <http://data.lblod.info/id/identificatoren/b53dc2b0-7fca-4c59-8f2a-276753edb81e> ;
<http://www.w3.org/ns/regorg#orgStatus> <http://lblod.data.gift/concepts/63cc561de9188d64ba5840a42ae8f0d6> ;
<http://www.w3.org/ns/regorg#legalName> "Kabinet Crevits" .
<http://data.lblod.info/id/identificatoren/b53dc2b0-7fca-4c59-8f2a-276753edb81e>
<https://data.vlaanderen.be/ns/generiek#gestructureerdeIdentificator> <http://data.lblod.info/id/gestructureerdeIdentificator/aac3f5c0-e525-4cec-8432-2d59806661e5>;
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/adms#Identifier>;
<http://www.w3.org/2004/02/skos/core#notation> "OVO-nummer" ;
<http://mu.semte.ch/vocabularies/core/uuid> "b53dc2b0-7fca-4c59-8f2a-276753edb81e" .
<http://data.lblod.info/id/gestructureerdeIdentificator/aac3f5c0-e525-4cec-8432-2d59806661e5>
<http://mu.semte.ch/vocabularies/core/uuid> "aac3f5c0-e525-4cec-8432-2d59806661e5";
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <https://data.vlaanderen.be/ns/generiek#GestructureerdeIdentificator>;
<https://data.vlaanderen.be/ns/generiek#lokaleIdentificator> "OVO053550" .
}
}

View File

@@ -0,0 +1,24 @@
PREFIX org: <http://www.w3.org/ns/org#>
DELETE {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
?membership ?p ?o .
?organization org:hasSubOrganization ?member .
}
} INSERT {
GRAPH <http://mu.semte.ch/graphs/shared>{
?membership ?p ?o .
?organization org:hasSubOrganization ?member .
}
} WHERE {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
?membership a org:Membership ;
org:member ?member ;
org:organization ?organization ;
?p ?o .
}
GRAPH <http://mu.semte.ch/graphs/shared> {
?member org:classification <http://data.vlaanderen.be/id/concept/BestuurseenheidClassificatieCode/5ab0e9b8a3b2ca7c5e000001> . # Municipality
?organization org:classification <http://data.vlaanderen.be/id/concept/BestuurseenheidClassificatieCode/5ab0e9b8a3b2ca7c5e000000> . # Province
}
}

View File

@@ -0,0 +1,36 @@
@prefix cleanup: <http://mu.semte.ch/vocabularies/ext/cleanup/> .
@prefix mu: <http://mu.semte.ch/vocabularies/core/> .
@prefix dcterms: <http://purl.org/dc/terms/> .
# Insert triples of the form
# <Province> <http://www.w3.org/ns/org#hasSubOrganization> <Municipality>
# matching memberships for which no such triple exists.
# Province: <http://data.vlaanderen.be/id/concept/BestuurseenheidClassificatieCode/5ab0e9b8a3b2ca7c5e000000>
#
# Municipality: <http://data.vlaanderen.be/id/concept/BestuurseenheidClassificatieCode/5ab0e9b8a3b2ca7c5e000001>
<http://data.lblod.info/id/cleanup-job/0cc5e981-a61e-433e-b6f2-c59fd8599944> a cleanup:Job ;
mu:uuid "0cc5e981-a61e-433e-b6f2-c59fd8599944" ;
dcterms:title "Insert missing `org:hasSubOrganization` triples relating provinces and municipalities." ;
cleanup:randomQuery """
PREFIX org: <http://www.w3.org/ns/org#>
INSERT {
GRAPH <http://mu.semte.ch/graphs/shared> {
?province org:hasSubOrganization ?municipality .
}
} WHERE {
GRAPH <http://mu.semte.ch/graphs/shared> {
?membership a org:Membership ;
org:organization ?province ;
org:member ?municipality ;
org:role <http://data.lblod.info/id/rollen/4ec7d5c39bdc4e84b4174379b9e22ad8> .
FILTER NOT EXISTS { ?province org:hasSubOrganization ?municipality . }
?municipality org:classification <http://data.vlaanderen.be/id/concept/BestuurseenheidClassificatieCode/5ab0e9b8a3b2ca7c5e000001> .
?province org:classification <http://data.vlaanderen.be/id/concept/BestuurseenheidClassificatieCode/5ab0e9b8a3b2ca7c5e000000> .
}
}
""" .

View File

@@ -0,0 +1,37 @@
@prefix cleanup: <http://mu.semte.ch/vocabularies/ext/cleanup/> .
@prefix mu: <http://mu.semte.ch/vocabularies/core/> .
@prefix dcterms: <http://purl.org/dc/terms/> .
# Delete triples of the form
# <Province> <http://www.w3.org/ns/org#hasSubOrganization> <Municipality>
# for which no matching membership exists.
# Province: <http://data.vlaanderen.be/id/concept/BestuurseenheidClassificatieCode/5ab0e9b8a3b2ca7c5e000000>
#
# Municipality: <http://data.vlaanderen.be/id/concept/BestuurseenheidClassificatieCode/5ab0e9b8a3b2ca7c5e000001>
<http://data.lblod.info/id/cleanup-job/7354dfd9-bdef-48d6-b81e-e814bd4f4e9c> a cleanup:Job ;
mu:uuid "7354dfd9-bdef-48d6-b81e-e814bd4f4e9c" ;
dcterms:title "Delete leftover `org:hasSubOrganization` triples between Provinces and municipalities." ;
cleanup:randomQuery """
PREFIX org: <http://www.w3.org/ns/org#>
DELETE {
GRAPH <http://mu.semte.ch/graphs/shared> {
?province org:hasSubOrganization ?municipality .
}
} WHERE {
GRAPH <http://mu.semte.ch/graphs/shared> {
?province org:hasSubOrganization ?municipality .
FILTER NOT EXISTS {
?membership a org:Membership ;
org:organization ?province ;
org:member ?municipality ;
org:role <http://data.lblod.info/id/rollen/4ec7d5c39bdc4e84b4174379b9e22ad8> .
}
?municipality org:classification <http://data.vlaanderen.be/id/concept/BestuurseenheidClassificatieCode/5ab0e9b8a3b2ca7c5e000001> .
?province org:classification <http://data.vlaanderen.be/id/concept/BestuurseenheidClassificatieCode/5ab0e9b8a3b2ca7c5e000000> .
}
}
""" .

View File

@@ -0,0 +1,32 @@
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX dcterms: <http://purl.org/dc/terms/>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
INSERT DATA {
GRAPH <http://mu.semte.ch/graphs/administrative-unit> {
<http://data.lblod.info/id/bestuurseenheden/862d7e64-fa34-4cd8-a948-00327c6260a6>
rdf:type <http://www.w3.org/ns/org#Organization> , <http://data.vlaanderen.be/ns/besluit#Bestuurseenheid> , dcterms:Agent ;
owl:sameAs <http://data.vlaanderen.be/doc/organisatie/OVO000617> ;
<http://www.w3.org/ns/org#classification> <http://data.vlaanderen.be/id/concept/BestuurseenheidClassificatieCode/52cc9d8d-1c9a-4d92-9936-da9d4a622ec4> ;
<http://www.w3.org/ns/org#linkedTo> <http://data.lblod.info/id/bestuurseenheden/141d9d6b-54af-4d17-b313-8d1c30bc3f5b> ;
<http://mu.semte.ch/vocabularies/core/uuid> "862d7e64-fa34-4cd8-a948-00327c6260a6" ;
skos:prefLabel "Vlaams Parlement" ;
<http://www.w3.org/2004/02/skos/core#note> """This is a special case, we consider (for now) Vlaams Parlement as a bestuurseenheid, of org:classification ABB.""";
<http://www.w3.org/ns/adms#identifier> <http://data.lblod.info/id/identificatoren/a03f0b48-1a6d-40af-84eb-5aee7b757986> ;
<http://www.w3.org/ns/regorg#orgStatus> <http://lblod.data.gift/concepts/63cc561de9188d64ba5840a42ae8f0d6> ;
<http://www.w3.org/ns/regorg#legalName> "Vlaams Parlement" .
<http://data.lblod.info/id/identificatoren/a03f0b48-1a6d-40af-84eb-5aee7b757986>
<https://data.vlaanderen.be/ns/generiek#gestructureerdeIdentificator> <http://data.lblod.info/id/gestructureerdeIdentificator/666c8cb7-030b-4e28-9042-82ac685684b9>;
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/ns/adms#Identifier>;
<http://www.w3.org/2004/02/skos/core#notation> "OVO-nummer" ;
<http://mu.semte.ch/vocabularies/core/uuid> "a03f0b48-1a6d-40af-84eb-5aee7b757986" .
<http://data.lblod.info/id/gestructureerdeIdentificator/666c8cb7-030b-4e28-9042-82ac685684b9>
<http://mu.semte.ch/vocabularies/core/uuid> "666c8cb7-030b-4e28-9042-82ac685684b9";
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <https://data.vlaanderen.be/ns/generiek#GestructureerdeIdentificator>;
<https://data.vlaanderen.be/ns/generiek#lokaleIdentificator> "OVO000617" .
}
}

View File

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

View File

@@ -0,0 +1,129 @@
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix dcterms: <http://purl.org/dc/terms/> .
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
# Core data
<http://data.lblod.info/id/bestuurseenheden/604d50138929f0e450f629b1caad73733d2a5dc31018edb53e50a5940f4dafe7> rdf:type <http://data.vlaanderen.be/ns/besluit#Bestuurseenheid> , <http://www.w3.org/ns/org#Organization> , dcterms:Agent ;
<http://mu.semte.ch/vocabularies/core/uuid> "604d50138929f0e450f629b1caad73733d2a5dc31018edb53e50a5940f4dafe7" ;
skos:prefLabel "Havenbedrijf Antwerpen" ;
<http://www.w3.org/ns/regorg#legalName> "Havenbedrijf Antwerpen" ;
<http://www.w3.org/ns/org#hasPrimarySite> <http://data.lblod.info/id/vestigingen/6867A955D4D5D97D41D25644> ;
<http://www.w3.org/ns/regorg#orgStatus> <http://lblod.data.gift/concepts/63cc561de9188d64ba5840a42ae8f0d6> ;
<http://www.w3.org/ns/adms#identifier> <http://data.lblod.info/id/identificatoren/6867A953D4D5D97D41D2563E> , <http://data.lblod.info/id/identificatoren/6867A954D4D5D97D41D25640> , <http://data.lblod.info/id/identificatoren/90a07cc0-58bf-11f0-a83a-cf8f2103999b> ;
<http://www.w3.org/ns/org#classification> <http://data.vlaanderen.be/id/concept/BestuurseenheidClassificatieCode/36a82ba0-7ff1-4697-a9dd-2e94df73b721> .
## Identifiers
### KBO no.
<http://data.lblod.info/id/identificatoren/6867A953D4D5D97D41D2563E> rdf:type <http://www.w3.org/ns/adms#Identifier> ;
<http://mu.semte.ch/vocabularies/core/uuid> "6867A953D4D5D97D41D2563E" ;
<https://data.vlaanderen.be/ns/generiek#gestructureerdeIdentificator> <http://data.lblod.info/id/gestructureerdeIdentificatoren/6867A953D4D5D97D41D2563D> ;
skos:notation "KBO nummer" .
<http://data.lblod.info/id/gestructureerdeIdentificatoren/6867A953D4D5D97D41D2563D> rdf:type <https://data.vlaanderen.be/ns/generiek#GestructureerdeIdentificator> ;
<http://mu.semte.ch/vocabularies/core/uuid> "6867A953D4D5D97D41D2563D" ;
<https://data.vlaanderen.be/ns/generiek#lokaleIdentificator> "0248399380" .
### SharePoint id
<http://data.lblod.info/id/identificatoren/6867A954D4D5D97D41D25640> rdf:type <http://www.w3.org/ns/adms#Identifier> ;
<http://mu.semte.ch/vocabularies/core/uuid> "6867A954D4D5D97D41D25640" ;
<https://data.vlaanderen.be/ns/generiek#gestructureerdeIdentificator> <http://data.lblod.info/id/gestructureerdeIdentificatoren/6867A954D4D5D97D41D2563F> ;
skos:notation "SharePoint identificator" .
<http://data.lblod.info/id/gestructureerdeIdentificatoren/6867A954D4D5D97D41D2563F> rdf:type <https://data.vlaanderen.be/ns/generiek#GestructureerdeIdentificator> ;
<http://mu.semte.ch/vocabularies/core/uuid> "6867A954D4D5D97D41D2563F" .
### OVO no.
<http://data.lblod.info/id/identificatoren/90a07cc0-58bf-11f0-a83a-cf8f2103999b> rdf:type <http://www.w3.org/ns/adms#Identifier> ;
<http://mu.semte.ch/vocabularies/core/uuid> "90a07cc0-58bf-11f0-a83a-cf8f2103999b" ;
<https://data.vlaanderen.be/ns/generiek#gestructureerdeIdentificator> <http://data.lblod.info/id/gestructureerdeIdentificatoren/90a07cc1-58bf-11f0-a83a-cf8f2103999b> ;
skos:notation "OVO-nummer" .
<http://data.lblod.info/id/gestructureerdeIdentificatoren/90a07cc1-58bf-11f0-a83a-cf8f2103999b> rdf:type <https://data.vlaanderen.be/ns/generiek#GestructureerdeIdentificator> ;
<http://mu.semte.ch/vocabularies/core/uuid> "90a07cc1-58bf-11f0-a83a-cf8f2103999b" .
# Contact information
<http://data.lblod.info/id/vestigingen/6867A955D4D5D97D41D25644> rdf:type <http://www.w3.org/ns/org#Site> ;
<http://mu.semte.ch/vocabularies/core/uuid> "6867A955D4D5D97D41D25644" ;
<http://www.w3.org/ns/org#siteAddress> <http://data.lblod.info/id/contact-punten/6867A954D4D5D97D41D25641> , <http://data.lblod.info/id/contact-punten/6867A954D4D5D97D41D25642> ;
<https://data.vlaanderen.be/ns/organisatie#bestaatUit> <http://data.lblod.info/id/adressen/6867A954D4D5D97D41D25643> ;
<http://data.lblod.info/vocabularies/erediensten/vestigingstype> <http://lblod.data.gift/concepts/f1381723dec42c0b6ba6492e41d6f5dd> .
<http://data.lblod.info/id/contact-punten/6867A954D4D5D97D41D25641> rdf:type <http://schema.org/ContactPoint> ;
<http://schema.org/contactType> "Primary" ;
<http://mu.semte.ch/vocabularies/core/uuid> "6867A954D4D5D97D41D25641" .
<http://data.lblod.info/id/contact-punten/6867A954D4D5D97D41D25642> rdf:type <http://schema.org/ContactPoint> ;
<http://schema.org/contactType> "Secondary" ;
<http://mu.semte.ch/vocabularies/core/uuid> "6867A954D4D5D97D41D25642" .
<http://data.lblod.info/id/adressen/6867A954D4D5D97D41D25643> rdf:type <http://www.w3.org/ns/locn#Address> ;
<https://data.vlaanderen.be/ns/adres#verwijstNaar> <https://data.vlaanderen.be/id/adres/3883528> ;
<http://mu.semte.ch/vocabularies/core/uuid> "6867A954D4D5D97D41D25643" ;
dcterms:source <http://lblod.data.gift/concepts/e59c97a9-4e95-4d65-9696-756de47fbc1f> ;
<http://www.w3.org/ns/locn#postCode> "2030" ;
<https://data.vlaanderen.be/ns/adres#Adresvoorstelling.huisnummer> "1" ;
<http://www.w3.org/ns/locn#adminUnitL2> "Antwerpen" ;
<http://www.w3.org/ns/locn#fullAddress> "Zaha Hadidplein 1, 2030 Antwerpen, Belgi\u00EB" ;
<http://www.w3.org/ns/locn#thoroughfare> "Zaha Hadidplein" ;
<https://data.vlaanderen.be/ns/adres#gemeentenaam> "Antwerpen" ;
<https://data.vlaanderen.be/ns/adres#land> "Belgi\u00EB" .
# Governing bodies
## Raad van bestuur
<http://data.lblod.info/id/bestuursorganen/8ffdfb30-58bf-11f0-8a90-dda5d31bcff4> rdf:type <http://data.vlaanderen.be/ns/besluit#Bestuursorgaan> ;
<http://mu.semte.ch/vocabularies/core/uuid> "8ffdfb30-58bf-11f0-8a90-dda5d31bcff4" ;
skos:prefLabel "Raad van bestuur Havenbedrijf Antwerpen" ;
<http://www.w3.org/ns/org#classification> <http://data.vlaanderen.be/id/concept/BestuursorgaanClassificatieCode/013cc838-173a-4657-b1ae-b00c048df943> ;
<http://data.vlaanderen.be/ns/besluit#bestuurt> <http://data.lblod.info/id/bestuurseenheden/604d50138929f0e450f629b1caad73733d2a5dc31018edb53e50a5940f4dafe7> .
<http://data.lblod.info/id/bestuursorganen/903007b0-58bf-11f0-8a90-dda5d31bcff4> rdf:type <http://data.vlaanderen.be/ns/besluit#Bestuursorgaan> ;
<http://mu.semte.ch/vocabularies/core/uuid> "903007b0-58bf-11f0-8a90-dda5d31bcff4" ;
<https://data.vlaanderen.be/ns/generiek#isTijdspecialisatieVan> <http://data.lblod.info/id/bestuursorganen/8ffdfb30-58bf-11f0-8a90-dda5d31bcff4> ;
<http://data.vlaanderen.be/ns/mandaat#bindingStart> "2019-01-01T00:00:00Z"^^xsd:dateTime .
## Bevoegd beslissingsorgaan
<http://data.lblod.info/id/bestuursorganen/900b1a90-58bf-11f0-8a90-dda5d31bcff4> rdf:type <http://data.vlaanderen.be/ns/besluit#Bestuursorgaan> ;
<http://mu.semte.ch/vocabularies/core/uuid> "900b1a90-58bf-11f0-8a90-dda5d31bcff4" ;
skos:prefLabel "Bevoegd beslissingsorgaan Havenbedrijf Antwerpen" ;
<http://www.w3.org/ns/org#classification> <http://data.vlaanderen.be/id/concept/BestuursorgaanClassificatieCode/0dbc70ec-6be9-4997-b8e1-11b6c0542382> ;
<http://data.vlaanderen.be/ns/besluit#bestuurt> <http://data.lblod.info/id/bestuurseenheden/604d50138929f0e450f629b1caad73733d2a5dc31018edb53e50a5940f4dafe7> .
<http://data.lblod.info/id/bestuursorganen/90384510-58bf-11f0-8a90-dda5d31bcff4> rdf:type <http://data.vlaanderen.be/ns/besluit#Bestuursorgaan> ;
<http://mu.semte.ch/vocabularies/core/uuid> "90384510-58bf-11f0-8a90-dda5d31bcff4" ;
<https://data.vlaanderen.be/ns/generiek#isTijdspecialisatieVan> <http://data.lblod.info/id/bestuursorganen/900b1a90-58bf-11f0-8a90-dda5d31bcff4> ;
<http://data.vlaanderen.be/ns/mandaat#bindingStart> "2019-01-01T00:00:00Z"^^xsd:dateTime .
## Algemene vergadering
<http://data.lblod.info/id/bestuursorganen/901812e0-58bf-11f0-8a90-dda5d31bcff4> rdf:type <http://data.vlaanderen.be/ns/besluit#Bestuursorgaan> ;
<http://mu.semte.ch/vocabularies/core/uuid> "901812e0-58bf-11f0-8a90-dda5d31bcff4" ;
skos:prefLabel "Algemene vergadering Havenbedrijf Antwerpen" ;
<http://www.w3.org/ns/org#classification> <http://data.vlaanderen.be/id/concept/BestuursorgaanClassificatieCode/b52094ff-21a2-4da8-8dbe-f513365d1528> ;
<http://data.vlaanderen.be/ns/besluit#bestuurt> <http://data.lblod.info/id/bestuurseenheden/604d50138929f0e450f629b1caad73733d2a5dc31018edb53e50a5940f4dafe7> .
<http://data.lblod.info/id/bestuursorganen/903c3cb0-58bf-11f0-8a90-dda5d31bcff4> rdf:type <http://data.vlaanderen.be/ns/besluit#Bestuursorgaan> ;
<http://mu.semte.ch/vocabularies/core/uuid> "903c3cb0-58bf-11f0-8a90-dda5d31bcff4" ;
<https://data.vlaanderen.be/ns/generiek#isTijdspecialisatieVan> <http://data.lblod.info/id/bestuursorganen/901812e0-58bf-11f0-8a90-dda5d31bcff4> ;
<http://data.vlaanderen.be/ns/mandaat#bindingStart> "2019-01-01T00:00:00Z"^^xsd:dateTime .
## Leidend Ambtenaar
<http://data.lblod.info/id/bestuursorganen/90230f60-58bf-11f0-8a90-dda5d31bcff4> rdf:type <http://data.vlaanderen.be/ns/besluit#Bestuursorgaan> ;
<http://mu.semte.ch/vocabularies/core/uuid> "90230f60-58bf-11f0-8a90-dda5d31bcff4" ;
skos:prefLabel "Leidend Ambtenaar Havenbedrijf Antwerpen" ;
<http://www.w3.org/ns/org#classification> <http://data.vlaanderen.be/id/concept/BestuursorgaanClassificatieCode/41caf7e6-b040-4720-9cc2-a96cfffed5b4> ;
<http://data.vlaanderen.be/ns/besluit#bestuurt> <http://data.lblod.info/id/bestuurseenheden/604d50138929f0e450f629b1caad73733d2a5dc31018edb53e50a5940f4dafe7> .
<http://data.lblod.info/id/bestuursorganen/90427e40-58bf-11f0-8a90-dda5d31bcff4> rdf:type <http://data.vlaanderen.be/ns/besluit#Bestuursorgaan> ;
<http://mu.semte.ch/vocabularies/core/uuid> "90427e40-58bf-11f0-8a90-dda5d31bcff4" ;
<http://data.lblod.info/vocabularies/leidinggevenden/heeftBestuursfunctie> <http://data.lblod.info/id/bestuursfuncties/904a6d80-58bf-11f0-8a90-dda5d31bcff4> ;
<https://data.vlaanderen.be/ns/generiek#isTijdspecialisatieVan> <http://data.lblod.info/id/bestuursorganen/90230f60-58bf-11f0-8a90-dda5d31bcff4> ;
<http://data.vlaanderen.be/ns/mandaat#bindingStart> "2019-01-01T00:00:00Z"^^xsd:dateTime .
# Related organisations
<http://data.lblod.info/id/lidmaatschap/6867A956D4D5D97D41D25646> rdf:type <http://www.w3.org/ns/org#Membership> ;
<http://www.w3.org/ns/org#organization> <http://data.lblod.info/id/bestuurseenheden/604d50138929f0e450f629b1caad73733d2a5dc31018edb53e50a5940f4dafe7> ;
<http://mu.semte.ch/vocabularies/core/uuid> "6867A956D4D5D97D41D25646" ;
<http://www.w3.org/ns/org#member> <http://data.lblod.info/id/bestuurseenheden/670db1d66c0de3b931962e1044033ccfa9d6e3023aa9828a5f252c3bc69bd32c> ;
<http://www.w3.org/ns/org#role> <http://data.lblod.info/id/rollen/73d5e1cf250d42fab15926771f07505a> .
<http://data.lblod.info/id/lidmaatschap/6867A956D4D5D97D41D25647> rdf:type <http://www.w3.org/ns/org#Membership> ;
<http://www.w3.org/ns/org#organization> <http://data.lblod.info/id/bestuurseenheden/604d50138929f0e450f629b1caad73733d2a5dc31018edb53e50a5940f4dafe7> ;
<http://mu.semte.ch/vocabularies/core/uuid> "6867A956D4D5D97D41D25647" ;
<http://www.w3.org/ns/org#member> <http://data.lblod.info/id/bestuurseenheden/bd74ee38a4b1e296821a11729c1f704cf439576c7ab2c910c95b067cf183d923> ;
<http://www.w3.org/ns/org#role> <http://data.lblod.info/id/rollen/4ec7d5c39bdc4e84b4174379b9e22ad8> .

View File

@@ -0,0 +1,26 @@
PREFIX org: <http://www.w3.org/ns/org#>
PREFIX dcterms: <http://purl.org/dc/terms/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
DELETE {
GRAPH ?g {
?s dcterms:date ?oldDate .
}
}
INSERT {
GRAPH ?g {
?s dcterms:date ?newDate .
}
}
WHERE {
GRAPH ?g {
?s a org:ChangeEvent ;
dcterms:date ?oldDate .
FILTER(DATATYPE(?oldDate) != xsd:date)
FILTER(?g IN (
<http://mu.semte.ch/graphs/administrative-unit>,
<http://mu.semte.ch/graphs/worship-service>
))
BIND(STRDT(SUBSTR(STR(?oldDate), 1, 10), xsd:date) AS ?newDate)
}
}

View File

@@ -1,30 +1,25 @@
import { generateReportFromData, batchedQuery } from '../helpers.js';
import { PREFIXES } from './utils'
import { generateReportFromData, batchedQuery } from "../helpers.js";
import { PREFIXES } from "./utils";
export default {
cronPattern: '0 00 23 * * *',
name: 'organizations',
cronPattern: "0 00 23 * * *",
name: "organizations",
execute: async () => {
const reportData = {
title: 'organizations',
description: 'List of the Organizations',
filePrefix: 'exports/organizations'
title: "organizations",
description: "List of the Organizations",
filePrefix: "exports/organizations",
};
console.log('Generating organizations report');
console.log("Generating organizations report");
const queryStringPart1 = `
${PREFIXES}
SELECT DISTINCT ?bestuur ?label ?classification ?typeEredienst
WHERE {
VALUES ?type {
org:Organization
besluit:Bestuurseenheid
}
GRAPH ?g {
?bestuur a ?type .
?bestuur a org:Organization .
OPTIONAL { ?bestuur skos:prefLabel ?label. }
}
@@ -44,12 +39,12 @@ export default {
const queryResponsePart1 = await batchedQuery(queryStringPart1);
const dataPart1 = queryResponsePart1.results.bindings.reduce( (acc, row) => {
acc[getSafeValue(row, 'bestuur')] = {
bestuur: getSafeValue(row, 'bestuur'),
label: getSafeValue(row, 'label'),
classification: getSafeValue(row, 'classification'),
typeEredienst: getSafeValue(row, 'typeEredienst'),
const dataPart1 = queryResponsePart1.results.bindings.reduce((acc, row) => {
acc[getSafeValue(row, "bestuur")] = {
bestuur: getSafeValue(row, "bestuur"),
label: getSafeValue(row, "label"),
classification: getSafeValue(row, "classification"),
typeEredienst: getSafeValue(row, "typeEredienst"),
};
return acc;
}, {});
@@ -59,17 +54,12 @@ export default {
SELECT DISTINCT ?bestuur ?provincie
WHERE {
VALUES ?type {
org:Organization
besluit:Bestuurseenheid
}
GRAPH ?g {
?bestuur a ?type .
?bestuur a org:Organization .
}
GRAPH ?h {
OPTIONAL {
OPTIONAL {
GRAPH ?h {
?bestuur org:hasPrimarySite ?primarySite.
OPTIONAL {
@@ -77,35 +67,37 @@ export default {
OPTIONAL { ?sa locn:adminUnitL2 ?provincie. }
}
}
FILTER (?h IN ( <http://mu.semte.ch/graphs/administrative-unit>, <http://mu.semte.ch/graphs/worship-service> ))
}
FILTER (?g IN ( <http://mu.semte.ch/graphs/administrative-unit>, <http://mu.semte.ch/graphs/worship-service>, <http://mu.semte.ch/graphs/shared>))
FILTER (?h IN ( <http://mu.semte.ch/graphs/administrative-unit>, <http://mu.semte.ch/graphs/worship-service>, <http://mu.semte.ch/graphs/shared>))
}
`;
const queryResponsePart2 = await batchedQuery(queryStringPart2);
const dataPart2 = queryResponsePart2.results.bindings.reduce( (acc, row) => {
const dataPart2 = queryResponsePart2.results.bindings.reduce((acc, row) => {
let dataPart = {
bestuur: getSafeValue(row, 'bestuur'),
provincie: getSafeValue(row, 'provincie')
bestuur: getSafeValue(row, "bestuur"),
provincie: getSafeValue(row, "provincie"),
};
acc[getSafeValue(row, 'bestuur')] = Object.assign(dataPart, dataPart1[getSafeValue(row, 'bestuur')]);
acc[getSafeValue(row, "bestuur")] = Object.assign(
dataPart,
dataPart1[getSafeValue(row, "bestuur")],
);
return acc;
}, {});
await generateReportFromData(Object.values(dataPart2), [
'bestuur',
'label',
'classification',
'typeEredienst',
'provincie'
], reportData);
}
await generateReportFromData(
Object.values(dataPart2),
["bestuur", "label", "classification", "typeEredienst", "provincie"],
reportData,
);
},
};
function getSafeValue(entry, property){
function getSafeValue(entry, property) {
return entry[property] ? wrapInQuote(entry[property].value) : null;
}

View File

@@ -469,6 +469,7 @@
"inverse": true
}
},
"features": ["include-uri"],
"new-resource-base": "http://data.lblod.info/id/organisaties/"
},
"administrative-units": {

View File

@@ -1,5 +1,3 @@
version: "3.4"
services:
identifier:
restart: "no"

View File

@@ -1,5 +1,3 @@
version: "3.4"
x-logging: &default-logging
driver: "json-file"
options:
@@ -116,7 +114,7 @@ services:
restart: always
logging: *default-logging
deltanotifier:
image: cecemel/delta-notifier:0.2.0-beta.2
image: semtech/mu-delta-notifier:0.4.0
volumes:
- ./config/delta:/config
labels:
@@ -196,7 +194,7 @@ services:
restart: always
logging: *default-logging
frontend:
image: lblod/frontend-organization-portal:1.31.0
image: lblod/frontend-organization-portal:1.33.0
volumes:
- ./config/frontend/add-x-frame-options-header.conf:/config/add-x-frame-options.conf
environment:
@@ -288,7 +286,7 @@ services:
restart: always
logging: *default-logging
report-generation:
image: lblod/loket-report-generation-service:0.7.0
image: lblod/loket-report-generation-service:0.8.3
environment:
DEFAULT_GRAPH: "http://mu.semte.ch/graphs/shared"
ONLY_KEEP_LATEST_REPORT: "true"

View File

@@ -1,6 +1,22 @@
{
"version": "0.1",
"scripts": [
{
"documentation": {
"command": "create-export",
"description": "create export of administrative units and their bodies",
"arguments": []
},
"environment": {
"image": "nvdk/ruby-semantic-works-cli",
"interactive": true,
"script": "export/run.rb",
"join_networks": true
},
"mounts": {
"app": "/app/"
}
},
{
"documentation": {
"command": "mu-search-delta",

View File

@@ -0,0 +1,22 @@
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>.
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix generiek: <https://data.vlaanderen.be/ns/generiek#> .
@prefix mandaat: <http://data.vlaanderen.be/ns/mandaat#> .
@prefix org: <http://www.w3.org/ns/org#> .
@prefix besluit: <http://data.vlaanderen.be/ns/besluit#> .
@prefix ere: <http://data.lblod.info/vocabularies/erediensten/> .
<http://lblod.data.gift/mappings.owl> a owl:Ontology .
# Equivalent Properties
generiek:isTijdspecialisatieVan owl:equivalentProperty
<http://data.vlaanderen.be/ns/generiek#isTijdspecialisatieVan>,
mandaat:isTijdspecialisatieVan .
org:classification owl:equivalentProperty besluit:classificatie .
generiek:gestructureerdeIdentificator owl:equivalentProperty <http://data.vlaanderen.be/ns/generiek#gestructureerdeIdentificator>.
# Subclass mappings
ere:BestuurVanDeEredienst rdfs:subClassOf besluit:Bestuurseenheid .
ere:CentraalBestuurVanDeEredienst rdfs:subClassOf besluit:Bestuurseenheid .
ere:RepresentatiefOrgaan rdfs:subClassOf besluit:Bestuurseenheid.

358
scripts/project/export/run.rb Executable file
View File

@@ -0,0 +1,358 @@
#!/usr/bin/env ruby
require 'bundler/inline'
require 'yaml'
require 'securerandom'
require 'date'
require 'rdf/vocab'
require 'tty-prompt'
require 'rdf/turtle'
require 'rdf/reasoner'
$stdout.sync = true
ENV['LOG_SPARQL_ALL']='false'
ENV['MU_SPARQL_ENDPOINT']='http://triplestore:8890/sparql'
ENV['MU_SPARQL_TIMEOUT']='180'
require 'mu/auth-sudo'
def sparql_escape_uri(value)
'<' + value.to_s.gsub(/[\\"<>]/) { |s| '\\' + s } + '>'
end
def sparql_escape_string(str)
'"""' + str.gsub(/[\\"]/) { |s| '\\' + s } + '"""'
end
def search_classifications
query = <<~EOF
PREFIX org: <http://www.w3.org/ns/org#>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX besluit: <http://data.vlaanderen.be/ns/besluit#>
SELECT DISTINCT ?type ?name ?classification WHERE {
?org a ?type;
org:classification ?classification.
?classification skos:prefLabel ?name.
VALUES ?type { besluit:Bestuurseenheid }
} ORDER BY ?name
EOF
Mu::AuthSudo.query(query)
end
def get_admin_units(classifications)
query = <<~EOF
PREFIX org: <http://www.w3.org/ns/org#>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX besluit: <http://data.vlaanderen.be/ns/besluit#>
SELECT DISTINCT ?org ?name WHERE {
?org a ?type;
skos:prefLabel ?name;
org:classification ?classification.
VALUES ?type { besluit:Bestuurseenheid }
VALUES ?classification { #{classifications.map{ |c| sparql_escape_uri(c) }.join(" ")}}
}
EOF
Mu::AuthSudo.query(query)
end
def export_admin_unit(unit)
repository = RDF::Repository.new
query = <<~EOF
PREFIX org: <http://www.w3.org/ns/org#>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX besluit: <http://data.vlaanderen.be/ns/besluit#>
PREFIX generiek: <https://data.vlaanderen.be/ns/generiek#>
CONSTRUCT {
?org ?p ?o
}
WHERE {
VALUES ?org { #{sparql_escape_uri(unit)}}
?org ?p ?o.
VALUES ?p {
rdf:type
org:classification
besluit:classificatie
skos:prefLabel
<http://mu.semte.ch/vocabularies/core/uuid>
<http://www.w3.org/ns/regorg#orgStatus>
<http://data.lblod.info/vocabularies/erediensten/betrokkenBestuur>
}
}
EOF
repository << Mu::AuthSudo.query(query)
query = <<~EOF
PREFIX org: <http://www.w3.org/ns/org#>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX besluit: <http://data.vlaanderen.be/ns/besluit#>
PREFIX generiek: <https://data.vlaanderen.be/ns/generiek#>
CONSTRUCT {
?org <http://www.w3.org/ns/adms#identifier> ?id.
?id ?p ?o.
?id skos:notation ?localId.
?id <http://www.w3.org/ns/adms#schemaAgency> ?source.
}
WHERE {
VALUES ?org { #{sparql_escape_uri(unit)}}
?org <http://www.w3.org/ns/adms#identifier> ?id.
?id ?p ?o.
FILTER (?p NOT IN(<http://www.w3.org/2004/02/skos/core#notation>, <https://data.vlaanderen.be/ns/generiek#gestructureerdeIdentificator>))
?id <http://www.w3.org/2004/02/skos/core#notation> ?source.
FILTER(?source != "SharePoint identificator")
?id <https://data.vlaanderen.be/ns/generiek#gestructureerdeIdentificator> ?gestructureerdeIdentificator.
?gestructureerdeIdentificator <https://data.vlaanderen.be/ns/generiek#lokaleIdentificator> ?localId
}
EOF
repository << Mu::AuthSudo.query(query)
query = <<~EOF
PREFIX org: <http://www.w3.org/ns/org#>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX besluit: <http://data.vlaanderen.be/ns/besluit#>
PREFIX generiek: <https://data.vlaanderen.be/ns/generiek#>
CONSTRUCT {
?org besluit:werkingsgebied ?gebied.
?gebied ?p ?o.
}
WHERE {
VALUES ?org { #{sparql_escape_uri(unit)}}
?org besluit:werkingsgebied ?gebied.
?gebied ?p ?o
}
EOF
repository << Mu::AuthSudo.query(query)
query = <<~EOF
PREFIX org: <http://www.w3.org/ns/org#>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX besluit: <http://data.vlaanderen.be/ns/besluit#>
PREFIX generiek: <https://data.vlaanderen.be/ns/generiek#>
PREFIX mandaat: <https://data.vlaanderen.be/ns/mandaat#>
CONSTRUCT {
?bestuursorgaan ?bp ?bo.
?bestuursorgaanIntijd generiek:isTijdspecialisatieVan ?bestuursorgaan.
?bestuursorgaanIntijd ?bop ?boo.
}
WHERE {
VALUES ?org { #{sparql_escape_uri(unit)}}
?bestuursorgaan besluit:bestuurt ?org.
?bestuursorgaan ?bp ?bo.
values ?tijdspecialisatie {
generiek:isTijdspecialisatieVan
mandaat:isTijdspecialisatieVan
}
?bestuursorgaanIntijd ?tijdspecialisatie ?bestuursorgaan.
?bestuursorgaanIntijd ?bop ?boo.
}
EOF
repository << Mu::AuthSudo.query(query)
query = <<~EOF
PREFIX org: <http://www.w3.org/ns/org#>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX besluit: <http://data.vlaanderen.be/ns/besluit#>
PREFIX generiek: <https://data.vlaanderen.be/ns/generiek#>
CONSTRUCT {
?mandaat ?p ?o.
?role ?roleP ?roleO.
}
WHERE {
VALUES ?org { #{sparql_escape_uri(unit)}}
?bestuursorgaan besluit:bestuurt ?org.
?bestuursorgaanIntijd generiek:isTijdspecialisatieVan ?bestuursorgaan.
VALUES ?post { org:hasPost <http://data.lblod.info/vocabularies/leidinggevenden/heeftBestuursfunctie>}
?bestuursorgaanIntijd ?post ?mandaat.
?mandaat ?p ?o.
?mandaat org:role ?role.
OPTIONAL {
?role ?roleP ?roleO.
FILTER(!STRSTARTS(STR(?role), "http://data.vlaanderen.be"))
}
}
EOF
repository << Mu::AuthSudo.query(query)
repository
end
def ensure_dir(path)
unless Dir.exist?(path)
Dir.mkdir(path)
end
end
def sanitize_unix_path(path)
# Regular expression to match characters not allowed in Unix paths
sanitized_path = path.gsub(/[^a-zA-Z0-9._\-\/]/, '-')
sanitized_path
end
def enrich_graph(data)
RDF::Reasoner.apply(:owl,:rdfs)
graph = RDF::Graph.load("./enrichment.owl")
graph << clean_up_dates(data)
graph.entail!(:subClassOf)
graph.entail!(:equivalentProperty)
graph
end
DATE_PREDICATES=[
RDF::URI("http://data.vlaanderen.be/ns/mandaat#bindingStart"),
RDF::URI("http://data.vlaanderen.be/ns/mandaat#bindingEinde"),
RDF::URI("https://data.vlaanderen.be/ns/generiek#bindingStart"),
RDF::URI("https://data.vlaanderen.be/ns/generiek#bindingEinde")
]
def convert_date_to_datetime(date_literal)
begin
date = Date.parse(date_literal.to_s)
datetime = DateTime.new(date.year, date.month, date.day)
RDF::Literal.new(datetime.strftime("%Y-%m-%dT%T"), datatype: RDF::XSD.dateTime)
rescue ArgumentError => e
puts "Invalid date format for #{date_literal}: #{e.message}"
nil
end
end
def clean_up_dates(data)
clean_data = RDF::Graph.new
data.each_statement do |statement|
if DATE_PREDICATES.include?(statement.predicate)
obj = statement.object
if obj.is_a?(RDF::Literal) && obj.datatype == RDF::XSD.date
new_object = convert_date_to_datetime(obj)
if new_object
clean_data << [statement.subject, statement.predicate, new_object] # Add the new statement
end
elsif obj.is_a?(RDF::Literal) && obj.datatype == RDF::XSD.dateTime
clean_data << statement
else
puts "unexpected value #{obj.inspect}for statement:\n #{statement.inspect}"
end
else
clean_data << statement
end
end
clean_data
end
prompt = TTY::Prompt.new
prompt.say("\n\n")
prompt.say("This script will help you export administrative units and their respective bodies")
options = search_classifications.map do |binding|
{name: "#{binding[:name]}", value: binding[:classification]}
end
if options.size > 0
classifications = prompt.multi_select("Please select the matching admin unit classifications", options)
admin_units = get_admin_units(classifications)
prompt.say("found #{admin_units.size} admin units")
output_dir = prompt.ask("Provide the directory the exports should be written to?", default: "/app/exports/")
ensure_dir(output_dir)
admin_units.each do |unit|
repo = export_admin_unit(unit[:org])
repo = enrich_graph(repo)
file_name = sanitize_unix_path(unit[:name].to_s)
timestamp=`date +%Y%0m%0d%0H%0M%0S`.strip.to_i
path = File.join(output_dir, "#{timestamp}-remove-data-#{file_name}-bestuurseenheid.sparql")
File.open(path, 'w') do |file|
file.write <<EOF
PREFIX besluit: <http://data.vlaanderen.be/ns/besluit#>
PREFIX mandaat: <http://data.vlaanderen.be/ns/mandaat#>
PREFIX generiek: <https://data.vlaanderen.be/ns/generiek#>
PREFIX org: <http://www.w3.org/ns/org#>
PREFIX prov: <http://www.w3.org/ns/prov#>
DELETE {
GRAPH <http://mu.semte.ch/graphs/public> {
?id ?p ?o.
}
} WHERE {
GRAPH <http://mu.semte.ch/graphs/public> {
<#{unit[:org]}> <http://www.w3.org/ns/adms#identifier> ?id.
?id ?p ?o.
}
};
DELETE {
GRAPH <http://mu.semte.ch/graphs/public> {
?gebied ?p ?o.
}
} WHERE {
GRAPH <http://mu.semte.ch/graphs/public> {
<#{unit[:org]}> besluit:werkingsgebied ?gebied.
?gebied ?p ?o.
}
};
DELETE WHERE {
GRAPH <http://mu.semte.ch/graphs/public> {
<#{unit[:org]}> ?p ?o
}
};
EOF
end
path = File.join(output_dir, "#{timestamp}-remove-data-#{file_name}-bestuursorganen.sparql")
File.open(path, 'w') do |file|
file.write <<EOF
PREFIX besluit: <http://data.vlaanderen.be/ns/besluit#>
PREFIX mandaat: <http://data.vlaanderen.be/ns/mandaat#>
PREFIX generiek: <https://data.vlaanderen.be/ns/generiek#>
PREFIX org: <http://www.w3.org/ns/org#>
PREFIX prov: <http://www.w3.org/ns/prov#>
DELETE {
GRAPH <http://mu.semte.ch/graphs/public> {
?mandaat ?p ?o
}
} WHERE {
GRAPH <http://mu.semte.ch/graphs/public> {
?bestuursorgaan besluit:bestuurt <#{unit[:org]}> .
?bestuursorgaanIntijd mandaat:isTijdspecialisatieVan ?bestuursorgaan.
VALUES ?post { org:hasPost <http://data.lblod.info/vocabularies/leidinggevenden/heeftBestuursfunctie>}
?bestuursorgaanIntijd ?post ?mandaat.
?mandaat ?p ?o.
}
};
DELETE {
GRAPH <http://mu.semte.ch/graphs/public> {
?mandaat ?p ?o
}
} WHERE {
GRAPH <http://mu.semte.ch/graphs/public> {
?bestuursorgaan besluit:bestuurt <#{unit[:org]}> .
?bestuursorgaanIntijd mandaat:isTijdspecialisatieVan ?bestuursorgaan.
VALUES ?post { org:hasPost <http://data.lblod.info/vocabularies/leidinggevenden/heeftBestuursfunctie>}
?bestuursorgaanIntijd ?post ?mandaat.
?mandaat ?p ?o.
}
};
DELETE {
GRAPH <http://mu.semte.ch/graphs/public> {
?bestuursorgaanIntijd ?p ?o
}
} WHERE {
GRAPH <http://mu.semte.ch/graphs/public> {
?bestuursorgaan besluit:bestuurt <#{unit[:org]}> .
?bestuursorgaanIntijd mandaat:isTijdspecialisatieVan ?bestuursorgaan.
VALUES ?post { org:hasPost <http://data.lblod.info/vocabularies/leidinggevenden/heeftBestuursfunctie>}
?bestuursorgaanIntijd ?p ?o
}
};
DELETE {
GRAPH <http://mu.semte.ch/graphs/public> {
?bestuursorgaan ?p ?o
}
} WHERE {
GRAPH <http://mu.semte.ch/graphs/public> {
?bestuursorgaan besluit:bestuurt <#{unit[:org]}>; ?p ?o
}
}
EOF
end
timestamp+=1
path = File.join(output_dir, "#{timestamp}-#{SecureRandom.uuid}-#{file_name}.ttl")
File.open(path, 'w') do |file|
file.write repo.dump(:ttl)
end
prompt.say("Exported #{repo.size} statements to #{path}")
end
else
abort("No classifications found?")
end