RDF-Grundlagen

(Auszug aus "Newsfeeds mit RSS und Atom" von Heinz Wittenbrink, erschienen bei Galileo Press, 2005)

RSS 1.0 unterscheidet sich grundlegend von RSS 2.0 und Atom, weil es den Regeln des Resource Description Framework des World Wide Web Consortium folgt. RDF soll es Maschinen ermöglichen, die Informationen, die in einem RSS-Dokument enthalten sind, automatisch mit Informationen aus anderen RDF-konformen Dokumenten zu verknüpfen und gemeinsam weiterzuverarbeiten. Das bedeutet, dass sich die Maschine so verhält, als könne sie diese Informationen verstehen und aus ihr Schlüsse ziehen. RDF gehört zur Familie der "Künstlichen Intelligenz".

Wie kann es aussehen, wenn Maschinen Informationen aus Webdokumenten automatisch verknüpfen? Ein einfaches Beispiel ist die Verknüpfung von Informationen aus RSS-Dokumenten mit Informationen aus Friend-of-a-Friend-Dokumenten. Friend-of-a-Friend (FOAF)-Dokumente stellen Beziehungen zwischen Menschen dar. (Ich verwende die Verbindung mit FOAF nur als einfaches Beispiel für die Kombination von Vokabularen. Das geschilderte Problem ließe sich einfacher lösen.) Ein FOAF-Dokument beschreibt z. B. das Beziehungsgeflecht einer Person namens Lisa H. und teilt mit, dass sie mit Regina F. und Petra P. befreundet ist und sich für die Musik der Söhne Mannheims interessiert. Lisa H. stellt dieses Dokument auf ihre Website. Sie schreibt außerdem ein Weblog mit einem RSS 1.0-Feed. Dieser Feed bezeichnet Lisa H. als Autorin des Weblogs. Ein Leser des Weblogs Lisa H.s könnte nun mit einer RDF-fähigen Software nach Weblogs von Freunden und Freundinnen Lisa H.s suchen. Die Software findet die Personen in dem FOAF-Dokument. Mit den RSS-Feeds der Weblogs kann sie herausfinden, ob eine dieser Personen als Autor bezeichnet wird. Wenn weitere RDF-Informationen besagen, dass in verschiedenen Einträgen dieser Weblogs von den Söhnen Mannheims die Rede ist, könnten diese zu einem aggregierten Feed zusammengestellt werden. Wenn Sie dieses Beispiel variieren, kommen Sie leicht auf weitere Möglichkeiten, im Web vorhandene Informationen miteinander zu kombinieren.

Warum reichen ein "normales" RSS 2.0-Dokument und ein anderes "normales" XML-Dokument, das die Beziehungen einer Person beschreibt, nicht aus, um die in ihnen enthaltenen Informationen aufeinander zu beziehen? Oder besser: Unter welchen Bedingungen ist es möglich, die Informationen, die in ihnen enthalten sind, maschinell zu kombinieren, also einen Informationspool aus ihnen zu bilden? Wenn man versucht, diese Frage zu beantworten, versteht man einige der Konzepte, die RDF zugrunde liegen. Die Anwendung dieser Konzepte soll sicherstellen, dass die RDF-Informationen für Maschinen lesbar sind und dass alle Identifizierer von Objekten auch bei der maschinellen Verarbeitung eindeutig bleiben.

Tripel als Informationsmodell

Wenn man Informationen zusammenführen will, müssen sie sich nicht nur auf dieselben Objekte beziehen, sie müssen auch eine ähnliche – und das heißt: in irgendeiner Weise gleiche – Struktur besitzen. Einen Satz in einer natürlichen Sprache und einen Datensatz in einer Datenbanktabelle kann man nur dann gemeinsam weiterverarbeiten, wenn man einen von ihnen in die Form des anderen oder beide in eine gemeinsame Form überführen kann. Im Beispiel müssen die beiden Informationen, dass Lisa H. die Autorin des Weblogs "Aus Lisas Welt" ist und dass Petra P. ihre Freundin ist, in eine für eine Maschine verarbeitbare gemeinsame Form gebracht werden. Bei RDF besteht diese Form in "Tripeln" oder Dreiheiten. Zu einem RDF-Tripel gehören zwei Ressourcen, also zwei Objekte, und die Beziehung, die zwischen ihnen besteht. Die Tripel für das Beispiel sind:

"Aus Lisas Welt" (Ressource) wird verfasst von (Beziehung) Lisa H. (Ressource).

Lisa H. (Ressource) ist Freundin von (Beziehung) Petra P. (Ressource).

