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

    • 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'.

Dla Zainteresowanych

Uwagi, komentarze, propozycje

Tu studenci mogą wpisywać swoje uwagi.

Grzegorz J. Nalepa 2009/05/06 09:13

pl/prolog/prolog_lab/prolog_lab_semweb.1242779920.txt.gz · ostatnio zmienione: 2019/06/27 15:59 (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