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/20 02:08]
ikaf
pl:prolog:prolog_lab:prolog_lab_semweb [2019/06/27 15:50] (aktualna)
Linia 53: Linia 53:
 Uruchom : Uruchom :
 <code prolog> <code prolog>
-?- use_module(library(semweb/​rdf_db)).+?- use_module(library('semweb/​rdf_db')).
 </​code>​ </​code>​
  
Linia 102: Linia 102:
 <code prolog> <code prolog>
 ?- rdf(A,S,D). ?- rdf(A,S,D).
- 
 ?- rdf(A,​S,​literal(lang(fr,​D))),​ write(D), nl. ?- rdf(A,​S,​literal(lang(fr,​D))),​ write(D), nl.
- 
 ?- rdf(_,​_,​literal(Literal)). ?- rdf(_,​_,​literal(Literal)).
- 
 </​code>​ </​code>​
  
Linia 127: Linia 124:
 <code prolog> <code prolog>
 ?- rdf_current_literal(D). ?- rdf_current_literal(D).
- 
 ?- rdf_subject(Subject). ?- rdf_subject(Subject).
- 
 ?- rdf(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>​ </​code>​
  
Linia 142: 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.1242778105.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