Wer das Web und seine Entwicklung beobachtet, der hat vielleicht schon vom Semantic Web bzw. vom “Web 3.0″ oder dem “Web der Dinge” gehört. Die Informationen im Web 3.0 sollen nicht nur vom Menschen, sondern auch von Computern interpretiert und verstanden werden. Informationen über Orte, Personen und andere materielle und nicht-materielle Dinge können infolgedessen automatisch miteinander in Beziehung gesetzt werden.
Für dieses Posting konzentriere ich mich auf einen Anwendungsfall, den jeder kennt. Als Internet-Nutzer bewegt man sich in der Regel in mindestens einem sozialen Netzwerk. Zu diesen Netzwerken gehören Foren, Communities, Blogs, Messaging-Dienste, und vieles mehr. Als aktiver Nutzer hat man über den Zeitraum der Nutzung hinweg ein mehr oder weniger großes Netzwerk an Freunden und Bekannten aufgespannt und gepflegt. Was aber mache ich, wenn ich mich in einem weiteren sozialen Netzwerk anmelde, in dem ich bis dato noch völlig unbekannt bin?
In der Regel muss ich dort meine persönlichen Daten erneut eingeben und viele meiner Bekannten, die dieses Netzwerk bereits nutzen, erneut zu meinen Kontakten hinzufügen. Fehler und Unstimmigkeiten bei der manuellen Eingabe sind dabei nicht immer vermeidbar. Außerdem gebe ich meine Kontaktinformationen aus der Hand und pflege sie nicht an einer zentralen und mir vertrauten Stelle. Das kann im Detail seine Vorteile haben, aber die essentiellen Daten wie etwa meinen Namen, meine E-Mail Adresse und vergleichbare Kontaktinformationen möchte ich vielleicht gerne an einem zentralen Ort im Web speichern und pflegen.
Das bedeutet allerdings nicht, dass ich auf einen Zugriffsschutz verzichten sollte, der eine saubere Authentifizierung erfordert und meine Kontaktdetails anschließend über einen verschlüsselten Kanal überträgt. Allerdings soll jeder Mensch und auch jede Maschine, der oder die von mir Zugriffsrechte auf diese Informationen erhält, zu jeder Zeit die Informationen abrufen können, für die er oder sie von mir autorisiert worden ist.
Das Ganze funktioniert am elegantesten im weltumspannenden Internet und dort unter einer von mir definierten URI. Außerdem müssen meine Kontaktdetails natürlich in einer standardisierten Form vorliegen, damit sichergestellt ist, dass sie auch mit den entsprechenden Werkzeugen gelesen und verstanden werden können. Ob dieses Werkzeug nun ein Mechanismus für die Accounterstellung in einem sozialen Netzwerk ist, oder es sich dabei um eine völlig andere Software handelt, ist dabei völlig egal. Wichtig ist nur, dass sie meine Daten sauber lesen und interpretieren (=verstehen) kann. Auch Instant Messenger und andere, klassische Applikationen könnten so problemlos Zugriff auf mein virtuelles ich und mein persönliches “Netz der Dinge” bekommen.
Eine Möglichkeit diese kleine Utopie in die Realität umzusetzen kann in Zukunft die Pflege einer RDF-Datei (Ressource Description Framework) mit meinem persönlichen Profil und meinen Freundschaftsbeziehungen zu anderen Personen werden. Der Inhalt dieser RDF-Datei besteht im Wesentlichen aus Daten über meine Person und meine Bekanntschaften nach dem FOAF (Friend of a Friend) Vokabular. Wer sich bisher nicht mit RDF auskennt, der liest sich am besten kurz diesen Abschnitt aus dem RDF-Artikel in der Wikipedia durch: Hier klicken. Die FOAF-Daten über meine Person und mein soziales Netzwerk werden dabei quasi in das RDF-Dokument “gemixt”, um einem neuen sozialen Netzwerk alles über mich und meine Bekanntschaften zu erzählen. Dafür müssen allerdings zwei Bedingungen erfüllt werden:
- Das bisher genutzte soziale Netzwerk muss eine FOAF-Datei von mir erzeugen und online bereitstellen können (niemand möchte so eine Datei manuell pflegen…)
- Das neue soziale Netzwerk muss diese Datei lesen und verstehen können, um dann meinen Account mit den darin vorhandenen Daten regelmäßig auf den aktuellen Stand bringen zu können.
Wie sieht nun so eine RDF-Datei mit FOAF-Elementen aus? In meinem Fall könnt ihr euch meine FOAF-Datei unter http://www.suchkultur.de/rdf/foaf.rdf anschauen. Diese URL (bzw. allgemeiner ein URI) ist auch gleichzeitig das Merkmal, mit dem die darin enthaltenen Daten eindeutig meiner Person zugeordnet werden können. Theoretisch kann es einen weiteren Stefan Antoni geben, der genau die selbe Datei erstellt und sie unter einer anderen URI verfügbar gemacht hat. Er wäre dann eine andere Person.
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
xmlns:foaf="http://xmlns.com/foaf/0.1/">
<foaf:PersonalProfileDocument rdf:about="">
<foaf:maker rdf:resource="#me"/>
<foaf:primaryTopic rdf:resource="#me"/>
</foaf:PersonalProfileDocument>
<foaf:Person rdf:ID="me">
<foaf:name>Stefan Antoni</foaf:name>
<foaf:givenname>Stefan</foaf:givenname>
<foaf:family_name>Antoni</foaf:family_name>
<foaf:mbox_sha1sum>7e5dbf850ca8661675bd80481b26b095d7337927</foaf:mbox_sha1sum>
<foaf:weblog rdf:resource="http://www.suchkultur.de"/blog/>
<foaf:workplaceHomepage rdf:resource="http://www.t-online.de"/>
</foaf:Person>
</rdf:RDF>
Um einer schleichenden Verwirrung vorzubeugen, werde ich an dieser Stelle nicht die Definitionen von Namensräumen innerhalb von XML-Dokumenten erklären und den Fokus auf die wichtigsten Elemente legen. Bei Detailfragen oder Kritik helfe ich gerne per E-Mail oder (noch besser) in den Kommentaren weiter.
Wenn man das oben vorgestellte RDF in den RDF-Validator des W3C wirft, bekommt man übrigens eine gut lesbare, tabellarische Übersicht über die darin enthaltenen Informationen (genauer: Über die sogenannten RDF-Tripel).
Folgendes habe ich in meiner RDF-Datei angegeben:
- Meinen Namen als “Stefan Antoni”
- Meinen Vornamen “Stefan”
- Meinen Familiennamen “Antoni”
- Meine E-Mail Adresse als SHA-1 Hashwert (mit “mailto:” Prefix): “7e5dbf850ca8661675bd80481b26b095d7337927″
- Meine Homepage “http://www.suchkultur.de”
- Die Homepage meines Arbeitgebers “http://www.t-online.de”
Was fehlt? Meine Freunde! Freundschaftsbeziehungen habe ich in diesem Beispiel bisher noch nicht modelliert. Das wichtigste fehlt also noch. Eine Freundschaftsbeziehung zum allseits beliebten Herrn Mustermann kann beispielsweise so aussehen:
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
xmlns:foaf="http://xmlns.com/foaf/0.1/">
<foaf:PersonalProfileDocument rdf:about="">
<foaf:maker rdf:resource="#me"/>
<foaf:primaryTopic rdf:resource="#me"/>
</foaf:PersonalProfileDocument>
<foaf:Person rdf:ID="me">
<foaf:name>Stefan Antoni</foaf:name>
<foaf:givenname>Stefan</foaf:givenname>
<foaf:family_name>Antoni</foaf:family_name>
<foaf:mbox_sha1sum>7e5dbf850ca8661675bd80481b26b095d7337927</foaf:mbox_sha1sum>
<foaf:weblog rdf:resource="http://www.suchkultur.de"/blog/>
<foaf:workplaceHomepage rdf:resource="http://www.t-online.de"/>
<foaf:knows>
<foaf:Person>
<foaf:name>Max Mustermann</foaf:name>
<rdfs:seeAlso
rdf:resource="http://beliebige-quelle.de/max_mustermann/foaf.rdf"/>
</foaf:Person>
</foaf:knows>
</foaf:Person>
</rdf:RDF>
Neu ist hier prinzipiell nur das “knows” aus dem FOAF-Vokabular (ab Zeile 16). Die Syntax der Personenbeschreibung ist natürlich die selbe wie auch schon bei mir selbst. Mit “seeAlso” wird auf die RDF-Datei meines Freundes verwiesen. Im Grunde also nichts anderes als der Verweis zum Profil einer Person in einem sozialen Netzwerk. Der Unterschied ist, dass dieses soziale Netzwerk nun das gesamte Internet ist.
Als eine letzte Information möchte ich vielleicht noch ausdrücken wo eine Person sich aufhält. Da Personen im FOAF-Sprech “geospatial” (also: “auf der Erde befindlich”) sind, kann man sie verorten. Wenn ich das mit mir selbst mache sieht mein Beispiel so aus:
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
xmlns:foaf="http://xmlns.com/foaf/0.1/">
<foaf:PersonalProfileDocument rdf:about="">
<foaf:maker rdf:resource="#me"/>
<foaf:primaryTopic rdf:resource="#me"/>
</foaf:PersonalProfileDocument>
<foaf:Person rdf:ID="me">
<foaf:name>Stefan Antoni</foaf:name>
<foaf:based_near>
<geo:Point geo:lat="50.1463491" geo:long="8.6245506"/>
</foaf:based_near>
<foaf:givenname>Stefan</foaf:givenname>
<foaf:family_name>Antoni</foaf:family_name>
<foaf:mbox_sha1sum>7e5dbf850ca8661675bd80481b26b095d7337927</foaf:mbox_sha1sum>
<foaf:weblog rdf:resource="http://www.suchkultur.de"/blog/>
<foaf:workplaceHomepage rdf:resource="http://www.t-online.de"/>
<foaf:knows>
<foaf:Person>
<foaf:name>Max Mustermann</foaf:name>
<rdfs:seeAlso
rdf:resource="http://beliebige-quelle.de/max_mustermann/foaf.rdf"/>
</foaf:Person>
</foaf:knows>
</foaf:Person>
</rdf:RDF>
Ab Zeile 11 sind mit based_near die Geokordinaten notiert. Diese Koordinaten können sich natürlich jeder Zeit ändern und zum Beispiel über mein Mobiltelefon aktualisiert werden.
Das war nun ein kleiner Einblick in das FOAF-Vokabular und wie man damit die eigene Person beschreiben kann. Durch die Modularität innerhalb von RDF-Dokumenten können viele weitere “Vokabulare” eingesetzt werden, um die maschinenenlesbaren Informationen über Personen und Dinge beliebig detailiert zu beschreiben. Die Verknüpfung dieser Informationen erledigt dabei das Web automatisch über die darin spezifizierten URIs.
Einige weiterführende Beispiele zum Thema finden sich im Wiki des FOAF Projekts: Beispiele
Ein schönes Beispiel zur Verdeutlichung wie FOAF-Daten in einem Benutzerprofil dargestellt werden können, ist der FOAF-Visualizer and Relation Explorer.
Dort kann man sich meine Minimalkonfiguration anschauen: http://foaf-visualizer.org/?uri=http://www.suchkultur.de/rdf/foaf.rdf oder eines der komplexeren Beispiele wie zum Beispiel das hier von Sergey Poznyakoffs RDF/FOAF Profil. Zum direkten Vergleich: Das entsprechende RDF-XML seines Profils.