Préambule :

 

Dans ce tutoriel je me suis donner pour but aborder les topic maps à travers le paradigme XTM (XML Topic Maps) et offrir à mes collègues qui travaillent aussi sur ce sujet, les informations techniques sur les différentes balises du « markup language » XTM. Je ne m’attarderais pas trop sur les aspects conceptuels qui seront aborder plus amplement dans mon Papier. Cet article a pour seul prétention de décrire formellement les divers balises, leur syntaxes à travers des exemples concrets pour permettre à ceux qui veulent s’attaquer à l’élaboration d’une topic map (des gens qui savent déjà plus ou moins de quoi les topic maps traitent) d’aborder leur tâche dans les meilleures conditions. J’ai beaucoup hésité car je pense que pour mes 2 collègues qui s’adonnent aussi  à l’élaboration des topic maps, cet article-tutoriel vient un peu tard. Je me suis finalement résigné à le faire quand même car il me permettra avant tout de mettre de l’ordre dans mes connaissances techniques et d’intégrer ces dernières au mieux. J’ai souvent remarqué qu’en tentant d’enseigner, on apprend mieux soi-même. Deuxièmement je trouve qu’il n’y a pas assez de ressources pratiques portant sur le paradigme XTM en langue française sur le web. J’ai espoir que ce petit tutoriel aidera les surfeurs francophones qui s’intéressent au sujet d’y voir plus clair.

 

Même si le but de cet article n’est pas d’aborder les topic maps dans une visée conceptuelle mais de donner une définition des diverses balises en usages dans le langage XTM, leur utilité et leur syntaxe, je donnerais néanmoins une petite définition du concept qui est derrière chaque balise.

 

Le langage  XTM est basé comme son nom l’indique sur le métalangage XML. Les développeurs ont donc eu constamment pour soucis a ce que le nom de la balise représente bien le concept qu’il y a derrière. Je définirais donc tout de même sommairement le concept qui se trouve derrière chaque balises pour que le lecteur néophyte ne soit pas totalement perdu. Etant donné que souvent le nom de la balise et le concept derrière portent le même nom, j’entourerais le nom de la balise des « braquets » < > et écrirais le concept en italique.

 

Pour illustrer de la meilleure des façon les fonctionnalités des divers balises, j’ai décidé d’aborder la syntaxe sous forme d’un tutoriel continu. Rien n’est mieux pour apprendre un langage que de l’étudier à travers un exemple concret. Je me suis pour cela librement inspiré de l’exemple de topic-map proposé par Sam Hunting en l’adaptant à ma manière.

 

<topicMap> :

 

définition : le concept derrière la balise <TopicMap>  est comme son nom l’indique topic-map. Une définition sommaire que l’on peut en donner serait la suivante : c’est un ensemble de topics (concepts) relié entre eux par des associations (relations). Ainsi on peut définir la topic-map comme un réseau de concepts (topics) reliés entre eux par les rôles qu’ils jouent les uns par rapports aux autres et l’influences qu’ils ont les uns sur les autres (associations).

 

Rôle : la balise <TopicMap> permet de déclarer la topic-map elle-même. Elle a pour caractéristique (comme les balises <topic> ou <subjectIdentity>) de pouvoir être vide.

 

Syntaxe :  la déclaration de la topic-map s’effectue normalement tout au début du fichier XTM, juste après la déclaration de la version de xml et du DOCTYPE. voici un exemple de comment l’on déclare une topic map :

 

<topicMap id=”SucreMap”

xmlns=”http://www.topicmaps.org/xtm/1.0

xmlns:xlink=”http://www.w3.org/1999/xlink”>

 

(corps de la topic-map)

 

</topicMap>

 

à noter que le premier attribut xmlns envoie à la page où est définie par les créateurs, le formalisme XTM et que le deuxième envoie vers le formalisme xlink de la W3.  A noter aussi que l' identité id="SucreMap" n'est pas obligatoire et que l'identité peut prendre tout autre nom que SucreMap selon le sujet de la topic map. la seule contrainte est que l’attribut id  soit unique dans le document.  

 

<topic> :

 

définition : les topic sont les composantes principales d’une topic-map. Le mot « topic » vient du grec topos qui signifie sujet ou emplacement. On peut définir le topic comme une représentation computationnelle (représentation de l’ordinateur) d’un sujet/concept.

 

