Blog technique sur mes expériences de développeur.
23 décembre 2011
Dans le cadre des cours, j’ai été amené à réaliser des requêtes SPARQL sur une ontologie OWL. Je ne vous cache pas avoir rencontré pas mal de difficultés à faire l’exercice demandé de par le manque de ressources que j’avais à ma disposition.
L’objectif de ce billet sera donc double : donner un exemple d’ontologie OWL et donner quelques exemples de requêtes types dans une ontologie OWL afin d’aider je l’espère un certain nombre d’entre vous.
L’ontologie OWL présentée dans ce billet décrit les utilisateurs d’une plate-forme fictive de partage de photos.
Sur cette plate-forme, un utilisateur doit forcément renseigner un nombre minimum d’information comme un login, une adresse e-mail, un mot de passe ainsi que son adresse postale. Le but de cette plate-forme étant de diffuser des photos, chaque utilisateur pourra créer des albums photos dans le but de diffuser ses photos sur le site. Un album peut être visible de tous (statut public) ou peut être visible uniquement par ses amis (statut privé).
Un utilisateur peut également renseigner l’appareil photo avec lequel il travaille comme par exemple un reflex, un bridge, un hybride ou encore un compact. Pour chacun de ses appareils, l’utilisateur pourra renseigner sa marque ainsi que son objectif si celui-ci peut en recevoir un.
Notre population est composée de deux utilisateurs (en bleu foncé) étant amis. Chaque utilisateur habite à une adresse précise (en orange), située dans une ville (en jaune), elle même située dans un pays (en vert).
Chaque utilisateur possède sur la plate-forme des albums photos (en marron) contenant un certain nombre de photos (en bleu clair).
Niveau matériel, chaque utilisateur possède un appareil photo (en vert foncé) d’une certaine marque (en violet) avec éventuellement un objectif (en vert clair).
L’ontologie OWL est assez conséquente pour un exemple puisqu’elle fait tout de même 680 lignes. Cette ontologie a bien évidemment été validée sur http://www.w3.org/RDF/Validator/. J’espère que cet exemple pourra vous servir de modèle afin d’écrire vos ontologies OWL.
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE rdf:RDF [
<!ENTITY owl "http://www.w3.org/2002/07/owl#" >
<!ENTITY xsd "http://www.w3.org/2001/XMLSchema#" >
]>
<rdf:RDF
xmlns:owl = "http://www.w3.org/2002/07/owl#"
xmlns:rdf = "http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:rdfs = "http://www.w3.org/2000/01/rdf-schema#"
xmlns:xsd = "http://www.w3.org/2001/XMLSchema#"
xmlns="http://www.owl-ontologies.com/unnamed.owl#"
xml:base="http://www.owl-ontologies.com/unnamed.owl">
<owl:Ontology rdf:about="">
<rdfs:comment>Ontologie d'une plate-forme de partage de photo fictive</rdfs:comment>
<rdfs:label>Ontologie de la plate-forme fictive</rdfs:label>
</owl:Ontology>
<!-- Définition des classes -->
<owl:Class rdf:ID="Utilisateur">
<rdfs:subClassOf>
<owl:Restriction>
<owl:onProperty rdf:resource="#habiteAu" />
<owl:cardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:cardinality>
</owl:Restriction>
</rdfs:subClassOf>
<rdfs:subClassOf>
<owl:Restriction>
<owl:onProperty rdf:resource="#login" />
<owl:cardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:cardinality>
</owl:Restriction>
</rdfs:subClassOf>
<rdfs:subClassOf>
<owl:Restriction>
<owl:onProperty rdf:resource="#e-mail" />
<owl:cardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:cardinality>
</owl:Restriction>
</rdfs:subClassOf>
<rdfs:subClassOf>
<owl:Restriction>
<owl:onProperty rdf:resource="#password" />
<owl:cardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:cardinality>
</owl:Restriction>
</rdfs:subClassOf>
</owl:Class>
<owl:Class rdf:ID="Album">
<rdfs:subClassOf>
<owl:Restriction>
<owl:onProperty rdf:resource="#appartientA" />
<owl:cardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:cardinality>
</owl:Restriction>
</rdfs:subClassOf>
<rdfs:subClassOf>
<owl:Restriction>
<owl:onProperty rdf:resource="#nomAlbum" />
<owl:cardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:cardinality>
</owl:Restriction>
</rdfs:subClassOf>
<rdfs:subClassOf>
<owl:Restriction>
<owl:onProperty rdf:resource="#date" />
<owl:cardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:cardinality>
</owl:Restriction>
</rdfs:subClassOf>
<rdfs:subClassOf>
<owl:Restriction>
<owl:onProperty rdf:resource="#prive" />
<owl:cardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:cardinality>
</owl:Restriction>
</rdfs:subClassOf>
</owl:Class>
<owl:Class rdf:ID="Photo">
<rdfs:subClassOf>
<owl:Restriction>
<owl:onProperty rdf:resource="#estDansLalbum" />
<owl:cardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:cardinality>
</owl:Restriction>
</rdfs:subClassOf>
<rdfs:subClassOf>
<owl:Restriction>
<owl:onProperty rdf:resource="#nomPhoto" />
<owl:cardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:cardinality>
</owl:Restriction>
</rdfs:subClassOf>
<rdfs:subClassOf>
<owl:Restriction>
<owl:onProperty rdf:resource="#commentaire" />
<owl:cardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:cardinality>
</owl:Restriction>
</rdfs:subClassOf>
</owl:Class>
<owl:Class rdf:ID="Adresse">
<rdfs:subClassOf>
<owl:Restriction>
<owl:onProperty rdf:resource="#estDansLaVille" />
<owl:cardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:cardinality>
</owl:Restriction>
</rdfs:subClassOf>
<rdfs:subClassOf>
<owl:Restriction>
<owl:onProperty rdf:resource="#numero" />
<owl:cardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:cardinality>
</owl:Restriction>
</rdfs:subClassOf>
<rdfs:subClassOf>
<owl:Restriction>
<owl:onProperty rdf:resource="#rue" />
<owl:cardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:cardinality>
</owl:Restriction>
</rdfs:subClassOf>
</owl:Class>
<owl:Class rdf:ID="Ville">
<rdfs:subClassOf>
<owl:Restriction>
<owl:onProperty rdf:resource="#estDansLePays" />
<owl:cardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:cardinality>
</owl:Restriction>
</rdfs:subClassOf>
<rdfs:subClassOf>
<owl:Restriction>
<owl:onProperty rdf:resource="#nomVille" />
<owl:cardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:cardinality>
</owl:Restriction>
</rdfs:subClassOf>
<rdfs:subClassOf>
<owl:Restriction>
<owl:onProperty rdf:resource="#codePostale" />
<owl:cardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:cardinality>
</owl:Restriction>
</rdfs:subClassOf>
</owl:Class>
<owl:Class rdf:ID="Pays">
<rdfs:subClassOf>
<owl:Restriction>
<owl:onProperty rdf:resource="#nomPays" />
<owl:cardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:cardinality>
</owl:Restriction>
</rdfs:subClassOf>
<rdfs:subClassOf>
<owl:Restriction>
<owl:onProperty rdf:resource="#diminutif" />
<owl:cardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:cardinality>
</owl:Restriction>
</rdfs:subClassOf>
</owl:Class>
<owl:Class rdf:ID="Appareil">
<rdfs:subClassOf>
<owl:Restriction>
<owl:onProperty rdf:resource="#estDeLaMarqueApp" />
<owl:cardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:cardinality>
</owl:Restriction>
</rdfs:subClassOf>
<rdfs:subClassOf>
<owl:Restriction>
<owl:onProperty rdf:resource="#aPourProprietaire" />
<owl:cardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:cardinality>
</owl:Restriction>
</rdfs:subClassOf>
<rdfs:subClassOf>
<owl:Restriction>
<owl:onProperty rdf:resource="#reference" />
<owl:cardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:cardinality>
</owl:Restriction>
</rdfs:subClassOf>
<rdfs:subClassOf>
<owl:Restriction>
<owl:onProperty rdf:resource="#resolution" />
<owl:cardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:cardinality>
</owl:Restriction>
</rdfs:subClassOf>
<rdfs:subClassOf>
<owl:Restriction>
<owl:onProperty rdf:resource="#video" />
<owl:cardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:cardinality>
</owl:Restriction>
</rdfs:subClassOf>
<rdfs:subClassOf>
<owl:Restriction>
<owl:onProperty rdf:resource="#autonomie" />
<owl:cardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:cardinality>
</owl:Restriction>
</rdfs:subClassOf>
</owl:Class>
<owl:Class rdf:ID="Reflex">
<rdfs:subClassOf rdf:resource="#Appareil" />
<rdfs:subClassOf>
<owl:Restriction>
<owl:onProperty rdf:resource="#aPourObjectifR" />
<owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:minCardinality>
</owl:Restriction>
</rdfs:subClassOf>
<rdfs:subClassOf>
<owl:Restriction>
<owl:onProperty rdf:resource="#tropicalise" />
<owl:cardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:cardinality>
</owl:Restriction>
</rdfs:subClassOf>
<rdfs:subClassOf>
<owl:Restriction>
<owl:onProperty rdf:resource="#vitesseMax" />
<owl:cardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:cardinality>
</owl:Restriction>
</rdfs:subClassOf>
<rdfs:subClassOf>
<owl:Restriction>
<owl:onProperty rdf:resource="#pro" />
<owl:cardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:cardinality>
</owl:Restriction>
</rdfs:subClassOf>
</owl:Class>
<owl:Class rdf:ID="Bridge">
<rdfs:subClassOf rdf:resource="#Appareil" />
<rdfs:subClassOf>
<owl:Restriction>
<owl:onProperty rdf:resource="#objectif" />
<owl:cardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:cardinality>
</owl:Restriction>
</rdfs:subClassOf>
</owl:Class>
<owl:Class rdf:ID="Hybride">
<rdfs:subClassOf rdf:resource="#Appareil" />
<rdfs:subClassOf>
<owl:Restriction>
<owl:onProperty rdf:resource="#aPourObjectifH" />
<owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:minCardinality>
</owl:Restriction>
</rdfs:subClassOf>
<rdfs:subClassOf>
<owl:Restriction>
<owl:onProperty rdf:resource="#stabilisateur" />
<owl:cardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:cardinality>
</owl:Restriction>
</rdfs:subClassOf>
</owl:Class>
<owl:Class rdf:ID="Compact">
<rdfs:subClassOf rdf:resource="#Appareil" />
<rdfs:subClassOf>
<owl:Restriction>
<owl:onProperty rdf:resource="#zoom" />
<owl:cardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:cardinality>
</owl:Restriction>
</rdfs:subClassOf>
</owl:Class>
<owl:Class rdf:ID="Objectif">
<rdfs:subClassOf>
<owl:Restriction>
<owl:onProperty rdf:resource="#estDeLaMarqueOb" />
<owl:cardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:cardinality>
</owl:Restriction>
</rdfs:subClassOf>
<rdfs:subClassOf>
<owl:Restriction>
<owl:onProperty rdf:resource="#ouverture" />
<owl:cardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:cardinality>
</owl:Restriction>
</rdfs:subClassOf>
<rdfs:subClassOf>
<owl:Restriction>
<owl:onProperty rdf:resource="#focal" />
<owl:cardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:cardinality>
</owl:Restriction>
</rdfs:subClassOf>
<rdfs:subClassOf>
<owl:Restriction>
<owl:onProperty rdf:resource="#stabilisateurObj" />
<owl:cardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:cardinality>
</owl:Restriction>
</rdfs:subClassOf>
</owl:Class>
<owl:Class rdf:ID="Marque">
<rdfs:subClassOf>
<owl:Restriction>
<owl:onProperty rdf:resource="#nomMarque" />
<owl:cardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:cardinality>
</owl:Restriction>
</rdfs:subClassOf>
</owl:Class>
<!-- Définition des Propriétés -->
<!-- Utilisateur -->
<owl:ObjectProperty rdf:ID="estLamiDe">
<rdf:type rdf:resource="&owl;SymmetricProperty" />
<rdfs:domain rdf:resource="#Utilisateur" />
<rdfs:range rdf:resource="#Utilisateur" />
</owl:ObjectProperty>
<owl:ObjectProperty rdf:ID="habiteAu">
<rdfs:domain rdf:resource="#Utilisateur" />
<rdfs:range rdf:resource="#Adresse" />
</owl:ObjectProperty>
<!-- Adresse -->
<owl:ObjectProperty rdf:ID="estDansLaVille">
<rdfs:domain rdf:resource="#Adresse" />
<rdfs:range rdf:resource="#Ville" />
</owl:ObjectProperty>
<!-- Ville -->
<owl:ObjectProperty rdf:ID="estDansLePays">
<rdfs:domain rdf:resource="#Ville" />
<rdfs:range rdf:resource="#Pays" />
</owl:ObjectProperty>
<!-- Album -->
<owl:ObjectProperty rdf:ID="appartientA">
<rdfs:domain rdf:resource="#Album" />
<rdfs:range rdf:resource="#Utilisateur" />
</owl:ObjectProperty>
<!-- Photo -->
<owl:ObjectProperty rdf:ID="estDansLalbum">
<rdfs:domain rdf:resource="#Photo" />
<rdfs:range rdf:resource="#Album" />
</owl:ObjectProperty>
<!-- Appareil -->
<owl:ObjectProperty rdf:ID="estPropriétaireDe">
<rdfs:domain rdf:resource="#Appareil" />
<rdfs:range rdf:resource="#Utilisateur" />
</owl:ObjectProperty>
<owl:ObjectProperty rdf:ID="estDeLaMarqueApp">
<rdfs:domain rdf:resource="#Appareil" />
<rdfs:range rdf:resource="#Marque" />
</owl:ObjectProperty>
<!-- Objectif -->
<owl:ObjectProperty rdf:ID="estDeLaMarqueOb">
<rdfs:domain rdf:resource="#Objectif" />
<rdfs:range rdf:resource="#Marque" />
</owl:ObjectProperty>
<!-- Reflex -->
<owl:ObjectProperty rdf:ID="aPourObjectifR">
<rdfs:domain rdf:resource="#Reflex" />
<rdfs:range rdf:resource="#Objectif" />
</owl:ObjectProperty>
<!-- Bridge -->
<owl:ObjectProperty rdf:ID="aPourObjectifB">
<rdfs:domain rdf:resource="#Bridge" />
<rdfs:range rdf:resource="#Objectif" />
</owl:ObjectProperty>
<!-- Hybride -->
<owl:ObjectProperty rdf:ID="aPourObjectifH">
<rdfs:domain rdf:resource="#hybride" />
<rdfs:range rdf:resource="#Objectif" />
</owl:ObjectProperty>
<!-- Définition des données -->
<!-- Classe Utilisateur -->
<owl:DataTypeProperty rdf:ID="login">
<rdfs:domain rdf:resource="#Utilisateur" />
<rdfs:range rdf:resource="&xsd;string" />
</owl:DataTypeProperty>
<owl:DataTypeProperty rdf:ID="e-mail">
<rdfs:domain rdf:resource="#Utilisateur" />
<rdfs:range rdf:resource="&xsd;string" />
</owl:DataTypeProperty>
<owl:DataTypeProperty rdf:ID="password">
<rdfs:domain rdf:resource="#Utilisateur" />
<rdfs:range rdf:resource="&xsd;string" />
</owl:DataTypeProperty>
<!-- Classe Album -->
<owl:DataTypeProperty rdf:ID="nomAlbum">
<rdfs:domain rdf:resource="#Album" />
<rdfs:range rdf:resource="&xsd;string" />
</owl:DataTypeProperty>
<owl:DataTypeProperty rdf:ID="date">
<rdfs:domain rdf:resource="#Album" />
<rdfs:range rdf:resource="&xsd;date" />
</owl:DataTypeProperty>
<owl:DataTypeProperty rdf:ID="prive">
<rdfs:domain rdf:resource="#Album" />
<rdfs:range rdf:resource="&xsd;boolean" />
</owl:DataTypeProperty>
<!-- Classe Photo -->
<owl:DataTypeProperty rdf:ID="nomPhoto">
<rdfs:domain rdf:resource="#Photo" />
<rdfs:range rdf:resource="&xsd;string" />
</owl:DataTypeProperty>
<owl:DataTypeProperty rdf:ID="commentaire">
<rdfs:domain rdf:resource="#Photo" />
<rdfs:range rdf:resource="&xsd;string" />
</owl:DataTypeProperty>
<!-- Classe Adresse -->
<owl:DataTypeProperty rdf:ID="numero">
<rdfs:domain rdf:resource="#Adresse" />
<rdfs:range rdf:resource="&xsd;string" />
</owl:DataTypeProperty>
<owl:DataTypeProperty rdf:ID="rue">
<rdfs:domain rdf:resource="#Adresse" />
<rdfs:range rdf:resource="&xsd;string" />
</owl:DataTypeProperty>
<!-- Classe Ville -->
<owl:DataTypeProperty rdf:ID="nomVille">
<rdfs:domain rdf:resource="#Ville" />
<rdfs:range rdf:resource="&xsd;string" />
</owl:DataTypeProperty>
<owl:DataTypeProperty rdf:ID="codePostale">
<rdfs:domain rdf:resource="#Ville" />
<rdfs:range rdf:resource="&xsd;integer" />
</owl:DataTypeProperty>
<!-- Classe Pays -->
<owl:DataTypeProperty rdf:ID="nomPays">
<rdfs:domain rdf:resource="#Pays" />
<rdfs:range rdf:resource="&xsd;string" />
</owl:DataTypeProperty>
<owl:DataTypeProperty rdf:ID="diminutif">
<rdfs:domain rdf:resource="#Pays" />
<rdfs:range rdf:resource="&xsd;string" />
</owl:DataTypeProperty>
<!-- Classe Appareil -->
<owl:DataTypeProperty rdf:ID="reference">
<rdfs:domain rdf:resource="#Appareil" />
<rdfs:range rdf:resource="&xsd;string" />
</owl:DataTypeProperty>
<owl:DataTypeProperty rdf:ID="resolution">
<rdfs:domain rdf:resource="#Appareil" />
<rdfs:range rdf:resource="&xsd;integer" />
</owl:DataTypeProperty>
<owl:DataTypeProperty rdf:ID="video">
<rdfs:domain rdf:resource="#Appareil" />
<rdfs:range rdf:resource="&xsd;boolean" />
</owl:DataTypeProperty>
<owl:DataTypeProperty rdf:ID="autonomie">
<rdfs:domain rdf:resource="#Appareil" />
<rdfs:range rdf:resource="&xsd;integer" />
</owl:DataTypeProperty>
<!-- Classe Reflex -->
<owl:DataTypeProperty rdf:ID="tropicalise">
<rdfs:domain rdf:resource="#Reflex" />
<rdfs:range rdf:resource="&xsd;boolean" />
</owl:DataTypeProperty>
<owl:DataTypeProperty rdf:ID="vitesseMax">
<rdfs:domain rdf:resource="#Reflex" />
<rdfs:range rdf:resource="&xsd;string" />
</owl:DataTypeProperty>
<owl:DataTypeProperty rdf:ID="pro">
<rdfs:domain rdf:resource="#Reflex" />
<rdfs:range rdf:resource="&xsd;boolean" />
</owl:DataTypeProperty>
<!-- Classe Bridge -->
<owl:DataTypeProperty rdf:ID="objectif">
<rdfs:domain rdf:resource="#Bridge" />
<rdfs:range rdf:resource="&xsd;boolean" />
</owl:DataTypeProperty>
<!-- Classe Hybride -->
<owl:DataTypeProperty rdf:ID="stabilisateur">
<rdfs:domain rdf:resource="#Hybride" />
<rdfs:range rdf:resource="&xsd;boolean" />
</owl:DataTypeProperty>
<!-- Classe Compact -->
<owl:DataTypeProperty rdf:ID="zoom">
<rdfs:domain rdf:resource="#Compact" />
<rdfs:range rdf:resource="&xsd;integer" />
</owl:DataTypeProperty>
<!-- Classe Marque -->
<owl:DataTypeProperty rdf:ID="nomMarque">
<rdfs:domain rdf:resource="#Marque" />
<rdfs:range rdf:resource="&xsd;string" />
</owl:DataTypeProperty>
<!-- Classe Objectif -->
<owl:DataTypeProperty rdf:ID="ouverture">
<rdfs:domain rdf:resource="#Objectif" />
<rdfs:range rdf:resource="&xsd;float" />
</owl:DataTypeProperty>
<owl:DataTypeProperty rdf:ID="focal">
<rdfs:domain rdf:resource="#Objectif" />
<rdfs:range rdf:resource="&xsd;string" />
</owl:DataTypeProperty>
<owl:DataTypeProperty rdf:ID="stabilisateurObj">
<rdfs:domain rdf:resource="#Objectif" />
<rdfs:range rdf:resource="&xsd;boolean" />
</owl:DataTypeProperty>
<!-- Insertion des données -->
<!-- Utilisateur -->
<Utilisateur rdf:ID="Rolandl">
<login>rolandl</login>
<e-mail>def@email.fr</e-mail>
<password>OWL13</password>
<habiteAu rdf:resource="#MaisonRolandl" />
<estLamiDe rdf:resource="#Lanquett" />
</Utilisateur>
<Utilisateur rdf:ID="Lanquett">
<login>lanquett</login>
<e-mail>abc@email.fr</e-mail>
<password>13B56</password>
<habiteAu rdf:resource="#MaisonLanquett" />
<estLamiDe rdf:resource="#Rolandl" />
</Utilisateur>
<!-- Adresse -->
<Adresse rdf:ID="MaisonRolandl">
<numero>9</numero>
<rue>Pierre Hugo</rue>
<estDansLaVille rdf:resource="#Clamart" />
</Adresse>
<Adresse rdf:ID="MaisonLanquett">
<numero>72</numero>
<rue>Ste Colombe</rue>
<estDansLaVille rdf:resource="#Villejuif" />
</Adresse>
<!-- Villes -->
<Ville rdf:ID="Clamart">
<nomVille>Clamart</nomVille>
<codePostale>92140</codePostale>
<estDansLePays rdf:resource="#France" />
</Ville>
<Ville rdf:ID="Villejuif">
<nomVille>Villejuif</nomVille>
<codePostale>94800</codePostale>
<estDansLePays rdf:resource="#France" />
</Ville>
<!-- Pays -->
<Pays rdf:ID="France">
<nomPays>France</nomPays>
<diminutif>FR</diminutif>
</Pays>
<!-- Album -->
<Album rdf:ID="VacancesUSA">
<nomAlbum>Vacances USA</nomAlbum>
<date>17/06/1999</date>
<prive>0</prive>
<appartientA rdf:resource="#Rolandl" />
</Album>
<Album rdf:ID="VacancesSki">
<nomAlbum>Vacances Ski</nomAlbum>
<date>25/02/1999</date>
<prive>1</prive>
<appartientA rdf:resource="#Lanquett" />
</Album>
<Album rdf:ID="Concert">
<nomAlbum>Concert</nomAlbum>
<date>28/03/1998</date>
<prive>1</prive>
<appartientA rdf:resource="#Rolandl" />
</Album>
<!-- Photo -->
<Photo rdf:ID="USA_1">
<nomPhoto>USA(1).jpg</nomPhoto>
<commentaire>Stylé !</commentaire>
<estDansLalbum rdf:resource="#VacancesUSA" />
</Photo>
<Photo rdf:ID="USA_2">
<nomPhoto>USA(2).jpg</nomPhoto>
<commentaire>-</commentaire>
<estDansLalbum rdf:resource="#VacancesUSA" />
</Photo>
<Photo rdf:ID="Ski_1">
<nomPhoto>Ski(1).jpg</nomPhoto>
<commentaire>MDR !</commentaire>
<estDansLalbum rdf:resource="#VacancesSKI" />
</Photo>
<Photo rdf:ID="Ski_2">
<nomPhoto>Ski(2).jpg</nomPhoto>
<commentaire>Romain</commentaire>
<estDansLalbum rdf:resource="#VacancesSKI" />
</Photo>
<Photo rdf:ID="Ski_3">
<nomPhoto>Ski(3).jpg</nomPhoto>
<commentaire>-</commentaire>
<estDansLalbum rdf:resource="#VacancesSKI" />
</Photo>
<Photo rdf:ID="Concert_1">
<nomPhoto>Concert(1).jpg</nomPhoto>
<commentaire>ahah !</commentaire>
<estDansLalbum rdf:resource="#Concert" />
</Photo>
<Photo rdf:ID="Concert_2">
<nomPhoto>Concert(2).jpg</nomPhoto>
<commentaire>-</commentaire>
<estDansLalbum rdf:resource="#Concert" />
</Photo>
<Photo rdf:ID="Concert_3">
<nomPhoto>Concert(3).jpg</nomPhoto>
<commentaire>-</commentaire>
<estDansLalbum rdf:resource="#Concert" />
</Photo>
<!-- Appareil -->
<Compact rdf:ID="AppareilRolandl">
<reference>IXUS 105</reference>
<resolution>12</resolution>
<video>1</video>
<autonomie>60</autonomie>
<zoom>32</zoom>
<aPourPropietaire rdf:resource="#Rolandl" />
<estDeLaMarqueApp rdf:resource="#Canon" />
</Compact>
<Reflex rdf:ID="AppareilLanquett">
<reference>K7</reference>
<resolution>14</resolution>
<video>1</video>
<autonomie>90</autonomie>
<tropicalise>1</tropicalise>
<vitesseMax>1/8000</vitesseMax>
<pro>0</pro>
<aPourPropietaire rdf:resource="#Lanquett" />
<estDeLaMarqueApp rdf:resource="#Pentax" />
<aPourObjectifR rdf:resource="#ObjectifLanquett" />
</Reflex>
<!-- Objectif -->
<Objectif rdf:ID="ObjectifLanquett">
<ouverture>3.5</ouverture>
<focal>18-250</focal>
<stabilisateurObj>0</stabilisateurObj>
<estDeLaMarqueOb rdf:resource="#Pentax" />
</Objectif>
<!-- Marque -->
<Marque rdf:ID="Canon">
<nomMarque>Canon</nomMarque>
</Marque>
<Marque rdf:ID="Pentax">
<nomMarque>Pentax</nomMarque>
</Marque>
</rdf:RDF>
Voyons maintenant quelques exemples de requêtes SPARQL qui me semblent intéressantes et qui, je pense sont de bonnes bases pour comprendre ce langage.
Avant de commencer, voici un petit récapitulatif des préfixes utilisés.
PREFIX ns: <http://www.owl-ontologies.com/unnamed.owl#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX tg: <http://www.turnguard.com/functions#>
Requête
SELECT ?x ?password
WHERE {
?x ns:login "rolandl" .
?x ns:password ?password .
}
Résultat
x | password |
---|---|
ns:Rolandl | “OWL13” |
Requête
SELECT ?x ?estLamiDe
WHERE {
?x ns:login "rolandl" .
?x ns:estLamiDe ?estLamiDe .
}
Résultat
x | estLamiDe |
---|---|
ns:Rolandl | ns:Lanquett |
Requête
SELECT ?appareil ?subClass
WHERE {
?subClass rdfs:subClassOf ns:Appareil .
?appareil rdf:type ?subClass .
}
Résultat
appareil | subClass |
---|---|
ns:AppareilRolandl | ns:Compact |
ns:AppareilLanquett | ns:Reflex |
Requête
SELECT ?appareil ?autonomie
WHERE {
?appareil a ns:Reflex .
?appareil ns:autonomie ?autonomie .
}
appareil | autonomie |
---|---|
ns:AppareilLanquett | “90” |
Voilà, c’est la fin du billet, j’espère que cet exemple vous sera utile ! J’avoue avoir passé sous silence les conditions en SPARQL, mais je vous rassure, elles sont assez simples à utiliser. Pour plus de détails, vous pouvez notamment consulter cette documentation.