Kadaster SPARQL Tutorial


Wouter Beek wouter@triply.cc

Laurens Rietveld laurens@triply.cc

Januari 10th, 2018

Deel I:
De eerste SPARQL vraag

De eerste SPARQL vraag


select ?s ?p ?o {
  ?s ?p ?o
}
limit 5
            

Onderdelen:

  1. projectie: select ?s ?p ?o
  2. patroon: ?s ?p ?o .
  3. limiet: limit 5

Verander de projectie


select ?o ?p ?s {
  ?s ?p ?o
}
limit 5
            

Verander de limiet


select ?s ?p ?o {
  ?s ?p ?o
}
limit 10
            

Voeg een offset toe


select ?s ?p ?o {
  ?s ?p ?o
}
limit 5
offset 5
            

Deel II:
De BAG bevragen met SPARQL

Pas het patroon aan


select ?s {
  ?s <http://bag.basisregistraties.overheid.nl/def/bag#naamOpenbareRuimte> "Hofstraat"
}
limit 100
            

“Openbare ruimtes die ‘Hofstraat’ heten.”

URIs kunnen lang worden…


select ?s ?y {
  ?s <http://bag.basisregistraties.overheid.nl/def/bag#naamOpenbareRuimte> "Hofstraat" .
  ?s <http://bag.basisregistraties.overheid.nl/def/bag#bijbehorendeWoonplaats> ?y .
}
limit 100
            

“Openbare ruimtes die ‘Hofstraat’ heten én hun bijbehorende woonplaats.”

Gebruik afkortingen


prefix bag: <http://bag.basisregistraties.overheid.nl/def/bag#>
select ?openbareRuimte ?woonplaats {
  ?openbareRuimte bag:naamOpenbareRuimte "Hofstraat" ;
                  bag:bijbehorendeWoonplaats ?woonplaats .
}
limit 100
            

Afkortingen:

  1. URI prefix (bag:)
  2. Herhaling subject term (;)

Menselijk leesbare labels


prefix bag: <http://bag.basisregistraties.overheid.nl/def/bag#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
select ?openbareRuimte ?woonplaats ?label {
  ?openbareRuimte bag:naamOpenbareRuimte "Hofstraat" ;
                  bag:bijbehorendeWoonplaats ?woonplaats .
  ?woonplaats bag:naamWoonplaats ?label .
}
limit 100
            

Maak het patroon specifieker


prefix bag: <http://bag.basisregistraties.overheid.nl/def/bag#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
select ?openbareRuimte ?woonplaats {
  ?openbareRuimte bag:naamOpenbareRuimte "Hofstraat" ;
                  bag:bijbehorendeWoonplaats ?woonplaats .
  ?woonplaats rdfs:label "Apeldoorn"@nl .
}
limit 100
            

“De Hofstraat in Aperldoorn.”

(Merk op: er zijn 2 openbare ruimtes; hierover later meer.)

Voeg nummeraanduiding toe


prefix bag: <http://bag.basisregistraties.overheid.nl/def/bag#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
select ?nummeraanduiding ?openbareRuimte {
  ?openbareRuimte bag:naamOpenbareRuimte "Hofstraat" ;
                  bag:bijbehorendeWoonplaats/rdfs:label "Apeldoorn"@nl .
  ?nummeraanduiding bag:bijbehorendeOpenbareRuimte ?openbareRuimte ;
                    bag:huisnummer 110 .
}
limit 100
            

Property path notatie (/)

Voeg verblijfsobject en pand toe


prefix bag: <http://bag.basisregistraties.overheid.nl/def/bag#>
prefix geo: <http://www.opengis.net/ont/geosparql#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
select ?wkt {
  ?openbareRuimte bag:naamOpenbareRuimte "Hofstraat" ;
                  bag:bijbehorendeWoonplaats/rdfs:label "Apeldoorn"@nl .
  ?nummeraanduiding bag:bijbehorendeOpenbareRuimte ?openbareRuimte ;
                    bag:huisnummer 110 .
  ?verblijfsobject bag:hoofdadres ?nummeraanduiding ;
                   bag:pandrelatering ?pand .
  ?pand bag:geometriePand/geo:asWKT ?wkt .
}
limit 100
            

Well-Known Text (WKT)

Maak patroon generieker


prefix bag: <http://bag.basisregistraties.overheid.nl/def/bag#>
prefix geo: <http://www.opengis.net/ont/geosparql#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
select ?wkt ?wktLabel {
  ?openbareRuimte bag:naamOpenbareRuimte "Hofstraat" ;
                  bag:bijbehorendeWoonplaats/rdfs:label "Apeldoorn"@nl .
  ?nummeraanduiding bag:bijbehorendeOpenbareRuimte ?openbareRuimte ;
                    bag:huisnummer ?wktLabel .
  ?verblijfsobject bag:hoofdadres ?nummeraanduiding ;
                   bag:pandrelatering/bag:geometriePand/geo:asWKT ?wkt .
}
limit 100
            

Deel III:
Versies in de BAG

Zijn er meerdere Apeldoorns?


prefix bag: <http://bag.basisregistraties.overheid.nl/def/bag#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
select ?openbareRuimte ?woonplaats {
  ?openbareRuimte bag:naamOpenbareRuimte "Hofstraat" ;
                  bag:bijbehorendeWoonplaats ?woonplaats .
  ?woonplaats rdfs:label "Apeldoorn"@nl .
}
limit 100
            
