User:Sintakso/SPARQL
Jump to navigation
Jump to search
Try it!
Try it!
Try it!
Try it!
Try it!
Try it!
Try it!
Try it!
Try it!
Try it!
Try it!
Try it!
Try it!
Try it!
Try it!
Try it!
Try it!
Try it!
Poznámky ke SPARQLu částečně inspirované Wikidata Workshopem 2017
Kostra[edit]
#základní kostra dotazu
SELECT ?subjekt ?subjektLabel WHERE {
?subjekt ?predikat ?objekt .
SERVICE wikibase:label {
bd:serviceParam wikibase:language "cs,en" .
}
}
Příklad[edit]
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" .
}
}
Prefixy[edit]
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" .
}
}
Příklad - reference[edit]
#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" .
}
}
Opakování[edit]
- Opakování v subjektu
SELECT ?subjekt WHERE {
?subjekt ?predikat1 ?hodnota1 ;
?predikat2 ?hodnota2 .
}
- Opakování v subjektu a predikátu
SELECT ?subjekt WHERE {
?subjekt ?predikat ?hodnota1 ,
?hodnota2 .
}
Příklad - opakování v predikátu[edit]
#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" .
}
}
Strom vlastností[edit]
Za pomocí syntaxe wdt:vlastnost u subjektu/wdt:vlastnost tvořící strom* wd:kořen stromu
Příklad[edit]
#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" .
}
}
Štítky, popisy, aliasy a odkazy na wiki[edit]
- š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 cswiki[edit]
#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" .
}
}
Příkazy[edit]
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ěl[edit]
#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)
Práce s datovými typy[edit]
- Ř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
Funkce[edit]
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
- syntaxe: IF(podmínky, hodnota vrácená pokud podmínky platí, hodnota vrácená pokud podmínky neplatí)
Lexémy[edit]
- 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émy[edit]
SELECT ?l ?lemma WHERE {
?l a ontolex:LexicalEntry ;
dct:language wd:Q9056 ; #české lexémy
wikibase:lemma ?lemma .
} LIMIT 10000
Příklad - tvary[edit]
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ů
}
Příklad - významy a glosy[edit]
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
}
Příklad - položky odpovídající významům[edit]
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
}
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ů
}
Příklad - české lexémy bez významu[edit]
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
}
Jiné dotazy[edit]
Čeští spisovatelé mladší 35 let[edit]
#č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)
Odkaz "Zkuste to!" je nefunkční kvůli svislítkům v kódu
Anatomické struktury s aliasy[edit]
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"
}
}