Skip to content

sirus-be/westtoer-win-ldes2triplestore

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

41 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Setup

docker-compose up

Om een clean heropstart te doen, doe:

docker-compose down -v
docker-compose up

Overzicht van producten

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.

Monitoring

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

Alle info van 1 specifiek product

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

Turtle - mensleesbaar

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> }
  }
}

JSON-LD - machineleesbaar

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.

Overzicht van producten in JSON-LD

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 .
    }
  }
  }
}

Overzicht van productlijsten

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.

Visualisatie

YASGUI kan gebruikt worden om makkelijk de producten op een kaart te plotten. Klik hier om het overzicht op een kaart te zien.

Producttypes oplijsten

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')
  }
}

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published