Ludovic ROLAND

Blog technique sur mes expériences de développeur.

Des requêtes SPARQL sur une ontologie OWL

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.

La population étudiée

L’ontologie OWL présentée dans ce billet décrit les utilisateurs d’une plate-forme fictive de partage de photos.

Le diagramme de classe

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.

Présentation de la population

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

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>

Les requêtes SPARQL

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: &lt;http://www.owl-ontologies.com/unnamed.owl#&gt;
PREFIX rdf: &lt;http://www.w3.org/1999/02/22-rdf-syntax-ns#&gt;
PREFIX rdfs: &lt;http://www.w3.org/2000/01/rdf-schema#&gt;
PREFIX owl: &lt;http://www.w3.org/2002/07/owl#&gt;
PREFIX xsd: &lt;http://www.w3.org/2001/XMLSchema#&gt;
PREFIX tg: &lt;http://www.turnguard.com/functions#&gt;

1. Quel est le mot de passe de l’utilisateur rolandl ?</strong>

Requête

SELECT ?x ?password
WHERE {
	?x ns:login "rolandl" .
	?x ns:password ?password .
}

Résultat

x password
ns:Rolandl “OWL13”

2. Quel sont les amis de rolandl ?</strong>

Requête

SELECT ?x ?estLamiDe
WHERE {
    ?x ns:login "rolandl" .
    ?x ns:estLamiDe ?estLamiDe .
}

Résultat

x estLamiDe
ns:Rolandl ns:Lanquett

3. Quels sont tous les appareils photos et de quels types sont-ils ?</strong>

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

4. La liste des réflex avec leur autonomie.</strong>

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.

Commentaires