DBpedia

Snaha o extrahování strukturovaného obsahu Wikipedie (nejčastěji info boxy v pravém sloupci článku). Vzniklo spoluprací Free University of Berlin a Leipzig University v roce 2007. Více na stránce projektu.

Projekt poskytuje rozhraní pro vyhledání entit a rozhraní pro dotazování se (SPARQL endpoint). Výhodou je, že nejčastěji používané prefixy jsou již předvyplněné a není třeba je v dotazu uvádět.

Jaké programovací jazyky ovlivnily nejvíce jiných jazyků?

Nejprve zkusíme vyhledat resource, který odpovídá nějakému programovacímu jazyku. Pro javu např obr. 1.

Obr.1 - nabídka možných hledaných resource a entit.
Na následující stránce se proklikem na název resource nahoře, případně odkazem "Goto", dostaneme na stránku http://dbpedia.org/page/Java_(programming_language). Zde je seznam všech predikátů a objektů pojících se s resource http://dbpedia.org/resource/Java_(programming_language) v DBpedia datasetu. Data lze stáhnout přes nabídku "Formats" v horní liště.

K našemu dotazu se bude hodit predikát dbo:influenced. Základní dotaz, který vypíše jazyky, které byly ovlivněné jazykem Java lze získat SPARQL dotazem 1. Filter je možné v tomto případě nahradit přímou substitucí hledané URI za proměnnou ?lang1 ve WHERE klauzuli. Obecně je ale lepší užívat FILTER. Typické případy, které bez FILTER nelze vyřešit, jsou pokud ?lang1 může nabývat různých hodnot, nebo ho chceme vrátit v odpovědi.


PREFIX dbo: <http://dbpedia.org/ontology/>

