Praktijk introductie in SPARQL

Praktijk introductie in SPARQL

Het semantische web werd in 2001 door Sir. Tim Berners Lee als de toekomst beschreven. Tegenwoordig wordt er veelal gesproken over Linked Data of Linked Web. Indien je met Linked Data aan de slag wilt kan je met een SPARQL endpoint aan de slag, of API’s of websites gaan scrapen. Voor de Hack-a-lod gaan we uit van het idee dat SPARQL endpoints voor de meeste gebruikers de makkelijkste manier is om in te stappen. We werken met voorbeelden  die tevens ruimte bieden voor uitbouw naar complexere toepassingen. Bij deze introductie werken we met het SPARQL endpoint van de Koninklijke Bibliotheek.

Type gebruik SPARQL endpoints

SPARQL endpoints kan je op verschillende manieren gebruiken. Je kan een aantal SPARQL ‘queries’ gebruiken om data op te halen, maar je kan SPARQL ook gebruiken ook complexe informatievragen te beantwoorden of berekeningen uit te voeren. Soms wil je informatie on-demand ophalen, soms wil je data offline klaar hebben staan. Dit hangt allemaal samen met wat je met de data wilt doen, of je dat je zelfs bulk data via SPARQL wilt gaan ophalen. Voor dit laatste wordt er nog een aparte ‘bulk SPARQL datablog’ uitgewerkt.

 

SPARQL tools 

Veel SPARQL endpoints, en dus ook de data.bibliotheken.nl, hebben een html interface waar je queries kan invoeren. De query resultaten vormen een link  en vormen een resultaat pagina op het web.

Hier kan je queries ontwikkelen of testen, of verkennen wat er zo al voor data in het endpoint zit. Bij de voorbeelden linken we telkens ook naar de html query, zodat dat je de ‘live’ resultaten kan bekijken. Een andere manier om SPARQL endpoints te benaderen is via SPARQL clients. Deze kunnen online of online zijn, met interface zijn of enkel een command line tool zijn . Voorbeelden van clients zijn Yasgui (webbased),  Twinkle (GUI based) of Apache Jena’s ARQ rsparql (CLI Windows / Linux / Mac). Met deze clients voeg je enkel als SPARQL endpoint toe ‘http://data.bilbiotheken.nl/sparql‘  en vervolgens kan je SPARQL queries inschieten. Hoe dit werkt blijkt het beste uit een voorbeeld met Apache Jena:

rsparql --service=http://data.bibliotheken.nl/sparql --results=CSV '
prefix schema: <http://schema.org/>
prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
SELECT ?book ?p ?o WHERE {
 $book rdf:type schema:Book .
 ?book ?p ?o
} LIMIT 3'

Zo simpel kan het zijn. Naast clients zijn er natuurlijk ook SPARQL software bibliotheken voor de meeste gangbare programmeertalen. Als laatste kan je ook met CURL aan de slag, of vanuit je favoriete programmeertaal http requests samenstellen. Het SPARQL protocol is eigenlijk een REST API interface. Hierbij zijn er parameters zoals de ‘query’  en het gewenste ‘format’  (CSV, json, Turtle). Er zijn natuurlijk nog veel meer mogelijkheden, de basis is erg eenvoudig.

http://data.bibliotheken.nl/sparql?default-graph-uri=&query=prefix+schema%3A+%3Chttp%3A%2F%2Fschema.org%2F%3E%0D%0Aprefix+rdf%3A+%3Chttp%3A%2F%2Fwww.w3.org%2F1999%2F02%2F22-rdf-syntax-ns%23%3E+ %0D%0ASELECT+%24book+%24p+%24o+WHERE+%7B+%24book+rdf%3Atype+schema%3ABook+ .%0D%0A%24book+%24p+%24o%0D%0A%7D+LIMIT+3&format=json

Hierbij worden de parameters met url encode gecodeerd. Om encoded query weer om te zetten naar een leesbare string kan je dit handige online tooltje gebruiken. Bij Virtuozzo endpoints kan je terug naar html interface door de parameter naam ‘query’  te vervangen door ‘qtxt’.

http://data.bibliotheken.nl/sparql?default-graph-uri=&qtxt=prefix+schema%3A+%3Chttp%3A%2F%2Fschema.org%2F%3E%0D%0Aprefix+rdf%3A+%3Chttp%3A%2F%2Fwww.w3.org%2F1999%2F02%2F22-rdf-syntax-ns%23%3E+ %0D%0ASELECT+%24book+%24p+%24o+WHERE+%7B+%24book+rdf%3Atype+schema%3ABook+ .%0D%0A%24book+%24p+%24o%0D%0A%7D+LIMIT+3&format=json

 

SPARQL data verkennen

Hoe kom je er achter wat er voor een data beschikbaar is in een SPARQL endpoint? Bij database systemen kan je veel al een overzicht van schema’s, indexen opvragen. Bij een SPARQL endpoint werkt dit anders, omdat de onderliggende data een ‘graph’ (ofwel graaf) is. Een overzicht van graphs (veelal datasets of gecombineerde bronnen), met het aantal relaties (lees: stellingen waarbij subject S in Relatie P tot object O  staat, of simpelgezegd de velden). Deze query geeft een ‘fysiek’ globaal overzicht van de database, namelijk in welke graafen er relaties kunnen staan. Bij de KB zijn er niet veel verschillende graphs, en de NBT-Schema is een hele grote graaf.

