Vorlesung Semantic Web Technologien - Sommersemester 2011 - Steffen Schlönvoigt

Übungsblatt 5


Auf dem per WTS zu erreichenden Server “Lenny” ist das Programm Protégé (http://protege.stanford.edu/) in verschiedenen Versionen installiert. Wir werden das Programm verwenden um eine OWL Ontologie zu erstellen mit der wir die Funktionalität von OWL näher beleuchten wollen.

Aufgabe 1: Erstellen sie eine neue Ontologie

1. Starten Sie Protege - wählen Sie sich dazu auf Lenny ein und starten eine 4er Version von Protege

2. Auf der Willkommensseite drücken Sie den Knopf zur Erstellung einer neuen OWL Ontologie

3. Ein Dialog zur Erstellung einer Ontologie URI wird erscheinen. Jede Ontologie besitzt eine eindeutige URI. Ersetzen Sie die vorgegebene URI mit
http://www.pizza.com/ontologies/pizza.owl

und bestätigen die Bearbeitung.

4. Sie sollten die Ontologie auch in einer Datei auf ihrem PC/dem Server speichern. Wählen Sie ein Verzeichnis und benennen Sie die Datei beispielsweise “pizza.owl”. Schließen Sie dann den Dialog ab.

Nach kurzer Zeit öffnet sich Protege mit der neuen Ontologie. Machen Sie sich zunächst erst einmal mit dem User Interface vertraut.

Der Tab “Active Ontology” erlaubt uns Informationen über die Ontologie einzustellen. Beispielsweise kann hier die Ontologie-URI angepasst werden, Annotationen wie etwa Kommentare können angelegt und bearbeitet werden sowie Namespaces und Importe verwaltet werden.

Legen Sie nun zur Übung einen Kommentar an.

Klicken Sie dafür in der Annotations View auf das Symbol , wählen Sie im sich öffnenden Dialog die vordefinierte Property URI für “comment” und geben Sie einen Kommentar ein (z.B. “Diese Ontolgie klassifiziert Pizzen z.B. anhand ihrer Beläge”).

Benannte Klassen

Wechseln Sie nun auf den Reiter “Classes”. Dieser enthält momentan lediglich die Klasse “Thing” welche in OWL die Oberklasse aller Klassen repräsentiert. OWL Klassen muss man sich immer als Menge von Individuen vorstellen. Thing ist hiermit die Menge aller Indviduen.

Lassen Sie uns nun ein paar Klassen anlegen:

Legen Sie die Klassen “Pizza”, “PizzaBelag” und “PizzaBoden” als Unterklassen von “Thing” an. Wählen Sie dazu die Klasse “Thing” aus und drücken den Button “Add Subclass”. Sobald sie die erste Unterklasse von Thing erstellt haben, können sie auch den Button “Add Silbling Class” verwenden um Klassen auf der gleichen Hierarchieebene zu erstellen.

Disjunkte Klassen

Ein Individuum kann nicht gleichzeitig mehreren unserer gerade erstellten Klassen angehören.

In OWL wird aber angenommen, dass sich Klassen grundsätzlich überlappen können. Wir müssen die Klassen deshalb als zueinander disjunkt klassifizieren.

Wählen Sie dazu eine der Klassen und klicken sie auf das (+) neben der Property “Disjoint Classes”. Im sich öffnenden Dialog wählen Sie die beiden anderen Klassen aus und drücken dann “OK”.  Protege zeigt die beiden Klassen nun unterhalb der Property an:

Wenn Sie sich die anderen Klassen ansehen, werden Sie feststellen, das Protege die Eintragung hier bereits automatisch vorgenommen hat.

Verwendung des “Create Class Hierarchy” Tools

Wir wollen nun verschiedene Pizzaböden anlegen. Da es relativ mühsam ist, jede Klasse einzeln anzulegen und sie dann wieder als disjunkt voneinander zu deklarieren, verwenden wir hierfür nun eines der von Protege bereitgestellten Tools.

1. Selektieren Sie die Klasse PizzaBoden in der Klassenhierarchie.

2. Aus dem Tools Menü wählen sie anschließend den Punkt  `Create Class Hierarchy...'.

3. Übernehmen Sie den Vorschlag PizzaBoden als “Root” Klasse zu verwenden. Fahren Sie mit dem Knopf “Continue” fort.

4. Wir müssen nun in die große Textbox die Namen der Klassen eintragen, die wir erstellen wollen. Hierzu geben wir jeden Klassennamen in eine eigene Zeile ein. Wir erstellen nun die Klassen “DuennerUndKnusprigerBoden” und “LuftigWeicherBoden”. Drücken Sie anschließend den “Continue” Knopf.

5. Versichern Sie sich, dass auf der nächsten Seite die Checkbox `Make all new classes

disjoint' markiert ist und schließen Sie dann den Dialog ab.

Wenn man sich vorstellt, dass man einen ganzen Haufen Klassen erstellen muss, sieht man wie hilfreich das Tool sein kann. Das Tool bietet noch einige weitere Möglichkeiten. So kann man etwa einen Suffix oder Prefix festlegen, der dann an jede der Klassen angehängt oder vorangestellt wird. Außerdem lassen sich mit Tabulatoren direkt Hierarchien erzeugen.

Probieren wir das doch gleich mit den Belägen:

1. Selektieren Sie die Klasse PizzaBelag in der Klassenhierarchie.

2. Aus dem Tools Menü wählen sie anschließend den Punkt  `Create Class Hierarchy...'.

3. Übernehmen Sie den Vorschlag PizzaBelag als “Root” Klasse zu verwenden. Fahren Sie mit dem Knopf “Continue” fort.

4. Geben Sie in die Suffix Box “Belag” ein.

5. Wir müssen nun in die große Textbox die Namen der Klassen eintragen, die wir erstellen wollen. Hierzu geben wir jeden Klassennamen in eine eigene Zeile ein. Durch Einrücken mit der Tabulatortaste erzeugen wir eine Hierarchie. Versuchen Sie folgende Hierarchie zu erstellen:

5. Versichern Sie sich, dass auf der nächsten Seite die Checkbox `Make all new classes distinct” selektiert ist und schließen Sie die Dialog ab.

Properties / Rollen

Properties bzw. Rollen stellen Beziehungen dar. In OWL unterscheiden wir zwischen ObjectProperties und DatatypeProperties. Während ObjectProperties Beziehungen zwischen zwei Individuen beschreiben, geben DatatypeProperties Daten eines Individuums an. Als dritte Art von Property gibt es noch die sogenannten AnnotationProperties. Diese dienen zur Angabe von Meta-Daten und werden etwa dazu verwendet zu beschreiben wer wann eine bestimmte Klasse zu einer Ontologie hinzugefügt hat.

Wir werden uns jetzt zunächst nur mit den ObjectProperties beschäftigen. Wechseln Sie dazu auf den ebenso bezeichneten Tab. Analog zu vorher bei den Klassen können Sie nun die “topObjectProperty” (eine Eigenheit von Protege - sozusagen das Property-Equivalent zur Thing Klasse) selektieren und für diese eine Subproperty erstellen.

Erstellen sie auf diese Weise nun die Property “hatZutat”.

Hinweis: Wie Ihnen bestimmt bereits aufgefallen ist, gibt es auch bei OWL Namenskonventionen. Ähnlich wie bei Java werden Klassen auch hier groß geschrieben und einzelne Wortbestandteile durch CamelCase sichtbar gemacht. Properties werden in der Regel klein geschrieben und beginnen meistens mit der Vorsilbe “hat” oder “ist” (im englischen “has” oder “is”).

Legen Sie nun außerdem als Unterproperties von hatZutat die Rollen “hatBelag” und “hatBoden” an.

Inverse Rollen

Jede ObjectProperty kann eine inverse Property besitzen die quasi für die Gegenrichtung einer Beziehung zuständig ist. Wenn wir beispielsweise die Beziehung “PizzaA hatZutat Tomate” haben, so könnte ja auch ebenso die Bedingung “Tomate istZutatVon PizzaA” gelten. Legen wir also für unsere Beziehungen die jeweils dazu inversen an, also “istZutatVon”, “istBelagVon” und “istBodenVon”.

Dazu gibt es zwei Möglichkeiten. Entweder sie legen zunächst einfach die Properties und bezeichnen Sie anschließend als invers zueinander (Eigenschaft “Inverse Properties” bei einer selektieren Property) oder sie drücken einfach bei der Property zu der sie eine Inverse hinzufügen wollen direkt auf das (+) bei der “Inverse Properties” Eigenschaft und können dort direkt die Inverse Property erstellen.

Rollencharakteristika

Wir haben in der Vorlesung bereits gelernt, dass Rollen verschiedene Charakteristika annehmen können. Das sind zum Beispiel InverseFunctional, Functional, Transitive usw. (zur Not einfach nochmal im Skript nachschauen).

Wir wollen nun die hatZutat Property als “Transitiv” charakterisieren. Damit können wir zum Beispiel aussagen, dass wenn ein PizzaBelag eine bestimmte Zutat A hat, auch alle Pizzen die diesen PizzaBelag als Zutat haben, diese Zutat A haben.

Selektieren Sie dazu einfach die Property “hatZutat” und aktivieren Sie die CheckBox “Transitive” für diese in der Characterics View:

Wählen Sie außerdem die Inverse Property “istZutatVon” und markieren sie die Transitive Charakteristik auch dort.

Hinweis: Die Inverse einer transitiven Property sollte immer auch transitiv sein. Eine transitive Eigenschaft kann außerdem niemals funktional sein.

Wir wollen nun aussagen, dass eine Pizza immer nur einen Boden haben kann. Es gibt verschiedene Wege das zu tun, wir werden nun aber einfach die “hatBoden” Eigenschaft als funktional charakterisieren. Dies bedeutet, dass es zu jedem Individuum des Typs Pizza nur ein Individuum geben darf, dass als dessen Boden bezeichnet wird. Würde es die beiden Beziehungen “PizzaA hatBoden Boden1” und “PizzaA hatBoden Boden2“ geben, müssten wir davon ausgehen dass Boden1 und Boden2 lediglich unterschiedliche Namen für das selbe Individuum sind.

Markieren sie also die “Functional” Charakteristik für die “hatBoden” Property.

Domains und Ranges von Properties

In OWL werden Domains und Ranges nicht als Restriktionen angesehen, die überprüft werden - sie werden für das Reasoning verwendet. Wenn wir “PizzaBelag” als Range für die hatBelag Property angeben und wir ein Axiom “PizzaA hatBelag EisCreme” antreffen, würde dies nicht zu einem Fehler führen sondern dazu, dass EisCreme der Klasse PizzaBelag zugeordnet wird.

Legen Sie also jetzt die Klasse PizzaBelag als Range für die hatBelag Property fest. Selektieren sie dazu die Property “hatBelag” und drücken Sie in deren Eigenschaften auf das (+) neben “Range”, wechseln sie im aufpoppenden Dialog auf den Reiter “Class Hierarchy” und wählen Sie dort die Klasse “PizzaBelag” aus. Fügen Sie dann auf gleiche Weise die Domäne Pizza hinzu und verfahren Sie analog für Domain und Range von hatBoden. Machen Sie das gleiche dann auch für die jeweilgen Inversen.

Beschreibung und Definition von Klassen

In der Vorlesung haben wir gelernt, dass wir Individuen in OWL anhand ihrer Eigenschaften klassifizieren können.

Ein Beispiel wäre: Eine MozzarellaPizza ist eine Unterklasse von Pizzen welche mindestens eine Beziehung zu einem MozzarellaBelag haben.

In OWL beschreibt man solche Sachverhalte als Restriktionen. In der Vorlesung haben wir die folgenden Restriktionstypen kennengelernt:

Existenzielle Restriktionen sind die am häufigsten verwendeten Restriktionen in OWL Ontologien. Wir wollen nun ausdrücken, das jede Pizza mindestens einen PizzaBoden haben muss.

Wechseln Sie also zum “Classes” Tab und selektieren dort die Klasse “Pizza”.

In den Eigenschaften zu Pizza klicken sie auf das (+) Icon neben “Superclasses”.

Wechseln Sie auf den Tab “Object Restriction Creator” und wählen Sie die Property “hatBoden” sowie die Klasse “PizzaBoden” und als Restriktionstyp “some”

Durch die Definition der Restriktion als Superklasse, haben wir diese Restriktion als “notwendig” bezeichnet. D.h. jede Pizza muss mindestens einen PizzaBoden haben. Restriktionen werden üblicherweise als anonyme Klassen angegeben. Damit ist Pizza eine Unterklasse von Dingen die einen PizzaBoden haben.

Wir wollen nun weitere Einschränkungen treffen. Zum Beispiel das eine Margherita Pizza nur Tomaten und Mozzarella als Beläge hat.

Legen Sie unter der Klasse Pizza zunächst eine Klasse BenanntePizza an und darunter die Klasse MargheritaPizza.

Legen Sie dann für MargheritaPizza wie vorher bei der Pizza fest, das Sie Beläge vom Typ Mozzarella und Tomate haben muss (Hinweis: some Restriktionen).

Damit haben wir nun festgelegt, dass eine MargheritaPizza eine BenanntePizza sein muß, die mindestens einen Belag vom Typ MozzarellaBelag und einen Belag vom Typ Tomatenbelag besitzt. Formeller gesagt: Damit etwas eine MargheritaPizza sein kann, ist es notwendig, dass es der Klasse BenanntePizza angehört und es ist notwendig, dass es den anonymen Klassen angehört für die gilt: es muss mindestens eine hatBelag Beziehung zu einem Individuum vom Typ MozzarellaBelag und eine hatBelag Beziehung zu einem Individuum vom Typ TomatenBelag existieren.

Erstellen Sie nun eine Klasse AmericanaPizza die Beläge vom Typ Tomate, Mozzarella und PepperoniWurst besitzen muss. Da diese der Margherita sehr stark ähnelt, erstellen Sie nun einen Clone der Margherita Klasse. Selektieren Sie dazu MargheritaPizza und wählen aus dem Menu Edit -> Duplicate und folgen dem Dialog. Fügen Sie anschließen die weitere Restriktion auf PepperoniWurst.

Erstellen Sie auf gleiche Weise die weitere Klasse AmericanHotPizza die zusätzlich zu den Zutaten der Americana noch Jalapenos enthält und die Klasse SohoPizza die zusätzlich zu den Zutaten der Margherita noch Parmesan und Oliven haben muss.

Nun sollten wir die Unterklassen von BenanntePizza noch disjunkt voneinander machen. Selektieren Sie dazu die Margherita Klasse und wählen aus dem Menu Edit -> “Make primitive siblings dijoint”.

Sie haben nun Ihre erste Ontologie mit komplexen Restriktionen erstellt. Wenn Sie hier noch weiterüben möchten, können Sie auch in das Protege OWL Tutorial schauen, worauf diese Übung basiert: http://owl.cs.manchester.ac.uk/tutorials/protegeowltutorial/resources/ProtegeOWLTutorialP4_v1_3.pdf

Dieses Tutorial ist noch weitaus umfangreicher und demonstriert auch die Verwendung des Reasoners zur Klassifizierung von Individuen usw.