RDF et SPARQL Travaux Pratiques

Inria

Initiation au Web sémantique avec les graphes RDF et le langage SPARQL.

L'original de ce TP (CoreseTutorial) a été conçu par Fabien Gandon.
BD de Triplets

Prérequis

  • Connaître XML et les DTD
  • Comprendre les espaces de nommage XML

Cours

  • RDF / SPARQL

Ontologies RDFS/XML

A partir de cette ontologie en RDFS :

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE rdf [
   <!ENTITY humans   "http://www.inria.fr/2007/09/11/humans.rdfs"> 
   <!ENTITY rdfs     "http://www.w3.org/2000/01/rdf-schema">
    ]>

<rdf:RDF  
   xmlns:rdf ="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:rdfs="&rdfs;#"
   xmlns     ="&rdfs;#" 
   xml:base  ="&humans;" >

<Class rdf:ID="Animal">
  <label xml:lang="en">animal</label>
  <comment xml:lang="en">a living organism characterized by voluntary movement.</comment>
  <label xml:lang="fr">animal</label>
  <comment xml:lang="fr">être vivant doué de sensibilite de mobilité.</comment>
</Class>

<Class rdf:ID="Male">
  <subClassOf rdf:resource="#Animal"/>
  <label xml:lang="en">male</label>
  <comment xml:lang="en">an animal that produces gametes (spermatozoa) that can fertilize female gametes (ova).</comment>
  <label xml:lang="fr">mâle</label>
  <comment xml:lang="fr">individu appartenant au sexe qui possède le pouvoir de fécondation.</comment>
</Class>

<Class rdf:ID="Female">
  <subClassOf rdf:resource="#Animal"/>
  <label xml:lang="en">female</label>
  <comment xml:lang="en"> an animal that produces gametes (ova) that can be fertilized by male gametes (spermatozoa).</comment>
  <label xml:lang="fr">femelle</label>
  <comment xml:lang="fr">animal appartenant au sexe apte à produire des ovules.</comment>
</Class>

<Class rdf:ID="Man">
  <subClassOf rdf:resource="#Person"/>
  <subClassOf rdf:resource="#Male"/>
  <label xml:lang="en">man</label>
  <comment xml:lang="en">an adult male person</comment>
  <label xml:lang="fr">homme</label>
  <comment xml:lang="fr">mâle adulte de l'espèce humaine.</comment>
</Class>

<Class rdf:ID="Person">
  <subClassOf rdf:resource="#Animal"/>
  <label xml:lang="en">person</label>
  <label xml:lang="en">human being</label>
  <label xml:lang="en">human</label>
  <comment xml:lang="en">a member of the human species</comment>
  <label xml:lang="fr">personne</label>
  <label xml:lang="fr">être humain</label>
  <label xml:lang="fr">humain</label>
  <label xml:lang="fr">homme</label>
  <comment xml:lang="fr">un membre de l'espèce humaine.</comment>
</Class>

<Class rdf:ID="Lecturer">
  <subClassOf rdf:resource="#Person"/>
  <label xml:lang="en">lecturer</label>
  <comment xml:lang="en">someone who lectures professionally</comment>
  <label xml:lang="fr">professeur</label>
  <comment xml:lang="fr">personne qui enseigne une discipline, une technique, un art.</comment>
</Class>


<Class rdf:ID="Researcher">
  <subClassOf rdf:resource="#Person"/>
  <label xml:lang="en">researcher</label>
  <label xml:lang="en">scientist</label>
  <comment xml:lang="en">a person who devotes himself to doing research</comment>
  <label xml:lang="fr">chercheur</label>
  <label xml:lang="fr">scientifique</label>
  <comment xml:lang="fr">personne adonnée à des recherches spécialisées.</comment>
</Class>

<Class rdf:ID="Woman">
  <subClassOf rdf:resource="#Person"/>
  <subClassOf rdf:resource="#Female"/>
  <label xml:lang="en">woman</label>
  <comment xml:lang="en">an adult female person</comment>
  <label xml:lang="fr">femme</label>
  <comment xml:lang="fr">femelle adulte de l'espèce humaine.</comment>
