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) |
Uruchom : | Uruchom : |
<code prolog> | <code prolog> |
?- use_module(library(semweb/rdf_db)). | ?- use_module(library('semweb/rdf_db')). |
</code> | </code> |
| |
<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> |
| |
<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> |
| |
--- //[[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]]// |