Om een beter beeld te vormen van de inhoud , kan je bijvoorbeeld alle relaties opvragen van zo’n graaf. Hiervoor nemen we de kleinste ‘void’ . De Void graaf is namelijk de metadata graph (een soort syteem database) en bevat informatie over de inhoud van alle graphs. In de Void graph staat het concept ‘dataset’ centraal. Deze geeft deze informatie tevens visueel weergegeven op de homepage van de database van de KB, maar dit is niet het geval voor alle SPARQL endpoints. Tevens is de ‘implementatie ‘ van de Void graph niet verplicht, het kan dus zijn dat er endpoints zijn die dit niet implementeren. Dan is je overgebleven optie om rond te neuzen of de documentatie erbij te pakken.

SELECT $s $p ?o WHERE {
 GRAPH <http://data.bibliotheken.nl/voids/> { ?s $p ?o }
} LIMIT 100

In deze SPARQL query (link) worden variabelen aangegeven met een vraagteken of een dollarteken. Ze mogen door elkaar heen gebruikt worden, het vraagteken is meest voorkomend.

Vervolgens kan je dan inzoomen op een dataset, zoals bijvoorbeeld het NBT. Met de query:

SELECT ?s WHERE {
 ?s <http://rdfs.org/ns/void#inDataset> <http://data.bibliotheken.nl/id/dataset/nbt> 
} LIMIT 10

krijg je een overzicht van de ‘records’ , of objecten in die dataset.

Wat ook op valt worden resultaten gedefinieerd door mogelijkheden. Hierbij worden variabelen (?s ) gebruikt om te de ‘antwoorden’  te bevatten die voldoen aan de gestelde criteria. Hierbij is het criterium dat de ?p ‘positie; en de ?o ‘positie’  al ingevuld zijn. Met deze data kan je zodoende navigeren naar het object, en online kijken wat het is, bijvoorbeeld deze:

In de grafische weergave wordt al onthuld hoe de informatie opgebouwd is. De pagina eindigend op /doc/nbt/p750060840  blijkt overeen te komen – maar ook te verschillen van – /id/nbt/p750060840. De reden hiervoor is modelmatig en wordt uitgelegd in de tutorial over Boeken. in dit geval, hoe halen we via SPARQL die aanvullende informatie – zoals de auteur – op ?

  1. We brengen relaties naar dit concept in kaart.
SELECT ?s ?p WHERE { 
 ?s ?p <http://data.bibliotheken.nl/doc/nbt/p750060840> 
} LIMIT 100

Dit levert het inzicht dat er een ‘owl same as’ (http://www.w3.org/2002/07/owl#sameAs) relatie is.

2. We inventariseren de relaties die via de owl-same as relatie te vinden is.

SELECT ?s ?p ?o WHERE {
  ?s <http://www.w3.org/2002/07/owl#sameAs> <http://data.bibliotheken.nl/doc/nbt/p750060840> .
  ?s ?p ?o
} LIMIT 100

Merk op dat we hier geen gebruik hebben gemaakt van ‘prefixes’. Dat is een manier om begrijpelijkere queries te schrijven door de identifier en het domein te scheiden. Dat had bijvoorbeeld als volgt gekund:

PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX docnbt: <http://data.bibliotheken.nl/doc/nbt/>
SELECT ?s ?p ?o WHERE {
 ?s owl:sameAs docnbt:p750060840 . 
 ?s ?p ?o 
} LIMIT 100

Bij de meeste SPARQL endpoints zijn er ‘standaard prefixes’. Dat betekent dat veel gebruikte relaties zoals ‘rdf’ , ‘rdfs’ , ‘schema’, ‘dc’ kunnen gebruikt worden zonder de prefix te benoemen. In dit voorbeeld laten we de resultaat waarde van de vorige query staan, zonder prefixes, zodat duidelijk is hoe een query is opgebouwd.

3. We maken een generiek overzicht van achterliggende relaties (dus zonder owl-same as, dus dit werkt ook voor andere documenten):

SELECT ?s ?pp ?o WHERE { 
 ?s ?p <http://data.bibliotheken.nl/doc/nbt/p750060840> .
 ?s ?pp ?o
} LIMIT 100

5. Relateren van eigenschappen op basis van een achterliggende relatie:

SELECT ?s ?oo WHERE { 
 ?s $p <http://data.bibliotheken.nl/doc/nbt/p750060840> .
 ?s <http://xmlns.com/foaf/0.1/primaryTopic> ?oo
} LIMIT 100

6. En halen de achterliggende velden van dit object op.

SELECT ?o ?pp ?oo WHERE {
 ?s ?p <http://data.bibliotheken.nl/doc/nbt/p750060840> .
 ?s <http://xmlns.com/foaf/0.1/primaryTopic> ?o .
 ?o ?pp ?oo 
} LIMIT 100

 

Relevante data ophalen uit SPARQL endpoints vergt enige oefening. In de resultaten van 6 kwam naar voren dat de objecten van het type Book waren. Ben je enkel geïnteresseerd in Boeken had je ook kunnen zoeken naar: ‘schema:book’ of zelfs kunnen vragen naar alle objecten die een schema ‘type’ zoals book, e-boek, artwork hebben. Als je eenmaal weet wat je nodig hebt, is het stuk makkelijk vinden.

 

 

Back to site top