</Class>

<rdf:Property rdf:ID="hasAncestor">
  <domain rdf:resource="#Animal"/>
  <range rdf:resource="#Animal"/>
  <label xml:lang="en">has for ancestor</label>
  <comment xml:lang="en">relation between an animal and another animal from which it is descended.</comment>
  <label xml:lang="fr">a pour ancêtre</label>
  <comment xml:lang="fr">relation entre un animal et un autre animal duquel il descend.</comment>
</rdf:Property>

<rdf:Property rdf:ID="hasParent">
  <subPropertyOf rdf:resource="#hasAncestor"/>
  <label xml:lang="en">has for parent</label>
  <comment xml:lang="en">relation between an animal and another animal which gave birth to it.</comment>
  <label xml:lang="fr">a pour parent</label>
  <comment xml:lang="fr">relation entre un animal et un autre animal qui lui a donné naissance.</comment>
</rdf:Property>

<rdf:Property rdf:ID="hasChild">
  <label xml:lang="en">has for child</label>
  <comment xml:lang="en">relation between an animal and another animal to which it gave birth.</comment>
  <label xml:lang="fr">a pour enfant</label>
  <comment xml:lang="fr">relation entre un animal et un autre animal auquel il a donné naissance.</comment>
</rdf:Property> 

<rdf:Property rdf:ID="hasFather">
  <subPropertyOf rdf:resource="#hasParent"/>
  <range rdf:resource="#Male"/>
  <label xml:lang="en">has for father</label>
  <comment xml:lang="en">to have for parent a male.</comment>
  <label xml:lang="fr">a pour père</label>
  <comment xml:lang="fr">avoir pour parent un mâle.</comment>
</rdf:Property>

<rdf:Property rdf:ID="hasMother">
  <subPropertyOf rdf:resource="#hasParent"/>
  <range rdf:resource="#Female"/>
  <label xml:lang="en">has for mother</label>
  <comment xml:lang="en">to have for parent a female.</comment>
  <label xml:lang="fr">a pour mère</label>
  <comment xml:lang="fr">avoir pour parent un femmelle.</comment>
</rdf:Property>

<rdf:Property rdf:ID="hasBrother">
  <domain rdf:resource="#Animal"/>
  <range rdf:resource="#Male"/>
  <label xml:lang="en">has for brother</label>
  <comment xml:lang="en">relation with a male who has the same parents.</comment>
  <label xml:lang="fr">a pour frère</label>
  <comment xml:lang="fr">relation avec un mâle ayant les mêmes parents.</comment>
</rdf:Property>

<rdf:Property rdf:ID="hasSister">
  <domain rdf:resource="#Animal"/>
  <range rdf:resource="#Female"/>
  <label xml:lang="en">has for sister</label>
  <comment xml:lang="en">relation with a female who has the same parents.</comment>
  <label xml:lang="fr">a pour soeur</label>
  <comment xml:lang="fr">relation avec une femelle ayant les mêmes parents.</comment>
</rdf:Property>

<rdf:Property rdf:ID="hasFriend">
  <domain rdf:resource="#Person"/>
  <range rdf:resource="#Person"/>
  <label xml:lang="en">has for friend</label>
  <comment xml:lang="en">relation between a person and another person he or she knows well and regards with affection and trust.</comment>
  <label xml:lang="fr">a pour ami</label>
  <comment xml:lang="fr">relation entre une personne et une autre personne qui est l'objet d'un attachement privilégié.</comment>
</rdf:Property>

<rdf:Property rdf:ID="name">
  <label xml:lang="en">name</label>
  <label xml:lang="fr">nom</label>
  <comment xml:lang="en">designation of something.</comment>
  <comment xml:lang="fr">désignation de quelque chose.</comment>
</rdf:Property>

