SPARQL‐kurs ‐ del 10 - Utdanningsdirektoratet/Grep_SPARQL GitHub Wiki
Denne siden er en del av SPARQL-kurs
Negasjon er en viktig del av spørringer. Det lar oss ekskludere bestemte data fra resultatene våre. I SPARQL kan vi håndtere negasjoner ved hjelp av FILTER NOT EXISTS
og MINUS
. I denne delen har jeg valgt å forklare disse tingene ved hjelp av mengdelære. Jeg tror det hjelper oss til å få et mentalt bilde av hva disse operatorene er og forskjellen mellom dem.
MINUS
-operatoren fungerer ved å fjerne elementer fra en mengde som også finnes i en annen mengde. Dette betyr at du har to mengder med data, og du ønsker å ekskludere alle elementene i den andre mengden fra den første mengden.
- Mengde A: Alle personer (
?person
) som er av typenex:Person
. - Mengde B: Alle personer (
?person
) som har en jobb (ex:harJobb
).
Hvis vi bruker MINUS
, får vi alle elementene i Mengde A som ikke finnes i Mengde B:
PREFIX ex: <http://eksempel.no/>
SELECT ?person
WHERE {
?person a ex:Person .
}
MINUS {
?person ex:harJobb ?jobb .
}
I mengdelære: Resultat = 𝐴 − 𝐵
EXISTS
og NOT EXISTS
(that's the question 😉) er mulig å bruke i SPARQL hvis det er brukt i FILTER
. FILTER NOT EXISTS
fungerer ved å ekskludere elementer fra resultatet hvis et bestemt mønster eksisterer. Her handler det om å sjekke om et mønster ikke finnes for hvert element i den første mengden.
Eksempel:
- Mengde A: Alle personer (
?person
) som er av typenex:Person
. - Mønster: Personer (
?person
) som har en jobb (ex:harJobb
).
Ved å bruke FILTER NOT EXISTS
, sjekker vi for hver ?person
i Mengde A om de ikke har en jobb:
PREFIX ex: <http://eksempel.no/>
SELECT ?person
WHERE {
?person a ex:Person .
FILTER NOT EXISTS {
?person ex:harJobb ?jobb .
}
}
I mengdelære: Resultat = { x ∈ A | ¬(∃y ∈ B | x relaterer til y) }
Hva ekskluderes?
-
MINUS
: Fjerner elementer fra resultatsettet basert på om de finnes i en annen mengde. Her ekskluderer vi hele elementer som også er i Mengde B. -
FILTER NOT EXISTS
: Fjerner elementer fra resultatsettet basert på om de oppfyller et bestemt mønster. Her ekskluderer vi elementer fra Mengde A som har relasjoner til elementer i Mengde B.
PREFIX u: <http://psi.udir.no/ontologi/kl06/>
PREFIX st: <https://beta-data.udir.no/kl06/v201906/status/status_>
SELECT ?up
WHERE {
?up a u:utdanningsprogram .
MINUS {
?up u:status st:utgaatt .
}
}
- Hva det gjør: Denne spørringen returnerer alle utdanningsprogram, men ekskluderer de som har status st:utgaatt. I mengdelære: Resultat=A−B
PREFIX u: <http://psi.udir.no/ontologi/kl06/>
PREFIX d: <http://psi.udir.no/kl06/>
PREFIX st: <https://beta-data.udir.no/kl06/v201906/status/status_>
SELECT ?up
WHERE {
?up a u:utdanningsprogram .
FILTER NOT EXISTS {
?up u:status st:utgaatt .
}
}
Utropstegn (!
) kan også brukes som en negasjonsmetode i SPARQL, men det brukes hovedsakelig i FILTER-uttrykk for å nekte spesifikke betingelser. Det er en mer direkte måte å uttrykke negasjon på sammenlignet med FILTER NOT EXISTS
.
- Vi ønsker å hente alle personer (
?person
) som ikke har en spesifikk egenskap (ex:harJobb
).
Ved å bruke utropstegn i etFILTER
, kan vi ekskludere de personene som har en jobb:
PREFIX ex: <http://eksempel.no/>
SELECT ?person
WHERE {
?person a ex:Person .
OPTIONAL { ?person ex:harJobb ?jobb . }
FILTER (!bound(?jobb))
}
I dette eksempelet bruker vi OPTIONAL
for å hente informasjon om jobben dersom den finnes, og FILTER
(!bound(?jobb)) for å filtrere bort alle personer som har en jobb. Dette er en effektiv metode for å utelate elementer basert på om en egenskap er tilstede eller ikke.
PREFIX u: <http://psi.udir.no/ontologi/kl06/>
PREFIX st: <https://beta-data.udir.no/kl06/v201906/status/status_>
select distinct ?kode ?tittel where {
?lp a u:laereplan_lk20 ;
u:kode ?kode ;
u:tittel ?tittel .
FILTER (
(LANG(?tittel)="default") &&
(!REGEX(STR(?tittel), "fag(et)?$"))
)
}
Vi ser på filteret:
-
LANG
: Vi tar kun hensyn til språket, kalt "default", og -
(!REGEX(STR(?tittel), "fag(et)?$"))
: Hele det regulære uttrykket (regex) starter med utropstegn; det blir som å starte setningen med "ikke". Hva er det som ikke skal være med i tittelen på språket "default"? Jo, strengen "fag" eller "faget".(et)?
betyr, at "et" er valgfritt.?
betyr at "et" kan forekomme null eller én gang. Men altså, vi setter utropstegnet for at det vi har filtrert med ikke skal med i resultatet. Ved å fjerne utropstegnet, får du de læreplanene som slutter med "fag" eller "faget.
I denne delen har vi utforsket negasjon i SPARQL, som er essensielt for å ekskludere bestemte data fra resultatsettet vårt. Vi har sett på to hovedmetoder for å håndtere negasjoner: MINUS og FILTER NOT EXISTS. Gjennom eksempler og mengdelære har vi illustrert hvordan MINUS fjerner elementer som også finnes i en annen mengde, mens FILTER NOT EXISTS ekskluderer elementer basert på et spesifikt mønster. Så var vi så vidt innom det å bruke utropstegn som negasjon i filtre.
I den neste delen skal vi se på hvordan vi kan eksportere resultatet vårt til ei CSV-fil som vi importerer til Excel.
Skriv en SPARQL-spørring som henter alle kompetansemål som ikke er knyttet til noen kjerneelementer. Bruk FILTER NOT EXISTS.
Se "fasit" nederst på siden
Skriv en SPARQL-spørring som henter alle kompetansemål som ikke kobling til noen grunnleggende ferdighet. Bruk MINUS.
Se "fasit" nederst på siden
Her er et forslag til løsning:
PREFIX u: <http://psi.udir.no/ontologi/kl06/>
select * where {
?km a u:kompetansemaal_lk20 ;
FILTER NOT EXISTS {
?km u:tilknyttede-kjerneelementer ?ke .
}
}
Her er et forslag til løsning:
PREFIX u: <http://psi.udir.no/ontologi/kl06/>
select * where {
?km a u:kompetansemaal_lk20 ;
MINUS {
?km u:tilknyttede-grunnleggende-ferdigheter ?grf .
}
}