Tutorial: Création d'ontologies et raisonnement en monde ouvert
===
###### tags: `OWL` `Ontologies` `Raisonnement`
:::info
- **Modalité des échanges:** En salle de TP
- **Programme:**
1. Si possible, la veille, lire l'article fourni avec les matériaux utiles `1h`
2. Installation du logiciel Protégé `15 min`
3. Création d'ontologie et raisonnement en monde ouvert: TP `1h30`
- **Participants:**
- Nathalie Abadie
- Masters TSI
- **Matériaux:** https://drive.google.com/open?id=1e2pK_CN95eTf51SB16l5e0H_sTTu1U_g
- **Logiciels:** Une version pas trop ancienne de Protégé (téléchargeable ici: https://protege.stanford.edu/)
:::
:mag: Le raisonnement en monde ouvert: rappels
---
### Quelques rappels fondamentaux...
Une particularité de la représentation de connaissances fondée sur les ontologies RDFS ou OWL est qu'elle repose sur une hypothèse ayant des implications très fortes en termes de raisonnement: l'**hypothèse du monde ouvert**. Celle-ci implique que les informations manquantes sont considérées comme inconnues et non comme fausses. De plus, les axiomes OWL vont se comporter comme des règles d'inférence et non comme des contraintes d'intégrité.
En outre, en RDFS et OWL, il n'y a **pas d'hypothèse du nom unique**. Ceci implique que plusieurs individus, dotés de noms distincts (ie. plusieurs ressources avec des URIs différents) peuvent, sauf mention contraire, représenter une même entité du monde réel.
Enfin, lorsque l'on interroge des données décrites en RDF avec une ontologie RDFS ou OWL, **cette ontologie est prise en compte lors de l'exécution de la requête** : toutes les conséquences logiques des axiomes composant cette ontologie sont envisagées de sorte que la réponse à la requête comporte non seulement les données explicitements décrites dans la base de connaissances, mais également les informations déduites par raisonnement.
Ce mode de représentation de connaissances est donc plutôt bien adapté losque ces connaissances sont partielles.
### Mise en oeuvre
Pour nous familiariser avec le raisonnement à l'aide d'une ontologie OWL, nous allons nous appuyer sur un exemple fourni par l'article
==Horrocks, Ian. "Ontologies and the semantic web." Communications of the ACM 51, no. 12 (2008): 58-67.==
Nous allons construire une ontologie sur l'univers d'Harry Potter, et y ajouter des axiomes pour tester leurs effets avec le raisonneur.
#### Découverte du schéma de base et des informations pouvant être inferrées à partir de ce simple schéma
Vous disposez d'une première version version de l'ontologie, ne comportant que les éléments de base du schéma permettant de décrire l'univers de Harry Potter. Nous allons les explorer rapidement:
* Lancer Protégé;
* charger l'ontologie;
* activez les onglets "Entities" et "Classes";
* activez l'affichage des définitions des classes en les sélectionnant une à une;
* reproduisez ce parcours des éléments de l'ontologies pour les "Object Properties", les "Datatype Properties" et les "Individuals".
Dans cette ontologie, un certain nombre d'éléments de base permettant de décrire l'univers de Harry Potter sont fournis. Nous allons vérifier la cohérence de ce premier schéma à l'aide du raisonneur :
* Allez dans le menu "Reasoner";
* Sélectionnez le raisonneur "Hermit";
* Cliquez sur "Start Reasoner".
Pour visualiser les résultats du raisonnement, activez l'affichage des classes, propriétés et individus inferrés, à l'aide de la liste déroulante située en haut à droite des hiérarchies de classes, de propriétés, etc. comme dans l'exemple ci-dessous:

Le raisonneur a :
* vérifié et éventuellement réorganisé la hiérarchie des classes et celles des propriétés,
* vérifié et éventuellement modifié les types déclarés pour les individus: s'il identifie un type non déclaré pour un individu, il va l'ajouter et le signaler en surlignant l'information en jaune.
* déduit de nouveaux faits à partir des déclarations de propriétés inverses, de propriétés composées, etc.
* vérifié qu'aucunes affirmations contradictoires ne cohabitent dans la base: s'il en trouve, il va déclarer la base incohérente et les signaler en rouge.
Par exemple, ici, le raisonneur a détecté que l'individu HarryPotter initialement déclaré de type "HogwartsStudent" est aussi de type "Human" (car il possède un animal et que le domaine que la propriété hasPet est Human). De même, il a détecté que l'individu Dumbledore est de type Human pour les mêmes raisons.
:::warning
:warning: Notez qu'ici le raisonneur n'a pas considéré le fait que HarryPotter soit déclaré comme appartenant à la classe HogwartsStudent tout en étant lié à Edwige via la propriété hasPet qui a comme domaine Human comme une erreur !
Nous sommes en monde ouvert : ce qui n'est pas dit explicitement est supposé inconnu, pas faux.
Le raisonneur déduit simplement de cela que HarryPotter doit aussi appartenir à la classe Human. Tant qu'aucune mention contraire ne vient contredire cette déduction, il n'y a pas d'incohérence dans la base.
On voit là le rôle fondamental que vont jouer les déclarations de domaine et de co-domaine dans le raisonnement.
Ce ne sont pas des contraintes: ce sont des règles d'inférence qui vont conduire à classer des individus en fonctions des définitions des propriétés qui les décrivent.
:::
Pour tester la situation où le fait de classer HarryPotter comme instance de Human pose un problème de cohérence au raisonneur, on peut par exemple:
* déclarer les classes Human et HogwartsStudent comme disjointes;
* enregistrer cette modification;
* relancer le raisonneur (Menu: Reasoner / Synchronize).
Un message d'erreur va vous être fournit avec la possibilité de demander une explication sur les incohérences détectées. La capture d'écran ci-dessous montre le détail des explications renvoyées:

Supprimez la déclaration de classes disjointes, enregistrez la modification et relancez le raisonneur pour retrouver une ontologie cohérente.
Notez enfin que le raisonneur a ajouté un nouveau fait "Dumbledore hasPet Fawkes", déduit à partir du fait "Fawkes isPetOf Dumbledore", les propriétés "hasPet" et "isPetOf" étant déclarées comme inverses l'une de l'autre.
:::warning
:warning: Encore une fois ici, ce sont des définitions de propriétés qui vont permettre d'inférer de nouveaux faits à partir des informations initiales !
:::
#### Des axiomes pour classer les individus
Il est possible de compléter la définition des classes en leur ajoutant des axiomes. Il existe deux grandes catégories d'axiomes:
* **les axiomes de sous-classe:** Ce sont des conditions nécessaires d'appartenance à la classe.
* **les axiomes de classe équivalente:** ce sont des conditions nécessaires et suffisantes d'appartenance à cette classe (ie. "x appartient à la classe C si et seulement si...")
Les axiomes s'expriment à l'aide de restrictions sur les propriétés des individus : pour appartenir à une classe, un individu doit présenter des valeurs de propriétés vérifiant les conditions imposées par les axiomes décrivant la classe. Les axiomes permettent donc au raisonneur de classer les individus en fonction de leurs valeurs de propriétés.
Les types de restrictions sur propriétés pouvant être déclarées sont les suivants :
* **allValuesFrom:** requiert que pour chaque instance de la classe qui a des instances de la propriété concernée par la restriction `owl:allValuesFrom`, les valeurs de cette propriété soient toutes membres de la classe indiquée par `owl:allValuesFrom`.
* **someValuesFrom:** requiert que pour chaque instance de la classe qui a des instances de la propriété concernée par la restriction `owl:someValuesFrom`, au moins une valeur de cette propriété soit membre de la classe indiquée par `owl:someValuesFrom`.
* **hasValue:** permet de spécifier une classe à partir des valeurs de certaines propriétés. Un individu sera membre de cette classes dès lors qu'au moins une des valeurs de ses propriétés sera égale à la ressource hasValue.
* **hasSelf:** la restriction `owl:hasSelf` avec comme valeur `"true"^^xsd:boolean` décrit la classe des individus qui sont à la fois sujets et valeurs d'une certaine propriété. La restriction `owl:hasSelf` permet d'exploiter la réflexivité d'une propriété.
* **restriction de cardinalité:** nombre minimum, maximum ou exact de fois qu’une propriété peut être utilisée avec des valeurs différentes sur le même sujet.
* **restriction de cardinalité qualifiée:** nombre minimum, maximum ou exact de fois qu’une propriété peut être utilisée avec des valeurs d’un certain type sur le même sujet.
##### Définir une classe en extension:
Nous allons définir la classe des "internats de Poudlard", HogwartsHouse, en listant les individus qui la composent:
* Dans la hiérarchie des classes, sélectionnez la classe HogwartsHouse;
* à droite, dans l'onglet "Class description", cliquer sur le bouton + à droite de "Equivalent To";
* dans la fenêtre qui apparaît, ouvrez l'onglet "Class expression editor" et entrez la liste des individus composant la classe:
``{ Gryffindor, Slytherin, Ravenclaw, Hufflepuff }``
* enregistrez les modifications et relancez le raisonneur: les individus listés apparaissent dans la liste des instances de la classe, surlignés en jaune.
##### Définir une classe avec une restriction sur les valeurs d'une propriété
Nous allons définir la classe des "étudiants de Poudlard" comme l'ensemble des instances de la classe étudiant ayant comme valeur de propriété "attendsSchool" l'individu "Hogwarts".
* Dans la hiérarchie des classes, sélectionnez la classe HogwartsStudent;
* à droite, dans l'onglet "Class description", cliquer sur le bouton + à droite de "Equivalent To";
* dans la fenêtre qui apparaît, ouvrez l'onglet "Class expression editor" et entrez la restriction suivante:
```
Class: HogwartsStudent
EquivalentTo: Student and attendsSchool value Hogwarts
```
* enregistrez les modifications et relancez le raisonneur: la classe Human apparaît dans la liste des classes parentes de HogwartsStudent, surlignée en jaune. Pour connaître les raisons de cette inférence, vous pouvez cliquer sur le ? qui accompagne son affichage, à droite, dans la portion de fenêtre surlignée en jaune: ce résultat est dû à la déclaration de domaine de la propriété attendsSchool:Human.
##### Définir une classe avec deux restrictions: nombre max de valeurs possibles et type de valeurs possibles pour une propriété
Nous allons définir la classe des "étudiants de Poudlard" comme un sous-ensemble des individus ayant une adresse email décrite par une chaîne de caractères et au plus un animal de compagnie. Attention, ce seront des conditions nécessaires mais non suffisantes ici:
* Dans la hiérarchie des classes, sélectionnez la classe HogwartsStudent;
* à droite, dans l'onglet "Class description", cliquer sur le bouton + à droite de "SubClass Of";
* dans la fenêtre qui apparaît, ouvrez l'onglet "Data restriction creator" (puis "Class expression editor") et entrez les restrictions suivantes:
```
Class: HogwartsStudent
SubClassOf: hasEmail some string
SubClassOf: hasPet max 1
```
Avec l'éditeur de restrictions sur Datatype properties, cela donne:

* enregistrez les modifications et relancez le raisonneur: rien de spécial n'est inferré ici, puisqu'il s'agit seulement de conditions nécessaires.
##### h5 Effets de l'absence d'hypothèse du nom unique sur le raisonnement
Nous allons ajouter une valeur de propriété de type xsd:int pour la propriété hasEmail de l'individu HarryPotter.
* Dans l'onglet Individuals, sélectionner l'individu HarryPotter;
* à droite, dans la fenêtre "Properties assertions" ajouter une "Object property assertion";
* ajoutez une valeur pour la propriété hasPet, comme par exemple Fawkes;

* enregistrez les modifications et relancez le raisonneur: aucune incohérence n'est relevée! Et ce, même si nous venons d'ajouter un axiome indiquant qu'un étudiant de Poudlard ne peut avoir qu'un animal de compagnie et un seul...
:::warning
:warning: Ceci s'explique par l'absence d'hypothèse du nom unique: le raisonneur déduit de ce nouveau fait que l'individu Fawkes doit être le même individu que Hedwig, avec deux noms distincts. Les deux individus sont d'ailleurs affectés aux deux classes SwowyOwl et Phoenix.
En outre, la propriété isPetOf est déclarée comme fonctionnelle (ie. elle ne peut avoir comme valeur, qu'un individu unique et un seul). Lorsque le raisonneur inferre les valeurs de propriétés inverses à partir des faits déclarés, on a donc:
Fawkes isPetOf Dumbledore
Hedwig isPetOf HarryPotter
Fawkes sameAs Edwig
Le raisonneur déduit donc que HarryPotter et Dumbledore, respectivement déclarés comme les maîtres des animaux Hedwig et Fawkes, doivent être une seule et même personne!
Pour que le raisonneur détecte une incohérence, il faudrait déclarer explicitement que Fawkes et Hedwig sont différents, ou bien que les classes SnowyOwl et Phoenix sont disjointes par exemple.
:::
Pour éviter de générer des incohérences por la suite, nous allons supprimer le fait que nous venons d'ajouter et sauvegarder la modification: HarryPotter hasPet Fawkes.
##### Les axiomes sont des règles d'inférence, pas des contraintes
Nous allons ajouter une nouvelle restriction précisant que la classe des "étudiants de Poudlard" est un sous-ensemble des individus ayant comme animal de compagnie une chouette, un chat ou un crapaud et exclusivement l'un de ces trois types d'animaux.
* Dans la hiérarchie des classes, sélectionnez la classe HogwartsStudent;
* à droite, dans l'onglet "Class description", cliquer sur le bouton + à droite de "SubClass Of";
* dans la fenêtre qui apparaît, ouvrez l'onglet "Class expression editor" et entrez la restriction suivante:
```
Class: HogwartsStudent
SubClassOf: hasPet only (Owl or Cat or Toad)
```
* enregistrez les modifications et relancez le raisonneur: rien de spécial n'est inferré ici, puisqu'il s'agit seulement de conditions nécessaires.
Nous allons modifier la définition d'Hedwig, et déclarer qu'il s'agit non plus d'une instance de SnowyOwl, mais de Phoenix. Enregistrez les modifications et relancez le raisonneur: rien de spécial n'est inferré ici. La raisonneur suppose qu'il est possible qu'un Phoenix soit une sorte de chat, de chouette ou de crapaud et qu'il l'ignore.
Nous allons donc ajouter l'axiome suivant à la classe Phoenix:
```
DisjointClasses: Owl Cat Toad
```
Enregistrez les modifications et relancez le raisonneur: cette fois, le raisonneur détecte une incohérence. Il est impossible que Hedwig soit l'animal de compagnie d'une étudiant de Poudlard si elle est un Phoenix, car les étudiants de Poudlard ne peuvent avoir au plus qu'un animal de compagnie de type chat, chouette ou crapaud!

Nous allons ajouter une dernière restriction, sur la classe Phoenix cette fois.
```
Class: Phoenix
SubClassOf: isPetOf only Wizard
```
Enregistrez les modifications et relancez le raisonneur: l'individu Dumbledore, qui est explicitement déclaré comme étant le maître de Fawkes, a été ajouté à la classe des sorciers!
:::warning
:warning: Le fait d'être une instance de Wizard n'est pas un prérequis pour pouvoir être associé à une instance de Phoenix via la propriété hasPet: l'axiome que nous venons d'ajouter ne se comporte pas comme une contrainte d'intégrité. En revanche, le fait qu'un individu soit associé à une instance de Phoenix via la propriété hasPet lui vaudra d'être classé comme instance de Wizard par le raisonneur: notre axiome a permis d'inferrer cette classification.
:::