In der RDF-Terminologie bezeichnet man die erste Ressource als "Subjekt," die Beziehung als "Prädikat" und die zweite Ressource als "Objekt", oder man spricht von einem Subjekt, einer Eigenschaft und einem Wert. Subjekt, Prädikat und Objekt haben dabei folgende Aufgaben:

  • Das Prädikat ordnet dem Subjekt eine Eigenschaft zu.
  • Das Objekt legt für diese Eigenschaft einen Wert fest.

Identifikation durch URIs

Damit Informationen aus verschiedenen Dokumenten zusammengeführt werden können, muss sichergestellt sein, dass sie sich auf dieselben Gegenstände beziehen. Um bei dem Beispiel oben zu bleiben: Es muss sichergestellt sein, dass die Lisa H., die in dem FOAF-Dokument beschrieben wird, dieselbe Lisa H. ist, die der RSS 1.0-Feed als Autorin eines Weblogs erwähnt. Als Format, das im Web funktionieren soll, benutzt RDF für diese Aufgabe die Identifizierer, über die das WWW verfügt, also URIs. Mit anderen Worten: Wann immer RDF-Daten etwas referenzieren, also auf etwas außerhalb ihrer selbst verweisen, verwenden sie URIs bzw. URI-Referenzen. URI-Referenzen sind URIs einschließlich eines optionalen Fragment-Identifizierers.

Auch Prädikate oder Eigenschaften haben einen URI, um sie eindeutig zu identifizieren und von anderen Prädikaten zu unterscheiden. Man kann deshalb jedes RDF-Tripel als Tripel von URIs schreiben. Der erste URI steht dann für das Subjekt, der zweite für das Prädikat und der dritte für das Objekt.

Als Tripel von URIs lassen sich die beiden Statements von oben so ausdrücken:

"http://www.example.com/weblogs/lisa"

"http://purl.org/dc/elements/1.1/creator"

"http://www.example.com/persons/lisa"

   

"http://www.example.com/persons/lisa"

"http://xmlns.com/foaf/0.1/knows"

"http://www.example.com/persons/petra"

Die URIs für Personen oder andere Ressourcen kann jeder bestimmen, der einen URI-Raum kontrolliert, also z. B. einen Domain-Namen reserviert hat. Im Beispiel habe ich einfach "http://www.example.com/" als Basis benutzt, um URIs für Lisa H. und Petra P. zu bilden. Die URIs, die ich in den Beispielen für die Beziehungen gebrauche, stammen aus RDF/XML-Vokabularen. Im ersten Tripel wird das Dublin Core-Vokabular verwendet, das einen wichtigen Bestandteil von RSS 1.0 bildet. In diesem Vokabular ist creator ein Elementname; creator bezeichnet die Beziehung einer Ressource zu ihrem Urheber. Der Namensraum des Dublin Core-Vokabulars hat den URI "http://purl.org/dc/elements/1.1/". Der URI des Prädikats wird gebildet, indem man den Elementnamen an das Namensraum-Präfix anhängt. Im zweiten Tripel stammt das Prädikat aus dem FOAF-Vokabular, dessen Namensraum der URI "http://xmlns.com/foaf/0.1/" identifiziert. Zum FOAF-Vokabular gehört das Element knows, das in dem zweiten Tripel die Beziehung zwischen den beiden Personen beschreibt.

RDF modelliert Informationen als Graphen

Liegen Infomationen in dieser Tripel-Form vor, lassen sie sich leicht kombinieren, indem man das Objekt eines Tripels zum Subjekt eines weiteren Tripels macht. Stellt man die Beziehungen visuell dar, ergibt sich der folgende Graph:

Grafische Darstellung von zwei RDF-Tripeln

Abbildung: Grafische Darstellung von zwei RDF-Tripeln

Die Struktur von RDF-Daten lässt sich als "gerichteter indizierter Graph" (englisch: directed labeled graph) beschreiben. Ein gerichteter indizierter Graph besteht aus "Knoten" (auch "Punkte" genannt) und gerichteten "Kanten" oder "Bögen", die jeweils eine Bezeichnung haben. Mit solchen Graphen beschäftigt sich die mathematische Disziplin der Graphentheorie. In einem RDF-Graphen werden wie im Beispiel die Ressourcen (Lisa H., Petra P., Lisas Weblog) als Knoten dargestellt, die Beziehungen als indizierte (labeled) Bögen. Als Labels der Bögen dienen die URIs "http://purl.org/dc/elements/1.1/creator" und "http://xmlns.com/foaf/0.1/knows".