<rdf:Property rdf:ID="shoesize">
  <domain rdf:resource="#Person"/>
  <label xml:lang="en">shoe size</label>
  <label xml:lang="en">size</label>
  <label xml:lang="fr">pointure</label>
  <comment xml:lang="en">express in some way the approximate length of the shoes for a person.</comment>
  <comment xml:lang="fr">taille, exprimée en points, des chaussures d'une personne.</comment>
</rdf:Property>

<rdf:Property rdf:ID="age">
  <label xml:lang="en">age</label>
  <label xml:lang="fr">âge</label>
  <comment xml:lang="en">complete existence duration.</comment>
  <comment xml:lang="fr">durée complète d'existence.</comment>
</rdf:Property>

<rdf:Property rdf:ID="shirtsize">
  <domain rdf:resource="#Person"/>
  <label xml:lang="en">shirt size</label>
  <label xml:lang="en">size</label>
  <label xml:lang="fr">taille de chemise</label>
  <label xml:lang="fr">taille</label>
  <comment xml:lang="en">express in some way the approximate dimensions of the shirts of a person.</comment>
  <comment xml:lang="fr">dimensions approximatives des chemises portées par une personne.</comment>
</rdf:Property>

<rdf:Property rdf:ID="trouserssize">
  <domain rdf:resource="#Person"/>
  <label xml:lang="en">trousers size</label>
  <label xml:lang="en">size</label>
  <label xml:lang="fr">taille de pantalon</label>
  <label xml:lang="fr">taille</label>
  <comment xml:lang="en">express in some way the approximate dimensions of the trousers of a person.</comment>
  <comment xml:lang="fr">dimensions approximatives des pantalons portés par une personne.</comment>
</rdf:Property>

<rdf:Property rdf:ID="hasSpouse">
  <domain rdf:resource="#Person"/>
  <range rdf:resource="#Person"/>
  <label xml:lang="en">has for spouse</label>
  <label xml:lang="fr">est en ménage avec</label>
  <comment xml:lang="en">a person's partner in marriage.</comment>
  <comment xml:lang="fr">le partenaire d'une personne dans un mariage.</comment>
</rdf:Property>

</rdf:RDF>


Annotations RDF/XML

A partir de cet ensemble d'annotations RDF qui utilise l'ontologie précédente :

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE rdf:RDF [
   <!ENTITY humans   "http://www.inria.fr/2007/09/11/humans.rdfs"> 
   <!ENTITY xsd      "http://www.w3.org/2001/XMLSchema#"> ]>
 
<rdf:RDF  
   xmlns:rdf ="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
   xmlns:xsd ="&xsd;" 
   xmlns     ="&humans;#" 
   xml:base  ="&humans;-instances" >
   
<Man rdf:ID="Harry">
  <name>Harry</name>
  <hasChild rdf:resource="#John"/>
  <hasSpouse rdf:resource="#Sophie"/>
</Man>
 
   
<Person rdf:ID="John">
  <name>John</name>
	<shoesize>14</shoesize>
	<age>37</age>
</Person>

<Person rdf:ID="Mark">
  <name>Mark</name>
	<shoesize>8</shoesize>
	<age>14</age>
	<shirtsize>9</shirtsize>
	<trouserssize>36</trouserssize>
	<hasFather rdf:resource="#John"/>
</Person>

<Person rdf:ID="Eve">
  <rdf:type rdf:resource="&humans;#Lecturer"/>
	<hasSpouse rdf:resource="#David"/>
	<name>Eve</name>
	<hasFriend rdf:resource="#Alice"/>
</Person>

<Person rdf:ID="David">
  <rdf:type rdf:resource="&humans;#Researcher"/>
  <hasFriend rdf:resource="#Gaston"/>
	<name>David</name>
</Person>

<Woman rdf:ID="Alice">
	<hasFriend rdf:resource="#John"/>
	<name>Alice</name>
</Woman>

<Man rdf:ID="Jack">
	<hasFriend rdf:resource="#Alice"/>
	<hasChild rdf:resource="#Harry"/>
	<name>Jack</name>
