KAPITOLA 12.: SWRL DOTAZOVÁNÍ
SWRL dotazování a SWRLQueryTab
SQWRL
Podoba SWRL dotazů
Teoretický úvod
Plugin SWRLTab nemusíme použít jen k tvorbě pravidel (k odvozování), ale i pro dotazování. Oproti odvozovacím pravidlům, dotazovací pravidla nic do ontologie nevkládají, jen získávají ty informace z ontologie, které právě potřebujeme. Příkazy, které lze použít pro dotazování jsou součástí ontologie SWRL Query Ontology (query.owl).
SWRL Query Tab je komponentou přítomnou v SWRLTabu a ke své činnosti potřebuje JESS. Pokud je už nainstalována komponenta SWRLJessTab, pro instalaci SWRL Query Tabu nemusíme dělat nic. Obrázek níže ukazuje podobu SWRLQueryTabu.
![SWRLQueryTab](zt1_obrazky/kap12/swrlquerytab.jpg)
Existuje ještě jeden, na jazyku SWRL založený dotazovací jazyk SQWRL (Semantic Query - Enhanced Web Rule Language - vyslovováno jako squirrel). Pokud chceme použít jeho příkazy, musíme mít k dispozici ontologii sqwrl.owl, ta obsahuje více konstrukcí než výše zmíněná ontologie query.owl.
Vytvoříme několik jednoduchých dotazů pro demonstraci použití dotazů nad OWL ontologií. Využijeme přitom naši OWL ontologii s filmy, která už obsahuje odvozené jedince. Dotazy tvoříme obdobně jako pravidla. Zvolíme volbu Create new rule, objeví se nám známé editační okno, vytvoříme dotaz, přitom použijeme příslušný predikát z nabídky pod ikonkou s písmenem B. Poté dotaz spustíme pomocí volby Run.
Vytvoříme následující dotazy:
- zobrazení všech herců a k nim filmy, ve kterých hráli (bez pojmenování sloupců);
- zobrazení všech herců a k nim filmy, ve kterých hráli (s pojmenováním sloupců);
- zobrazit počet pohádek evidovaných v OWL ontologii;
- výběr jen těch filmů, které byly natočeny po roce 2000 (zobrazte název filmu, rok a pojmenujte oba sloupce);
- zobrazit všechny filmové žánry;
- zobrazit všechny filmové kategorie;
- zobrazit film s rokem natočení, přitom výčet bude seřazen podle názvu filmu vzestupně a sestupně.
Dotaz č. 1: herci a filmy (bez pojmenování sloupců)
SWRL dotaz má, tak jako pravidlo, určitou strukturu. "Podmínková část" je tvořena různými podmínkami
obsahující názvy tříd, jedinců nebo vlastností spolu s parametry. "Usuzovací část" pak nejčastěji
obsahuje výraz začínající slovem query: a za ním následuje určitý predikát s jedním
nebo více parametry (nejčastěji proměnnými). První dotaz má vybrat herce a ke každému z nich film, ve kterým
hrál. Pokud znáte databázový jazyk SQL, predikát (příkaz) sqwrl:select Vám bude známý.
Dotaz má tedy podobu:
hasGender(?actor, Man) ∧ isOccupiedIn(?actor, ?film)
Vybíráme tedy osoby mužského pohlaví, kteří hráli v nějakém filmu. Predikátem select vybíráme
výsledky obsažené v proměnné ?actor a ?film, tedy očekáváme dvousloupcový výstup. Následující obrázek obsahuje výsledky tohoto dotazu.
Všimnětě si, že názvy sloupců ve výsledku dotazu odpovídají názvům proměnných v řádku se selectem.
->
sqwrl:select(?actor, ?film)
![Spuštění dotazu č. 1](zt1_obrazky/kap12/spustenidotazu.jpg)
Dotaz č. 2: herci a filmy (s pojmenováním sloupců)
Dotaz č. 2 bude podobný prvnímu, takže klidně můžeme zvolit volbu Clone selected rule a dotaz upravit. Navíc přidáme predikát sqwrl:columnNames, který sloupce pojmenuje, viz. kód a výsledky dotazu níže.
hasGender(?actor, Man) ∧ isOccupiedIn(?actor, ?film)
->
sqwrl:select(?actor, ?film) ∧ sqwrl:columnNames("Actor", "Film")
![Výsledky dotazu č. 2](zt1_obrazky/kap12/spustenidotazu2.jpg)
Dotaz č. 3: počty pohádek
Už ze slova počet je zřejmé, že select nám zde bude celkem k ničemu.
Musíme použít jiný predikát, nejlépe sqwrl:count, který určí počty položek určité proměnné. Dotaz tedy bude vypadat následovně:
hasGenre(?film, FairytaleGenre)
->
sqwrl:count(?film) ∧ sqwrl:columnNames("CountOfFairytales")
Dotaz č. 4: filmy natočené po roce 2000
Dotaz využívá dalšího nového predikátu swrlb: greaterThan, který
pracuje s číselnými hodnotami, resp. vybere jen ty položky, u nichž je číselná hodnota větší než požadované číslo, viz. následující
kód:
hasYearOfProduce(?film, ?yearOfProduce)
->
swrlb:greaterThan(?yearOfProduce, 2000) ∧ sqwrl:select(?film, ?yearOfProduce) ∧
sqwrl:columnNames("Film", "YearOfProduce")
Dotaz č. 5: filmové žánry
Potřebujeme zobrazit všechny filmové žánry, resp. jedince z třídy Genre.
K tomu potřebujeme predikát, který umí manipulovat s jedinci. Využijeme proto predikát
z knihovny abox, tj. abox:hasIndividual. Do češtiny se dá tento dotaz přeložit takto:
"Za podmínky, že třída Genre má nějaké jedince, pak mi tyto jedince vyber (dej na výstup) a zároveň sloupci, ve kterém
budou výsledky zobrazeny, dej jméno FilmGenres."
abox:hasIndividual(Genre, ?genre)
->
sqwrl:select(?genre) ∧ sqwrl:columnNames("FilmGenres")
Dotaz č. 6: filmové kategorie
Potřebujeme zobrazit všechny filmové kategorie, resp. podtřídy třídy Film.
K tomu potřebujeme predikát, který umí zjistit podtřídy určité třídy. Využijeme proto predikát
z knihovny tbox. Do češtiny se dá dotaz přeložit takto:
"Za podmínky, že podtřída v proměnné ?category je podtřídou třídy Film, pak mi ji dej na výstup do sloupce, který
bude pojmenován jako CategoryOfFilm"., tj. tbox:.
tbox:isDirectSubClassOf(?category, Film)
->
sqwrl:select(?category) ∧ sqwrl:columnNames("CategoryOfFilm")
Dotaz č. 7: filmy seřazené vzestupně a sestupně
Pro tento dotaz využijeme predikáty pro řazení výsledků, resp.
pro vzestupné řazení lze použít sqwrl:orderBy a pro sestupné
sqwrl:orderByDescending.
hasYearOfProduce(?film, ?year)
->
sqwrl:select(?film, ?year) ∧ sqwrl:orderBy(?film) ∧ sqwrl:columnNames("Film", "YearOfProduction")
hasYearOfProduce(?film, ?year)
->
sqwrl:select(?film, ?year) ∧ sqwrl:sqwrl:orderByDescending(?film) ∧ sqwrl:columnNames("Film", "YearOfProduction")