Spørremagi med SPARQL

Spørremagi med SPARQL

SPARQL Protocol And RDF Query Language (SPARQL) et et spørrespråk (eng: query language) som man benytter til å gjøre spørringer i RDF-strukturert data. Språket bruker nøkkelord som ligner på bedre kjente SQL, men har likevel vesentlige forskjeller. I dette innlegget får du en grunnleggende innføring i SPARQL og noen eksempler på konstruering av spørringer.

Typer spørringer

I SPARQL eksisterer det fire typer spørringer.

SELECT

Returnerer alle, eller et subset, av variable spørringen matcher.

CONSTRUCT

Returnerer en RDF-graf som er konstruert ved å gi en rekke variable på et triple format.

ASK

Returnerer en boolean som indikerer om spørringen matcher eller ikke.

DESCRIBE

Returnerer en RDF-graf som beskriver ressursene den fant.

I dette blogginnlegget skal vi fokusere mest på enkle spørringer med SELECT, som minner om SQLs nøkkelord med samme navn. Det er likevel en vesentlig forskjell; vi spør mot RDF strukturert data, ikke databaser (dette er en sannhet med modifikasjoner).

SELECT ?s ?p ?o WHERE {
  ?s ?p ?o .
} LIMIT 100

Denne spørringen vil gi en liste av de 100 første triplene i datasettet som resultat.

La oss benytte følgende datasett som beskriver planeter for de neste eksemplene [3].

nasa:jupiter a                     nasa:Planet ;
             nasa:moon             nasa:io, nasa:ganumede, nasa:callisto ;
             nasa:distanceFromSun  "778"^^xsd:double .

nasa:saturn  a                     nasa:Planet ;
             nasa:distanceFromSun  "1426"^^xsd:double .

nasa:neptune a                     nasa:Planet ;
             nasa:moon             nasa:triton, nasa:proteus, nasa:naiad ;
             nasa:distanceFromSun  "4503"^^xsd:double .

Hvis vi ønsker å liste opp alle planetene, kan vi konstruere en spørring på denne måten.

SELECT ?planet WHERE {
  ?planet a nasa:Planet .
}

Dette vil returnere ressursen (URIen) til samtlige planeter som fins i datasettet. Legg merke til at vi navngir variablene som ?variabel.

Nøkkelord

Her er en oversikt over de mest brukte nøkkelordene i SPARQL. For beskrivelse av samtlige nøkkelord i SPARQL, se SPARQL-dokumentasjonen [1].

PREFIX

Lar deg bruke et prefiks i spørringen istedenfor hele URIen. I eksemplene over antar vi at prefikset nasa allerede eksisterer.

FROM

Definerer RDF-datasettet vi skal spørre mot.

WHERE

Spesifiserer grafmønsteret som skal matches.

ORDER BY

Brukes til å rearrangere resultatet av spørringene. Andre nøkkelord av denne karakteren er LIMIT og OFFSET.

DISTINCT

Lister ekvivalente oppføringer én gang.

OPTIONAL

Alternative deler av spørringen.

UNION

Kombinerer grafer.

REDUCE

Lar deg fjerne noen eller alle duplikerte svar.

FILTER

Filtrerer resultater med numeriske funksjoner, regulære uttrykk med mer.

Filter 

La oss introdusere nøkkelordet FILTER. Med FILTER kan man filtrere resultatet av spørringen med numeriske funksjoner, regulære uttrykk (regex), stringoperasjoner med mer. Funksjoner og operasjoner er beskrevet i eget avsnitt.

La oss finne alle planeter som ligger mer enn 2000 millioner kilometer fra solen.

SELECT ?planet WHERE {
  ?planet a nasa:Planet ;
          nasa:distanceFromSun ?distance .

FILTER (?distance > 2000)
}

Funksjoner og operatorer

Binære operatorer

||, &&, =, !=, <, >, <=, >=, +, -, *, /

Unære operatorer

!, +, -

Unære tester

BOUND(?var), isURI(?var), isBLANK(?var), isLITERAL(?var)

Andre

STR(?var), LANG(?var), DATATYPE(?var)

