Beruflich Dokumente
Kultur Dokumente
Question 1 (1pt). On souhaite modéliser ces informations en XSchema. Compléter le schéma suivant en
définissant le type PersonType.
<xs:element name='base'>
<xs:complexType>
<xs:sequence maxOccurs='unbounded'>
<xs:element name='personne' type='PersonType' />
</xs:sequence>
</xs:complexType>
</xs:element>
Question 2 (2 pts). Complétez ou modifiez le schéma pour prendre en compte les contraintes suivantes, en
précisant à quel endroit du schéma les ajouts doivent être insérés (ou en réécrivant l’élément que vous
modifiez) :
a) La date de naissance doit être inférieure au 1er janvier 2017.
Question 3 (1pt). On veut pouvoir distinguer dans cette base les personnes majeures. Les personnes majeures
peuvent avoir un conjoint, une profession et un employeur. Le conjoint et l’employeur sont modélisés sous
forme d’éléments, la profession sous forme d’attribut. Définir un type PersMajeureType à partir du type
PersonType décrivant les personnes majeures.
Lettres initiales du Prénom et du Nom: page 3
<xs:complexType name=’PersMajeureType’>
...
...
...
...
...
...
...
...
Le résultat d'une expression XPath est une liste de nœuds DOM triés dans l'ordre du document, sans doublon.
Par exemple, l'expression /descendant::div/following-sibling::*/@id retourne les identifiants
6,8,9,11,12.
Question 1 (3 pts). Donnez pour chaque expression XPath la liste des identifiants des nœuds qui sont retournés.
1. /descendant::div[child::*]/@id
Réponse:
Lettres initiales du Prénom et du Nom: page 4
2. /descendant::div/descendant::span/@id
Réponse:
3. /descendant::*/child::*[1]/@id
Réponse:
4. /descendant::*/following-sibling::div[1]/@id
Réponse:
5. /descendant::span[not(following-sibling::*)]/@id
Réponse:
6. /descendant::*[child::div[not(following-sibling::*)]]/@id
Réponse:
Question 2 (2 pts). Donnez pour chaque séquence de nœuds ci-dessous une expression XPath (syntaxe étendue
ou abrégée) qui la calcule:
1. 3, 7, 11
Réponse:
2. 4, 9, 12
Réponse:
3. 4, 6, 11
Réponse:
4. 1, 4
Réponse:
<analyses >
<typesExamens>
<typeExamen num="a01" nom="allergene" seuil="12">
<precaution>a jeun</precaution>
</typeExamen>
<typeExamen num="g01" nom="glycemie" seuil="8"/>
<typeExamen num="p01" nom="plaquettes" seuil="90"/>
</typesExamens>
<patients>
<patient num="19012" nom="smith">
<age>35</age>
<dossier>
<examen>
<quoi>a01</quoi>
<quand>12-12-2014</quand>
<avecQui>7892</avecQui>
<resultat>8</resultat>
</examen>
</dossier>
</patient>
<patient num="6942" nom="ben">
<age>65</age>
<dossier>
<examen>
<quoi>g01</quoi>
<quand>13-11-2014</quand>
<avecQui>5471</avecQui>
<resultat>11</resultat>
</examen>
<examen>
<quoi>p01</quoi>
<quand>14-11-2014</quand>
<avecQui>5471</avecQui>
<resultat>92</resultat>
</examen>
</dossier>
</patient>
</patients>
<personnel>
<praticien num="7892" nom="smith" >
<grade>infirmier</grade>
</praticien>
<praticien num="5471" nom="jade">
<grade>medecein</grade>
</praticien>
</personnel>
</analyses>
analyses.xml
@prefix : <http://dbpedia.org/resource/> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
#examens
:allergie
a :examen_medical ;
:nom "allergene" ;
:seuil "12" .
:glycemie
a :examen_medical ;
:nom "glycemie" ;
:seuil "8" .
:plaquettes
a :examen_medical ;
:nom "plaquettes" ;
:seuil "90" .
#patients
:smith
a :patient ;
:nom "smith" ;
:age "35" .
:ben
a :patient ;
:nom "ben" ;
:age "65" .
#praticiens
:salem
a :praticien ;
:grade :infirmier .
:jade
a :praticien ;
:grade :medecin .
#dossiers
:smith :passe :alg .
:alg :quoi :allergie ;
:quand "2015" ;
:parQui :jade .
:ben :passe :glc , :plq .
:glc :quoi :glycemie ;
:quand "2015" ;
:parQui :smith ;
:resultat "6" .
:plq :quoi :plaquette ;
:quand "2012" ;
:parQui :jade ;
:resultat "80" .
analyses.ttl
Nom : Prénom : page 1
XPath XQuery
XPath 5 pts
Exprimez en XPath les requêtes suivantes (observation: toutes les requêtes demandées peuvent être
exprimées en XPath):
Question 1(1 pt). Les appareils différents de 'Nikon F1' qui ont été utilisés pour prendre les photos
de la collection "Pour les copains".
Résultat:
<appareil> Samsung T1 </appareil>
Question 2(1pt). Les emails des personnes qui n'ont pas de collections avec des photos en format
'gif'.
Résultat:
<email> Pierre.Bernard@acces.fr </email>
<email>Paul.Martin@sept.fr</email>
Question 4(1pt). Décrire en français le résultat qui sera envoyé par la requête suivante. Donner
également son résultat.
//collection[publication/@date != publication/@date]/nom
Description:
Résultat:
Question 5(1 pt). La liste de tous les formats de photo possibles, chaque format doit être listé une
seule fois.
Résultat:
<format> jpeg</format>
<format> bmp</format>
<format> gif</format>
XQuery 5 pts
Exprimez en Xquery les requêtes suivantes :
Question 6(1pt). Les appareils photo qui ont été utilisés pour faire plusieurs photos. Chaque
appareil doit apparaître une seule fois dans le résultat. Le résultat doit satisfaire la DTD suivante :
< !ELEMENT résultats (appareil)*>
< !ELEMENT appareil EMPTY>
< !ATTLIST appareil nom CDATA>
Question 7(1.5 pt). Pour chaque format de photo, le nombre total de photos de ce format qui ont
été publiées dans chaque collection. Le nombre total sera affiché dans un élément <nb>. S'il n'y a
pas de photo avec un format donné dans une certaine collection, on affiche seulement le nom de la
collection, l'élément <nb> ne sera pas affiché. Chaque format doit apparaître une seule fois dans le
site.xml
<site> <collections>
<photos> <collection idC='c67' idU='m23'>
<photo idP='p123'> <nom> Pour les copains</nom>
<appareil>Samsung T1</appareil> <publication idP='p123' date='17-12-2015'/>
<catégorie>paysage</catégorie> <publication idP='p254' date='18-12-2015'/>
<format> jpeg</format> </collection>
<taille>2056</taille> <collection idC='c78' idU='m56'>
</photo> <nom> Collection publique</nom>
<photo idP='p254'> < publication idP='p678' date='24-12-2015'/>
<appareil>Nikon F1</appareil> </collection>
<catégorie>enfants</catégorie> <collection idC='c34' idU='m62'>
<format> jpeg</format> <nom> Photos préférées</nom>
<taille>1028</taille> < publication idP='p354' date='02-01-2016'/>
</photo> < publication idP='p442' date='02-01-2016'/>
<photo idP='p678'> < publication idP='p553' date='02-01-2016'/>
<appareil>Samsung T1</appareil> </collection>
<catégorie>enfants</catégorie> </collections>
<format> bmp</format> </site>
<taille>1028</taille>
</photo>
<photo idP='p354'>
<appareil>Nikon F1</appareil>
<catégorie>portrait</catégorie>
<format> gif</format>
<taille>512</taille>
</photo>
<photo idP='p442'>
<appareil>Canon D50</appareil>
<catégorie>animaux</catégorie>
<format> gif</format>
<taille>512</taille>
</photo>
<photo idP='p553'>
<appareil>Canon D50</appareil>
<catégorie>nature</catégorie>
<format> gif</format>
<taille>512</taille>
</photo>
</photos>
<utilisateurs>
<utilisateur idU='m23'>
<nom>Bernard</nom>
<prénom> Pierre</prénom>
<email>Pierre.Bernard@acces.fr</email>
</utilisateur>
<utilisateur idU='m56'>
<nom>Martin</nom>
<prénom>Paul</prénom>
<email>Paul.Martin@sept.fr</email>
</utilisateur>
<utilisateur idU='m62'>
<nom>Richard</nom>
<prénom>Thomas</prénom>
<email>Thomas.Richard@aol.fr</email>
</utilisateur>
</utilisateurs>
Nom : Prénom : page 1
Ex1 Ex2
…………………………………………………………………………………………………….
……………………………………………………………………………………………………..
…………………………………………………………………………………………………..
………………………………………………………………………………………………….
…………………………………………………………………………………………………..
………………………………………………………………………………………………….
…………………………………………………………………………………………………..
………………………………………………………………………………………………….
…………………………………………………………………………………………………..
Lettres initiales du Prénom et du Nom: page 2
On souhaite utiliser XSchema à la place des DTD et tirer profit de l’expressivité de XSchema.
Question 2 ( 1 pt).
<xs:element …………………………………………>
<…………………………………………>
<…………………………………………>
<xs:element ref='typesExamens'/>
<xs:element ref='patients'/>
<xs:element ref='personnel'/>
</…………………………………………>
</…………………………………………>
</xs:element>
<xs:element ………………………………………..…>
<…………………………………………>
Lettres initiales du Prénom et du Nom: page 3
<…………………………………………>
<………………………………………………………………………………………………/>
</……………………………………….>
<………………………………………………………………………………………………/>
<………………………………………………………………………………………………/>
<………………………………………………………………………………………………/>
</…………………………………………>
</xs:element>
Question 3 (2 pt).
Définir, en XSchema, les contraintes suivantes.
On considère que les contraintes sont exprimées entre les balises <xs:element name='analyses'> et sa
balise fermante </xs :element>
a) Tous les attributs num du document sont uniques pour tout le document.
<……………………………… name="uniqueAllNum">
<………………………………………………………………………………………………/>
<………………………………………………………………………………………………/>
………………………………………………………………………………………………
<……………………………… name="uniqueExam">
<………………………………………………………………………………………………/>
<………………………………………………………………………………………………/>
………………………………………………………………………………………………
Lettres initiales du Prénom et du Nom: page 4
<……………………………… name="uniquePrat">
<………………………………………………………………………………………………/>
<………………………………………………………………………………………………/>
………………………………………………………………………………………………
Rappel : les contraintes sont exprimées entre les balises <xs:element name='analyses'> et sa balise
fermante </xs :element>
a)
<………………………………………………………………………………………………………>
.……………………………….………………………………………………..
.………………………………………………………………………………..
………………………………………………………………………………
b)
<………………………………………………………………………………………………………>
.……………………………….………………………………………………..
..………………………………………………………………………………..
………………………………………………………………………………
Lettres initiales du Prénom et du Nom: page 5
Question 4 (1 pt). On souhaite introduire un type tpersonne pour factoriser les informations communes aux
types patient et praticien. Complétez le fragment du schéma XSchema permettant de réaliser cette factorisation.
<xs:complexType name="tpersonne">
</xs:complexType>
<xs:complexType name="tpatient">
<xs:complexContent>
<……………………………… ………………………………>
<………………………………>
</………………………………>
</………………………………>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="tpraticien">
<xs:complexContent>
<………………………………>
<………………………………>
</………………………………>
</………………………………>
</xs:complexContent>
</xs:complexType>
Question 1 (1 pt). Renseigner les cardinalités (nombre de réponses) des requêtes Q1 à Q3 données ci-dessous.
Q1
select (count(*) as ?nb_triples)
where { ?s ?p ?o }
Résultat : ……..
Q2
select (count(distinct ?p) as ?nb_pred)
where{ ?s ?p ?o }
Résultat : ……..
Q3
select (count(distinct ?o) as ?nb_smth)
where{ ?s rdf :type ?o }
Résultat : ……..
Question 2 (.5 pt). Que retourne la requête Q4 donnée ci-dessous ? Exprimez-la en français et donnez son
résultat dans un tableau.
Q4
select ?pat ?nom
where {
?pat :passe ?ex .
?ex :quoi :glycemie .
?ex :resultat ?res .
:glycemie :seuil ?se .
:glycemie :nom ?nom
FILTER(?res<?se) }
La requête en français :
Lettres initiales du Prénom et du Nom: page 7
Tableau du résultat
Question 3 (.5 pt). Y a-t-il des patients qui sont également praticiens ?
Le résultat de la requête est : false.
Question 4 (1 pt). Les praticiens qui ont fait passer un examen dont le seuil est strictement inférieur à 12.
Retourner le nom du praticien et le nom de l’examen.
Le résultat de la requête est :
?praticien ?examen
:smith :glycemie
Where
{
Lettres initiales du Prénom et du Nom: page 8
Question 5 (1 pt). Les patients qui ont passé un examen dont on connaît éventuellement le résultat.
Le résultat de la requête est :
?patient ?examen ?resultat
:ben "glycemie" 6
:smith "allergene "
Where
}
Lettres initiales du Prénom et du Nom: page 9
Question 6 (1 pt). Les praticiens qui ont effectué un examen à deux patients différents.
Remarque : le résultat ne doit pas contenir de doublons.
Le résultat de la requête est
?praticiens ?patient1 ?patient2
:jade « ben » « smith »
Where
}
Nom : Prénom : page 1
Ex1 : Ex2 :
Ex3 : Ex4 :
Interface Personne
{ attribute string nom ;
attribute Pays nationalite ;
}
Interface Gouvernement
{attribute Personne chef ;
attribute set(struct(Personne ministre, string portefeuille)) ministres ;
}
Interface Pays
{ attribute string nom ;
Question 2. Quel est le nombre minimum de racines de persistance nécessaires à cette application ? Justifiez
votre réponse et définissez ces racines.
Nb minimal de racines de persistance :
Justification :
Lettres initiales du Prénom et du Nom: page 2
Question 3. Dans l’application, un traitement particulier s’applique aux pays de la zone Euro. Pour cela, on a
besoin de connaître le PIB de ces pays. Complétez le schéma précédent en conséquence.
Create type _ _ _ _ _ _
Nom varchar2(20),
Capitale varchar2(20),
Gouv _ _ _ _ _ _ _ _ _ _
Appartient _ _ _ _ _ _ _ _ _
) ;
Lettres initiales du Prénom et du Nom: page 3
c) <A> <D/> <B/> <C/> <C/> <B/> <B/> <B/> <B/> </A>
Conforme : OUI NON
Si NON, pourquoi ?
b) Il est impossible de restreindre un type complexe avec une facette. Est-ce exact ?
Stockage :
Les objets Document sont stockés dans la table LesDoc.
Les objets Auteur sont stockés dans la table LesAuteurs.
Répondre en SQL3, en suivant le modèle du cadre réponse.
1) Insertion
On suppose que les deux instructions suivantes ont été effectuées sur la base :
Insert into LesAuteurs values (‘Alice’, EnsMots(‘info’, ‘données’), EnsDoc()) ;
Insert into LesDoc values (‘2016, 100, ‘Les BD’, EnsMots(‘BD’, ‘langage’),
EnsAuteurs()) ;
Ecrivez l’instruction SQL3 qui insère l’auteur Alice dans les auteurs du document de titre ‘Les BD’ ;
Insert _ _ _ _ _ _ _ _ _ _
Select _ _ _ _ _ _ _ _
From _ _ _ _ _ _ _ _
Where _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
b). Quels sont les auteurs ayant écrit au moins un document dont au moins un mot-clé est égal à un domaine de
l'auteur ? Afficher le prénom de l'auteur, le titre du document et le mot-clé correspondant au domaine de
l'auteur.
Select _ _ _ _ _ _ _ _
From _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
Where _ _ _ _ _ _ _
c).Quelles sont les paires de documents qui ont au moins 3 mots-clés en commun. Afficher les références des
deux documents et le nombre de mots-clés communs.
Where _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _
e) Quels sont les co-auteurs d'Alice en 2015. Afficher des objets Auteur. Rmq. : un co-auteur d’Alice est
l’auteur d’un document écrit par Alice. Alice n’est pas son propre coauteur. Répondre SANS utiliser la méthode
coauteurs().
Select _ _ _ _ _ _
From _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
Where _ _ _ _ _ _
_ _ _ _ _ _ _ _ _
3) Méthodes
3a) En invoquant la méthode nbDoc(a) du type Auteur. Pour chaque auteur ayant écrit plus de documents en
2015 qu'en 2014, donner son prénom et le nombre de documents écrits en 2015.
Select _ _ _ _ _ _ _ _
From _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
Where _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _
3b) En invoquant la méthode coauteurs() du type Auteur : parmi les coauteurs d'Alice afficher ceux qui ont le
domaine 'Musique'?
Select _ _ _ _ _ _ _ _
From _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
Where _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
3c) Ecrire la méthode coauteurs. On rappelle qu’un auteur n’est pas son propre coauteur.
_ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _
return res;
end;
end;
Lettres initiales du Prénom et du Nom: page 8
4) Récursion. On considère la méthode récursive domainesDistants(d number) du type Auteur qui retourne un
ensemble de mots (type EnsMots). Elle est définie comme suit :
• domainesDistants(1) retourne les domaines d’un auteur.
• domainesDistants(2) retourne l’union des domaines d’un auteur et des domaines de ses coauteurs.
Autrement dit, cela retourne l’union des domaines d’un auteur et des domainesDistants(1) de ses coauteurs
etc.
• domainesDistants(d) retourne l’union des domaines d’un auteur et des domainesDistants(d-1) de ses
coauteurs.
Ecrire le corps de la méthode récursive
_ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _
Nom : Prénom : page 1
INSERT INTO _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ __ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ __ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
b) On apprend que le prix du ticket de loto joué par Alan le 13-12-2013 ne valait pas 2 euros mais 20 euros.
Modifier la base en conséquence. Ecrire la modification en SQL3.
UPDATE _ _ _ _ _ ( _ _ _ _ _ _ _ _
_ _ _ _ _ _ _
_ _ _ _ _ _ _ )
Lettres initiales du Prénom et du Nom: page 2
SET _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
WHERE _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _
2) On suppose que la base contient plusieurs joueurs. Qu’affiche cette requête ? Répondre en une phrase brève.
select value(j)
from LesJoueurs j
where ( select count(value(a))
from table(j.achat) a) = ( select max(( select count(value(a2))
from table(j2.achat) a2))
from LesJoueurs j2)
;
Elle affiche _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _
3) Ecrire la requête : pour un président ayant acheté au moins un ticket le 27-10-2014, donner son prenom et le
nom du club qu’il préside. Trier le résultat par nom de club.
Select _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
From _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
Where _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _
4) Pour chaque président de club, afficher le président (i.e. afficher entièrement l’objet de type Joueur) et le
nombre de clubs qu'il préside.
Select _ _ _ _ _ _ _ _ _ _ _ _
From _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _
5) On complète le type Joueur avec la méthode numFavorisAuLoto() retournant les numéros que le joueur a
déjà joués au moins 5 fois au loto. Compléter le corps de cette méthode
resultat _ _ _ _ _ _
begin
Lettres initiales du Prénom et du Nom: page 3
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _
return resultat ;
end ;
6) (bonus) Afficher le prénom des joueurs qui ont 13 parmi leurs numéros favoris au loto. Répondre en
invoquant une méthode.
Select _ _ _ _ _ _
From _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
Where _ _ _ _ _ _ _ _
Question 2 (1,5 pt). On souhaite définir un schema XSchema pour modéliser les informations du fichier
tweets.xml. Complétez la définition de l’élément tweet ci-dessous, afin qu’il soit conforme au fichier
tweets.xml.
<xs:element name="tweets">
<xs:complexType>
<xs:sequence maxOccurs="unbounded">
<xs:element ref="tweet"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="tweet">
<xs:complexType>
…………………
………………….
<xs:element name="date" type="xs:string"/>
<xs:element name="auteur" ……………
…………………………………………………..
…………………………………………………..
…………………………………………………
…………………………………………………..
</xs:element>
<xs:element name="texte" type="xs:string"/>
<xs:element name="hashtags" …………………
…………………………………………………………..
………………………………………………………….
………………………………………………………….
. ………………………………………………………….
………………………………………………………….
</xs:element>
<xs:element name="retweetDe"……………….
……………………………………………………………..
…………………………………………………………….
……………………………………………………………
………………………………………………………………
</xs:element>
Lettres initiales du Prénom et du Nom: page 5
……………………………………………………………
……………………………………………………………
…………………………………………………………….
<xs:attribute name="id" type="xs:string" …………………….
<xs:attribute name="langue" type="xs:string" ………………….
<xs:attribute name="type" type="xs:string"………………………
……………………………………………………………..
…………………………………………………………….
…………………………………………………………….
</xs:complexType>
</xs:element>
</xs :schema>
Question 4 (0,5pt). Le tweet qui suit dans le document le tweet avec l'identifiant "t2".
b) //tweet[3][@langue="fr"]/@id
Résultat :
@prefix : <http://dbpedia.org/resource/> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
#actors
:ryan_gosling
a foaf:actor ;
rdfs:label "Ryan Gosling";
:birthDate "1980-11-12" ;
:countryOfBirth "Canada" .
:Christina_Hendricks
a foaf:actor ;
rdfs:label "Christina Hendricks" ;
:birthDate "1975-05-03" .
:Carey_Mulligan
a foaf:actor ;
rdfs:label "Carey_Mulligan" ;
:birthDate "1985-05-28" ;
:countryOfBirth "UK".
#movies
:drive
a :movie;
:budget "12";
:year "2012";
:rating "7.8";
:seen "352000".
:madmen
a :movie;
:budget "8";
:year "2007";
:rating "7.2";
:seen "96000".
:gangster_squad
a :movie;
:budget "15";
:year "2013";
:rating "6.8";
:seen "160000".
#plays
:ryan_gosling
:plays :drive , :gangster_squad .
:Christina_Hendricks
:plays :drive , :madmen .
:Christina_Hendricks
:plays :gangster_squad , :never_let .
Annexe 2. Fichier tweets.xml
<tweets>
<tweet id="t1" langue="fr">
<date>144401235000</date>
<auteur id="u2" />
<texte>L'application #AppleStore débarque en #Belgique http://bit.ly/1R8VR6t</texte>
<hashtags>
<hashtag>AppleStore</hashtag>
<hashtag>Belgique</hashtag>
</hashtags>
</tweet>
<tweet id="t2" langue="en">
<date>144401245000</date>
<auteur id="u2" />
<texte>Vote for #Belgique! #Eurovision</texte>
<hashtags>
<hashtag>Belgique</hashtag>
<hashtag>Eurovision</hashtag>
</hashtags>
</tweet>
<tweet id="t3" langue="fr">
<date>144401245200</date>
<auteur id="u3" />
<texte>L'histoire du Juge Renaud en BD : fb.me/2fdfCekLM</texte>
</tweet>
<tweet id="t4" langue="fr">
<date>144401249000</date>
<auteur id="u1" />
<texte>#Haiti fait un don symbolique au #Nepal</texte>
<hashtags>
<hashtag>Nepal</hashtag>
<hashtag>Haiti</hashtag>
</hashtags>
</tweet>
<tweet id="t5" langue="fr">
<date>144401262000</date>
<auteur id="u1" />
<texte>Notre mission à #Katmandou suite au séisme : bit.ly/p5ssJj</texte>
<hashtags>
<hashtag>Katmandou</hashtag>
</hashtags>
</tweet>
<tweet id="t5" langue="fr" type="retweet">
<date>144401285000</date>
<auteur id="u2" />
<retweetDe tw="t5" />
<texte>RT Notre mission à #Katmandou suite au séisme : bit.ly/p5ssJj</texte>
<hashtags>
<hashtag>Katmandou</hashtag>
</hashtags>
</tweet>
</tweets>
Annexe 3. Fichier utilisateurs.xml
<utilisateurs>
<utilisateur id="u1">
<pays>France</pays>
<login>@afpfr</login>
<nom>Agence France-Presse</nom>
<abonnés>943000</abonnés>
</utilisateur>
<utilisateur id="u2">
<pays>Belgique</pays>
<login>@pauwels</login>
<nom>Chloé Pauwels</nom>
<abonnés>212</abonnés>
</utilisateur>
<utilisateur id="u3">
<pays>États-Unis</pays>
<login>@dupont</login>
<nom>Rémy Dupont</nom>
<abonnés>120</abonnés>
</utilisateur>
<utilisateur id="u4">
<pays>Belgique</pays>
<login>@pauwels</login>
<nom>Laura Peeters</nom>
<abonnés>432</abonnés>
</utilisateur>
</utilisateurs>
Nom : Prénom : page 1
Question 1 (1 pt). Complétez la définition de l’élément semestre (voir annexe 1), sachant que le contenu
d’un élément semestre est de la forme Si avec i ∈ {1, 2}.
<xs:element name="semestre">
</ xs:element>
<xs:element name="semestre">
<xs:simpleType>
<xs:restriction base ="xs :string">
<xs :pattern value = "S1 | S2 "/>
</xs :restriction>
</xs :simpleType>
</ xs:element>
On peut aussi mettre pattern value = "S[1-2]" ou enumeration value ="S1" (2 éléments enumeration pour les 2 valeurs)
Question 2 (1 pt). Complétez la définition de l’élément creneau du fichier formation.xsd (voir annexe 1)
sachant qu’un créneau est caractérisé par les informations suivantes :
- Le moment où a lieu le créneau (élément semestre ou élément le)
- Le jour de la semaine du créneau
- L’heure du début et de fin du créneau (éléments de et a)
- La salle
- Un ou deux intervenants
- Une matière
<xs:element name="creneau">
Lettres initiales du Prénom et du Nom: page 2
</ xs:element>
<xs:complexType>
<xs:sequence>
<xs:choice>
<xs:element name="le" type="xs:date"/>
<xs:element ref="frm:semestre"/>
</ xs:choice>
<xs:element name="jour" type="frm:jour−de−la−semaine"/>
<xs:element name="de" type="xs:time"/> ** string est aussi accepté
<xs:element name="a" type="xs:time"/> **ici aussi
<xs:element name="salle" type="xs:string" />
<xs:element name="intervenant" type="xs:string" maxOccurs="2" />
<xs:element name="matiere" type="xs:string"/>
</ xs:sequence>
</xs:complexType>
Question 3 (1 pt). Expliquez pourquoi ce schéma n’aurait pas pu être décrit par une DTD (donnez une raison
autre que l’utilisation de types).
Ce fichier contient deux éléments matière (un élément matière dans créneau et un élément matiere dans matieres) qui ne
sont pas du même type.
Question 4 (2 pts). On souhaite préciser la contrainte suivante : tout créneau doit se référer à une matière qui
existe. Définissez cette contrainte en précisant à quels endroits vous ajoutez les déclarations nécessaires.
<xs:key name="cleMatiere">
<xs:selector xpath="frm:matiere"/>
<xs:field xpath="frm:sigle"/>
</ xs:key>
Lettres initiales du Prénom et du Nom: page 3
//sport[not(epreuve[date='23-02'])]/@nom
//sport/epreuve[3]/@type
Question 3 (1pt). Les noms des sports avec au moins 2 épreuves pour les hommes ou 2 pour les femmes.
//sport[count(epreuve[@category="Femmes"]) > 1 or
count(epreuve[@category="Hommes"]) > 1 ]/@nom
Question 4 (1pt). Le type des épreuves en 'Ski de fond' qui précèdent les '50 km libre' dans le document.
Question 5 (1pt). Expliquez en une phrase en français ce que renvoie la requête XPath suivante :
//sport/epreuve/date[. = preceding::date]
<resultat> {
} </resultat>
<resultat> {
for …
Lettres initiales du Prénom et du Nom: page 6
doc("athletes.xml")//athlete[nom/text()="Stoch" and
prenom/text()="Kamil"]/@id]/date,
$e in doc("sports.xml")//sport/epreuve[date/text()=$d/text()]/@type
return <epreuve type="{$e}" date="{$d}" />
Question 4 (1,5 pt). Les athlètes compatriotes du gagnant (médaille d'or) de l'épreuve "50 km libre" du "Ski de
fond" :
<resultat> {
} </resultat>
@prefix : <http://dbpedia.org/resource/> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
#singers
:Shania_Twain
a foaf:Singer ;
rdfs:label "Shania Twain"@en ;
:birthDate "1965-08-28" ;
:placeOfBirth "Windsor"@en ;
:genre :country_pop , :country_rock , :rock , :pop ;
:instruments "vocals" , :guitar .
:Whitney_Houston
a foaf:Singer ;
rdfs:label "Whitney Houston"@en ;
:birthDate "1963-08-09" ;
:placeOfBirth "Newark"@en ;
:deathDate "2012-02-11" ;
:genre :pop , :sould, :rnb ;
:instruments "vocals" , :piano .
:Mariah_Carey
a foaf:Singer ;
rdfs:label "Mariah Carey"@en ;
:birthDate "1969-03-27";
:placeOfBirth "Long Island"@en ;
:genre :pop , :soul, :rnb ;
:instruments "vocals" , :guitar .
:Jay-Z
a foaf:Singer ;
rdfs:label "Jay-Z"@en ;
:birthDate "1969-12-04" ;
:placeOfBirth "Brooklyn"@en ;
:genre :hiphop ;
:instruments "vocals" .
#actors
:Emilia_Clarke
a foaf:Actor ;
rdfs:label "Emilia Clarke"@en ;
:birthDate "1987-05-01";
:placeOfBirth "London"@en ;
#songs
:Emilia_Clarke
:sang :fisherman .
:Whitney_Houston
:sang :believe , :run .
:Mariah_Carey
:sang :believe , :odds, :myall .
:Shania_Twain
:sang :kaching .
:Jay-Z
:sang :empire .
Lettres initiales du Prénom et du Nom: page 8
prefix : <http://dbpedia.org/resource/>
prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
prefix foaf: <http://xmlns.com/foaf/0.1/>
# les chanteurs de pop et de rock qui jouent de la guitare.
select ?singer
{
?singer :genre :pop . ?singer :instruments :guitar . ?singer :genre
:rock .
}
Question 2 (1 pt). Les duos des chanteurs ayant chanté ensemble. (Une réponse sans doublon donne un bonus)
Le résultat de la requête est :
singer other
:Mariah_Carey :Whitney_Houston
Question 3 (1 pt). Les chanteurs en vie ayant réalisé un duo avec des chanteurs qui sont décédés. Retourner le
nom du chanteur en vie et de celui décédé.
Lettres initiales du Prénom et du Nom: page 9
Les requêtes OLAP utilisent de très grandes quantités de données, font des opérations coûteuses (group by,
agrégats), et ont besoin d’utiliser des données historisées.
L’utilisation d’un entrepôt permet d’optimiser les requêtes en mettant des index, en créant des résumés de
données et en stockant les historiques. Cela permet aussi de ne pas dégrader les performances des BD
opérationnelles.
Le médiateur a de très mauvaises performances, surtout pour les requêtes utilisant de grandes quantités de
données.
Nom : Prénom : page 1
Ex1 :
Ex2 :
Ex3 :
Si oui, pourquoi a-t-on défini la racine LesOeuvres ? Justifiez votre réponse à l’aide d’un exemple.
Lettres initiales du Prénom et du Nom: page 2
Si non, est-il possible de stocker toutes les instances de la base avec une seule racine de persistance autre que
LesArtistes ? Préciser de quelle racine il s’agit et justifier votre réponse.
1pt ;
Oui, grâce aux associations œuvres, estDans, description.
Pour simplifier l’expression de requêtes, par exemple celles qui ne mentionnent pas les artistes (ex : titre des
œuvres exposées dans la salle 3 du 1er étage.) On ne pourrait pas non plus avoir des salles sans œuvre.
Oui, LesOeuvres, grâce à l’association realiséPar qui donne accès aux artistes et lesSalles, avec l’association
Contient qui donne accès aux œuvres (puis au reste).
Question 2. L’association entre Œuvre et Salle est déclarée comme étant inverse. Il est possible de déclarer
cette association sans inverse, de la façon suivante :
Interface Œuvre {…. Relationship Salle estDans ; …}
Interface Salle { …. Relationship Set<Œuvre> contient ;}
a) Quel est l’intérêt de déclarer cette association avec inverse ?
0,5pt
permet de contrôler l’intégrité référentielle (une œuvre est dans une salle que si l’œuvre existe, et la salle
contient une œuvre que si elle existe). Permet de garantir la cohérence : l’œuvre X est dans la salle Y, la salle Y
contient l’œuvre X).
b) Peut-on écrire le même ensemble de requêtes sur la base dans les deux cas ?
0,5pt Oui
0,5pt
Select o
From o in lesOeuvres
Where o.realiséPar.nom = ‘Leonard de Vinci’;
Lettres initiales du Prénom et du Nom: page 3
0,5pt
Select d.auteur
From o in LesOeuvres, d in o.description
Where o.nom=’Joconde’;
c) Liste des salles présentant les œuvres de la collection ‘peinture italienne’ triées par étage et par numéro
(sans doublon).
1pt
Select distinct o.estDans
From o in LesOeuvres
Where o.estDans.collection=’peinture italienne’
Order by o.estDans.etage, o.estDans.numero
d) Utilisez la question précédente pour lister les œuvres de la collection ‘peinture italienne’ classées par
étage et numéro de salle. Le résultat est un triplet (étage, salle, œuvres)
Lettres initiales du Prénom et du Nom: page 4
1pt
Select struct (etage : o.estDans.etage,
Salle : o.estDans.num,
Œuvres : (select c from c.in s.contient)
)
From s in ( Select distinct o.estDans
From o in LesOeuvres
Where o.estDans.collection=’peinture italienne’
Order by o.estDans.etage, o.estDans.numero);
Question 4.
a) Ecrire une méthode sculpt() permettant de distinguer le type d’une œuvre (sculpture ou peinture). sculpt ()
retourne true s’il s’agit d’une sculpture, false s’il s’agit d’une peinture.
1pt
boolean Œuvre :: sculpt() {return()} ;
boolean Sculpture ::sculpt() {return true};
boolean Peinture::sculpt() {return false};
1pt
Select a
Lettres initiales du Prénom et du Nom: page 5
From a in LesArtistes
o1 in a.oeuvres, o2 in a.oeuvres
Where o1.sculpt() and not o2.sculpt();
OUI NON
Si NON, pourquoi ?
OUI NON
Si NON, pourquoi ?
<! ELEMENT A (B ? | (C, D)*)> et <! ELEMENT A (( B? | C*), (B? | D*) ) >
OUI NON
Si NON, pourquoi ?
<! ELEMENT A (( B*,C) | D+)> et <! ELEMENT A ( B*, (C| D+)) >
OUI NON
Si NON, pourquoi ?
1pt
Non pour tous, sauf le 2eme
<A>….._ _ _ _
_____
Lettres initiales du Prénom et du Nom: page 6
0,5pt
<A><B/><B/></A> ou <A><D/><B/></A>
Si non pourquoi ?:
0,5pt
oui
<A><B/><D/><C><B/><D/></C><B/><B/><B/></A>
Si non pourquoi ?:
0,5pt
Non, on ne peut pas avoir 3 B de suite après le C
<A><B/><C><B/></C><D/><C><B/></C><B/><D/><C><B/><D/></C></A>
Si non pourquoi ?:
0,5pt
Non, il y a un D en trop avant le dernier C
On considère le schéma SQL3 suivant décrivant des jeux de tirage (loto, euro million, ...). Lire la 1ère colonne
puis la 2ème.
create type Cases as table of Number(2); create type Joueur as object (
/ prenom Varchar2(30), // le prénom est unique
create type Ticket as object ( achat Tickets
jeu Varchar2(30), );
combinaison Cases, /
jour Date, // la date du ticket ex. ’13-6-2014’ // Asso est un organisme (culturel, sportif, autre ...)
prix Number // le prix de vente create type Asso as object (
); nom Varchar2(30),
/ ville Varchar2(30)) not final;
create type Tickets as table of Ticket; /
/
Lettres initiales du Prénom et du Nom: page 7
1) A partir du type Asso, définir le type plus spécifique Club ayant plusieurs adhérents. Un joueur adhère à un
Club en se faisant parrainer par un joueur. On connait la date et le parrain pour chaque adhésion. Un joueur peut
adhérer à aucun ou plusieurs clubs. On connait le nom et la ville d’un club. Utiliser les termes de l’énoncé
autant que possible.
CREATE _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
2) Compléter la définition des tables LesJoueurs et LesClubs stockant les joueurs et les clubs respectivement.
INSERT INTO _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ __ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
Lettres initiales du Prénom et du Nom: page 8
_ _ _ _ _ _ __ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
3b) Alan a aussi joué à l’EuroM le 14-12-2013 la combinaison (5,7,9,13,17) pour 5 euros. Ecrire cela en SQL3.
INSERT INTO _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _
_ _ _ _ _ _ _
VALUES ( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _
)
insert into table(select j.achat
from LesJoueurs j
where j.prenom='Alan')
values(Ticket('euroM', Cases(3,4,5,6,7,8), '28-10-2014', 12));
4a) En SQL3 : Quel est le prix total dépensé par Bob pour acheter ses tickets ?
Select _ _ _ _ _ _
From _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
Where _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _
select sum(t.prix)
from LesJoueurs j, table(j.achat) t
where j.prenom ='Bob'
;
4b) En SQL3 : Lister, dans l’ordre croissant, tous les numéros déjà joués par Carole sur des tickets à 2 euros.
Select _ _ _ _ _ _
From _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
Where _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _
5) On complète le schéma avec le type Stat représentant des statistiques d’utilisation des numéros.
create type Stat as object (
numero Number(2), // un numéro déjà joué
nbusage Number(3)); // le nombre de fois que le numéro a été joué
/
En SQL3, lister les numéros déjà joués au Loto, avec pour chacun leur nombre d’utilisations. Le résultat de la
requête doit être une liste d’objets Stat. Trier la liste par ordre décroissant du nombre d’utilisation.
Select _ _ _ _ _ _
From _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
Where _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _
_ _ _ _ _ _ into resultat
FROM _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
return resultat;
end;
create or replace type body Joueur as
member function mesStat return EnsStat is
resultat EnsStat;
begin
select Stat(value(c), count(*))
bulk collect into resultat
from table(self.achat) a, table(a.combinaison) c
group by value(c)
-- order by count(*) desc // ne pas trier
;
return resultat;
end;
Lettres initiales du Prénom et du Nom: page 10
end;
7) Afficher les statistiques d’utilisation de chaque Joueur. Le résultat de la requête doit être une liste contenant
des couples dont le type est (prenom Varchar2, e EnsStat).
SELECT _ _ _ _ _ _ _ _ _ _ _
FROM _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _
8) On suppose que chaque joueur a un seul numéro favori (c’est le numéro qu’il a joué le plus souvent).
Afficher le numéro favori de chaque joueur. Le résultat de la requête doit être une liste contenant des couples
dont le type est (prenom Varchar2, favori Number).
SELECT _ _ _ _ _ _ _ _
FROM _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
WHERE _ _ _ _ _ _ _ _ (SELECT _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ FROM _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ into resultat
FROM _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
return resultat;
Lettres initiales du Prénom et du Nom: page 11
end;
create or replace type body Club as
member function statAdherents return EnsStat is
resultat EnsStat
begin
Question 3. On considère le schéma XML ci-dessous. Ce schéma est-il satisfait par exactement le même ensemble
de documents XML qui sont conformes à la DTD Etudiants de la question 2 ? Si la réponse est NON, expliquez
pourquoi.
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="Etudiants">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Etudiant">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Post" type="xsd:string"/>
<xsd:element name="Amis">
Lettres initiales du Prénom et du Nom: page 2
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Ami">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Nom" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
<xsd:attribute name="Name" type="xsd:string" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
Rép : Non, dans la DTD on peut avoir plusieurs éléments Etudiant dans Etudiants (Etudiant +), alors que dans le
schéma, on a maxoccurs = 1 par défaut..
price.xml
<prices>
<priceList effDate="2004-11-15">
<prod num="557">
Lettres initiales du Prénom et du Nom: page 3
<price currency="USD">29.99</price>
<discount type="CLR">10.00</discount>
</prod>
<prod num="563">
<price currency="USD">69.99</price>
</prod>
<prod num="443">
<price currency="USD">39.99</price>
<discount type="CLR">3.99</discount>
</prod>
<prod num="784">
<price currency="USD">25.99</price>
</prod>
</priceList>
</prices>
ord.xml
<order num="00299432" date="2004-09-15" cust="0221A">
<item dept="WMN" num="557" quantity="1" color="beige"/>
<item dept="ACC" num="563" quantity="1"/>
<item dept="ACC" num="443" quantity="2"/>
<item dept="MEN" num="784" quantity="1" color="blue/white"/>
<item dept="MEN" num="784" quantity="1" color="blue/red"/>
<item dept="WMN" num="557" quantity="1" color="sage"/>
</order>
A. XPATH (4 pts)
A.1) Evaluer les expressions XPATH suivantes sur les documents et donner le résultat obtenu.
document("ord.xml")//order/*[exists(@color)]/@*
Retourne uniquement les attributs des éléments « item » (nœud fils de order) qui au moins un attribut « color »
dept="WMN" num="557" quantity="1" color="beige"
dept="MEN" num="784" quantity="1" color="blue/white"
dept="MEN" num="784" quantity="1" color="blue/red"
dept="WMN" num="557" quantity="1" color="sage"
document("cat.xml")//product[* except (number | name) ]/@dept
Retourne les départements des produits ayant au moins un élément autre que number et name
dept="WMN" dept="MEN"
document("cat.xml")//product[position() mod 2 = 0]/number
Remarque: l’opérateur mod calcule le modulo.
Retourne uniquement le numéro des produits qui se trouvent en positions paires 2ème 4ème etc.
<number>563</number><number>784</number>
document("cat.xml")//colorChoices/parent::*[child::desc]/name
Retourne le nom des produits pères de colorchoices qui un fils « desc ».
<name language="en">Rugby Shirt</name>
A.2) Exprimer avec une seule expression XPATH les requêtes suivantes :
Parmi les produits du département ACC ayant leur numéro inférieur à 700, sélectionner uniquement le deuxième
produit.
doc("cat.xml")//product[number < 700 and @dept = "ACC"][2]
Lettres initiales du Prénom et du Nom: page 4
Les noms des produits du catalogue qui précèdent le produit numéro 443 (ses précédents frères).
document("cat.xml")//product/preceding-sibling::*[number=443]/name
Les prix des produits du catalogue ayant au moins un choix de couleur ‘bleu’.
doc("price.xml")//prod[@num=(doc("cat.xml")//product[contains(colorChoices,"blue")]/number)] /price
B. XQUERY (6 pts)
Ecrire les requêtes XQUERY permettant d’obtenir les informations suivantes :
1) Les noms des produits du département ACC triés suivant leurs noms. Le résultat de la requête doit être formaté
comme suit :
<ul type="square">
<li>Golf Umbrella</li>
<li>Ten-Gallon Hat</li>
</ul>
<ul type="square">
{
for $product in doc("cat.xml")/catalog/product
where $product/@dept='ACC'
order by $product/name
return <li>{data($product/name)}</li>
}
</ul>
2) Les différents numéros des produits. Les numéros des produits du département ACC sont encadrés par <acc>
</acc> et les autres par <other></other>. Le résultat de la requête doit être :
<results>
<other>557</other>
<acc>563</acc>
<acc>443</acc>
<other>784</other>
</results>
<results>
{
for $prod in (doc("cat.xml")/catalog/product)
return if ($prod/@dept = 'ACC')
then <acc>{data($prod/number)}</acc>
else <other>{data($prod/number)}</other>
}
</results>
3) Le numéro et le nom du produit le moins cher. Le résultat de la requête doit être :
<result> <product num="784" name="Rugby Shirt" minprice="25.99"/> </result>
<order>
{
let $prices:=document("price.xml")//prod/price
let $m:=min($prices)
for $np in document("price.xml")//prod[price=$m]/@num,
$pr in document("cat.xml")//product[number=$np]
return <product num="{$np}" name="{$pr/name}" minprice="{$m}" />
}
</order>
4) Les noms des produits du département “ACC” ou “WMN” dont le numéro de produit est supérieur à 100, ayant
au moins une couleur et dont le nom commence par la lettre L. Le résultat de la requête doit être :
<result> <name language="en">Linen Shirt</name> </result>
<result>
Lettres initiales du Prénom et du Nom: page 5
{
for $prod in document("cat.xml")//product
let $prodDept := $prod/@dept
where
$prod/number > 100 and
starts-with($prod/name, "L") and
exists($prod/colorChoices) and
($prodDept="ACC" or $prodDept="WMN")
return $prod/name
}
</result>
5) Le numéro, le nom, le prix de chacun des articles vendus et la quantité totale de ces articles regroupés par leur
numéro. Le résultat doit être trié par numéro croissant. Le résultat de la requête doit être :
<order>
<item num="443" name="Golf Umbrella" price="39.99" qte="2" />
<item num="557" name="Linen Shirt" price="29.99" qte="2" />
<item num="563" name="Ten-Gallon Hat" price="69.99" qte="1" />
<item num="784" name="Rugby Shirt" price="25.99" qte="2" />
</order>
<order>
{
for $item in distinct-values(doc("ord.xml")//item/@num)
let $it:=doc("ord.xml")//item[@num=$item],
$product:=doc("cat.xml")//product[number=$item],
$price:=doc("price.xml")//prod[@num=$item]
order by $item
return
<item num="{$item}" name="{$product/name}"
qte="{sum($it/@quantity)}"
price="{$price/price}"/>
}
</order>
Le numéro, le prix unitaire, la quantité, la remise et le prix total des articles vendus par chaque département (totalPrice=[qte*
price]-discount).
<result>
Lettres initiales du Prénom et du Nom: page 6
<department code="ACC">
<item num="443" price="39.99 " qte="2 " discount="3.99" totalPrice="75.99"/>
<item num="563" price="69.99 " qte="1 " discount="0" totalPrice="69.99"/>
</department>
<department code="MEN">
<item num="784" price="25.99 " qte="2 " discount="0" totalPrice="51.98"/>
</department>
<department code="WMN">
<item num="557" price="29.99 " qte="2 " discount="10" totalPrice="49.98"/>
</department>
</result>
Le document sport.xsd est le schéma XML du document sport.xml. On donne une trame partielle du schéma
sport.xsd :
<?xml version="1.0" encoding="ISO-8859-1"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="sport">
Lettres initiales du Prénom et du Nom: page 7
<xs:complexType>
<xs:sequence>
<xs:element name="foot">
...
</xs:element>
...
</xs:sequence>
</xs:complexType>
...
</xs:element>
...
</xs:schema>
Question 1. On veut définir une contrainte pour vérifier qu’une équipe jouant un match de la coupe de foot est bien
recensée dans l’annuaire comme étant une équipe de foot. Par exemple, un match de foot entre PL et OM est
incohérent. Définir les éléments key et keyref exprimant cette contrainte et préciser quel est leur père.
Le plus petit ancêtre commun permettant d’atteindre les équipes de l’annuaire et les
équipes jouant un match est l’élément sport.
Erreur à éviter : ne pas définir la clé dans l’élément foot, car ensuite on ne pourra
pas l’utiliser pour la keyref dans coupeFoot.
<xs:key name="cléFoot">
<xs:selector xpath="foot/p/e"/>
<xs:field xpath="."/>
</xs:key>
Question 2. Définir une contrainte pour vérifier l’unicité globale du nom d’une équipe recensée dans l’annuaire,
tous sports et tous pays confondus. Définir l’élément et préciser quel est son père.
L’element unique a pour père <xs:element name="sport">
<xs:unique name="equipeUnique">
<xs:selector xpath="*/p/e"/>
<xs:field xpath="."/>
</xs:unique>
Réponse erronnée
<xs:selector xpath=".//e"/>
Erreur car cela inclut à tort les éléments e des équipes jouant des matchs.
</xs:element>
Question 4. Définir le type typeEquipePoint de l’element e contenu dans l’élément match, de telle sorte que
l’élément e ait un attribut points dont la valeur est le nombre de points marqués par l’équipe pendant le match.
Exemple de contenu valide :
<match> <e points="0">TFC</e> <e points="3">OM</e> </match>
<xs:complexType name="typeEquipePoint">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="points" type="xs:string"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:element name="match">
<xs:complexType>
<xs:sequence>
<xs:element name="e" type="typeEquipePoint" minOccurs="2" maxOccurs="2">
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
Ecrivez en SQL3 l’instruction permettant d’insérer la conférence de titre ‘BD et Web’, qui a lieu à Lyon
en 2010, à laquelle Max participe, et qui contient l’article ‘art1’.
Insert into LesConferences values (‘BD et Web’, ‘Lyon’, 2010, ensPersonnes ((select ref(p) from LesPersonnes p
where p.nom=’Max’)), ensArticles((select ref(a) from LesArticles a where a.titre=’art1’)));
Question 3. Ecrivez l’instruction SQL3 qui permet d’insérer Léa comme auteur de l’article ‘art1’.
Insert into table (select a.auteurs from LesArticles a where a.titre=’art1’) values ((select ref(p) from lesPersonnes p
where p.nom=’Léa’));
Question 4. Ecrivez en SQL3 les requêtes suivantes :
1. Noms des participants à la conférence ‘BD et Web’.
select
select
Lettres initiales du Prénom et du Nom: page 3
select
Select value(a).nom
from LesConferences c, table(c.contient) cont, table(value(cont).auteurs) a
where value(a) not in (select value(p) from table(c.participants) p);
Auteurs EnsPersonnes,
Eval ensevaluation
);
Comme il s’agit d’un varray, on n’a pas besoin de modifier la table LesArticles en
ajoutant une nested table. Si ensevaluation est defini comme une table, il faut
aussi modifier la table en ajoutant une nested table.
Soit le schéma ODL d’une base pour gérer les utilisateurs d’un réseau social. Un internaute possède un mur sur
lequel il partage ses photos. Un internaute peut commenter les photos des autres internautes. Un internaute peut
voter pour (avis positif) ou contre (avis négatif) une photo. Une photo peut être associée avec les personnes qui
apparaissent en portrait sur la photo. Un internaute a des amis directs, toujours mutuels. Les amis indirects,
éloignés d’un chemin de longueur d, sont appelés les proches, cf. la méthode proches(d).
interface Personne { keys mail; interface Mur { extent Murs; keys id;
attribute string mail; attribute string id;
attribute string nom; attribute string nom;
attribute string prénom; relationship Internaute propriétaire inverse Internaute::mur;
relationship set<Photo> paraît_sur inverse Photo::portrait_de relationship set<Photo> contient inverse Photo::sur;
}; Photo meilleur_avis();
set<Photo> x() ;
};
interface Internaute : Personne { extent Internautes;
attribute string login;
attribute long age;
attribute string ville;
relationship set<Internaute> amis inverse Internaute::amis;
relationship Mur mur inverse Mur::propriétaire;
set<Internaute> proches(long d);
};
interface Photo { extent Photos; keys numéro; interface Commentaire { keys numéro;
attribute long numéro ; attribute long numéro;
attribute string nom; attribute string nom;
attribute long hauteur; attribute string texte;
attribute long largeur; relationship Internaute écrit_par;
attribute long avis_positifs ; relationship Photo sujet
attribute long avis_négatifs ; inverse Photo::commentaires;
relationship Mur sur inverse Mur::contient; };
relationship set<Personne> portrait_de inverse Personne::paraît_sur;
relationship set<Commentaire> commentaires inverse Commentaire::sujet;
};
Question 1. Compléter le schéma en ajoutant une relation inverse pour la relation écrit_par de l’interface
Commentaire.
Question 2. Dans cette question et les suivantes, on ignore la modification de schéma faite à la question 1. On
considère le schéma donné dans l’énoncé.
a) Combien de racines de persistance sont définies ?
3 racines Inernautes,Murs,Photos
b) La base peut-elle contenir des personnes qui ne sont pas des internautes ?
Oui, bien qu’il n’y ait pas de racine pour les Personnes,
il est possible d’atteindre toute les personnes qui apparaissent sur au moins une
photo.
select
from in
where
and
Select p.nom
From p in Photos
Where p.avis_positifs >5
And p.sur.propriétaire.mail= ‘123@etu.upmc.fr’
R2 : Afficher le mail des amis de l’internaute ayant mis une photo nommée ‘Tour Eiffel’ sur leur mur. Donner deux
réponses équivalentes, la première en utilisant la racine Internautes, la deuxième utilisant la racine Photos.
select
from i in Internautes
where
select
from p in Photos
where
Lettres initiales du Prénom et du Nom: page 6
Select a.mail
From i in Internautes, a in i.amis, p in i.mur.contient
Where p.nom = ‘Tour Eiffel’
Select a.mail
From p in Photos, a in p.sur.propriétaire.amis
Where p.nom = ‘Tour Eiffel’
R3: Afficher le nombre moyen de photos par mur. Rmq : la fonction avg() calcule la moyenne.
avg(select count(m.contient)
from m in Murs )
OU
OU
Select avg(count(partition))
From m in Murs, p in m.contient
Group by m
R4: Quels sont les internautes qui n’ont commenté aucune photos ?
select
from
where
Select
From i in Internautes
Where i not in (select p.écrit_par
From p in Photos, c in p.commentaires)
R5 : Quel est le format (hauteur et largeur) de toutes les photos partagées sur les murs des amis de Jean Dupont ?
Question 4
Ecrire le corps de la méthode top_commentaire() qui retourne la ou les photos ayant le plus grand nombre de
commentaires, parmi les photos mur en question.
Set<Photo> Mur::top_commentaire () {
}
Photo Mur::top_commentaire() {
return (select p
from p in this.contient
where count(p.commentaire) = (
select max(p1.commentaire)
from p1 in this.contient)
)
}
Question 5
a) Expliquer ce que retourne la méthode y() définie ci-dessous. Quel est l’inconvénient majeur de cette méthode ?
Lettres initiales du Prénom et du Nom: page 8
set<Photo> Mur::y() {
return (this.contient
union
select distinct p
from a in this.propriétaire.amis, p in a.mur.y());
}
La méthode y retourne les photos d’un mur d’un internaute et celles de ses amis
directs et indirects. Problème : fin de la récursion ?
b) Ecrire le corps de la méthode proches(d) qui retourne l’ensemble des amis (et amis d’amis par transitivité)
atteignables par un chemin de longueur inférieure ou égale à d. Remarque : si nécessaire vous pouvez utiliser une
instruction conditionnelle if then else endif.
set<Internaute> Internaute::proches(long d) {
}
Set<Internaute> Internaute::proche(int d)
if(d>1) then
Return ( this.amis
union
Select distinct b
From a in this.amis, b in a.proches(d-1)
)
Lettres initiales du Prénom et du Nom: page 9
Else
Return (this.amis)
End if;
Réponse :
Fermeture transitive de la relation : pi ‘ est sur la même photo que pj
On ajoute la méthode auxilliaire m() pour implémenter la relation « est sur la même
photo»
Set<Personne> Personne::m() {
return (select distinct pers
from ph in this.paraît_sur, pers in ph.portrait_de
}
// les personnes à visiter (moins celles qui ont déjà été visitées)
Set <Personne> à_visiter = select p
From p in m()
Where p not in visitées;
return à visiter
union (select distinct q
from p in à_visiter, q in p.e(visitées) )
}
Nom : Prénom : page 1 Lettres initiales du Prénom et du Nom: page 2
Insérez le pays Belgique, qui a Bruxelles comme capitale, qui a 10 000 000 habitants, et qui a une frontière
Create table LesVilles of T_Ville;
avec la France de 620 km de long.
Insert into LesVilles values(‘Paris’, NULL, 2000000);
Insert into LesVilles values (‘Lyon’, NULL, 500000);
Insert into LesVilles values (‘Bruxelles’, NULL, 1000000);
Question 2. Définir les tables LesPays et LesFederations permettant de stocker les instances de T_Pays et
T_Federation respectivement.
Lettres initiales du Prénom et du Nom: page 3 Lettres initiales du Prénom et du Nom: page 4
4. Nom des pays qui ont plus de 3 villes de plus de 100 000 habitants (on considère que la capitale est comprise
dans la liste des villes principales)
select
R2 : Quels sont les internautes qui ont commenté au moins une photo d’un de leurs amis ? Afficher le login des
internautes en question. Donner deux réponses équivalentes, la première en utilisant la racine Internautes, la
from deuxième utilisant la racine Photos.
where select
from i in Internautes
where
Lettres initiales du Prénom et du Nom: page 5 Lettres initiales du Prénom et du Nom: page 6
select
from p in Photos
where
R3 : Pour chaque internaute, combien a-t-il d’amis? Afficher le login de l’internaute et son nombre d’amis.
b) Ecrire le corps de la méthode proches(d) qui retourne l’ensemble des amis (et amis d’amis par transitivité)
atteignables par un chemin de longueur inférieure ou égale à d. Remarque : si nécessaire vous pouvez utiliser une
instruction conditionnelle if then else endif.
set<Internaute> Internaute::proches(long d) {
R4 : Quel est le format (hauteur et largeur) de toutes les photos partagées sur les murs des amis de Robin Débois ?
Question 2
Ecrire le corps de la méthode meilleur_avis() qui retourne la photo ayant le plus grand score, parmi les photos dudit
mur. Le score d’une photo est calculé avec la formule : score = avis_positifs – avis_négatifs.
Photo Mur::meilleur_avis() { }
c) Etant donné une personne A, on veut déterminer l’ensemble E des personnes qui apparaissent soit sur la même
photo que A, soit sur la même photo que quelqu’un appartenant à E. Expliquer brièvement comment obtenir E.
Question 3
a) Expliquer ce que retourne la méthode x() définie ci-dessous. Quel est l’inconvénient majeur de cette méthode ?
set<Photo> Mur::x() {
return (this.contient
union
select distinct p
from a in this.propriétaire.amis, p in a.mur.x());
}
Nom : Prénom : page 1
2. Les pays frontaliers de la France avec, pour chacun, le nombre de pays voisins (0,5pt)
3. Combien de gens dans le monde ont le français pour langue officielle ? (0,5pt)
select e.continent
from country c, encompasses e
where e.country=c.code
group by e.continent
having SUM(c.population)/SUM(c.area) > 30 ;
7. Couples de pays voisins partageant au moins une langue à plus de 30% (1pt)
On souhaite migrer cette base vers le relationnel-objet. Dans ce nouveau schéma, les données sont
stockées dans 4 tables (TheContinents, TheCountries, TheProvinces, TheCities) uniquement. Aucune
autre table ne doit être créée.
Définissez en SQL3 les types et les tables permettant cette migration, (en maximisant le partage d’objets
dès que possible). Toutes les informations du schéma relationnel doivent être conservées.
Lettres initiales du Prénom et du Nom: page 8
code number,
capital ref City,
prov ref Province,
Area number,
population number,
estdans EnsEncompasses,
frontieres EnsBorder);
/
create type Province as object (
name varchar2(30),
pays ref Country,
population number,
area number,
capital ref City );
/
create type City as object (
name varchar2(30),
pays ref Country,
prov ref Province,
population number,
longitude number,
latitude number);
/
create table TheContinents of Continent;
On suppose que la base contient deux personnes, Max Traide et Annie Malle, les villes de Clamecy et de
Paris ainsi que les maisons 20 rue du Bac à Paris et 36 rue Chaude à Clamecy.,
Question 1 (2 pts)
De nouvelles informations doivent être ajoutées à la base :
Max Traide et Annie Malle sont mariés. Ils ont un fils, Jean Traide, qui a 30 ans, et qui habite 20 rue du
Bac, à Paris 7ème.
Ecrivez les instructions SQL3 permettant d’intégrer ces informations à la base.
update LesPersonnes p
set p.conjoint = (select ref(i)
from LesPersonnes i where i.nom='Traide' and i.prenom='Max')
where p.nom='Malle' and p.prenom='Annie';
update LesPersonnes p
set p.conjoint = (select ref(i) from LesPersonnes i where i.nom='Malle' and
i.prenom='Annie')
where p.nom='Traide' and p.prenom='Max';
Question 2 (2 pts)
Ecrivez en SQL3 les requêtes suivantes :
date heure
Oeuvre Orchestre
Nom 1:N 1:N Chef
concert
Auteur
Genre
Durée
1:N
Musicien
Mus-id composition
Nom 1:1
Instrument
Question 1. Ecrire une DTD décrivant cette structure pour le fichier XML. L’élément racine est l’élément
Programme, et contient des Concerts. Les entités E/A (musicien, orchestre, œuvre) seront représentées
par des éléments. Les attributs E/A sont représentés par des attributs.
(1) <?xml version ="1.0" encoding="ISO-8859-1" ?>
(2)< !ELEMENT Programme (
(3)
(4)
(5)
(6)
(7)
(8)
(9)
(10)
(11)
(12)
(13)
(14)
Lettres initiales du Prénom et du Nom: page 2
(15)
(16)
(17)
(18)
(19)
(20)
(21)
(22)
(23)
(24)
Question 2. Exprimez (lorsque c’est possible) les contraintes suivantes sur la DTD. (Si la contrainte est
déjà exprimée dans votre DTD, indiquez le numéro de ligne qui la définit.
1. Un concert comprend au moins 2 et au plus 5 œuvres
< !ELEMENT concert (orchestre, (œuvre, œuvre, œuvre+, œuvre+, œuvre+, ))>
Lettres initiales du Prénom et du Nom: page 3
impossible
3. Le genre d’une œuvre est ‘concerto’, ‘symphonie’ ou ‘opéra’
Question 2. Définir l’élément concert, en représentant date et heure par des attributs. On utilisera le type
TypeOrchestre défini ci-dessous pour l’élément orchestre.
<xs :complexType name="TypeOrchestre ">
<xs:attribute name="chef" type="xs:string" use="required"/>
</xs:complexType>
Lettres initiales du Prénom et du Nom: page 7
2. Les pianistes jouent dans un et un seul orchestre. (On suppose que l’élément Orchestre a une clef
nommée cléorchestre dont la valeur est le nom du chef )
</sequence> ne suffit pas car rien ne dit que string est un orchestre.
1 point
//morceau[soliste][not(soliste[2])]/titre[contains(., "symphonie")]
2. Prénom des chefs d’orchestre ayant dirigé le pianiste soliste "Raymond Charles " (le prénom est
Raymond)
1 point
//morceau[soliste[instrument="piano" and prenom="Raymond" and nom="Charles"]]/chefdorchestre/prenom
3. Prénom des solistes ayant joué avec l’orchestre "OMPF" (Orchestre de Mélodicas de la Place des
Fêtes) sur un disque édité par Syno.
1 point
//CD[editeur="Syno"]/morceau[orchestre="OMPF"]/soliste/Prenom
4. Titre des CD où le pianiste Raymond Charles interprète plus de morceaux que l’OMPF.
1 point
//CD[count(morceau[soliste[nom= "Raymond" and prenom="Charles" and instrument ="piano"] ] )
> count(morceau[orchestre="OMPF"])]/titre
4.
5. Titre des CD comportant au moins un morceau dirigé par un chef d’orchestre plus jeune que la
moyenne des solistes du même morceau.
1 point
//CD[morceau[avg(soliste/age) > chefdorchestre/age]]/titre
Lettres initiales du Prénom et du Nom: page 12
<resultat>
<livre titre="Data on the Web">
<section id="intro" difficulty="easy">
Lettres initiales du Prénom et du Nom: page 13
<title>Introduction</title>
</section>
<section id="syntax" difficulty="medium">
<title>A Syntax For Data</title>
</section>
</livre>
</resultat>
1 point
<resultat>{
for $b in doc("book.xml")/book
return
<livre titre="{$b/title/text()}">
{
Lettres initiales du Prénom et du Nom: page 14
</livre>
}
</resultat>
2 .Liste des figures avec leur titre et leurs attributs et avec, pour chaque figure, la section où elle apparaît
Le résultat doit être :
<liste_figures>
<figure section="Web Data and the Two Cultures" height="400" width="400">
<title>Traditional client/server architecture</title>
</figure>
<figure section="A Syntax For Data" height="200" width="500">
<title>Graph representations of structures</title>
</figure>
<figure section="Representing Relational Databases" height="250" width="400">
<title>Examples of Relations</title>
</figure>
</liste_figures>
Lettres initiales du Prénom et du Nom: page 15
1 point
<liste_figures>
{
for $f in doc("book.xml")//figure
return
<figure section="{$f/../title}">
{ $f/@* }
{ $f/title }
</figure>
}
</liste_figures>
<resultat>
<nb_sections_niveau1>2</nb_sections_niveau1>
<nb_sections_niveau2>5</nb_sections_niveau2>
<nb_sections_total>7</nb_sections_total>
</resultat>
1 point
<resultat>
<nb_sections_niveau1>
{
count(doc("book.xml")/book/section)
}
</nb_sections_niveau1>
<nb_sections_niveau2>
{
count(doc("book.xml")/book/section/section)
}
</nb_sections_niveau2>
<nb_sections_total>
Lettres initiales du Prénom et du Nom: page 16
{
count(doc("book.xml")//section)
}
</nb_sections_total>
</resultat>
4. Pour chaque section de niveau 1, donner la hauteur moyenne des figures et la liste des figures dont la
hauteur est supérieure ou égale à cette moyenne. La liste des sections doit apparaître dans l’ordre
croissante de la hauteur moyenne.
On obtient le résultat suivant :
<resultat>
<section title="A Syntax For Data" hauteurmoy="225">
<figure_haute title="Examples of Relations" hauteur="250"/>
</section>
<section title="Introduction" hauteurmoy="400">
<figure_haute title="Traditional client/server architecture" hauteur="400"/>
</section>
</resultat>
1 point
resultat>
{
Lettres initiales du Prénom et du Nom: page 17
for $s in doc("book.xml")/book/section
let $hm := avg($s//figure/@height)
order by $hm
return
<section title="{ $s/title/text() }" hauteurmoy="{ $hm }">
{for $f in $s//figure[@height>=$hm]
return
<figure_haute title="{ $f/title/text() }" hauteur="{$f/@height}"/>
}
</section>
}
</resultat>
5. Pour chaque livre, donner la liste des auteurs sous forme d’attribut de type string, et, pour chaque
section (niveau 2 imbriqué dans niveau 1), donner la taille (surface) occupée par la section, calculée à
partir de ses éléments. La taille d’un élément <p> vaut 3000, tout comme la taille d’un élément <title>. La
taille d’une figure est donnée par ses dimensions.
On obtient le résultat suivant :
<resultat>
<livre titre="Data on the Web" auteurs="Serge Abiteboul Peter Buneman Dan Suciu">
<section_niv1 titre="Introduction" taille="184000">
<section_niv2 titre="Audience" taille="6000"/>
<section_niv2 titre="Web Data and the Two Cultures" taille="172000"/>
</section_niv1>
<section_niv1 titre="A Syntax For Data" taille="233000">
<section_niv2 titre="Base Types" taille="6000"/>
<section_niv2 titre="Representing Relational Databases" taille="109000"/>
<section_niv2 titre="Representing Object Databases" taille="6000"/>
</section_niv1>
</livre>
</resultat>
Lettres initiales du Prénom et du Nom: page 18
1 point
<resultat>
{
for $b in doc("book.xml")/book
return
<livre titre="{$b/title}" auteurs="{$b/author/text()}">
{for $s in $b/section
let $taille := sum($s//figure/(@height * @width))
let $taille2 := 3000*count($s//(p|title))
return
<section_niv1 titre="{$s/title}" taille="{$taille+$taille2}" >
{for $ss in $s/section
let $sstaille := sum($ss//figure/(@height * @width))
let $sstaille2 := 3000*count($ss//(p|title))
return
<section_niv2 titre="{$ss/title}" taille="{$sstaille+$sstaille2}" />
}
</section_niv1>
}
</livre>
}
</resultat>
Nom : Prénom : page 1
Question 2. Pour chacune des contraintes suivantes, indiquez la ligne à modifier et les modifications à faire pour
exprimer la contrainte (si c’est possible).
a) Le système comprend au maximum deux machines
Lettres initiales du Prénom et du Nom: page 2
Ligne à modifier :
Modifications :
Ligne à modifier : 2
Modif : < !ELEMENT Planification(Machine|(Machine ?)|(Tache)*)>
b) Le numéro d’une tâche est un entier dans l’intervalle [1, 100]
Ligne à modifier :
Modifications :
Pas possible, ou alors énumérer toutes les valeurs (ce qui devient problématique à partir d’une certaine
taille)
c) Une tâche est réalisée par une et une seule machine
Ligne à modifier :
Modifications :
Ligne à modifier : 6
Modif : Est-realisee-par IDREF #REQUIRED (IDREF doit être au singulier + required)
d) Le numéro d’une machine est unique et obligatoire
Ligne à modifier :
Modifications :
Ligne à modifier : 4
Modif : < !ATTLIST Machine numero ID #REQUIRED
e) Le champ description d’une machine est une chaîne de caractères de longueur 50.
Ligne à modifier :
Modifications :
Modif : pas possible
f) Une tâche précède une ou plusieurs tâches
Ligne à modifier :
Modifications :
Ligne à modifier : 6
Modif : précède IDREFS #REQUIRED (Mettre IDREFS au pluriel et required)
Question 3. On souhaite maintenant modéliser cette application en XSchema.
3.1 Définir en Xschema, l’élément machine.
<xs:element name="machine"……
<xs:element name="machine">
<xs:complexType>
<xs:attribute name="numero" type="xs:integer" use="required"/>
<xs:attribute name="description" type="xs:string" use="optional"/>
<xs:attribute name="realise" type="xs:integer" use="optional"/>
Lettres initiales du Prénom et du Nom: page 3
</xs:complexType>
</xs:element>
<xs:element name="tache"/>
<xs:complexType>
<xs:attribute name="numero" type="xs:integer" use="required"/>
<xs:attribute name="duree" type="xs:integer" use="optional"/>
<xs:attribute name="precede" type="xs:integer" use="optional"/>
<xs:attribute name="est-realisee-par" type="xs:integer" use="required"/>
<xs:attribute name="est-precedee-par" type="xs:integer" use="optional"/>
</xs:complexType>
</xs:element>
3.3. En utilisant ces deux définitions, complétez la description du schéma ci-dessous. Pour la lisibilité de
la suite, pensez à numéroter les lignes.
1.<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.planification.org"
xmlns= "http://www.planification.org"
elementFormDefault="qualified">………………….
2.<xs:element name= "planification" ……………
3. <xs:complexType ………….
4. <xs:…………………….
5..
< /xs:complexType>
</xs:schema>
1. <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.planification.org"
xmlns= "http://www.planification.org"
elementFormDefault="qualified">
</xs:schema>
Question 4. Exprimez chacune des contraintes suivantes, en indiquant, s’il y a lieu, ce qu’il faut modifier,
et le numéro de ligne où insérer la contrainte.
a) Le système comprend au maximum deux machines
Modifications :
Lettres initiales du Prénom et du Nom: page 4
Contrainte :
Ligne où insérer la contrainte :
Ligne à modifier : 5
Modif : <xs:element ref="machine" minOccurs="0" maxOccurs="2"/>
b) Le numéro d’une tâche est un entier dans l’intervalle [1, 100]
Modifications :
Contrainte :
Ligne où insérer la contrainte :
Ligne à modifier : 10
Modif :
<xs:attribute name="numero" use="required">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minInclusive value="1"/>
<xs:maxInclusive value="100"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
c) L’attribut numéro est un identifiant unique pour les éléments machine et tache.
Modifications :
Contrainte :
Ligne où insérer la contrainte :
<xs:key name="cléMachine">
<xs:selector xpath="machine">
<xs:field xpath="@numero">
</xs:key>
xs:key name="cléTache">
<xs:selector xpath="tache">
<xs:field xpath="@numero">
d) Une tâche est réalisée par une et une seule machine
Modifications :
Contrainte :
Ligne où insérer la contrainte :
Plusieurs solutions : mettre type = IDREF use=required
On peut aussi modifier la ligne 10. Supprimer l’attribut Est-réalisé par et mettre :
10.<xs:element name="tache"/>
<xs:complexType>
<xs:sequence minOccurs="0" maxOccurs="1">
<xs:element name=est-realisé-par type=xs:integer/>
</xs:sequence>
<xs:attribute name="numero" type="xs:integer" use="required"/>
<xs:attribute name="duree" type="xs:integer" use="optional"/>
<xs:attribute name="precede" type="xs:integer" use="optional"/>
<xs:attribute name="est-precedee-par" type="xs:integer" use="optional"/>
</xs:complexType>
</xs:element>
Lettres initiales du Prénom et du Nom: page 5
e) Le champ description d’une machine est une chaîne de caractères de longueur 50.
Modifications :
Contrainte:
Ligne où insérer la contrainte :
Ligne à modifier : élément machine
Modif :
<xs:attribute name="description" use="optional">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:length value="50"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:complexType name="TypeTacheInitiale">
<xs:attribute name="numero" type="xs:integer" use="required"/>
<xs:attribute name="duree" type="xs:integer" use="optional"/>
<xs:attribute name="precede" type="xs:integer" use="optional"/>
<xs:attribute name="est-realisee-par" type="xs:integer" use="required"/>
</xs:complexType>
Une ville est désignée par un nom (identifiant), un certain nombre d'habitants, et peut contenir plusieurs
établissements de bières. Chaque établissement est désigné par un nom (identifiant), un horaire d'ouverture, un
numéro de téléphone, et propose une sélection de bières. On distingue deux types d'établissements: les magasins, et
les bars.
- Les magasins proposent des bières à l'achat, et sont caractérisés par une surface.
- Les bars proposent des bières à la consommation (sur place), et disposent d'une certaine capacité d'accueil.
Chaque bière est identifiée par une marque et un type, et est caractérisée par un prix, un fabriquant, un pays de
fabrication, et est consommée par un certain nombre de consommateurs. Un consommateur est caractérisé par un id
(identifiant), un nom, un numéro de téléphone, un âge, une ville de résidence, et peut consommer une variété de
bières en les achetant dans différents magasins ou en les consommant sur place dans différents bars.
nom horaire
Racine de
Persistance
Établissements
Établissement
est_un
capacité
Bar
est_fréquenté_par
Consommateurs
Consommateur
fréquente
nom tél
Id_cons
Lettres initiales du Prénom et du Nom: page 7
Réponse : nbr_habitants
nom nom horaire
Racine de
Villes Persistance
est_situé_dans Établissements
Ville Établissement
contient
a_comme_résident propose
est_un est_un
marque
surface proposée_par capacité
type
Magasin Bière
Bar
a_comme_client consomme
Bières fabriquant fréquenté_par
pays
Consommateurs
consommée_par
client_de
Consommateur
fréquente
réside_dans
interface Bar : Établissement // " : " définit le lien d'héritage entre Bar et Établissement
{ attribute integer capacité;
relationship set<Consommateur> est_fréquenté_par
inverse Consommateur::fréquente;
}
interface Consommateur
(extent Consommateurs key Id)
{ attribute string Id;
attribute string nom;
attribute string adresse;
attribute string tél;
attribute integer âge;
relationship set<Bar> fréquente
inverse Bar::est_fréquenté_par;
}
Réponse:
SELECT E.nom
FROM E
IN Etablissements
WHERE E → est_un_Bar() AND COUNT (SELECT C
FROM C
IN E.fréquenté_par
WHERE C.âge < 25) > 100;
R2. Trouver le nom des bars dont tous les clients (consommateurs) ont moins de 25 ans.
Réponse:
IN Etablissements
WHERE E → est_un_Bar() AND NOT EXISTS C IN E.est_fréquenté : C.âge >= 25;
Bar Consommateur
nom Id_cons
tél 1:n 1:1
fréquente nom
horaire tél
capacité âge
1:n
consomme
consommée_par
1:n
Bière
marque
type
fabriquant
pays
prix
Question 1. Traduire en SQL3 le schéma entité-association ci-dessus en implémentant les associations dans le sens
désigné par les flèches noires.
Question 2. Créer les tables nécessaires au stockage des objets Bar, Bière, et consommateur.
R1. Trouver le nom des bars ayant plus de 100 clients (consommateurs) de moins de 25 ans.
Select C.fréquente.nom
From LesConsommateurs C
Where C.âge < 25
Group by C.fréquente
Having count(*) >= 100;
R2. Trouver le nom des consommateurs qui ont consommé au moins une fois la bière de la marque Chimay.
Réponse:
Select C.nom
From LesConsommateurs C, table (C.consomme) B
Where B.ptr.marque = "Chimay";
Lettres initiales du Prénom et du Nom: page 14
0.75 point
//personne[pere/@idref=//personne[pere/@idref=//personne[nom='Rao'
and prenom='Pierre']/@id]/@id or mere/@idref=//personne[pere/@idref=//personne[nom='Rao'
and prenom='Pierre']/@id]/@id]
2. Nom des personnes dont le père s’est marié le 12 février 1975. Résultat : Ehle, Lettra.
0.75 point
//personne[//famille[mariage/date='12 fevrier 1975']/epoux/@idref=pere/@idref]
3. Prénom des célibataires. Résultat : Lucie, Louis, Marie.
0.75 point
//personne[not(conjoint)]/prenom
Lettres initiales du Prénom et du Nom: page 16
0.75 point
//personne[pere/@idref=//personne[nom='Daile' and
prenom='Lucie']/pere/@idref and mere/@idref=//personne[nom='Daile' and
prenom='Lucie']/mere/@idref and @genre='f' and @id!=//personne[nom='Daile' and
prenom='Lucie']/@id]/age
1. Donner, lorsque c’est possible, la liste des hommes (nom et prénom) et la différence d’âge avec leur
père. Le résultat doit être :
<root>
<Personne>
<nom>Daile</nom>
<prenom>Louis</prenom>
<diff-age>26</diff-age>
</Personne>
</root>
Lettres initiales du Prénom et du Nom: page 17
1 point
<root>
{ for $p in document("family.xml")//personne[@genre='m']
let $nomp:=$p/nom
let $prenomp:=$p/prenom
let $pere:=document("family.xml")//personne[@id=$p/pere/@idref]
where exists($pere)
return
<Personne>
{$nomp}
{$prenomp}
<diff-age>
{$pere/age - $p/age}
</diff-age>
</Personne>}
</root>
2 .Donner la liste des hommes (nom et prénom), avec, s’il existe, le prénom du père.
Le résultat doit être :
<root>
<Personne><nom>Rao</nom><prenom>Pierre</prenom></Personne>
<Personne><nom>Daile</nom><prenom>Fernand</prenom></Personne>
<Personne><nom>Lettra</nom><prenom>Jean</prenom></Personne>
<Personne>
<nom>Daile</nom>
Lettres initiales du Prénom et du Nom: page 18
<prenom>Louis</prenom>
<prenompere>Fernand</prenompere>
</Personne>
</root>
1 point
<root>
{ for $p in document("family.xml")//personne[@genre='m']
let $nomp:=$p/nom
let $prenomp:=$p/prenom
let $pere:=document("family.xml")//personne[@id=$p/pere/@idref]
return
<Personne>
{$nomp}
{$prenomp}
{if ($pere) then
<prenompere>
{$pere/prenom/text()}
</prenompere>
else () }
</Personne>}
</root>
4. Donner la moyenne d’âge des gendres (maris des filles) de Pierre Rao.
On obtient le résultat suivant : <root>31</root>
Lettres initiales du Prénom et du Nom: page 19
1 point
<root>
{ let $pr:=document("family.xml")//personne[nom='Rao' and prenom='Pierre']
let $fpr:=document("family.xml")//personne[pere/@idref=$pr/@id and @genre='f']
let $gpr:=document("family.xml")//personne[conjoint/@idref=$fpr/@id and @genre='m']
return avg($gpr/age)
}
</root>
Nom : Prénom : page 1
L'institut est formé de trois centres de recherche situés dans trois régions Françaises : Paris, Lille, et
Grenoble. Chaque centre est formé de plusieurs laboratoires. En supposant que la base de données de
l'institut est répartie sur trois sites informatiques correspondant aux centres de Paris, de Lille, et de
Grenoble, proposer une bonne décomposition de la base sur ces trois sites en se basant sur les hypothèses
suivantes.
- Chaque centre gère ses propres données.
- L'attribut région de LABORATOIRE prend une des valeurs suivantes: "Paris", "Lille", "Grenoble".
- L'attribut spécialité de CHERCHEUR prend une des valeurs suivantes : "Virologie", "Parasitologie",
"Neuroscience", "Microbiologie", "Epidémiologie", "Génétique", " Immunologie".
- codeL (resp. #chercheur, codeP) est clé primaire de LABORATOIRE (resp. CHERCHEUR, PROJET).
- Le chef d'un projet et le directeur d'un laboratoire sont des chercheurs désignés par leurs numéros.
- Chaque chercheur est rattaché à un laboratoire donné, et peut participer à plusieurs projets de son
laboratoire.
Question 1
Lettres initiales du Prénom et du Nom: page 2
Donner la définition des différents fragments en utilisant les opérateurs de l’algèbre relationnelle.
Réponse:
Question 2
Dans cette question, le centre de la région Parisienne tient également lieu de siège pour l'institut. Afin de
séparer les données scientifiques des données administratives, supposons maintenant que la relation
CHERCHEUR est répartie sur les trois sites informatiques de Paris, de Lille, et de Grenoble comme suit:
Proposez un plan d'exécution réparti de la requête permettant de retrouver, pour chaque laboratoire, le
revenu le plus élevé (salaire + prime) d'un chef de projet du laboratoire. On suppose que la requête est
émise par le siège de l'institut. Le plan proposé doit optimiser le coût de communication inter sites.
Réponse:
Soit R1 la sous-requête suivante:
SELECT #chercheur, C.codeL
FROM CHERCHEUR_SC C, PROJET P
WHERE #chercheur = chef;
( SELECT *
FROM TParis ) UNION
( SELECT *
Lettres initiales du Prénom et du Nom: page 3
L’objectif de cet exercice est d’étudier les fichiers XMLSchema.dtd et XMLSchema.xsd, qui décrivent les
éléments de XMLSchema.
Question 1. (2pts)
On demande d’écrire la DTD des éléments xs:key et xs :keyref de XMLSchema.
On pourra utiliser l’entité %XPathExpr ; , qui décrit l’ensemble des expressions XPath, pour définir les
expressions XPath. On suppose cette entité déjà définie.
Réponse :
Question2 (2pts)
Soit la DTD suivante, décrivant l’élément xs :attribute de XMLSchema.
Réponse :
<xs:complexType name="TypeAttribute">
<xs:complexContent>
<xs:sequence>
<xs:element name="simpleType" minOccurs="0" type="xs:localSimpleType"/>
</xs:sequence>
<xs:attribute name="type" type="xs:string"/>
<xs:attribute name="use" use="optional" default="optional">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="prohibited"/>
<xs:enumeration value="optional"/>
<xs:enumeration value="required"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="default" type="xs:string"/>
<xs:attribute name="fixed" type="xs:string"/>
</xs:complexContent>
</xs:complexType>
Question 4. (1 pt)
Lettres initiales du Prénom et du Nom: page 5
Dans la définition de l’élément xs:element, les noms d’éléments utilisés comme valeur de l’attribut ref
doivent mentionner des éléments existants (c’est-à-dire la valeur de l’attribut name d’un autre élément
existant).
On demande de définir cette contrainte à l’aide de keyref, en se basant sur la contrainte de clé appelée
"element" définie ci dessous:
<xs:key name="element">
<xs:selector xpath="xs:element"/>
<xs:field xpath="@name"/>
</xs:key>
Réponse :
<langue pourcentage="74">Espagnol</langue>
<langue pourcentage="17">Catalan</langue>
<langue pourcentage="7">Galicien</langue>
<frontiere pays="p1"/>
</pays>
<pays n="p4" population="76" continent="c2">
<nom>Egypte</nom>
<langue>Arabe</langue>
</pays>
//pays[@continent=//continent[not(@nom=’europe’)]/langue
2. Nom des pays méditerranéens (ayant un accès à la mer Méditerranée)
//pays[@n=//mer[@nom=’Mer méditerrannée’]/situation/@pays
3. Nom des pays ayant des frontières avec plus de 3 autres pays.
Lettres initiales du Prénom et du Nom: page 7
//pays[count(frontiere)>3]/nom
4. Pays de plus de 40 millions d’habitants n’ayant pas de montagne de sommet supérieur à 2000.
//pays[@population>40][not(@n=//montagne[@altitude>2000]/situation/@pays)]
Question 2. Expliquer en une phrase en français ce que signifient les expressions XPath suivantes, et
donner le résultat de leur évaluation sur le document Atlas.xml.
1. //pays[population<80 and position()=2]/nom
Sélectionne tous les éléments pays qui ont une population inférieure à 80 et renvoie le 2eme.
Renvoie Espagne
1 . Donner les noms des pays qui sont voisins du pays d’identificateur p1 (n=’p1’).
Le résultat doit être :
<root>
Lettres initiales du Prénom et du Nom: page 8
<nom>Allemagne</nom>
<nom>Espagne</nom>
</root>
1 point
<root>
{ for $p in document("atlas.xml")//pays
where $p/frontiere/@pays='p1'
return $p/nom }
</root>
2. Donner les noms des pays dont toutes les langues sont parlées par au moins 2% de la population. Le
résultat doit être :
<root>
<nom>Espagne</nom>
</root>
1.25 point
<root>
{ for $p in document("atlas.xml")//pays
where every $l in $p/langue satisfies $l/@pourcentage > 2
return $p/nom
}
</root>
3. Donner, dans l’ordre alphabétique, tous les noms de continent, suivi chacun par les noms des pays
composant le continent, dans l’ordre alphabétique également. On obtient une hiérarchie à trois niveaux
suivante :
<monde>
<continent nom="Afrique">
<pays>Egypte</pays>
</continent>
<continent nom="Europe">
<pays>Allemagne</pays>
<pays>Espagne</pays>
<pays>France</pays>
</continent>
Lettres initiales du Prénom et du Nom: page 9
</monde>
1.25 point
<root>
{ for $c in document("atlas.xml")//continent
order by $c/@nom
return <continent>
{$c/@nom}
{ for $p in document("atlas.xml")//pays
where $p/@continent=$c/@n
order by $p/nom
return <pays> {$p/nom/text()} </pays>
}
</continent>
}
</root>
4. Donner tous les noms de montagne, suivi chacun par les noms des pays dans lesquels est située la
montagne. On obtient le résultat suivant :
<root>
<montagne nom="Alpes">
<pays>Allemagne</pays>
<pays>France</pays>
</montagne>
<montagne nom="Cévennes">
<pays>France</pays>
</montagne>
</root>
1.25 point
<root>
{ for $m in document("atlas.xml")//montagne
return <montagne>
{$m/@nom}
{ for $p in document("atlas.xml")//pays,
Lettres initiales du Prénom et du Nom: page 10
$s in $m/situation
where $s/@pays=$p/@n
return <pays> {$p/nom/text()} </pays>
}
</montagne>
}
</root>
1.25 point
<root>
{ for $c in document("atlas.xml")//continent
let $pops := document("atlas.xml")//pays[@continent=$c/@n]
return <continent>
{$c/@nom}
{count($pops/@population)}
}
</continent>
}
</root>
Nom : Prénom : page 1
1. ………..…
2………….…
3…………….
4…………….
…
Question 2.
a) Décrire au moins deux inconvénients du hachage statique par rapport au hachage dynamique.
Inconvénient 1:
Inconvénient 2:
b) Décrire un avantage et un inconvénient du hachage dynamique par rapport aux arbres B+.
Avantage:
Lettres initiales du Prénom et du Nom: page 2
Inconvénient:
25 29
13 15 25 29 33
Lettres initiales du Prénom et du Nom: page 3
26
29
26
26
25
25 31
31
15 2525 31 31
25 31
13 15 25 27 29 31 33
15 17 25 26 27 31 33
13 25 2725
13 15 15 17 26 33
31 27 31 33
13 15 25 26 27 31 33
25 31
13 15 25 29 31 33
Lettres initiales du Prénom et du Nom: page 4
Question 2.
Soit un fichier contenant des descriptions de produits selon le schéma relationnel suivant :
PRODUIT (NumP, NomP, TypeP, Qté, Prix)
Le fichier est placé sur disque par hachage statique multi-attributs sur les attributs NumP, NomP, et
TypeP. Le hachage permet de générer pour chaque tuple le numéro du paquet où le tuple sera stocké. On
suppose que la taille d'un paquet est celle d'un bloc disque. Le numéro des paquets est composé de
résultant de l'application d'une fonction de hachage à NumP, p2 bits résultant de l'application d'une
fonction de hachage à NomP, et p3 bits à TypeP, i.e.,
h1(NumP) b11b12b13…b1p1
h2 (NomP) b21b22b23…b2p2 => N°Paquet(tuple) = < b11b12b13…b1p1 / b21b22b23…b2p2 / b31b32b33…b3p3>
h3 (TypeP) b31b32b33…b3p3
P1 bits P2 bits P3 bits
NomP = 'Calculateur', et p3 bits sont fixés pour avoir les tuples tels que TypeP = 'T1'. Pour avoir tous les
tuples qui satisfont l'une OU l'autre des conditions => + b) Sachant que les fréquences d'interrogation
sur chaque attribut NumP, NomP, TypeP sont respectivement f1, f2, et f3, calculer le nombre de bits
optimal à allouer dans la composition du numéro de paquet pour NumP, NomP, et TypeP.
Lettres initiales du Prénom et du Nom: page 5
Classe Adresse {
Attribute number numero ;
Attribute string rue ;
Attribute string ville ;
}
R1. Nom et prénom des personnes ayant des petits-enfants habitant Lyon.
R3. Nom et prénom des enfants dont les parents n’habitent pas la même ville.
Question 2 (1pt). Parmi l’ensemble des activités, on souhaite distinguer les activités sportives, pour
lesquelles on indiquera la catégorie de la personne (poussin, benjamin, senior,…), et le jour de pratique
du sport. Modifier le schéma en conséquence.
Question 1
On considère la relation SOURCE (OWNER, NAME, TYPE, LINE, TEXT), décrivant le code source de
tous les objets stockés d’un utilisateur.
Les attributs de la relation sont décrits ci-dessous :
OWNER VARCHAR2(30) : propriétaire de l’objet.
NAME VARCHAR2(30) : nom de l’objet
TYPE VARCHAR2(12) : type de l’objet (PROCEDURE, PACKAGE, FUNCTION, PACKAGE
BODY, TRIGGER, TYPE, TYPE BODY )
Question 1. Ecrire la procédure Affiche (nom, ligne1, ligne2) pour afficher le morceau de code source
(ligne1 à ligne2) de la procédure dont le nom est passé en paramètre.
Create or replace procedure Affiche ……….
Question2. Donnez l’instruction permettant d’exécuter la procédure qui affiche le code source de la
fonction F1 de la ligne 1 à la ligne 10.
On considère une base de données dont le schéma Entité/Association est donné ci-dessous :
Lettres initiales du Prénom et du Nom: page 8
:
marié_à
numéro : nom
prenom
rue
Maison Habite Personne
age
: :
:
: :
: enfant_de
Située Contient
: :
Ville Pièce
On précise qu’une personne habite une maison (résidence principale) et peut éventuellement avoir une
(seule) résidence secondaire. Il n’y a pas de maison non habitée, ni de ville sans habitant, ni de
polygamie.
Compléter le schéma précédent en indiquant les cardinalités maximum:minimum dans les cadres prévus à
cet effet. On rappelle que les cardinalités s’expriment d’une entité vers une association, la flèche indique
le sens de lecture pour les associations réflexives.
Quelle contrainte d’intégrité sur un ou des attribut(s) de Personne est induite par l’association
enfant_de ? Répondre par une phrase en français.
Lettres initiales du Prénom et du Nom: page 9
Question 3 ( 2 points)
Compléter la série d’instruction SQL3 suivante pour créer le schéma d’une telle base de données. Vous
ne pouvez pas créer de type supplémentaire ni de table supplémentaire.
CREATE TYPE Personne;
CREATE TYPE Piece AS OBJECT(
…………………………………
…………………………………
………………………………… );
CREATE TYPE Ville AS OBJECT(
nom VARCHAR2(50),
codePostal VARCHAR2(5) );
rue VARCHAR2(30),
situé ……………………………………….,
contient ……………………………………. );
prénom …………………………………………………,
age …………………………………………………,
habite …………………………………………………,
Lettres initiales du Prénom et du Nom: page 10
marié_à …………………………………………………,
enfant_de ………………………………………………… );
Question 4 ( 5 points)
• Insérer dans la base le bébé Jean Peuhplu qui vient de naître, fils de Claude Peuhplu et Martine
Hique, et qui habite 3 rue du Soleil à Paris, 20ème.
Lettres initiales du Prénom et du Nom: page 11
• Pour fêter l’heureux événement, les parents de Jean Peuhplu décide de se marier. Mettez la base à
jour en conséquence.
Lettres initiales du Prénom et du Nom: page 12