docker-compose up
Om een clean heropstart te doen, doe:
docker-compose down -v
docker-compose up
Ga naar http://localhost:3030/#/dataset/ds/query
Voorbeeld-query:
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX geosparql: <http://www.opengis.net/ont/geosparql#>
PREFIX adres: <https://data.vlaanderen.be/ns/adres#>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX dcterms: <http://purl.org/dc/terms/>
PREFIX generiek: <https://data.vlaanderen.be/ns/generiek#>
PREFIX logies: <https://data.vlaanderen.be/ns/logies#>
PREFIX log: <http://www.w3.org/2000/10/swap/log#>
PREFIX locn: <http://www.w3.org/ns/locn#>
PREFIX prov: <http://www.w3.org/ns/prov#>
PREFIX schema: <https://schema.org/>
PREFIX westtoerns: <https://westtoer.be/ns#>
PREFIX dcmitype: <http://purl.org/dc/dcmitype/>
PREFIX wgs84: <http://www.w3.org/2003/01/geo/wgs84_pos#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX adms: <http://www.w3.org/ns/adms#>
SELECT DISTINCT ?winId ?wijzigingsdatum ?beschrijving ?naam ?typeLabels ?status ?faciliteiten ?afbeeldingURL ?huisnummer ?straatnaam ?gemeente ?provincie ?postcode ?niscode ?website ?email ?telefoonnummers ?lat ?long ?toeristischeregioTVLId ?toeristischeregioLabel ?product ?wkt
WHERE {
GRAPH <urn:x-arq:DefaultGraph> {
?product a schema:TouristAttraction .
OPTIONAL {
?product adms:identifier [ skos:notation ?winId ]
}
OPTIONAL {
?product prov:generatedAtTime ?wijzigingsdatum .
}
OPTIONAL {
?product logies:heeftMedia/schema:contentUrl ?afbeeldingURL .
}
OPTIONAL {
?product schema:amenityFeature [
schema:name ?faciliteit
]
}
OPTIONAL {
SELECT DISTINCT ?product (group_concat(?faciliteit;separator=', ') as ?faciliteiten)
WHERE {
?product schema:amenityFeature [
schema:name ?faciliteit
]
FILTER(lang(?faciliteit) = 'nl')
}
GROUP BY ?product
}
OPTIONAL {
?product schema:contactPoint [
foaf:page ?website ;
schema:email ?email
]
}
OPTIONAL {
SELECT DISTINCT ?product (group_concat(?telefoon;separator=', ') as ?telefoonnummers)
WHERE {
?product schema:contactPoint/schema:telephone ?telefoon
}
GROUP BY ?product
}
OPTIONAL {
?product schema:additionalType ?type .
?type skos:prefLabel ?typeLabel .
FILTER (lang(?typeLabel) = 'nl')
}
OPTIONAL {
SELECT DISTINCT ?product (group_concat(?typeLabel;separator=', ') as ?typeLabels)
WHERE {
?product schema:additionalType ?type .
?type skos:prefLabel ?typeLabel .
FILTER (lang(?typeLabel) = 'nl')
}
GROUP BY ?product
}
OPTIONAL {
?product westtoerns:Product.status/skos:prefLabel ?status .
FILTER (lang(?status) = 'nl')
}
OPTIONAL {
?product locn:geometry [
wgs84:lat ?lat ;
wgs84:long ?long
] .
BIND (STRDT(CONCAT('POINT(', str(?long), ' ', str(?lat), ')'), <http://www.opengis.net/ont/geosparql#wktLiteral>) as ?wkt)
}
OPTIONAL {
?product schema:name ?naam .
FILTER (lang(?naam) = 'nl')
}
OPTIONAL {
?product schema:description ?beschrijving .
FILTER (lang(?beschrijving) = 'nl')
}
OPTIONAL {
?product locn:address [
locn:thoroughfare ?straatnaam ;
adres:Adresvoorstelling.huisnummer ?huisnummer ;
locn:postCode ?postcode ;
adres:gemeentenaam ?gemeente ;
westtoerns:gemeenteniscode ?niscode ;
] .
}
OPTIONAL {
?product locn:address [
adres:Adresvoorstelling.busnummer ?busnummer
] .
}
OPTIONAL {
?product locn:address [
locn:adminUnitL2 ?provincie
] .
FILTER (lang(?provincie) = "nl")
}
OPTIONAL {
?product logies:behoortTotToeristischeRegio ?toeristischeregio .
?toeristischeregio owl:sameAs ?toeristischeregioTVL .
BIND (str(?toeristischeregioTVL) as ?toeristischeregioTVLId) .
?toeristischeregio skos:prefLabel ?toeristischeregioLabel .
FILTER (lang(?toeristischeregioLabel) = 'nl')
}
# Filter op WinId
# FILTER (str(?winId) = "1000309")
# Enkel producttypes onder "Logies"
#?parentType skos:prefLabel "Logies"@nl ;
# skos:narrower+ ?type .
# Enkel producttypes onder "Eet- en drinkgelegenheden"
#?parentType skos:prefLabel "Eet- en drinkgelegenheden"@nl ;
# skos:narrower+ ?type .
# Enkel producttypes onder "MICE"
#?parentType skos:prefLabel "MICE"@nl ;
# skos:narrower+ ?type .
# Enkel producttypes onder "Permanent Aanbod"
#?parentType skos:prefLabel "Permanent Aanbod"@nl ;
# skos:narrower+ ?type .
# Enkel producttypes onder "Tijdelijk aanbod"
#?parentType skos:prefLabel "Tijdelijk aanbod"@nl ;
# skos:narrower+ ?type .
# Wijzingen sedert timestamp
# FILTER (?wijzigingsdatum >= "2024-02-05T18:07:52Z"^^<http://www.w3.org/2001/XMLSchema#dateTime>)
# Filteren op NIScode
# FILTER(?niscode = 35013)
}
}
LIMIT 500
Onderaan de query kan gefilterd worden op WIN ID en producttypes dat onder "Permanent Aanbod" vallen. Verwijder het spoorwegteken om uit commentaar te zetten.
Opmerkingen:
- Deze resultaten kunnen verwerkt worden als JSON (sparql11-results-json). Zie meer info hier.
- Er komt een punt dat er te veel producten zijn om in 1 HTTP response te passen. Dan dient er gepagineerd te worden met LIMIT en OFFSET. Zie meer info hier.
Het kan even duren vooraleer alle productversie's uit de LDES gesynchronizeerd zijn met de lokale triplestore. Om te checken of alles goed binnenstroomt / geen nieuwe producten meer binnenkomen, kan volgende COUNT query gebruikt worden:
PREFIX schema: <https://schema.org/>
SELECT (count(distinct ?product) as ?c)
WHERE {
GRAPH <urn:x-arq:DefaultGraph> {
?product a schema:TouristAttraction .
}
}
Ook het "info" tabblad op http://localhost:3030/#/dataset/ds/info
geeft inzicht of er (nog) data binnenstroomt of niet.
Tip: als je twijfelt, herstart de Docker containers:
CTRL-C en docker-compose start
OF docker-compose restart
Om zicht te krijgen wat er allemaal beschikbaar is over 1 product gebruiken we een SPARQL CONSTRUCT query.
Ga naar http://localhost:3030/#/dataset/ds/query
Zorg ervoor dat Content Type (GRAPH) op "Turtle" staat om een mooi resultaat te krijgen.
Voorbeeld-query:
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX geosparql: <http://www.opengis.net/ont/geosparql#>
PREFIX adres: <https://data.vlaanderen.be/ns/adres#>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX dcterms: <http://purl.org/dc/terms/>
PREFIX generiek: <https://data.vlaanderen.be/ns/generiek#>
PREFIX logies: <https://data.vlaanderen.be/ns/logies#>
PREFIX log: <http://www.w3.org/2000/10/swap/log#>
PREFIX locn: <http://www.w3.org/ns/locn#>
PREFIX prov: <http://www.w3.org/ns/prov#>
PREFIX schema: <https://schema.org/>
PREFIX westtoerns: <https://westtoer.be/ns#>
PREFIX dcmitype: <http://purl.org/dc/dcmitype/>
PREFIX wgs84: <http://www.w3.org/2003/01/geo/wgs84_pos#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX adms: <http://www.w3.org/ns/adms#>
CONSTRUCT {
?product ?p ?o .
?o ?p2 ?o2 .
?o2 ?p3 ?o3 .
} WHERE {
GRAPH <urn:x-arq:DefaultGraph> {
?product ?p ?o ;
adms:identifier [ skos:notation ?winId ]
OPTIONAL {
?o ?p2 ?o2 .
OPTIONAL {
?o2 ?p3 ?o3 .
}
}
VALUES ?winId { "1029472"^^<https://westtoer.be/id/concept/identificatiesysteem/win> }
# Of met product URI:
# VALUES ?product { <https://westtoer.be/id/product/f04a019e-ba7e-455c-89df-36516bdb1a40> }
}
}
Voor verwerking in code kan het handig zijn om het product in JSON-LD terug te krijgen.
Stap 1: pas Content Type (GRAPH) aan naar "JSON-LD" In code betekent dit dat een HTTP request met "Content-Type": "application/ld+json" wordt verstuurd naar het SPARQL endpoint.
In code betekent dit dat je een SPARQL request moet sturen naar "http://localhost:3030/ds/sparql". Hier zie je een voorbeeld in de Comunica client.
Stap 2: frame het JSON-LD object in de JSON-LD playground Klik op de tab "Framed"
Links plak je de output van Stap 1. Rechts maak je een object met als @id het product. Zie hier het resultaat.
In code betekent dit dat je een JSON-LD library moet gebruiken om framing toe te passen.
Stap 3: compacteer het object in de JSON-LD playground Klik op de tab "Compacted" Links plak je de output van Stap 2. Rechts plak je de nieuwe JSON-LD context zoals beschikbaar in deze repo.
Zie hier het resultaat.
In code betekent dit dat je een JSON-LD library moet gebruiken om compaction toe te passen.
Om een overzicht van producten in JSON-LD te krijgen, doen we hetzelfde als vorige stap (Content-Type JSON-LD), mits volgende aanpassing: in plaats van een VALUES block te gebruiken, voegen we een SELECT query (zoals eerste stap) toe in de WHERE-clausule.
Dit ziet er ruwweg zo uit:
CONSTRUCT {
?product ?p ?o .
?o ?p2 ?o2 .
?o2 ?p3 ?o3 .
} WHERE {
GRAPH <urn:x-arq:DefaultGraph> {
### SELECT in plaats van VALUES
{
SELECT DISTINCT ?product
WHERE { ... }
}
###
?product ?p ?o .
OPTIONAL {
?o ?p2 ?o2 .
OPTIONAL {
?o2 ?p3 ?o3 .
}
}
}
}
Voorbeeld-query:
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX geosparql: <http://www.opengis.net/ont/geosparql#>
PREFIX adres: <https://data.vlaanderen.be/ns/adres#>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX dcterms: <http://purl.org/dc/terms/>
PREFIX generiek: <https://data.vlaanderen.be/ns/generiek#>
PREFIX logies: <https://data.vlaanderen.be/ns/logies#>
PREFIX log: <http://www.w3.org/2000/10/swap/log#>
PREFIX locn: <http://www.w3.org/ns/locn#>
PREFIX prov: <http://www.w3.org/ns/prov#>
PREFIX schema: <https://schema.org/>
PREFIX westtoerns: <https://westtoer.be/ns#>
PREFIX dcmitype: <http://purl.org/dc/dcmitype/>
PREFIX wgs84: <http://www.w3.org/2003/01/geo/wgs84_pos#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX adms: <http://www.w3.org/ns/adms#>
CONSTRUCT {
?product ?p ?o .
?o ?p2 ?o2 .
?o2 ?p3 ?o3 .
}
WHERE {
GRAPH <urn:x-arq:DefaultGraph> {
{
SELECT DISTINCT ?productVersie
WHERE {
?product a schema:TouristAttraction .
OPTIONAL {
?product adms:identifier [ skos:notation ?winId ]
}
OPTIONAL {
?product prov:generatedAtTime ?wijzigingsdatum .
}
OPTIONAL {
?product schema:amenityFeature [
schema:name ?faciliteit
]
}
OPTIONAL {
SELECT DISTINCT ?product (group_concat(?faciliteit;separator=', ') as ?faciliteiten)
WHERE {
?product schema:amenityFeature [
schema:name ?faciliteit
]
}
GROUP BY ?product
}
OPTIONAL {
?product schema:contactPoint [
foaf:page ?website ;
schema:email ?email ;
schema:telephone ?telefoon
]
}
OPTIONAL {
?product schema:additionalType ?type .
?type skos:prefLabel ?typeLabel .
FILTER (lang(?typeLabel) = 'nl')
}
OPTIONAL {
?product westtoerns:Product.status/skos:prefLabel ?status .
FILTER (lang(?status) = 'nl')
}
OPTIONAL {
?product locn:geometry [
wgs84:lat ?lat ;
wgs84:long ?long
] .
}
OPTIONAL {
?product schema:name ?naam .
FILTER (lang(?naam) = 'nl')
}
OPTIONAL {
?product schema:description ?beschrijving .
FILTER (lang(?beschrijving) = 'nl')
}
OPTIONAL {
?product locn:address [
locn:thoroughfare ?straatnaam ;
adres:Adresvoorstelling.huisnummer ?huisnummer ;
locn:postCode ?postcode ;
adres:gemeentenaam ?gemeente ;
westtoerns:gemeenteniscode ?niscode ;
] .
}
OPTIONAL {
?product locn:address [
adres:Adresvoorstelling.busnummer ?busnummer
] .
}
OPTIONAL {
?product locn:address [
locn:adminUnitL2 ?provincie
] .
FILTER (lang(?provincie) = "nl")
}
OPTIONAL {
?product logies:behoortTotToeristischeRegio ?toeristischeregio .
?toeristischeregio owl:sameAs ?toeristischeregioTVL .
BIND (str(?toeristischeregioTVL) as ?toeristischeregioTVLId) .
?toeristischeregio skos:prefLabel ?toeristischeregioLabel .
FILTER (lang(?toeristischeregioLabel) = 'nl')
}
# Filter op WinId
# FILTER (str(?winId) = "1000309")
# Enkel producttypes onder bepaald hoofdtype
# ?parentType skos:prefLabel "Permanent Aanbod"@nl ;
# skos:narrower+ ?type .
}
LIMIT 10000
OFFSET 0
}
?product ?p ?o .
OPTIONAL {
?o ?p2 ?o2 .
OPTIONAL {
?o2 ?p3 ?o3 .
}
}
}
}
PREFIX dcm: <http://purl.org/dc/dcmitype/>
PREFIX dc: <http://purl.org/dc/elements/1.1/>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX dcterms: <http://purl.org/dc/terms/>
PREFIX generiek: <https://data.vlaanderen.be/ns/generiek#>
PREFIX logies: <https://data.vlaanderen.be/ns/logies#>
PREFIX log: <http://www.w3.org/2000/10/swap/log#>
PREFIX locn: <http://www.w3.org/ns/locn#>
PREFIX prov: <http://www.w3.org/ns/prov#>
PREFIX schema: <https://schema.org/>
PREFIX westtoerns: <https://westtoer.be/ns#>
PREFIX dcmitype: <http://purl.org/dc/dcmitype/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
SELECT DISTINCT ?productlist ?wijzigingsdatum ?name ?description ?product
WHERE {
GRAPH <urn:x-arq:DefaultGraph> {
?productlist a dcmitype:Collection ;
prov:generatedAtTime ?wijzigingsdatum .
# geef niet samengestelde producten terug (zijn zowel een collectie als tourist attraction)
FILTER NOT EXISTS { ?productlist a schema:TouristAttraction . }
OPTIONAL {
?productlist schema:name ?name .
FILTER (lang(?name) = "nl")
}
OPTIONAL {
?productlist schema:description ?description .
FILTER (lang(?description) = "nl")
}
OPTIONAL {
?productlist dcterms:hasPart ?product .
}
}
}
Gebruik de query hierboven om alle info van de specifieke producten binnen de lijst op te halen.
YASGUI kan gebruikt worden om makkelijk de producten op een kaart te plotten. Klik hier om het overzicht op een kaart te zien.
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX geosparql: <http://www.opengis.net/ont/geosparql#>
PREFIX adres: <https://data.vlaanderen.be/ns/adres#>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX dcterms: <http://purl.org/dc/terms/>
PREFIX generiek: <https://data.vlaanderen.be/ns/generiek#>
PREFIX logies: <https://data.vlaanderen.be/ns/logies#>
PREFIX log: <http://www.w3.org/2000/10/swap/log#>
PREFIX locn: <http://www.w3.org/ns/locn#>
PREFIX prov: <http://www.w3.org/ns/prov#>
PREFIX schema: <https://schema.org/>
PREFIX westtoerns: <https://westtoer.be/ns#>
PREFIX dcmitype: <http://purl.org/dc/dcmitype/>
PREFIX wgs84: <http://www.w3.org/2003/01/geo/wgs84_pos#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX adms: <http://www.w3.org/ns/adms#>
SELECT DISTINCT ?type ?label
WHERE {
GRAPH <urn:x-arq:DefaultGraph> {
?type skos:prefLabel ?label .
FILTER (contains(str(?type), "https://westtoer.be/id/concept/producttype/"))
FILTER(lang(?label) = 'nl')
}
}