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.
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)
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")
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")