====== Integracja z Semantic Web ====== Celem laboratorium jest przetestowanie wykorzystania Prologu w aplikacjach związanych z [[wp>Semantic Web]]. ===== Wprowadzenie ===== ==== Semantic Web ==== Podstawowymi standardami Semantic Web są: * [[http://www.w3schools.com/rdf/default.asp|RDF]] * 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 * [[http://www.w3schools.com/rdf/RDFvalidationresult.htm|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 ([[http://api.iknow.co.jp/users/Rattle_turtle.rdf|przykład]])), zbiór relacji do opisu metadanych zbiorów informacyjnych ([[http://www.w3schools.com/rdf/rdf_dublin.asp|DublinCore]]) i inne. * RDFS * pozwala na tworzenie prostych taksonomii, czyli hierarchii pojęć * rozszerza RDF o predykaty typu //Class//, //subClassOf//, //Property//, //subPropertyOf//, //Resource// itd. * [[http://www.w3schools.com/rdf/rdf_owl.asp|OWL]] * 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 [[http://protege.stanford.edu/|Protege'u]], przeglądać online w [[http://pellet.owldl.com/ontology-browser|OWL Sight]], a silnik wnioskujący to np. [[http://clarkparsia.com/pellet|Pellet]] Dokumenty Semantic Web mogą znajdować się w sieci w postaci plików z rozszerzeniem *.rdf, *.owl, do ich wyszukiwania służy wyszukiwarka [[http://swoogle.umbc.edu/|Swoogle]] Adnotacje semantyczne mogą też być dodawane do istniejących stron, za pomocą odpowiedznich standardów, np.RDFa ( [[http://www.planbooktravel.com.au/region-images/QLD/outback-queensland/outback-queensland-400x272/dinosaur-footprints-lark-quarry.jpg/discussion_reply_form|zobacz przykład]] (aby zobaczyć adnotacje pokaż źródło strony i wyszukaj "rdf")). ==== SWI-Prolog ==== SWI-Prolog udostępnia [[http://www.swi-prolog.org/web/index.txt|kilka pakietów]] pozwalających na pracę z Semantic Web. [[http://www.swi-prolog.org/pldoc/package/semweb.html|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: * [[http://www.swi-prolog.org/web/Triple20.html|The Triple20 ontology editor]] - narzędzie do tworzenia, edycji i przeglądania ontologii. * [[http://e-culture.multimedian.nl/software/ClioPatria.shtml|The ClioPatria semantic search web-server]] - serwer umożliwiający wykonywanie zapytań w językach SPQRQL i SeRQL * [[http://www.semanticweb.gr/TheaOWLLib/|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 ===== W tym ćwiczeniu pokazana zostanie (część) funkcjonalności [[http://www.swi-prolog.org/pldoc/package/semweb.html|podstawowej biblioteki swi-prolog semweb]]. Prosze pobrać przykładowe pliki: * [[http://www.w3.org/TR/owl-guide/wine.rdf|wine.rdf]] * [[http://139.91.183.30:9090/RDF/VRP/Examples/moviedatabase.rdf|moviedatabase.rdf]] * [[http://athena.ics.forth.gr:9090/RDF/VRP/Examples/earthrealm.rdf|earthrealm.rdf]] * [[http://protege.stanford.edu/junitOntologies/testset/animals-vh.owl|animals-vh.owl]] ==== 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))'' ([[http://www.swi-prolog.org/pldoc/man?predicate=rdf%2f3|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 [[http://www.w3.org/TR/owl-guide/wine.rdf|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ć [[http://www.swi-prolog.org/pldoc/man?predicate=rdf_meta%2f1|rdf_meta/1]]. Aby dodać nową przestrzeń nazw należy użyć predykatu ''rdf_register_ns/2''. **Ćwiczenie** Pobierz i wczytaj plik: {{:pl:prolog:prolog_lab:card.pl|}} Przeanalizuj działanie. Więcej o przestrzeniach nazw [[http://www.swi-prolog.org/pldoc/doc_for?object=section%283%2c%20%273.5%27%2c%20swi%28%27%2fdoc%2fpackages%2fsemweb.html%27%29%29|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: [[http://139.91.183.30:9090/RDF/VRP/Examples/moviedatabase.rdf|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 [[http://139.91.183.30:9090/RDF/VRP/Examples/moviedatabase.rdf|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 [[http://www.swi-prolog.org/web/Triple20.html|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 [[https://ai.ia.agh.edu.pl/wiki/hekate:dl_intro#history_and_background|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: [[http://www.cs.man.ac.uk/~horrocks/ISWC2003/Tutorial/people+pets.owl.rdf|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 [[https://ai.ia.agh.edu.pl/wiki/pl:prolog:prolog_lab:prolog_lab_system#tematgraphviz_i_imagemagick|ć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 ===== * [[http://www.google.pl/url?sa=t&source=web&ct=res&cd=6&url=http%3A%2F%2Fftp.informatik.rwth-aachen.de%2FPublications%2FCEUR-WS%2FVol-287%2Fpaper_1.pdf&ei=-rAAStiVNZCZ_Qb4xYTyBg&usg=AFQjCNHhlNu6e0nuEOKjRsLMkN5wGCN0xw&sig2=X8tnc9A71XDvswaVmxCxSQ|Using Prolog as the fundament for applications on the semantic web]] * [[http://hcs.science.uva.nl/projects/SWI-Prolog/articles/iswc-03.pdf|Prolog-based Infrastructure for RDF: Scalability and Performance]] ====== Uwagi, komentarze, propozycje ====== Tu studenci mogą wpisywać swoje uwagi. --- //[[gjn@agh.edu.pl|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ć). --- //[[szymek@adres.pl|Szymon Świerkosz]]//