Rôle : la balise <topic> a pour fonction de créer une nouvelle topic dans une topic-map.

 

Syntaxe : 

 

Forme abrégée :

 

<topic id=”leSucre”/>

 

Forme complète :

 

<topic id=”leSucre”>

</topic>

 

<baseName> et <baseNameString>:

 

définition : la base-name est une chaîne de caractère qui est spécifiée comme étant le nom d’une topic.

 

Rôle : la balise <baseName> permet de définir la base-name d’une topic et la balise  <baseNameString> permet de préciser la chaîne de caractère utilisé pour ce faire.

 

Syntaxe : 

 

<topic id=”leSucre”>

   <baseName>

      <baseNameString> Sucre </baseNameString>

  </baseName>

</topic>

 

 

ainsi selon la syntaxe, à l’intérieur des balises qui définissent la topic «leSucre» on précise le nom de cette topic à l’aide des balises <baseName> et la chaîne de caractère correspondante à l’aide des balises <baseNameString>.

 

 

<occurrence> et <ressourceRef>:

 

définition : une occurrence est une information adressable, c’est à dire une ressource sur le web relevant d’un sujet précis. Cela peut être toute forme de ressource comme une page web, un texte, une image, une vidéo ou autres qui traitent d’un thème précis.

 

Rôle : le rôle de la balise <occurrence> est de renvoyer vers une ressource traitant de la topic dans laquelle cette occurrence est déclaré. Elle permet donc aux lecteurs d’accéder à de plus amples informations existant sur le web et portant sur la topic en question.

 

Syntaxe : 

 

<topic id=”leSucre”>

   <occurrence>

      <ressourceRef xlink:href=”sucre.gif”/>

   </occurrence>

</topic>

 

Ici par exemple pour préciser au lecteur qu’on parle bien du sucre comme ingrédiant, on lui permet d’accéder à une ressource sous forme de photo représentant du sucre en poudre. Pour ce faire on a utilisé la balise <ressourceRef>. Il faut savoir à ce niveau de connaissance que toute référence à une ressource externe se fait entre les balises <occurrence></occurrence>.

 

<subjectIdentity> et <subjectIndicatorRef>:

 

définition : le concept de subject-identity peut se définir comme étant une caractéristique qui permet de distinguer un sujet (ici une topic) des autres sujets. Toute topic ne doit avoir qu’un seul « subject » et tout « subject », une identité unique.

 

Rôle : le rôle de la balise <subjectIdentity> est de définir l’identité d’une topic qu’un être humain mais aussi une machine puisse comprendre. Pour cela l’on a pour habitude de référencer (faire un lien, « linker ») vers une ressource qui sert, d’un commun accord, de légitimation de l’identité de notre topic. Dans notre exemple du sucre, pour définir l’identité de notre topic « sucre », l’on peut se référé à un site gouvernementale américain qui traite du sucre en poudre par exemple et qui est sensé servir de référence pour tout ceux qui parle de l’ingrédiant sucre en poudre (tant les patissiers, que les cultivateurs de cannes à sucre etc.). Pour référencer l’identité, on utilise la balise d’attribut <subjectIndicatorRef> qui est au <subjectIdentity> ce qu’est <RessourceRef> a l’ <occurrence> vu avant.

 

Syntaxe : 

 

<topic id=”leSucre”>

   <subjectIdentity>

      <subjectIndicatorRef xlink:href=”http://www.fed.gov/usda/doc/powdersugar.htm”/>

      </subjectIdentity>

</topic>

 

remarque : le site de référence dans cet exemple n’existe pas mais admettons que ce site fictif sert de référence comme par exemple la norme ISO serivrait de référence standard pour divers domaine. Cela peut être un site ayant une quelconque base de donnée sur les ingrédiants et sur lequel on se serait tous mis d’accord comme quoi cela sert de référence. Tout ceci renvoie à la notion de PSI (Published Subject Indicators) qui sera plus amplement traité dans mon rapport final (papier). 

 

<scope> et <topicRef>:

 

définition : Le scope  permet de spécifier le contexte dans lequel une base-name ou une occurrence est appliquée à une topic et le contexte dans lequel on relie des topics par certaines associations. On a vu que la base-name était utilisée pour permettre à un utilisateur humain de donner un sens à une topic. Mais dans notre exemple un utilisateur non-francophone ne pourra pas comprendre le mot « sucre ». Dans une vision universelle de la connaissance, il nous viendra vite à l’idée de vouloir nous faire comprendre par un utilisateur anglophone par exemple. Pour cela on va donner un contexte différent pour la base-name spécifique aux utilisateurs anglophone.

 

