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

Denne siden er en del av SPARQL-kurs

<-- del 6   del 8 -->

Del 6: Blanke noder

Denne delen handler om to forskjellige ting; blanke noder og valgfrie mønstre (OPTIONAL). Disse to tingene har ikke noe med hverandre å gjøre, men vi kom tilfeldigvis til å trenge OPTIONAL i en av spørringene underveis.

Grunnen til at vi kaller dataene i en triple store for en graf, er at når vi gjør spørringer, så beveger vi oss fra node til node via noen kanter (engelsk "node" og "edge"). Dette er begreper vi kanskje kjenner igjen fra grafteori i matematikk. Faktisk er det slik at SPARQL i stor grad er bygd på grafteori, så om dette er et tema du er god på, er det en god ballast når vi i SPARQL går fra node til node i grafen til Grep.

For de som virkelig trenger et kaninhull å dykke ned i, vil jeg anbefale Professur fur Wissensbasierte Systeme, Markus Krötzsch fra Technische Universität Dresden som blant annet har delt denne spillelisten: Knowledgde Graphs (lecture) (33 videoer, februar 2021). Her er det mye SPARQL-algebra. Nok om grafteori generelt – nå handler det om blanke noder:

Rundingene i illustrasjonen over representerer noen noder i en del av den store grafen som utgjør Grep. Strekene imellom dem representerer kantene (pilene er bare noe ekstrainformasjon vi har lagt på for å vise hvilken retning relasjonen mellom de ulike nodene har (ikke dvel ved det foreløpig). La oss ta grafen u:fagkode u:opplaeringsfag u:opplaeringsfag (tilfeldigvis har predikatet og objektet samme navn her). Her er nodene og kantene i grafen godt synlig. Men i realiteten er det slik at relasjonen mellom en gitt fagkode og et opplæringsfag har det vi kaller "gyldighet for koblingen". Koblingen er gyldig fra/til en gitt dato. Det er ikke mulig å uttrykke med bare en triple. Derfor må vi ty til noe som i RDF kalle blanke noder.

Her er et eksempel på en blank node i Grep:
image
Vi ser at det er en blank node fordi den begynner med _:. Les den som en "tom prefiks".

La oss rygge tilbake noen steg:

Hva er blanke noder?

Blanke noder, også kjent som "anonyme noder", er noder i RDF som ikke har en URI eller et litteral som identifikator. De er unike innenfor en bestemt graf, men kan ikke refereres direkte utenfor den konteksten. Til nå har vi kunnet bevege oss fritt mellom noder i Grafen Grep.

Ta denne grafen (utenfor Grep):

    ?person ex:harADresse [ ex:gate "Hovedgata" ] .

Det SPARQL ser, siden den kun håndterer tripler, er i første omgang:

    ?person ex:harAdresse [ ] .

Men i praksis, siden dataene finnes der bak klammene, slik:

    ?person ex:harAdresse _:address .
    _:bNode123 ex:gate "Hovedgata" .

Men likevel ikke slik, fordi vi ikke kan bruke den blanke node-IDen som en referanse i en spørring (se subjektet i 2. linje).

Legg spesielt merke til prefiksen _:. Det er måten RDF lager et midlertidig holdepunkt, som ikke er en URI, men som likevel kan holde på informasjonen bak den blanke noden under kjøringen av spørringen.

Vi kan se disse referansene i et spørre-resultat. Kjør denne spørringen:

PREFIX u: <http://psi.udir.no/ontologi/kl06/>
PREFIX d: <http://psi.udir.no/kl06/>
select * where { 
	d:AKT2002 u:gyldighet-opplaeringsfag-AKT2Z02 ?o
}

Da får vi noe sånt som resultat:
image

Så det betyr at vi faktisk kan lure fram informasjonen bak ?o siden vi ikke bruker _:genid-adressen direkte, men bruker variabelen ?o:

PREFIX u: <http://psi.udir.no/ontologi/kl06/>
PREFIX d: <http://psi.udir.no/kl06/>
select * where { 
	d:AKT2002 u:gyldighet-opplaeringsfag-AKT2Z02 ?o .
    ?o ?what ?next
} 

Som faktisk gir:
image

Med andre ord – fagkoden AKT2002 sin kobling til opplæringsfaget AKT2Z02 er gyldig fra 01.08.2007 og til 31.07.2015.

Merk deg hele strengen som begynner med "_:". Hvis du gjør samme spørring senere i dag, eller i morgen, vil denne strengen ikke være lik. Det er en midlertidig "referanse" som oppstår når du vil ha fram det som er bak den blanke noden.

Jeg har skrevet en egen artikkel i wikien som handler om blanke noder i Grep: Blanke noder for gyldighetsinformasjon i referanseobjekter. Les denne og kom tilbake. Se på det som en del av kurset.

Et annet triks, er å putte inni et klammeparentes det vi vet er egenskaper som vi forventer bak de blanke nodene, slik:

PREFIX u: <http://psi.udir.no/ontologi/kl06/>
PREFIX d: <http://psi.udir.no/kl06/>
select * where { 
    d:AKT2002 ?p [u:gyldig-fra ?gyldigFra]
    FILTER REGEX(str(?p), "gyldighet-", "i")
} 

Valgfrie mønstre (OPTIONAL)

Hvis vi ikke vet om det enten finnes en gyldig-fra eller gyldig til, både og, eller ingen av delene, kan vi sikre oss med noe vi ikke har vært innom ennå, nemlig det som kalles "valgfri mønster", eller en "valgfri klause" (engelsk: optional pattern). Den ser slik ut:

    OPTIONAL{
        ... # her kommer mønsteret som skal være valgfritt i spørringen
    }

eller enklere: OPTIONAL{ }. I vårt tilfelle, vet vi kanskje ikke at d:AKT2002 har noe gyldig fra/til på koblinger som har med gyldighet å gjøre. Derfor skriver vi slik:

PREFIX u: <http://psi.udir.no/ontologi/kl06/>
PREFIX d: <http://psi.udir.no/kl06/>
select * where { 
    OPTIONAL{ d:AKT2002 ?p [u:gyldig-fra ?gyldigFra] }
    OPTIONAL{ d:AKT2002 ?p [u:gyldig-til ?gyldigtil] }
    FILTER REGEX(str(?p), "gyldighet-", "i")
} 

Regex-filteret er med for å sikre at ?p handler om de gyldighet-koblingene vi er på jakt etter

Prøv den samme spørringen som over, men bytt ut d:AKT2002 med d:MAT0016 i begge de valgfrie mønstrene. Da ser vi at OPTIONAL virker. Hadde vi skrevet slik:

PREFIX u: <http://psi.udir.no/ontologi/kl06/>
PREFIX d: <http://psi.udir.no/kl06/>
select * where { 
    d:MAT0016 ?p [u:gyldig-fra ?gyldigFra] .
    d:MAT0016 ?p [u:gyldig-til ?gyldigTil] .
    FILTER REGEX(str(?p), "gyldighet-", "i")
} 

...eller slik (som er det samme som over):

PREFIX u: <http://psi.udir.no/ontologi/kl06/>
PREFIX d: <http://psi.udir.no/kl06/>
select * where { 
    d:MAT0016 ?p [
        u:gyldig-fra ?gyldigFra ;
        u:gyldig-til ?gyldigTil 
        ]
    FILTER REGEX(str(?p), "gyldighet-", "i")
} 

...ville vi ikke fått treff, fordi begge mønstrene må tilfredsstilles for at vi skal få treff. Det slipper vi å ta hensyn til når vi bruker valgfrie mønstre. Vi bruker dem kun når vi må, for spørringene kan fort bli unødvendig tunge å kjøre om vi overdriver bruken.

Men prøv den med d:MAT1001. Da får du flere treff. Dette illustrerer viktigheten av å tenke på hva vi faktisk ber om i en spørring.


Oppsummering

I denne delen har vi sett på hva blanke noder er, og hvordan disse brukes i Grep. Vi har også brukt andre deler av wikien vår for å dykke ned i temaet.

Deretter, i jakten på noen blanke noder, fikk vi bruk for "valgfrie mønstre" i SPARQL, og vi gikk igjennom hvordan disse brukes.

Når du bruker data fra Grep via SPARQL, kan det være en grei huskeregel å sjekke om referansen fra et element til et annet har en predikat som heter noe med "gyldighet-..." og som berører den referansen du bruker. F.eks. har fagkoden "AKT2002" et predikat som heter u:opplaeringsfag, men så ser vi også at den har et predikat som heter u:gyldighet-opplaeringsfag-AKT2Z02 (altså det samme som selve koblingen, bare med - etterfulgt av koden til det koblede elementet. Da vet vi at koblingen d:AKT2002 u:opplaeringsfag d:AKT2Z02 er en kobling som som har gyldighetsinformasjon som vi kanskje må ta hensyn til.

Denne delen har ingen oppgaver, men prøv de ulike spørringene på denne siden (og de i artikkelen om blanke noder og gyldighetsinformasjon) selv, og studer dem.




<-- del 6   del 8 -->
⚠️ **GitHub.com Fallback** ⚠️