Marcin Skulimowski Wprowadzenie do Resource Description Framework I. Podstawy RDF RDF jest językiem służącym do reprezentacji informacji na temat zasobów w taki sposób aby informacje te mogły być łatwo przetwarzane przez aplikacje. Zasoby (Resources) Zasobem może być wszystko, każda rzecz, każdy obiekt np. książki, samochody, ludzie, wydawcy etc. Ważne jest aby każdy zasób posiadał identyfiaktor URI (ang. Universal Resource Identifier Zunifikowany Identyfikator Zasobów). Identyfikatorem URI może być wszystko co jednoznacznie identyfikuje dany zasób np.: numer ISBN, numer telefonu komórkowego. Szczególnym przypadkiem URI jest URL (ang. Universal Resource Locator Identyfikator Lokalizacji Zasobów) określony dla zasobów internetowych. Identyfikator URI nie musi umożliwiać dostępu do zasobu, ma go tylko jednoznacznie identyfikować. Szczególnym przypadkiem zasobów odgrywających ważną rolę w języku RDF są tzw. właściwości. Właściwości (Properties) Właściwości opisują cechy i właściwości zasobów np.: zatytułowany, napisany przez, należący do, w kolorze. Ponieważ właściwości są także zasobami oznacza to, że są identyfikowane przez URI (w praktyce często przez URL). Stwierdzenia o zasobach Ważnym elementem języka naturalnego są zdania. Zdania oznajmujące informują nas o pewnych faktach dotyczących występującego w nich podmiotu. Przykład 1 Rozważmy zdanie http://xxx.lanl.gov/abs/cs/0610020 ma tytuł XString: XML as a String. W zdaniu tym możemy wyróżnić trzy elementy: Rzecz, która jest w tym zdaniu opisywana tzn. artykuł. Właściwość opisywanej rzeczy wyrażona przez ma tytuł. Wartość właściwości tytuł czyli XString: XML as a String. Można sobie wyobrazić inne stwierdzenia charakteryzujące powyższy artykuł np. 1
http://xxx.lanl.gov/abs/cs/0610020 ma autora, którym jest W. F. Gilreath a. http://xxx.lanl.gov/abs/cs/0610020 jest napisany w języku angielskim. Podstawowa idea języka RDF sprowadza się do założenia, że zasoby można opisywać przy pomocy stwierdzeń analogicznych do powyższych. Każde stwierdzenie języka RDF zawiera trzy elementy: podmiot (ang. subject) zasób (np. osoba, miejsce, rzecz) o którym mówi stwierdzenie. orzeczenie (ang. predicate) właściwość (np. nazwa, miasto, tytuł, kolor, kształt, charakterystyka) podmiotu. obiekt (ang. object) wartość właściwości opisywanej przez orzeczenie. Obiekt może być zasobem lub tzw. literałem czyli ciągiem znaków. Dzięki temu, że właściwości są zasobami mogą być szczegółowo określone w stwierdzeniach w których będą podmiotami. Pozwala to na precyzyjne określenie zależności między zasobami. Przykład 2 Zdanie Artykuł http://xxx.lanl.gov/abs/cs/0610020 ma tytuł XString: XML as a String. może być reprezentowane w języku RDF przez następujące stwierdzenie: podmiot - http://xxx.lanl.gov/abs/cs/0610020 orzeczenie http://www.abc.net/elements/tytul obiekt XString: XML as a String. Zgodnie z wymogami RDF podmiot i orzeczenie w powyższym stwierdzeniu są jednoznacznie identyfikowane przez identyfikatory URI. Obiekt jest ciągiem znaków. Reprezentacja stwierdzeń Grafy Podstawową reprezentacją stwierdzeń języka RDF są grafy skierowane. Podmiot i obiekt są węzłami grafu. Orzeczenie jest krawędzią skierowaną od węzła reprezentującego podmiot do węzła reprezentującego orzeczenie. 2
Podmiot Orzeczenie 1 Orzeczenie 2 Literał Obiekt Podmioty i obiekty będące zasobami oznaczamy węzłem owalnym. Literały oznaczamy węzłami w kształcie prostokąta. Przykład 3 Stwierdzenie z Przykładu 1 ma następującą reprezentację: http://xxx.lanl.gov/abs/cs/0610020 http://www.abc.net/elements/tytul XString: XML as a String Przykład 4 Graf reprezentujący dwa stwierdzenia. http://www.semantict.net/rdf/intrordf http://rdf.semantict.net/intrordf/elements#autor http://rdf.semantict.net/intrordf/elements#tytuł Marcin Skulimowski Wprowadzenie do RDF Notacja N3 Inną reprezentacją języka RDF jest tzw. notacja N3. Stwierdzenie w notacji N3 wygląda następująco: W przypadku gdy OBIEKT jest literałem: <PODMIOT> <ORZECZENIE> <OBIEKT>. 3
Rozpatrzmy konkretne przykłady. Przykład 5 <PODMIOT> <ORZECZENIE> OBIEKT. Stwierdzenia z Przykładu 4 możemy przedstawić następująco: <http://rdf.semantict.net/intrordf> <http://rdf.semantict.net/intrordf/elements#autor> Marcin Skulimowski. <http://rdf.semantict.net/intrordf> <http://rdf.semantict.net/intrordf/elements#tytul> Wprowadzenie do RDF. Aby uniknąć pisania pełnych identyfikatorów URI możemy używać tzw. QNazw. QNazwa składa się z prefiksu określającego przestrzeń nazw po którym następuje dwukropek i lokalna nazwa zasobu. Pełen identyfikator URI otrzymujemy wówczas przez połączenie identyfikatora URI przestrzeni nazw i nazwy lokalnej zasobu. Stosując QNazwy możemy pominąć nawias kwadratowy. Przykład 6 Rozpatrzmy stwierdzenia z Przykładu 5. Przyjmijmy, że prefiks intrdf związany jest z przestrzenią nazw http://rdf.semantict.net/intrordf/elements#, natomiast prefiks semt związany jest z przestrzenią nazw http://rdf.semantict.net/. Wówczas powyższe stwierdzenia możemy zapisać następująco: @prefix intrdf: http://rdf.semantict.net/intrordf/elements#. @prefix semt: http://rdf.semantict.net/. semt:intrordf intrdf:autor Marcin Skulimowski. semt:intrordf intrdf:tytul Wprowadzenie do RDF. Zauważmy, że przestrzenie nazw definiujemy przy pomocy @prefix. Zauważmy, że w stwierdzeniu 1 obiekt czyli autor jest ciągiem znaków. W ten sposób nie jesteśmy w stanie podać żadnych dodatkowych informacji dotyczących autora np. adres strony WWW, e-mail etc. (podmiotem stwierdzeń może być tylko zasób!). Jeżeli chcielibyśmy to zrobić musielibyśmy autora określić jako zasób. 4
Przykład 7 Określmy identyfikator URL autora: http://www.semantict.net/ludzie/2344 Graf wygląda wówczas następująco: http://www.semantict.net/rdf/intrordf http://rdf.semantict.net/intrordf/elements#autor http://www.semantict.net/ludzie/2344 http://rdf.semantict.net/intrordf/elements#imie http://rdf.semantict.net/intrordf/elements#wiek Marcin 34 Powyższym graf reprezentuje następujące stwierdzenia: semt:intrordf intrdf:autor kto:2344. kto:2344 intrdf:imie Marcin. kto:2344 intrdf:wiek 34. gdzie kto oznacza przestrzeń nazw http://www.semantict.net/ludzie/. W notacji N3 stwierdzenia z tym samym podmiotem możemy zapisać skrótowo rozdzielając orzeczenie i obiekty średnikiem. Przykład 8 Stwierdzenia 2 i 3 z przykładu poprzedniego możemy zapisać następująco: kto:2344 intrdf:imie Marcin ; intrdf:wiek 34. Stwierdzenia z tym samym podmiotem i orzeczeniem możemy zapisać skrótowo rozdzielając obiekty przecinkiem. Przykład 9 Stwierdzenia kto:2344 intrdf:autor Wprowadzenie do RDF. kto:2344 intrdf:autor Logika Deskryptywna. 5
możemy zapisać następująco kto:2344 intrdf:autor Wprowadzeni do RDF, Logika Deskryptywna. Aktualny dokument RDF oznaczamy przez <>. Przykład 10 @prefix intrdf: http://rdf.semantict.net/intrordf/elements#. <> intrdf:tytul Wprowadzenie do RDF Puste węzły W przykładzie 7 aby móc dokładniej scharakteryzować autora określiliśmy dla niego identyfikator URI dzięki czemu autor stał się zasobem (i w grafie pojawił się nowy węzeł). Pozwoliło to nam użyć autora jako podmiotu dwóch stwierdzeń (oczywiście stwierdzeń takich może być więcej). Możemy mieć jednak do czynienia z sytuacją kiedy określanie URI dla zasobu nie będzie miało sensu np. wtedy gdy nie planujemy odwoływać się do danego zasobu (w tym przypadku do autora). Może się też zdarzyć, że w chwili tworzenia dokumentu nie będziemy znali identyfikatora URI dla danego zasobu. W takich przypadkach wykorzystujemy tzw. puste węzły czyli węzły bez identyfikatorów URI. Przykład 11 W poniższym grafie autor jest oznaczony pustym węzłem bez identyfikatora URI. http://www.semantict.net/rdf/intrordf http://rdf.semantict.net/intrordf/elements#autor http://rdf.semantict.net/intrordf/elements#imie http://rdf.semantict.net/intrordf/elements#wiek Marcin 34 W notacji N3 puste węzły oznaczamy przez _nazwa. W notacji N3 powyższe stwierdzenia zapisujemy następująco: semt:intrordf intrdf:autor _:aautor. _:aautor intrdf:imie Marcin. _:aautor intrdf:wiek 34. 6
W notacji N3 (oraz jak zobaczymy w reprezentacji XML) oznaczenie pustego węzła przez identyfikator ma znaczenie tylko lokalne wewnątrz dokumentu RDF. W przypadku gdy w dokumencie istnieje kilka pustych węzłów ich różne identyfikatory pozwalają je rozróżnić. Jeżeli będziemy odwoływać się do danego węzła z zewnątrz (np. z innego dokumentu RDF) musi on posiadać identyfikator URI. Przykład 11 obrazuje także inne zastosowanie pustych węzłów. Może się zdarzyć, że wartość pewnej właściwości nie jest pojedynczym zasobem albo literałem ale jest bardziej złożona. W powyższym przykładzie taka właściwością jest http://rdf.semantict.net/intrordf/elements#autor. Wartość tej właściwości określiliśmy jako pusty węzeł, który może być podmiotem innych stwierdzeń. Dzięki temu możemy ją opisać bardziej szczegółowo. W notacji N3 puste węzły oznaczmy []. Przykład 12 Stwierdzenie _:aautor intrdf:imie Marcin. możemy zapisać następująco [] intrdf:imie Marcin. lub [intrdf:imie Marcin ]. Stwierdzenia _:aautor intrdf:imie Marcin. _:aautor intrdf:wiek 34. Możemy zapisać następująco [ intrdf:imie Marcin ] intrdf:wiek 34. Stwierdzenie to możemy rozumieć następująco: Pewna osoba o imieniu Marcin ma 34 lata. Rozpatrzmy przykład z dwoma pustymi węzłami. 7
Przykład 13 Graf z 3 stwierdzeniami, których podmioty są pustymi węzłami: http://rdf.semantict.net/intrordf/elements#imie http://rdf.semantict.net/intrordf/elements#autor Marcin http://rdf.semantict.net/intrordf/elements#tytul Wprowadzenie do RDF Powyższy graf w notacji N3 możemy zapisać następująco: [ intrdf:imie Marcin ] rdfint:autor [ intrdf:tytul Wprowadzenie do RDF ]. Stwierdzenie to możemy rozumieć następująco: Pewna osoba o imieniu Marcin jest autorem pewnej książki pt. Wprowadzenie do RDF. Formuły Notacja N3 pozwala także na wykorzystywanie stwierdzeń w innych stwierdzeniach. Przykład 14 Rozważmy stwierdzenie: semt:intrordf intrdf:autor Marcin Skulimowski. Stwierdzenie to może być częścią innego stwierdzenia: { semt:intrordf intrdf:autor Marcin Skulimowski } intrdf:informs Tomek. W nawiasie {} możemy umieścić kilka stwierdzeń. Całe wyrażenie w nawiasie {} jest traktowane jako logiczna koniunkcja zawartych w nim stwierdzeń. 8
Literały z określonym typem danych W powyższym przykładzie wartością właściwości intrdf:wiek jest literał 34. Oczywiście chodzi nam o liczbę 34, a nie o ciąg znaków 34. Co więcej chodzi nam o liczbę 34 w systemie dziesiętnym. W grafie nie ma jednak o tym żadnej informacji. Informację taką można umieścić w grafie wykorzystując tzw. literały z określonym typem danych. Literał taki składa się z ciągu znaków określającego wartość i identyfikatora URI określającego typ danych. Przykład 15 Określmy typ danych dla literału z Przykładu 7 określającego wiek: kto:2344 intrdf:wiek 34 ^^<http://www/w3.org/2001/xmlschema#integer>. lub skrótowo używając QNazwy: kto:2344 intrdf:wiek 34 ^^<xsd:integer>. gdzie xsd oznacza przestrzeń nazw http://www/w3.org/2001/xmlschema#. Graf wygląda następująco: http://www.semantict.net/ludzie/2344 http://rdf.semantict.net/intrordf/elements#wiek 34 ^^ http://www/w3.org/2001/xmlschema#integer W języku RDF nie ma zdefiniowanych typów danych (wyjątek stanowi wbudowany typ rdf:xmlliteral). Typy danych wykorzystywane przez RDF są określone przez podanie odpowiedniego identyfikatora URI. Zwykle są to typy danych wykorzystywane w języku XML. W powyższym przykładzie wykorzystaliśmy typ integer. Oczywiście w języku RDF nie istnieje żaden mechanizm sprawdzenia czy dany literał jest rzeczywiście danego typu. Sprawdzenia takiego mogą ewentualnie dokonywać aplikacje wykorzystujące dokumenty RDF. Przykład 16 Rozważmy następujące stwierdzenie kto:2344 intrdf:wiek auto ^^<xsd:integer>. Oczywiście ciąg znak auto nie jest typem integer. Jednak z punku widzenia języka RDF stwierdzenie to jest całkowicie poprawne. 9
Literał z informacją w jakim języku jest zapisany kto:2344 intrdf:imie Marcin @pl. XML Reprezentacja stwierdzeń przy pomocy grafów jest wygodna dla ludzi, ale całkowicie niezrozumiała dla maszyn. Jeżeli język RDF ma być jednym z fundamentów Internetu semantycznego to musi posiadać reprezentację czytelną dla maszyn. Warunek ten spełnia notacja N3. Jednak najbardziej popularną i oficjalną (zatwierdzoną przez konsorcjum W3C) reprezentacją języka RDF jest reprezentacja oparta na języku XML 1. W reprezentacji tej dokument RDF zawarty jest między znacznikami: <rdf:rdf> <!--stwierdzenia RDF--> </rdf:rdf> Jako jeden z atrybutów znacznika RDF podajemy zawsze przestrzeń nazw rdf xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" oraz ewentualnie inne wykorzystywane przestrzenie nazw. Każdemu stwierdzeniu odpowiada znacznik: rdf:description po którym następuje określenie zasobu (przy pomocy atrybutu elementu rdf:description) którego stwierdzenie dotyczy. Określenie to może mieć 3 formy: atrybut about gdy określamy istniejący zasób, atrybut ID gdy określamy nowy (definiowany) zasób, bez określenia zasobu określamy wtedy tzw. zasób anonimowy. Dowolne stwierdzenie ma następującą reprezentację w języku XML <?xml version="1.0"?> podmiot, orzeczenie, obiekt. <rdf:rdf xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:description rdf:about="podmiot"> <ORZECZENIE>OBIEKT</ORZECZENIE> </rdf:rdf> 1 Notacja N3 jest bardziej ogólna od reprezentacji w XML. 10
Przykład 17 2 Rozważmy graf z przykładu 3. Stwierdzenie wyrażone tym grafem ma następującą reprezentację w języku XML <?xml version="1.0"?> <rdf:rdf xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:pub="http://www.abc.net/publikacje#"> <rdf:description rdf:about="http://xxx.lanl.gov/abs/cs/0610020"> <pub:tytul>xstring: XML as a String</pub:tytul> </rdf:rdf> Gdzie pub jest przestrzenią nazw w której zdefiniowana jest właściwość tytul (o definiowaniu właściwości będzie mowa w części kursu poświęconej RDFS). Przykład 18 Rozważmy stwierdzenia RDF z przykładu 4. Stwierdzenia te mają następującą reprezentację w języku XML <?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:autor>marcin Skulimowski</intrdf:autor> <rdf:description rdf:about="http://www.semantict.net/rdf/intrordf/"> <intrdf:tytul>wprowadzenie do RDF</intrdf:tytul> </rdf:rdf> W powyższych przykładach wartości właściwości opisywanej przez orzeczenie były literałami. Przykład 19 Rozważmy teraz bardziej złożony przykład w którym wartość właściwości opisywanej przez orzeczenie jest zasobem. 2 Wszystkie przykłady z tego rozdziału zostały sprawdzone walidatorem RDF znajdującym się na stronie konsorcjum W3C: http://www.w3.org/rdf/validator/ 11
http:/www.semantict.net/rdf/intrordf http://www.semantict.net/rdf/intrordf/elements#autor http://www.semantict.net/rdf/intrordf/elements#tytul Marcin Skulimowski Wprowadzenie do RDF http://www.semantict.net/rdf/intrordf/elements#czesc http://www.semantict.net/tech/ http://www.semantict.net/rdf/intrordf/elements#rok http://www.semantict.net/rdf/intrordf/elements#tytul 2007 Technologie Semantyczne Graf ten reprezentuje następujące stwierdzenia: <http://www.semantict.net/rdf/intrordf> <http://www.semantict.net/rdf/intrordf/elements#autor> Marcin Skulimowski. <http://www.semantict.net/rdf/intrordf> <http://www.semantict.net/rdf/intrordf/elements#tytul> Wprowadzenie do RDF. <http://www.semantict.net/rdf/intrordf> <http://www.semantict.net/rdf/intrordf/elements#czesc> <http://www.semantict.net/tech/>. <http://www.semantict.net/tech/> <http://www.semantict.net/rdf/intrordf/elements#rok> 2007. <http://www.semantict.net/tech/> <http://www.semantict.net/rdf/intrordf/elements#tytul> Technologie Semantyczne. Wykorzystując QNazwy stwierdzenia te możemy w notacji N3 zapisać następująco: irdf:intrordf intrdf:autor Marcin Skulimowski. irdf:intrordf intrdf:tytul Wprowadzenie do RDF. irdf:intrordf intrdf:czesc <http://www.semantict.net/tech/>. <http://www.semantict.net/tech/> intrdf:rok 2007. <http://www.semantict.net/tech/> intrdf:tytul Technologie Semantyczne. 12
gdzie: irdf - oznacza przestrzeń nazw http://www.semantict.net/rdf/ intrdf - oznacza przestrzeń nazw http://www.semantict.net/rdf/intrordf/elements#. Reprezentacja powyższych stwierdzeń w języku XML jest następująca: <?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:autor>marcin Skulimowski</intrdf:autor> <rdf:description rdf:about="http://www.semantict.net/rdf/intrordf/"> <intrdf:tytul>kurs RDF</intrdf:tytul> <rdf:description rdf:about="http://www.semantict.net/rdf/intrordf/"> <intrdf:czesc rdf:resource="http://www.semantict.net/tech/"/> <rdf:description rdf:about="http://www.semantict.net/tech/"> <intrdf:rok>2007</intrdf:rok> <rdf:description rdf:about="http://www.semantict.net/tech/"> <intrdf:tytul>technologie Semantyczne</intrdf:tytul> </rdf:rdf> W przykładzie tym wartość właściwości czesc jest zasobem. Stąd odwołanie do zasobu przez atrybut rdf:resource. Przykład 20 Zauważmy, że w poprzednim przykładzie obiekt stwierdzenia 3 tzn. <rdf:description rdf:about="http://www.semantict.net/rdf/intrordf/"> <intrdf:czesc rdf:resource="http://www.semantict.net/tech/"/> jest podmiotem stwierdzeń 4 i 5 tzn. <rdf:description rdf:about="http://www.semantict.net/tech/"> <intrdf:rok>2007</intrdf:rok> <rdf:description rdf:about="http://www.semantict.net/tech/"> <intrdf:tytul>technologie Semantyczne</intrdf:tytul> 13
Orzeczenia związane z tym samym podmiotem można umieścić w jednym elemencie Description. Ponadto element Description może być wartością właściwości. <?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:autor>marcin Skulimowski</intrdf:autor> <intrdf:tytul>kurs RDF</intrdf:tytul> <intrdf:czesc> <rdf:description rdf:about="http://www.semantict.net/tech/"> <intrdf:rok>2007</intrdf:rok> <intrdf:tytul>technologie Semantyczne</intrdf:tytul> </intrdf:czesc> </rdf:rdf> Oczywiście taki skrótowy zapis nie zmienia grafu. Predykaty (orzeczenia) Jak już wiemy wartością predykatu może być albo zasób albo literał. Zwykle parsery potrafią rozpoznać czy maja do czynienia z zasobem czy z literałem. Istnieje jednak możliwość zapisania wprost że wartość predykatu jest zasobem (literałem). Do tego celu wykorzystywany jest atrybut rdf:parsetype. Przykład 21 Rozważmy następujący fragment przykładu 20: <rdf:description rdf:about="http://www.semantict.net/rdf/intrordf/"> <intrdf:czesc> <rdf:description rdf:about="http://www.semantict.net/tech/"> <intrdf:rok rdf:parsetype="literal"> <h1> 2007 </h1> </intrdf:rok> <intrdf:tytul>technologie Semantyczne</intrdf:rok> </intrdf:czesc> Dodanie atrybutu rdf:parsetype do właściwości intrdf:rok powoduje, że fragment <h1>2007</h1> 14
jest traktowany jak zwykły ciąg znaków i nie jest parsowany. Metoda ta pozwala umieszczać fragmenty kodu xml bezpośrednio w plikach rdf/xml. Po tej modyfikacji graf wygląda następująco: http://www.semantict.net/rdf/intrordf http://www.semantict.net/rdf/intrordf/elements#autor http://www.semantict.net/rdf/intrordf/elements#tytul Marcin Skulimowski Wprowadzenie do RDF http://www.semantict.net/rdf/intrordf/elements#czesc http://www.semantict.net/tech/ http://www.semantict.net/rdf/intrordf/elements#rok http://www.semantict.net/rdf/intrordf/elements#tytul <h1>2007</h1> Technologie Semantyczne Może się zdarzyć, że będziemy mieli do czynienia z zasobem, dla którego ani URI ani URL nie będziemy znali. W ten sposób nie będziemy mogli określić dla niego ani atrybutu rdf.about ani rdf:id. Istnieje jednak możliwość zapisania, że mamy do czynienia z zasobem. Robimy to przy pomocy atrybutu rdf:parsetype nadając mu wartość "Resource". Przykład 22 Rozważmy następujący fragment przykładu 6: <rdf:description rdf:about="http://www.semantict.net/rdf/intrordf/"> <intrdf:czesc rdf:parsetype="resource"> <intrdf:rok>2007</intrdf:rok> </intrdf:czesc> 15
http://www.semantict.net/rdf/intrordf http://www.semantict.net/rdf/intrordf/elements#autor http://www.semantict.net/rdf/intrordf/elements#tytul Marcin Skulimowski Wprowadzenie do RDF http://www.semantict.net/rdf/intrordf/elements#czesc genid: ARP103321 http://www.semantict.net/rdf/intrordf/elements#rok http://www.semantict.net/rdf/intrordf/elements#tytul 2007 Technologie Semantyczne Zauważmy, że mimo tego, że wartość predykatu czesc nie posiada identyfikatora URI to jednak jest oznaczona owalem tak jak zasób. Jest to tzw. pusty węzeł. Węzły takie omówimy w następnym rozdziale. Atrybutem rdf:parsetype można też oznaczyć właściwość będącą zasobem nawet jeżeli właściwość ta nie posiada wartości. Przykład 23 Rozważmy następujący przykład: <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:czesc rdf:parsetype="resource"/> </rdf:rdf> Zauważmy, że właściwość czesc nie posiada wartości. Graf w tym przypadku wygląda następująco: 16
http://www.semantict.net/rdf/intrordf http://www.semantict.net/rdf/intrordf/elements#czesc genid: ARP103321 Puste węzły W poprzednim punkcie mieliśmy do czynienia z sytuacją gdzie URI zasobu nie był określony. Węzeł związany z takim zasobem nazywamy węzłem pustym (ang. blank node). Pojawienie się pustego węzła może oznaczać, że identyfikator URI dla danego zasobu nie istnieje lub jest w danej chwili nieznany. Zasób oznaczony pustym węzłem jest określony przez swoje własności, a nie przez identyfikator. Pusty węzeł ma zwykle przypisany przez walidator identyfikator. Dzięki temu, w ramach tego samego dokumentu RDF, puste węzły mogą być między sobą rozróżnione. Przykład 24 Rozważmy następujący 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:autor> <rdf:description> <intrdf:imie>marcin</intrdf:imie> <intrdf:nazwisko>skulimowski</intrdf:nazwisko> </intrdf:autor> </rdf:rdf> Graf powyższego dokumentu RDF/XML wygląda następująco http://www.semantict.net/rdf/intrordf http://www.semantict.net/rdf/intrordf/elements#autor genid:arp1033 http://www.semantict.net/rdf/intrordf/elements#imie http://www.semantict.net/rdf/intrordf/elements#nazwisko Marcin Skulimowski 17
Walidator wygenerował identyfikator dla pustego węzła będącego wartością właściwości autor. Identyfikator te nie ma żadnego znaczenia poza tym, że pozwala rozróżnić puste węzły w ramach tego samego dokumentu RDF. Istnieje możliwość nadania pustemu węzłowi ściśle określonego identyfikatora. W tym celu wykorzystujemy atrybut rdf:nodeid. Przykład 25 Rozważmy następujący 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:autor> <rdf:description rdf:nodeid="autordane"> <intrdf:imie>marcin</intrdf:imie> <intrdf:nazwisko>skulimowski</intrdf:nazwisko> </intrdf:autor> </rdf:rdf> Graf powyższego dokumentu RDF/XML wygląda następująco: http://www.semantict.net/rdf/intrordf http://www.semantict.net/rdf/intrordf/elements#autor autordane http://www.semantict.net/rdf/intrordf/elements#imie http://www.semantict.net/rdf/intrordf/elements#nazwisko Marcin Skulimowski Uwaga: atrybut rdf:nodeid jest elementem składni RDF/XML i nie jest elementem abstrakcyjnego modelu RDF. 18
Referencje URI Względne URI i bazowy URI Zgodnie z ideą języka RDF wszystkie podmioty i orzeczenia powinny być opisywane identyfikatorami URI. Nie zawsze musi to jednak być cały identyfikator. Możemy operować względnym URI. Cały identyfikator URI jest wówczas uzyskany przez połączenie bazowego URI i względnego URI. Załóżmy, że dokument http://www.semantict.net/rdf/intrordf/ zawiera następujący element <rdf:description rdf:about="cos"> Bazowym URI jest URI dokumentu zawierającego powyższy element. Pełen identyfikator URI otrzymujemy przez połączenie URI bazowego i URI względnego tzn. http://www.semantict.net/rdf/intrordf/cos Identyfikator URI otrzymujemy w powyższy sposób zawsze wtedy kiedy dla danego zasobu nie jest podany pełen identyfikator. Możliwe jest też określenie bazowego URI bez względu na dokument zawierający dany element. Wykorzystujemy w tym celu atrybut xml:base. Przykład 26 Rozważmy następujący 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#" xml:base="http://www.semantict.net/rdf/"> <rdf:description rdf:about="intrordf"> <intrdf:autor> <rdf:description> <intrdf:imie>marcin</intrdf:imie> <intrdf:nazwisko>skulimowski</intrdf:nazwisko> </intrdf:autor> </rdf:rdf> Podobnie jak poprzednio pełen identyfikator URI powstaje przez konkatencję (sklejenie) nazwy z atrybutu about (względny URI) oraz atrybutu xml:base (bazowy URI). W efekcie otrzymujemy: http://www.semantict.net/rdf/intrordf Jeżeli w powyższym przykładzie nie określimy atrybutu xml:base wówczas pełen URI jest otrzymany przez konkatencję adresu pliku zwierającego dokument RDF/XML oraz atrybutu about. 19
Atrybut rdf:id Atrybut rdf:id jest bardzo podobny do atrybutu rdf:about. Podobieństwo polega na tym, że oba atrybuty służą do określenia identyfikatora URI. Jednak o ile atrybut rdf:about określa URI istniejącego zasobu o tyle atrybutu rdf:id jest używany do określenia nowego zasobu. Do zasobu takiego możemy się odwoływać przez wartość atrybutu ID prefiksem #. Przykład 27 Rozważmy następujący 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#" xml:base="http://www.semantict.net/rdf/"> <rdf:description rdf:about="intrordf"> <intrdf:autor> <rdf:description> <intrdf:imie>marcin</intrdf:imie> <intrdf:nazwisko>skulimowski</intrdf:nazwisko> </intrdf:autor> <intrdf:seria> <rdf:description rdf:id="semtech"> <intrdf:rok>2007</intrdf:rok> <intrdf:tytul>technologie Semantyczne</intrdf:rok> </intrdf:seria> </rdf:rdf> Pełen URI dla w powyższym przykładzie uzyskujemy przez połączenie URI bazowego i wartości atrybutu rdf:id przedzielonych znakiem # tzn. http://www.semantict.net/rdf/#semtech Predykat 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> 20
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>dzien</intrdf:jednostka> 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: Przykład 28 <?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:rdf> W przykładzie tym liczba 23 jest wartością właściwości value związanej z zasobem autordane. http://www.semantict.net/rdf/intrordf http://www.semantict.net/rdf/intrordf/elements#modyfikacja genid:arp1033 http://www.semantict.net/rdf/intrordf/elements#jednostka http://www.w3.org/1999/02/22-rdf-syntax-ns#value dzień 23 Predykat rdf:type Zasoby, którymi zajmowaliśmy się do tej pory nie miały ściśle określonego typu. Były po prostu zasobami. Możemy jednak określić typ zasobu przy pomocy predykatu rdf:type. 21
Przykład 29 Rozważmy następujący 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:autor>marcin Skulimowski</intrdf:autor> <intrdf:type rdf:resource="http://www.semantict.net/rdf/intrordf/elements#kurs"/> </rdf:rdf> Predykat rdf:type związał dany zasób z klasą kurs określoną w RDFS. RDF/XML skróty Istnieje kilka sposobów uproszczenia dokumentu RDF. Różne predykaty określające ten sam zasób mogą znajdować się w jednym elemencie Description (patrz Przykład 20). Niepowtarzające się właściwości (orzeczenia) można zapisać jako atrybuty zasobu (w języku XML atrybuty tego samego elementu muszą mieć różne nazwy). Przykład 30 <?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:autor="marcin Skulimowski" intrdf:tytulkurs="rdf"/> </rdf:rdf> W elemencie Description z określonym typem zasobu zamiast rdf:description możemy pisać typ zasobu. Przykład 31 <?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/"> <intrdf:kurs rdf:about="intrordf"> <intrdf:autor> <rdf:description> 22
<intrdf:imie>marcin</intrdf:imie> <intrdf:nazwisko>skulimowski</intrdf:nazwisko> </intrdf:autor> </intrdf:kurs> </rdf:rdf> Zasoby, które nie mają orzeczeń nie muszą być zdefiniowane w bloku Description. W dotychczasowych przykładach zasoby były zawsze określone przy pomocy znacznika rdf:description. Blok rdf:description może być pominięty. Jest to możliwe w dwóch przypadkach. 1. Dany obiekt będący zasobem nie jest podmiotem żadnego orzeczenia. Przykład 32 <?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="intrordf"> <intrdf:czesc rdf:resource="tech"/> </rdf:rdf> Nowy zasób został wprowadzony przy pomocy atrybutu rdf:resource. 2. Zasób jest podmiotem stwierdzenia (stwierdzeń), ale dokładnie opisany jest w dalszej części dokumentu (i tam są podane związane z nim właściwości i ich wartości). Przykład 33 <?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="intrordf.html"> <intrdf:czesc rdf:resource="tech"/> <rdf:description rdf:about="tech"> <intrdf:autor>marcin Skulimowski</intrdf:autor> <intrdf:rok>2007</intrdf:rok> </rdf:rdf> 23
Powyższy zapis można uprościć wykorzystując omówiony wcześniej skrót tzn. orzeczenia podmiotu będącego zasobem możemy umieścić jako atrybuty znacznika rdf:description. <?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="tech" intrdf:autor="marcin Skulimowski" intrdf:rok="2007"/> </rdf:rdf> Omówione powyżej skróty upraszczają reprezentację stwierdzeń RDF w języku XML, ale oczywiście nie zmieniają grafu będącego właściwą reprezentacją języka RDF. 24
Zaawansowane konstrukcje języka RDF Kontenery Kontenery są wykorzystywane w sytuacjach kiedy mamy do czynienia ze stwierdzeniami dotyczącymi wielu różnych zasobów traktowanych jako całość. W języku RDF istnieją trzy rodzaje kontenerów. rdf.bag Kontener ten zawiera nieuporządkowaną listę zasobów (lub literałów) w której poszczególne elementy mogą się powtarzać. Przykład 34 <?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:rdf> Graf http://www.semantict.net/rdf/spis.html http://www.semantict.net/rdf/intrordf/elements#ksiazki genid:a69811 http://www.w3.org/1999/02/22-rdf-syntax-ns#type http://www.w3.org/1999/02/22-rdf-syntax-ns#_1 http://www.w3.org/1999/02/22-rdf-syntax-ns#_2 http://www.w3.org/1999/02/22-rdf-syntax-ns#_3 1 2 3 4 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 25
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ą. Przykład 35 <?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:rdf> 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. Przykład 36 <?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:rdf> 26
Graf http://www.semantict.net/rdf/spis.html http://www.semantict.net/rdf/intrordf/elements#ksiazki genid:a69811 http://www.w3.org/1999/02/22-rdf-syntax-ns#type http://www.w3.org/1999/02/22-rdf-syntax-ns#_1 http://www.w3.org/1999/02/22-rdf-syntax-ns#_5 http://www.w3.org/1999/02/22-rdf-syntax-ns#_2 1 2 3 4 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 Kontener ten 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. Przykład 37 <?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:rdf> 27
W dokumencie RDF/XML możemy użyć elementy rdf:_n. Przykład 38 <?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:rdf> rdf:alt Kontener ten zawiera alternatywy dla pewnej wartości. Musi on zawierać przynajmniej jeden element będący wartością domyślną (pierwszy element listy). Przykład 39 <?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: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". 28
Przykład 40 <?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:menu rdf:parsetype="collection"> <rdf:description rdf:about="semanticweb.pdf"/> <rdf:description rdf:about="rdf.pdf"/> <rdf:description rdf:about="owl.pdf"/> </intrdf:menu> </rdf:rdf> Graf http://www.semantict.net/rdf/spis.html http://www.semantict.net/rdf/intrordf/elements#menu genid:a69811 rdf:first http://www.semantict.net/rdf/semanticweb.pdf rdf:rest genid:a69812 rdf:first http://www.semantict.net/rdf/rdf.pdf rdf:rest genid:a69813 rdf:first http://www.semantict.net/rdf/owl.pdf rdf:rest http://www.w3.org/1999/02/22-rdf-syntax-ns#nil przy czym użyliśmy następujących skrótów: rdf:first zamiast http://www.w3.org/1999/02/22-rdf-syntax-ns#first rdf:rest zamiast http://www.w3.org/1999/02/22-rdf-syntax-ns#rest 29
Reifikacja Dotychczas rozważaliśmy stwierdzenia składające się z 3 elementów: podmiot, orzeczenie, obiekt Przykładem takiego stwierdzenia pochodzącym z języka potocznego jest zdanie Witrynę http://www.abc.pl stworzył Łukasz W języku potocznym zdarzają się jednak stwierdzenia bardziej złożone np.: Marek powiedział, że witrynę http://www.abc.pl stworzył Łukasz Jest to stwierdzenie dotyczące innego stwierdzenia czyli tzw. metastwierdzenie. Poznane dotychczas konstrukcje języka RDF nie pozwalają nam formułować stwierdzeń dotyczących tego stwierdzenia ponieważ stwierdzenie nie jest zasobem i nie może być podmiotem innego stwierdzenia. Umożliwia to tzw. reifikacja. Stwierdzenie Witrynę http://www.strona.pl stworzył Łukasz będące częścią powyższego zdania ma bardzo prostą reprezentację w języku RDF\XML. <rdf:description rdf:about="http://www.strona.pl/"> <intrdf:autor>łukasz</intrdf:autor> </<rdf:description> Rozważmy następujący przykład: Przykład 41 <?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="opinia.html"> <rdf:subject rdf:resource="http://www.strona.pl/"/> <rdf:predicate rdf:resource="http://www.semantict.net/rdf/intrordf/elements#autor"/> <rdf:object>lukasz</rdf:object> <rdf:type rdf:resource="http://www.w3.org/1999/02/22-rdf-syntaxns#statement"/> <intrdf:informs>tomek</intrdf:informs> </rdf:rdf> 30
Graf http://www.w3.org/1999/02/22-rdf-syntax-ns#subject http://www.strona.pl/ http://www.w3.org/1999/02/22-rdf-syntax-ns#predicate http://www.semantict.net/rdf/intrordf/elements#autor http://www.semantict.net/rdf/opinia.html http://www.w3.org/1999/02/22-rdf-syntax-ns#object Łukasz http://www.w3.org/1999/02/22-rdf-syntax-ns#type http://www.w3.org/1999/02/22-rdf-syntax-ns#statement http://www.semantict.net/rdf/intrordf/elements/informs Tomek Informacje o reifikowanym stwierdzeniu i reifikacje można rozdzielić. Jest to szczególnie przydatne gdy stwierdzenie poddane reifikacji jest podmiotem kilku stwierdzeń. Przykład 42 <?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="#w"> <rdf:subject rdf:resource="http://www.strona.pl/"/> <rdf:predicate rdf:resource="http://www.semantict.net/rdf/intrordf/elements#autor"/> <rdf:object>łukasz</rdf:object> <rdf:type rdf:resource="http://www.w3.org/1999/02/22-rdf-syntaxns#statement"/> <rdf:description rdf:about="http://www.semantict.net/persons/01"> <intrdf:informsabout rdf:resource="#w" /> </rdf:rdf> Reifikacji możemy też dokonać bez używania właściwości subject, predicate i object. Do właściwości występującej w stwierdzeniu dodajemy wówczas atrybut rdf:id. 31
Przykład 43 <?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://www.strona.pl/"> <intrdf:autor rdf:id="w">łukasz</intrdf:autor> <rdf:description rdf:about="#w"> <intrdf:informs rdf:resource="http://www.semantict.net/persons/01" /> </rdf:rdf> RDF i HTML Język HTML służy do tworzenia stron internetowych. Oprócz informacji i sposobu ich prezentacji można w dokumentach HTML umieścić pewne metadane. Standardowo robi się to przy pomocy znaczników <meta>. Można jednak zrobić coś więcej, można dołączyć do dokumentu HTML dokument RDF ze stwierdzeniami dotyczącymi zasobów. Zgodnie z zaleceniem W3C można tego dokonać umieszczając w dokumencie HTML link do odpowiedniego dokumentu RDF. Przykład 44 <head> <title>moja strona</title> <link rel="meta" type="application/rdf+xml" href="meta.rdf"> </head> Znacznik <link> nie musi znajdować się w nagłówku dokumentu HTML. Możemy umieścić go w części <body>. 32
II. Schematy RDF (RDFS) Język RDFS pozwala nam definiować słownictwo wykorzystywane w dokumentach RDF. Podstawowymi elementami takiego słownictwa są klasy (ang. class) zasobów i ich właściwości (ang. property) charakterystyczne dla rozważanej dziedziny. Klasy i właściwości Stwierdzenia języka RDF dotyczą konkretnych przykładów obiektów należących do różnych klas. Przykład 44 Rozważmy następujący przykład: <?xml version="1.0"?> <rdf:rdf xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:pub="http://www.abc.net/publikacje/"> <rdf:description rdf:about="http://xxx.lanl.gov/abs/quant-ph/0609211"> <pub:tytul>how to Introduce Time Operator</pub:tytul> <rdf:type rdf:resource="http://www.abc.net/publikacje/artykul"/> </rdf:rdf> Zasób http://xxx.lanl.gov/abs/quant-ph/0609211 jest określony jako przykład klasy http://www.abc.net/publikacje/artykul. Klasy zasobów charakteryzowane są przez właściwości. Rozważmy następujące stwierdzenie: Artykuł How to Introduce Time Operator został napisany przez Wprowadzenie do XML. Oczywiście stwierdzenie takie nie ma sensu. Obiekt How to Introduce Time Operator jest przykładem klasy artykuł. Wprowadzenie do XML jest przykładem klasy książka. Oczywiście artykuły nie są pisane przez ksiązki. Musimy zatem zagwarantować, aby wartość właściwości napisany/napisana przez była przykładem klasy autor. Oznacza to, że musimy określić zasięg (ang. range) tej właściwości. Podobnie musimy określić jej dziedzinę (ang. domain). W przypadku powyższego zdania dziedzinę stanowi klasa publikacja. Przestrzeń nazw dla schematów RDF: xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" Język RDFS posiada wbudowane pewne klasy i właściwości przy pomocy których możemy definiować własne klasy i właściwości. Podstawowe klasy RDF i RDFS rdfs:class klasa wszystkich klas. 33
Przykład 45 Klasę artykul możemy zdefiniować następująco: <rdfs:class rdf:id="publikacja"> <!--właściwości klasy--> </rdfs:class> rdfs:resource klasa wszystkich zasobów. rdfs:literal klasa wszystkich literałów (ciągów znaków). rdfs:xmlliteral klasa wszystkich literałów zawierających składnię XML'a. Klasa ta jest podklasą klasy rdfs:literal. rdf:property klasa wszystkich zasobów określających właściwości. Przykład 46 Właściwość tytul możemy zdefiniować następująco: <rdf:property rdf:id="tytul"> <!--właściwości--> </rdf:property> rdfs:datatype klasa typów danych. Każdy przykład tej klasy jest podklasą klasy rdfs:literal. rdf:statement klasa wszystkich reifikowanych stwierdzeń. rdf:bag nieuporządkowana kolekcja. rdf:seq uporządkowana kolekcja. rdf:alt kolekcja alternatyw. rdfs:container klasa kontenerów. rdf:constraintresource - klasa wszystkich więzów. Klasa rdfs:class jest podklasą klasy rdfs:resource tzn. każda klasa jest zasobem. Klasa rdfs:resource jest przykładem klasy rdfs:class ponieważ rdfs:resource jest klasą wszystkich zasobów, a zatem jest klasą czyli przykładem rdfs:class. 34
rdfs:resource rdfs:class rdfs:constraintresource rdf:property rdfs:constraintproperty RDFS hierarchia podstawowych klas W definicjach klas i właściwości możemy wykorzystywać następujące właściwości: Podstawowe właściwości RDF i RDFS rdf:type - właściwość, która określa klasę do której należy dany zasób. Zasób jest przykładem tej klasy (patrz Przykład 1). rdfs:subclassof - właściwość, która określa klasę (superklasę) w której zawiera się dana klasa (będąca jej podklasą). Wszystkie przykłady klasy są przykładami superklasy. Klasa może być podklasą wielu klas. Przykład 47 Klasa artykul jest podklasą klasy publikacje. <rdfs:class rdf:about="artykul"> <rdfs:subclassof rdf:resource="#publikacja"/> </rdfs:class> Przykład 48 Klasa artykulinternetksiazka artykułów które zostały opublikowane Internecie oraz w postaci książkowej jest podklasą klasy artykulinternet i klasy artykulksiazka. <rdfs:class rdf:id="artykulinternetksiazka"> <rdfs:subclassof rdf:resource="#artykulinternet"/> <rdfs:subclassof rdf:resource="#artykulksiazka"/> </rdfs:class> rdfs:subpropertyof - właściwość, która określa właściwość (superwłaściowość) w której zawiera się dana właściwość (będąca jej podwłaściwością). 35
Przykład 49 <rdf:property rdf:id="tytulksiazki"> <rdfs:subpropertyof rdf:resource="#tytul"/> </rdf:property> Właściwości rdfs:subclassof i rdfs:subpropertyof są przechodnie. rdfs:domain - określa dziedzinę (ang. domain) właściwości P tzn. klasę zasobów, które mogą się pojawić jako zasób z właściwością P. Jeżeli dziedzina nie jest określona może nią być dowolna klasa. rdfs:range - określa zakres (ang. range) właściwości P tzn. klasę zasobów, które mogą się pojawić jako wartość właściwości P. Przykład 50 Wartość właściwość tytul powinna być literałem. <rdf:property rdf:id="tytul"> <rdfs:domain rdf:resource="#publikacja"/> <rdfs:range rdf:resource="http://www.w3.org/2000/01/rdf-schema#literal"/> </rdf:property> Przykład 51 Wartość właściwość ISSN powinna być liczbą całkowitą. <rdf:property rdf:id="issn"> <rdfs:domain rdf:id="publikacja"/> <rdfs:range rdf:resource="http://www.w3.org/2001/xmlschema#integer"/> </rdf:property> rdf:constraintproperty - klasa wszystkich właściwości definiujących więzy. Klasa ta jest podklasą klasy rdf:constraintresource i rdf:property. Klasa ta posiada dwa przykłady: rdfs:domain i rdfs:range. rdfs:label określenie zasobu dla ludzi Przykład 52 <rdf:property rdf:id="issn"> <rdfs:label>numer ISSN</rdfs:label> <rdfs:domain rdf:recource="#publikacja"/> <rdfs:range rdf:resource="http://www.w3.org/2001/xmlschema#integer"/> </rdf:property> 36
rdfs:seealso własność określająca inny zasób zawierający informacje na temat opisywanego zasobu. Przykład 53 <rdf:description rdf:about="http://www.w3.org/2000/01/rdf-schema#"> <rdfs:seealso rdf:resource="http://www.w3.org/2000/01/rdf-schema-more#"/> rdfs:isdefinedby - określa przestrzeń nazw zasobu. rdfs:comment umożliwia dodanie komentarza Przykład 54 <rdfs:class rdf:id="artykulinternetksiazka"> <rdfs:subclassof rdf:resource="#artykulinternet"/> <rdfs:subclassof rdf:resource="#artykulksiazka"/> <rdfs:comment> klasa artykułów opublikowanych jednocześnie w Internecie i w formie książkowej </rdfs:comment> </rdfs:class> rdfs:member element kontenera rdf:first - pierwszy element listy (głowa) rdf:rest pozostała część listy (ogon) rdf:value określa wartość właściwości rdf:subject podmiot stwierdzenia rdf:predicate orzeczenie stwierdzenia rdf:object obiekt stwierdzenia 37
rdf:property rdfs:resource rdfs:class rdfs:constraintproperty rdf:literal rdfs:domain rdfs:range rdfs:constraintresource RDFS zależności między przykładami podstawowych klas i właściwości 38
Przykładowy Schemat RDF Poniżej schemat RDF związany z publikacjami. <?xml version="1.0"?> <rdf:rdf xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"> <rdfs:class rdf:id="publikacja"/> <rdf:property rdf:id="tytul"> <rdfs:domain rdf:resource="#publikacja"/> <rdfs:range rdf:resource="http://www.w3.org/2000/01/rdfschema#literal"/> </rdf:property> <rdfs:class rdf:id="artykul"> <rdfs:subclassof rdf:resource="#publikacja"/> </rdfs:class> <rdfs:class rdf:id="ksiazka"> <rdfs:subclassof rdf:resource="#publikacja"/> </rdfs:class> <rdf:property rdf:id="tytulartykulu"> <rdfs:subpropertyof rdf:resource="#tytul"/> <rdfs:domain rdf:resource="#artykul"/> </rdf:property> <rdf:property rdf:id="tytulksiazki"> <rdfs:subpropertyof rdf:resource="#tytul"/> <rdfs:domain rdf:resource="#ksiazka"/> </rdf:property> <rdf:property rdf:id="issn"> <rdfs:domain rdf:resource="#publikacja"/> <rdfs:range rdf:resource="http://www.w3.org/2001/xmlschema#integer"/> </rdf:property> <rdf:property rdf:id="autor"> <rdfs:domain rdf:resource="#publikacja"/> <rdfs:range rdf:resource="http://www.w3.org/2000/01/rdfschema#literal"/> </rdf:property> <rdf:property rdf:id="liczbastron"> <rdfs:domain rdf:resource="#publikacja"/> <rdfs:range rdf:resource="http://www.w3.org/2001/xmlschema#integer"/> </rdf:property> </rdf:rdf> 39
Schematy RDF i notacja N3 Schematy RDF można zapisywać w notacji N3. W notacji N3 właściwość rdf:type ma skrótową postać a. Przykłady z poprzedniego rozdziału zapisane w notacji N3: Przykład 45* :Publikacja a rdfs:class. Przykład 46* :tytul a rdf:property. Przykład 47* :Artykul a rdfs:class. :Artykul rdfs.subclassof :Publikacja. Skrótowo: Przykład 48* :Artykul a rdfs:class; rdfs:subclassof :Publikacja. :ArtykulInternetKsiazka rdfs:subclassof :ArtykulInternet, :ArtykulKsiazka. Przykład 49* Przykład 50* Przykład 51* Przykład 52* :tytulksiazki rdfs:subpropertyof :tytul. :tytul rdfs:domain :publikacja; rdfs:range <http://www.w3.org/2000/01/rdf-schema#literal>. :issn rdfs:domain :publikacja; rdfs:range <http://www.w3.org/2001/xmlschema#integer>. :issn rdfs:label "numer ISSN"; rdfs:domain :publikacja; rdfs:range <http://www.w3.org/2001/xmlschema#integer>. 40
Ograniczenia RDFS Język RDFS pozwala nam definiować proste ontologie. Posiada jedna pewne ograniczenia: rdfs:range określa zakres właściwości dla wszystkich klas. Ta sama właściwość może mieć różne zakresy dla różnych klas. Przykład: zywisie. Brak możliwości zapisania, że dwie klasy są rozłączne. Przykład: klasa Kobieta i klasa Mezczyzna. Brak możliwości definiowania klas z użyciem operacji sumy, iloczynu. Przykład: klasa Osoba jako rozłączna suma klas Kobieta i Mezczyzna. Brak ograniczeń na liczbę wartości które może posiadać dana właściwość. Przykład: właściwość mama. Brak bardziej szczegółowego określenia właściwości: właściwość przechodnia, właściwość odwrotna etc. Przykład: wyzszyod, zjada, jestzjadanyprzez Istnieje zatem potrzeba rozszerzenia RDFS. Rozszerzeniem takim jest język OWL (ang. Ontology Web Language). 41
IV. SPARQL SPARQL (ang. SPARQL Protocol And RDF Query Language) jest językiem zapytań dla dokumentów RDF. SPARQL pozwala wyciągać z nich dane zawężone według kryteriów określonych poprzez predykaty RDF. Jest opisany przez kilka specyfikacji W3C. W obecnej chwili wszystkie specyfikacje są w statusie szkicu. Ostania wersja robocza 26 marzec 2007. Zmienne w zapytaniach języka SPARQL oznaczamy przez Przykład 53 Dane:?nazwa_zmiennej <http://example.org/book/book1> <http://purl.org/dc/elements/1.1/title> "SPARQL Tutorial". Zapytanie: SELECT?title WHERE { <http://example.org/book/book1> <http://purl.org/dc/elements/1.1/title>?title. } Wynik: "SPARQL Tutorial" Przykład 54 Dane: @prefix foaf: <http://xmlns.com/foaf/0.1/>. _:a foaf:name "Johnny Lee Outlaw". _:a foaf:mbox <mailto:jlow@example.com>. _:b foaf:name "Peter Goodguy". _:b foaf:mbox <mailto:peter@example.org>. _:c foaf:mbox <mailto:carol@example.org>. Zapytanie: PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT?name?mbox WHERE {?x foaf:name?name.?x foaf:mbox?mbox } Wynik: "Johnny Lee Outlaw" <mailto:jlow@example.com> 42
"Peter Goodguy" mailto:peter@example.org Przykład 55 Dane: @prefix dt: <http://example.org/datatype#>. @prefix ns: <http://example.org/ns#>. @prefix : <http://example.org/ns#>. @prefix xsd: <http://www.w3.org/2001/xmlschema#>. :x ns:p "cat"@en. :y ns:p "42"^^xsd:integer. :z ns:p "abc"^^dt:specialdatatype. Zapytanie: SELECT?v WHERE {?v?p "cat"@en } Wynik: <http://example.org/ns#x> Przykład 56 Dane: @prefix foaf: <http://xmlns.com/foaf/0.1/>. _:a foaf:name "Alice". _:b foaf:name "Bob". Zapytanie: PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT?x?name WHERE {?x foaf:name?name } Wynik: _:c "Alice" _:d "Bob" Przykład 57 Dane: @prefix foaf: <http://xmlns.com/foaf/0.1/>. _:a foaf:name "Alice". _:b foaf:name "Bob". Zapytanie: PREFIX foaf: <http://xmlns.com/foaf/0.1/> 43
SELECT?x?name WHERE {?x foaf:name?name FILTER regex(?name, "bo", "i" )} Wynik: _:c "Bob" Przykład 58 Dane: @prefix foaf: <http://xmlns.com/foaf/0.1/>. _:a foaf:name "Alice". _:b foaf:name "Bob". _:a foaf:age 23. _:b foaf:age 32. Zapytanie: PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT?z WHERE {?x foaf:age?y FILTER (?y<30)?x foaf:name?z } Wynik: "Alice" Przykład 59 Dane: @prefix dc: <http://purl.org/dc/elements/1.1/>. @prefix : <http://example.org/book/>. @prefix ns: <http://example.org/ns#>. :book1 dc:title "SPARQL Tutorial". :book1 ns:price 42. :book2 dc:title "The Semantic Web". :book2 ns:price 23. Zapytanie: PREFIX dc: <http://purl.org/dc/elements/1.1/> PREFIX ns: <http://example.org/ns#> SELECT?title?price WHERE {?x dc:title?title. OPTIONAL {?x ns:price?price. FILTER (?price < 30) } } Wynik: "SPARQL Tutorial" "The Semantic Web" 23 44
Zastosowania 1) Dublin Core http://dublincore.org/ http://www.ukoln.ac.uk/metadata/dcdot/ 2) Adobe PDF 3) FOAF http://www.foaf-project.org/ 3) RDFpic http://jigsaw.w3.org/rdfpic/ Aplikacje 4) IsaViz http://www.w3.org/2001/11/isaviz/ 5) RDF API for PHP http://sites.wiwiss.fu-berlin.de/suhl/bizer/rdfapi/ 45
Dublin Core jest ogólnym standardem metadanych służącym do opisu zasobów. Wersja 1.1 standardu Dublin Core Metadata Element Set określa następujące elementy metadanych, które mogą być obecne w opisie: Title (tytuł) Creator (twórca) Subject and Keywords (temat i słowa kluczowe) Description (opis) Publisher (wydawca) Contributor (współtwórca) Date (data) Resource Type (typ zasobu) Format (format) Resource Identifier (identyfikator zasobu) Source (źródło) Language (język) Relation (odniesienie) Coverage (zakres) Rights Management (zarządzanie prawami) Przykład <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.semantict.net"> <dc:title>wprowadzenie do RDF</dc:title> <dc:creator>marcin Skulimowski</dc:creator> <dc:date>07.05.07</dc:date> <dc:type>text</dc:type> <dc:format>text/html</dc:format> <dc:format>1873 bytes</dc:format> <dc:language>pl</dc:language> <dc:relation>www.semantic-web.org</dc:relation> </rdf:rdf> 46
Marcin Skulimowski Wprowadzenie do Ontology Web Language Ontologie Ontologia jest pojęciem zaczerpniętym z filozofii, gdzie miedzy innymi oznacza analizę pojęć i idei w celu ustalenia co istnieje oraz jakie są związki pomiędzy istniejącymi elementami. W informatyce pojęcia tego używa się w bardzo podobnym kontekście. Ontologia to formalna specyfikacja konceptualizacji pewnego obszaru wiedzy czy opisu elementów rzeczywistości. Przy projektowaniu ontologii wykorzystywane są metody kategoryzacji i hierarchizacji. Pewnym pojęciom abstrakcyjnym i grupom obiektów posiadającym wspólne cechy przyporządkowywane są nazwy, tworzone są wiec klasy obiektów (kategoryzacja). Tak utworzone klasy są następnie umieszczane w strukturze hierarchicznej. Przy tworzeniu ontologii można użyć różnych języków modelowania. Najczęściej wykorzystywany jest RDF/RDFS lub bardziej wyrafinowane języki wykorzystujące tą technologię np. OWL. Wymagania stawiane językom służącym do tworzenia ontologii Dobrze określona składnia. Formalna semantyka semantyka opisująca precyzyjnie wiedzę. Precyzyjnie tzn. bez subiektywnych intuicji oraz bez możliwość różnych interpretacji przez różne aplikacje. Skuteczne wnioskowanie Formalna semantyka pozwala wnioskować na temat wiedzy. W przypadku ontologii możemy wnioskować o: Przynależności do klasy. Jeżeli x jest przykładem klasy C i C jest podklasą D wówczas wnioskujemy, że x jest przykładem D. Równoważności klas. Jeżeli klasa A jest równoważna klasie B i klasa B jest równoważna klasie C wówczas klasa A jest równoważna klasie C. Niesprzeczności. Przypuśćmy, że zadeklarowaliśmy, że x jest przykładem klasy A i klasa A jest podklasą B C, A jest podklasą D, klasy B i D są rozłączne. Otrzymujemy sprzeczność. Klasyfikacji. Jeżeli zdeklarujemy, że pewne warunki są wystarczające dla przynależności do klasy A, wówczas jeżeli obiekt x spełnia te warunki, wówczas wnioskujemy, że x jest przykładem klasy A. Wnioskowania takie są przeprowadzane automatycznie i pozwalają: 47
Sprawdzić niesprzeczność ontologii. Automatycznie klasyfikować przykłady klasy. Uzyskać zależności między klasami, które nie są wprost zapisane w ontologii. Ontology Web Language Nagłówek Dokumenty OWL (nazywamy ontologiami OWL) są dokumentami RDF/XML. Korzeniem takiego dokumentu jest element RDF którego atrybutami są deklaracje przestrzeni nazw. Przykład 1 <rdf:rdf xmlns="http://www.semantict.net/rdf/intrordf/elements#" xml:base="http://www.semantict.net/rdf/intrordf/elements#" xmlns:intrdf="http://www.semantict.net/rdf/intrordf/elements#" xmlns:owl="http://www.w3.org/2002/07/owl#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xmlns:xsd="http://www.w3.org/2001/xmlschema#"> Następnym elementem jest opcjonalny element owl:ontology, który zawiera pewne informacje dotyczące ontologii. Element ten zawiera atrybut rdf:about, którego wartość określa nazwę lub referencję do ontologii. Wartość "" oznacza, ze opisujemy ontologię znajdującą się w bieżącym dokumencie. Reprezentant klasy owl:ontology (czyli ontologia) posiada następujące właściwości: owl:versioninfo informacje o wersji ontologii. owl:priorversion poprzednia wersji ontologii (właściwość nie tylko owl:ontology). owl:backwardcompatiblewith określa ontologię, która jest kompatybilna z daną ontologią. Wszystkie konstrukcje występujące w obu ontologiach (klasy, właściwości etc.) mają to samo znaczenie. owl:incompatiblewith - określa ontologię, która jest nie kompatybilna z daną ontologią. Niekompatybilność może na przykład oznaczać, że zmieniło się określenie jednej z klas. owl:imports określa identyfikator URI ontologii, które są przyjmowane jako część aktualnej ontologii. Jeżeli ontologia A importuje ontologię B oznacza to, że w ontologii A są wszystkie klasy i właściwości określone przez B. 48
owl:imports jest właściwością przechodnią. Jeżeli ontologia A importuje ontologię B i ontologia B importuje ontologię C wówczas ontologia A importuje ontologię C. Przykład 2 <owl:ontology rdf:about=""> <rdfs:label>ontologia Uniwersytetu</rdfs:label> <owl:versioninfo>pierwsza wersja ontologii zwiazanej z uniwersytetem</owl:versioninfo> <owl:priorversion rdf:resource="http://www.semantict.net/owl/07/uni-old/"/> <owl:backwardcompatiblewith rdf:resource="http://www.semantict.net/owl/06/uni-old/"/> <owl:incompatiblewith rdf:resource="http://www.semantict.net/owl/05/uni-old/"/> <owl:imports rdf:resource="http://www.domain.com/uni"/> Klasy W języku OWL istnieją dwie wbudowane klasy: owl:thing klasa zwierająca wszystkie klasy. owl:nothing klasa pusta zawierająca się w każdej klasie. Własne klasy definiujemy przy pomocy elementu owl:class. Klasa owl:class jest podklasą klasy rdfs:class. Przykład 3 <owl:class rdf:id= Profesor > <rdfs:subclassof rdf:resource= #kadraakademicka /> <owl:class> W języku OWL możemy powiedzieć, że dwie klasy są rozłączne. Używamy w tym celu właściwości owl:disjointwith. Przykład 4 <owl:class rdf:about= #Profesor > <rdfs:disjointwith rdf:resource= #Adiunkt /> <rdfs:disjointwith rdf:resource= #Asystent /> </owl:class> Możemy też powiedzieć, że jedna klasa jest równoważna z inną klasą. Służy do tego właściwość owl:equvalentclass. 49
Przykład 5 <owl:class rdf:about= #Adiunkt > <rdfs:equivalentclass rdf:resource= #Doktor /> </owl:class> Właściwości W języku OWL istnieją dwa rodzaje właściwości: właściwości obiektowe (owl:objectproperty) łączą obiekty z obiektami. Przykład 6 <owl:objectproperty rdf:id= jestprowadzonyprzez > <rdfs:domain rdf:resource= #Wyklad /> <rdfs:range rdf:resource= #Profesor /> </owl:class> właściwości typów danych (owl:datatypeproperty) łączą obiekty ze standardowymi typami danych (np. z XMLSchema) Przykład 7 <owl:datatypeproperty rdf:about= #rokstudiow > <rdfs:domain rdf:resource= #Student /> <rdfs:range rdf:resource= http://www.w3.org/2001/xmlschema#integer /> </owl:class> Właściwość owl:inverseof służy do określenia właściwość będącej odwrotnością innej właściwości. Przykład 8 <owl:objectproperty rdf:about= #prowadziwyklad > <rdfs:domain rdf:resource= #Profesor /> <rdfs:range rdf:resource= #Wyklad /> <owl:inverseof rdf:resource= #jestprowadzonyprzez /> </owl:class> Podobnie jak w przypadku klas możemy powiedzieć, że dwie właściwości są równoważne. Służy do tego właściwość owl:equivalentproperty. Przykład 9 <owl:objectproperty rdf:id= #wyklada > <owl:equivalentproperty rdf:resource= #prowadziwyklad /> 50
</owl:objectproperty> Ograniczenia właściwości Załóżmy, że chcemy powiedzieć, że wszyscy reprezentanci klasy C spełniają pewne warunki (oprócz wieli innych). Możemy to zrobić twierdząc, że klasa C jest podklasą klasy C której wszyscy reprezentanci spełniają te warunki. Klasa C nie ma identyfikatora (jest anonimowa) i jest określona przez podanie warunków jakie spełniają jej elementy. Warunki te są związane z ograniczeniami nałożonymi na właściwości. Ograniczenie właściwości określamy następująco: <owl:restriction> <owl:onproperty rdf:resorce= nazwa_wlasciwosci /> sposób_ograniczenia </owl:restriction> Właściwości możemy ograniczać na kilka sposobów. Ograniczenia wartości owl:allvaluesfrom określa dopuszczalne wartości właściwości. Przykład 10 <owl:class rdf:about= wykladnapierwszymroku > <owl:subclassof> <owl:restriction> <owl:onproperty rdf:resorce= #jestprowadzonyprzez /> <owl:allvaluesfrom rdf:resorce= #Profesor /> </owl:restriction> </owl:subclassof> </owl:class> Klasa wykladnapierwszymroku obejmuje wykłady, które są prowadzone przez przedstawicieli klasy Profesor. UWAGA: nie oznacza to, że każdy przedstawiciel klasy wykladnapierwszymroku musi mieć określonego prowadzącego profesora. Jeżeli jednak ma właściwość jestprowadzonyprzez to jej wartość musi być typu Profesor. 51
owl:somevaluesfrom przynajmniej jedna wartość właściwości musi być danego typu. Przykład 11 <owl:class rdf:about= #Profesor > <owl:subclassof> <owl:restriction> < owl:onproperty rdf:resorce= #prowadziwyklad /> <owl:somevaluesfrom rdf:resorce= #wykladmonograficzny /> </owl:restriction> </owl:subclassof> </owl:class> Oznacza to, że każdy reprezentant klasy Profesor musi prowadzić przynajmniej jeden wykład monograficzny (reprezentant klasy wykladmonograficzny). owl:hasvalue określa dokładną wartość właściwości. Przykład 12 <owl:class rdf:about= #wykladmatematyka > <owl:subclassof> <owl:restriction> < owl:onproperty rdf:resorce= #jestprowadzonyprzez /> <owl:hasvalue rdf:resorce= #787678 /> </owl:restriction> </owl:subclassof> </owl:class> Oznacza to, że wykład z matematyki jest prowadzony przez osobą o identyfikatorze 787678. Ograniczenia kardynalne Ograniczenia takie pozwalają nam określić ile wartości może posiadać dana właściwość. owl:mincardinality minimalna liczba wartości. owl:maxcardinality minimalna liczba wartości. owl:cardinality dokładna liczba wartości. 52
Przykład 13 <owl:class rdf:about= #WykladOpcjonalny > <owl:subclassof> <owl:restriction> <owl:onproperty rdf:resorce= #uczestniczy /> <owl:mincardinality rdf:datatype= http://www.w3.org/2001/xmlschema#nonnegativeinteger /> 10 </owl:mincardinality> </owl:restriction> </owl:subclassof> </owl:class> Specjalne właściwości owl:transitiveproperty właściwość przechodnia. Przykład: jestwyzszyod, jestnastepca. owl:symmetricproperty właściwość symetryczna. Przykład: jesttegosamegowzrostu, jestbratem. owl:functionalproperty właściwość która może posiadać co najwyżej jedna wartość. Przykład: wiek, wzrost, numerissn. owl:inversefunctionalproperty właściwość która dla dwóch różnych obiektów nie może posiadać tej samej wartości. Przykład: numerpesel, numertelefonu. Przykład 14 <owl:objectproperty rdf:id= studiujenatymsamymrokuco > <rdf:type rdf:resource= &owl;transitiveproperty /> <rdf:type rdf:resource= &owl;symmetricproperty /> <rdfs:domain rdf:resource= #Student /> <rdfs:range rdf:resource= #Student /> </owl:objectproperty> 53
Operacje Boolowskie W języku OWL możliwe definiowanie klas przy pomocy operacji Boolowskich. owl:unionof określamy klasę będącą sumą innych klas. Przykład 15 <owl:class rdf:id= skladosobowyuniwersytetu > <owl:unionof rdf:parsetype= Collection > <owl:class rdf:about= #kadraakademicka /> <owl:class rdf:about= #Student /> </owl:unionof> </owl:class> owl:intersectionof określamy klasę będącą sumą innych klas. Przykład 16 <owl:class rdf:id= AdunkciWydzialuMatematyki > <owl:intersectionof rdf:parsetype= Collection > <owl:class rdf:about= #OsobyZeStopniemDoktora /> <owl:class rdf:about= #PracownicyWydzialuMatematyki /> </owl:unionof> </owl:class> owl:complementof określamy klasę będącą dopełnieniem innej klasy. Przykład 16 <owl:class rdf:id= pracownicyadministracji > <owl:subclassof> <owl:class> <owl:complementof rdf:resource= pracownicynaukowi /> </owl:class> </owl:subclassof> </owl:class> 54
Wyliczanie Za pomocą elementu owl:oneof możemy określić klasę wypisując jej wszystkie elementy. Przykład 17 <owl:class rdf:id= DniTygodnia > <owl:oneof rdf:parsetype= Collection > <owl:thing rdf:about= #Poniedzialek /> <owl:thing rdf:about= #Wtorek /> <owl:thing rdf:about= #Sroda /> <owl:thing rdf:about= #Czwartek /> <owl:thing rdf:about= #Piatek /> <owl:thing rdf:about= #Sobota /> <owl:thing rdf:about= #Niedziela /> </owl:oneof> </owl:class> Przykłady klas Klasy zdefiniowane w ontologii możemy wykorzystywać w dokumentach RDF. Przykład 18 <rdf:description rdf:id= 949352 > <rdf:type rdf:resource= #kadraakademicka /> <rdf:description> Równoważnie Przykład 19 <kadraakademicka rdf:id= 949352 /> Oczywiście do określenia klasy możemy dodać orzeczenia. Przykład 20 <kadraakademicka rdf:id= 949352 > <uni:prowadziwyklad>matematyka Dyskretna</uni:prowadziWyklad> </kadraakademicka> W języku OWL dwa obiekty (przykłady) klasy mające różne identyfikatory lub nazwy nie muszą być różnymi obiektami. 55
Przykład 21 <owl:objectproperty rdf:id= jestprowadzonyprzez > <rdfs:domain rdf:resource= #Wyklad /> <rdfs:range rdf:resource= #Profesor /> <rdf:type rdf:resource= &owl;functionalproperty /> </owl:class> <Wyklad rdf:id= w234 > <jestprowadzonyprzez rdf:resource= #789098 > <jestprowadzonyprzez rdf:resource= #675899 > </Wyklad> Powyższy fragment ontologii nie prowadzi aplikacji wnioskującej do sprzeczności ponieważ nie jest powiedziane, że profesor o ID 789098 nie jest profesorem o ID 675899. Informacje o tym, że dwa przykłady klasy są różne musimy zapisać wprost. Przykład 22 <Profesor ID= 789098 > <owl:differentfrom rdf:resource= #675899 /> </Profesor> Przykład 23 <owl:alldifferent> <owl:distinctmembers rdf:parsetype= Collection > <lecturer rdf:about= #789098 /> <lecturer rdf:about= #455512 /> <lecturer rdf:about= #123333 /> <lecturer rdf:about= #456789 /> </owl:distinctmembers> </owl:alldifferent> 56
Dialekty OWL OWL Full wszystkie konstrukcje języka mogą być stosowane. OWL DL spełnia następujące warunki: podział słownictwa każdy zasób może być jedynie: klasą, typem danych, właściwością, przykładem klasy lub częścią wbudowanego słownictwa. Oznacza to, że np. klasa nie może być jednocześnie przykładem klasy. Podobnie właściwość nie może posiadać pewnych wartości będących typami danych i pewnych będących przykładami klas. Typy zasobów muszą być pisane wprost. Przykład 24 <owl:class rdf:id= C1 > <rdfs:subclassof rdf:about= #C2 /> </owl:class> Możemy wywnioskować, że zasób C2 jest klasą. W OWL DL musi to być jednak zapisane wprost: <owl:class rdf:id= C2 /> Zbiory właściwości obiektowych i właściwości typów danych są rozłączne. Właściwości przechodnie nie mogą być ograniczane kardynalnie. Anonimowe klasy są dozwolone jedynie jako dziedzina i zakres owl:equivalentclass oraz owl:disjointwith, i jako zakres rdfs:subclassof. OWL Lite spełnia warunki OWL DL oraz warunki: Zakazane jest użycie konstruktorów: owl:oneof, owl:disjointwith, owl:unionof, owl:complementof i owl:hasvalue. W ograniczeniach kardynalnych właściwości można stosować tylko liczby 0 i 1. Właściwość owl:equivalentclass nie być użyta dla anonimowych klas. 57
58
Reguły wnioskowania w notacji N3. Aby móc wnioskować w oparciu o RDF i OWL musimy dysponować regułami np. { :termostat :temp :wysoka} log:implies { :podgrzewanie :moc 0 }. W formułach mogą występować zmienne, które mogą przyjmować wartości różnych obiektów. Możliwe są dwa rodzaje zmiennych. Zmienne uniwersalne Zmienną uniwersalną deklarujemy następująco: Przykład 1 Rozważmy regułę: @forall :x @forall :x. { :termostat :temp :x } log:implies { :chlodzenie :moc :x }. Reguła ta mówi, że jeżeli temperatura jest x wówczas moc chłodzenia wynosi x. Zmienne egzystencjalne Zmienną egzystencjalną deklarujemy następująco: @forsome :x 59