User:Sintakso/SPARQL

Poznámky ke SPARQLu částečně inspirované Wikidata Workshopem 2017

KostraEdit

#základní kostra dotazu
SELECT ?subjekt ?subjektLabel WHERE {
  ?subjekt ?predikat ?objekt .
  SERVICE wikibase:label {
    bd:serviceParam wikibase:language "cs,en" .
  }
}

Try it!

PříkladEdit

Základní dotaz, který nalezne všechny položky s výrokem instance of (P31) dog (Q144) a přiřadí jim český, popřípadě anglický štítek:

#psi na Wikidatech
SELECT ?pes ?pesLabel WHERE {
  ?pes wdt:P31 wd:Q144 .
  SERVICE wikibase:label {
    bd:serviceParam wikibase:language "cs,en" .
  }
}

Try it!

PrefixyEdit

Běžně užívané prefixy:

  • wd: - odkazuje na entitu ve Wikidatech
  • wdt: - spjuje entitu s hodnotou konkrétní vlastnosti (v jednoduchých dotazech se tedy používá před vlastností)
  • p: - spojuje entitu s uzlem výroku
  • ps: - spojuje uzel výroku s hodnotou
  • pq: - spojuje uzel výroku s vymezením
  • psv: - získává uzel hodnoty (užitečný např. pro práci s přesností, použití p:vlastnost/psv:vlastnost)
  • prov:wasDerivedFrom - spojuje entitu s uzelem s referencemi
  • pr: - spojuje uzel s referencemi s hodnotou referencí

Seznam prefixů v dokumentaci k MediaWiki

Příklad - vymezeníEdit

Najde položky s výroky country (P17) United States of America (Q30) a significant event (P793) demolition (Q331483) a získá hodnotu vymezení point in time (P585) u significant event (P793):

#zdemolované objekty v USA s datem demolice
SELECT ?polozka ?polozkaLabel ?datumdemolice WHERE {
  ?polozka wdt:P17 wd:Q30 . #najít položky se státem USA
  ?polozka p:P793 ?uzel . #najít položky s vyplněnou významnou událostí
  ?uzel ps:P793 wd:Q331483 . #najít položky s významnou událostí demolice
  ?uzel pq:P585 ?datumdemolice . #získat vymezení datum z výroku významná událost-demolice
  SERVICE wikibase:label {
    bd:serviceParam wikibase:language "cs,en" .
  }
}

Try it!

Příklad - referenceEdit

#všechna tvrzení zdrojovaná WikiSkripty
SELECT ?subjekt ?subjektLabel ?vlastnost WHERE {
  ?subjekt ?vlastnost ?vyrok .
  ?vyrok prov:wasDerivedFrom ?reference .
  ?reference pr:P248 wd:Q9049250 .
  SERVICE wikibase:label {
    bd:serviceParam wikibase:language "cs,en" .
  }
}

Try it!

OpakováníEdit

  • Opakování v subjektu
SELECT ?subjekt WHERE {
  ?subjekt ?predikat1 ?hodnota1 ;
           ?predikat2 ?hodnota2 .
}

Try it!

  • Opakování v subjektu a predikátu
SELECT ?subjekt WHERE {
  ?subjekt ?predikat ?hodnota1 ,
                     ?hodnota2 .
}

Try it!

Příklad - opakování v predikátuEdit

#nalezne všechny spisovatele, kteří byli současně herci
SELECT ?spisovatelaherec ?spisovatelaherecLabel WHERE {
  ?spisovatelaherec wdt:P106 wd:Q36180 , #spisovatel
                             wd:Q33999 . #herec
  SERVICE wikibase:label {
    bd:serviceParam wikibase:language "cs,en" .
  }
}

Try it!

Strom vlastnostíEdit

Za pomocí syntaxe wdt:vlastnost u subjektu/wdt:vlastnost tvořící strom* wd:kořen stromu

PříkladEdit

#všechny elektrárny v Jihomoravském kraji
SELECT ?elektrarna ?elektrarnaLabel WHERE {
  ?elektrarna wdt:P31/wdt:P279* wd:Q159719 . #elektrárna
  FILTER EXISTS { ?elektrarna wdt:P131* wd:Q192697 } #z výsledků vyfiltrovat jen elektrárny v Jihomoravském kraji
  SERVICE wikibase:label {
    bd:serviceParam wikibase:language "cs" .
  }
}

Try it!

Štítky, popisy, aliasy a odkazy na wikiEdit

  • štítek
    • příklad: ?subjekt rdfs:label štítek"@cs
  • popis
    • příklad: ?subjekt schema:description "popis"@cs
  • alias
    • příklad: ?subjekt skos:altLabel "alias"@cs
  • štítek nebo alias
    • příklad: ?subjekt rdfs:label|skos:altLabel "Štítek nebo alias"@cs
  • filtrování aliasů pouze v češtině
    • ?alias FILTER (LANG (?alias) = "cs") - hodnota ?alias získaná tripletem ?subjekt skos:altLabel ?alias
  • odkazy na wiki
    • viz níže

Příklad - odkazy na cswikiEdit

