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

Denne siden er en del av SPARQL-kurs

<-- del 8   del 10 -->



Del 9: UNION og delspørringer

Hva er UNION og delspørringer, og hva er forskjellen?

UNION


Operatoren UNION kombinerer resultatene av to eller flere alternative mønstre i en spørring. Det returnerer alle resultater som matcher noen av de spesifiserte mønstrene. UNION opererer på lik linje og inkluderer alle resultater fra hvert mønster, inkludert overlappende og unike resultater.

Dette krever et eksempel for å gjøre det klarere:

PREFIX ex: <http://eksempel.no/>

SELECT ?ting
WHERE {
  {
    ?ting ex:egenskap1 "verdi1" .
  }
  UNION
  {
    ?ting ex:egenskap2 "verdi2" .
  }
}

I denne spørringen:

  • Den første delen matcher alle ?ting som har ex:egenskap1 lik "verdi1".
  • Den andre delen matcher alle ?ting som har ex:egenskap2 lik "verdi2".
  • UNION kombinerer resultatene fra begge mønstrene til ett samlet resultatsett.

Delspørring (subquery)


En delspørring i SPARQL er en spørring innenfor en større spørring. Den brukes til å beregne midlertidige resultater som deretter kan brukes i hovedspørringen. Delspørringer kan brukes til å filtrere eller gruppere data før de endelige resultatene blir returnert.

Her er et eksempel:

PREFIX ex: <http://eksempel.no/>

SELECT ?ting ?avgPris   # gjennomsnittspris
WHERE {
  {
    SELECT ?item (AVG(?pris) AS ?avgPris)
    WHERE {
      ?item ex:egenskap1 "verdi1" ;
            ex:pris ?pris .
    }
    GROUP BY ?ting
  }
  ?item ex:kategori "kategori1" .
}

