Noms

  • EL KADI Youssef
  • GALUBA MATHEO

2 Mise en pratique du langage SPARQL

BASE <https://swapi.co/resource/>
PREFIX voc: <https://swapi.co/vocabulary/>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX wd: <http://www.wikidata.org/entity/>
PREFIX xml: <http://www.w3.org/XML/1998/namespace>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>

2.1 SparQL Query

Question 1

Lancer la commande DESCRIBE <human/14>. De qui s’agit-il ? (URI complète de la ressource : <https ://swapi.co/resource/human/14>)

Il s’agit de Han Solo.

Question 2

L’humain 14 est-il un homme ?

select ?o where {
    <human/14> voc:gender ?o .
}

Au sens biologique, c’est un mâle (chromosome XY) mais on ne sait pas exactement comment il s’identifie, il ne faut pas confondre genre et identité de genre.

Question 3

Lister l’ensemble des types (directs) de l’humain 14.

select ?o where {
    <human/14> rdf:type ?o .
}

Question 4

Donner le nombre de personnages.

select (COUNT(DISTINCT ?s) as ?count) where {
    ?s rdf:type voc:Character .
}

Question 5

Donner les couleurs des yeux des personnages (sans doublons).

select DISTINCT ?s ?c where {
    ?s rdf:type voc:Character .
    ?s voc:eyeColor ?c .
}

Question 6

Donner la couleur de cheveux des personnages originaires des pla- nètes 17 et 42.

Question 7

Lister les personnages qui apparaissent dans plus de deux films.

select ?c  (COUNT(DISTINCT ?f ) as ?count) where {
    ?c rdf:type voc:Character .
    ?c voc:film ?f .
} group by ?c having(?count >= 2)

Question 8

Quels sont les personnages qui sont apparus dans l’intégralité des films de la saga ?

Question 9

Donner la description du personnage qui s’apelle “Dart Fener” en italien. Attention, on souhaite cette fois-ci se limiter aux résultats en français.

select ?d where {
    ?c rdfs:label "Dart Fener"@it .
    ?c voc:desc ?d .
    FILTER(langMatches(lang(?d), "fr")) .
}

Question 10

Construire le graph correspondant à Yoda. Si vous le souhaitez, vous pouvez limiter les informations descriptives (label et description) à une seule langue.

CONSTRUCT WHERE {
	?s rdfs:label "Yoda"@fr .
    ?s ?p ?o .
}
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX voc: <https://swapi.co/vocabulary/>
BASE <https://swapi.co/resource/>
 
CONSTRUCT {
    ?s ?p ?o .
    ?s rdfs:label ?text .
    ?s voc:desc ?text2 .
} WHERE {
	?s rdfs:label "Yoda"@fr .
    ?s ?p ?o .
    ?s rdfs:label ?text .
    ?s voc:desc ?text2 .
    FILTER (langMatches(lang(?text), "fr")) .
    FILTER (langMatches(lang(?text2), "fr")) .
    FILTER (?p != rdfs:label) .
    FILTER (?p != voc:desc) .
}

Question 11

Citer les personnages sauf ceux qui ont participé au 3eme film ?

SELECT 
DISTINCT ?s ?o
 
WHERE {
    ?s rdf:type voc:Character .
    FILTER NOT EXISTS { ?s voc:film <film/3>}
}

Question 12

Lister les films dans lesquels au moins 4 planètes différentes sont visitées. Organiser la liste selon l’ordre alphabétique de leur nom.

SELECT ?s (COUNT(DISTINCT ?o) AS ?count)
WHERE {
	?s rdf:type voc:Film .
    ?s voc:planet ?o .
} GROUP BY ?s HAVING(?count >= 4)

Question 13

Reprendre la question précédente et y ajouter les planètes visitées et leur climat.

SELECT ?s ?o ?climate
WHERE {
    {
        SELECT ?s (COUNT(DISTINCT ?o) AS ?count)
		WHERE {
			?s rdf:type voc:Film .
		    ?s voc:planet ?o .
		} GROUP BY ?s HAVING(?count >= 4)
    }
    ?s voc:planet ?o .
    ?o voc:climate ?climate .
}

Question 14

Quels sont les duos de personnages participants au même film ? Limiter votre réponse aux 100 premiers duos.

SELECT ?s1 ?s2 
WHERE {
    ?s1 voc:film ?f .
    ?s2 voc:film ?f .
    FILTER(?s1 != ?s2)
} limit 100

Question 15

Pour chaque type, donner le poids moyen.

SELECT ?f (AVG (?h) as ?avgmass)
WHERE {
    ?s rdf:type ?f .
	?s voc:mass ?h .
} GROUP BY ?f

Question 16

Lister les personnages avec le nom des films dans lesquels ils aparaissent ainsi que leur planète d’origine accompagnée de leur population.

SELECT (?s AS ?subject) (?f AS ?film) (?w AS ?world)
WHERE {
    ?s rdf:type voc:Character .
    ?s voc:homeworld ?w .
    ?s voc:film ?f .
}

Question 17

Donner les individus qui ont un poids moyen supèrieur au poids moyen de leur type.

SELECT ?s ?type ?weight
WHERE {
    ?s rdf:type ?type .
    ?s voc:mass ?weight .
    {
        SELECT ?f (AVG (?weight) as ?avg_weight)
        WHERE {
            ?s rdf:type ?f .
            ?s voc:mass ?weight .
        } GROUP BY ?f
    }
    FILTER(?weight > ?avg_weight)
}

Question 18

Donner l’ensemble des types directs et indirects d’Anakin Skywalker.

SELECT DISTINCT ?type
WHERE {
    ?s rdfs:label "Anakin Skywalker"@fr .
    ?s rdf:type ?direct_type .
    ?direct_type rdfs:subClassOf* ?type .
}

2.2 SparQL Update

Question 19

Malheureusement, la base ne contient pas les acteurs. En revanche, certaines descriptions contiennent leur nom. Essayer avec l’acteur “Alec Guinnesss”. S’il existe un resultat, afficher le nom français des personnages correspondants et leur description.

SELECT ?l ?d
WHERE {
    ?s rdfs:label ?l .
    ?s voc:desc ?d .
    FILTER(CONTAINS(LCASE(?d), "alec guinness"))
    FILTER(langMatches(lang(?l), "fr"))
}

Question 20

Donner les planètes pour lesquelles il n’existe aucun résident.

SELECT ?planete
WHERE {
    ?planete rdf:type voc:Planet .
    FILTER NOT EXISTS { ?planete voc:resident ?o }
}

Question 21

Quels sont les films qui sont sortis avant 1990 ?

SELECT ?film ?title ?date
WHERE {
    ?film rdf:type voc:Film .
    ?film voc:releaseDate ?date .
    ?film rdfs:label ?title .
    FILTER(YEAR(?date) < 1990)
    FILTER(langMatches(lang(?title), "fr"))
}

Question 22

Nous avons la chance d’avoir l’identifiant wikidata des personnages. Faites une requête conjointe pour récupérer les informations disponibles du personnage Chewbacca.

SELECT ?s ?wd ?p ?o
WHERE {
    ?s rdfs:label "Chewbacca"@fr .
    ?s voc:wikidataLink ?wd .
    SERVICE <https://query.wikidata.org/sparql> {
        ?wd ?p ?o .
    }
}
LIMIT 100

