:orphan: =================== TPS - 2017 =================== .. rubric:: Préparation `Téléchargez`__ et installez le logiciel Protégé. __ http://protege.stanford.edu/products.php#desktop-protege On vous rappelle que Protégé utilise une syntaxe différente de celle vue en cours ; une `annexe `:ref: vous donne les correspondance. .. rubric:: Votre travail Le rendu de ce travail (réalisé individuellement ou en binôme) est attendu pour lundi 30 janvier à 23h59, à déposer sur Tomuss__ (UE-INF1103M-LD), sous forme d'une archive contenant 1) un rapport en PDF répondant aux questions ci-dessous, et 2) le fichier OWL correspondant à l'ontologie que vous aurez réalisé dans la deuxième partie. Si vous travaillez en binôme, décidez qui des membres déposera le fichier, puis les *deux membres du binôme* inscrivent le numéro d'étudiant du "déposant" dans la cellule ``Déposant1``. Ensuite seulement, le déposant déposera le fichier dans Tomuss. L'autre membre du binôme devra alors vérifier que le fichier déposé apparaît également sur son profil. __ https://tomuss.univ-lyon1.fr/2017/Printemps/UE-INF1103M-LD Partie I ++++++++ Lancez Progété, et choisissez l'option « Open OWL ontology from URI », et ouvrez l'ontologie : http://champin.net/2017/restaurants.owl Pour les deux premières questions, vous vous concentrerez sur l'onglet *Entities*. Notez aussi que les termes de l'ontologie, où qu'ils apparaissent, sont des liens vers la définition correspondante. Ceci vous permet de naviguer d'un élément à l'autre, sans avoir à repasser à chaque fois par les panneaux de gauche. Notez enfin que le bouton < en haut à gauche vous permet de revenir en arrière dans votre navigation. Question 1 ---------- Pour chacun des éléments suivants, retranscrivez ce qu'en dit l'ontologie 1) dans la syntaxe classique des logiques de description (vue en `cours `:ref:) et 2) en français. 1. la classe ``Restaurant`` 2. la propriété ``sert`` 3. la propriété ``serviPar`` 4. la classe ``RestaurantJaponnais`` 5. la classe ``Bouchon`` 6. la classe ``Formule`` 7. la classe ``Gastronomique`` *Important* : contentez-vous de transcrire ce qui est *explicitement dit* par l'ontologie, *pas* ce que vous en déduisez ni ce que vous « devinez » en fonction des termes choisis. Question 2 ---------- Réglez les préférences du moteur d'inférence (raisonneur) : dans le menu File > Preferences, onglet Reasoner, cochez toutes les cases et validez ; puis dans le menu Reasoner, assurez-vous que HermiT est coché. Activez ensuite le moteur d'inférence par le menu Reasoner > Start reasoner (CTRL+R). Notez que de nouvelles connaissances (sur fond jaune pale) apparaissent. Pour chacune des classes et propriétés listées à la question précédente, décrivez les connaissances ajoutées par l'inférence sous les rubriques *Subclass of* et *Disjoint with*, et **expliquez** ces inférences (vous pouvez pour cela vous aider du bouton ? situé à droite de chaque connaissance). Question 3 ---------- Dans le menu Window > Tabs, cochez DL Query, puis ouvrez l'onglet correspondant. Dans le panneau de droite de cet onglet, assurez-vous que les cases *Direct superclasses*, *Equivalent classes* et *Direct subclasses* sont bien cochées. Dans l'onglet DL Query, écrivez des requêtes permettant de répondre aux questions suivantes. Pour chaque question, vous donnerez dans votre rapport : 8. la requête posée dans la syntaxe Protégé, 9. les réponses données par Protégé pour *Direct superclasses*, *Equivalent classes* et *Direct subclasses*, et 10. une explication synthétique en français du résultat. Q3.1 : Est-il possible d'avoir un dessert et une boisson dans une formule midi ? Q3.2 : Est-il possible d'avoir un cappuccino dans un restaurant japonnais ? Q3.3 : Est-il possible d'avoir un cappuccino dans une pizzeria ? Partie II +++++++++ Question 4 ---------- On vous demande maintenant de créer une nouvelle ontologie avec Protégé, répondant au cahier des charges suivant : Notre application porte sur quatre types d'objets distincts : les personnes, les établissements, les formations et les unités d'enseignement (UE). Un établissement dispense des formations. Une formation contient des UEs. Une personne peut être employée par un établissement, être inscrite à une formation, enseigner une UE, suivre une UE. Les établissements peuvent être de plusieurs types distincts : École d'Ingénieur, IUT, Université. Les formations peuvent être de plusieurs types distincts : DUT, License, Master, Diplôme d'Ingénieur. Les écoles d'ingénieur ne dispensent que des diplômes d'ingénieur. Les IUT ne dispensent que des DUT. Les universités ne dispensent que des licenses et des master. Les UEs peuvent être mutualisées entre plusieurs formations, mais uniquement entre DUT et License d'une part, et entre Master et Diplôme d'ingénieur d'autre part. Bonus : un étudiant inscrit à une formation suit nécessairement les UEs de cette formation. Question 5 ---------- Activez le moteur d'inférence, et décrivez (en les expliquant) 2 nouvelles connaissances apparues dans votre ontologies, qui vous semblent particulièrement intéressantes. Vous pouvez également choisir de décrire des connaissances que vous auriez souhaité voire ajoutées par le moteur d'inférence mais qui ne l'ont pas été, en expliquant pourquoi et ce qu'il faudrait ajouter (où retirer) pour qu'elles le soient. .. *IMPORTANT POUR LES PROCHAINES ANNÉES* En fait il n'y a pas grand chose d'intéressant inféré à partir de cette ontologie. Il faudra revoir un peu le cahier des charges, ou changer la question 5. Partie III ++++++++++ Nous allons maintenant manipuler les ontologies programatiquement (en Java), en utilisant la bibliothèque `OWL API `_, et le raisonneur `Hermit `_. Pour installer les dépendances avec Maven, ajoutez ces lignes à votre ``pom.xml``\  :: net.sourceforge.owlapi owlapi-distribution 5.0.5 net.sourceforge.owlapi org.semanticweb.hermit 1.3.8.500 Votre travail ------------- #. Écrivez un programme qui charge l'`ontologie Restaurants `_ vue à dans la `partie I <#partie-i>`_, qui vérifie si elle est consistante, puis qui répond aux questions 3-1, 3-2 et 3-3 `ci-dessus <#question-3>`_. #. Écrivez un programme qui charge l'`ontologie Restaurants `_, + ajoutez-y une classe représentant spécialité de votre choix, + puis créez une instance de restaurant servant cette spécialité. + Vérifiez que l'ontologie est toujours consistante, + puis écrivez (sauvegardez) le code de l'ontologie sur la sortie standard. Quelques indications -------------------- Vous aurez besoin de créer les objets suivants : + un *manager*, créé par la méthode statique ``org.semanticweb.owlapi.apibinding.OWLManager.createOWLOntologyManager``, + une *data factory*, créée par la méthode ``getOWLDataFactory`` de votre *manager*. Pour charger une ontologie, utilisez la méthode ``loadOntologyFromOntologyDocument`` de votre *manager*. Cette méthode produit une instance de ``org.semanticweb.owlapi.model.OWLOntology``. La *data factory* vous permet de créer des éléments OWL : + éléments atomiques (``getOWLClass``, ``getOWLObjectProperty``...), + éléments complexes (``getOWLObjectUnionOf``, ``getOWLObjectAllValuesFrom``...), + axiomes (``getOWLSubClassOfAxiom``, ``getOWLObjectPropertyAssertionAxiom``...). Notez que les méthodes de la *data factory* évoquées ci-dessus créent un objet indépendamment du fait qu'il est présent ou non dans l'ontologie. Pour vérifier si l'ontologie contient bien un élément donné, la classe ``OWLOntology`` fournit un certain nombre de méthodes (``containsClassInSignature``, ``containsAxiom``...). Pour raisonner sur l'ontologie, vous devez créer un raisonneur *pour cette ontologie* avec l'instruction ``new org.semanticweb.HermiT.ReasonerFactory().createReasoner(ontology)``. Ce raisonneur permet notamment de savoir + si son ontologie est consistante, + si une classe est satisfiable, + si un axiome est une conséquence logique de l'ontologie (*entailed*), + ou de répondre à des questions plus spécifiques (liste des sous-classes d'une classe donnée, liste des instances d'une classe, etc...). Pour en savoir plus, consultez la `Javadoc de OWLReasoner `_. Pour modifier l'ontologie, vous devez créer un objet ``OWLOntologyChange`` et le passer à la méthode ``applyChange`` du *manager*. Par exemple, pour ajouter un axiome, vous devez créer une instance de ``org.semanticweb.owlapi.model.AddAxiom``. Pour plus d'information, n'hésitez pas à vous référer à la `Javadoc de OWL-API `_.