Uitleg van de LD View aanpak

Stap 1. Source data model (LD Registratie)

Iedere registratie die beschikbaar is als linked data heeft een eigen data model. Dat data model is opgezet door de bronhouder, en is geoptimaliseerd voor het bijhouden van de registratie. Hieronder is als voorbeeld het data model van de BAG 2.0 LD getoond (versie 2020.4).

classDiagram class bag_AddresseerbaarObject { bag_geometry: geo_wktLiteral } bag_AddresseerbaarObject <|-- bag_Ligplaats bag_AddresseerbaarObject <|-- bag_Standplaats bag_AddresseerbaarObject <|-- bag_Verblijfsobject class bag_AddresseerbaarObjectRegistratie { } bag_AddresseerbaarObjectRegistratie --> bag_Nummeraanduiding: bag_hoofdadres bag_AddresseerbaarObjectRegistratie --> bag_Nummeraanduiding: bag_nevenadres foaf_Document <|-- bag_AddresseerbaarObjectRegistratie class bag_Ligplaats { } class bag_LigplaatsRegistratie { } foaf_Document <|-- bag_LigplaatsRegistratie bag_LigplaatsRegistratie --> bag_Ligplaats: foaf_primaryTopic class bag_Nummeraanduiding { } bag_Nummeraanduiding --> nen3610_Identificatie: nen3610_identificatie class bag_NummeraanduidingRegistratie { bag_huisletter: xsd_string bag_huisnummer: xsd_positiveInteger bag_huisnummertoevoeging: xsd_string bag_postcode: xsd_string bag_status: bag_StatusNaamgeving } foaf_Document <|-- bag_NummeraanduidingRegistratie bag_NummeraanduidingRegistratie --> bag_Nummeraanduiding: foaf_primaryTopic bag_NummeraanduidingRegistratie --> bag_OpenbareRuimte: bag_ligtAan bag_NummeraanduidingRegistratie --> bag_Woonplaats: bag_ligtIn class bag_OpenbareRuimte { } bag_OpenbareRuimte --> nen3610_Identificatie: nen3610_identificatie class bag_OpenbareRuimteRegistratie { bag_type: bag_TypeOpenbareRuimte skos_altLabel: rdf_langString skos_prefLabel: rdf_langString } foaf_Document <|-- bag_OpenbareRuimteRegistratie bag_OpenbareRuimteRegistratie --> bag_Woonplaats: bag_ligtIn bag_OpenbareRuimteRegistratie --> bag_OpenbareRuimte: foaf_primaryTopic class bag_Pand { } bag_Pand --> nen3610_Identificatie: nen3610_identificatie class bag_PandRegistratie { bag_bouwjaar: xsd_gYear bag_geometrie: geo_wktLiteral } foaf_Document <|-- bag_PandRegistratie bag_PandRegistratie --> bag_Pand: foaf_primaryTopic class bag_Standplaats { } class bag_StandplaatsRegistratie { } foaf_Document <|-- bag_StandplaatsRegistratie bag_StandplaatsRegistratie --> bag_Standplaats: foaf_primaryTopic class bag_Verblijfsobject { } bag_Verblijfsobject --> nen3610_Identificatie: nen3610_identificatie class bag_VerblijfsobjectRegistratie { bag_gebruiksdoel: bag_Gebruiksdoel bag_geometrie: geo_wktLiteral bag_oppervlakte: xsd_positiveInteger } foaf_Document <|-- bag_VerblijfsobjectRegistratie bag_VerblijfsobjectRegistratie --> bag_Nummeraanduiding: bag_hoofdadres bag_VerblijfsobjectRegistratie --> bag_Pand: bag_maaktDeelUitVan bag_VerblijfsobjectRegistratie --> bag_Verblijfsobject: foaf_primaryTopic class bag_Woonplaats { } bag_Woonplaats --> nen3610_Identificatie: nen3610_identificatie class bag_WoonplaatsRegistratie { bag_geometrie: geo_wktLiteral skos_prefLabel: rdf_langString } foaf_Document <|-- bag_WoonplaatsRegistratie bag_WoonplaatsRegistratie --> bag_Woonplaats: foaf_primaryTopic class foaf_Document { bag_beginRegistratie: xsd_dateTime bag_eindRegistratie: xsd_dateTime bag_geconstateerd: xsd_boolean bag_status: bag_Status dct_created: xsd_date dct_identifier: xsd_string nen3610_beginGeldigheid: xsd_date nen3610_eindGeldigheid: xsd_date prov_generatedAtTime: xsd_date prov_invalidatedAtTime: xsd_date prov_order: xsd_positiveInteger } foaf_Document --> foaf_Document: nen3610_vorigeGeldigeVersie foaf_Document --> foaf_Document: nen3610_vorigeGeregisteerdeVersie class nen3610_Identificatie { nen3610_lokaalID: xsd_string nen3610_namespace: xsd_string rdf_value: xsd_string }

