Dieses Dokument ist eine deutsche Übersetzung eines W3C -Textes. Sie enthält möglicherweise Fehler. Sie hat keinerlei durch das W3C legitimierte normative Wirkung. Das maßgebende Dokument ist das englische Original.
Anmerkungen des Übersetzers werden eingeleitet mit "A.d.Ü.:".
Der Übersetzer freut sich über Hinweise auf Fehler der deutschen Fassung, und ist als Neuling auf diesem Gebiet auch für Übersetzungstips dankbar.
Das hier müssen Sie nicht wissen. Nur, es macht das Leben leichter und hilft, Arbeiten anderer zu verstehen.
Oft zeigt es sich, dass Sie auf irgentetwas indirekt verweisen müssen mithilfe einer Reihe von Eigenschaften, wie etwa "Georgs Mutters Assistentenprivatadressenpostleitzahl" (englisch:"George's mother's assistant's home's address' zipcode"). Das ist Traversieren (enlisch: traversal) des Graphen. In N3, wie wir es bisher benutzt haben, sähe das etwa so aus:
[is con:zipcode of [ is con:address of [ is con:home of [ is off:assistant of [ is rel:mother of :George]]]]]
A. d. Ü.: Die Präfixe con:, off: und rel: stehen für (mögliche) Vokabularien. Dabei wird con: wahrscheinlich für "contact" also Kontaktdaten stehen, off: wird etwas mit office also Büro und rel: mit relationship also Verwandschaftsbeziehungen zu tun haben.
Man liest das als "Das, welches PLZ ist von dem, welches Adresse ist von dem, welches Zuhause ist von dem, welcher Assistent ist von der, welche Mutter von Georg ist." Das ist nicht sehr zweckmäßig, weder zum Lesen noch zum Schreiben. In einer objektorientierten Sprache würde man jetzt einfach kaskadenartig Methoden oder Attribute auf Eigenschaften anwenden mithilfe von Punkten ".".
Um N3 zu vereinfachen, gibt es eine Kurzschreibweise, so dass das Beispiel von oben so geschrieben werden kann:
:George.rel:mother .off:assistant .con:home .con:address .con:zipcode
Unmittelbar nach einem Punkt "." muss das nächste Prädikat ohne Leerstelle (englisch: whitespace) folgen .
Das nennt man den Graphen vorwärts traversieren (englisch: forward traversal). Mit jedem Punkt "." geht man von einem Ding zu seiner Eigenschaft über. Also ist ?x.con:mailbox das "Postfach eines x" (englisch: x's mailbox). Im Englischen kann man also in der Tat den Punkt "." als "s" lesen.
Den Graphen rückwärts traversieren (englisch: backward traversal) können Sie mithilfe von "^" anstatt ".". Also wenn :me.con:mailbox "mein Postfach" bedeutet, dann bedeutet <mailto:ora@lassila.com>^con:mailbox "derjenige, der als Postfach <mailto:ora@lassila.com> hat". Rückwärts traversieren ist weniger üblich, in objektorientierten Sprachen geht das nicht, doch manchmal braucht man genau so etwas.
Beachten Sie, dass es nicht notwendigerweise nur einen Pfad gibt; oft gibt es deren viele, die man auf der linken Seite einer Regel benutzen kann.
:me.rel:parent
würde bedeuten "Ein x, so dass gilt: Ich habe Elternteil x" und
:me.rel:parent^rel:parent
würde bedeuten "Ein y und ein x, so dass gilt: Ich habe Elternteil x und y hat Elternteil x", also kurz gesagt "ein Geschwisterteil von mir". In dieser imaginären Ontologie ist ".rel:child" äquivalent zu "^rel:parent".
Egal in welcher Folge "." und "^" auftreten, es wird immer von links nach rechts gelesen.
Solche Reihungen nennt man "Pfade". Wenn Sie mit XML vertraut sind, denken Sie an ein vereinfachtes Xpath. Wenn Sie Kringel und Pfeile eines Graphen im Kopf haben, denken Sie an einen Pfad von Knoten zu Knoten.
Cwm unterstützt zur Zeit keine Pfade beim Output. Weist man also Cwm an, eine Datei zu lesen und wieder auszugeben, so erhält man sie in der Form von N3 zurück, die Sie bereits kennen.
Eine übliche Anforderung ist es, eine geordnete Sammlung zu bezeichnen. In RDF gibt es dafür rdf:Collection. In N3 wird eine Liste gebildet, indem Objekte durch Leerstellen getrennt innerhalb von Klammern aufgeführt werden. Einige Beispiele:
( "Montag" "Dienstag" "Mittwoch" ) (:x :y) ( :kunde.bus:auftrag.bus:nummer :kunde.bus:auftrag.bus:bestellung.bus:nummer )
Solche Listen sind eigentlich eine Kurzform für Sätze, die leere Knoten mithilfe von rdf:first und rdf:rest verbinden. Dabei ist rdf:first die Beziehung zwischen einer Liste und ihrem ersten Element, rdf:rest ist die Beziehung zwischen einer Liste und allen Elementen ausser dem ersten. rdf:nil ist die leere Liste.
( "Montag" "Dienstag" "Mitwoch" )
ist deshalb äquivalent zu
[ rdf:first "Montag"; rdf:next [ rdf:first "Dienstag"; rdf:rest [ rdf:first "Mittwoch"; rdf:rest rdf:nil ]]]
Eine übliche Anwendung von Listen sind Parameter von Relationen mit mehr als einem Argument.
( "Lieber " ?name "," ) string:conatenation ?begrüßung.
beispielsweise zeigt an, dass begrüßung eine Stringverkettung von "Lieber", einem beliebigen Namen und einem Komma ist. Das werden wir bei Built-in-Funktionen brauchen, die wir später diskutieren wollen.