From 45ba5594da49059bc75704219e7ab37e190b2ecf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niklas=20Lindstr=C3=B6m?= Date: Fri, 20 Mar 2026 09:59:15 +0100 Subject: [PATCH 1/2] Update SPARQL examples to type-normalized shapes --- docs/howto/sparql_examples.sv.md | 118 ++++++++++++++----------------- 1 file changed, 52 insertions(+), 66 deletions(-) diff --git a/docs/howto/sparql_examples.sv.md b/docs/howto/sparql_examples.sv.md index 1c6edbc..82f00c7 100644 --- a/docs/howto/sparql_examples.sv.md +++ b/docs/howto/sparql_examples.sv.md @@ -30,8 +30,7 @@ Observera att enklare frågor också kan besvaras med hjälp av [sök-API:et](.. PREFIX : SELECT (COUNT(DISTINCT ?novel) as ?count) { - ?gf (:exactMatch|^:exactMatch|:sameAs|^:sameAs)* marc:Novel . - ?novel :instanceOf/:genreForm ?gf ; + ?novel :instanceOf/:category/(:broader|:broadMatch)* ; :publication [ :year "2019" ; :country ctry:sw ] . } ``` @@ -47,16 +46,17 @@ för att inte behöva skriva ut varje trippel i sin helhet. ### Vilka språk finns Selma Lagerlöf översatt till? ```sparql PREFIX : +PREFIX rel: SELECT DISTINCT ?language ?langName { [] :contribution [ a :PrimaryContribution ; :role rel:author ; :agent ] ; - :translationOf/a :Work ; + :translationOf [] ; :language ?language . ?language :prefLabel ?langName . - FILTER(lang(?langName) = 'sv') + FILTER(lang(?langName) = 'sv') } ``` **Kommentar:** @@ -85,34 +85,22 @@ Vi kan nämligen ta reda på verkets originalspråk via `:translationOf`, därem PREFIX : SELECT DISTINCT ?spanishInstance ?spanishTitle ?swedishTitle { - VALUES ?genreForm { - marc:FictionNotFurtherSpecified - marc:Drama - marc:Essay - marc:Novel - marc:HumorSatiresEtc - marc:Letter - marc:ShortStory - marc:MixedForms - marc:Poetry - } - - ?gf (:exactMatch|^:exactMatch|:sameAs|^:sameAs)* ?genreForm . ?spanishInstance :publication/:year "1990" ; :instanceOf ?work . - ?work :genreForm ?gf ; + ?work :category/:broader* ; :language lge:spa ; :translationOf [ a :Work ; :language lge:swe ] . + OPTIONAL { ?spanishInstance :hasTitle [ a :Title ; :mainTitle ?spanishTitle ] . } OPTIONAL { ?work :hasTitle [ a :Title ; :mainTitle ?swedishTitle ] . } -} +} ``` -**Kommentar:** +**Kommentar:** Tyvärr är det inte möjligt att få fram vilka svenska verk som översatts till spanska då det kräver att verket ligger länkat under `bf2:translationOf`. I dagsläget får vi nöja oss med spanska instanser som översatts _från_ svenska. Det vore även önskvärt att kunna ange _en_ term för _all_ skönlitteratur. Visserligen finns `saogf:Sk%C3%B6nlitteratur` men den har hittills för lite användning och dess relation till marc-termerna är inte heller definierad. @@ -122,22 +110,18 @@ Det vore även önskvärt att kunna ange _en_ term för _all_ skönlitteratur. V PREFIX : SELECT DISTINCT ?cartoonist (CONCAT(?givenName, " ", ?familyName) as ?name) { - VALUES ?genreForm { - marc:ComicStrip - marc:ComicOrGraphicNovel - } - ?gf (:exactMatch|^:exactMatch|:sameAs|^:sameAs)* ?genreForm . - [] :instanceOf [ :genreForm ?gf ; + ?gf :broader* . + [] :instanceOf [ :category ?gf ; :language lge:swe ; - :translationOf/a :Work ; + :translationOf/a/rdfs:subClassOf* :Work ; :contribution [ a :PrimaryContribution ; :agent ?cartoonist ] ] ; - :publication/:year ?year . + :publication/:year ?year . OPTIONAL { ?cartoonist :givenName ?givenName ; :familyName ?familyName . - } + } FILTER(str(?year) >= "1980" && str(?year) < "2020") FILTER(isIri(?cartoonist)) @@ -149,11 +133,12 @@ Serietecknare som ligger som lokala entiteter (blanknoder) under `:agent` filtre ### Hur många franska barnböcker översättes till svenska under 1980-2020? ```sparql PREFIX : +PREFIX rdfs: SELECT (COUNT(DISTINCT ?book) AS ?count) { ?audience (:exactMatch|^:exactMatch|:sameAs|^:sameAs)* marc:Juvenile . - ?book :issuanceType :Monograph ; - :instanceOf [ a :Text ; + ?book :instanceOf [ a :Monograph ; + :category ; :intendedAudience ?audience ; :language lge:swe ; :translationOf [ a :Work ; @@ -161,7 +146,7 @@ SELECT (COUNT(DISTINCT ?book) AS ?count) { :publication/:year ?year . FILTER(str(?year) >= "1980" && str(?year) < "2020") -} +} ``` **Kommentar:** Här frågar vi snarare efter antalet svenska resurser som översatts _från_ franska. Det omvända kräver att verken ligger länkade under `:translationOf`, vilket inte är fallet i dagsläget. @@ -186,25 +171,25 @@ SELECT ?year ?audience ?genre (COUNT(?book) AS ?count) { lge:sms lge:sjk } - - ?book :issuanceType :Monograph ; - :instanceOf [ a :Text ; + ?book :instanceOf [ a :Monograph ; :language ?language ; :intendedAudience ?audience ; - :genreForm ?genre ] ; + :category ?genre ] ; :publication/:year ?year . - FILTER(isIri(?genre)) + FILTER(isIri(?genre) && EXISTS { ?genre a :GenreForm }) } GROUP BY ?year ?audience ?genre ORDER BY ?year ?audience ?genre ``` -**Kommentar:** +**Kommentar:** Det finns ingen URI som representerar alla samiska språk, utan vi får inkludera samtliga varieteter. ### Hur många facklitterära böcker gav förlaget Natur och Kultur ut mellan åren 1920-2000? ```sparql PREFIX : +PREFIX ktg: +PREFIX kbrda: SELECT (COUNT(DISTINCT ?book) AS ?count) { VALUES ?agentLabel { @@ -214,10 +199,9 @@ SELECT (COUNT(DISTINCT ?book) AS ?count) { "Natur och Kultur" "N&K" } - ?gf (:exactMatch|^:exactMatch|:sameAs|^:sameAs)* marc:NotFictionNotFurtherSpecified . - ?book :issuanceType :Monograph ; - :instanceOf [ a :Text ; - :genreForm marc:NotFictionNotFurtherSpecified ] ; + ?gf :broader* ktg:NonFictionLiterature . # saogf:Facklitteratur . + ?book :instanceOf [ a :Monograph ; + :category kbrda:Text, ?gf ] ; :publication [ a :PrimaryPublication ; :agent/:label ?agentLabel ; :year ?year ] . @@ -232,10 +216,11 @@ Det vore önskvärt att kunna referera till en URI som representerar förlaget N ### Hur många böcker ges ut av egenutgivare varje år? ```sparql PREFIX : +PREFIX kbrda: SELECT ?year (COUNT(DISTINCT ?book) AS ?count) { - ?book :issuanceType :Monograph ; - :instanceOf/a :Text ; + ?book :instanceOf [ a :Monograph ; + :category kbrda:Text ] ; :publication [ a :PrimaryPublication ; :year ?year ] ; ^:itemOf/:hasComponent?/:cataloguersNote "nbegenutg" . @@ -248,10 +233,9 @@ ORDER BY ?year PREFIX : SELECT ?year (COUNT(DISTINCT ?book) AS ?count) { - ?audience (:exactMatch|^:exactMatch|:sameAs|^:sameAs)* marc:Juvenile . - ?book :issuanceType :Monograph ; - :instanceOf [ a :Text ; - :intendedAudience marc:Juvenile ] ; + ?book :instanceOf [ a :Monograph ; + :category ; + :intendedAudience marc:Juvenile ] ; :publication [ a :PrimaryPublication ; :country ctry:sw ; :year ?year ] . @@ -268,8 +252,8 @@ Vill man undanta årtal som avviker från formen "yyyy" kan man lägga till det PREFIX : SELECT ?year (COUNT(DISTINCT ?book) AS ?count) { - ?book :issuanceType :Monograph ; - :instanceOf/a :Text ; + ?book :instanceOf [ a :Monograph ; + :category ] ; :publication [ a :PrimaryPublication ; :country ctry:sw ; :year ?year ] . @@ -283,8 +267,8 @@ ORDER BY ?year PREFIX : SELECT (COUNT(DISTINCT ?digiBook) AS ?count) { - ?digiBook :issuanceType :Monograph ; - :instanceOf/a :Text ; + ?digiBook :instanceOf [ a :Monograph ; + :category ] ; :production/:date "2020" ; ^:mainEntity/:bibliography lib:DIGI . } @@ -327,9 +311,8 @@ Om utgivare var länkade skulle vi också få ett mer exakt resultat, tack vare PREFIX : SELECT (COUNT(DISTINCT ?book) AS ?count) { - ?audience (:exactMatch|^:exactMatch|:sameAs|^:sameAs)* marc:Juvenile . - ?book :issuanceType :Monograph ; - :instanceOf [ a :Text ; + ?book :instanceOf [ a :Monograph ; + :category ; :intendedAudience marc:Juvenile ; :language ?language ] ; :publication [ a :PrimaryPublication ; @@ -378,9 +361,9 @@ SELECT (COUNT(DISTINCT ?instance) AS ?count) { ```sparql PREFIX : -SELECT ?month (COUNT(?instance) AS ?count) { - ?instance a :Print ; - :issuanceType :Monograph . +SELECT ?month (COUNT(?instance) AS ?count) { + ?instance a :PhysicalResource ; + :instanceOf/a :Monograph . ?hold :itemOf ?instance ; :heldBy lib:S . ?holdMeta :mainEntity ?hold ; @@ -399,11 +382,12 @@ Med katalogiserades menar vi här när beståndspost skapades. Svaret visar anta ```sparql PREFIX : -SELECT ?month (COUNT(DISTINCT ?instance) AS ?count) { - ?instance a :Electronic ; - :issuanceType :Serial . +SELECT ?month (COUNT(DISTINCT ?instance) AS ?count) { + ?instance a :DigitalResource ; + :instanceOf ?work . + ?work a :Serial . ?hold :itemOf ?instance ; - :heldBy lib:S . + :heldBy . ?holdMeta :mainEntity ?hold ; :created ?date . @@ -417,10 +401,12 @@ ORDER BY ?month ### Hur många monografier inom DDK 320 katalogiserades av Umeå universitetsbibliotek 2019? ```sparql PREFIX : +PREFIX lib: -SELECT (COUNT(DISTINCT ?instance) AS ?count) { - ?instance :issuanceType :Monograph ; - :instanceOf/:classification [ a :ClassificationDdc ; +SELECT (COUNT(DISTINCT ?instance) AS ?count) { + ?instance :instanceOf ?work . + ?work a :Monograph ; + :classification [ a :ClassificationDdc ; :code ?code ] . ?hold :itemOf ?instance ; :heldBy lib:Q . @@ -436,7 +422,7 @@ SELECT (COUNT(DISTINCT ?instance) AS ?count) { ```sparql PREFIX : -SELECT (COUNT(DISTINCT ?instance) AS ?count) { +SELECT (COUNT(DISTINCT ?instance) AS ?count) { ?instance :instanceOf/:subject sao:Mission%C3%A4rer ; ^:itemOf ?hold . ?holdMeta :mainEntity ?hold ; From 008b2186914cd02be93c47e206b868adebff1366 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niklas=20Lindstr=C3=B6m?= Date: Fri, 20 Mar 2026 11:10:07 +0100 Subject: [PATCH 2/2] Apply suggestions from code review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Olov Ylinenpää <51744858+olovy@users.noreply.github.com> --- docs/howto/sparql_examples.sv.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/howto/sparql_examples.sv.md b/docs/howto/sparql_examples.sv.md index 82f00c7..73ce085 100644 --- a/docs/howto/sparql_examples.sv.md +++ b/docs/howto/sparql_examples.sv.md @@ -21,7 +21,7 @@ Vanliga [namnrymdsprefix](https://www.w3.org/TR/sparql11-query/#prefNames) är [ Dessa kan användas i frågorna utan att behöva deklareras explicit. För termer ur KBV fungerar det fördefinierade prefixet `kbv:`, men i exempelfrågorna som följer använder vi istället standardprefixet `:` (deklareras explicit) för bättre läsbarhet. -Du kan också använda alternativa gränssnitt, t.ex. [Yasgui](https://yasgui.triply.cc/). Ange då `https://libris.kb.se/sparql` som endpoint. +Du kan också använda alternativa gränssnitt, till exempel [Yasgui](https://yasgui.triply.cc/). Ange då `https://libris.kb.se/sparql` som endpoint. Observera att enklare frågor också kan besvaras med hjälp av [sök-API:et](../reference/find.md). @@ -60,7 +60,7 @@ SELECT DISTINCT ?language ?langName { } ``` **Kommentar:** -Här förutsätter vi att författaren alltid ligger som länkad entitet under `:agent`. En variant för att matcha även lokala entiteter vore att byta ut URI:n `` mot en blanknod `[ :givenName "Selma" ; :familyName "Lagerlöf" ]`. Detta fungerar dock dåligt i det fall författaren har ett mer generiskt namn. +Här förutsätter vi att författaren alltid ligger som länkad entitet under `:agent`. En variant för att matcha även lokala entiteter vore att byta ut URI:n `` mot en blanknod `[ :givenName "Selma" ; :familyName "Lagerlöf" ]`. Detta fungerar dock dåligt i det fall författaren har ett mer vanligt namn. ### Vilka språk har svensk utgivning översatts till mellan åren 2000-2010? ```sparql @@ -304,7 +304,7 @@ SELECT (COUNT(DISTINCT ?publisherLabel) AS ?count) { **Kommentar:** Här frågar vi snarare "Vilka utgivare gav ut något i Sverige under 1970?". Tillräckliga påståenden om utgivare för att besvara originalfrågan saknas. Utgivare ligger mestadels som lokala entiteter, där enbart dess benämningar anges. Här skulle vi istället vilja att utgivare representerades av URI:er och länkats under `:agent`. På respektive URI skulle sedan relevanta påståenden kunna samlas, exempelvis när förlaget grundats och landet det verkar i. -Om utgivare var länkade skulle vi också få ett mer exakt resultat, tack vare att vi då skulle kunna garantera att antalet _unika_ utgivare räknas. Att räkna blanknoder fungerar inte eftersom vi inte kan särskilja vilka som representerar samma förlag. Istället räknar vi antalet unika benämningar, även om inte heller detta sätt garanterar ett helt exakt resultat då det kan förekomma olika benämningar på samma förlag, t.ex. "Natur & Kultur" och "N&K". +Om utgivare var länkade skulle vi också få ett mer exakt resultat, tack vare att vi då skulle kunna garantera att antalet _unika_ utgivare räknas. Att räkna blanknoder fungerar inte eftersom vi inte kan särskilja vilka som representerar samma förlag. Istället räknar vi antalet unika benämningar, även om inte heller detta sätt garanterar ett helt exakt resultat då det kan förekomma olika benämningar på samma förlag, till exempel "Natur & Kultur" och "N&K". ### Hur många barnböcker gavs ut på ett annat språk än svenska av svenska utgivare 2019? ```sparql @@ -469,7 +469,7 @@ SELECT (COUNT(DISTINCT ?person) AS ?count) { } ``` **Kommentar:** -För att få motsvarande resultat för andra entitetstyper än personer räcker det att ändra `:Person` till önskad typ, t.ex. `:Organization`. +För att få motsvarande resultat för andra entitetstyper än personer räcker det att ändra `:Person` till önskad typ, till exempel `:Organization`. ### Vilka SAO-termer skapades år 2024? ```sparql @@ -528,7 +528,7 @@ SELECT * WHERE { } ``` **Kommentar**: -Kan hitta sådana som till synes ser ut att vara korrekta, men som egentligen är trasiga (t.ex. `\n0000000115796660`). +Kan hitta sådana som till synes ser ut att vara korrekta, men som egentligen är trasiga (till exempel `\n0000000115796660`). ### Hur många katalogposter skapade den elektroniska plikten under 2023? ```sparql