Szkoła Web 3.0 Dowiedz się czym jest Sieć Semantyczna

29wrz/09Off

Żół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.

rdfexample-00

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.

xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:ex="http://example.org/stuff/1.0/">
<rdf:Description rdf:about="http://www.w3.org/TR/rdf-syntax-grammar"
dc:title="RDF/XML Syntax Specification (Revised)" />
</rdf:RDF>
Reblog this post [with Zemanta]