SELECT ?lang2 
WHERE {
	?lang1 dbo:influenced ?lang2 .
	?lang1 a dbo:ProgrammingLanguage .
	?lang2 a dbo:ProgrammingLanguage .

	FILTER(?lang1 = <http://dbpedia.org/resource/Java_(programming_language)>)
}
SPARQL1 - výběr programovacích jazyků, které byly ovlivněny jazykem Java. Výsledek: [2018/03/12]

SPARQL podporuje agregační funkce, podobně jako SQL. V dotazu 2 jsou vybrány všechny programovací jazyky a spočítáno, kolik jiných ovlivnily. Jako volitelný je zvolen predikát dbpedia2:year, který bývá používán pro zachycení roku nějaké události, v tomto případě uvedení jazyka. Nicméně většina resource nemá tento atribut vyplněný, i když v info boxu na Wikipedii údaj je. Teoreticky by bylo možné rok uvedení získat jinak, u Java např. z "rdf:type dbpedia:class/yago/ProgrammingLanguagesCreatedIn1995", ale takové řešení by bylo komplikované.


PREFIX dbo: <http://dbpedia.org/ontology/>

SELECT ?lang1 (count(?lang2) as ?count) ?year 
WHERE {
	?lang1 dbo:influenced ?lang2 .
	?lang1 a dbo:ProgrammingLanguage .
	?lang2 a dbo:ProgrammingLanguage .

	OPTIONAL{?lang1 dbpedia2:year ?year.}
}
GROUP BY ?lang1 ?year
ORDER BY desc(?count)
SPARQL2 - seřazení programovacích jazyků podle počtu jazyků, které ovlivnily. Je vypsán rok uveřejnění jazyka, pokud je v datasetu. Výsledek: [2018/03/12]

Knihy s největším počtem stran

V dotazu 3 se hledají nejtlustší knihy. Vzhledem k počtu knižních záznamů je použito klíčové slovo LIMIT pro výpis pouze prvních 100 knih v pořadí. Dále je použit filter na získání pouze anglických popisků, případně popisků bez udání jejich lokalizace. V případě, že některá z vlastností má více hodnot, bude pro každou kombinaci hodnot vrácen jeden řádek. To je v mnohých případech problematické, nicméně zde nám jde pouze o získání "nej" knih a tento problém můžeme ignorovat.


PREFIX dbo: <http://dbpedia.org/ontology/>

SELECT ?s ?country ?language ?published ?label ?pages
WHERE {
  ?s a dbo:Book .
  ?s dbo:numberOfPages ?pages .
  OPTIONAL{?s dbpedia2:country ?country}
  OPTIONAL{?s dbpedia2:language ?language}
  OPTIONAL{?s dbpedia2:published ?published}
  OPTIONAL{?s rdfs:label ?label .
    FILTER(LANG(?label) = "" || lang(?label) = "en") .}

}
ORDER BY desc(?pages)
LIMIT 100
SPARQL3 - knihy seřazené podle počtu stran. Výsledek: [2018/03/12]

Ve výsledcích jsou na první pohled patrné chyby a nekonzistence v datech. Kniha s největším počtem stran A Deepness in the Sky má podle předchozího dotazu 606775 stran. Pohledem na původní stránku Wikipedie, ze které byl tento údaj exportován, lze snadno odhalit příčinu -- Pages: 606 (Hardback), 775 (Paperback).

Bitvy Třicetileté války

Zajímavé použití dat z Wikipedie by mohl být k agregaci údajů z bitev v průběhu války, které typicky mají infobox s pevnou strukturou. Dotazem 4 chci získat informace o bitvách, které byly součástí Třicetileté války (1618-1648). V tomto případě je již potřeba vyřešit vlastnosti s vyšší kardinalitou. Obecně to lze řešit dvěma způsoby: vybrat maximální/minimální/průměrnou hodnotu, tzn. nějakým způsobem hodnoty agregovat; vypsat všechny hodnoty spojené do řetězce. V tomto případě spojuji popisky do jednoho řetězce a odděluji je středník. U datumu vybírám nejvyšší hodnotu, protože dává větší smysl (vzhledem k počítání obětí) uvažovat konec bitvy než její začátek.

SELECT ?battle (sum(?casualty) as ?totalCasualty) ?lat ?long (max(?date) as ?mdate) (group_concat(?label;separator='; ') as ?mlabel)
WHERE {

	?battle <http://purl.org/dc/terms/subject> <http://dbpedia.org/resource/Category:Battles_of_the_Thirty_Years'_War> .
	optional{
		?battle rdfs:label ?label .
		FILTER(LANG(?label) = "" || lang(?label) = "en") .
	} .
	optional{ ?battle dbpedia2:casualties ?casualty } .
	optional{ ?battle <http://www.w3.org/2003/01/geo/wgs84_pos#lat> ?lat} .
	optional{ ?battle <http://www.w3.org/2003/01/geo/wgs84_pos#long> ?long} .
    ?battle dbo:date ?date .

}
GROUP BY ?battle ?lat ?long
ORDER BY ?battle
SPARQL4 - bitvy Třicetileté války s GPS koordináty a odhadem počtu obětí. Výsledek: [2018/03/12]

Výsledek na první pohled dává smysl (až na Battle of Jüterbog, u kterého je počtem obětí vyjádřený textem). Pokud bych data vizualizoval, např. obrázek 2, opět se na první pohled vše jeví v pořádku; možná jen 362 tisíc obětí se může jevit málo, standardně se hovoří o milionech. Nicméně podstatné chyby ve výsledku jsou. Prozkoumejme např. data bitvy u Breitenfeldu [DBpedia][Wikipedia]. Na obrázku 3 je znázorněno, které z údajů byly do DBpedie zaneseny. Kromě jednotlivých položek, se extrahovaly i jejich sumy. Navíc se hodnota 3000 zapsala pouze jednou (nelze mít 2 stejné trojice, resp. stejný literál, pro daný predikát a subjekt). Obecně jsou data v DBpedii bohužel nespolehlivá a nelze s nimi tímto způsobem pracovat.

Obr.2 - vizualizace bitev Třicetileté války.
Obr.3 - nesoulad v datech o bitvě u Breitenfeldu.