Na podstawie artykułu: http://www.w3.org/teamsubmission/turtle/ 1
Nazwa Terse RDF Triple Language konkretna składnia językowa dla frameworka RDF i jego standardów rozszerzenie N-Triples wykorzystujące najbardziej użyteczne rzeczy zaczerpnięte z Notation 3 - przy zachowaniu modelu RDF "Nadzbiór" N-Triples i "podzbiór" Notation 3: Wszystkie RDFy zapisane przy użyciu Turtle powinny być używalne wewnątrz SPARQL Protocol And RDF Query Language 2 z 27
Turtle pozwala na tworzenie grafów RDF zapisanych w zwięzłej i naturalnej formie tekstowej. Zapis ten korzysta ze skrótów dla wzorców i typów danych często używanych w RDF. Charakteryzuje się kompatybilnością z istniejącymi już N-Triples i Notation 3. Rekomendowana składnia XML dla RDF, RDF/XML posiada pewne ograniczenia narzucone przez XML i zasady używania namespaców. Ograniczenia te uniemożliwiają zapisanie wszystkich możliwych grafów RDF: [1]niektóre URIs są przez XML zabronione [2] XML 1.0 uniemożliwia kodowanie niektórych znaków Unicode Turtle nie posiada takich ograniczeń 3 z 27
Notation 3 (N3) - skrócony, nie-xmlowy model zapisu (serializacji) modeli RDF zaprojektowany z uwzględnieniem human-readability. Znacznie czytelniejszy niż XML/RDF: RDF/XML: <rdf:rdf xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/"> <rdf:descriptionrdf:about="http://en.wikipedia.org/wiki/tony_benn"> <dc:title>tony Benn</dc:title> <dc:publisher>wikipedia</dc:publisher> </rdf:description> </rdf:rdf> To samo w N3: @prefix dc: <http://purl.org/dc/elements/1.1/>. <http://en.wikipedia.org/wiki/tony_benn> dc:title "Tony Benn"; dc:publisher "Wikipedia". http://www.w3.org/teamsubmission/n3/ http://www.w3.org/designissues/notation3.html http://www.w3.org/2000/10/swap/primer 4 z 27
Format zapisu (serializacji) modeli grafów RDF Zaprojektowany by uprościć format N3 i Turtle i tym smamym ułatwić parsowanie i generowanie Pewne uproszczenia (w stosunku np. do RDF/XML i Turtle) powodują, że zapis dużej ilości danych może być uciążliwy i trudny do odczytania <http://www.w3.org/2001/sw/rdfcore/ntriples/> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://xmlns.com/foaf/0.1/document>. <http://www.w3.org/2001/sw/rdfcore/ntriples/> <http://purl.org/dc/terms/title> "N-Triples"@en-US. <http://www.w3.org/2001/sw/rdfcore/ntriples/> <http://xmlns.com/foaf/0.1/maker> _:art. <http://www.w3.org/2001/sw/rdfcore/ntriples/> <http://xmlns.com/foaf/0.1/maker> _:dave. _:art <http://www.w3.org/1999/02/22-rdf-syntax-ns#> <http://xmlns.com/foaf/0.1/person>. _:art <http://xmlns.com/foaf/0.1/name> "Art Barstow". _:dave <http://www.w3.org/1999/02/22-rdf-syntax-ns#> <http://xmlns.com/foaf/0.1/person>. _:dave <http://xmlns.com/foaf/0.1/name> "Dave Beckett". 5 z 27
Turtle pozwala na zapis grafów RDF w formie tekstowej składa się z sekwencji dyrektyw, RDF-Triples (trójki) lub pustych linii. Każda linia kończy się. komentarz zaczynamy od hasha; obowiązuje on do końca linii: # Przykładowy dokument Turtle: @prefix foo: <http://example.org/ns#>. @prefix : <http://other.example.org/ns#>. foo:bar foo:like foo:object. :bar foo:interest foo:sth. 6 z 27
Możemy wyróżnić trzy elementy składające się na RDF Terms: RDF URI References (URIs) Literały Blank Nodes 7 z 27
# Przykładowy dokument Turtle: @prefix foo: <http://example.org/ns#>. @prefix : <http://other.example.org/ns#>. foo:bar foo:like foo:object. :bar foo:interest foo:sth. URI References (URIs) są zapisywane wewnątrz znaczników < i > URIs: absolute lub relative URIs Mogą być skracane poprzez @prefix: http://example.org/ns#bar Default prefix, czyli : @prefix : foo:bar 8 z 27
Białe znaki są używane do odseparowania dwóch tokenów, które nieoddzielone mogłyby być odczytywane jako pojedynczy token. Białe znaki są znaczące w następujących tokenach: - Relative URIs - string - longstring 9 z 27
"chat" "czat"@pl "chat"@en """String with new line""" "foo"^^http://example.org/my/datatype > """10"""^^xsd:decimal Pojedyncze i potrójne cudzysłowy (podwójne i poszóstne ) Przyrostki opisujące język Przyrostki opisujące typ danych (pełne bądź jaki Qname) 10 z 27
Przykład dwóch identycznych trójek zawierających literały z nowymi liniami: @prefix : <http://example.org/stuff/1.0/>. :a :b "The first line\nthe second line\n more". :a :b """The first line The second line more""". Literały i URI References mogą posiadać znaki ucieczki np.: \t (U+0009) \n (U+000A) \r (U+000D) \" (U+0022) tylko dla stringów '\> (tylko wewnątrz relativeuris) 11 z 27
Blank nodes - czyli puste węzły - zapisywane są jako _:nodeid, gdzie nodeid jest indentyfikatorem danego węzła. Pusty węzeł może być także utworzony poprzez [ ] co przydaje się gdy chcemy zaopatrzyć Subject (z trójki RDF) w parę <predykat, object>. Użycie pustego węzła pozwala formułować stwierdzenia typu Jakaś osoba o imieniu Kirk interesuje się muzyką zamiast Kirk interesuje się muzyką _:me _:a1234 12 z 27
Jeśli, przykładowo, w trójce Subject Predicate Object ostatnia jej część składa się z więcej niż jednego URI, możemy rozdzielić te URI używając symbolu, : @prefix : <http://xmlns.com/foaf/0.1/>. <mailto:person@example.net> :interest <http://www.foaf-project.org/>, <http://www.ilrt.bris.ac.uk/discovery/2004/01/turtle/>. Jeśli mamy ten sam subject w więcej niż jednym statemencie oraz różne relacje, możemy odseparować pary (relacja - object) używając średnika: <mailto:person@example.net> :name "Anne Example-Person" ; :interest <http://www.foaf-project.org/>, <http://www.ilrt.bris.ac.uk/discovery/2004/01/turtle/>. 13 z 27
Bardzo często występującą relacją jest relacja między rzeczą a kategorią, do której ta rzecz należy, czyli type. Jeśli chcemy powiedzieć, że Ann jest osobą napiszemy: @prefix : <http://xmlns.com/foaf/0.1/>. @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>. <mailto:person@example.net> rdf:type :Person. Relacja ta jest tak często spotykana, Turtle posiada specjalne zarezerwowane słowo a pozwalające na zapis: @prefix : <http://xmlns.com/foaf/0.1/>. <mailto:person@example.net> a :Person. 14 z 27
Zapis używający N-Triples: <http://www.w3.org/2001/sw/dataaccess/df1/tests/test-00.ttl> <http://www.w3.org/2001/sw/dataaccess/df1/tests/test-01.ttl> <http://www.w3.org/2001/sw/dataaccess/df1/tests/test-02.ttl>. <http://example.org/ns/a2> <http://example.org/ns/b2> <http://example.org/ns/c2>. <http://example.org/ns/foo/a3> <http://example.org/ns/foo/b3> <http://example.org/ns/foo/c3>. <http://example.org/ns/foo/bar#a4> <http://example.org/ns/foo/bar#b4> <http://example.org/ns/foo/bar#c4>. <http://example.org/ns2#a5> <http://example.org/ns2#b5> <http://example.org/ns2#c5>. 15 z 27
Początkowy Base URI jest zdefiniowany poprzez użycie mechanizmu opisanego w URI RFC - zależny od protokołu lub innego kontekstu poza dokumentem. Podczas parsowania przez turtle, base URI w dowolnym punkcie dokumentu jest oznaczany przez użycie dyrektywy @base, która ustawia nowy base URI relatywny to bieżącego. Dyrektywa @base może być stosowana wielokrotnie. # aktualne base URI to URI dokumentu: <a1> <b1> <c1>. @base <http://example.org/ns/>. # aktualne base URI to http://example.org/ns/ <a2> <http://example.org/ns/b2> <c2>. @base <foo/>. # nowe base URI <a3> <b3> <c3>. @prefix : <bar#>. :a4 :b4 :c4. @prefix : <http://example.org/ns2#>. :a5 :b5 :c5. 16 z 27
Poprzedni zapis odpowiada poniższemu zapisowi w N-Triples: <http://www.w3.org/2001/sw/dataaccess/df1/tests/test-00.ttl> <http://www.w3.org/2001/sw/dataaccess/df1/tests/test-01.ttl> <http://www.w3.org/2001/sw/dataaccess/df1/tests/test-02.ttl>. <http://example.org/ns/a2> <http://example.org/ns/b2> <http://example.org/ns/c2>. <http://example.org/ns/foo/a3> <http://example.org/ns/foo/b3> <http://example.org/ns/foo/c3>. <http://example.org/ns/foo/bar#a4> <http://example.org/ns/foo/bar#b4> <http://example.org/ns/foo/bar#c4>. <http://example.org/ns2#a5> <http://example.org/ns2#b5> <http://example.org/ns2#c5>. <a1> <b1> <c1>. @base <http://example.org/ns/>. <a2> <http://example.org/ns/b2> <c2>. @base <foo/>. <a3> <b3> <c3>. @prefix : <bar#>. :a4 :b4 :c4. @prefix : <http://example.org/ns2#>. :a5 :b5 :c5. 17 z 27
Wartą uwagi częścią FOAF jest możliwość opisywania relacji między osobami. Przykładowo, Ann zna osobę o imieniu Mr Bean, którego email to <bean@example.com>. Możemy to zapisać następująco: @prefix : <http://xmlns.com/foaf/0.1/>. <mailto:ann@example.net> :knows mailto:bean@example.org>. <mailto:bean@example.org> a :Person; :name Mr Bean". 1) Ann zna osobę o emailu bean@example.org 2) Osoba o tym mailu: a) Jest typu osoba b) Nazywa się Mr Bean 18 z 27
@prefix : <http://xmlns.com/foaf/0.1/>. <mailto:ann@example.net> :knows mailto:bean@example.org>. <mailto:bean@example.org> a :Person; :name Mr Bean". Może się jednak zdarzyć, że nie chcemy definiować URLa (emaila). W zamian tego chcemy użyć obiektu anonimowego w miejscu przeznaczonym na obiekt. Obiekty anonimowe są definiowane poprzez nawiasy kwadratowe obejmujące jedną bądź więcej par relacjaobiekt oddzielając obiekty średnikami. Można tak zdefiniować wszelkiego rodzaju relacje, dla których ten obiekt jest subjectem: @prefix : <http://xmlns.com/foaf/0.1/>. <mailto:ann@example.net> :knows [ a :Person ; :name Mr Bean" ]. 19 z 27
Liczby całkowite dziesiętne mogą być zapisywane bezpośrednio lub poprzez nawiązanie do XML Schema Datatype xsd:integer: -5 10 +1 "-5"^^xsd:integer "10 ^^http://www.w3.org/2001/xmlschema#integer Liczby dziesiętne zmienno przecinkowe analogiczne: 1.3e2 10e0-12.5e10 1.3e2"^^xsd:double " -12.5e10 ^^http://www.w3.org/2001/xmlschema#double 20 z 27
Liczby dziesiętne stało przecinkowe analogiczne: 1.3 10.0-12.512 13.5"^^xsd:decimal "-12.294 ^^http://www.w3.org/2001/xmlschema#decimal Liczby typu boolean: true false true ^^xsd:boolean false ^^http://www.w3.org/2001/xmlschema#boolean 21 z 27
Przykład kolekcji: ( object1 object2 ) jest skrótem dla: [ rdf:first object1; rdf:rest [ rdf:first object2; rdf:rest rdf:nil ] ] ( ) to skót od: rdf:nil 22 z 27
Kolekcje RDF mogą być skracane przy użycie ciągu RDF Termsów (URI, literały i puste węzły) ujętego w nawiasy okrągłe. W celu ich odseparowania mogą być, jak zykle, użyte białe znaki. Format ten dostarcza pusty węzeł na początku kolekcji RDF, który może być użyty w dalszych skracaniach. Przykład: @prefix : <http://example.org/foo>. # wartością tej trójki jest pusty węzeł RDF: :subject :predicate ( :a : b : c ). # wartość pustej kolekcji: rdf:nil :subject :predicate2 (). 23 z 27
<?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/" 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)"> <ex:editor> <rdf:description ex:fullname="dave Beckett"> <ex:homepage df:resource="http://purl.org/net/dajobe/" /> </rdf:description> </ex:editor> </rdf:description> </rdf:rdf> @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>. @prefix dc: <http://purl.org/dc/elements/1.1/>. @prefix ex: <http://example.org/stuff/1.0/>. <http://www.w3.org/tr/rdf-syntax-grammar> dc:title "RDF/XML Syntax Specification (Revised)" ; ex:editor [ ex:fullname "Dave Beckett"; ex:homepage <http://purl.org/net/dajobe/> ]. Średnik - powtarza subject trójek, które różnią się predykatem i objectem 24 z 27
1. Zamapowanie ericfoaf na IRI http://www.w3.org/people/eric/ericp-foaf.rdf#. 2. Zamapowanie pustego prefiksu na IRI http://xmlns.com/foaf/0.1/. 3. cursubject http://www.w3.org/people/eric/ericp-foaf.rdf#ericp. 4. curpredicate IRI http://xmlns.com/foaf/0.1/givenname. 5. Wygenerowanie trójki: <...rdf#ericp> <.../givenname> "Eric". 6. curpredicate http://xmlns.com/foaf/0.1/knows. 7. Wygenerowanie trójki : <...rdf#ericp> <.../knows> <...who/dan-brickley>. 8. Wygenerowanie trójki : <...rdf#ericp> <.../knows> <_:blank>. 9. Zapis stanu cursubject i przypisanie cursubject _blank1. 10.Zapis stanu curpredicate. 11. curpredicate http://xmlns.com/foaf/0.1/mbox. 12.Wygenerowanie trójki: _:blank <.../mbox> <mailto:timbl@w3.org>. 13.Przywrócenie zapisanych wartości cursubject i curpredicate 14.Wygenerowanie trójki: <...rdf#ericp> <.../knows> <http://getopenid.com/amyvdh>. 25 z 27
Jak wcześniej wspomniano, Turtle jako nadzbiór N-Triples dodaje do N-Triples pewne elementy składniowe: Usunięto restrykcje dotyczące whitespaceów Kodowanie znaków zmienione z ASCII na UTF-8 Dyrektywa @base do ustawiania base URI Dyrektywa @prefix do przypisywania namespaców Nazwy prefiksowane (<myprefix:subject>) Listy obiektów oddzielanych przecinkami Listy predykatów-obiektów oddzielanych średnikiem Nienazwane puste węzły oznaczane poprzez [] Skrót a równoważny rdf:type RDF collection constructor bound by ()s Literały typu deciam integer - xsd:integer Literały typu deciaml double - xsd:double Literały typu decimal stałoprzecinkowe - xsd:decimal Literały true/false typu Boolean - xsd:boolean 26 z 27
Notation 3 zawiera (co najmniej) następujące elementy składniowe, niewystępujące w Turtle. Lista ta nie zawiera wszystkich różnic. {... } is of paths like :a.:b.:c and :a^:b^:c @keywords => implies = equivalence @forall @forsome <= 27 z 27