Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
128 changes: 57 additions & 71 deletions docs/howto/sparql_examples.sv.md
Original file line number Diff line number Diff line change
Expand Up @@ -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).

Expand All @@ -30,8 +30,7 @@ Observera att enklare frågor också kan besvaras med hjälp av [sök-API:et](..
PREFIX : <https://id.kb.se/vocab/>

SELECT (COUNT(DISTINCT ?novel) as ?count) {
?gf (:exactMatch|^:exactMatch|:sameAs|^:sameAs)* marc:Novel .
?novel :instanceOf/:genreForm ?gf ;
?novel :instanceOf/:category/(:broader|:broadMatch)* <https://id.kb.se/term/saogf/Romaner> ;
:publication [ :year "2019" ; :country ctry:sw ] .
}
```
Expand All @@ -47,20 +46,21 @@ för att inte behöva skriva ut varje trippel i sin helhet.
### Vilka språk finns Selma Lagerlöf översatt till?
```sparql
PREFIX : <https://id.kb.se/vocab/>
PREFIX rel: <https://id.kb.se/relator/>

SELECT DISTINCT ?language ?langName {
[] :contribution [ a :PrimaryContribution ;
:role rel:author ;
:agent <https://libris.kb.se/qn247n18248vs58#it> ] ;
:translationOf/a :Work ;
:translationOf [] ;
:language ?language .
?language :prefLabel ?langName .

FILTER(lang(?langName) = 'sv')
FILTER(lang(?langName) = 'sv')
}
```
**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 `<https://libris.kb.se/qn247n18248vs58#it>` 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 `<https://libris.kb.se/qn247n18248vs58#it>` 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
Expand All @@ -85,34 +85,22 @@ Vi kan nämligen ta reda på verkets originalspråk via `:translationOf`, därem
PREFIX : <https://id.kb.se/vocab/>

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* <https://id.kb.se/term/saogf/Sk%C3%B6nlitteratur> ;
: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.
Expand All @@ -122,22 +110,18 @@ Det vore även önskvärt att kunna ange _en_ term för _all_ skönlitteratur. V
PREFIX : <https://id.kb.se/vocab/>

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* <https://id.kb.se/term/saogf/Tecknade%20serier>.
[] :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))
Expand All @@ -149,19 +133,20 @@ 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 : <https://id.kb.se/vocab/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>

SELECT (COUNT(DISTINCT ?book) AS ?count) {
?audience (:exactMatch|^:exactMatch|:sameAs|^:sameAs)* marc:Juvenile .
?book :issuanceType :Monograph ;
:instanceOf [ a :Text ;
?book :instanceOf [ a :Monograph ;
:category <https://id.kb.se/term/rda/Text> ;
:intendedAudience ?audience ;
:language lge:swe ;
:translationOf [ a :Work ;
:language lge:fre ] ] ;
: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.
Expand All @@ -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 : <https://id.kb.se/vocab/>
PREFIX ktg: <https://id.kb.se/term/ktg/>
PREFIX kbrda: <https://id.kb.se/term/rda/>

SELECT (COUNT(DISTINCT ?book) AS ?count) {
VALUES ?agentLabel {
Expand All @@ -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 ] .
Expand All @@ -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 : <https://id.kb.se/vocab/>
PREFIX kbrda: <https://id.kb.se/term/rda/>

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" .
Expand All @@ -248,10 +233,9 @@ ORDER BY ?year
PREFIX : <https://id.kb.se/vocab/>

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 <https://id.kb.se/term/rda/Text> ;
:intendedAudience marc:Juvenile ] ;
:publication [ a :PrimaryPublication ;
:country ctry:sw ;
:year ?year ] .
Expand All @@ -268,8 +252,8 @@ Vill man undanta årtal som avviker från formen "yyyy" kan man lägga till det
PREFIX : <https://id.kb.se/vocab/>

SELECT ?year (COUNT(DISTINCT ?book) AS ?count) {
?book :issuanceType :Monograph ;
:instanceOf/a :Text ;
?book :instanceOf [ a :Monograph ;
:category <https://id.kb.se/term/rda/Text> ] ;
:publication [ a :PrimaryPublication ;
:country ctry:sw ;
:year ?year ] .
Expand All @@ -283,8 +267,8 @@ ORDER BY ?year
PREFIX : <https://id.kb.se/vocab/>

SELECT (COUNT(DISTINCT ?digiBook) AS ?count) {
?digiBook :issuanceType :Monograph ;
:instanceOf/a :Text ;
?digiBook :instanceOf [ a :Monograph ;
:category <https://id.kb.se/term/rda/Text> ] ;
:production/:date "2020" ;
^:mainEntity/:bibliography lib:DIGI .
}
Expand Down Expand Up @@ -320,16 +304,15 @@ 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
PREFIX : <https://id.kb.se/vocab/>

SELECT (COUNT(DISTINCT ?book) AS ?count) {
?audience (:exactMatch|^:exactMatch|:sameAs|^:sameAs)* marc:Juvenile .
?book :issuanceType :Monograph ;
:instanceOf [ a :Text ;
?book :instanceOf [ a :Monograph ;
:category <https://id.kb.se/term/rda/Text> ;
:intendedAudience marc:Juvenile ;
:language ?language ] ;
:publication [ a :PrimaryPublication ;
Expand Down Expand Up @@ -378,9 +361,9 @@ SELECT (COUNT(DISTINCT ?instance) AS ?count) {
```sparql
PREFIX : <https://id.kb.se/vocab/>

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 ;
Expand All @@ -399,11 +382,12 @@ Med katalogiserades menar vi här när beståndspost skapades. Svaret visar anta
```sparql
PREFIX : <https://id.kb.se/vocab/>

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 <https://libris.kb.se/library/S> .
?holdMeta :mainEntity ?hold ;
:created ?date .

Expand All @@ -417,10 +401,12 @@ ORDER BY ?month
### Hur många monografier inom DDK 320 katalogiserades av Umeå universitetsbibliotek 2019?
```sparql
PREFIX : <https://id.kb.se/vocab/>
PREFIX lib: <https://libris.kb.se/library/>

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 .
Expand All @@ -436,7 +422,7 @@ SELECT (COUNT(DISTINCT ?instance) AS ?count) {
```sparql
PREFIX : <https://id.kb.se/vocab/>

SELECT (COUNT(DISTINCT ?instance) AS ?count) {
SELECT (COUNT(DISTINCT ?instance) AS ?count) {
?instance :instanceOf/:subject sao:Mission%C3%A4rer ;
^:itemOf ?hold .
?holdMeta :mainEntity ?hold ;
Expand Down Expand Up @@ -483,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
Expand Down Expand Up @@ -542,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
Expand Down