</Man>

<Woman rdf:ID="Flora">
  <age>95</age>
	<hasSpouse rdf:resource="#Gaston"/>
	<hasChild rdf:resource="#Pierre"/>
	<name>Flora</name>
</Woman>

<Person rdf:ID="Laura">
	<hasFriend rdf:resource="#Alice"/>
	<name>Laura</name>
</Person>

<Woman rdf:ID="Jennifer">
	<hasSpouse rdf:resource="#John"/>
	<name>Jennifer</name>
</Woman>

<Man rdf:ID="Lucas">
	<shoesize>7</shoesize>
	<trouserssize>28</trouserssize>
	<age>12</age>
	<shirtsize>8</shirtsize>
	<name>Lucas</name>
	<hasMother rdf:resource="#Catherine"/>
</Man>

<Man rdf:ID="Gaston">
  <rdf:type rdf:resource="&humans;#Researcher"/>
	<shoesize>11</shoesize>
	<trouserssize>38</trouserssize>
	<age>102</age>
	<shirtsize>12</shirtsize>
	<name>Gaston</name>
	<hasChild rdf:resource="#Pierre"/>
	<hasChild rdf:resource="#Jack"/>
</Man>

<Lecturer rdf:about="#Laura"/>

<Person rdf:ID="William">
	<hasSpouse rdf:resource="#Laura"/>
	<shoesize>10</shoesize>
	<age>42</age>
	<trouserssize>46</trouserssize>
	<shirtsize>13</shirtsize>
	<name>William</name>
</Person>

<Man rdf:ID="Pierre">
	<shoesize>8</shoesize>
	<age>71</age>
	<trouserssize>30</trouserssize>
	<shirtsize>9</shirtsize>
	<name>Pierre</name>
</Man>

<Person rdf:ID="Karl">
	<hasSpouse rdf:resource="#Catherine"/>
	<hasFriend rdf:resource="#Sophie"/>
	<shoesize>7</shoesize>
	<age>36</age>
	<shirtsize>9</shirtsize>
	<trouserssize>40</trouserssize>
</Person>


<Woman rdf:ID="Catherine">
  <hasMother rdf:resource="#Laura"/>
</Woman>

<Researcher rdf:about="#Laura">
  <name>Laura</name>
</Researcher>

<Person rdf:about="#John">
	<shirtsize>12</shirtsize>
	<trouserssize>44</trouserssize>
	<hasParent rdf:resource="#Sophie"/>
</Person>

</rdf:RDF>

Quel est l'espace de nom associé aux instances créées par les annotations de ce fichier ?

La declaration xml:base est utilisée pour attacher l'espace de nom http://www.inria.fr/2007/09/11/humans.rdfs-instances# à chaque instace locale créée dans ce fichier. La valeur de xml:base utilise la constante humans définie en tant qu'entité dans la DTD et y concatène -instances.

Quel est l'espace de nom de l'ontologie utilisée par ces annotations et comment est-elle associée aux balises de ce fichier XML ?

L'espace de nom est http://www.inria.fr/2007/09/11/humans.rdfs# et est associé en utilisant la déclaration de l'espace de nommage par défaut xmlns="&humans;#" dans laquelle &humans; est une entité définie dans la DTD.

En regardant le document, que savons nous sur John ?

Son nom est John, il chausse du 14, la taille de ses chemises est 12 et celle de ses pantalons 44. Il est âgé de 37 ans, son épouse est Jennifer, il est le père de Mark, il est un enfant de David, et Alice le considère comme un ami.

Proposer le plus de manières possible pour représenter une personne (par exemple "Stephen").

<Person rdf:about="#Stephen"/>

<Person rdf:ID="Stephen"/>

<rdf:Description rdf:ID="Stephen">    <!-- or idem with rdf:about -->
  <rdf:type rdf:resource="&humans;#Person"/>
 </rdf:Description>

