Die Struktur des Dokuments als Konsequenz des RDF-Modells

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

Das Dokument-Element rdf:RDF hat keine Entsprechung in dem Graphen, den ein RDF-Parser aus einem RSS-Dokument aufbaut. Es enthält Informationen, die der Parser benötigt, um aus den Inhalten des Dokument-Elements RDF-Tripel zu entnehmen. Zu diesen Informationen gehört, dass es sich bei dem Dokument um ein RDF-Dokument handelt und welchen Namensräumen die Nachkommen zugeordnet sind. Außerdem dient das Element rdf:RDF als ein Container für mehrere so genannte "Top-Level"-Elemente, also für mehrere unmittelbare Nachkommen in der Dokument-Hierarchie. Ein RDF-Parser interpretiert die Nachkommen von rdf:RDF als Statements über Ressourcen. Für das Beispiel (siehe das Code-Beispiel "Einfaches RSS 1.0-Dokument" auf der Seite Grundstruktur eines RSS 1.0-Dokuments) bedeutet das, dass der Parser den RDF-Graphen ausgehend von drei Statements über drei Ressourcen aufbauen wird.

rdf:RDF kommt wie alle Elemente aus dem RDF-Namensraum auch außerhalb von RSS 1.0 vor. Die meisten RDF-Dokumente verwenden rdf:RDF als Dokument-Element. Es ist allerdings möglich, andere Dokument-Elemente für RDF-Dokumente zu benutzen. Von dieser Möglichkeit macht RSS 1.1 Gebrauch, das als Nachfolgeformat für RSS 1.0 vorgeschlagen wurde.

Das Element rdf:RDF des Beispiels hat drei Nachfolger: ein Element des Typs channel und zwei Elemente des Typs item. Diesen drei Elementen ist das Attribut rdf:about gemeinsam, das für alle Top-Level-Elemente von RSS 1.0 vorgeschrieben ist. Der URI, der als Wert von rdf:about angegeben ist, bezeichnet jeweils eine Ressource, die das Subjekt von RDF-Statements ist. Für die Nachkommen der Top-Level-Elemente – im Beispiel channel und zweimal item – gilt dann, dass sie den Regeln der Striped Syntax folgen, die Sie bereits kennen gelernt haben: Kind-Elemente dieser Elemente repräsentieren grundsätzlich Eigenschaften. Der URI dieser Eigenschaften wird aus den Elementnamen und den URIs der Namensräume gebildet, denen der Elementname zugeordnet ist.

Um zu verstehen, wie der Parser aus den Elementen des Beispieldokuments Tripel aufbaut, müssen Sie aber noch einige zusätzliche Regeln von RDF bzw. der RDF/XML-Syntax kennen. Ich werde sie ausgehend von dem Beispieldokument vorstellen.

Die erste Regel betrifft die RDF/XML-Syntax und lautet:

  • XML-Elemente mit dem Attribut rdf:about bezeichnen den Typ der Ressource, die als Wert des Attributs genannt ist.

Die beiden anderen Regeln betreffen das RDF-Datenmodell und besagen:

  • Objekt eines RDF-Statements kann auch eine Zeichenkette sein.
  • Statements über geordnete Folge werden als Statements über einen Container eines bestimmten Typs sowie als Reihe von Statements über die Beziehung des Containers zu seinen Mitgliedern gemacht.

Ich beginne mit der ersten Regel: Sie erklärt, wie der Parser die Konstruktionen <channel rdf:about="..."/> und <item rdf:about="..."/> verarbeitet. Er interpretiert den URI, der den Wert von rdf:about bildet, als Subjekt eines Statements, dessen Prädikat zum RDF/XML-Namensraum gehört und rdf:type heißt. Das bedeutet, dass das Subjekt Instanz einer Klasse ist, das Objekt des Statements gibt die Klasse an. Der Wert der Eigenschaft rdf:type ist wiederum eine Ressource, nämlich die Klasse, deren Instanz das Subjekt ist. Den URI dieser Ressource ermittelt der Parser aus dem Elementnamen und dem URI des für diesen geltenden Namensraums. Aus den Top-Level-Elementen des Beispiels lassen sich damit folgende Tripel konstruieren:

