============================ Vocabulaires et ontologies ============================ .. include:: common.inc .. only:: html .. ifnotslides:: .. contents:: :local: :depth: 1 Introduction ++++++++++++ Motivation ---------- Objectif : expliciter *formellement* la sémantique des vocabulaires (en conformité avec la sémantique de RDF), afin de * limiter les problèmes d'ambigüité sur les termes * permettre leur découverte dynamique * relations sémantiques internes * assurer l'interopérabilité * relations sémantiques avec d'autres vocabulaires Exemples d'inférences --------------------- .. digraph:: inference1 margin=0; rankdir=LR; bgcolor="#FFFFFF00"; node [ style=filled,color=black,fillcolor=white ]; pa -> C [ label="rdf:type" ] C [ label="univ:MaîtreDeConférences" ] .. rst-class:: center ⊧ `KB`:sub: .. digraph:: inference2 margin=0; rankdir=LR; bgcolor="#FFFFFF00"; node [ style=filled,color=black,fillcolor=white ]; pa -> C [ label="rdf:type" ] C [ label="univ:EnseignantChercheur" ] .. rst-class:: center ⊧ `KB`:sub: .. digraph:: inference3 margin=0; rankdir=LR; bgcolor="#FFFFFF00"; node [ style=filled,color=black,fillcolor=white ]; pa -> C [ label="rdf:type" ] C [ label="foaf:Person" ] Expression de la sémantique --------------------------- On souhaite bien sûr exprimer la sémantique des termes en utilisant RDF lui même. Il faut donc définir un *méta-vocabulaire*, dont la sémantique soit connue *a priori*. * Analogie : XML-Schema est un vocabulaire XML dont la sémantique est connue *a priori*, et qui permet d'exprimer la structure de nouveaux vocabulaires. RDF-Schema ++++++++++ Présentation ------------ * RDF-Schema (ou RDF-S) est une recommandation du W3C publiée en même temps que RDF (1999 et révisée en 2004). * Il permet d'exprimer une hiérarchie de classes et une hiérarchie de propriétés (relations). → hiérarchie au sens *large*\ : treillis * Il permet aussi d'exprimer des contraintes sémantiques sur les propriétés et les classes. `⚠` contrainte sémantique ≠ contrainte d'intégrité * Le préfixe habituellement associé à ce méta-vocabulaire est ``rdfs:``. Sémantique ---------- La sémantique de RDF-Schema est construite sur la sémantique de RDF : * `𝔍`:math: est la fonction d'interprétation qui associe une ressource à un nœud ; * `𝔍_p`:math: est la fonction qui associe une relation binaire à une ressource On y ajoute une interprétation spécifique des classes : * `𝔍_c`:math: associe un ensemble de ressource à une ressource Enfin, une interprétation conforme à RDF-S doit vérifier un certain nombre de contraintes qui traduisent la sémantique propre aux termes du méta-vocabulaire. rdf:type -------- Contrainte : .. math:: (𝔍(r), 𝔍(C)) ∈ 𝔍_p(𝔍(\text{rdf:type})) ⇔ 𝔍(r) ∈ 𝔍_c(𝔍(C)) Exemple : .. digraph:: subclassof_p margin=0; rankdir=LR; bgcolor="#FFFFFF00"; node [ style=filled,color=black,fillcolor=white ]; r [ label=":pa" ] C [ label="u:Enseignant" ] r -> C [ label="rdf:type", fontcolor=red ] rdfs:subClassOf --------------- Contrainte : .. math:: (𝔍(C), 𝔍(D)) ∈ 𝔍_p(𝔍(\text{rdfs:subClassOf})) ⇒ 𝔍_c(𝔍(C)) ⊆ 𝔍_c(𝔍(D)) Exemple : .. digraph:: subclassof_p margin=0; rankdir=LR; bgcolor="#FFFFFF00"; node [ style=filled,color=black,fillcolor=white ]; r [ label=":pa" ] C [ label="u:Enseignant" ] D [ label="foaf:Person" ] r -> C [ label="rdf:type" ] C -> D [ label="rdfs:subClassOf", fontcolor=red ] .. rst-class:: center ⊧ .. digraph:: subclassof_o margin=0; rankdir=LR; bgcolor="#FFFFFF00"; node [ style=filled,color=black,fillcolor=white ]; r [ label=":pa" ] D [ label="foaf:Person" ] r -> D [ label="rdf:type" ] rdfs:subPropertyOf ------------------ Contrainte : .. math:: (𝔍(p), 𝔍(q)) ∈ 𝔍_p(𝔍(\text{rdfs:subPropertyOf})) ⇒ 𝔍_p(𝔍(p)) ⊆ 𝔍_p(𝔍(q)) Exemple : .. digraph:: subclassof_p margin=0; rankdir=LR; bgcolor="#FFFFFF00"; node [ style=filled,color=black,fillcolor=white ]; r [ label=":pa" ] s [ label=":yp" ] p [ label="u:travailleAvec" ] q [ label="foaf:knows" ] p -> q [ label="rdfs:subPropertyOf", fontcolor=red ] r -> s [ label="u:travailleAvec" ] .. rst-class:: center ⊧ .. digraph:: subclassof_o margin=0; rankdir=LR; bgcolor="#FFFFFF00"; node [ style=filled,color=black,fillcolor=white ]; r [ label=":pa" ] s [ label=":yp" ] r -> s [ label="foaf:knows" ] rdfs:domain ----------- Contrainte : .. math:: (𝔍(p), 𝔍(C)) ∈ 𝔍_p(𝔍(\text{rdfs:domain})) ∧ (r,s) ∈ 𝔍_p(𝔍(p)) ⇒ r ∈ 𝔍_c(𝔍(C)) Exemple : .. digraph:: subclassof_p margin=0; rankdir=LR; bgcolor="#FFFFFF00"; node [ style=filled,color=black,fillcolor=white ]; r [ label=":lab" ] s [ label=":pa" ] p [ label="foaf:member" ] C [ label="foaf:Group" ] p -> C [ label="rdfs:domain", fontcolor=red ] r -> s [ label="foaf:member" ] .. rst-class:: center ⊧ .. digraph:: subclassof_o margin=0; rankdir=LR; bgcolor="#FFFFFF00"; node [ style=filled,color=black,fillcolor=white ]; r [ label=":lab" ] C [ label="foaf:Group" ] r -> C [ label="rdf:type" ] rdfs:range ---------- Contrainte : .. math:: (𝔍(p), 𝔍(C)) ∈ 𝔍_p(𝔍(\text{rdfs:range})) ∧ (r,s) ∈ 𝔍_p(𝔍(p)) ⇒ s ∈ 𝔍_c(𝔍(C)) Exemple : .. digraph:: subclassof_p margin=0; rankdir=LR; bgcolor="#FFFFFF00"; node [ style=filled,color=black,fillcolor=white ]; r [ label=":lab" ] s [ label=":pa" ] p [ label="foaf:member" ] C [ label="foaf:Person" ] p -> C [ label="rdfs:range", fontcolor=red ] r -> s [ label="foaf:member" ] .. rst-class:: center ⊧ .. digraph:: subclassof_o margin=0; rankdir=LR; bgcolor="#FFFFFF00"; node [ style=filled,color=black,fillcolor=white ]; s [ label=":pa" ] C [ label="foaf:Person" ] s -> C [ label="rdf:type" ] Documentation ------------- RDF-Schema fournit aussi des termes pour *documenter* un vocabulaire : * ``rdfs:label`` permet d'associer un libellé textuel à un URI (éventuellement plusieurs, par exemple dans plusieurs langues) ; * ``rdfs:comment`` permet d'associer un commentaire textuel plus long ; * ``rdfs:seeAlso`` permet de pointer vers une autre ressource. Méta-modélisation ----------------- Rien n'empèche, en RDF-S, d'avoir une classe qui soit elle même une instance d'une autre classe (méta-classe). C'est d'ailleurs de cette manière que les classes sont identifiées. .. digraph:: metamodelling margin=0; rankdir=LR; bgcolor="#FFFFFF00"; node [ style=filled,color=black,fillcolor=white ]; dumbo -> Éléphant -> Espèce -> Class [ label="rdf:type" ] dumbo [ label=":dumbo" ] Éléphant [ label=":Éléphant" ] Espèce [ label=":Espèce" ] Class [ label="rdfs:Class" ] Exemple : FOAF -------------- .. figure:: _static/foafspec.png :height: 17em Contrainte sémantique ≠ contraintes d'intégrité ----------------------------------------------- Les méta-propriétés ``rdfs:domain`` et ``rdfs:range`` ne servent *pas* à vérifier qu'un graphe serait « valide ». Il ne permettent que d'*inférer* des faits supplémentaires. * Comme RDF-S n'a pas de négation, ceci n'entraîne jamais d'incohérence *formelle* au niveau des classes et des propriétés. → en d'autre termes, la sémantique de RDF-S ne permet pas de détecter les incohérences (conceptuelles) que pourraient entrainer ces inférences. .. digraph:: not_inconsistent margin=0; rankdir=LR; bgcolor="#FFFFFF00"; node [ style=filled,color=black,fillcolor=white ]; jdoe [ label=":JohnDoe" ] doc1 [ label=":doc1" ] Document [ label="foaf:Document" ] jdoe -> doc1 [ label="foaf:knows" ] doc1 -> Document [ label="rdf:type" ] OWL +++ Présentation ------------ OWL (Web Ontology Language) a été recommandé par le W3C en 2004, et sa version 2 en 2009. * C'est un méta-vocabulaire (comme RDF-S) inspiré des **logiques de descriptions** avec valeurs concrètes (littéraux). * Il définit plusieurs *profils* offrant des compromis différents en terme d'expressivité et de complexité. * Il mime les capacités de méta-modélisation de RDF-S (*punning*). Profils OWL 2 ------------- .. list-table:: :widths: 10 90 * - Full - aucune contrainte, indécidable * - DL - minimum de contraintes, décidable mais très complexe * - EL - quantifications existentielles (EL++), expressivité adaptée à certains domaines (biologie) * - QL - peut s'implémenter au dessus d'un langage de requêtes (SQL) * - RL - peut s'implémenter au dessus d'un langage à base de règles (Prolog) .. digraph:: owl_profiles margin=0; rankdir=BT; bgcolor="#FFFFFF00"; size=3; node [ style=filled,color=black,fillcolor=white,shape=box]; full [ label="OWL2 Full" ] dl [ label="OWL2 DL" ] el [ label="OWL2 EL" ] ql [ label="OWL2 QL" ] rl [ label="OWL2 RL" ] el -> dl -> full ql -> dl rl -> dl Axiomes OWL ----------- OWL offre des axiomes « de haut niveau » qui visent à * améliorer la lisibilité de la base de connaissance * optimiser le raisonnement * contraindre l'utilisation de certains constructeurs à certaines formes d'axiome selon les profils (*e.g.* Property Chain) Sur les concepts ```````````````` .. list-table:: :class: ld :header-rows: 1 * - OWL - LD * - ``rdfs:subClassOf`` - C ⊑ D * - ``rdf:type`` - C(a) * - ``owl:equivalentClass`` - C ⊑ D et D ⊑ C * - ``owl:disjointWith``, ``owl:AllDisjointClasses`` - C ⊑ ¬D Sur les rôles ````````````` .. list-table:: :class: ld :header-rows: 1 * - OWL - LD * - ``owl:FunctionalProperty`` - ⊤ ⊑ (≤ 1 r) * - ``owl:InverseFunctionalProperty`` - ⊤ ⊑ (≤ 1 r⁻) * - ``owl:TransitiveProperty`` - r ∘ r ⊑ r * - ``owl:SymetricProperty`` - r ⊑ r⁻ * - ``owl:AsymmetricProperty`` - r ⊑ ¬(r⁻) * - ``owl:ReflexiveProperty`` - ⊤ ⊑ (∃ r self) * - ``owl:IreflexiveProperty`` - ⊤ ⊑ ¬(∃ r self) Sur les rôles (suite) ````````````````````` .. list-table:: :class: ld :header-rows: 1 * - OWL - LD * - ``rdfs:domain`` - ∃ r ⊑ C * - ``rdfs:range`` - ∃ r⁻ ⊑ C * - ``rdfs:subPropertyOf`` - r ⊑ p * - ``owl:equivalentProperty`` - r ⊑ p et p ⊑ r * - ``owl:inverseOf`` - r ⊑ p⁻ et p⁻ ⊑ r * - ``owl:propertyDisjointWith``, ``owl:AllDisjointProperties`` - r ⊑ ¬p * - ``owl:propertyChainAxiom`` - p ∘ q ∘ ... ⊑ r Représentation des LD en RDF ---------------------------- .. digraph:: ld_in_rdf margin=0; rankdir=TB; bgcolor="#FFFFFF00"; node [ style=filled,color=black,fillcolor=white ]; restr [ label="" ] restriction [ label="owl:Restriction" ] inverse [ label="" ] enfant [ label=":enfant" ] personne [ label=":Personne" ] union [ label="" ] list1 [ label="" ] list [ label="rdf:List" ] homme [ label=":Homme" ] list2 [ label="" ] femme [ label=":Femme" ] nil [ label="rdf:nil" ] restr -> restriction [ label="rdf:type" ] restr -> inverse [ label="owl:onProperty" ] restr -> personne [ label="owl:someValuesFrom" ] restr -> union [ label="rdfs:subClassOf" ] inverse -> enfant [ label="owl:inverseOf" ] union -> list1 [ label="owl:unionOf" ] list1 -> list [ label="rdf:type" ] list1 -> homme [ label="rdf:first" ] list1 -> list2 [ label="rdf:rest" ] list2 -> femme [ label="rdf:first" ] list2 -> nil [ label="rdf:rest" ] ∃ enfant⁻ Personne ⊑ Homme ⊔ Femme