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.