Subjekt Prädikat Objekt
1 "http://www.celawi.eu/webtrends" "http://www.w3.org/1999/02/22-rdf-syntax-ns#type" "http://purl.org/rss/1.0/channel"
2 "http://www.celawi.eu/webtrends/20040415_01" "http://www.w3.org/1999/02/22-rdf-syntax-ns#type" "http://purl.org/rss/1.0/item"
3 "http://www.celawi.eu/webtrends/20040415_02" "http://www.w3.org/1999/02/22-rdf-syntax-ns#type" "http://purl.org/rss/1.0/item"

Wenn man Namensraum-Präfixe benutzt, kann man diese Tripel verkürzt so schreiben:

Subjekt Prädikat Objekt
1 "http://www.celawi.eu/webtrends" rdf:type rss:channel
2 "http://www.celawi.eu/webtrends/20040415_01" rdf:type rss:item
3 "http://www.celawi.eu/webtrends/20040415_02" rdf:type rss:item

RSS als Repräsentation von Wissen

Bereits diese drei ersten Tripel zeigen, worin der große Unterschied zwischen RSS 1.0 und RSS 2.0 besteht: Ein RDF-Parser entnimmt einem RSS 1.0-Dokument Behauptungen über Sachverhalte; in diesem Fall, dass die Ressource, auf die sich der URI "http://www.celawi.eu/webtrends" bezieht, ein RSS-channel ist. RSS 1.0 dient also im weitesten Sinne dazu, Wissen zu repräsentieren. Dabei ist klar, dass die Behauptung, dass eine Ressource eine Instanz der Klasse channel ist, nur dann praktischen Wert hat, wenn bekannt ist, was das Prädikat "ist eine Instanz der Klasse" bedeutet und wenn sich über die Klasse channel selbst weitere Statements machen lassen. Solche Statements sind innerhalb von RDF möglich. Sie lassen sich in RDF-Schemas und in so genannten Ontologien machen. Die Statements, die sich aus den Elementnamen entnehmen lassen, könnten z. B. verwendet werden, um aus ihnen eine Datenbank mit den Eigenschaften der RSS-Kanäle und ihrer Einträge aufzubauen.

Dem Beispieldokument lassen sich noch mehr Statements über die Subjekte der ersten drei RDF-Statements entnehmen. Um sie bilden zu können, müssen allerdings die beiden anderen erwähnten Regeln angewendet werden. Die erste dieser Regeln besagt, dass als Objekt eines RDF-Statements statt einer Ressource (irgend etwas, das sich mit einem URI identifizieren lässt) auch ein Literal, also eine Zeichenkette möglich ist. Einen solchen Fall führt gleich das erste Kindelement von channel vor, das den Typ title hat. Aus den Regeln der Striped Syntax ergibt sich ja, dass der Elementname title eine Eigenschaft bezeichnet, weil er der Name des Kind-Elements eines Elements ist, das ein Subjekt repräsentiert. Der Wert dieser Eigenschaft ist in diesem Fall einfach die Zeichenkette, die als Inhalt des Elements verwendet wird. Das Statement lässt sich also wie folgt formulieren:

Subjekt Prädikat Objekt
1 "http://www.celawi.eu/webtrends" "http://purl.org/rss/1.0/title" Webtrends

Auch die Inhalte von link und description sind Zeichenketten. Über die in diesem Dokument von dem Element channel repräsentierte Ressource gibt es damit – mit Namensraum-Präfixen geschrieben – folgende vier Statements:

Subjekt Prädikat Objekt
1 "http://www.celawi.eu/webtrends" rdf:type rss:channel
2 "http://www.celawi.eu/webtrends" rss:title Webtrends
3 "http://www.celawi.eu/webtrends" rss:link "http://www.celawi.eu/webtrends.html"
4 "http://www.celawi.eu/webtrends" rss:description Nachrichten über kommerzielle Websites und Online-Werbung

Graph mit RDF-Statements über das Element channel des Beispieldokuments

Abbildung: Graph mit RDF-Statements über das Element "channel" des Beispieldokuments
(Diese Formulierung ist ungenau, denn das Subjekt ist eine Instanz der Klasse channel).

Die Beziehungen zwischen channel, items und item

RDF-Container werden verwendet, wenn als Subjekt oder Objekt in einem RDF-Graphen mehr als eine Ressource angegeben werden soll. Es gibt drei Typen, nämlich Bag (ungeordnete Folgen), Seq (für geordnete Folgen oder collections) und Alt (für Listen von Alternativen).

