SPARQL‐kurs ‐ del 6 - Utdanningsdirektoratet/Grep_SPARQL GitHub Wiki

Denne siden er en del av SPARQL-kurs

<-- del 5   del 7 -->

Del 6: Property paths - om å kaste flyndre med SPARQL


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".
Fra læreplan til fagkoder

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





Oppgave 1: Fra et gitt kompetansemål til utdanningsprogram med property path

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.


Oppsummering, del 6

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




<-- del 5   del 7 -->



Fasit, oppgave 1: Fra et gitt kompetansemål til utdanningsprogram med property path

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:
image

⚠️ **GitHub.com Fallback** ⚠️