<rdf:Description rdf:ID="Stephen"> <!-- or idem with rdf:about -->
  <hasSpouse rdf:resource="#Laura"/>  <!-- using a typed domain -->
 </rdf:Description>

<rdf:Description rdf:ID="Laura">
  <hasSpouse rdf:resource="#Stephen"/>  <!-- using a typed range -->
 </rdf:Description>

<Man rdf:about="#Stephen"/>   <!-- using inheritance and idem with rdf:ID -->

Requêtes avec SPARQL

Dans ce TP, on utilise la version autonome du moteur de recherche Corese disponible en fichier ".jar" exécutable. Pour éxécuter Corese, un double-click sur l'archive devrait être suffisant pour lancer l'interface simplifiée. Corese peut aussi être lancé depuis un shell depuis le répertoire dans lequel se trouve l'archive par la commande java -jar -Dfile.encoding=UTF8 corese-3.0.x.jar ; ce qui permet également de s'assurer que la JVM utilisera l'encoding UTF-8.

Téléchargez et exécutez Corese v3.0.x.

Dans l'interface de Corese, chargez les 2 fichiers précédents human_2007_09_11.rdfs et human_2007_09_11.rdf.

Dans l'onglet "Query", quel résultat retourne la requête suivante ? Regardez les premières réponses.

SELECT ?x ?t
WHERE
{
 ?x rdf:type ?t
}

Cette requête recherche toute les ressources typées et les affiche avec leur type. Remarquez que Corese connait 5 espaces de nommage avec leur préfixes :

 rdf     "http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 rdfs    "http://www.w3.org/2000/01/rdf-schema#"
 owl     "http://www.w3.org/2002/07/owl#"
 xsd     "http://www.w3.org/2001/XMLSchema#"
 cos     "http://www.inria.fr/acacia/corese#"

Adaptez la requête précédente pour retrouver toutes les classes.

SELECT ?x
WHERE
{
 ?x rdf:type rdfs:Class
}

Ecrire une nouvelle requête pour extraire tous les liens de subsomptions entre les classes (subClassOf).

SELECT ?x ?y
WHERE
{
 ?x rdfs:subClassOf ?y
}

Que retourne la requête suivante ? Traduisez là en français.

PREFIX humans: <http://www.inria.fr/2007/09/11/humans.rdfs#>
SELECT *
WHERE
{
 ?x humans:hasSpouse ?y
}

Retrouve tous les couples mariés.

Ajouter une contrainte à la précédente requête pour construire 2 requêtes qui permettent de retrouver les hommes et leurs épouses.

Jusque là l'union et les relations symétriques n'ont pas été utilisées, par conséquent il y a 2 requêtes possibles :

une dans laquelle ?x est un Male :

PREFIX humans: <http://www.inria.fr/2007/09/11/humans.rdfs#>
SELECT *
WHERE
{
 ?x humans:hasSpouse ?y .
 ?x rdf:type humans:Male
}

et une autres dans laquelle ?y est un Male :

PREFIX humans: <http://www.inria.fr/2007/09/11/humans.rdfs#>
SELECT *
WHERE
{
 ?x humans:hasSpouse ?y .
 ?y rdf:type humans:Male
}

La première requête ne retourne qu'une réponse, mais si on déclare que Lucas a pour père Karl, alors des réponses supplémentaires apparaissent. Ajoutez ces nouveaux faits dans le fichier d'annotation, sélectionnez "Engine > Reset", rechargez l'ontologie et les annotations, puis relancez votre requête. Expliquez le nouveau résultat.

La première requête retourne une seule réponse parce qu'il n'y a qu'un ?x ayant une épouse qui soit typé en tant que mâle.

Dès qu'on utilise la relation hasFather entre Lucas et Karl, Karl est typé en tant que mâle et devient une réponse.

<Man rdf:ID="Lucas">
  <hasFather rdf:resource="#Karl"/>
</Man>

Trouvez les resources pour lesquelles on connaît au moins un parent.