In dem Beispiel ist ein Container Objekt des Prädikats items. Dieser Container ist eine collection und damit eine geordnete Folge. Würde stattdessen eine Eigenschaft – z. B. mit dem Namen item – verwendet, deren Wert eine einzelne Ressource wäre, ließe sich nicht ausdrücken, ob es sich bei den Mengen der einzelnen item-Objekte um eine geordnete oder ungeordnete Folge handelt. (Mark Pilgrim hält diese semantische Genauigkeit für den Hauptvorteil von RDF, auch wenn er es ablehnt, die RDF/XML-Syntax für Atom zu verwenden: Should Atom use RDF?.) Die folgende Abbildung zeigt den Graphen, den der RSS-Validator aus dem Element items konstruiert.

Visualisierung eines RDF-Graphen für das RSS 1.0-Element items

Abbildung: Visualisierung eines RDF-Graphen für das RSS 1.0-Element "items"

Die collection ist in diesem Fall eine Ressource, die keinen URI hat. Es wird adhoc mit genid:ARP430402 ein Identifizierer für den entsprechenden Knoten konstruiert; ein URI ist nicht notwendig, weil auf diese Ressource nicht von außen zugegriffen wird. Ein eigenes Statememt, visualisiert durch den linken Bogen, besagt, dass diese Ressource die Eigenschaft rdf:Seq hat. Für jedes der Mitglieder der Sequenz wird ein eigenes Tripel mit einer spezifischen Eigenschaft konstruiert, nämlich der Position in der Reihenfolge der gleichartigen Elemente.

Im RDF-Graph hat das Subjekt rdf:Seq so die Eigenschaften rdf:_1, rdf:_2 usw., deren Wert wiederum Ressourcen bilden. Spätere Statements besagen, dass die Ressourcen Instanzen der Klasse item bilden. Die Visualisierung zeigt, dass das RDF/XML-Element rdf:li nur eine verkürzte Schreibweise für die Eigenschaften rdf:_1, rdf:_2 usw. ist.

Bei der Sequenz selbst handelt es sich um einen so genannten blank node. RDF beschreibt strukturierte Informationen, die zu einem Subjekt gehören, immer als eigene Ressourcen, auf die sich weitere Statements beziehen. In dem Beispiel ist die Sequenz eine solche eigene Ressource. Sie hat nur einen intermediären Charakter, da sie nur als Zwischenglied gebraucht wird, um andere Ressourcen einander zuordnen zu können. Solche intermediären Ressourcen werden als blank nodes bezeichnet. Die Identifizierer der blank nodes sind nicht Bestandteile des RDF-Graphen, sie sind lediglich ein Hilfsmittel bei seiner Notation.

blank nodes sind eines der Mittel, die RDF verwendet, um Relationen zwischen einer Ressource und mehreren Ressourcen als binäre Relationen abzubilden. Im Beispiel besteht keine Relation zwischen der Ressource channel und einer Anzahl von Ressourcen der Klasse item. Stattdessen besteht eine binäre Relation zwischen channel und der Sequenz und dann wiederum binäre Relationen zwischen der Sequenz – dem blank node – und jedem einzelnen ihrer Mitglieder. Das RDF/XML-Element rdf:li ist nur "syntaktischer Zucker", im Graphen wird es, wie Sie gesehen haben, durch Prädikate ersetzt, die jeweils nur einmal vorkommen (rdf:_1, rdf:_2).

Die folgende Abbildung zeigt den RDF-Graphen des kompletten Beispieldokuments. Unten rechts werden die Statements visualisiert, die sich auf die item-Elemente – genauer gesagt auf die Ressourcen der Klasse item – beziehen. Sie können mit den Statements über den channel zu einem Graphen zusammengefasst werden, weil sie sich auf die Ressourcen beziehen, die Objekt der Eigenschaften rdf:_1 und rdf_2 sind.

Visuelle Darstellung des RDF-Graphen des Dokuments der Seite Grundstruktur eines RSS 2.0-Dokuments

Visuelle Darstellung des RDF-Graphen des Dokuments der Seite Grundstruktur eines RSS 2.0-Dokuments

Abbildung: Visuelle Darstellung des RDF-Graphen des Dokuments der Seite Grundstruktur eines RSS 2.0-Dokuments

   

<< 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: