Einige Fragen zu RDF und FOAF
molily
- xml-derivat
Hallo,
ich habe mich in den letzten Tagen ein wenig in RDF eingelesen. Dazu muss ich sagen, dass ich nicht wirklich durchblicke und mein Verständnis nur oberflächlich ist. Nichtsdestoweniger möchte ich testweise eine Art Sitemap in RDF erstellen. Also ein Dokument, dass Metadaten über die Autoren einer Site enthält sowie Metadaten über die Dokumente der Site. Auf der einen Seite stehen die Autoren, auf der anderen die Dokumente. Zwischen diesen möchte ich eine Verknüpfung haben, sodass folgende Triples herauskommen (siehe http://www.w3.org/TR/rdf-primer/):
Subjekt Prädikat Objekt
Person1 ist der Autor von Dokument1
Person1 ist der Autor von Dokument2
Person1 ist der Autor von Dokument3
Person2 ...
Oder andersherum:
Dokument1 hat den Autor Person1
Dokument2 hat den Autor Person1
Dokument3 hat den Autor Person1
Dokument4 ...
Prinzipiell könnte ein Dokument mehrere Autoren haben.
Ich dachte mir, dass ich jeweils FOAF verwende (http://xmlns.com/foaf/0.1/), und zwar foaf:Person (http://xmlns.com/foaf/0.1/#term_Person) für die Personen und foaf:Document (http://xmlns.com/foaf/0.1/#term_Document) für die Dokumente. Mir geht es dabei weniger darum, die Verbindungen zwischen den Personen herauszustellen (foaf:knows usw.), der Teil von FOAF interessiert mich hier nicht.
Ganz simpel realisiert sähe das so aus:
<?xml version="1.0" encoding="iso-8859-1" ?>
<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/"
<foaf:Person rdf:ID="Person1">
foaf:namePerson1</foaf:name>
<foaf:made rdf:resource="http://example.org/Dokument1" />
</foaf:Person>
<foaf:Document rdf:about="http://example.org/Dokument1">
dc:titleDokument1</dc:title>
dc:creatorPerson1</dc:creator>
<foaf:maker rdf:resource="#Person1" />
</foaf:Document>
</rdf:RDF>
Eine Person, ein Dokument. Die Person1 schrieb http://example.org/Dokument1 und http://example.org/Dokument1 hat den Ersteller Person1. Person1 ist ein internes Konstrukt mit der ID Person1, http://example.org/Dokument1 wäre eine real existierende Adresse des Dokument1.
Das ergäbe folgenden Graph: http://www.w3.org/RDF/Validator/ARPServlet?URI=http%3A%2F%2Fmolily.de%2Ftest01.rdf&TRIPLES_AND_GRAPH=PRINT_BOTH&FORMAT=PNG_EMBED
Mit folgenden Triples (abgekürzt):
#Person1 http://www.w3.org/1999/02/22-rdf-syntax-ns#type http://xmlns.com/foaf/0.1/Person
#Person1 http://xmlns.com/foaf/0.1/name "Person1"
#Person1 http://xmlns.com/foaf/0.1/made http://example.org/Dokument1
http://example.org/Dokument1 http://www.w3.org/1999/02/22-rdf-syntax-ns#type http://xmlns.com/foaf/0.1/Document
http://example.org/Dokument1 http://purl.org/dc/elements/1.1/title "Dokument1"
http://example.org/Dokument1 http://purl.org/dc/elements/1.1/creator "Person1"
http://example.org/Dokument1 http://xmlns.com/foaf/0.1/maker #Person1
Das sieht soweit ganz gut aus. Oder lässt sich das optimieren/aussagekräftiger lösen?
Ich frage mich auch, ob der reziproke Doppelpfeil zwischen Person und Dokument bzw. Dokument und Person Sinn ergibt:
#Person1 ---foaf:made--> http://example.org/Dokument1
http://example.org/Dokument1 --foaf:maker--> #Person1
Das zeigt sich im Graph sehr schön, die zwei Knoten verweisen gegenseitig aufeinander. Ist das stimmig oder sollte ich mich für eine Richtung entscheiden? Was Verknüpfungen zwischen Dokumenten angibt, so habe ich bisher auf HTML-Ebene meist mit solchen Links gearbeitet (<link rel="child" rev="parent" href="..."> und <link rel="parent" rev="child" href="..."> usw.).
An dieser Stelle frage ich mich, warum foaf:made die Adresse des Dokuments verlinkt und nicht den zugehörigen foaf:Document-Knoten. Ich wüsste aber nicht, wie es anders ginge, da rdf:about und rdf:ID/rdf:nodeID soweit ich weiß nicht gleichzeitig verwendet werden können. Wenn ich damit herumspiele, kommen unsinnige bzw. für mich unverständliche Triples heraus und der Graph wird vollkommen wirr.
Im Endeffekt sind im foaf:Person-Element dutzende weitere Elemente und es kommen zahlreiche foaf:Document dazu. Der Graph wird entsprechen komplex. Dann ergibt sich das Problem, dass die dc:creator-Elemente gleicher Autoren denselben Inhalt haben und die Triples ebenso:
http://example.org/Dokument1 http://purl.org/dc/elements/1.1/creator "Person1"
http://example.org/Dokument2 http://purl.org/dc/elements/1.1/creator "Person1"
Das erzeugt im Graph freilich zwei unterschiedliche Knoten mit dem Wert »Person1«. Dabei sollte auch der dc:creator auf ein und denselben Knoten zeigen, wie foaf:maker. Das wäre mit <dc:creator rdf:resource="#Person1"> ein wenig unstimmig möglich, wobei Person1 eben die ID der jeweiligen foaf:Person wäre.
Dazu fand ich http://rdfweb.org/topic/UsingDublinCoreCreator (»Our investigation began by wondering whether we should use dc:creator as a relationship between a document and a person, or just as a relationship between a document and that person's name«). Die dortigen Empfehlungen klingen weitesgehend plausibel, ich will aber dc:creator weiterverwenden und bei mehreren Autoren nicht auf rdf:Bag verzichten. Was haltet ihr davon?
Eine weitere Frage ist, wie sich Dublin-Core-Daten mit einem bestimmten »encoding scheme« ausdrücken lassen. Mit encoding scheme ist ein formales Datenschema gemeint (http://dublincore.org/documents/dcmi-terms/#H4), dem die Metadaten folgen.
In HTML wäre das gemäß http://dublincore.org/documents/dcq-html/ etwa:
<meta name="DC.language" scheme="DCTERMS.RFC3066" content="de" />
^^^^^^^^^^^^^^^^^^^^^^^^
Das bedeutet, dass »de« gemäß dem Schema RFC 3066 zu interpretieren ist.
Wie nun wird dies in RDF ausgedrückt? Ohne encoding scheme sieht es natürlich so aus:
dcterms:languagede</dcterms:language>
Ich war auf die Idee gekommen, das Attribut rdf:datatype (http://www.w3.org/TR/rdf-primer/#typedliterals, http://www.w3.org/TR/rdf-concepts/#dfn-typed-literal) zu nutzen:
<dc:language rdf:datatype="http://purl.org/dc/terms/RFC3066">de</dc:language>
oder aus XML Schema:
<dc:language rdf:datatype="http://www.w3.org/2001/XMLSchema#language">de</dc:language>
Nun fand ich aber in http://web.resource.org/rss/1.0/modules/dcterms/ und http://dublincore.org/documents/dcq-rdf-xml/ folgende Schreibweise:
dc:language
dcterms:RFC3066
rdf:valueen</rdf:value>
</dcterms:RFC3066>
</dc:language>
bzw. äquivalent
dc:language
<dcterms:RFC3066 rdf:value="en" />
</dc:language>
Wahlweise ist auch ein rdfs:label mit einer menschenlesbaren Erklärung eingebunden:
dc:format
dcterms:IMT
rdf:valuetext/html</rdf:value>
rdfs:labelHTML</rdfs:label>
</dcterms:IMT>
</dc:format>
Die Graphen/Triples zum Vergleich:
Verschachtelung/rdf:value:
http://www.w3.org/RDF/Validator/ARPServlet?TRIPLES_AND_GRAPH=PRINT_BOTH&FORMAT=PNG_EMBED&URI=http%3A%2F%2Fmolily.de%2Ftest03.rdf
Im Graph ist rdf:datatype nicht sichtbar, aber in den Triples wird es sichtbar:
"de"^^http://purl.org/dc/terms/RFC3066
"text/html"^^http://purl.org/dc/terms/IMT
Das ist die gewünschte Notation.
Welche Variante empfiehlt sich?
Mathias
[Argh, der RDF-Validator nimmt sich einmal wieder eine Auszeit. Dann funktionieren obige Links wohl momentan nicht.]