PREFIX humans: <http://www.inria.fr/2007/09/11/humans.rdfs#>
SELECT ?x
WHERE
{
 { ?y humans:hasChild ?x }
 UNION
 { ?x humans:hasParent ?y }
}

Certains apparaissent 2 fois parce qu'on retrouve leur 2 parents ; comment éviter les doublons ?

SELECT distinct ?x

Retrouver les personnes avec leur âge s'il est connu.

PREFIX humans: <http://www.inria.fr/2007/09/11/humans.rdfs#>
SELECT ?person ?age
WHERE
{
 ?person rdf:type humans:Person
 OPTIONAL { ?person humans:age ?age }
}

Identifiez les adultes de la base (personnes dont l'âge est supérieur ou égal à 18 ans).

PREFIX humans: >http://www.inria.fr/2007/09/11/humans.rdfs#>
SELECT ?x
WHERE
{
 ?x humans:age ?age
 FILTER ( xsd:integer(?age) >= 18 )
}

La fonction de transtypage xsd:integer(...) est obligatoire quand les annotations ne typent pas l'âge en tant que valeur numérique. Par défaut, chaque valeur est un simple littéral.

Modifiez la requête de la précédente question pour demander si Mark est un adulte. L'URI de Mark est http://www.inria.fr/2007/09/11/humans.rdfs-instances#Mark.

PREFIX humans: <http://www.inria.fr/2007/09/11/humans.rdfs#>
ASK
WHERE
{
 <http://www.inria.fr/2007/09/11/humans.rdfs-instances#Mark> humans:age ?age
 FILTER ( xsd:integer(?age) >= 18 )
}

Regardez les professeurs (lecturer) et interrogez leur type. Comment peuvent-ils avoir plusieurs types ?

PREFIX humans: <http://www.inria.fr/2007/09/11/humans.rdfs#>
SELECT ?x ?t
WHERE
{
  ?x rdf:type humans:Lecturer .
  ?x rdf:type ?t 
}

Laura est instanciée plusieurs fois lecturer, ainsi que researcher, person, et female.

Retrouvez toutes les instances qui sont à la fois Male et Person. Expliquez les résultats tels que Jack et Pierre. Pourquoi sont-ils retrouvés.

PREFIX humans: <http://www.inria.fr/2007/09/11/humans.rdfs#>
SELECT ?x ?t
WHERE
{
 ?x rdf:type humans:Male .
 ?x rdf:type humans:Person .
 ?x rdf:type ?t
}

Jack et Pierre sont déclarées instances de Man qui est une sous-classe commune de Male et Person (héritage multiple).

Retrouver toutes les instances de Lecturers ou Researchers.

PREFIX humans: <http://www.inria.fr/2007/09/11/humans.rdfs#>
SELECT distinct ?person
WHERE
{
 {
  ?person rdf:type humans:Lecturer
 }
 UNION
 {
  ?person rdf:type humans:Researcher
 }
}

Interroger la base sur les chercheurs, puis sur les autres.

PREFIX humans: <http://www.inria.fr/2007/09/11/humans.rdfs#>
SELECT ?x
WHERE
{
 ?x rdf:type humans:Researcher
}

et

PREFIX humans: <http://www.inria.fr/2007/09/11/humans.rdfs#>
SELECT ?x
WHERE
{
 ?x rdf:type humans:Person
 OPTIONAL
 {
   ?x rdf:type ?t
   FILTER ( ?t = humans:Researcher )
 }
 FILTER ( ! bound( ?t ) )
}

Une erreur typique est d'utiliser la négation :

PREFIX humans: <http://www.inria.fr/2007/09/11/humans.rdfs#>
SELECT ?x
WHERE
{
 ?x rdf:type humans:Person
 ?x rdf:type ?t
 FILTER ( ?t != humans:Researcher )
}

Dans le contexte de l'instanciation multiple, on retrouvera également des chercheurs pour peu qu'ils aient un autre type. Par exemple, David, Gaston et Laura sont retournés car ils ont été déclarés en tant que Researchers et Persons.

Dans un monde ouvert, la négation en tant que critère de rejet fonctionne aussi loin que se prolonge votre connaissance. Il existe peut être une annotation quelque part dans le Web qui mentionne que Karl est un chercheur, et le fait de ne pas encore le savoir ne signifie pas qu'il ne l'est pas.

Demander les instances ayant une relation hasAncestor. Comment se fait-il qu'on obtienne des résultats alors que la propriété n'est pas utilisée dans les annotations (vérifiez dans le ficher des annotations) ?

PREFIX humans: <http://www.inria.fr/2007/09/11/humans.rdfs#>
SELECT ?x ?y 
WHERE
{
 ?x humans:hasAncestor ?y
}

hasAncestor est une super-propriété de hasParent qui est elle-même une super-propriété de hasFather et hasMother. Par conséquent, les instances de ces propriétés sont également retournées.

Trouvez les différentes significations du mot "size" (qui est un label).

PREFIX humans: <http://www.inria.fr/2007/09/11/humans.rdfs#>
SELECT *
WHERE
{
  ?t rdfs:label "size"@en .
  ?t rdfs:label ?le .
  ?t rdfs:comment ?ce .
  FILTER ( lang(?le) = 'en' && lang(?ce) = 'en' )
}

Réponse : size, shoe size, trousers size, shirt size.

Trouvez des synonymes du mot "person".

PREFIX humans: <http://www.inria.fr/2007/09/11/humans.rdfs#>
SELECT * 
WHERE
{
  ?t rdfs:label "person"@en .
  ?t rdfs:label ?syn .
  FILTER ( ?syn != "person"@en && lang(?syn) = 'en' )
}

Réponse : human, human being.

Demander la traduction du mot "shoe size" en français.

PREFIX humans: <http://www.inria.fr/2007/09/11/humans.rdfs#>
SELECT ?lf 
WHERE
{
  ?t rdfs:label "shoe size"@en .
  ?t rdfs:label ?lf .
  FILTER ( lang(?lf) = 'fr' )
}

Réponse : "pointure".

Demandez toutes les informations concernant Laura et utilisez l'ontologie pour obtenir les label en anglais des propriétés.

PREFIX humans: <http://www.inria.fr/2007/09/11/humans.rdfs#>
SELECT *
WHERE
{
  ?laura humans:name "Laura" .
  ?type rdfs:label ?l .
  {
   {
    ?laura rdf:type ?type
   }
   UNION
   {
    {
     ?laura ?type ?with
    }
    UNION
    {
     ?from ?type ?laura
    }
   }
  }
  FILTER ( lang(?l) = 'en' )
}

Utilisez la clause describe pour obtenir la description de Laura.

DESCRIBE <http://www.inria.fr/2007/09/11/humans.rdfs-instances#Laura>

ou

PREFIX humans: <http://www.inria.fr/2007/09/11/humans.rdfs#>
DESCRIBE ?laura
WHERE
{
  ?laura humans:name "Laura" .
}

Construisez tous les triplets inférent les instances de type Man en utilisant les hommes connus et les personnes mâles connues.

PREFIX humans: <http://www.inria.fr/2007/09/11/humans.rdfs#>
CONSTRUCT 
{
 ?x rdf:type humans:Man
}
WHERE
{
 {
  ?x rdf:type humans:Man
 }
  UNION
 {
  ?x rdf:type humans:Male .
  ?x rdf:type humans:Person
 }
}

Man est une sous-classe commune de Male et Person, ainsi toutes les instances de Man sont à la fois Male et Person, mais ici on construit la relation inverse : toutes les instances de Male et Person sont aussi des instances de Man.

Retrouvez toutes les personnes dont le nom contient "ar", à l'aide de la fonction regex(STRING, PATTERN).

PREFIX humans: <http://www.inria.fr/2007/09/11/humans.rdfs#>
SELECT * WHERE
{
 ?x rdf:type humans:Person .
 ?x humans:name ?name .
 FILTER ( regex(?name, '.*ar.*') )
}