Dodatkowe możliwości RDF Seminarium magisterskie Paweł Chrząszczewski
Inne możliwości RDF RDF posiada szereg dodatkowych funkcji, takich jak wbudowane typy i właściwości reprezentujące grupy zasobów i stwierdzeń RDF dotyczących wielu różnych zasobów traktowanych jako całość. Często istnieje potrzeba opisania grupy rzeczy np. pokazania że książka została napisana przez kilku autorów lub stworzenia listy studentów zapisanych na jakiś kurs.
Kontenery RDF / RDF Containers Język RDF posiada udogodnienia do opisu grup obiektów. W terminologii RDF do przypisywania zasobom grup obiektów używamy jednego z trzech typów kontenerów (ang. containers), zależnie od wzajemnych relacji miedzy elementami grupy. W języku RDF istnieją trzy rodzaje kontenerów:
Kontenery RDF / RDF Containers Worek (ang. bag, znacznik rdf:bag) Sekwencja (ang. sequence, znacznik rdf:seq) Alternatywa (ang. alternative, znacznik rdf:alt) Należy przy tym zauważyć, ze to po stronie aplikacji leży odpowiedzialność za prawidłowe wykorzystanie znaczników opisujących kontenery, gdyż sam RDF definiuje jedynie typy i predykaty, których można użyć do konstrukcji kontenerów przechowujących zasoby.
Rdf:Bag Worek (ang. bag, znacznik rdf:bag) jest najprostszym kontenerem. Nazwa dobrze oddaje charakter i przeznaczenie tego kontenera, obiekty są do niego wrzucane jak do worka. Kontener ten zawiera nieuporządkowaną listę zasobów (lub literałów) w której poszczególne elementy mogą się powtarzać. Element <rdf:bag> może zawierać zduplikowane wartości Stosujemy go np. do opisu grupy
rdf:bag Przykład 1 <?xml version="1.0"?> <rdf:rdf xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:intrdf="http://www.semantict.net/rdf/intrordf/elements#" xml:base="http://www.semantict.net/rdf/"> <rdf:description rdf:about="spis.html"> <intrdf:ksiazki> <rdf:bag> <rdf:li rdf:resource="semanticweb.pdf"/> <rdf:li rdf:resource="rdf.pdf"/> <rdf:li rdf:resource="owl.pdf"/> </rdf:bag> </intrdf:ksiazki> </rdf:description> </rdf:rdf>
rdf:bag Graf 1 Gdzie: 1 - http://www.w3.org/1999/02/22-rdf-syntax-ns#bag 2 - http://www.semantict.net/rdf/semanticweb.pdf 3 - http://www.semantict.net/rdf/rdf.pdf 4 - http://www.semantict.net/rdf/owl.pdf
rdf:bag Jeżeli kontener zawiera literały zamiast zasobów wówczas każdy element jest określony następująco <rdf:li>internet Semantyczny</rdf:li> Zamiast elementów rdf:li możemy użyć elementów postaci rdf:_n gdzie n jest liczbą.
rdf:bag Przykład 2 <?xml version="1.0"?> <rdf:rdf xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:intrdf="http://www.semantict.net/rdf/intrordf/elements#" xml:base="http://www.semantict.net/rdf/"> <rdf:description rdf:about="spis.html"> <intrdf:ksiazki> <rdf:bag> <rdf:_1 rdf:resource="semanticweb.pdf"/> <rdf:_2 rdf:resource="rdf.pdf"/> <rdf:_3 rdf:resource="owl.pdf"/> </rdf:bag> </intrdf:ksiazki> </rdf:description> </rdf:rdf>
rdf:bag Elementy rdf:_n i rdf:li można użyć jednocześnie przy czym liczba n nie ma wpływu na numerację w grafie związaną z rdf:li.
rdf:bag Przykład 3 <?xml version="1.0"?> <rdf:rdf xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:intrdf="http://www.semantict.net/rdf/intrordf/elements#" xml:base="http://www.semantict.net/rdf/"> <rdf:description rdf:about="spis.html"> <intrdf:ksiazki> <rdf:bag> <rdf:li rdf:resource="semanticweb.pdf"/> <rdf:_5 rdf:resource="rdf.pdf"/> <rdf:li rdf:resource="owl.pdf"/> </rdf:bag> </intrdf:ksiazki> </rdf:description> </rdf:rdf>
rdf:bag Graf 3 Gdzie: 1 - http://www.w3.org/1999/02/22-rdf-syntax-ns#bag 2 - http://www.semantict.net/rdf/semanticweb.pdf 3 - http://www.semantict.net/rdf/rdf.pdf 4 - http://www.semantict.net/rdf/owl.pdf
rdf:seq Sekwencja (ang. sequence, znacznik rdf:seq) służy do reprezentowania listy obiektów tzn. zawiera uporządkowaną listę zasobów (lub literałów) w której poszczególne elementy mogą się powtarzać. A zatem w tym przypadku kolejność odgrywa role i jest określana za pomocą elementu rdf:_n widocznym na grafie. Wartość tego atrybutu związana jest z kolejnością elementów listy.
rdf:seq Przykład 1 <?xml version="1.0"?> <rdf:rdf xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:intrdf="http://www.semantict.net/rdf/intrordf/elements#" xml:base="http://www.semantict.net/rdf/"> <rdf:description rdf:about="spis.html"> <intrdf:ksiazki> <rdf:seq> <rdf:li rdf:resource="semanticweb.pdf"/> <rdf:li rdf:resource="rdf.pdf"/> <rdf:li rdf:resource="owl.pdf"/> </rdf:seq> </intrdf:ksiazki> </rdf:description> </rdf:rdf>
rdf:seq Przykład 2 W dokumencie RDF/XML możemy użyć elementy rdf:_n. <?xml version="1.0"?> <rdf:rdf xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:intrdf="http://www.semantict.net/rdf/intrordf/elements#" xml:base="http://www.semantict.net/rdf/"> <rdf:description rdf:about="spis.html"> <intrdf:ksiazki> <rdf:seq> <rdf:_1 rdf:resource="semanticweb.pdf"/> <rdf:_2 rdf:resource="rdf.pdf"/> <rdf:_3 rdf:resource="owl.pdf"/> </rdf:seq> </intrdf:ksiazki> </rdf:description> </rdf:rdf>
rdf:alt Alternatywa (ang. alternative, znacznik rdf:alt) służy do reprezentowania grupy obiektów, które są wartościami alternatywnymi (np. w metadanych opisujących plik na serwerze FTP może znaleźć się lista serwerów lustrzanych, na których również znajduje się ten plik). Musi on zawierać przynajmniej jeden element będący wartością domyślną (pierwszy element listy).
rdf:alt Przykład 1 <?xml version="1.0"?> <rdf:rdf xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:intrdf="http://www.semantict.net/rdf/intrordf/elements#" xml:base="http://www.semantict.net/rdf/"> <rdf:description rdf:about="kurs.html"> <intrdf:prowadzi> <rdf:alt> <rdf:_1 rdf:resource="11234"/> <rdf:_2 rdf:resource="34567"/> </rdf:alt> </intrdf:prowadzi> </rdf:description> </rdf:rdf> W powyższym przykładzie wykład prowadzi osoba o identyfikatorze 11234 lub osoba o identyfikatorze 34567.
Kolekcje W przeciwieństwie do kontenerów kolekcja zawiera skończoną liczbę elementów z zaznaczonym elementem ostatnim. W dokumentach RDF/XML kolekcja jest zdefiniowana przez atrybut rdf:parsetype="collection". Kolekcje RDF są używane do opisu grup, które mogą zawierać tylko określonych członków Ponadto kiedy jeden graf może opisywać niektórych z członków nie możemy wykluczyć że istnieje gdzieś inny graf który opisuje dodatkowych członków.
Kolekcje Opisane w poprzednim punkcie kontenery maja strukturę otwarta tzn. nie można wyspecyfikować pewnej liczby obiektów i stwierdzić, że są to już wszystkie elementy danego kontenera. W szczególności zdania opisujące zawartość kontenera mogą się pojawiać w wielu miejscach grafu. Dlatego RDF udostępnia strukturę kolekcji (ang. collection). Budowę kolekcji omówię na przykładzie. Rozważmy sytuacje, w której opisujemy pojęcia związane z grafika. Chcemy wyspecyfikować trzy barwy jako podstawowe: czerwona, zielona i niebieska. Możemy do tego celu użyć kolekcji.
Kolekcje Przykład 1 <?xml version="1.0"?> <rdf:rdf xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:intrdf="http://www.semantict.net/rdf/intrordf/elements#" xml:base="http://www.semantict.net/rdf/"> <rdf:description rdf:about="http://example.org/graphics"> <ex:primaries rdf:parsetype="collection"> <rdf:description rdf:about="http://example.org/graphics#red"/> <rdf:description rdf:about="http://example.org/graphics#green"/> <rdf:description rdf:about="http://example.org/graphics#blue"/> </ex:primaries> </rdf:description> </rdf:rdf>
Kolekcje Kolekcja jest reprezentowana w RDF jako lista z nazewnictwem i strukturami zaczerpniętymi z języka programowania Lisp. Węzły tej listy są puste, z każdego wychodzą dwie krawędzie. Jedna, etykietowana rdf:first wskazuje na węzeł w którym przechowywany jest klucz (czyli element kolekcji). Druga, etykietowana rdf:rest pełni role wskaźnika next w klasycznej implementacji listy, czyli pozwala na przejście do następnego elementu. Ostatni pusty węzeł ma wskaźnik wskazujący na specjalny element etykietowany rdf:nil, czyli kończący listę. RDF/XML upraszcza w dużym stopniu te skomplikowana strukturę ukrywając szczegóły przed użytkownikiem.
Reifikacje W języku RDF całe zdania mogą być również traktowane jako zasoby. Dzięki funkcjonalności określanej mianem reifikacji (ang. reification) można konstruować stwierdzenia, których podmiotami są inne stwierdzenia. Jest to bardzo użyteczne w wielu sytuacjach np. gdy chcemy zapisać kto jest autorem danego stwierdzenia. RDF posiada specjalne elementy słownictwa, których można użyć do opisu stwierdzenia (czyli właśnie reifikacji): rdf:statement, rdf:subject, rdf:predicate, rdf:object. Dla przykładu rozważmy pojedyncze zdanie w RDF opisujące język w jakim jest napisany dokument o adresie http://example.org/index.html.
Reifikacje Przykład 1 <?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://example.org/index.html"> <DC:language>en</DC:language> </rdf:description> </rdf:rdf>
Reifikacje Zakładamy, że chcemy zapisać kto jest autorem tego stwierdzenia. W tym celu możemy zastosować reifikacje. Kluczowe jest wprowadzenie dodatkowego węzła o URI http://example.org#triple123, pełniącego role identyfikatora stwierdzenia (informuje o tym zdanie z predykatem rdf:type i obiektem rdf:statement). Trzy zdania z predykatami rdf:subject, rdf:predicate i rdf:object specyfikują elementy opisywanego zdania: podmiot, orzeczenie i obiekt. RDF rozszerzamy również o zdanie z identyfikatorem trójki użytym bezpośrednio jako podmiotem. Mówi ono, że osoba identyfikowana jako http://www.tworcy.org#janek była autorem stwierdzenia.
Reifikacje Przykład 2 <?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/" xml:base="http://example.org" > <rdf:statement rdf:id="triple123"> <rdf:subject rdf:resource="http://example.org/index.html"/> <rdf:predicate rdf:resource="http://purl.org/dc/elements/1.1/language"/> <rdf:object>en</rdf:object> <DC:creator rdf:resource="http://www.tworcy.org#janek"/> </rdf:statement> <rdf:description rdf:about="http://example.org/index.html"> <DC:language>en</DC:language> </rdf:description> </rdf:rdf>
Reifikacje Zapis w XML pozwala jednak na duże uproszczenie i zmniejszenie liczby zdań wpisywanych explicite dzięki wykorzystaniu atrybutu rdf:id. Zamiast specyfikować elementy trójki za pomocą predykatów rdf:subject, rdf:predicate i rdf:object wystarczy nadać zdaniu identyfikator (wpisując go jako atrybut rdf:id) i odwoływać się do niego dalej tak jak do ID zwykłego zasobu:
Reifikacje Przykład 3 <?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/" xml:base="http://example.org" > <rdf:description rdf:about="http://example.org/index.html"> <DC:language rdf:id="triple123">en</dc:language> </rdf:description> <rdf:description rdf:about="#triple123"> <DC:creator rdf:resource="http://www.tworcy.org#janek"/> </rdf:description> </rdf:rdf>
Typowane literały Literały w RDF mogą mieć wyspecyfikowany typ. Do oznaczenia faktu, że literał powinien być traktowany jako dana określonego typu, używamy atrybutu rdf:datatype. Najczęściej używane są typy danych zdefiniowane przez W3C w schematach XML. I tak możemy dodać zdanie informujące o dacie utworzenia dokumentu, węzeł opisujący ten zasób zyska dodatkowy węzeł potomny: <DC:date rdf:datatype="http://www.w3.org/2001/xmlschema#date"> 2011-10-26 </DC:date>
Typowane literały Zastosowanie ścisłego systemu typów nakłada ograniczenia na wartości jakie mogą przyjąć literały. Wzbogacone zostaje znaczenie predykatów i aplikacja wykorzystująca informacje o typach może w zautomatyzowany sposób wykryć błędne zastosowania literałów takie jak użycie słowa gdy spodziewana jest liczba. Ułatwia to zachowanie spójności.
Typowane literały Dla poprawienia czytelności dokumentu często wykorzystywane są encje XML. W tym celu należy umieścić tuz po deklaracji dokumentu XML dodatkowa deklaracje DOCTYPE: <!DOCTYPE rdf:rdf [ <!ENTITY xsd"http://www.w3.org/2001/xmlschema#"> ]> Teraz w przykładzie z data możemy zastąpić długi URI przez referencje do encji: <DC:date rdf:datatype="&xsd;date">2011-10-26</dc:date>
rdf:value Rozważmy następujący przykład: <intrdf:modyfikacja>23</intrdf:modyfikacja> Przyjmijmy, że liczba 23 związana jest z ostatnią datą modyfikacji tzn. tyle dni temu zasób był modyfikowany. Nie wiemy jednak czy chodzi o godziny, dni, czy może miesiące. Taką dodatkową informację możemy zapisać następująco: <intrdf:modyfikacja>23 dni</intrdf:modyfikacja> W tym przypadku wydobycie informacji o liczbie dni wymaga jednak rozbicia zawartości znacznika na dwa elementy: liczba i słowo dni. Informację taką możemy jednak zapisać inaczej: <intrdf:modyfikacja>23</intrdf:modyfikacja> <intrdf:jednostka>dzień</intrdf:jednostka>
rdf:value Przykład W tym przypadku jednak wartość 23 nie jest ściśle związana z jednostką poza tym, że modyfikacja i jednostka są właściwościami tego samego zasobu. Powyższych problemów możemy uniknąć jeżeli zastosujemy predykat rdf:value, który określa właśnie wartość. Rozważmy przykład:
rdf:value Przykład <?xml version="1.0"?> <rdf:rdf xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:intrdf="http://www.semantict.net/rdf/intrordf/elements#" > <rdf:description rdf:about="http://www.semantict.net/rdf/intrordf/"> <intrdf:modyfikacja> <rdf:value>23</rdf:value> <intrdf:jednostka>dzien</intrdf:jednostka> </intrdf:modyfikacja> </rdf:description> </rdf:rdf>
Dziękuję za uwagę