:tocdepth: 3 =================================== Vocabulaires et méta-vocabulaires =================================== Vocabulaires ============ Trouver un vocabulaire ---------------------- * https://lov.linkeddata.es/ * http://www.ontobee.org/ Quelques vocabulaires utiles ---------------------------- .. only:: html .. contents:: :local: :backlinks: none Dublin Core ``````````` Méta-données à propos des documents : * titre, résumé... * créateur, contributeur... * date de création, de dernière modification, versions... :description: https://lov.linkeddata.es/dataset/lov/vocabs/dcterms :homepage: http://purl.org/dc/terms/ FOAF: Friend of a friend ```````````````````````` Description de personnes et de leur réseau social * Personne (nom, prénom, page weg, adresse e-mail, *connaissance*...) * Groupe (membres...) * Document (a pour sujet...), Image (représente...) :description: https://lov.linkeddata.es/dataset/lov/vocabs/foaf :homepage: http://www.foaf-project.org/ SIOC: Semantically-Interlinked Online Communities ````````````````````````````````````````````````` Description de communautés en ligne * Forum, Blog, Wiki... * Article, Commentaire... :description: https://lov.linkeddata.es/dataset/lov/vocabs/sioc :homepage: http://rdfs.org/sioc/spec/ Schema.org `````````` Vocabulaire généraliste * destiné à améliorer l'indexation des pages par les moteurs de recherche :description: https://lov.linkeddata.es/dataset/lov/vocabs/schema :homepage: http://schema.org/ SOSA/SSN ```````` Ontologie pour le *Web of Things* (capteurs et objets connectés). * SOSA: *Sensor, Observation, Sample, and Actuator* * SSN: *Semantic Sensor Network* :description: https://lov.linkeddata.es/dataset/lov/vocabs/schema :homepage: https://www.w3.org/TR/vocab-ssn/ GS1 Web Vocabulary `````````````````` Extension de Schema.org pour décrire des produits commercialisés. :homepage: https://www.gs1.org/voc/ Méta-vocabulaires ================= Motivation ---------- Découverte de la sémantique d'un terme (IRI) en le déréférençant. Exemple : ``http://dbpedia.org/resource/James_Bond`` .. code-block:: turtle :James_Bond a dbo:FictionalCharacter ; dbo:creator :Ian_Fleming . Ce principe s'applique également aux classes (*e.g.* ``dbo:FictionalCharacter``) et aux prédicats (*e.g.* ``dbo:creator``). Problème -------- Syndrome du dictionnaire : il faut pouvoir s'« arrêter » sur des termes connus. Nécessité d'un vocabulaire (ensemble de termes) permettant de décrire d'autres vocabulaires : **méta-vocabulaires**. 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 ]; James_Bond -> C [ label="rdf:type" ] James_Bond [ label=":James_Bond" ] C [ label="dbo:FictionalCharacter" ] .. rst-class:: center ⊧ₖ .. digraph:: inference2 margin=0; rankdir=LR; bgcolor="#FFFFFF00"; node [ style=filled,color=black,fillcolor=white ]; James_Bond -> C [ label="rdf:type" ] James_Bond [ label=":James_Bond" ] C [ label="dbo:Person" ] .. rst-class:: center ⊧ₖ .. digraph:: inference3 margin=0; rankdir=LR; bgcolor="#FFFFFF00"; node [ style=filled,color=black,fillcolor=white ]; James_Bond -> C [ label="rdf:type" ] James_Bond [ label=":James_Bond" ] C [ label="foaf:Person" ] RDF-Schema ========== Présentation ------------ * RDF-Schema (ou RDF-S) est une recommandation du W3C publiée en même temps que RDF (1999, révisée en 2004 et 2014). * 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é, cf. `ci-après `:ref: Espaces de noms et préfixes --------------------------- Suite à des circonvolutions historiques, le vocabulaire RDF-Schema utilise deux espaces de nom, associés respectivement aux préfixes suivants :: PREFIX rdf: PREFIX rdfs: rdf:type -------- ``rdf:type`` indique l'appartenance d'une ressource à une classe. Exemple : .. digraph:: subclassof_p margin=0; rankdir=LR; bgcolor="#FFFFFF00"; node [ style=filled,color=black,fillcolor=white ]; r [ label=":James_Bond" ] C [ label="dbo:FictionalCharacter" ] r -> C [ label="rdf:type", fontcolor=red ] rdfs:subClassOf --------------- ``rdfs:subClassOf`` indique une relation une spécialisation entre classes (« est une sorte de », ou « tous les X sont des Y »). Exemple : .. digraph:: subclassof_p margin=0; rankdir=LR; bgcolor="#FFFFFF00"; node [ style=filled,color=black,fillcolor=white ]; r [ label=":James_Bond" ] C [ label="dbo:FictionalCharacter" ] D [ label="dbo: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=":James_Bond" ] D [ label="dbo:Person" ] r -> D [ label="rdf:type" ] rdfs:subPropertyOf ------------------ ``rdfs:subPropertyOf`` indique une relation une spécialisation entre propriétés (« est une sorte de »). Exemple : .. digraph:: subclassof_p margin=0; rankdir=LR; bgcolor="#FFFFFF00"; node [ style=filled,color=black,fillcolor=white ]; r [ label=":James_Bond" ] s [ label=":Ian_Fleming" ] p [ label="dbo:creator" ] q [ label="dc:creator" ] p -> q [ label="rdfs:subPropertyOf", fontcolor=red ] r -> s [ label="dbo:creator" ] .. rst-class:: center ⊧ .. digraph:: subclassof_o margin=0; rankdir=LR; bgcolor="#FFFFFF00"; node [ style=filled,color=black,fillcolor=white ]; r [ label=":James_Bond" ] s [ label=":Ian_Fleming" ] r -> s [ label="dc:creator" ] rdfs:domain ----------- Indique qu'une propriété porte nécéssairement sur les instance d'une classe. Exemple : .. digraph:: subclassof_p margin=0; rankdir=LR; bgcolor="#FFFFFF00"; node [ style=filled,color=black,fillcolor=white ]; r [ label=":James_Bond" ] s [ label=":Ian_Fleming" ] p [ label="dbo:creator" ] C [ label="dbo:Work" ] p -> C [ label="rdfs:domain", fontcolor=red ] r -> s [ label="dbo:creator" ] .. rst-class:: center ⊧ .. digraph:: subclassof_o margin=0; rankdir=LR; bgcolor="#FFFFFF00"; node [ style=filled,color=black,fillcolor=white ]; r [ label=":James_Bond" ] C [ label="dbo:Work" ] r -> C [ label="rdf:type" ] rdfs:range ---------- Indique qu'une propriété a nécéssairement pour valeur les instance d'une classe. Exemple : .. digraph:: subclassof_p margin=0; rankdir=LR; bgcolor="#FFFFFF00"; node [ style=filled,color=black,fillcolor=white ]; r [ label=":James_Bond" ] s [ label=":Ian_Fleming" ] p [ label="dbo:creator" ] C [ label="dbo:Person" ] p -> C [ label="rdfs:range", fontcolor=red ] r -> s [ label="dbo:creator" ] .. rst-class:: center ⊧ .. digraph:: subclassof_o margin=0; rankdir=LR; bgcolor="#FFFFFF00"; node [ style=filled,color=black,fillcolor=white ]; s [ label=":Ian_Fleming" ] C [ label="dbo:Person" ] s -> C [ label="rdf:type" ] .. _contraintes: Contrainte RDF-S ≠ 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. * Indirectement, cela peut entraîner une *contradiction*, qui signale effectivement un problème : .. digraph:: literal_inconsistency margin=0; rankdir=LR; bgcolor="#FFFFFF00"; node [ style=filled,color=black,fillcolor=white ]; r [ label=":Ian_Fleming" ] s [ label="\"a thursday\""; shape=box ] p [ label="dbo:birthDate" ] C [ label="xsd:dateTime" ] p -> C [ label="rdfs:range", fontcolor=red ] r -> s [ label="dbo:birthDate" ] * Mais ces contradictions sont *rares* en RDF-S, qui ne permet pas d'exprimer de négation. Dans l'exemple précédent, `dbr:James_Bond` est à la fois une personne (`dbo:Person`) et une œuvre (`dbo:Work`), et RDF-S ne permet pas d'interdire cela. 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 -> Class [ label="rdf:type" ] dumbo [ label=":dumbo" ] Éléphant [ label=":Éléphant" ] Espèce [ label=":Espèce" ] Class [ label="rdfs:Class" ] 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). * C'est un surensemble de RDF-S, ajoutant notamment la possibilité d'exprimer des négations. * 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, Datalog) .. 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 Relations entre individus ------------------------- * ``owl:sameAs`` * ``owl:differentFrom`` * ``owl:AllDifferent`` * ``owl:NegativePropertyAssertion`` owl:sameAs `````````` Indique que deux IRIs dénotent la même ressource. Exemple : .. digraph:: subclassof_p margin=0; rankdir=LR; bgcolor="#FFFFFF00"; node [ style=filled,color=black,fillcolor=white ]; r [ label="lmdb_character:82" ] s [ label=":James_Bond" ] t [ label=":Ian_Fleming" ] r -> s [ label="owl:sameAs", fontcolor=red ] s -> t [ label="dbo:creator" ] .. rst-class:: center ⊧ .. digraph:: subclassof_o margin=0; rankdir=LR; bgcolor="#FFFFFF00"; node [ style=filled,color=black,fillcolor=white ]; r [ label="lmdb_character:82" ] t [ label=":Ian_Fleming" ] r -> t [ label="dbo:creator" ] Relations entre classes ----------------------- * ``owl:equivalentClass`` * ``owl:unionOf`` * ``owl:disjointWith`` * ``owl:AllDisjointClasses`` Types de propriété ------------------ + ``owl:ObjectProperty`` + ``owl:DatatypeProperty`` * ``owl:FunctionalProperty`` * ``owl:InverseFunctionalProperty`` * ``owl:TransitiveProperty`` * ``owl:SymetricProperty`` * ``owl:AsymmetricProperty`` * ``owl:ReflexiveProperty`` * ``owl:IreflexiveProperty`` Relations entre propriétés -------------------------- * ``owl:equivalentProperty`` * ``owl:inverseOf`` * ``owl:propertyDisjointWith`` * ``owl:AllDisjointProperties`` * ``owl:propertyChainAxiom`` Restrictions ------------ Une restriction OWL est une classe définie en intension, selon une contrainte sur une propriété *p* de ses instances : * au moins une valeur de *p* est de la classe *C*, * toutes les valeurs de *p* sont de la classe *C*, * il y a au moins / au plus / exactement *n* valeurs de *p* (ayant la classe *C*) Exemple 1 ````````` Touts ceux qui ont au moins un enfant médecin .. digraph:: subclassof_p margin=0; rankdir=LR; bgcolor="#FFFFFF00"; node [ style=filled,color=black,fillcolor=white ]; r [ label="" ] R [ label="owl:Restriction" ] p [ label="ex:hasChild" ] C [ label="ex:Doctor" ] r -> R [ label="rdf:type" ] r -> p [ label="owl:onProperty" ] r -> C [ label="owl:someValuesFrom" ] Exemple 2 ````````` Touts ceux qui n'ont que des enfants médecins .. digraph:: subclassof_p margin=0; rankdir=LR; bgcolor="#FFFFFF00"; node [ style=filled,color=black,fillcolor=white ]; r [ label="" ] R [ label="owl:Restriction" ] p [ label="ex:hasChild" ] C [ label="ex:Doctor" ] r -> R [ label="rdf:type" ] r -> p [ label="owl:onProperty" ] r -> C [ label="owl:allValuesFrom" ] .. warning:: Cela inclut tout ce qui n'a *aucun* enfant (car cela revient à dire "tout ceux dont aucun enfant n'est pas médecin"). Cela inclut donc également les voitures, les maisons... .. _cardinalité: Exemple 3 ````````` Touts ceux qui ont au plus trois enfants .. digraph:: subclassof_p margin=0; rankdir=LR; bgcolor="#FFFFFF00"; node [ style=filled,color=black,fillcolor=white ]; r [ label="" ] R [ label="owl:Restriction" ] p [ label="ex:hasChild" ] n [ label="3",shape=rectangle ] r -> R [ label="rdf:type" ] r -> p [ label="owl:onProperty" ] r -> n [ label="owl:maxCardinality" ] Exemple 4 ````````` Touts ceux qui ont au moins trois enfants médecins .. digraph:: subclassof_p margin=0; rankdir=LR; bgcolor="#FFFFFF00"; node [ style=filled,color=black,fillcolor=white ]; r [ label="" ] R [ label="owl:Restriction" ] p [ label="ex:hasChild" ] n [ label="3",shape=rectangle ] C [ label="ex:Doctor" ] r -> R [ label="rdf:type" ] r -> p [ label="owl:onProperty" ] r -> n [ label="owl:minCardinality" ] r -> C [ label="owl:onClass" ] Contrainte OWL ≠ contraintes d'intégrité ------------------------------------------ On pourrait avoir l'impression que OWL, mieux que RDF-S, permet d'exprimet des contraintes d'intégrités. Mais l'`hypothèse de monde ouvert `:ref: rend ceci également difficile. Exemple : * avec des restrictions de `cardinalité `:ref:, on peut exprimer que toute personne a exactement 2 parents ; * mais cela n'oblige pas d'indiquer, pour toute personne, qui sont ses parents (au contraire, le moteur d'inférence déduira qu'ils existent *même* s'ils ne sont pas mentionnés). .. nextslide:: RDF-S et OWL décrivent des **schémas inférentiels**: * Les contraintes qu'ils expriment portent sur le *monde* décrit par les données (contraintes sémantiques), Ils ne doivent pas être confondus avec les **schémas structurels** ou **schémas validants**: * Les contraintes qu'ils expriment portent sur les données elles-mêmes (contraintes syntaxiques, ou contraintes d'intégrité), * Exemples: Schémas SQL, XML-schema, * ou, pour RDF, `SHACL`__ et `ShEx`__. __ https://www.w3.org/TR/shacl/ __ http://shex.io/