Stap 2. Target data model (Schema.org)

We stellen een target data model vast. Dit is een data model dat een meer object-gecentreerde view op de gegevens uit de LD Registratie geeft.

In dit specifieke voorbeeld genereren we de object-gecentreerde laag voor een algemene gebruiker op het web. Hiervoor versimpelen we bepaalde concepten richting het breed gebruikte Schema.org data model.

classDiagram class sdo_Address { sdo_addressCountry: xsd_string sdo_addressLocality: xsd_string sdo_name: xsd_string sdo_postalCode: xsd_string sdo_streetAddress: xsd_string prov_wasDerivedFrom: bag_Nummeraanduiding prov_wasDerivedFrom: bag_OpenbareRuimte } class sdo_City { } sdo_Place <|-- sdo_City class sdo_GeoCoordinates { sdo_latitude: xsd_double sdo_longitude: xsd_double sdo_name: xsd_string } class sdo_GeoShape { sdo_name: xsd_string sdo_polygon: xsd_string } class sdo_Place { sdo_dateCreated: xsd_gYear sdo_floorsize: xsd_nonNegativeInteger sdo_name: xsd_string prov_wasDerivedFrom: bag_Pand prov_wasDerivedFrom: bag_Verblijfsobject } sdo_Place --> sdo_City: sdo_containedInPlace sdo_Place --> sdo_Address: sdo_address sdo_Place --> sdo_GeoCoordinates: sdo_geo sdo_Place --> sdo_GeoShape: sdo_geo

Stap 3. Formuleer de transformatie van source naar target

Op basis van het LD Registratie model wordt vervolgens een gestandaardiseerde transformatie uitgevoerd richting een object-gecentreerde laag.

Met deze aanpak kan dezelfde informatie op een andere manier gepresenteerd worden, dichter bij de behoeften van een specifieke gebruikersgroep.

In specifieke geval transformeren we van BAG 2.0 LD naar Schema.org.

prefix bag: <https://bag2.basisregistraties.overheid.nl/bag/def/>
prefix dct: <http://purl.org/dc/terms/>
prefix foaf: <http://xmlns.com/foaf/0.1/>
prefix geo: <http://www.opengis.net/ont/geosparql#>
prefix prov: <http://www.w3.org/ns/prov#>
prefix sdo: <https://schema.org/>
prefix skos: <http://www.w3.org/2004/02/skos/core#>
construct {
  ?city
    a sdo:City;
    prov:wasDerivedFrom ?woonplaatsRegistratie;
    sdo:geo ?shape;
    sdo:name ?name.
  ?shape a sdo:GeoShape;
    sdo:polygon ?polygon.
} where {
  ?woonplaatsRegistratie
    a bag:WoonplaatsRegistratie;
    bag:geometrie ?polygon;
    dct:identifier ?id;
    foaf:primaryTopic ?woonplaats;
    skos:prefLabel ?name.
  filter not exists { ?woonplaatsRegistratie prov:invalidatedAtTime []. }
  bind(iri(concat("https://data.labs.kadaster.nl/kadaster/kg/id/city/",str(?id))) as ?city)
  bind(iri(concat("https://data.labs.kadaster.nl/kadaster/kg/id/geo-shape/",str(?id))) as ?shape)
}
limit 1

Stap 4. Voer de transformatie uit