
Ontopy : programmation orient´ee ontologie en Python
Relier cette contre-indication aux maladies h´emorragiques acquises est un peu plus com-
pliqu´e, car il s’agit d’une classe et non d’une instance. Pour cela nous modifions les attri-
buts is_a de la classe Maladie_h´emorragique_acquise et de l’instance ci1. L’attribut
is_a d’une instance fonctionne de mani`ere similaire `a celui d’une classe, mais contient les
classes auxquels appartient l’instance. Ci-dessous, nous sp´ecifions que la contre-indication
est reli´ee seulement `a des maladies h´emorragiques acquises, et que la classe des maladies
h´emorragiques acquises est reli´ee `a notre contre-indication.
ci1.is_a.append(
onto_ci.a_pour_condition_clinique(ONLY, Maladie_h´emorragique_acquise) )
Maladie_h´emorragique_acquise.is_a.append(
onto_ci.est_condition_clinique_de(VALUE, ci1) )
Cr´eons ensuite la classe d´efinie des conditions cliniques contre-indiqu´ees avec l’aspirine.
class Condition_CI_avec_aspirine(onto_ci.Condition_clinique):
equivalent_to = [ onto_ci.Condition_clinique
& onto_ci.est_condition_clinique_de(SOME, onto_ci.Contre_indication
& onto_ci.est_contre_indication_de(VALUE, aspirine) ) ]
Ontopy permet aussi l’ajout de m´ethodes Python aux classes OWL, en red´efinissant les
classes dans un module Python. Ce module peut ˆetre li´e `a l’ontologie via une annota-
tion, de sorte `a ˆetre charg´e automatiquement avec l’ontologie. L’exemple suivant ajoute
une m´ethode teste_ci `a la classe M´edicament. Elle prend en param`etre une classe de
condition clinique et retourne une chaˆıne de caract`eres. La m´ethode r´ecup`ere la classe des
conditions cliniques contre-indiqu´ees avec le m´edicament, en se basant sur son nom, et
teste si la condition clinique est une classe fille avec l’op´erateur issubclass de Python.
Puis nous lan¸cons le raisonneur et nous affichons les r´esultats.
class M´edicament(Thing):
def teste_ci(self, Condition):
Condition_CI = onto_ci["Condition_CI_avec_" + self.name]
if issubclass(Condition, Condition_CI): return "CI"
[...] # XXX tester si le m´edicament est OK
onto_ci.sync_reasoner() # Lance HermiT et effectue la classification
print(aspirine.teste_ci(Maladie_h´emorragique)) # => "CI"
5 Discussion et conclusion
La programmation orient´ee ontologie n’est pas une id´ee nouvelle et le W3C a d´ej`a
sugg´er´e l’int´egration de m´ethodes dans des classes OWL (Knublauch et al., 2006). Des
approches statiques ont ´et´e propos´ees (Kalyanpur et al., 2004; Goldman NM, 2003), qui
g´en`erent le code source de classes Java ou C# correspondant `a une ontologie en OWL. Ces
approches permettent d’acc´eder `a l’ontologie et de v´erifier le typage `a la compilation, mais
leur nature statique n’est pas adapt´ee `a la classification automatique. Plus r´ecemment,
une approche semi-dynamique en Java (Stevenson & Dobson, 2011) a permis la classifica-
tion des instances mais pas celle des classes. Une approche dynamique a ´et´e propos´ee en
Common Lisp (Koide et al., 2005), en utilisant un algorithme de subsomption sp´ecifique
pour l’inf´erence et non un raisonneur externe. Un prototype en Python a aussi ´et´e r´ealis´e
(Babik & Hluchy, 2006), mais ne va pas jusqu’`a une syntaxe “enti`erement Python” pour