Both sides previous revision
Poprzednia wersja
Nowa wersja
|
Poprzednia wersja
|
pl:prolog:prolog_lab:prolog_lab_semweb [2009/05/06 09:18] gjn |
pl:prolog:prolog_lab:prolog_lab_semweb [2019/06/27 15:50] (aktualna) |
**UWAGA: Instrukcja będzie dostępna od następnych zajęć (13.05)** --- //[[wtf@agh.edu.pl|Weronika T. Furmańska]] 2009/05/06 00:52// | |
| |
====== Integracja z Semantic Web ====== | ====== Integracja z Semantic Web ====== |
| |
===== Wprowadzenie ===== | ===== Wprowadzenie ===== |
==== SWI-Prolog for the (semantic) web ==== | |
| ==== 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. | SWI-Prolog udostępnia [[http://www.swi-prolog.org/web/index.txt|kilka pakietów]] pozwalających na pracę z Semantic Web. |
| |
| |
Dodatkowe pakiety to: | Dodatkowe pakiety to: |
* [[http://www.swi-prolog.org/web/Triple20.html|The Triple20 ontology editor]] - //Graphical tool for browsing and editing ontologies. Not very well maintained, but useful for browsing loaded RDF and it has two nice features: it scales well and it can handle multiple ontologies and allows for editing them in a unified view.// | * [[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]] - //This library resulted from the MultimediaN project. It is used in various large projects and provides a SPARQL and SeRQL endpoint. These end-points can also be use without the rest of ClioPatria.// | * [[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]] - //Provides access to OWL ontologies at the level of the abstract syntax. Can interact with external DL reasonder using DIG. The project is hosted on GitHUB // | * [[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). |
| |
===== Ćwiczenia ===== | |
FIXME | |
| |
| 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 : |
| <code prolog> |
| ?- use_module(library('semweb/rdf_db')). |
| </code> |
| |
| ===== 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: |
| <code prolog> |
| ?- rdf_load('sciezka_do_pliku'). |
| </code> |
| Np. |
| <code prolog> |
| ?- rdf_load('wine.rdf'). |
| ?- rdf_load(['moviedatabase.rdf','earthrealm.rdf']). |
| ?- rdf_unload('moviedatabase.rdf'). |
| </code> |
| |
| |
| ==== 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: |
| |
| <code prolog> |
| ?- rdf(A,S,D). |
| ?- rdf(A,S,literal(lang(fr,D))), write(D), nl. |
| ?- rdf(_,_,literal(Literal)). |
| </code> |
| |
| 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: |
| |
| <code prolog> |
| ?- rdf(_,_,literal(Literal)). |
| </code> |
| |
| **Ćwiczenie:** |
| Proszę przetestować: |
| <code prolog> |
| ?- rdf_current_literal(D). |
| ?- rdf_subject(Subject). |
| ?- rdf(Subject, _, _). |
| </code> |
| |
| === 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') |
| |
| <code prolog> |
| ?- findall(S, rdf_has(S, rdfs:subClassOf, 'http://www.w3.org/TR/2003/PR-owl-guide-20031209/wine#Wine'),SubClasses). |
| </code> |
| |
| 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: |
| |
| <code prolog> |
| ?- rdf_register_ns(movie, 'file:///home/users/students/temp/wfurmanska/prolog/lab_semweb/moviedatabase.rdf#') |
| </code> |
| |
| 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: |
| |
| <code> |
| triple20 |
| </code> |
| |
| **Ć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: |
| |
| <code> |
| 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" ]; |
| } |
| </code> |
| |
===== Dla Zainteresowanych ===== | ===== Dla Zainteresowanych ===== |
--- //[[gjn@agh.edu.pl|Grzegorz J. Nalepa]] 2009/05/06 09:13// | --- //[[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]]// |