|
|
pl:prolog:prolog_lab:prolog_lab_semweb [2009/05/27 18:04] piw09 |
pl:prolog:prolog_lab:prolog_lab_semweb [2019/06/27 15:50] |
| |
====== 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 : | |
<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:semweb: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 ===== | |
* [[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]]// | |