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

Obrázek: SWRLQueryTab

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:

  1. zobrazení všech herců a k nim filmy, ve kterých hráli (bez pojmenování sloupců);
  2. zobrazení všech herců a k nim filmy, ve kterých hráli (s pojmenováním sloupců);
  3. zobrazit počet pohádek evidovaných v OWL ontologii;
  4. výběr jen těch filmů, které byly natočeny po roce 2000 (zobrazte název filmu, rok a pojmenujte oba sloupce);
  5. zobrazit všechny filmové žánry;
  6. zobrazit všechny filmové kategorie;
  7. 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)
->
sqwrl:select(?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.


Spuštění dotazu č. 1

Obrázek: Spuštění dotazu č. 1

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

Obrázek: Výsledky dotazu č. 2

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


Stáhnout soubor

films_query.zip (ontologie s pravidly a dotazy)