Integracja z Semantic Web
Celem laboratorium jest przetestowanie wykorzystania Prologu w aplikacjach związanych z Semantic Web.
Wprowadzenie
Semantic Web
Podstawowymi standardami Semantic Web są:
-
RDFS
pozwala na tworzenie prostych taksonomii, czyli hierarchii pojęć
rozszerza RDF o predykaty typu Class, subClassOf, Property, subPropertyOf, Resource itd.
-
daje więcej możliwości niż RDFS, umożliwia tworzenie ontologii, czyli pewnego rodzaju modelu dziedziny w postaci pojęć (classes/concepts) oraz relacji między nimi (properties/roles).
OWL jest oparty na wariancie Logiki Opisowej (Description Logic) i posiada formalną semantykę (znaczenie pojęć i relacji jest ściśle określone i pozwala na automatyczne wnioskowanie dot. np. hierarchii pojęć, instancji klas itd.)
-
Dokumenty Semantic Web mogą znajdować się w sieci w postaci plików z rozszerzeniem *.rdf, *.owl, do ich wyszukiwania służy wyszukiwarka Swoogle
Adnotacje semantyczne mogą też być dodawane do istniejących stron, za pomocą odpowiedznich standardów, np.RDFa (
zobacz przykład (aby zobaczyć adnotacje pokaż źródło strony i wyszukaj „rdf”)).
SWI-Prolog
SWI-Prolog udostępnia kilka pakietów pozwalających na pracę z Semantic Web.
Podstawowy pakiet do przetwarzania dokumentów RDF, umożliwia wczytywanie, wykonywanie zapytań oraz przechowywanie dokumentów Semantic Web oraz zawiera biblioteki XPCE do wizualizacji i edycji tych dokumentów.
Dodatkowe pakiety to:
-
-
Thea, an OWL library for SWI-Prolog - pakiet umożliwiający pracę z ontologiami zapisanymi w OWL. Umożliwia interakcję z silnikami wnioskującymi dla DL (Description Logics, formalizm , na którym oparty jest OWL).
Podstawowe moduły:
library(semweb/rdf_db.pl)
- przechowywanie i zapytania do RDF
library(rdf.pl)
- parser RDF
library(semweb/rdfs.pl)
- zapytania RDFS
library(semweb/rdf_edit.pl)
- edytowanie dokumentów Semantic Web
library(semweb/owl.pl)
- zapytania OWL
Aktualna wersja biblioteki SWI-Prolog nie zawiera modułu owl.pl.
Podstawowe wsparcie dla OWL jest częścią edytora Triple20.
Ćwiczenie:
Uruchom :
?- use_module(library('semweb/rdf_db')).
Praca z dokumentami RDF
Wczytywanie i zapisywanie plików
rdf_load(+InOrList)
- wczytanie trójek z podanego źródła
rdf_unload(+Spec)
- usunięcie trójek z podanego źródła
rdf_save(+File)
- zapis do pliku
Ćwiczenie:
Wczytaj plik RDF/XML:
?- rdf_load('sciezka_do_pliku').
Np.
?- rdf_load('wine.rdf').
?- rdf_load(['moviedatabase.rdf','earthrealm.rdf']).
?- rdf_unload('moviedatabase.rdf').
Zapytania do bazy RDF
Podstawowy predykat - rdf/3
Podstawowy predykat: rdf(?Subject, ?Predicate, ?Object))
(rdf/3).
Subject i Predicate są atomami reprezentującymi identyfikator
URI zasobu.
Object - może być
URI lub tzw. literałem, czyli konkretną wartością. Literał może być typu:
Atom - jeżeli Object jest prostym tekstem, bez specyfikowania typu danych
lang(LangID, Atom) - Atom reprezentuje tekst w podanym języku langID
type(TypeID, Value) - atrybuty o określonym typie danych (według rdf:datatype
) TypeID.
Ćwiczenie
Pobierz i wczytaj plik wine.rdf
Przetestuj działanie predykatu rdf/3:
?- rdf(A,S,D).
?- rdf(A,S,literal(lang(fr,D))), write(D), nl.
?- rdf(_,_,literal(Literal)).
Jakie są możliwe typy danych?
Z jakiej przestrzeni nazw pochodzą?
Wybieranie elementów z trójki
rdf_subject(?Subject)
służy do pobierania pierwszych elementów trójek.
W przeciwieństwie do zapytania :-rdf(Subject, _, _).
nie zwraca duplikatów.
Przeglądu wszystkich literałów można dokonać przez:
?- rdf(_,_,literal(Literal)).
Ćwiczenie:
Proszę przetestować:
?- rdf_current_literal(D).
?- rdf_subject(Subject).
?- rdf(Subject, _, _).
Zaawansowane wyszukiwanie
W celu wykonania bardziej zaawansowanych zapytań na tekstach, zmienna Object może być zastąpniona przez literal(+Query, -Value)
.
+Query
może mieć postać:
exact(+Text)
- dokładne dopasowanie wzorca (bez rozróżnienia wielkości liter)
su bstring(+Text)
- szukany tekst zawiera +Text
word(+Text)
- szukany tekst zawiera +Text
zakończony znakiem niealfanumerycznym
prefix(+Text)
- szukany tekst zaczyna się od +Text
like(+Pattern)
- wyszukiwanie za pomocą wyrażeń regularnych
Ćwiczenie
Proszę poeksperymentować z powyższymi zapytaniami.
Przestrzenie nazw
Zapytania z użyciem RDFS
Predykat rdf_has(?Subject, ?Predicate, ?Object, -TriplePred)
.
Predykat rdf_has/3
używa relacji rdfs:subPropertyOf
.
Zwraca trójki, w których własność (predicate) jest taka jak Predicate lub jest jego pochodną (subPropertyOf
)
Przykładowe użycie: znajdź wszystkie podklasy klasy Wine (UWAGA: każda klasa zdefiniowana jest przez unikalne URI, zatem np. klasa Wine to 'http://www.w3.org/TR/2003/PR-owl-guide-20031209/wine#Wine')
?- findall(S, rdf_has(S, rdfs:subClassOf, 'http://www.w3.org/TR/2003/PR-owl-guide-20031209/wine#Wine'),SubClasses).
Predykat rdf_reachable(?Subject, +Predicate, ?Object) sprawdza, czy Object jest osiągalny z Subject poprzez przechodnią relację Predicate
Ćwiczenie
Proszę napisać predykat subclasses(Class, SubClasses)
, który wyszuka wszystkie podklasy zadanej klasy Class i zunifikuje je z SubClasses.
Proszę pobrać plik: moviedatabase.rdf.
Ten plik stosuje identyfikatory względne, przestrzeń nazw jest określona przez bieżący katalog.
Proszę dodać nową przestrzeń nazw, prowadzącą do bieżącego katalogu, np:
?- rdf_register_ns(movie, 'file:///home/users/students/temp/wfurmanska/prolog/lab_semweb/moviedatabase.rdf#')
Proszę wczytać plik moviedatabase.rdf.
Proszę napisać predykat wyszukujący rodzaje filmów (podklasy klasy Movie).
Proszę napisać predykat wyszukujący osoby pracujące przy tworzeniu filmu: (predicate 'participates').
Modyfikowanie bazy
Podstawowe:
rdf_assert(+Subject, +Predicate, +Object)
rdf_retractall(?Subject, ?Predicate, ?Object)
rdf_update(+Subject, +Predicate, +Object, +Action)
- modyfikacja jednego z elementów trójki w zal. od argumentu +Action
Zaawansowane - z uzyciem biblioteki rdf_edit
- umożliwia transakcje i dostęp wielowątkowy
Ontologie
Klasy, role, instancje
Ontologie typowo składają się z klas, ról/własności (properties, predicates) i instancji (instances, individuals).
W RDFS:
klasa to zasób (subject), którego własnością (predicate) jest rdf:type
, a jej wartością (object) jest rdfs:Class
podklasy definiuje się poprzez własność rdfs:subClassOf
instancje klasy C to zasoby, których własność rdf:type
ma wartość C
zasób może być instancją więcej niż jednej klasy
własności są instancjami klasy rdfs:Property
istnieją dwie ważne własności: rdfs:domain
do określania dziedziny danej własności, oraz rdfs:range
do określania przeciwdziedziny (klasa lub typ danych)
RDFS
Przykładowe predykaty z biblioteki semweb/rdfs
:
rdfs_subproperty_of(?SubProperty, ?Property)
rdfs_subclass_of(?SubClass, ?Class)
rdfs_class_property(+Class, ?Property)
- zwraca true, jeśli dziedzina Property
zawiera klasę Class
rdfs_individual_of(?Resource, ?Class)
- zwraca true jeżeli dany zasób jest instancją danej klasy. Oznacza to, że w trójce RDF (subject predicate object) predicate to rdf:type
a object to pewna klasa. Predykat może być użyty to testowania przynależności do klasy, generowania instancji danej klasy lub generowania klas, do których nalezy dana instancja.
Ćwiczenie
Proszę napisać predykaty:
wyszukanie wszystkich klas zdefiniowanych w danym pliku
znalezienie instancji danej klasy (jeśli w pliku nie ma żadnych instancji, proszę zastosować predykat rdf_assert/3 i dodać jakieś instancje dowolnej klasy)
z użyciem własności rdfs:range
znalezienie możliwych typów danych
OWL
OWL rozgranicza własności, których przeciwdziedziną są obiekty klas - są to owl:ObjectProperty
oraz te, których przeciwdziedziną są prymitywne typy danych owl:DatatypeProperty
.
Np.
?- rdf(S,rdf:'type',owl:'ObjectProperty').
wyszuka wszystkie własności zdefiniowane w ontologii win, których przeciwdziedziną są obiekty klas.
Ćwiczenie
Proszę wyszukać własności typu owl:'DatatypeProperty'.
Edytor Triple20
Tworzenie i edytowanie ontologii możliwe jest dzięki edytorowi Triple20.
Edytor ten wykorzystuje bibliotekę semweb.
Aby uruchomić edytor Triple20 należy wpisać w konsoli:
triple20
Ćwiczenie:
Proszę uruchomić Triple20.
Następnie proszę wczytać uprzednio ściągnięte pliki oraz pliki ontologii bazowych.
Proszę przeanalizować przykładowe ontologie.
Jakie są typowe własności klas (properties)?
Jak budowana jest hierarchia?
Jaka klasa jest najbardziej ogólna w przestrzeni rdfs?
A jaka w przestrzeni OWL?
Tworzenie ontologii
Proszę stworzyć prostą ontologię opartą na diagramie.
Uwaga: W węzłach grafu znajdują się nazwy klas i instancji.
Słowa pisane z welkiej litery (na diagramie) oznaczaja instancje danej klasy,
słowa pisane z małej litery oznaczają nazwy klas.
Na krawędziach grafu znajduja się role (properties).
Proszę porównać zbudowaną ontologię z: tą tutaj.
W miarę czasu i możliwości proszę poeksperymentować z tworzeniem i edycją ontologii, a także przeglądnąć przykładowe ontologie „bazowe”, takie jak FOAF, SKOS itd.
Wizualizacja grafów RDF
Na podstawie ćwiczenia z Lab. Metaprogramowanie oraz przykładu poniżej, napisz program, który stworzy graf RDF na podstawie wczytanego pliku RDF/XML.
Przykład pliku dla graphViza:
digraph D{
Fred -> person [label = "is an instance of" ];
Fred -> Tibbs [label = "has pet" ];
Tibbs -> cat [label = "is an instance of" ];
cat -> animal [label = "is an" ];
person -> animal [ label= "is an" ];
man -> adult [label = "is an" ];
man -> male [label ="is a" ];
man -> person [label = "is a" ];
cat_liker -> person [label = "is a" ];
cat_liker -> cat [label = "likes" ];
vegetarian -> animal [label = "is an" ];
vegetarian -> animal [label = "doesn't eat"];
cow -> vegetarian [label = "is a" ];
sheep -> animal [label = "is an" ];
sheep -> grass [label = "eats only" ];
}
Dla Zainteresowanych
Uwagi, komentarze, propozycje
Tu studenci mogą wpisywać swoje uwagi.
— Grzegorz J. Nalepa 2009/05/06 09:13
Za mało przykładów (przydałby się np. do punktu Zaawansowane wyszukiwanie). Nie za bardzo wiadomo jak ma działać obsługa przestrzeni nazw (gdzie to można zastosować).
— Szymon Świerkosz