RDF-Notation in XML

Dieses Graphenmodell der RDF-Informationen ist fundamental. Die Art seiner Notation, z. B. in XML, ist sekundär. Dem Graphenmodell entsprechend lassen sich RDF-Statements prinzipiell unbegrenzt miteinander kombinieren. Die URI-Referenzen, die die Bestandteile der Statements eindeutig identifizieren, sorgen dafür, dass die Beziehungen von Statements zueinander von Maschinen interpretiert werden können.

RDF modelliert also Informationen als gerichtete indizierte Graphen, bei denen die Knoten Ressourcen repräsentieren, die durch URIs identifiziert werden, und die Bögen durch URIs bezeichnet werden. Dieses konzeptionelle Modell hat mit der XML-Syntax nichts zu tun. Es ist aber möglich, RDF-Daten – also Daten, die dem RDF-Modell entsprechen – in einem XML-Dokument zu beschreiben. Man spricht auch von einer XML-Notation der RDF-Daten. Das XML-Vokabular, das man verwendet, um RDF-Daten zu notieren, heißt RDF/XML. Es wird in der RDF/XML Syntax Specification beschrieben. Dieser Syntax folgt RSS 1.0.

Zur RDF/XML-Syntax gehören RDF-spezifische Elemente und Attribute sowie Regeln für den Aufbau von Dokumenten. Auf die Elemente gehe ich später ein, um ihre Funktion innerhalb von RSS 1.0 zu beschreiben. Die Regeln für den Aufbau sagen auch aus, wie in einem RDF-Dokument Elemente aus verschiedenen XML-Vokabularen miteinander kombiniert werden. Das wichtigste Prinzip dabei ist, dass eine eindeutige Abbildungsbeziehung zwischen dem RDF-Graphen und der XML-Struktur besteht. Sehr vereinfacht gesagt: In einem RDF/XML-Dokument repräsentieren bestimmte Elemente Ressourcen, andere Elemente repräsentieren Eigenschaften.

Es gibt zwei Arten, dem Parser eines solchen Dokuments mitzuteilen, welche Elemente Ressourcen und welche Elemente Eigenschaften darstellen:

  • über Elemente und Attribute aus dem RDF/XML-Namensraum
  • über die Hierarchie der ineinander eingebetteten XML-Elemente

Die RDF/XML-Version der Daten des Beispiels zeigt, wie diese beiden Mittel zusammenwirken:

<?xml version="1.0"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:foaf="http://xmlns.com/foaf/0.1/">
   <rdf:Description rdf:about="http://www.example.com/weblogs/lisa">
      <dc:creator>
         <rdf:Description rdf:about="http://www.example.com/persons/lisa"/>
      </dc:creator>
   </rdf:Description>
   <rdf:Description rdf:about="http://www.example.com/persons/lisa">
       <foaf:knows>
          <rdf:Description rdf:about="http://www.example.com/persons/petra"/>
       </foaf:knows>
   </rdf:Description>
</rdf:RDF> 

Code-Beispiel: Einfaches RDF-Dokument

Das Dokument-Element rdf:RDF hat keine Funktion für den Aufbau des RDF-Graphen, es teilt dem Parser lediglich mit, dass er es mit RDF/XML-Daten zu tun hat. Welche Ressourcen der Parser als Subjekte von Statements (und damit innerhalb des RDF-Graphen als Knoten) verwenden soll, bestimmt das Element rdf:description mit dem Attribut rdf:about: "http://www.example.com/weblogs/lisa" in dem ersten und "http://www.example.com/persons/lisa" in dem zweiten Tripel. In diese Elemente eingebettet sind die beiden Elemente, die Prädikate – also die Bögen des RDF-Graphen – repräsentieren: dc:creator und foaf:knows. In der Baumstruktur des XML-Dokuments handelt es sich bei diesen Elementen um die Nachfolger oder Kind-Elemente der Elemente, die die Subjekte vertreten. Die Nachfolger oder Kinder dieser Elemente stehen wiederum für Knoten des RDF-Graphen. Im Beispiel handelt es sich bei diesen Nachfolgern um die beiden weiteren Elemente rdf:Description. Sie sind nur Hüllen für die URIs, die als Werte der Attribute rdf:about angegeben sind: "http://www.example.com/persons/lisa" und "http://www.example.com/persons/petra".

Abbildung von RDF-Graphen auf XML-Bäume

