Różnice

Różnice między wybraną wersją a wersją aktualną.

Odnośnik do tego porównania

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)
Linia 1: Linia 1:
-**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 ======
Linia 5: Linia 4:
  
 ===== Wprowadzenie ===== ===== Wprowadzenie =====
-==== SWI-Prolog for the (semanticweb ====+ 
 +==== 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.
  
Linia 11: Linia 35:
  
 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 maintainedbut 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 tworzeniaedycji 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 syntaxCan interact with external ​DL reasonder using DIGThe 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 =====
Linia 28: Linia 322:
  --- //​[[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]]//​
pl/prolog/prolog_lab/prolog_lab_semweb.1241594282.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