Dag Ruben,
Met SPARQL is het inderdaad mogelijk dit te doen. Ik heb even wat queries voor je uitgezocht om hier een kleine opzet voor te geven gebaseerd op het voorbeeld wat je aanhaalt. Hiervoor heb ik de YASGUI interface gebruikt (SPARQL editor knop op de website), maar het is voor een excel eindresultaat denk ik makkelijker om het met Postman te automatiseren. Dan kun je rechtstreeks een CSV download krijgen en paginering gebruiken in de query (LIMIT
en OFFSET
).
Om te beginnen met je eerste vraag heb ik eerst de query omgebouwd naar een CONSTRUCT
query. Hierdoor krijg je direct de linked data terug en zijn relaties wat beter zichtbaar:
PREFIX brk: <http://brk.basisregistraties.overheid.nl/def/brk#>
CONSTRUCT {
?x ?p ?o
}
WHERE {
?x a brk:Perceel.
?x brk:kadastraleGemeente <http://brk.basisregistraties.overheid.nl/id/begrip/TNZ00> .
?x ?p ?o .
}
LIMIT 100
Dit levert de volgende triples op:
Dat betekent dat we a.d.h.v. het predicaat brk:kadastraleGrootte
de grootte van het perceel op kunnen vragen. Hiermee is het dus mogelijk om te filteren op het resultaat door et volgende toe te voegen in de where clause:
?x brk:kadastraleGrootte ?grootte
filter( ?grootte < 50.0 )
Hierna krijgen we inderdaad percelen terug met een kadastrale grootte kleiner dan 50:
Uiteindelijk willen we in principe alleen het perceelnummer en eventueel de grootte terug wat we kunnen doen door er weer een SELECT
query van te maken.
PREFIX brk: <http://brk.basisregistraties.overheid.nl/def/brk#>
SELECT ?x ?grootte
WHERE {
?x a brk:Perceel.
?x brk:kadastraleGemeente <http://brk.basisregistraties.overheid.nl/id/begrip/TNZ00> .
?x brk:kadastraleGrootte ?grootte .
filter( ?grootte < 50.0 ) .
}
LIMIT 100
Hieruit krijgen we netjes een tabel met de percelen uit Terneuzen met een oppervlak kleiner dan 50:
Als we hier in Excel dingen mee willen doen is het handig om hier wat data aan toe te voegen (zoals de gemeente naam). Ik hiervoor het statement ?x brk:kadastraleGemeente/rdfs:label ?gemeente .
toegevoegd in de WHERE
clause en ?gemeente
toegevoegd aan de SELECT
. hierdoor filteren we niet meer op gemeente maar vragen we de gemeente naam op.
Als je dit dan in excel hebt kun je daar dan zelf op sorteren of filteren.
YASGUI heeft de mogelijkheid om een CSV download van het resultaat te geven (knopje met pijltje naar beneden).
De uiteindelijke query die ik gebruikt heb is:
PREFIX brk: <http://brk.basisregistraties.overheid.nl/def/brk#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT ?gemeente ?x ?grootte
WHERE {
?x a brk:Perceel.
?x brk:kadastraleGemeente/rdfs:label ?gemeente .
?x brk:kadastraleGrootte ?grootte .
filter( ?grootte < 50.0 ) .
}
LIMIT 100
Als je met postman aan de slag gaat kun je deze URL gebruiken: https://data.pdok.nl/sparql?query=PREFIX%20brk%3A%20<http%3A%2F%2Fbrk.basisregistraties.overheid.nl%2Fdef%2Fbrk%23>
PREFIX%20rdfs%3A%20<http%3A%2F%2Fwww.w3.org%2F2000%2F01%2Frdf-schema%23>
SELECT%20%3Fgemeente%20%3Fx%20%3Fgrootte
WHERE%20{
%20%20%3Fx%20a%20brk%3APerceel.
%20%20%3Fx%20brk%3AkadastraleGemeente%2Frdfs%3Alabel%20%3Fgemeente%20.
%20%20%3Fx%20brk%3AkadastraleGrootte%20%3Fgrootte%20.
%20%20filter(%20%3Fgrootte%20<%2050.0%20)%20.
}
LIMIT%20100%20OFFSET%20100
Met de accept
header text/csv
komt daar dan CSV uit. Als je query parameter bekijkt is dat stiekem gewoon de query maar dan encoded. Met postman kun je de decoding ook weer doen (select parameter waarde, rechtsklik, decodeURIcomponent. Dan zul je ziet dat de laatste waarde een offset meegeeft van 100. Daarmee vraag je dus feitelijk pagina 2 op van de resultaten. Deze zou je programatisch op kunnen hogen met de grootte van LIMIT
en dan kun je over de hele resultset loopen zonder noemenswaardige performance impact. Pagina groottes hoger dan 100 is sterk af te raden.