Delspørringen beregner gjennomsnittsprisen (?avgPris) for hver ?ting som har ex:egenskap1 lik "verdi1". Hovedspørringen filtrerer resultatene ytterligere for å inkludere bare de ?ting` som også tilhører "kategori1".

De viktigste forskjellene mellom UNION og delspørringer

Kombinering av data

  • UNION kombinerer data fra to eller flere alternative mønstre og returnerer et samlet resultatsett.
  • En delspørring lager midlertidige resultater som brukes til videre filtrering eller beregning i hovedspørringen.

Bruksområder

  • UNION brukes når du vil hente data som matcher forskjellige mønstre.
  • Delspørringer brukes når du trenger å utføre mellomliggende beregninger eller filtrering før du bestemmer de endelige resultatene.

Resultatsett

  • UNION returnerer alle unike resultater fra alle alternative mønstre.
  • Delspørringer lager et midlertidig resultatsett som hovedspørringen kan operere på.

Oppsummert

  • UNION brukes til å kombinere resultater fra flere mønstre og inkluderer alle resultater fra disse mønstrene.
  • Delspørringer brukes til å lage midlertidige resultater for videre bruk i en større spørring, ofte for filtrering eller beregning.

Begge teknikkene er nyttige i SPARQL for å hente og manipulere data på forskjellige måter, avhengig av hva du ønsker å oppnå med spørringen din.

Vi bruker UNION i Grep

Vi slår til med en spørring med mange UNION-deler, og om ønskelig, er det bare å bygge på. Denne spørringen handler om å søke etter et ord eller streng i multiple tekststrenger, knyttet til læreplanene (LK20). Hver UNION-del handler om å binde en spesifikk tekststreng til en felles variabel ?soeketekst. Det kan vøre tittelen til kompetansemål, beskrivelsen til et kjerneelement osv. Les spørringen nøye og se hva den gjør i UNION. Hva er forskjellig, og hva er likt (og hvorfor). Søketeksten ser du i filteret nederst i spørringen "respekt" (som du kan bytte ut med noe annet):

PREFIX u:<http://psi.udir.no/ontologi/kl06/>
PREFIX d:<http://psi.udir.no/kl06/>
SELECT DISTINCT ?soeketekst ?type ?lpTittel WHERE {
    {
        ?kompetansemaal a u:kompetansemaal_lk20 ;
                        u:tittel ?soeketekst ;
                        u:kode ?kode ;
                        u:grep-type ?type ;
                        u:tilhoerer-laereplan ?lp ;
                        u:tilhoerer-kompetansemaalsett ?kms .
        ?lp u:tittel ?lpTittel .
        FILTER (lang(?lpTittel) = "default")
        FILTER (lang(?soeketekst) = "default")
    }
    UNION
    {
        ?laereplan a u:laereplan_lk20 ;
                   u:tittel ?soeketekst ;
                   u:tittel ?lpTittel ;
                   u:kode ?kode ;
                   u:status ?status ;
                   u:grep-type ?type .
        FILTER regex(str(?status), "publisert", "i")
        FILTER (lang(?lpTittel) = "default")
        FILTER (lang(?soeketekst) = "default")
    }
    UNION
    {
        ?laereplan a u:laereplan_lk20 ;
                   u:u:fagets-relevans ?soeketekst ;
                   u:kode ?kode ;
                   u:tittel ?lpTittel ;
                   u:grep-type ?type ;
                   u:status ?status .
        FILTER regex(str(?status), "publisert", "i")
        FILTER (lang(?lpTittel) = "default")
        FILTER (lang(?soeketekst) = "default")
    }
    
    UNION
    {
        ?laereplan a u:laereplan_lk20 ;
                   u:kjerneelementer ?ke ;
                   u:kode ?kode ;
                   u:tittel ?lpTittel ;
                   u:status ?status .
        ?ke u:beskrivelse ?soeketekst ;
            u:grep-type ?type .
        FILTER regex(str(?status), "publisert", "i")
        FILTER (lang(?lpTittel) = "default")
        FILTER (lang(?soeketekst) = "default")
    }
    FILTER regex(str(?soeketekst), "respekt", "i")
} ORDER BY ?type ?data

Her er det også mulig å se hvorfor jeg beskriver delspørring og UNION i samme del. Denne spørringen med flere UNION-ledd, ligner på delspørringer fordi også UNION-spørringer kan ha en hovedspørring (altså en del utenfor delspørringene { } UNION { } UNION { } utenfor): Det eneste hovedspørringen i denne spørringen gjør, er å lage et filter for søketeksten. Dette filteret blir da gjeldende for alle UNION-leddene.


Vi bruker delspørringer i Grep

Jeg (Are) har ikke hatt så mye bruk for delspørringer foreløpig, men eksempelet nedenfor kan likevel illustrere fenomenet:

PREFIX u: <http://psi.udir.no/ontologi/kl06/>
PREFIX d: <http://psi.udir.no/kl06/>

SELECT ?laereplan ?fagkode
WHERE {
  {
    SELECT ?fagkode
    WHERE {
      ?fagkode a u:fagkode ;
           u:kode "MAT0008" .
    }
  }
  ?laereplan a u:laereplan_lk20 ;
             u:kompetansemaalsett/u:etter-fag/u:fagkode-referanser ?fagkode .
}

I denne spørringen:

  • Delspørring: Den indre spørringen (SELECT ?fagkode WHERE { ?fagkode a u:fagkode ; u:kode "MAT0008" . }) finner fagkoder som har en bestemt kode, i dette tilfellet "MAT0008".
  • Hovedspørring: Den ytre spørringen bruker resultatene fra delspørringen for å finne læreplaner (av type u:laereplan_lk20) som refererer til disse fagkodene via kompetansemålsett (her har vi brukt property path som vi så på i del 6.

Dette kan være et eksempel på hvordan du kan bruke delspørringer til å strukturere en kompleks spørring (og i en reell setting, ville kanskje den indre spørringen vært mer kompleks). Eksempelet kan likevel gi deg en idé om hvordan du kan bryte ned en problemstilling i mindre deler og bygge den opp igjen for å få det ønskede resultatet.

Oppsummering del 9

I denne delen av kurset lærer vi om UNION og delspørringer i SPARQL. UNION brukes til å kombinere resultatene fra flere mønstre i en spørring, slik at du får et samlet resultatsett som inkluderer alle unike treff fra hvert mønster. Delspørringer derimot, brukes til å lage midlertidige resultater som videre kan brukes i hovedspørringen for filtrering eller beregninger. Vi har sett eksempler på begge teknikkene i bruk, noe som viser hvordan du kan strukturere komplekse spørringer mer effektivt ved hjelp av disse verktøyene.

Denne delen har ikke oppgaver. Det viktigste med denne delen er å forstå hva UNION og delspørringer er, og hvordan de fungerer slik at du lettere kan lese spørringer der dette forekommer, f.eks. i Samling av SPARQL-spørringer. Men du er selvsagt velkommen til å prøve deg fram.




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