Zwischen dem RDF-Graphen und dem XML-Baum besteht also eine Abbildungs- oder Mapping-Beziehung. Eine Hierarchie-Ebene steht für Knoten des RDF-Graphen, die nächst-tiefere für Bögen, die nächste wiederum für Knoten.

Die folgende Abbildung zeigt die Baumstruktur des Dokuments. Sie können sich das Mapping auf die Knoten des Graphen leicht vorstellen. Der RDF-Parser kann die beiden Zweige des XML-Dokuments zusammenfassen, weil er aufgrund der URIs erkennt, dass zwei Knoten dieselbe Ressource darstellen.

Baumstruktur eines einfachen RDF-Dokuments

Abbildung: Baumstruktur eines einfachen RDF-Dokuments

Wenn man in dem RDF/XML-Dokument die Ebenen der Knoten und Bögen durch farbige und nicht farbige Hinterlegung voneinander unterscheidet, ergibt sich eine Streifenstruktur, wie in der folgenden Fassung des Beispiels:

<?xml version="1.0"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:foaf="http://xmlns.com/foaf/0.1/">
   <rdf:Description rdf:about="http://www.example.com/weblogs/lisa">
      <dc:creator>
         <rdf:Description rdf:about="http://www.example.com/persons/lisa"/>
      </dc:creator>
   </rdf:Description>
   <rdf:Description rdf:about="http://www.example.com/persons/lisa">
      <foaf:knows>
         <rdf:Description rdf:about="http://www.example.com/persons/petra"/>
      </foaf:knows>
   </rdf:Description>
</rdf:RDF> 

Code-Beispiel: Einfaches RDF-Dokument mit "Streifenstruktur"

Man spricht auch von der "striped RDF/XML Syntax" (siehe die Darstellung Dan Brickleys: RDF: Understanding the Striped RDF/XML Syntax). Wenn man sich an die Regeln dieser Syntax hält, kann man übrigens RDF-Dokumente erstellen, in denen überhaupt keine Elemente oder Attribute aus dem RDF/XML-Namensraum vorkommen.

Der RDF-Validator des W3C

Das W3C bietet im Web einen Validator an, der RDF/XML-Dokumente auf Fehler überprüft und die in ihnen enthaltenen Tripel und auf Wunsch auch eine visuelle Darstellung des Graphen ausgibt. Dieser Validator hat die oben stehende Abbildung "Grafische Darstellung von zwei RDF-Tripeln" erzeugt. Mit diesem Validator habe ich auch die Struktur der RSS-Daten visualisiert, die ich in den kommenden Abschnitten als Beispiele verwende.

Vorschau: Komplexere RDF-Graphen

Jetzt haben Sie einen ersten Einblick in das RDF-Datenmodell und die Funktion der RDF/XML-Syntax erhalten. Wenn Sie es mit RDF/XML-Daten zu tun haben, ist es wichtig, immer die Tripel- bzw. Graphenstruktur im Auge zu haben, die durch das XML-Dokument ausgedrückt werden soll. Die Syntax des Dokuments verstehen Sie, wenn Sie sich klar machen, dass sie einen RDF-Graphen auf einen XML-Baum projiziert.

Einige weitere Eigenheiten der RDF/XML-Syntax werden Sie in auf den kommenden Seiten kennen lernen, die in RSS 1.0 einführen. Dabei kommen u. a. drei Eigenheiten von RDF vor, die ich bisher nicht erwähnt habe:

  • Als Objekte von RDF-Statements können auch Zeichenketten (Literale) verwendet werden. RDF kennt einfache Literale (plain literals) und typisierte Literale (typed literals). Einfache Literale bestehen aus einer Zeichenkette und einer optionalen Sprachkennzeichnung. Bei einem typisierten Literal wird eine Zeichenkette mit dem URI eines Datentyps verbunden.
  • RDF bildet Sammlungen (collections) durch eigene Typen von Ressourcen ab, die als sequence (geordnete Folge), bag (ungeordnete Folge) und alternative (Alternative) bezeichnet werden.
  • Ein RDF-Graph kann auch "anonyme" Knoten enthalten – Knoten, die nicht von außen durch einen URI identifiziert werden, aber einen internen Identifizierer erhalten können.

Durch diese Techniken wird es möglich, Informationen als RSS-Graphen zu modellieren, die sich nicht direkt in die RDF-Tripelstruktur übersetzen lassen. Ohne sie würde RDF als Datenformat in nahezu jedem realistischen Szenario scheitern.

   

<< zurück vor >>

 

 

 

Tipp der data2type-Redaktion:
Zum Thema Newsfeeds mit RSS und Atom bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an: