Personal tools
You are here: Home Ressources Version fonctionnelle d'inférence sur une ontologie
Document Actions

Version fonctionnelle d'inférence sur une ontologie

by François Rioult last modified 2008-11-06 16:44

OWL

Exemple d'inférence multi-modale :
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE rdf:RDF [
<!ENTITY inference "http://users.info.unicaen.fr/~frioult/ontologie/inference.owl#">
<!ENTITY owl "http://www.w3.org/2002/07/owl#">
<!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<!ENTITY rdfs "http://www.w3.org/2000/01/rdf-schema#">
<!ENTITY xsd "http://www.w3.org/2001/XMLSchema#">
]>
<rdf:RDF xml:base="http://users.info.unicaen.fr/~frioult/ontologie/inference.owl"
xmlns:inference="&inference;"
xmlns:owl="&owl;"
xmlns:rdf="&rdf;"
xmlns:rdfs="&rdfs;">

<!-- Ontology Information -->
<owl:Ontology rdf:about="">
<rdfs:comment rdf:datatype="&xsd;string">tests d'inférence :
1. inférence sur le type d'une instance à partir d'une propriété d'objet
- une classe Hero et une sous-classe HeroWithItem
- une classe Item
- une propriété carries
- deux héros, un itemEntitie
- la class HeroWithItem est équivalente à carries some Item
- si l'un des héros carries itemEntitie, son type est inféré comme HeroWithItem

2. inférence d'un type à partir d'une propriété de donnée
- une propriété de donnée "stat", domaine Hero, range int
- une classe HeroWithStat, équivalente à "stat some int"
- on ajoute une propriété stat à un héro, par exemple 100 -> classé dans HeroWithStat

3. inférence d'une propriété d'objet
- on déclare la classe HeroWithEntitie
- équivalente à carries has ItemEntitie
- toute instance de HeroWithEntitie a automatiquement la propriété carries ItemEntitie

Remarquer la classification effectuée :
- HeroWithItem (carries some ItemClass) est devenue superclasse de HeroWithEntitie (carries value ItemEntitie), car ItemEntitie est dans la classe ItemClass.</rdfs:comment>
</owl:Ontology>

<!-- Classes -->
<owl:Class rdf:about="#Hero"/>
<owl:Class rdf:about="#HeroAvec2Item">
<rdfs:subClassOf rdf:resource="#Hero"/>
</owl:Class>

<owl:Class rdf:about="#HeroAvecItem">
<rdfs:subClassOf rdf:resource="#Hero"/>
<owl:equivalentClass>
<owl:Restriction>
<owl:onProperty rdf:resource="#carries"/>
<owl:someValuesFrom rdf:resource="#ItemClass"/>
</owl:Restriction>
</owl:equivalentClass>
</owl:Class>

<owl:Class rdf:about="#HeroSansItem">
<rdfs:subClassOf rdf:resource="#Hero"/>
</owl:Class>

<owl:Class rdf:about="#HeroWithEntite">
<rdfs:subClassOf rdf:resource="#Hero"/>
<owl:equivalentClass>
<owl:Restriction>
<owl:hasValue rdf:resource="#ItemEntitie"/>
<owl:onProperty rdf:resource="#carries"/>
</owl:Restriction>
</owl:equivalentClass>
</owl:Class>

<owl:Class rdf:about="#HeroWithStat">
<rdfs:subClassOf rdf:resource="#Hero"/>
<owl:equivalentClass>
<owl:Restriction>
<owl:onProperty rdf:resource="#stat"/>
<owl:someValuesFrom rdf:resource="&xsd;int"/>
</owl:Restriction>
</owl:equivalentClass>
</owl:Class>

<owl:Class rdf:about="#ItemClass"/>

<!-- Datatypes -->
<rdfs:Datatype rdf:about="&xsd;int"/>

<!-- Annotation Properties -->
<owl:AnnotationProperty rdf:about="&rdfs;comment"/>

<!-- Datatype Properties -->
<owl:DatatypeProperty rdf:about="#stat">
<rdfs:domain rdf:resource="#Hero"/>
<rdfs:range rdf:resource="&xsd;int"/>
</owl:DatatypeProperty>

<!-- Object Properties -->
<owl:ObjectProperty rdf:about="#carries">
<rdfs:domain rdf:resource="#Hero"/>
<rdfs:range rdf:resource="#ItemClass"/>
</owl:ObjectProperty>

<!-- Instances -->
<inference:HeroWithEntite rdf:about="#HeroWithEntite_5"/>
<inference:ItemClass rdf:about="#ItemEntitie"/>
<inference:ItemClass rdf:about="#ItemEntitie2"/>
<inference:Hero rdf:about="#hero1">
<inference:carries rdf:resource="#ItemEntitie"/>
</inference:Hero>

<inference:Hero rdf:about="#hero2">
<inference:carries rdf:resource="#ItemEntitie2"/>
<inference:stat rdf:datatype="&xsd;int">150</inference:stat>
</inference:Hero>

<owl:AllDifferent>
<owl:distinctMembers rdf:parseType="Collection">
<rdf:Description rdf:about="#ItemEntitie"/>
<rdf:Description rdf:about="#hero1"/>
<rdf:Description rdf:about="#hero2"/>
</owl:distinctMembers>
</owl:AllDifferent>
</rdf:RDF>

Classification par Pellet-1.5.2]

En ligne de commande, le résultat est vraiment pourri. Peut-être éditer le source pour une sortie OWL...
./pellet.sh -r -c RDF -if inference.owl -cout inference.out -qf query.rq -html
On peut éditer src/src/org/mindswap/pellet/Pellet.java, ant build produit le résultat dans dist, à appeler depuis dist.

SPARQL

Pellet en ligne de commande n'effectue que la classification (calcule les relations entre classes) et la réalisation (placer les instances dans les bonnes classes). C'est déjà énorme... Mais il ne fournit pas les propriétés. Il faut donc effectuer des requêtes pour les obtenir.
Ne pas oublier de déclarer les préfixes !
Query: 
PREFIX inference: <http://users.info.unicaen.fr/~frioult/ontologie/inference.owl#>

SELECT *
WHERE {
?subject inference:carries ?object .
}
-----------------------------------------------------
Query Results (3 answers):
subject | object
===================================================
inference:hero1 | inference:ItemEntitie
inference:HeroWithEntite_5 | inference:ItemEntitie
inference:hero2 | inference:ItemEntitie2
Le résultat de la requête utilise la classification et la réalisation : HeroWithEntite_5 carries ItemEntitie, car il est asserté dans la classe HeroWithEntitie, équivalente à carries has ItemEntitie.
Query: 
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX inference: <http://users.info.unicaen.fr/~frioult/ontologie/inference.owl#>

SELECT *
WHERE {
?subject rdf:type inference:HeroAvecItem .
}
-----------------------------------------------------
Query Results (3 answers):
subject
==========================
inference:hero1
inference:HeroWithEntite_5
inference:hero2

« June 2011 »
Su Mo Tu We Th Fr Sa
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
 

Powered by Plone, the Open Source Content Management System

This site conforms to the following standards: