Les petites cases

Apprivoiser le hibou 1

Depuis quelques semaines, je travaille à l'élaboration d'une ontologie. J'espère pouvoir dans les prochaines semaines vous parler de ce projet ici-même. Ce projet constituait ma première véritable expérience dans le domaine des ontologies, je m'étais amusé sur ce blog à plusieurs reprises, j'avais réfléchi de façon abstraite, mais de rien de précis. Comme pour toutes choses, le passage de la théorie à la pratique n'est jamais évident. Je me suis donc dit qu'il serait intéressant de compiler quelques conseils et astuces pour construire une ontologie en OWL. Il s'avère qu'une question sur la liste « Web sémantique FR » de Simon m'a permis de commencer cette liste. Voici donc le premier billet de la série.

Récupérer des concepts issus d'autres ontologies

La modularité constitue le grand avantage de RDF. Il est possible de réutiliser des classes et des propriétés définies par d'autres ontologies. Il est inutile de redéfinir un concept dans sa propre ontologie si c'est déjà le cas dans une autre ontologie ou un autre vocabulaire RDF. Ne réinventons pas la roue à l'infini. On multiplie inutilement les concepts identiques. Cette modularité est permise par l'utilisation des espaces de noms ou namespaces. Pour chaque ontologie, schéma RDF est défini un espace de nom par le/les concepteur(s). Évidemment, si un concept est réutilisé, il est essentiel qu'il le soit dans le même sens que l'ontologie d'origine pour que les agents logiciels le traitent automatiquement de la même façon.

Pourtant, un problème se pose dans le cas de OWL. Le principal intérêt des ontologies réside dans la possibilité d'y effectuer des inférences, c'est à dire des déductions. Pour cela, il faut que l'ontologie soit cohérente (consistent en anglais)1. Il est donc essentiel de déclarer dans sa modélisation toutes les classes et les propriétés utilisées, même si elles appartiennent à une autre ontologie et on ne peut se contenter de les utiliser directement comme pour un fichier RDF simple, comme c'est le cas d'un fichier FOAF pour lequel on déclare simplement les espaces de noms utilisés. Pour cela, il existe deux méthodes.

L'importation d'une ontologie constitue la méthode la plus simple. Mais, son utilisation est conditionnée. Dans l'en-tête de l'ontologie, vous déclarez simplement l'URI de l'ontologie que vous voulez importez avec la propriété imports :

<owl:Ontology rdf:about="">
  <rdfs:label xml:lang="fr">Mon ontologie</rdfs:label>
  <owl:imports rdf:resource="http://www.w3.org/2006/time"/>
</owl:Ontology>

Dans cet exemple, j'importe la « Time ontology » actuellement à l'état de working draft au W3C. Cet import évite d'avoir à déclarer les classes et les propriétés définies par cette ontologie. De ce fait, elles vont être toutes importées. Or, dans certains cas, vous n'aurez besoin que d'une propriété ou une classe définie par une autre ontologie. De plus, il est essentiel que l'ontologie importée soit au format OWL. Si elle est définie avec RDFS (RDF schéma), les inférences ne fonctionneront pas, car les méthodes de définitions ne sont pas les mêmes. L'importation ne répond donc pas à l'ensemble des besoins.

La seconde méthode consiste à redéclarer les classes et les propriétés. Dans ce cas, il est essentiel d'indiquer l'URI complète vers le concept dans la déclaration de l'ontologie :

<owl:Class rdf:about="http://cidoc.ics.forth.gr/OWL/crm3.4.9#E53.Place">
  <rdfs:label>Place</rdfs:label>
</owl:Class>

Dans cet exemple, je réutilise le concept de « Place », lieu, défini par le CIDOC-CRM, ontologie destinée à la documentation des objets patrimoniaux. Évidemment, j'ai déclaré le namespace de cette ontologie dans l'élément racine RDF ce qui me permettra ensuite de l'utiliser dans mes individus :

<cidoc:E53.Place></cidoc:E53.Place>.

On peut faire de même avec les propriétés :

<owl:DatatypeProperty rdf:about="http://www.w3.org/2003/01/geo/wgs84_pos#long">
  <rdfs:domain rdf:resource="http://www.w3.org/2003/01/geo/wgs84_pos#SpatialThing"/>
  <rdfs:label xml:lang="fr">longitude</rdfs:label>
  <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#float"/>
</owl:DatatypeProperty>

Dans ce cas, j'utilise la propriété longitude qui fait partie du vocabulaire GEO mis au point au W3C. Vous remarquerez dans ce cas que cette propriété s'applique aux individus de la classe Spatial thing ou à ses sous-classes. Il est donc essentiel de déclarer aussi cette classe avec la méthode décrite précédemment :

<owl:Class rdf:about="http://www.w3.org/2003/01/geo/wgs84_pos#SpatialThing"/>

Une fois que vous avez déclaré les classes et les propriétés, il suffit de les lier aux classes et propriétés de votre propre ontologie. Pour ce faire, vous disposez de plusieurs méthodes. Soit vous déclarez une nouvelle classe comme étant une sous-classe des classes déclarés :

<owl:Class rdf:ID="city">
  <rdfs:label xml:lang="fr">Ville</rdfs:label>
  <rdfs:subClassOf rdf:resource="http://cidoc.ics.forth.gr/OWL/crm3.4.9#E53.Place"/>
  <rdfs:subClassOf rdf:resource="http://www.w3.org/2003/01/geo/wgs84_pos#SpatialThing"/>
</owl:Class>

Ainsi, la classe City possédera les mêmes propriétés que celles qui ont été déclarées dans votre ontologie ou, dans le cas d'une importation, dans l'ontologie d'origine pour http://cidoc.ics.forth.gr/OWL/crm3.4.9#E53.Place et http://www.w3.org/2003/01/geo/wgs84_pos#SpatialThing.

Dans le même ordre d'idée, on peut déclarer une nouvelle propriété comme étant une sous-propriété grâce à rdfs:subPropertyOf. Il est aussi possible de déclarer qu'une classe ou une propriété est équivalente à une autre avec owl:sameAs1. La dernière solution consiste à déclarer la propriété d'une autre ontologie pour une classe de votre propre ontologie :

<owl:DatatypeProperty rdf:about="http://purl.org/dc/terms/bibliographicCitation">
  <rdfs:label>Bibliographic Citation</rdfs:label>
  <rdfs:domain rdf:resource="#record"/>
  <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/>
</owl:DatatypeProperty>

Dans ce cas, la propriété bibliographical citation du vocabulaire dublin core terms est appliquée à la classe Record de ma propre ontologie.

Pour trouver les concepts existants dans d'autres ontologies ou vocabulaires RDF, vous pouvez utiliser le moteur de recherche spécialisé Swoogle. C'est précisément un de ses buts. J'espère que cette explication vous permettra de mieux construire votre ontologie sans réinventer la roue.

Quelques notes en passant

1 Je reviendrai dans un autre billet sur les méthodes pour vérifier la cohérence de l'ontologie.

1 Ces deux dernières possibilités ont été décrites par Alexandre Passant dans la réponse à la question sur la liste Web sémantique. J'espère que tu ne m'en voudras pas de les avoir reprises.

OWL Geekeries — 

Commentaires

Le problème de RDF et de ce type d'entreprise est toujours le même: c'est super! mais ça intéresse qui dans la "vraie vie"? Je crois vaguement me souvenir que manue avait souligné ce pb dans son propre blog il y a quelques temps... sans vouloir foutre la merde chez vous :)
Ce billet est destiné à expliquer concrètement comment faire une ontologie, et pas à quoi elle sert. Il y a d'autres billets qui expliquent l'intérêt d'utiliser cette technologie plutôt qu'une autre, les principes du Web sémantique, etc.
Cette question me semble donc tout à fait déplacée, mais au cas où tu voudrais aller plus loin et savoir à quoi ces technologies peuvent servir, non pas "dans la vraie vie" mais "dans le vrai travail des bibliothécaires" (entre autres métiers) tu peux regarder le projet Stitch ou le projet Sculpteur qui tous deux utilisent des ontologies pour modéliser la connaissance et construire des interfaces innovantes.
Evidemment on peut aussi bricoler la même chose en php avec du Flash, mais ce n'est pas tellement les interfaces qui sont intéressantes, plutôt la façon dont les données sont normalisées pour être réutilisables dans d'autres contextes et d'autres applications.
Sinon ça va très bien chez nous merci.