Rôle : une balise <scope> permet de faire une scope (cf. définition plus haut).

 

Syntaxe : 

 

Pour que des utilisateurs anglophones puissent aussi comprendre à quoi correspond la topic «leSucre» on va leur donner la possibilité de pouvoir accéder à “sugar” comme baseName plutôt que “sucre”. Pour ce faire on va créer 2 nouvelles topics EN et FR qui correspondront aux 2 concepts en norme ISO des langues «English» et «Français». On va procéder ainsi :

 

<topic id=”EN”>

   <subjectIdentity>

      <subjectIndicatorRef xlink:href=http://www.topicmaps.org/xtm/1.0/language.xtm#en”/>

   </subjectIdentity>

</topic>

 

 <topic id=”FR”>

   <subjectIdentity>

      <subjectIndicatorRef xlink:href=http://www.topicmaps.org/xtm/1.0/language.xtm#fr”/>

   </subjectIdentity>

</topic>

 

remarque : le lien de référence vers le site topicmaps.org permet de légitimer l’identité de la topic (concept) anglais (EN) et français (FR) pour que même la machine puisse comprendre de quoi on parle (ce sont les PSI’s).

 

Maintenant qu’on a nos 2 concepts de langue définis sous forme de topic, il nous suffit d’y référer à partir de notre topic «leSucre» à l’aide des balises <scope>. La référence vers ces 2 topics vont nous demander de définir une autre balise qu’est la balise <TopicRef>. Cette dernière permet de faire référence à une autre topic à partir de la topic courante. Voici comment :

 

<topic id=”leSucre”>

   <baseName>

      <scope>

         <topicRef xlink:href=”FR”/>

      <scope>

      <baseNameString> sucre </baseNameString>

  </baseName>

  <baseName>

      <scope>

         <topicRef xlink:href=”EN”/>

      <scope>

      <baseNameString> sugar </baseNameString>

  </baseName>

</topic>

 

<association> et <member>:

 

définition : une association est la relation entre 2 sujets (topics). Toute association définit des rôles aux topics qu’elle relit et doit aussi être définie comme une topic dans le document (car elle est aussi un concept dans le sens ou elle traite aussi d’un sujet qui porte sur la relation entre d’autre sujets).

 

Rôle : la balise <association> permet de définir une relation entre 2 topics.

 

Syntaxe : 

 

Faire une topic-map ou le sujet unique est le sucre serait un peu limité. Nous allons donc créer une nouvelle topic à laquelle on pourra relier la topic ”leSucre” à l’aide d’une association. On va créer la topic ”leGateau” :

 

<topic id=”leGateau”>

   <baseName>

      <baseNameString> gâteau au chocolat </baseNameString>

  </baseName>

</topic>

 

maintenant on va associer la topic “leSucre” avec la topic “leGateau” à l’aide d’une association. On a vu que l’association crée forcément des rôles (2 en l’occurrence). Ainsi dans une association les 2 topics “leSucre” et “leGateau” vont jouer le rôle de membres de cette associations. Pour définir cela il nous faudra définir une nouvelle balise qu’est la balise <Member>. Cette dernière permet d’indiquer quels 2 topics sont les membres d’une associations. Maintenant on peut voir comment on déclare une association entre 2 topics :

 

<association id=“association_Sucre_Gateau”>

   <member>

      <topicRef xlink : href=“leSucre”/>

   </member>

   <member>

      <topicRef xlink : href=“leGateau”/>

   </member>

</association>

 

Remarque : A noter qu’au lieu de <topicRef> on aurait très bien pu aussi utiliser <subjectIndicatorRef> mais la syntaxe aurait été la suivante : <subjectIndicatorRef xlink :href=“#leSucre”> (notez bien le #)

 

<roleSpec> :

 

Rôle : cette balise <roleSpec> permet de spécifier le rôle que joue une topic dans une association. Il s’agit ici d’aller plus loin que de dire qu’une topic est membre d’une association. Il faut lui associer un rôle concret.

 

Syntaxe : 

 

On va d’abord créer 2 nouvelles topics “unDessert” et “unIngredient”:

 

<topic id=”unDessert”/>

<topic id=”unIngredient”/>

 

maintenant on va par exemple préciser dans l’association entre leSucre et leGateau le fait que leSucre est un ingrédient de leGateau et que leGateau est ”unDessert”.

 

<association id=“association_Sucre_Gateau”>

   <member>

      <roleSpec>

         <topicRef xlink : href=“unIngredient”/>

      </roleSpec>

      <topicRef xlink : href=“leSucre”/>

   </member>

   <member>

      <roleSpec>

         <topicRef xlink : href=“unDessert”/>

      </roleSpec>

      <topicRef xlink : href=“leGateau”/>

   </member>

</association>

 

Ainsi on est en mesure de comprendre que dans cette association entre leSucre et leGateau, le Sucre joue le rôle d’ingrédient et le gateau le rôle d’un dessert.

 

Remarque : comme je l’ai dit plus haut, toute association est aussi quelque part un concept, donc une topic. Dans le paradigme XTM, toute association doit aussi être définie comme une topic. L’association que nous venons de voir nous permet de dire que le sucre est un ingrédiant du gateau (au chocolat). On va donc définir la topic d’association de la façon suivante :

 

<topic id=“est_un_ingredient_de”/>

 

maintenant on aimerait indiquer à la machine (ou à l’utilisateur) que l’association “association_Sucre_Gateau” est une association du type “est_un_ingredient_de”. Parce qu’on peut par exemple aussi dire que la farine est un ingrédiant du gateau. On va avoir besoin de la balise <instanceOf>

 

<instanceOf> :

 

Rôle : cette balise permet de dire qu’une certaine association ou une topic est d’un certain type (classe). Il permet de dire qu’un topic est une instance d’une classe de topic.

 

Syntaxe : 

 

On va réviser notre association d’avant :

 

<association id=“association_Sucre_Gateau”>

   <instanceOf>

      <topicRef xlink : href=“est_un_ingrediant_de”/>

   <instanceOf>

   <member>

      <roleSpec>

         <topicRef xlink : href=“unIngredient”/>

      </roleSpec>

      <topicRef xlink : href=“leSucre”/>

   </member>

   <member>

      <roleSpec>

         <topicRef xlink : href=“unDessert”/>

      </roleSpec>

      <topicRef xlink : href=“leGateau”/>

   </member>

</association>

 

Remarque : maintenant par exemple c’est super simple de rajouter les autres ingrédiants dans en remplaçant simplement le sucre par une autre topic qu’on va créer au préalable :

 

<topic id=“laFarine”/>

 

<association id=“association_farine_Gateau”>

   <instanceOf>

      <topicRef xlink : href=“est_un_ingrediant_de”/>

   <instanceOf>

   <member>

      <roleSpec>

         <topicRef xlink : href=“unIngredient”/>

      </roleSpec>

      <topicRef xlink : href=“laFarine”/>

   </member>

   <member>

      <roleSpec>

         <topicRef xlink : href=“unDessert”/>

      </roleSpec>

      <topicRef xlink : href=“leGateau”/>

   </member>

</association>

 

<mergeMap> :

 

Rôle : cette balise est très importante car elle permet de «fusionner» 2 topic-maps pour en faire une grande. Elle permettrait ainsi à plusieurs développeurs différents d’arriver à une topic-map global qui serait une forme de consensus. Par exemple imaginons 2 topic-maps ayant en commun le topic “leSucre”, par exemple une recette du gâteau au chocolat et une topic map sur le sucre en général et ses variétés. Si l’on fusionne les 2 topics maps  :

 

 

<variant>, <variantName>, <parameters>, <ressourceData> :

 

Imaginons qu’un jour nous puissions accéder à des topic maps à l’aide de nos téléphone portables. Il serait trop lourd d’afficher le base-name «gateau au chocolat». On aimerait plutôt avoir une abréviation du type «GauC».

 

Rôle : les balises <variant> et <variantName> permettent de définir des variantes d’un concept.

 

Syntaxe : 

 

<topic id=”leGateau”>

   <baseName>

      <baseNameString> gâteau au chocolat </baseNameString>

      <variant>

         <variantName>

            <ressourceData>

               GauC

            </ressourceData>

         </varianteName>

         <parameters>

            <topicRef xlink : href =”#telephonePortable”/>

         </parameters>

      </variant>

  </baseName>

</topic>

 

 

 

Date : 10.01. 2003     auteur : Mirweis SANGIN.