openbareRuimtewoonplaats
openbare-ruimte:0200300022471548woonplaats:2247
openbare-ruimte:0200300022471548woonplaats:3560

BAG status


prefix bag: <http://bag.basisregistraties.overheid.nl/def/bag#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
select ?woonplaats ?status {
  ?openbareRuimte bag:naamOpenbareRuimte "Hofstraat" ;
                  bag:bijbehorendeWoonplaats ?woonplaats .
  ?woonplaats rdfs:label "Apeldoorn"@nl ;
              bag:status ?status .
}
limit 100
            
woonplaatsstatus
woonplaats:2247begrip:WoonplaatsAangewezen
woonplaats:2247begrip:WoonplaatsIngetrokken
woonplaats:3560begrip:WoonplaatsAangewezen

Alleen huidige woonplaatsen


prefix bag: <http://bag.basisregistraties.overheid.nl/def/bag#>
prefix begrip: <http://bag.basisregistraties.overheid.nl/id/begrip/>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
select ?openbareRuimte ?woonplaats {
  ?openbareRuimte bag:naamOpenbareRuimte "Hofstraat" ;
                  bag:bijbehorendeWoonplaats ?woonplaats .
  ?woonplaats rdfs:label "Apeldoorn"@nl .
  filter not exists {
    ?woonplaats bag:status begrip:WoonplaatsIngetrokken .
  }
}
limit 100
            

Nu hebben we de juiste Apeldoorn.

BAG voorkomen


prefix bag: <http://bag.basisregistraties.overheid.nl/def/bag#>
prefix begrip: <http://bag.basisregistraties.overheid.nl/id/begrip/>
prefix geo: <http://www.opengis.net/ont/geosparql#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
select ?wkt ?begin ?eind {
  ?openbareRuimte bag:naamOpenbareRuimte "Hofstraat" ;
                  bag:bijbehorendeWoonplaats ?woonplaats .
  ?woonplaats rdfs:label "Apeldoorn"@nl .
  filter not exists {
    ?woonplaats bag:status begrip:WoonplaatsIngetrokken .
  }
  ?nummeraanduiding bag:bijbehorendeOpenbareRuimte ?openbareRuimte ;
                    bag:huisnummer 110 .
  ?verblijfsobject bag:hoofdadres ?nummeraanduiding ;
                   bag:pandrelatering/bag:geometriePand/geo:asWKT ?wkt ;
                   rdfs:isDefinedBy ?voorkomen .
  ?voorkomen bag:beginGeldigheid ?begin .
  optional {
    ?voorkomen bag:eindGeldigheid ?eind .
  }
}
limit 100
            

Huidig voorkomen


prefix bag: <http://bag.basisregistraties.overheid.nl/def/bag#>
prefix begrip: <http://bag.basisregistraties.overheid.nl/id/begrip/>
prefix geo: <http://www.opengis.net/ont/geosparql#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
select ?wkt ?wktLabel {
  ?openbareRuimte bag:naamOpenbareRuimte "Hofstraat" ;
                  bag:bijbehorendeWoonplaats ?woonplaats .
  ?woonplaats rdfs:label "Apeldoorn"@nl .
  filter not exists {
    ?woonplaats bag:status begrip:WoonplaatsIngetrokken .
  }
  ?nummeraanduiding bag:bijbehorendeOpenbareRuimte ?openbareRuimte ;
                    bag:huisnummer 110 .
  ?verblijfsobject bag:hoofdadres ?nummeraanduiding ;
                   bag:pandrelatering/bag:geometriePand/geo:asWKT ?wkt ;
                   rdfs:isDefinedBy ?voorkomen .
  ?voorkomen bag:beginGeldigheid ?wktLabel .
  filter not exists {
    ?voorkomen bag:eindGeldigheid ?eind .
  }
}
limit 100
            

Deel IV:
Aggregatie

Oudste pand in Apeldoorn


prefix bag: <http://bag.basisregistraties.overheid.nl/def/bag#>
prefix begrip: <http://bag.basisregistraties.overheid.nl/id/begrip/>
prefix geo: <http://www.opengis.net/ont/geosparql#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
select ?wkt ?wktLabel {
  ?woonplaats bag:naamWoonplaats "Apeldoorn" .
  filter not exists {
    ?woonplaats bag:status begrip:WoonplaatsIngetrokken .
  }
  ?openbareRuimte bag:bijbehorendeWoonplaats ?woonplaats .
  ?nummeraanduiding bag:bijbehorendeOpenbareRuimte ?openbareRuimte .
  ?verblijfsobject bag:hoofdadres ?nummeraanduiding ;
                   bag:pandrelatering ?pand ;
                   rdfs:isDefinedBy ?voorkomen .
  filter not exists {
    ?voorkomen bag:eindGeldigheid ?eind
  }
  ?pand bag:oorspronkelijkBouwjaar ?wktLabel ;
        bag:geometriePand/geo:asWKT ?wkt ;
        rdfs:isDefinedBy ?voorkomen2 .
  filter not exists {
    ?voorkomen2 bag:eindGeldigheid ?eind2 .
  }
}
order by asc(?wktLabel)
limit 5
            

Kadaster SPARQL

Productie endpoint:
https://data.pdok.nl/sparql

Data stories:
https://data.labs.pdok.nl/stories/


Dank voor het meedoen!