Question 23

Quel est le nom des parents d’Anakin Skywalker ?

PREFIX wdp: <http://www.wikidata.org/prop/direct/>
 
SELECT ?m ?f
WHERE {
    ?s rdfs:label "Anakin Skywalker"@fr .
    ?s voc:wikidataLink ?wd .
    OPTIONAL {
        ?mother voc:wikidataLink ?wd_mother .
    	?mother rdfs:label ?m .
        FILTER(langMatches(lang(?m), "fr"))
        SERVICE <https://query.wikidata.org/sparql> {
            ?wd wdp:P25 ?wd_mother .
        }
    }
    OPTIONAL {
        ?father voc:wikidataLink ?wd_father .
    	?father rdfs:label ?f .
        FILTER(langMatches(lang(?f), "fr"))
        SERVICE <https://query.wikidata.org/sparql> {
            ?wd wdp:P22 ?wd_father .
        }
    }
}

Question 24

Vous décidez d’incarner un personnage dans le monde de starwars. Choisissez une espèce et ajouter votre personnage avec quelques attributs.

INSERT DATA {
    </sith/78> rdf:type voc:Character
    </sith/78> voc:eyeColor "Bleu ciel" 
    </sith/78> voc:gender "male" 
    </sith/78> voc:height "1m77" 
	</sith/78> voc:mass "72"
    </sith/78> voc:skinColor "Blanc"
    </sith/78> rdfs:label "Emmanuel Macron"
}

