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

 

Void graph’s voor navigatie

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 variabelemetadatan 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 is dat resultaten worden 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. metadataMet 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 uri met  /doc/nbt verwijst naar de resource, terwijl /id/nbt  verwijst naar de representatie (het digitale object met de velden) van de resource. Deze nuance zorgt er voor dat de Koninklijke Bibliotheek een onderscheid kan maken tussende identifier van ‘het fysieke boek’  en de omschrijving in de ‘KB’-Linked Data Store.

 

Eigenschappen van objecten ophalen

Deze twee uri’s zijn verbonden met elkaar via een relatie, en kunnen dus ook automatisch achterhaald worden. Dit werken we verder uit in de boeken datablog. Voor deze demo vervangen we in de URI het pad  /doc/nbt door /id/nbt om aanvullende informatie op te halen.  Dit doen we door met de uri (van de representatie van het object) als subject ?s te gebruiken en te kijken welke ?p en ?o’s er beschikbaar zijn:

SELECT ?p ?o
WHERE {
 <http://data.bibliotheken.nl/id/nbt/p750001674> ?p ?o
} LIMIT 10

Met als resultaat (link):

Ben je enkel geïnteresseerd in Boeken had je ook kunnen zoeken naar: ‘schema:book’ of naar PrintBooks kunnen zoeken. Als je eenmaal weet wat je nodig hebt, is het stuk makkelijk vinden. Wil je weten hoe je meer met boeken kan, lees dan de datablog hierover.

 

 

Back to site top