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 OWL 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.