Question 25

Un nouveau star wars se profil et pour faire plaisir au fan l’intégralité des personnages y seront présents. Ajouter ce-nouveau film dans la base sous le nom de fanService.

INSERT {
    </film/78> rdf:type voc:Film .
    </film/78> rdfs:label "fanService" .
    </film/78> voc:character ?p .
}
WHERE {
    ?p rdf:type voc:Character .
}
 

Question 26

Après évaluation du budget, le studio vous informe que les costumes pour les espèces Aleena et Besalisk couteraient trop cher. Retirez ces personnages du films.

DELETE {
    ?p rdf:type ?t .
}
WHERE {
    ?p rdf:type ?t .
    FILTER (?t IN (voc:Besalisk, voc:Aleena))
}

3 Inferences

Question 29

Lire la page de documentation peut s’avérer utile. Avant de créer vos propres règles d’inférences, afficher via une requête sparql, le contenu du fichier d’inférence actuel. Lister les rulesets utilisé :

SELECT ?state ?ruleset {
    ?state sys:listRulesets ?ruleset
}

Afficher le contenu d’un fichier ruleset :

SELECT * {
    ?content sys:exploreRuleset "starwars_inference"
}

Question 30

**On souhaite identifier les planète cybernétiques (i.e. les planètes d’où sont originaires Humains et Droïds) ? Une planète cybernétique est identifiée par voc:CyberPlanet

  • Ecrire la règle.pie
  • Mettre à jour le fichier via une commande sparql
  • Penser à réinférer
  • Vérifier que tout a fonctionné
INSERT DATA {
   <_:starwars_inference> sys:addRuleset '''
       Prefices { 
           voc: https://swapi.co/vocabulary/
           rdf: http://www.w3.org/1999/02/22-rdf-syntax-ns#
       }
       Axioms {}
       Rules {
           Id: cyberplanet_rule
               human <rdf:type> <voc:Human>
               human <voc:homeworld> planet
               droid <rdf:type> <voc:Droid>
               droid <voc:homeworld> planet
               -----------------------
               planet <rdf:type> <voc:CyberPlanet>
       }
   ''' .
}

Pour réinferer :

INSERT DATA { [] sys:reinfer [] }

Pour afficher les planètes avec le type voc:CyberPlanet :

SELECT ?planet
WHERE {
    ?planet rdf:type voc:CyberPlanet .
}

Question 31

Identifier les moyens de transports cybernétiques, i.e. ceux pilotés par un humain d’une planète où cohabitent humain et droids ?

Question 32

Comment faire pour identifier une planète aux mulitples climats ?

4 ShaCL

Question 33

Un véhicule doit disposer de l’information voc:crew.

Question 34

Modifier la shape précédente pour interdire la valeur 0. Que se passe-t-il ? Pourquoi ? Faites le necessaire pour ajouter cette contrainte.

Question 35

Dans le cadre de cet exercice, un membre de l’espèce yoda doit :

  • disposer d’au moins un nom (optionnel : au moins un nom en anglais).
  • avoir un poids ente 0 et 100,
  • avoir une couleur de peau égale à “green”, “lightGreen” ou “darkGreen”