SPARQL‐kurs ‐ del 6 - Utdanningsdirektoratet/Grep_SPARQL GitHub Wiki
Denne siden er en del av SPARQL-kurs
Av Killy Ridols – Patagonia, CC BY-SA 2.0
Det å kaste flyndre på vannet er gøy. Det å kaste flyndre med SPARQL er praktisk. Vi tar utgangspunkt i denne spørringen:
PREFIX u: <http://psi.udir.no/ontologi/kl06/>
PREFIX d: <http://psi.udir.no/kl06/>
select * where {
d:NOR01-06 u:tittel ?tittel ;
u:grep-type ?type ;
u:erstatter ?erstatter .
?erstatter u:tittel ?erstTittel ;
u:gyldig-fra ?gyldigFra ;
u:grep-type ?erstType .
FILTER(lang(?tittel) = "default" && (lang(?erstTittel) = "default"))
} ORDER BY ?gyldigFra
Denne erstatter-relasjonen mellom læreplaner kan vi følge helt fra NOR1-01 og helt fram til dagens revisjon, NOR01-06.
NOR01-06 erstatter NOR1-05 som erstatter NOR1-04 som erstatter NOR1-03 som erstatter NOR1-02 som til slutt erstatter NOR1-01. For å få fram dette i SPARQL, trenger vi bare å tilføye ett eneste tegn, nemlig *
etter predikatet u:erstatter
, slik: u:erstatter* ?erstatter .
PREFIX d: <http://psi.udir.no/kl06/>
select * where {
d:NOR01-06 u:tittel ?tittel ;
u:grep-type ?type ;
u:erstatter* ?erstatter .
?erstatter u:tittel ?erstTittel ;
u:gyldig-fra ?gyldigFra ;
u:grep-type ?erstType .
FILTER(lang(?tittel) = "default" && (lang(?erstTittel) = "default"))
} ORDER BY ?gyldigFra
Her har vi tatt med gyldig fra-dato slik at vi kan sortere (ORDER BY
) kronologisk etter ?gyldigFra. Vi får da hele rekken med erstatter-relasjoner med utgangspunkt i NOR01-06. Vi har kastet flyndre fra NOR01-06...
Hvis du ikke vil ha med elementet du har tatt utgangspunkt i, erstatter du *
med +
i spørringen.
Du kan gjøre samme øvelsen med u:erstattes-av
. Dette er den samme relasjonen, bare andre veien.
Spørringen under bruker et prinsipp i SPARQL, kalt "Property Path". Vi kan skrive
PREFIX u: <http://psi.udir.no/ontologi/kl06/>
PREFIX d: <http://psi.udir.no/kl06/>
select * where {
d:NOR01-06 u:erstatter/u:erstatter/u:erstatter ?erstatter
}
for å "sprette" tre ganger, men utfordringen er at vi ofte ikke vet hvor mange "sprett" vi trenger for å komme til endes i denne erstatter-rekken. Derfor er altså u:erstatter*
en smart løsning.
Eksempelet nedenfor er også et matnyttig eksempel på bruk av property path. Her spør vi etter fagkoder for en gitt læreplan:
PREFIX u: <http://psi.udir.no/ontologi/kl06/>
PREFIX d: <http://psi.udir.no/kl06/>
select * where {
d:NOR01-06 u:kompetansemaalsett/u:etter-fag/u:fagkode-referanser ?fagkoder .
} ORDER BY ?fagkoder
Legg merke til det som er markert med rødt i grafen nedenfor. Det illustrerer at egenskapene (propertiene) på rekke og rad i predikat delen (midten) av spørringen d:NOR01-06 u:kompetansemaalsett/u:etter-fag/u:fagkode-referanser ?fagkoder
i spørringen utgjør en sti av proprties. Derav navnet "Proprty Paths".
Hvis man skulle spørre om de samme uten å bruke Property Path, ville spørringen se slik ut:
PREFIX u: <http://psi.udir.no/ontologi/kl06/>
PREFIX d: <http://psi.udir.no/kl06/>
select * where {
d:NOR01-06 u:kompetansemaalsett ?kms .
?kms u:etter-fag ?opplaeringsfag .
?opplaeringsfag u:fagkode-referanser ?fagkoder .
} ORDER BY ?fagkoder
Dette er en litt søkt problemstilling. I hvilket scenario vil vi vite i hvilket utdanningsprogram dette kompetansemålet lyder? Men prøv å ta utfordringen. Ta utgangspunkt i kompetansemålet d:KM5652, og end opp med tittelen til utdanningsprogrammet, og bind det til variabelen ?up
(etter utdanningsprogram). Filtrer så vi kun ser default-språket i resultatet.'
Se "fasit" nederst på siden.
Bruk gjerne illustrasjonen øverst på siden "Grafer om Grep" i den andre wikien vår som støtte for å finne stien av egenskaper du skal gå (hva er korteste vei?). Illustrasjonen er forresten en bra støtte for å se for seg hvordan de viktigste typene i Grep henger sammen. Jeg (Are) bruker den omtrent daglig, og har hengt den opp på hjemmekontoret mitt.
Vi har vært igjennom et triks vi kan bruke for å effektivisere enkelte spørringssituasjoner der vi vil ha et subjekt på den ene siden, og via flere ledd med predikater, ende opp med et objekt i den andre enden av datamodellen. Property paths er et nyttig hjelpemiddel i så måte, og fortjener derfor en egen del i dette kurset.
I den neste delen skal vi bevege oss inn i de mørkeste avkroker av Grep. Vi skal inn i det skjulte. Det skal handle om å finne fram i det som i RDF kalles blanke noder (bNodes).
I denne oppgaven, tvang jeg deg til hele 5 fiskesprett når du skulle kaste flyndre med proprty path (en sti med egenskaper). Her er et forslag til løsning på oppgaven:
PREFIX u: <http://psi.udir.no/ontologi/kl06/>
PREFIX d: <http://psi.udir.no/kl06/>
select distinct * where {
d:KM5652 u:tilhoerer-kompetansemaalsett/u:etter-fag/u:programomraader-referanse/u:utdanningsprogram-referanse/u:tittel ?up .
FILTER (LANG(?up)="default")
}
Og resultatet er ganske enkelt: