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

Denne siden er en del av SPARQL-kurs

<-- del 9   del 11 -->



Del 10: Negasjoner i SPARQL

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.

Mengdelære og negasjoner

Mengdelære bak MINUS

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.

image

Eksempel:

  • Mengde A: Alle personer (?person) som er av typen ex: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 = 𝐴 − 𝐵



Mengdelære bak FILTER NOT EXISTS

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.

image

Eksempel:

  • Mengde A: Alle personer (?person) som er av typen ex: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) }

Viktige forskjeller

image image

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.

Eksempler med Grep

MINUS:

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

FILTER NOT EXISTS:

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

Negasjon ved hjelp av utropstegn

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.

Eksempel:

  • Vi ønsker å hente alle personer (?person) som ikke har en spesifikk egenskap (ex:harJobb).
    Ved å bruke utropstegn i et FILTER, 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.

Eksempel fra Grep

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.




Oppsummering, del 10

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.

Oppgave 1

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

Oppgave 2

Skriv en SPARQL-spørring som henter alle kompetansemål som ikke kobling til noen grunnleggende ferdighet. Bruk MINUS.

Se "fasit" nederst på siden

Fasit

Fasit oppgave 1

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

Fasit oppgave 2

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




<-- del 9   del 11 -->
⚠️ **GitHub.com Fallback** ⚠️