Ontologien in XHTML/RDFa

Für's Erste stehen hier nur meine Notizen und Anmerkungen zu diesem Thema. Noch bin ich dabei, eine vernünftige Notation zu entwickeln. Der Inhalt dieser Seite wird sich also in nächster Zeit sehr ändern.

Ontologie: Ein Schema für Dinge und Klassen

Bei Ontologien geht es zunächst mal in erster Linie um zwei Themen: Dinge und Klassen. Dinge, das sind schlicht all die Dinge, die wir aus dem Alltagsleben so kennen. Und Klassen sind abstrakte Begriffe, denen wir die Dinge zuordnen.

Beispiel

Nehmen wir als Beispiel einmal den Begriff Buch. Man könnte auf den ersten Blick meinen, das wäre ein Ding. Ist es aber nicht. Denn es ergibt sich die Frage: Welches Buch denn? Gut, nehmen wir also ein konkretes Buch. Dieses Buch habe den Titel "Harry Potter und der Stein der Weisen". Desweiteren habe dieses Buch einen Author namens Joanne K. Rowlings. Dies ist in der Tat ein "Ding" im Sinne einer Ontologie. Dieses Ding gehört der Klasse Buch an.

Für's Erste lasse ich mal die Tatsache ausser Acht, dass dieses Ding der Klasse Buch viele Attribute hat (Titel, Author, ISBN, ...). Der Einfachheit halber setze ich mal den Titel gleich mit dem Ding. Und nun versuche ich mal, das in auszudrücken:

Klasse

owl:Class rdf:ID="Buch"/

Damit wird die Klasse "Buch" definiert. Hergeleitet habe ich dies einfach aus dem Web Ontology Language Guide des W3C. Sollte eigentlich klar und einfach sein.

Ding

Und nun das konkrete Individuum, das Buch "Harry_Potter_und_der_Stein_der_Weisen".

owl:Thing rdf:ID="Harry_Potter_und_der_Stein_der_Weisen"/ owl:Thing rdf:about="#Harry_Potter_und_der_Stein_der_Weisen" rdf:type rdf:resource="#Buch"/ /owl:Thing

Die erste Zeile benennt ein Ding namens "Harry_Potter_und_der_Stein_der_Weisen". Die anderen drei Zeilen sagen aus, dass dieses Ding zur Klasse "Buch" gehört. Dieses Beispiel ist ebenfalls abgeleitet aus dem Web Ontology Language Guide.

HTML

Diese Beziehung kann man zunächst auch einfach in HTML modellieren. Dazu kann man mit der Klasse "Buch" beginnen. Da es hier um eine Definition geht, ist das dfn Element genau richtig:

dfn class="Class" id="Buch"Buch/dfn

So einfach ist das. Man könnte ein Microformat draus machen (noch hat das Ganze aber Nichts mit RDFa zu tun). Diese Definition könnte nun irgendwo innerhalb einer Webseite stehen. Das Attribut class="Class" besagt, dass es sich bei dem Inhalt des Containers um den Namen einer Klasse handelt. Zusammen mit dem dfn Element wird hier also eine Klasse definiert. Der Name dieser Klasse ist das, was im id-Attribut steht. Der eigentliche Inhalt des Containers ist nicht der Klassenname, sondern ein sogenanntes Label, eine für menschliche Leser optimierte Schreibweise.

Das Ganze besagt nicht mehr als schlicht und einfach, dass es sich bei dem Begriff "Buch" um eine Klasse handelt. Also um einen abstrakten Begriff, dem konkrete und individuelle Dinge zugeordnet werden können. Also definiere ich mal zunächst ein Ding:

dfn class="Thing" id="Harry_Potter_und_der_Stein_der_Weisen"Harry Potter und der Stein der Weisen/dfn

Damit ist dieses "Ding" definiert. Noch fehlt aber der Bezug zur Klasse. Beziehungen werden in HTML mit Hilfe von Ankern (a) und den Attributen rel und rev ausgezeichnet. Also kommt um die Definition oben noch ein Anker drum herum. Die Beziehung sagt nicht etwas aus über das Ziel, sondern über die Quelle des Links. Das Ziel des Links ist die Klassendefinition "Buch". Was benötigt wird, ist eine Aussage über die Quelle, die Ding-Definition "Harry_Potter_und_der_Stein_der_Weisen". Also ist hier das Attribut rev das Richtige. Die Komplette Ding-Definition sieht dann so aus:

a href="#Buch" rev="Thing" dfn class="Thing" id="Harry_Potter_und_der_Stein_der_Weisen"Harry Potter und der Stein der Weisen/dfn /a

Das Attribut class="Thing" des dfn Elements ist hierbei redundant (überflüssig). Notfalls ginge es sogar ganz ohne das dfn. Aber da es sich um eine Definition handelt, lasse ich es besser drin. Kompakt sieht das dann so aus:

a href="#Buch" rev="Thing" dfn id="Harry_Potter_und_der_Stein_der_Weisen"Harry Potter und der Stein der Weisen/dfn /a

Dies sagt nun aus, dass das Ding namens "Harry_Potter_und_der_Stein_der_Weisen" der Klasse "Buch" angehört. Oder, umgangssprachlich, dass dieses Ding ein Buch ist.

RDFa

Nun ja, class="Class" und Class="Thing" habe ich mir eben ausgedacht. Man könnte im HTML head Element ein entsprechendes Profil angeben, in dem Sinn und Zweck dieser Klassennamen beschrieben wird. Allerdings kann man auch viele verschiedene Profile angeben. Damit ergeben sich wahrscheinlich früher oder später Namenskonflikte. In XML ist das durch die Namensräume verhindert. RDFa greift nun genau darauf zurück. Die Namensräume werden durch das namespace Attribut festgelegt, und den Klassenbezeichnern wird der Namensraumpräfix vorangestellt. Wie man sofort sehen kann, ist dies nur für XHTML geeignet. In der hier vorgestellten Form allerdings bereits für XHTML 1.0. Damit sieht dann das XHTML so aus (Namensraumdefinition mal weggelassen):

dfn class="owl:Class" id="Buch"Buch/dfn [...] a href="#Buch" rev="owl:Thing" dfn id="Harry_Potter_und_der_Stein_der_Weisen"Harry Potter und der Stein der Weisen/dfn /a [...]

Man beachte, dass es sich bei dem Inhalt des href Attributes um eine ganz normale URL handelt. In diesem Fall habe ich mich auf den sogenannten fragment identifier beschränkt. Dies setzt voraus, dass die Klassendefinition und die Ding-Definition in der gleichen Datei sind. Wenn man komplette URLs benutzt, können sich diese Definitionen aber auch an ganz verschiedenen Orten auf der Welt befinden.

Nicht immer ist es wünschenswert oder sinnvoll, die Beziehung eines Dings und einer Klasse klickbar zu gestalten. Zum Beispiel macht es dann oft keinen Sinn, wenn sich beide Teile in der selben Datei befinden. Um dennoch eine Beziehung formulieren zu können, muss man etwas tiefer in die RDFa Trickkiste greifen. Dazu werden ein paar Spezialitäten benötigt, die es eigentlich erst ab XHTML 2.0 gibt. Weil diese Spezialitäten aber so nützlich sind, hat uns das W3C mit RDFa einen Zwischenschritt beschert. Dazu benötigt man zunächst einen neuen DOCTYPE:

!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd"

Danach macht man sich zwei Dinge znutze: Das rev Attribut kann man beliebigen Elementen zurodnen (also auch dfn), und es gibt das Attribut resource. Damit liesse sich dann die Ding-Definition so ändern:

dfn id="Harry_Potter_und_der_Stein_der_Weisen" rev="owl:Thing" resource="#Buch"Harry Potter und der Stein der Weisen/dfn

Damit hat man dann mit einem schlichten dfn definiert, dass es sich bei diesem Ding um ein Buch handelt. Diese Definition ist in dieser Form für Computer verständlich. Menschliche Leser wissen das auch ohne diese Definition. Doch dem Computer fehlt all unser implizites Wissen. Dem Computer muss Alles explizit gesagt werden. Zum Beispiel so. Für Menschen sieht das dann einfach so aus:

Das Buch Harry Potter und der Stein der Weisen ist ein Renner.