Ian Horrocks ir viens galvenajiem secinātāju būves ideologiem. Ir vērts palasīt, ko viņš raksta par sava secinātāja pirmo versiju FaCT (Fast Classification of Terminologies) - sk. http://www.cs.man.ac.uk/~horrocks/FaCT/. Ievērojiet, kas FaCT tiek saukts par klasifikatoru, nevis par secinātāju. Pastrādājot ar t.s. secinātājiem tā arī liekas - tie vislabprātāk risina ontoloģiju konsistences uzdevumu un klasifikācijas uzdevumu (sk. tālāk).
Modernizēto versiju FaCT++ (vienu no šobrīd labākajiem secinātājiem) var lejupielādēt no adreses http://owl.man.ac.uk/factplusplus/. Jāņem ir precompiled binaries for Windows. Tā ir zip-datne, kas jāatspiež atsevišķā mapē. Rezultātā tur parādās viena exe-datne un viena dll-datne. Ja exe-datni piestartē, tad atveras nejūtīgs "melnais logs", kurā paziņots, ka tagad FaCT++ ir pieejams caur portu 3490.
Kā noskaidrojis kolēģis Ģirts Strazdiņš, FaCT++ nav nekādas "ar roku" vadāmas saskarnes. Tāpēc vienīgā iespēja ar to padarboties - izmantot kādu rīku, kurš pratīs sarunāties caur portu 3490.
Līdzīgi uzvedas arī cits nopietns secinātājs - Racer. Tas tagad ir komerciāls produkts Racer Pro 1.9 - sk. http://www.racer-systems.com. Ir paredzēta arī bezmaksas studentu licence - sk. http://www.racer-systems.com/products/download/education.phtml.
Pēdējo nekomerciālo versiju Racer v.1.7.24 arī vēl kaut kur var dabūt. Tā ir datne racer.exe, kas startējot, tāpat kā FaCT++, parāda nejūtīgu "melno logu", kur minēts ports 8080.
Vēl viens secinātājs, ko esot vērts pamēģināt, ir Pellet - sk. http://www.mindswap.org/2003/pellet/index.shtml. Īsu aprakstu sk. http://iswc2004.semanticweb.org/posters/PID-ZWSCSLQK-1090286232.pdf.
Lai varētu pastrādāt ar šiem secinātājiem, uz sava datora ir jāuzstāda kāds no ontoloģiju redaktoriem, kas atbalsta t.s. DIG saskarni (sk. tālāk). Viens no tādiem ir Protege - sk. http://protege.stanford.edu. Versiju Protege 3.3.1 var lejupielādet, ja reģistrējas. Jāņem pilna versija ar visu Java mašīnu (man citādi nesanāca).
Ja gribam izmantot secinātāju, tad tam un Protege ir jābūt palaistiem un Protege izvēlnē OWL - Preferences dialogā ir jāiestāda Reasoner URL, uzrādot tur vajadzīgo porta numuru (piemēram, darbam ar FaCT++ jāiestāda http://localhost:3490).
Protege
Jauna projekta radīšana
To var izdarīt caur File - New Project.
Projekta saturs, liekas, vienmēr ir ontoloģija (t.i. klases - OWLClasses, asociācijas - Properties, klašu instances - Individuals, un linki). Projektiem var būt vairāki tipi - tas, liekas, nozīmē datu glabāšanas formātu. Piemēram, izvēloties tipu OWL/RDF Files, projekta datus glabās *.owl datnes formā.
Saglabājot jauno projektu, ieteicams izveidot tam atsevišķu mapi (File - Save Project), tad tajā glabāsies visas projekta datnes (xxxxxxxx - projekta vārds)
xxxxxxxxx.pprj (projekta "galva", desktop utt.)
xxxxxxxxx.repository (?)
xxxxxxxxx.owl (projekta dati OWL formātā - ja izvēlēts tips OWL/RDF
Files, sk. piemēru).
Esoša projekta apskatīšana un koriģēšana
Jau esošu projektu var atvērt ar File - Open (tad jāzina projekta datnes *.pprj atrašanās vieta), vai ar File - Open Recent (tad pietiek zināt projekta vārdu, piemēram, pizza vai newspaper).
Piemēra pēc atveriet projektu pizza un tad lasiet tālāk. Šī ontoloģija ir ĻOTI labs piemērs, un to ir vērts izskatīt visās detaļās.
OWL/RDF Files - šī tipa projektiem, liekas, projekta logs vienmēr sastāv no šādām lapām:
Metadata (rāda izmantotās importētās
ontoloģijas)
OWL Classes (rāda klašu hierarhiju un ļauj to
apstrādāt)
Properties (rāda asociācijas un ļauj tās
apstrādāt)
Individuals (rāda klašu instances un ļauj tās
apstrādāt)
Forms (?)
Lapa OWL Classes
Kreisajā pusē ir kolapsējama/ekspandējama klašu hierarhija.
Labajā pusē apakšā ir lodziņš Disjoints, kur tekošajai klasei redzamas tās klases, ar ko tā (pēc definīcijas) nešķeļas. Veidojot savu ontoloģiju, šos disjointness faktus vajag rūpīgi reģistrēt. Piemēram, ja Jūs personu klasi dalāt studentos un pasniedzējos, tad uzreiz formulējiet, ka šīs klases ir disjoint.
Labajā pusē vidū ir lodziņš Asserted Conditions, kur tekošajai klasei redzami tai uzliktie ierobežojumi (constraints, conditions). Katra necessary ierobežojuma beigās ir zīme <=, kas nozīmē, ka tekošā klase ir apakšklase tai klasei, ko definē ierobežojums. Katra necessary &sufficient ierobežojuma beigās ir zīme =, kas nozīmē, ka ierobežojums tekošo klasi būtībā definē.
Vienkāršākais necessary ierobežojuma veids - apakšklase, piemēram, Pizza <= DomainConcept.
Sarežģītākus ierobežojumus raksta, izmantojot valodu, kas izvēlēta OWL - Preferences logā. Noklusējums ir Manchester OWL Syntax, bet var izvēlēties arī mums jau pazīstamo aprakstošo loģiku sintaksi - DLSyntaxClassDisplay.
Piemēram, Mančesteras sintaksē:
Pizza <= hasBase some
pizzaBase (jeb DL sintaksē: E hasBase.pizzasBase)
vai
RealItalianPizza <= hasBase only
ThinAndCrispyBase (jeb A hasBase ThinAndCrispyBase).
Necessary & sufficient ierobežojuma piemērs (divi
ierobežojumi kopā):
RealItalianPizza <= Pizza
RealItalianPizza <= hasCountryOfOrigin has
Italy (jeb E hasCountryOfOrigin {Italy}).
Šo ierobežojumu definēšanai jāizmanto diezgan jocīga saskarne (kas atveras, ja uz ierobežojuma taisa dubultklikšķi). Jaunus ierobežojumus var pievienot ar ikonu palīdzību: Create new expression un Create restriction. Ievada apstiprināšanai jānospiež zaļā poga.
Var izmantot arī popup menu, kas atveras uz ierobežojumu rindas vai uz rindas Necessary & sufficient - tur ir komandas:
Create new necessary & sufficient block (šāds
bloks var sastāvēt no vairākām izteiksmēm);
Edit expression in multi-line editor (tas ir ērtākais
veids, ka koriģēt izteiksmes).
Ja nepieciešams fiksēt, ka apakšklases "noklāj"
augšklasi, tad jāraksta atiecīgais ierobežojums, piemēram:
Persona <= Pasniedzejs v Students.
Lapa Properties
Kreisajā pusē ir īpašību (properties) saraksts. Īstenībā tās ir asociācijas.
Labajā pusē tekošajai īpašībai
parādītas šādas lietas:
Domain klase
Range klase
Speciālie raksturojumi: Functional, Inverse functional,
Symmetric, Transitive
Inversās īpašības vārds.
Jaunas īpašības var definēt kreisās puses lodziņā ar ikonas Create object property palīdzību. Īpašības vārdu vajag tūlīt ierakstīt loga augšā. Tad vajag izvēlēties domain un range klasi un speciālos raksturojumus (ja vajag). Tūlīt vajag nodefinēt arī inverso īpašību un sasaistīt abas kopā (pa labu apakšā ir ikona Set inverse property). To nevajag atlikt!
Aprakstošo loģiku sintakse neparedz iespēju atklāti uzdot lomas domain un range, t.i. kaut ko šādu: r(x,y)->D(x)&R(y), kur r ir loma, bet D, R - klases. Bet to var izdarīt netieši - ievedot aksiomas: Er.T <= D; Er-1 <= R.
Sk. vienkāršas ontoloģijas piemēru (OWL formātā): tajā ir tikai divas klases Klase1 un Klase2, abas disjoint, asociācija asoc12 no Klase1 uz Klase2 (tā ir functional property, t.i. katrai Klase1 instancei atbilst ne vairāk kā viena Klase2 instance), un tās inversā asociācija asoc21 (tā tad automātiski iznāk inverse functional property).
Lapa Individuals
Kreisajā pusē ir kolapsējama/ekspandējama klašu hierarhija.
Labajā pusē tekošajai klasei tiek rādīts tās instanču (indivīdu) saraksts - lodziņš Asserted Instances.
Ar ikonas Create instance palīdzību var radīt jaunas instances. Instances vārdu vajag tūlīt ierakstīt loga augšā. Linkus var nodefinēt pa labi esošajos lodziņos ar asociāciju vārdiem, izmantojot ikonas Add.
Check consistency
Izveidotās ontoloģijas pareizību var katrā laikā pārbaudīt, izsaucot secinātāju ar izvēlnes komandu OWL - Check Consistency. Secinātājam šai brīdī jābūt jau palaistam. Rezultātā parādās secinātāja lodziņš, kurā kļūdu gadījumā kāda rindiņa noteikti būs sarkana. Informāciju par kļūdas raksturu nav tik viegli atrast: to var meklēt secinātāja melnajā logā, paša Protege melnajā logā, kā arī secinātāja mapē esošajās datnēs taxonomy.log un taxonomy.roles.
"Nosaukt pretrunu vārdā" vai parādīt tās atrašanās vietu nav nemaz tik vienkārši. Piemērs no picu ontoloģijas: tur klase IceCream ir nodefinēta kā disjoint ar klasi Pizza, bet tai ir ievesta arī aksioma IceCream <= E hasTopping FruitTopping. Un vēl: lomai hasTopping ir nodefinētas klases: domain=Pizza un range=PizzaTopping. No tā seko, ka IceCream ir apakšklase klasei Pizza, kas ir pretrunā ar to, ka abas šīs klases ir disjoint. Kur tad te ir pretruna: a) Vai klases IceCream un Pizza nav disjoint? b) Vai uz klasi IceCream nevajadzēja attiecināt lomu hasTopping? c) Vai lomai hasTopping nevajadzēja definēt tik šauru domain klasi? Pretrunas cēlonis var būt jebkurš no trijiem. Ko tad prasīt no secinātāja programmas?
Protege melnajā logā parādās ziņojums: "Attempted to assign duplicate values to IceCream.protege:inferredSubclassOf". T.i. secinātājs FaCT++ ir konstatējis, ka klasi IceCream ir jāiekļauj "otrā" augšklasē, kas ir disjoint ar pirmo. Tā nu ir secinātaja "iekšējā loģika", un šādā veidā atradis pretrunu, tas ar sarkanu iezīmē klasi IceCream.
Classify taxonomy
Šo pakalpojumu izsauc, izvēloties komandu OWL - Classify taxonomy. Tā ir noderīga lieta - izmantojot visu, kas pateikts ontoloģijas definīcijā, precizēt klašu hierarhiju, kas dota ontiloģijas definīcijā (Asserted Hierarchy). Šī precizētā hierarhija (Inferred Hierarchy) tiek parādīta atsevišķā SUBCLASS EXPLORER logā.
Kā secinātāja programma to dara? Katrām divām ontoloģijas klasēm X, Y tā pārbauda, vai neizpildās X<=Y, vai Y<=Y. Ja izpildās X<=Y, un ontoloģijā tāda aksiomas nav, tad tā tiek iekļauta klasifikācijas rezultātos. Šos papildinājumus var ieraudzīt Protege loga apakšā.
Piemēram, klase TobascoPepperSauce ir
definēta ka SauceTopping apakšklase un ar ieobežojumu
E hasSpiciness Hot. Bet tā kā klase SpicyTopping
ir definēta kā E hasSpiciness Hot, tad TobascoPepperSauce
pienākas vēl viena augšklase - SpicyTopping, tāpēc
secinātājs paziņo:
TobascoPepperSauce = Added SpicyTopping
Cits piemērs: klase FruitTopping ir
definēta kā apakšklase klasei PizzaTopping, bet klase
VegetarianTopping - kā PizzaTopping
apakšklase, un arī kā klašu apvienojums
VegetableTopping CheeseTopping HerbSpiceTopping FruitTopping
NutTopping SauceTopping,
tad FruitTopping atrašanās vietu klašu
hierarhijā var precizēt, ko secinātājs arī dara, paziņojot:
FruitTopping = Moved from PizzaTopping
to VegetarianTopping
Tas nozīmē, ka ontoloģījas definīcijā mēs
ierobežojumu FruitTopping <= PizzaTopping varam
aizstāt ar FruitTopping <= VegetarianTopping.
Protams, šādā veidā secinātājs konstatē arī tos gadījumus, kad divas klases ir loģiski ekvivalentas. Picu ontoloģijā ir viens tāds gadījums - klase SpicyPizza ir ekvivalenta ar klasi SpicyPizzaEquivalent.
Beigās mums ir iespēja Assert selected change(s) - varam atzīmēt tās Added/Moved komandas, kuras vēlamies iekļaut ontoloģijā (kā piemirstas lietas, ko secinātājs mums atgādinājis) un palūgt secinātajam to izdarīt.
Ontoloģijas grafiska attēlošana
Šādu iespēju dod Protege pieslēgtais vizualizators Jambalaya. To var izsaukt no klašu hierarhijas lodziņa ar popup menu starpniecību - izvēloties kādai klasei Show Neighbourhood, Show Subclass Tree, vai Show Superclass Tree. Par grafikas kvalitāti spriediet paši. Izmēģiniet ikonas ar attēlošanas stiliem. Ja vajadzīga drukājama bilde, tad visus diagrammas elementus nākas pašam pārvilkt uz kaut cik sakarīgām vietām.
Izvēlne Code
Show DIG code - parāda lodziņā projekta datus t.s. DIG formātā (tādā tos nodod secinātājam). Piemēram, DIG kods minētajam vienkāršajam ontoloģijas piemēram.
Show RDF/XML source code - minētajai vienkāršajai ontoloģijai tad sanāk šāds kods.
Izvēlne Tools
Generate OWLDoc - ģenerē daudz HTML failu, kuros sakārtota informācija par visiem ontoloģijas elementiem. Vēlams to darīt jaunā tukšā mapē.
Mans ontoloģijas piemērs - Universitāte. Lejupielādējiet un atveriet to savā ontoloģiju redaktorā.
Pārtulkosim šo ontoloģiju aprakstošo loģiku valodā.
T-kaste
Kurss <= owl:Thing
Persona <= owl:Thing
Kurss ^ Persona <= O (disjointness, O -
tukšā klase, vai arī: Kurss <= -Persona)
CITS_kurss <= Kurss
DZ_kurss <= Kurss
MAT_kurss <= Kurss
CITS_kurss ^ DZ_kurss <= O (disjointness)
CITS_kurss ^ MAT_kurss <= O (disjointness)
MAT_kurss ^ DZ_kurss <= O (disjointness)
Kurss <= MAT_kurss v DZ_kurss v
CITS_kurss
Pasniedzejs <= Persona
Students <= Persona
Pasniedzejs ^ Students <= O (disjointness)
Persona <= Pasniedzejs v Students
nem_students = nem_kursu-1
(InverseOf)
E nem_students.T <= Kurss (jeb: {x | Ey(x
nem_students y)} <= Kurss)
E nem_kursu.T <= Students (jeb: {x | Ey(x
nem_kursu y)} <= Students)
Šīs divas aksiomas izsaka to, ka domain(nem_students)=Kurss un range(nem_students)=Students. Kā redzam, šī vienkāršā lieta mums te jāfiksē mazliet samocītā veidā.
maca_pasniedzejs = maca_kursu-1
(InverseOf)
A maca_pasniedzejs.T <= Kurss
A maca_kursu.T <= Pasniedzejs
Kurss <= (<= 1)maca_pasniedzejs.T (Functional)
Šīs divas aksiomas izsaka to, ka domain(maca_pasniedzejs)=Kurss un range(maca_pasniedzejs)=Pasniedzejs un to, ka katru kursu māca ne vairāk kā viens pasniedzējs.
Vēl mums bija ierobežojums pasniedzējiem: ja kāds māca vienu matemātikas kursu, tad tas var mācīt tikai matemātikas kursus. Protege ierobežojumu valodā (Necessary condition) tas izskatās šādi:
Pasniedzejs <= not (maca_kursu some MAT_kurss) v maca_kursu only MAT_kurss
Aprakstošo loģikā valodā tam atbilst:
Pasniedzejs <= -(E maca_kursu.MAT_kurss) v (A maca_kursu.MAT_kurss)
Varējām uzrakstīt arī saprotamāk:
E maca_kursu.MAT_kurss <= A maca_kursu.MAT_kurss
A-kaste
KCITS: CITS_kurss
KDZ1: DZ_kurss
KDZ2: DZ_kurss
KDZ3: DZ_kurss
KDZ4: DZ_kurss
KMAT1: MAT_kurss
KMAT2: MAT_kurss
P1: Pasniedzejs
P2: Pasniedzejs
P3: Pasniedzejs
P4: Pasniedzejs
S1: Students
S2: Students
S3: Students
S4: Students
S5: Students
(P1, KMAT1): maca_kursu
(P1, KMAT2): maca_kursu
(P2, KDZ3): maca_kursu
(P2, KDZ4): maca_kursu
(P3, KDZ1): maca_kursu
(P3, KDZ2): maca_kursu
(P4, KCITS1): maca_kursu
Vaicājumi
Uzzināt, kuri pasniedzēji māca studentu S1:
Protege ierobežojumu valodā (Necessary & sufficient condition) tas izskatās šādi:
maca_kursu some (nem_students some {S1})
Aprakstošo loģikā valodā tam atbilst:
Vaicajums_1 <= owl:Thing
Vaicajums_1 = E maca_kursu.(E nem_students.{S1})
Atbilde, ko dod secinātājs: P1, P3 (lai to iegūtu, lapā OWL Classes uz klases Vaicajums_1 jāatver popup menu un jāizvēlas Inference - Compute individuals belonging to class).
Nopietnākai studēšanai:
Matthew Horridge. A Practical Guide To Building OWL Ontologies With The Protégé-OWL Plugin (PDF).
Tagad ir vērts palasīt kursa grāmatas 10.nodaļu "Conceptual Modeling with Description Logics". Un apskatīt trīs ontoloģijas, ko izveidojis Ian Horrocks (avots - ProtegeOntologiesLibrary):
ka.owl: Defines concepts from academic research.
not-galen.owl: A selective adaptation made in 1995 of an early prototype GALEN model; content is not related to or representative of any current or historical OpenGALEN release.
Redzams, ka Ian Horrocks vispār neizmanto iespēju asociācijām uzrādīt domain un range klases. Tā vietā viņš formulē ierobežojumus. Piemēram, ontoloģijā ka.owl asociācija p1:affiliation netiek vis definēta kā asociācija ar domain klasi p1:Employee un range klasi p1:Organization, bet gan kā necessary ierobežojums klasei p1:Employee:
p1:Employee <= p1:affiliation only p1:Organization (jeb Employee <= A affiliation.Organization).
T.i. darbinieks var būt biedrs tikai organizācijās.
Līdzīgi kolēģis rīkojas ar klašu atribūtiem, piemēram, personas adrese parādās tikai kā necessary ierobežojums:
p1:Person <= p1:address only string,
kur p1:address ir datatype, kam range uzdots kā Any. Tas, ka personai var būt adrese un tas ka adrese ir string (viens no Protege iebūvētajiem datu tipiem), ir pateikts tikai ar necessary ierobežojuma palīdzību.
Kāpēc kolēģis tā dara? Kursa grāmatas autori 10.nodaļā skaidro, ka viena no aprakstošo loģiku izmantošanas priekšrocībām modelēšanā ir iespēja izsecināt par objektu klasifikāciju to, ko modelētājs pats vēl nav iedomājies. Lai secinātājam šī iespēja "tiktu pilnā apjomā", neviens atribūts vai asociācija nedrīkst būt "pirms laika" piedefinēts noteiktām objektu klasēm. T.i. atribūti un asociācijas sākumā tiek ievestas kā patstāvīgi "tipi". Pēc tam - tām objektu klasēm, kam tie "pienākas" - tiek rakstīti attiecīgi necessary ierobežojumi. Tad secinātājs pats var pats "savilkt kopā" tos objektus, kam ir vienādi atribūti un asociācijas.
Tā es saprotu to ontoloģiju "dīvainību", kuras veidojis kolēģis I. Horrocks.
Izlasīju minēto kursa grāmatas 10.nodaļu. Cilvēkam, kurš tikai "studē tēmu", šī nodaļa var likties pārāk abstrakta un/vai saraustīta. Te aprakstītas diezgan daudzas modelēšanas situācijas, ar kurām var sekmīgi tikt galā tikai tad, ja cilvēks pats nonāk pie "pareizās" idejas, vai arī to aizgūst no citiem - piemēram, no šīs grāmatas. Tāpēc man liekas, ka grāmatas 10.nodaļa noteikti būs interesanta tiem cilvēkiem, kuri savā darbā ir spiesti nodarboties ar ontoloģiju veidošanu. "Nesaprotamu" situāciju gadījumā viņiem, manuprāt, būs vērts palapot šo nodaļu (un tos rakstus, kas tajā minēti).