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ą:

    • umożliwia opis relacji pomiędzy zasobami w postaci trójek: (subject predicate object)
    • każdy element trójki RDF identyfikowany jest przez URI
    • składnia oparta na XML
    • zobacz przykład trójek RDF zapisanych w postaci tabeli, w składni RDF/XML oraz w postaci graficznej
    • istnieje szereg słowników dla RDF, np. zbiór relacji opisujących zależności między ludźmi (FOAF (przykład)), zbiór relacji do opisu metadanych zbiorów informacyjnych (DublinCore) i inne.
  • 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.)
    • ontologie można tworzyć w Protege'u, przeglądać online w OWL Sight, a silnik wnioskujący to np. Pellet

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:

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

W tym ćwiczeniu pokazana zostanie (część) funkcjonalności podstawowej biblioteki swi-prolog semweb.

Prosze pobrać przykładowe pliki:

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

Każdy zasób identyfikowany jest przez URI, zawyczaj zawierający namespace. Np. definicja Class jest identyfikowana przez URI: http://www.w3.org/2000/01/rdf-schema#Class

Biblioteka SWI-Prolog dostarcza specjalny predykat ns do mapowania przestrzeni nazw na krótsze nazwy symboliczne:

ns(rdf, 'http://www.w3.org/1999/02/22-rdf-syntax-ns#').
ns(rdfs, 'http://www.w3.org/2000/01/rdf-schema#').
ns(owl, 'http://www.w3.org/2002/7/owl#').
ns(xsd, 'http://www.w3.org/2000/10/XMLSchema#').
ns(dc, 'http://purl.org/dc/elements/1.1/').
ns(eor, 'http://dublincore.org/2000/03/13/eor#').

Aby móc w tworzonych predykatach uzywać tego mapowania należy użyć rdf_meta/1.

Aby dodać nową przestrzeń nazw należy użyć predykatu rdf_register_ns/2.

Ćwiczenie Pobierz i wczytaj plik: card.pl Przeanalizuj działanie.

Więcej o przestrzeniach nazw w dokumentacji.

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

  • rdf_transaction(:Goal, +Id)

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

pl/prolog/prolog_lab/prolog_lab_semweb.txt · ostatnio zmienione: 2019/06/27 15:50 (edycja zewnętrzna)
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0