To jest stara wersja strony!
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'.
Dla Zainteresowanych
Uwagi, komentarze, propozycje