24/01/2024
W świecie informatyki i sztucznej inteligencji, pojęcie ontologii odgrywa kluczową rolę w strukturyzowaniu i reprezentowaniu wiedzy. Choć na pierwszy rzut oka może się to wydawać skomplikowane, przykład tak prozaiczny jak pizza, doskonale ilustruje, jak można budować złożone systemy wiedzy. Ten artykuł zabierze Cię w podróż po procesie tworzenia ontologii pizzy, wykorzystując popularne narzędzia takie jak Protégé i TopBraid Composer. Dowiesz się, jak definiować klasy, właściwości i złożone relacje, a także jak zadawać pytania do tak zbudowanej bazy wiedzy za pomocą języka SPARQL. Celem nie jest oczywiście gotowanie pizzy, lecz zrozumienie, jak komputer może „rozumieć” i przetwarzać informacje o niej.

Czym jest Ontologia Pizzy w Kontekście Informatyki?
Kiedy mówimy o ontologii pizzy w środowisku informatycznym, nie mamy na myśli przepisu kulinarnego czy listy składników. Mowa tu o formalnym, jawnym przedstawieniu pojęć i relacji w domenie pizzy, tak aby były one zrozumiałe dla maszyn. Ontologia pizja to model danych, który definiuje takie elementy jak: co to jest pizza, jakie ma składniki (bazy, dodatki), jakie są jej typy (np. Margherita, Hawajska), i jakie relacje zachodzą między nimi (np. pizza ma_dodatek ser). Jest to struktura, która pozwala systemom komputerowym na wnioskowanie, wyszukiwanie i integrację danych w sposób inteligentny. Wykorzystanie pizzy jako przykładu w wielu tutorialach wynika z jej uniwersalności i znajomości tematu przez większość użytkowników, co ułatwia zrozumienie złożonych koncepcji modelowania ontologicznego.
Budowanie Ontologii Pizzy w Protégé: Szybkie Wprowadzenie
Protégé to potężne środowisko do edycji ontologii, oferujące wiele funkcji, które mogą być początkowo przytłaczające. Jednakże, dzięki pewnym skrótom i efektywnym technikom, można zbudować podstawową ontologię pizzy w zaskakująco krótkim czasie. Zakładamy, że masz już wstępnie zdefiniowaną strukturę „na papierze” – listę głównych kategorii, ich podkategorii, właściwości oraz ich dziedzin i zakresów.
Konfiguracja Środowiska Protégé
Przed rozpoczęciem budowy ontologii, warto odpowiednio skonfigurować Protégé:
- Uruchom Protégé i stwórz nową ontologię OWL. Nadaj jej odpowiednie URI związane z pizzą i określ miejsce zapisu.
- Skonfiguruj interfejs użytkownika (UI). Włącz zakładki takie jak Matrix i Property Matrix, które ułatwią szybkie wprowadzanie danych. Możesz wyłączyć mniej używane zakładki, takie jak individuals czy object and data property, a zamiast nich używać zakładki entities.
- Ustawienia preferencji. W sekcji New Entities wybierz auto ID, aby Protégé automatycznie nadawało unikalne identyfikatory URI, a Ty mógł skupić się na czytelnych etykietach. W zakładce Renderer zaznacz opcję Render entities using annotation values.
- Zakładka Entities. Dodaj widok Annotation Template, co pozwoli na szybkie dodawanie adnotacji do tworzonych elementów.
Tworzenie Hierarchii Klas
Kolejnym krokiem jest zbudowanie hierarchii klas, co jest fundamentalnym elementem każdej ontologii:
- Wybierz zakładkę entities i upewnij się, że wybrana jest klasa Thing.
- Użyj Tools | Create class hierarchy, aby stworzyć podstawowe kategorie, takie jak Domain_entity, Independent_entity, Value.
- Następnie, pod Independent_entity, stwórz główne klasy dla ontologii pizzy: Pizza, Pizza_topping, Pizza_base.
- Dla Pizza_topping i Pizza_base, użyj opcji Create Class Hierarchy ponownie, tym razem dodając sufiksy (np. „_topping”, „_base”), co znacznie przyspieszy wprowadzanie poszczególnych rodzajów dodatków i baz.
- Dla klasy Pizza, pamiętaj, aby odznaczyć Make classes disjoint, ponieważ niektóre z tych klas będą definiowane w późniejszym etapie.
- Stwórz hierarchię dla wartości, np. Spiciness (Hot, Medium, Mild), z sufiksem „_value”. Zamknij partycję wartości, dodając aksjomat pokrywający (Add covering axiom).
Tworzenie Właściwości Obiektowych
Właściwości obiektowe definiują relacje między instancjami klas:
- W widoku Object properties stwórz dwie główne właściwości: relational_property i modifier_property.
- Stwórz podwłaściwości dla relational_property: has_topping i has_base.
- Stwórz podwłaściwość dla modifier_property: has_spiciness.
- W zakładce Property Matrix, ustaw has_spiciness i has_base jako właściwości functional (każda instancja może mieć tylko jedną wartość dla tej właściwości).
- Uzupełnij odpowiednie dziedziny (domain) i zakresy (range) dla każdej właściwości, przeciągając i upuszczając klasy z palety klas.
Dodawanie Toppingów i Pikantności
Teraz czas na konkretne dane:
- Przejdź do zakładki Matrix.
- Dodaj kolumny dla właściwości has_topping i has_spiciness, przeciągając je z palety Object properties.
- Dodaj wartości (np. Mild, Medium, Hot) dla poszczególnych dodatków do pizzy. Możesz przeciągać i upuszczać wartości, a także edytować komórki bezpośrednio, używając autouzupełniania. Wartości dziedziczą się, więc wystarczy dodać je do klas nadrzędnych.
- Dodaj podstawowe dodatki do klas pizzy, z wyjątkiem tych, które będą miały złożone definicje (np. Vegetarian Pizza, Spicy Pizza, Cheesy Pizza).
Definiowanie Złożonych Klas Pizzy
To jest moment, w którym ontologia staje się inteligentna, dzięki definiowaniu klas na podstawie restrykcji:
- Wróć do zakładki class.
- Dla pizz, które mają stały zestaw dodatków (np. Margherita_pizza, Quatro_formaggi_pizza, Seafood_pizza), kliknij prawym przyciskiem myszy na restrykcji has_topping w widoku Description i wybierz Create closure axiom. Spowoduje to utworzenie restrykcji AllValuesFrom, która oznacza, że pizza może mieć tylko te dodatki, które zostały zdefiniowane.
- Dla klas definiowanych na podstawie egzystencjalnych restrykcji (np. Spicy_pizza):
- Stwórz podklasę Pizza_topping o nazwie Spicy_topping.
- Dodaj nadklasę (superclass) w widoku description: has_spiciness some Hot_value.
- Wybierz Edit | Convert to defined class (skrót CTRL-D/CMD-D). Spowoduje to, że wszystkie nadklasy zostaną połączone w jedną klasę równoważną (equivalent class).
- Podobnie, stwórz lub wybierz Spicy_pizza, dodaj nadklasę has_topping some Spicy_topping i przekształć ją w klasę definiowaną.
- Dla bardziej skomplikowanych definicji, takich jak Cheesey_pizza (Pizza, która ma co najmniej dwa rodzaje serów) lub Vegetarian_pizza (Pizza, która nie ma dodatków mięsnych ani rybnych), dodaj odpowiednie restrykcje (np. has_topping min 2 Cheese_topping, not(has_topping some (Meat_topping or Fish_topping))) i przekształć je w klasy definiowane.
Zapisywanie, Klasyfikowanie i Sprawdzanie
Ontologia nie jest kompletna, dopóki nie zostanie sklasyfikowana i sprawdzona:
Zawsze zapisuj swoją pracę. Wybierz reasoner (silnik wnioskujący) z menu Reasoner. Spowoduje to automatyczną klasyfikację ontologii. Jeśli coś zmieni kolor na czerwony, prawdopodobnie jest to problem z aksjomatami rozłączności (disjoint axioms). Jeśli zmieniasz hierarchię klas, usuń aksjomaty rozłączności przed przeniesieniem klasy, a następnie dodaj je ponownie, gdy klasa znajdzie się w nowym miejscu.
Tworzenie Prostej Ontologii Pizzy w TopBraid Composer
TopBraid Composer to kolejne narzędzie do tworzenia ontologii, które w intuicyjny sposób wprowadza w świat RDF i OWL. Proces tworzenia prostej ontologii pizzy jest tu nieco inny, ale równie efektywny.
Kroki Tworzenia Ontologii
- Utwórz nowy projekt i plik RDF. Uruchom TopBraid Composer, stwórz nowy projekt o nazwie „Pizza” i nowy plik RDF o nazwie „mypizza”.
- Stwórz pierwszą klasę: Pizza. Kliknij na istniejącą klasę owl:Thing i utwórz jej podklasę o nazwie Pizza. W OWL, każda zdefiniowana przez użytkownika klasa jest podklasą owl:Thing.
- Stwórz więcej klas. Utwórz klasę rodzeństwa PizzaTopping, a następnie jej podklasy, takie jak CheeseTopping, HamTopping, TomatoTopping, EggTopping.
- Stwórz właściwość obiektową hasTopping. Wybierz owl:ObjectProperty i nadaj nazwę hasTopping. Ta właściwość będzie łączyć instancje dwóch klas. W OWL wyróżniamy ObjectProperty (relacje między instancjami klas) i DatatypeProperty (relacje między instancją klasy a literałem RDF lub typem danych XML Schema).
- Stwórz klasę MargheritaPizza i dodaj adnotacje. Utwórz nową podklasę klasy Pizza o nazwie MargheritaPizza. Dodaj adnotacje, takie jak rdf:label i rdfs:comment, aby opisać klasę, np. „Według legendy, w 1889 roku pizza Margherita została stworzona i nazwana na cześć królowej Małgorzaty.”
- Dodaj semantykę do klasy MargheritaPizza. Aby wyrazić, że MargheritaPizza ma relacje z TomatoTopping i CheeseTopping, użyj restrykcji klasowych (Class Restriction). W OWL, wykorzystujemy logikę deskrypcyjną, aby zawęzić możliwe stwierdzenia logiczne o klasie. Dla MargheritaPizza, stworzymy restrykcję subClassOf, wskazując, że „istnieją instancje Pizzy, gdzie właściwość hasTopping to CheeseTopping” oraz „istnieją instancje Pizzy, gdzie właściwość hasTopping to TomatoTopping”. Wybierz hasTopping jako właściwość i someValuesFrom jako typ restrykcji, a następnie wybierz odpowiednie klasy dodatków.
- Dodatkowe ćwiczenie. Stwórz nową klasę AussiePizza i dodaj restrykcje hasTopping z CheeseTopping, TomatoTopping, EggTopping i HamTopping.
Importowanie Istniejącej Ontologii
Często nie będziesz tworzyć ontologii od zera, ale importować istniejące. TopBraid Composer umożliwia łatwy import ontologii z URL. Możesz zaimportować np. ontologię pizzy stworzoną przez University of Manchester.
- W bieżącym projekcie stwórz nowy plik RDF o nazwie „pizza”.
- W nowym pliku przejdź do zakładki Imports i kliknij Import from URL. Wprowadź URL ontologii (np.
https://protege.stanford.edu/ontologies/pizza/pizza.owl). - Po zaimportowaniu, możesz eksplorować definicje i relacje w załadowanej ontologii.
Zapytania SPARQL: Klucz do Danych Ontologicznych
Po zbudowaniu ontologii, kluczowe staje się wydobycie z niej użytecznych informacji. Do tego celu służy SPARQL (SPARQL Protocol and RDF Query Language), język zapytań dla danych RDF, podobny do SQL dla relacyjnych baz danych.
Anatomia Zapytania SPARQL SELECT
Podstawowa forma zapytania SPARQL SELECT to:
SELECT [lista zmiennych oddzielonych spacją] WHERE { [lista instrukcji potrójnych oddzielonych kropką] }Na przykład, SELECT ?subject1 ?subject2 WHERE { ?subject1 ?predicate1 ?object1 . ?subject2 ?predicate2 ?object2 . } zwróci wiersze z kolumnami ?subject1 i ?subject2.

Ćwiczenia z Zapytaniami SPARQL dla Ontologii Pizzy
Korzystając z zaimportowanej ontologii pizzy, możesz wykonywać następujące zapytania w zakładce SPARQL:
| Zapytanie SPARQL | Opis |
|---|---|
SELECT ?x WHERE { ?x rdfs:subClassOf pizza:Pizza } | Wyświetla bezpośrednie podklasy klasy pizza:Pizza. |
SELECT ?x WHERE { ?x rdfs:subClassOf+ pizza:Pizza } | Wyświetla wszystkie podklasy klasy pizza:Pizza (bezpośrednie i pośrednie), używając operatora + dla tranzytywnej podklasy. |
SELECT ?x WHERE { ?x rdfs:subClassOf+ pizza:Pizza . ?x rdfs:label ?label FILTER (regex(?label, "margherita", "i")) . } | Znajduje wszystkie podklasy pizza:Pizza, których etykieta (rdfs:label) zawiera słowo „margherita” (ignorując wielkość liter dzięki flagi „i” w funkcji regex). |
SELECT ?x WHERE { ?x rdfs:subClassOf+ pizza:Pizza . ?x rdfs:subClassOf [ a owl:Restriction ; owl:onProperty pizza:hasTopping; owl:someValuesFrom pizza:TomatoTopping ] } | Znajduje wszystkie klasy pizzy, które mają dodatek TomatoTopping poprzez restrykcję someValuesFrom na właściwości hasTopping. |
SELECT ?x WHERE { ?x rdfs:subClassOf+ pizza:Pizza . ?x rdfs:subClassOf [ a owl:Restriction ; owl:onProperty pizza:hasTopping; owl:someValuesFrom ?fishClasses ] . ?fishClasses rdfs:subClassOf+ pizza:FishTopping } | Znajduje wszystkie klasy pizzy, które mają dodatek TomatoTopping ORAZ dowolny dodatek z kategorii FishTopping (wliczając jego podklasy). |
SELECT ?x WHERE { ?x rdfs:subClassOf+ pizza:Pizza . ?x rdfs:subClassOf [ a owl:Restriction ; owl:onProperty pizza:hasTopping; owl:someValuesFrom ?topping ] . ?topping rdfs:subClassOf+ pizza:PizzaTopping . ?topping rdfs:label ?label . FILTER (regex(?label, "seafood", "i")) . } | Znajduje wszystkie klasy pizzy, które mają dodatek (?topping), którego etykieta zawiera słowo „seafood”. |
Porównanie Narzędzi: Protégé vs. TopBraid Composer
Oba narzędzia, Protégé i TopBraid Composer, są potężnymi edytorami ontologii, ale różnią się nieco podejściem i interfejsem:
| Cecha | Protégé | TopBraid Composer (Free Edition) |
|---|---|---|
| Podejście do budowy | Bardzo elastyczne, wiele widoków i funkcji do szybkiego wprowadzania (np. Matrix Tab, Create Class Hierarchy z sufiksami). | Bardziej krok po kroku, intuicyjne tworzenie klas i właściwości; silny nacisk na wizualizację RDF. |
| Definiowanie relacji | Zaawansowane opcje restrykcji, tworzenie aksjomatów domknięcia (closure axioms) z istniejących restrykcji. | Intuicyjne dodawanie restrykcji someValuesFrom i allValuesFrom; klarowne wizualizacje diagramów Venna dla zrozumienia semantyki. |
| Zarządzanie URI | Opcja auto ID dla automatycznego generowania URI, co minimalizuje błędy przy zmianie etykiet. | Ręczne nadawanie nazw, które stają się częścią URI, wymaga większej uwagi na spójność. |
| Zapytania SPARQL | Możliwe poprzez integrację wtyczek, ale nie jest to podstawowa funkcja interfejsu. | Wbudowana, intuicyjna zakładka SPARQL z gotowymi przykładami i łatwym tworzeniem zapytań. |
| Cel tutoriali | Skupia się na efektywności pracy z narzędziem i skrótami klawiszowymi. | Skupia się na wprowadzeniu do konceptów RDF i OWL oraz podstawach zapytań SPARQL. |
Najczęściej Zadawane Pytania (FAQ)
Czym dokładnie jest ontologia w kontekście informatyki?
W informatyce, ontologia to formalny, jawny opis pojęć i relacji w danej dziedzinie wiedzy. Służy do reprezentowania wiedzy w sposób zrozumiały dla maszyn, umożliwiając wnioskowanie, wyszukiwanie i integrację danych. Jest to jak słownik i gramatyka dla określonego obszaru wiedzy, pozwalająca komputerom na „rozumienie” danych.
Dlaczego pizza jest często używana jako przykład w tutorialach ontologicznych?
Pizza jest tematem uniwersalnym i dobrze znanym większości ludzi na całym świecie. Jednocześnie jest wystarczająco złożona, aby zademonstrować wiele zaawansowanych funkcji ontologii (np. różne dodatki, bazy, typy pizzy, stopnie pikantności), ale na tyle prosta, że koncepcje są łatwo przyswajalne. To sprawia, że jest doskonałym narzędziem dydaktycznym.
Jakie są główne różnice między właściwościami ObjectProperty a DatatypeProperty w OWL?
ObjectProperty opisuje relacje między dwiema instancjami klas (np. Pizza ma_dodatek Ser, gdzie Pizza i Ser są instancjami klas). Natomiast DatatypeProperty opisuje relacje między instancją klasy a wartością danych (literałem), taką jak liczba, ciąg znaków czy data (np. Pizza ma_średnicę 30cm, gdzie 30cm to literał).
Co to są restrykcje klasowe w OWL i do czego służą?
Restrykcje klasowe (Class Restrictions) to mechanizm w OWL, który pozwala na definiowanie klas w oparciu o ich właściwości i wartości tych właściwości. Na przykład, można zdefiniować „Pizzę Wegetariańską” jako „Pizzę, która nie ma żadnych dodatków mięsnych”. Restrykcje pozwalają na precyzyjne modelowanie i umożliwiają silnikom wnioskującym (reasonerom) wyciąganie nowych, implicitnych wniosków z ontologii.
Co to jest Reasoner i dlaczego jest ważny w pracy z ontologiami?
Reasoner to program (silnik wnioskujący), który analizuje ontologię i wyciąga z niej nowe, logicznie wynikające wnioski. Na przykład, jeśli zdefiniujesz, że „Pizza Margherita ma dodatek Ser” i „Ser jest składnikiem nabiałowym”, reasoner może wywnioskować, że „Pizza Margherita ma dodatek nabiałowy”. Reasonery są kluczowe dla sprawdzania spójności ontologii, klasyfikowania klas i instancji, oraz dla odpowiadania na złożone zapytania.
Budowanie ontologii, nawet tak pozornie prostych jak ontologia pizzy, jest potężnym narzędziem w dziedzinie semantycznego internetu i sztucznej inteligencji. Pozwala na tworzenie uporządkowanych, maszynowo czytelnych baz wiedzy, które mogą być wykorzystywane do zaawansowanego wyszukiwania, analizy danych i wnioskowania. Niezależnie od tego, czy użyjesz Protégé, TopBraid Composer, czy innego narzędzia, zrozumienie podstawowych koncepcji ontologicznych otwiera drzwi do fascynującego świata inteligentnych systemów.
Zainteresował Cię artykuł Budowa Ontologii Pizzy: Przewodnik od Podstaw? Zajrzyj też do kategorii Gastronomia, znajdziesz tam więcej podobnych treści!
