RDF Schema (schematy RDF)
Schemat RDF nie dostarcza słownictwa dla aplikacji klasy jak np.: Namiot, Książka, lub Osoba; i właściwości, takich jak np.: waga w kg, autor lub jobtitle Schemat RDF zapewnia wyposażenie potrzebne do opisania tych klas i właściwości, oraz wskazania które klasy i właściwości mają być stosowane razem (np.: własność waga w kg będzie stosowana przy opisywaniu klasy Namiot). Innymi słowy, RDF Schema stanowi system RDF. Schemat RDF jest podobny pod pewnymi względami do obiektowych języków programowania takich jak Java.
Cechy RDF Schema przypominające języki programowania: - RDF Schema pozwala określić zasoby jako instancje jednej lub więcej klas. - określa hierarchie klas np.: klasa Pies może być zdefiniowana jako podklasa klasy Ssak, która jest podklasą klasy Zwierze
KLASY
Podstawowym krokiem w jakimkolwiek procesie opisu jest określenie różnych rodzajów rzeczy do opisania. RDF Schema odnosi się do tych "wielu rzeczy" jako klasy. Klasy RDF mogą być używane do reprezentowania prawie każdej kategorii, np. strony www, ludzie, typy dokumentów, bazy danych czy też pojęć abstrakcyjnych. Klasy są opisane za pomocą zasobów rdfs: Class i rdfs: Resource i właściwości rdf: type i rdfs: subclassof.
Załóżmy, że serwis example.org chce przekazywać informacje o różnych pojazdach mechanicznych. Najpierw potrzebujemy klasę do reprezentowania przedmiotów którymi są pojazdy mechaniczne. W RDF Schema, klasa jest dowolnym zasobem posiadającym właściwość rdf:type, której wartść jest zasobem rdfs:class. Więc klasa ex:motorvehicle będzie opisywana przez przypisanie URI: http://www.example.org/schemas/vehicles
A tak wygląda instrukcja RDF: ex:motorvehicle rdf:type rdfs:class. Jeżeli użyjemy zasobu klasy MotorVehicle który będzie miał nazwę commpanycar instrukcja RDF będzie miała postać: exthings:companycar rdf:type ex:motorvehicle. Wielkość liter nie ma znaczenia.
Można opisać dodatkowe klasy, reprezentujące różne wyspecjalizowane rodzaje pojazdów silnikowych, np. samochody osobowe, dostawcze, minivany, i tak dalej. Robimy to analogicznie jak wcześniej: ex:van rdf:type rdfs:class. ex:truck rdf:type rdfs:class. Można teraz uznać ze klasy te są wyspecjalizownaym rodzajem pojazdu mechanicznego co zapiszemy: ex:van rdfs:subclassof ex:motorvehicle. Mamy tu powiązanie dwóch klas za pomocą relacji rdfs:subclassof.
Dzieki temu jeżeli mamy pojazd companyvan należący do ex:van to należy też do ex:motorvehicle. ex:van rdfs:subclassof ex:motorvehicle. ex:companyvan rdfs:subclassof ex:van. Klasy mogą być podklasą więcej niż jednej klasy np.: klasa ex:minivan może być równocześnie podklasą klasy ex:van jak i ex:passengervehicle.
Schemat hierarchia klas pojazdów:
Schemat ten można zapisać w postaci: ex:motorvehicle rdf:type rdfs:class. ex:passengervehicle rdf:type rdfs:class. ex:van rdf:type rdfs:class. ex:truck rdf:type rdfs:class. ex:minivan rdf:type rdfs:class. ex:passengervehicle rdfs:subclassof ex:motorvehicle. ex:van rdfs:subclassof ex:motorvehicle. ex:truck rdfs:subclassof ex:motorvehicle. ex:minivan rdfs:subclassof ex:van. ex:minivan rdfs:subclassof ex:passengervehicle.
A także w RDF/XML
<?xml version="1.0"?> <!DOCTYPE rdf:rdf [<!ENTITY xsd "http://www.w3.org/2001/xmlschema#">]> <rdf:rdf xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xml:base="http://example.org/schemas/vehicles"> <rdf:description rdf:id="motorvehicle"> <rdf:type rdf:resource="http://www.w3.org/2000/01/rdf-schema#class"/> </rdf:description> <rdf:description rdf:id="passengervehicle"> <rdf:type rdf:resource="http://www.w3.org/2000/01/rdf-schema#class"/> <rdfs:subclassof rdf:resource="#motorvehicle"/> </rdf:description> <rdf:description rdf:id="truck"> <rdf:type rdf:resource="http://www.w3.org/2000/01/rdf-schema#class"/> <rdfs:subclassof rdf:resource="#motorvehicle"/> </rdf:description> <rdf:description rdf:id="van"> <rdf:type rdf:resource="http://www.w3.org/2000/01/rdf-schema#class"/> <rdfs:subclassof rdf:resource="#motorvehicle"/> </rdf:description> <rdf:description rdf:id="minivan"> <rdf:type rdf:resource="http://www.w3.org/2000/01/rdf-schema#class"/> <rdfs:subclassof rdf:resource="#van"/> <rdfs:subclassof rdf:resource="#passengervehicle"/> </rdf:description> </rdf:rdf>
Jak wiadomo z poprzednich zajęć RDF/XML stanowi skrót opisu zasobów własności rdf:type. Ponieważ klasy schematów RDF są zasobami RDF, ten skrót może być stosowany do opisu klas. Zastosowanie tego skrótu wygląda następująco:
<?xml version="1.0"?> <!DOCTYPE rdf:rdf [<!ENTITY xsd "http://www.w3.org/2001/xmlschema#">]> <rdf:rdf xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xml:base="http://example.org/schemas/vehicles"> <rdfs:class rdf:id="motorvehicle"/> <rdfs:class rdf:id="passengervehicle"> <rdfs:subclassof rdf:resource="#motorvehicle"/> </rdfs:class> <rdfs:class rdf:id="truck"> <rdfs:subclassof rdf:resource="#motorvehicle"/> </rdfs:class> <rdfs:class rdf:id="van"> <rdfs:subclassof rdf:resource="#motorvehicle"/> </rdfs:class> <rdfs:class rdf:id="minivan"> <rdfs:subclassof rdf:resource="#van"/> <rdfs:subclassof rdf:resource="#passengervehicle"/> </rdfs:class> </rdf:rdf>
WŁAŚCIWOŚCI
Oprócz opisu konkretnych klas z rzeczy, które chcą opisać, społeczności użytkowników muszą także być w stanie opisać specyficzne właściwości, które charakteryzują te grupy. W RDF Schema, właściwości są opisane za pomocą klasy rdf:property i właściwości rdfs:domain, rdfs:range i rdfs:subpropertyof. Wszystkie własności w RDF są opisane jako instancje klasy rdf: Property. Tak więc, nowa własność, taka jak exterms: weightinkg, jest opisana przez przypisanie URI i opisywanie tego zasobu z właściwości rdf:type, którego wartość jest zasobem rdf:property, na przykład, pisząc instrukcję: exterms:weightinkg rdf:type rdf:property.
RDF Schema również zapewnia słownictwo do opisu właściwości i klas, które są przeznaczone do używania razem w danych RDF. Wartość rdf:range jest używana do wskazania, że wartościami poszczególnych własności są przypadki wyznaczonej klasy. Na przykład, jeśli example.org chciał wskazać, że autor miał własności, które są wystąpieniami klasy Osoba, to trzeba napisać: ex:person rdf:type rdfs:class. ex:author rdf:type rdf:property. ex:author rdfs:range ex:person.
Niech dana będzie klasa ex:hasmother. Może mieć ona zero, jeden lub więcej zakresów wartości. Jeśli ex:hasmother nie posiada żadnych wartości to nic o nich nie mówimy. Jeśli ex:hasmother ma jeden zakres wartości, powiedzmy określenie w klasie ex.person, to mówimy że wartościami ex:hasmother są przypadki klasy ex:person. Jeżeli posiada więcej niż jede zakres wartości np. dwa ex:person i ex:female, to mówimy że wartościami ex:hasmother są przypadki wszystkich klas będących w jej zakresie. W tym przypadku klasy ex:person i ex:female.
Biorąc pod uwagę, że ex:hasmother ma dwa zakresy wartości ex:person i ex:female wiążą się z tym dwie oddzielne instrukcje: ex:hasmother rdfs:range ex:female. ex:hasmother rdfs:range ex:person.
Rdfs:range może być również używany do wskazania, że wartość właściwości podaje się o określonym typie literału. Na przykład, jeśli example.org chciał wskazać, że ex:age miał wartości z XML Schema typu danych xsd:integer, to należy napisać: ex:age rdf:type rdf:property. ex:age rdfs:range xsd:integer. Typ danych xsd:integer jest identyfikowany przez URI. Może być używany bez wyraźnego stwierdzenia że identyfikuje typ danych. Jednakże często jest to przydatne. Można to zrobić za pomocą klasy rdfs:datatype. Aby sprawdzić, że xsd:integer to typ danych, należy napisać instrukcję: xsd:integer rdf:type rdfs:datatype.
Takie oświadczenie nie stanowi definicji typu danych, np. w tym sensie, że jest określenie nowego typu danych. Nie ma sposobu określenia typów danych w schemacie RDF. Typy danych są zdefiniowane na zewnątrz RDF. To oświadczenie służy wyłącznie do dokumentacji istnienia typu danych, i wyraźnie wskazują, że jest on używany w tym schemacie.
Rdfs:domain jest używany do wskazania, że dana właściwość ma zastosowanie do wyznaczonej klasy. Na przykład, jeśli chciałby się wskazać, że ex:author odnosi się do instancji klasy ex:book, to należy napisać: ex:book rdf:type rdfs:class. ex:author rdf:type rdf:property. ex:author rdfs:domain ex:book.
Niech dana będzie wartość exterms: weight. Może mieć ona zero, jeden lub więcej dziedzin wartości. Analogicznie jak dla zakresów wartości. Jeżeli ma zero to nic o nich nie mówimy, jeżeli jedną np. ex:book to wartość wagi odnosi się do instancji klasy ex:book. Itd. Stwierdzając że wartość exterms: weight może mieć dwie domeny np. ex:book i ex:motorvehicle powoduje stworzenie dwóch odrębnych instrukcji: exterms:weight rdfs:domain ex:book. exterms:weight rdfs:domain ex:motorvehicle.
Korzystając z tej własności mamy: exthings:companycar exterms:weight "2500"^^xsd:integer. Aby rdfs.domain było prawidłowe exthings:companycar musi być zarówno instancją klasy ex:book i ex:motorvehicle.
Część opisów własności na schemacie pojazdów <rdf:property rdf:id="registeredto"> <rdfs:domain rdf:resource="#motorvehicle"/> <rdfs:range rdf:resource="#person"/> </rdf:property> <rdf:property rdf:id="rearseatlegroom"> <rdfs:domain rdf:resource="#passengervehicle"/> <rdfs:range rdf:resource="&xsd;integer"/> </rdf:property> <rdfs:class rdf:id="person"/> <rdfs:datatype rdf:about="&xsd;integer"/>
Rozbudowany schemat pojazdu w postaci RDF/XML
<rdfs:class rdf:id="minivan"> <rdfs:subclassof rdf:resource="#van"/> <rdfs:subclassof rdf:resource="#passengervehicle"/> </rdfs:class> <?xml version="1.0"?> <!DOCTYPE rdf:rdf [<!ENTITY xsd "http://www.w3.org/2001/xmlschema#">]> <rdf:rdf xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntaxns#" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xml:base="http://example.org/schemas/vehicles"> <rdfs:class rdf:id="motorvehicle"/> <rdfs:class rdf:id="passengervehicle"> <rdfs:subclassof rdf:resource="#motorvehicle"/> </rdfs:class> <rdfs:class rdf:id="truck"> <rdfs:subclassof rdf:resource="#motorvehicle"/> </rdfs:class> <rdfs:class rdf:id="van"> <rdfs:subclassof rdf:resource="#motorvehicle"/> </rdfs:class>
<rdfs:class rdf:id="person"/> <rdfs:datatype rdf:about="&xsd;integer"/> <rdf:property rdf:id="registeredto"> <rdfs:domain rdf:resource="#motorvehicle"/> <rdfs:range rdf:resource="#person"/> </rdf:property> <rdf:property rdf:id="rearseatlegroom"> <rdfs:domain rdf:resource="#passengervehicle"/> <rdfs:range rdf:resource="&xsd;integer"/> </rdf:property> <rdf:property rdf:id="driver"> <rdfs:domain rdf:resource="#motorvehicle"/> </rdf:property> <rdf:property rdf:id="primarydriver"> <rdfs:subpropertyof rdf:resource="#driver"/> </rdf:property> </rdf:rdf>
Jak wspomniano wcześniej, schemat RDF jest podobny pod pewnymi względami do systemów obiektowych języków programowania takich jak Java. Jednakże, RDF różni się od większości języków pod wieloma ważnymi względami.
Różnice: - jedną z istotnych różnic jest to, że zamiast opisywać klasy jako zbiór specyficznych właściwości, RDF Schema opisuje właściwości mające zastosowanie do konkretnych klas, za pomocą domeny i zakresu właściwości. Zakres opisu atrybutu w większości języków programowania jest ograniczony do klasy, w której jest zdefiniowany. W RDF, opisy właściwości są domyślne, niezależne od definicji klasy, i standardowo mają zakres globalny.
- opisy RDF Schema niekoniecznie są normatywne, w przeciwieństwie do języków programowania. Na przykład, jeśli język programowania deklaruje klasę Book z atrybutem autora o wartości Person, zazwyczaj jest to interpretowane jako grupa ograniczeń. Język nie pozwoli na stworzenie instancji Book bez atrybutu autora i nie pozwoli na instancje Book z atrybutem autora, gdzie nie ma jego wartość Person.
RDF Schema stanowi podstawowe funkcje opisujące słowniki RDF, ale są również dodatkowe możliwości, które mogą być użyteczne. Funkcje te mogą być świadczone przez dalszy rozwój RDF Schema, lub w innych językach opartych na RDF. Inne możliwości schematu, które mogą być przydatne (ale nie są dostarczane przez RDF Schema) obejmują:
- ograniczenia właściwości, np., że człowiek ma dokładnie jednego biologicznego ojca, - określona właściwość jest przechodnia (np.: jeżeli C jest przodkiem B, a A potomkiem B, to C jest tez przodkiem A), - dana właściwość może być identyfikatorem (kluczem) dla instancji danej klasy, - dwie różne klasy (o różnych URI) reprezentują jedną klasę, - dwa różne przypadki (o różnych URI) reprezentują tą samą jednostkę, - określenie ograniczeń w zakresie lub liczności własności, które zależą od klasy, do których właściwość jest stosowana, np. dla drużyny piłkarskiej ex:hasplayers ma 11 wartości, a dla drużyny koszykówki tylko 5 wartości, - zdolność do opisania nowych klas w zakresie kombinacji (np. związków i przecięć) z innymi klasami, czy też rozłączności (tzn., że nie jest instancją obu klasach).
Koniec