Det fins flere tester enn de som er oppgitt i tabellen, det er blant annet sameTERM(?var) som er brukt på data typer. langMATCHES(lang(?var), "no") er brukt for å teste språket til en variabel. En annen, velbrukt test, er REGEX som brukes til å matche en variable med regulære uttrykk.

Aggregering

Løsninger på spørringer kan alternativt bli gruppert i henhold til en eller flere uttrykk. For å spesifisere grupperingen bruker vi nøkkelordet GROUP BY. For å filtrere løsningene på gruppering bruker vi HAVING. Her er et eksempel.

SELECT ?navn (COUNT(?kommune) AS ?kommuneteller) WHERE {
     ?fylke a gd:Fylke ;
           gn:officialName ?navn ;
           gn:childrenFeatures ?kommune .
     ?kommune a gd:Kommune .
     FILTER (langMATCHES(lang(?navn), "no"))
}
GROUP BY ?navn HAVING (?kommuneteller < 15)

Denne spørringen vil returnere fylker med mindre enn 15 kommuner.

Grupperinger og alternative svar

Grupperingsmønstre

Grupperingsmønstre kan bli brukt til å begrense skopet til spørrebetingelsene til spesifike deler av spørringen. Det er også mulig å definere del-mønstre som er alternative (eng: optional). Her følger et eksempel med grupperingsmønstre.

SELECT ?title ?author
WHERE {{   ?book ex:publishedBy <http://crc-press.com/uri> .
           ?book ex:title ?title . }
           {}
           ?book ex:author ?author .
     }

Alternative mønstre

Spørringen som oppgis i alternative mønstre er ikke pålagt å være med i resultatet av spørringen. Men hvis de matcher, vil de utvide resultatet av spørringen.

SELECT ?title ?author
WHERE {   ?book ex:publishedBy <http://crc-press.com/uri>
           ?book ex:title ?title .
           OPTIONAL { ?book ex:author ?author }
}

Enhver bruk av OPTIONAL må bli fulgt av et grupperingsmønster.

SPARQL 1.1

SPARQL 1.1 er den nyeste anbefalningen av SPARQL og ble anbefalt av W3C i mars 2013. Med SPARQL 1.1 blir det introdusert en rekke nye nøkkelord som opererer på hele datasett. Noen av disse er kjent fra SQL.

LOAD (SILENT)? IRIref_from (INTO GRAPH IRIref_to)?

Laster grafen fra IRIref_from til den spesifiserte grafen, eller standard graf om ingen annen graf er oppgitt.

CLEAR (SILENT)? (GRAPH IRIref | DEFAULT | NAMED | ALL)

Fjerner triplene fra den spesifiserte grafen, standard graf, alle navngitte grafer eller samtlige grafer.

CREATE (SILENT)? GRAPH IRIref

Lager en ny graf.

DROP (SILENT)? (GRAPH IRIref | DEFAULT | NAMED | ALL)

Samme som CLEAR, men fjerner den spesifiserte grafen, standard graf, alle navngitte grafer eller samtlige grafer.

For flere oppdateringsmuligheter for grafer, se SPARQL Update dokumentasjonen [2].

Oppsummering

I dette blogginnlegget har jeg nevnt de mest brukte nøkkelordene til SPARQL og gitt en rekke eksempler på bruk av disse nøkkelordene.

Du kan prøve å skrive SPARQL-spørringer selv ved å benytte en av mange endepunkter for SPARQL som fins åpent på nett. En oversikt over kjente endepunkter kan du finne på W3Cs wiki.

I neste innlegg skal vi se på RDFS (RDF Schema) og regler for dataintegritet.

Referanser

[1] W3C. 2008. SPARQL Query Language for RDF.

[2] W3C. 2013. SPARQL 1.1 Update.

[3] Giese, Martin. INF3580—Semantiske teknologier.

Jeg har tidligere skrevet et blogginnlegg der vi så på bakgrunnen til semantiske teknologier og grunnteknologien RDF. Vi brukte syntaksen Turtle, som er lett lesbar, og så at RDF er strukturert som en graf. Les blogginnlegget her. 

 

Om bloggeren:
Veronika har studert programmering og nettverk ved Universitetet i Oslo og har en forkjærlighet for logikk, semantiske teknologier, typografi og elektronikk.

comments powered by Disqus