Żółwie aż do końca, czyli jak zapisać graf RDF
W poprzednim odcinku pisałem o tym czym jest RDF. Starałem się nie wnikać w szczegóły techniczne. Ale, jeżeli chcemy naprawdę zrozumieć technologie Sieć Semantycznej, niektóre szczegóły techniczne są nieodzowne. Zanim więc przejdziemy do prezentacji schematów RDF i ontologii, omówię jak zapisać graf RDF tak aby mógł być przetworzony przez maszyny.
Już słyszę te głosy: ale przecież zgodnie z tym co słyszeliśmy do tej pory, i z tym co pisałeś przy prezentacji semantycznego tortu, RDF zapisujemy w XMLu. Część z was posunie się nawet krok dalej i stwierdzi, że przecież RDF to tylko jeden z dialektów XML.
Czas więc, aby obalić jeden z mitów, z którym niestety spotykam się zbyt często. O ile RDF można zapisać w postaci XML to:
- nie jest to natywny format zapisu, tym samym RDF nie jest "tylko" dialektem XML,
- nie jest to preferowany format zapisu, i to nie tylko z uwagi na jego rozwlekłość,
- nie jest to jednoznaczny sposób zapisu grafu RDF.
Ostatni punkt wymaga dodatkowych wyjaśnień. Porównajmy następujące zapisy XML:
<?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/"> <rdf:Description rdf:about="http://www.w3.org/TR/rdf-syntax-grammar" dc:title="RDF/XML Syntax Specification (Revised)" /> rdf:RDF>
oraz
<?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/"> <rdf:Description rdf:about="http://www.w3.org/TR/rdf-syntax-grammar" > <dc:title>RDF/XML Syntax Specification (Revised)</dc:title> </rdf:Description> </rdf:RDF>
Wyrażają one ten sam graf RDF: dokładnie jedno zdanie. Jednak ich reprezentacja jest inna. Stąd też próba przetworzenia grafu RDF zapisanego w XMLu wymaga rozpatrywania wielu możliwości zapisu. Jeżeli chcecie abym rozwinął ten temat - zapraszam do zgłaszania uwag w komentarzach.
Wróćmy jednak do podstaw. Przedstawmy poniższy prosty graf RDF w znanych reprezentacjach.

Jak o tym pisałem w poprzednim artykule, podstawowym elementem grafu RDF jest zdanie RDF (ang. RDF statement). Cały graf RDF można więc przestawić jako kolekcję zdań (bez określonej ich kolejności):
- [Strona http://www.semanticschool.com/] [dc:title] (ma tytuł) "Szkoła Web 3.0".
- [Strona http://www.semanticschool.com/] [dc:editor] (jest edytowana przez) [nienazwanego edytora].
- [Nienazwany edytor] [foaf:homepage] (posiada stronę domową) [http://www.sebastiankruk.com/].
Przy okazji proszę zwrócić uwagę na notację graficzną grafu RDF:
- Zasoby (ang. resource) reprezentowane są przez elipsy.
- Literały (ang. literal) reprezentowane są przez prostokąty.
- Nienazwane węzły (ang. blank nodes lub bnodes) reprezentowane są przez puste okręgi.
- Predykaty (ang. predicate) przedstawiane są za pomocą strzałek z etykietami.
Kolekcję zdań można zapisać w formacie N-Triples następująco:
<http://www.semanticschool.com/> <http://purl.org/dc/elements/1.1/title> "Szkoła Web 3.0". <http://www.semanticschool.com/> <http://purl.org/dc/elements/1.1/editor> _:node14fuqdek3x1. _:node14fuqdek3x1 <http://xmlns.com/foaf/0.1/homepage> <http://www.sebastiankruk.com/>.
Kilka wyjaśnień:
- Zasób RDF, reprezentowany przez URI, zapisujemy w nawiasach trójkątnych <http://www.semanticschool.com/>
- Literały zapisujemy w cudzysłowach.
- Nienazwane węzły (ang. blank node) są reprezentowane przez wewnętrzny ID rozpoczynający się od _:
- Każde zdanie składa się z dokładnie 3 elementów i jest zakończone kropką.
Ponieważ format N-Triples jest dość rozwlekły, popularna jest format skrócona: Turtle. Nazwa (jak kiedyś zdradził mi twórca Turtle, Dave Beckett) zaczerpnięta została z popularnego określenia "Turtles all the way down", a właściwie jej parafrazy z serii "Świat Dysku" (Discworld), Terrego Pratchetta.
Nasz graf może być zapisany w formacie Turtle:
@prefix ns3: <http://xmlns.com/foaf/0.1/> . @prefix ns2: <http://purl.org/dc/elements/1.1/> . <http://www.semanticschool.com/> ns2:title "Szkoła Web 3.0" ; ns2:editor _:node14fuqdek3x1 . _:node14fuqdek3x1 ns3:homepage <http://www.sebastiankruk.com/> .
Jak widzimy pierwszym elementem skracającym opis są definicje przestrzeni nazw (ang. namespace) za pomocą notacji @prefix ns:. Te URI, które zostały skrócone nie są już zapisywane w nawiasach trójkątnych, np: ns2:title . Możliwe jest też połączenie kilku zdań na temat tego samego podmiotu. W tym celu zdania kończy się średnikiem, a kolejne rozpoczyna od predykatu. Format Turtle jest zdefiniowany jako podzbiór formatu: Notation 3 (N3), i dla naszego prostego przykładu nie ma żadnych różnic w reprezentacji pomiędzy tymi dwoma formatami. Jeżeli ktoś jest zainteresowany N3, to proszę o kontakt w komentarzach, postaram się opisać ten format za jakiś czas.
Wróćmy jeszcze do formatu RDF/XML, czyli zapisu RDF w formacie XML. Nasz przykładowy graf wyglądałby następująco:
<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:ns3="http://xmlns.com/foaf/0.1/"
xmlns:ns2="http://purl.org/dc/elements/1.1/">
<rdf:Description rdf:nodeID="node14fuqdek3x1">
<ns3:homepage rdf:resource="http://www.sebastiankruk.com/"/>
</rdf:Description>
<rdf:Description rdf:about="http://www.semanticschool.com/">
<ns2:title>Szkoła Web 3.0</ns2:title>
<ns2:editor rdf:nodeID="node14fuqdek3x1"/>
</rdf:Description>
</rdf:RDF>
Podobnie jak Turtle, również RDF/XML umożliwia definiowanie prefiksów dla przestrzeni nazw. Kolejne podmioty opisujemy za pomocą elementów rdf:Description, które w przypadku zasobów mają określony atrybut rdf:about, a w przypadku nienazwanych węzłów stosowany jest atrybut rdf:nodeID. Predykaty mogą być przedstawiane jako podelementy lub dodatkowe atrybuty (patrz poprzedni przykład RDF/XML). Wskazanie obiektów (trzeci element zdania RDF) odbywa się za pomocą atrybutu rdf:resource dla zasobów lub rdf:nodeID dla nienazwanych węzłów; można również skorzystać z kolejnych podelementów.
![Reblog this post [with Zemanta]](http://img.zemanta.com/reblog_e.png?x-id=c3e1595c-1503-47cb-b672-a554a124867b)