#najde název článku na cswiki a odkaz na něj pro české spisovatele mající na ní článek
SELECT ?spisovatel ?spisovatelLabel ?nazevclanku ?clanek WHERE {
  ?spisovatel wdt:P106 wd:Q36180 . #spisovatel
  ?spisovatel wdt:P27 wd:Q213 . #české občanství
  ?clanek schema:about ?spisovatel ; #získat odkazy
          schema:isPartOf <https://cs.wikipedia.org/> ; #obsahuje odkaz na cswiki
          schema:name ?nazevclanku . #název článku na cswiki
  SERVICE wikibase:label {
    bd:serviceParam wikibase:language "cs" .
  }
}

Try it!

PříkazyEdit

Seznam běžně užívaných příkazů:

  • OPTIONAL - přiřadí i položky, které neobsahují daný triplet
    • syntaxe: OPTIONAL { ?s ?p ?o }
  • FILTER - vyřadí data, pro která neplatí daná podmínka
    • syntaxe: FILTER (podmínka)
  • FILTER EXISTS - zařadí pouze data odpovídající danému tripletu
    • syntaxe: FILTER EXISTS { ?s ?p ?o }
  • FILTER NOT EXISTS - vyřadí data, která odpovídají danému tripletu
    • syntaxe: FILTER NOT EXISTS { ?s ?p ?o }
  • UNION - sjednocení s dalším dotazem (zobrazí výsledky vyhovující alespoň jednomu z dotazů)
    • syntaxe: { ?s1 ?p1 ?o1 } UNION { ?s1 ?p1 ?o1 }
  • BIND - vytvoří proměnnou, např. na základě výpočtu
    • syntaxe: BIND (výraz as ?proměnná)
  • LIMIT - omezí počet výsledků
    • syntaxe: LIMIT požadovaný počet
  • COUNT - spočítá množství něčeho (dává se mezi SELECT a WHERE, nutno použít s GROUP BY)
    • syntaxe: (COUNT (DISTINCT ?subjekt) AS ?pocetsubjektu), viz níže
  • ORDER BY - seřadí výsledky od nejnižší po nejvyšší
    • viz níže
  • ORDER BY DESC - seřadí výsledky od nejvyšší po nejnižší
    • viz níže

Příklad - čeští autoři s největším množstvím dělEdit

#autoři s největším počtem literárních děl na Wikidatech
SELECT ?spisovatel ?spisovatelLabel (COUNT (DISTINCT ?dilo) AS ?pocetdel) WHERE {
  ?spisovatel wdt:P106 wd:Q36180 . #spisovatel
  ?spisovatel wdt:P27 wd:Q213 . #české občanství
  ?dilo wdt:P50 ?spisovatel . #zjistit díla spisovatele
  ?dilo wdt:P31/wdt:P279* wd:Q7725634 . #pouze literární díla
  SERVICE wikibase:label {
    bd:serviceParam wikibase:language "cs" .
  }
} GROUP BY ?spisovatel ?spisovatelLabel
ORDER BY DESC (?pocetdel)

Try it!

Práce s datovými typyEdit

  • Řetězce:
    • "řetězec"
    • "string"@en
    • "řetězec"^^xsd:string
    • '''Složitý řetězec s různými 'typy' "uvozovek".'''
  • Celá čísla:
    • 1
    • "1"^^xsd:integer
  • Desetinná čísla:
    • 1.5
    • "1.5"^^xsd:decimal
  • Boolean:
    • true
    • "true"^^xsd:boolean
    • false
    • "false"^^xsd:boolean
  • Datum a čas
    • "2017-06-24T18:00:00Z"^xsd:dateTime

FunkceEdit

Seznam některých užitečných funkcí:

  • now() - vrátí aktuální čas
  • IF(podmínky, hodnota1, hodnota2) - vrátí hodnotu na základě podmínky
    • syntaxe: IF(podmínky, hodnota vrácená pokud podmínky platí, hodnota vrácená pokud podmínky neplatí)
      • || = or
      • && = and

LexémyEdit

  • lexém
    • ?lexem a ontolex:LexicalEntry
  • jazyk
    • ?lexem dct:language wdt:[Q položka jazyka]
  • lemma
    • ?lexem wikibase:lemma ?lemma
  • lexikální kategorie
    • ?lexem wikibase:lexicalCategory ?kategorie
  • tvar
    • ?lexem ontolex:lexicalForm ?tvar
    • ?tvar a ontolex:Form
  • text tvaru
    • ?tvar ontolex:representation ?textTvaru
  • gramatická vlastnost tvaru
    • ?tvar wikibase:grammaticalFeature ?vlastnost
  • význam
    • ?lexem ontolex:sense ?vyznam
    • ?vyznam a ontolex:LexicalSense
  • glosa
    • ?vyznam skos:definition ?glosa

Příklad - české lexémyEdit

SELECT ?l ?lemma WHERE {
  ?l a ontolex:LexicalEntry ;
       dct:language wd:Q9056 ; #české lexémy
       wikibase:lemma ?lemma .
} LIMIT 10000

Try it!

Příklad - tvaryEdit

