Prolog et algèbre relationnelle


précédentsommairesuivant

3. Jointures

Pour illustrer cette section à propos des jointures, nous allons prendre comme exemple les ensembles et relations suivants :

  • homme : l'ensemble des hommes
  • femme : l'ensemble des femmes
  • personne : l'union entre les ensembles disjoints homme et femme
  • qualite : l'ensemble des qualités que peut avoir une personne (ex: beau, intelligent, gentil)
  • couple : une relation entre les ensembles homme et femme
  • age : une relation entre l'ensemble personne et l'ensemble des entiers naturels
  • a_qualite : une relation entre l'ensemble personne et l'ensemble qualite

Pour des raisons de simplicité (et pour illustrer les jointures), nous ne nous intéresserons qu'aux couples hétérosexuels.

Voici notre fichier d'exemple :

 
Sélectionnez
personne(P) :- homme(P).
personne(P) :- femme(P).
 
homme(denis).
homme(jacques).
homme(pierre).
homme(sylvain).
homme(edouard).
 
femme(amelie).
femme(julie).
femme(henriette).
femme(sylvie).
femme(noemie).
 
age(denis, 27).
age(jacques, 35).
age(pierre, 25).
age(sylvain, 28).
age(edouard, 65).
age(noemie, 18).
age(amelie, 21).
age(augustine, 27).
age(stephanie, 32).
age(christine, 34).
age(henriette, 61).
 
couple(edouard, henriette).
couple(jacques, christine).
couple(denis, amelie).
 
qualite(beau).
qualite(intelligent).
qualite(gentil).
 
a_qualite(denis, beau).
a_qualite(denis, gentil).
a_qualite(jacques, intelligent).
a_qualite(pierre, beau).
a_qualite(pierre, intelligent).
a_qualite(pierre, gentil).
a_qualite(sylvain, beau).
a_qualite(sylvain, intelligent).
a_qualite(edouard, intelligent).
a_qualite(edouard, gentil).

3.1. Interne/Externe

3.1.1. Jointure interne

Une jointure interne traduit la relation entre deux ensembles.

Il s'agit donc de la relation elle-même:

 
Sélectionnez
inner_join( (H,F) ) :-
  couple(H,F).



Exemple d'exécution:

Exécution
Sélectionnez
| ?- findall(X, inner_join(X),  Inner), write(Inner).
[ (edouard, henriette), (jacques, christine), (denis, amelie)]

3.1.2. Jointure externe

Dans une jointure externe, on retrouve les mêmes éléments que pour la jointure interne, sauf qu'en plus on ajoute les éléments n'ayant pas de correspondance dans la relation. Il est alors possible de leur spécifier une valeur par défaut (null, inconnu, 'N/A', une valeur arbitraire) ou pas de valeur du tout.

Il existe plusieurs type de jointures externes, suivant le sens de la jointure (gauche, droite, complète).

Jointure externe gauche

Pour la jointure gauche, on part de l'ensemble de départ et on cherche les correspondances dans la relation. S'il n'y a pas de correspondance, on spécifie une valeur par défaut (ici null, comme en SQL).

Il est possible d'effectuer la jointure de plusieurs manières, suivant comment on souhaite que soient classés les éléments null (entrelacés ou non-entrelacés).

Voici la manière entrelacée :

 
Sélectionnez
left_join_interleaved( (H,F) ) :-
  homme(H),
  lji(H,F).
 
lji(H,F) :- couple(H,F), !.
lji(_,null).
 

Voici la manière non-entrelacée :

 
Sélectionnez
left_join_noninterleaved( (H,F) ) :-
  couple(H,F).
 
 
left_join_noninterleaved( (H,null) ) :-
  homme(H),
  \+couple(H,_).
 



Voici la fonction de test et son exécution:

 
Sélectionnez
test :-
  findall(X, left_join_interleaved(X),    LeftInter),
  findall(Y, left_join_noninterleaved(Y), LeftNonInter),
  write('LeftInter = '), write(LeftInter), nl,
  write('LeftNonInter = '), write(LeftNonInter), nl.
 
Exécution
Sélectionnez
| ?- test.
LeftInter = [ (denis, amelie), (jacques, christine), (pierre, null), (sylvain, null), (edouard, henriette)]
LeftNonInter = [ (edouard, henriette), (jacques, christine), (denis, amelie), (pierre, null), (sylvain, null)]
 
Yes

Comme on peut le remarquer, pour la manière non-entrelacée, on a choisi de mettre les null à la fin. On aurait pu choisir de les mettre au début. La manière non-entrelacée est en fait une union de deux ensembles (ceux ayant une correspondance dans la relation et le autres).

Jointure externe droite

Le principe est le même pour une jointure droite que pour une jointure gauche, seul le sens de la jointure change.

Jointure externe complète

Une jointure externe complète, c'est l'union d'une jointure gauche et d'une jointure droite, sans doublons.

Comme pour les jointures externes gauches ou droites, il est possible de spécifier si l'on souhaite que les résultats soient entrelacés ou non.

 
Sélectionnez
full_outer_join( (H,F) ) :-
  couple(H,F).
 
 
full_outer_join( (H,null) ) :-
  homme(H),
  \+couple(H,_).
 
 
full_outer_join( (null, F) ) :-
  femme(F),
  \+couple(_, F).
 



Exemple d'exécution:

Exécution
Sélectionnez
| ?- findall(X, full_outer_join(X),  Full), write(Full).
[ (edouard, henriette), (jacques, christine), (denis, amelie), (pierre, null), (sylvain, null), (null, julie), 
(null, sylvie), (null, noemie)]

3.1.3. Autojointure

Une autojointure est une jointure liant un ensemble à lui-même, directement ou au moyen de jointures successives.


précédentsommairesuivant

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

  

Copyright © 2006 pcaboche. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.