SELECT ?tvar ?textTvaru ?vlastnost WHERE {
  #tvary lexému s českým lemmatem "začátek"
  ?l a ontolex:LexicalEntry ;
       dct:language wd:Q9056 ; #lexémy v češtině
       wikibase:lemma "začátek"@cs ; #lexémy s lemmatem "začátek" v češtině
       ontolex:lexicalForm ?tvar .
  ?tvar a ontolex:Form ; #tvary těchto lexémů
          ontolex:representation ?textTvaru ; #textové reprezentace těchto tvarů
          wikibase:grammaticalFeature ?vlastnost . #gramatické vlastnosti těchto tvarů
}

Try it!

Příklad - významy a glosyEdit

SELECT ?vyznam ?glosa WHERE {
  #významy a glosy lexému s českým lemmatem "pes" v češtině
  ?l a ontolex:LexicalEntry ;
       dct:language wd:Q9056 ; #lexémy v češtině
       wikibase:lemma "pes"@cs ; #lexémy s lemmatem "pes" v češtině
       ontolex:sense ?vyznam . 
  ?vyznam a ontolex:LexicalSense ; #významy takových lexémů
            skos:definition ?glosa . #glosy těchto významů
  FILTER (LANG (?glosa) = "cs") #pouze české glosy
}

Try it!

Příklad - položky odpovídající významůmEdit

SELECT ?vyznam ?glosa ?polozka WHERE {
  #významy a glosy lexému s českým lemmatem "pes" v češtině
  ?l a ontolex:LexicalEntry ;
       dct:language wd:Q9056 ; #lexémy v češtině
       wikibase:lemma "pes"@cs ; #lexémy s lemmatem "pes" v češtině
       ontolex:sense ?vyznam . 
  ?vyznam a ontolex:LexicalSense ; #významy takových lexémů
            skos:definition ?glosa ; #glosy těchto významů
            wdt:P5137 ?polozka #odpovídající položky
  FILTER (LANG (?glosa) = "cs") #pouze české glosy
}

Try it!

Příklad - česká podstatná jména bez tvarůEdit

SELECT ?l ?lemma WHERE {
  #české lexémy bez tvarů
  ?l a ontolex:LexicalEntry ;
       dct:language wd:Q9056 ; #lexémy v češtině
       wikibase:lexicalCategory wd:Q1084 ; #podstatná jména
       wikibase:lemma ?lemma .
  FILTER NOT EXISTS {?l ontolex:lexicalForm ?tvar} #bez tvarů
}

Try it!

Příklad - české lexémy bez významuEdit

SELECT ?l ?lemma WHERE {
  #české lexémy bez významu
  ?l a ontolex:LexicalEntry ;
       dct:language wd:Q9056 ; #lexémy v češtině
       wikibase:lemma ?lemma .
  FILTER NOT EXISTS {?l ontolex:sense ?vyznam } #bez významu
}

Try it!

Jiné dotazyEdit

Čeští spisovatelé mladší 35 letEdit

#čeští žijící spisovatelé mladší 35 let s přesností data narození alespoň rok (seřazeni od nejmladšího)
SELECT ?spisovatel ?spisovatelLabel ?datumnarozeni ?vek WHERE {
  ?spisovatel wdt:P106 wd:Q36180 . #povoláním spisovatel
  ?spisovatel wdt:P27 wd:Q213 . #české státní občanství
  ?spisovatel p:P569/psv:P569 ?datumnarozeniuzel. #získat uzel s hodnotou data narození
  ?datumnarozeniuzel wikibase:timePrecision ?presnost. #získat z uzlu hodnotu přesnosti
  ?datumnarozeniuzel wikibase:timeValue ?datumnarozeni . #získat z uzlu hodnotu data narození
  BIND (now() as ?nyni) #vytvořit proměnnou ?nyni s aktuálním datem
  BIND ( year(?nyni) - year(?datumnarozeni) - if(month(?nyni) < month(?datumnarozeni) || ((month(?nyni) = month(?datumnarozeni) && day(?nyni) < day(?datumnarozeni))),1,0) as ?vek ) #vypočítat věk
  FILTER (?presnost > "8"^^xsd:integer) #vyfiltrovat data s menší přesností, než jsou roky
  FILTER (?vek < "35"^^xsd:integer) #vyfiltrovat spisovatele starší 34 let
  FILTER NOT EXISTS { ?spisovatel p:P570 ?cokoliv } #nemá vyplněné datum úmrtí
  SERVICE wikibase:label {
    bd:serviceParam wikibase:language "cs,en" .
  }
} GROUP BY ?spisovatel ?spisovatelLabel ?datumnarozeni ?vek
ORDER BY DESC (?datumnarozeni)

Try it!

Odkaz "Zkuste to!" je nefunkční kvůli svislítkům v kódu

Anatomické struktury s aliasyEdit

SELECT ?struktura ?strukturaLabel ?alias WHERE {
	?struktura wdt:P279* wd:Q4936952 .
    OPTIONAL {?struktura skos:altLabel ?alias FILTER (LANG (?alias) = "cs")}
    SERVICE wikibase:label { 
      bd:serviceParam wikibase:language "cs"
    }
}

Try it!

OdkazyEdit