• Aucun résultat trouvé

Cas particulier des noeuds textes

Dans le document en fr (Page 87-89)

3.4 Conclusion et Bilan

4.1.5 Cas particulier des noeuds textes

La stratégie que nous proposons pour projeter les textes d’un mixed-content est particulièrement intéressante pour restreindre la projection des textes dans le cas général. Notons que le type String n’appartient ni àπno ni àπolb. Le seul moyen pour projeter un texte consiste donc maintenant

à mettre le type de son parent dansπolb. Nous illustrons cette remarque au moyen de l’exemple

suivant.

Exemple 38. Considérons la DTDD pour laquelle la règle pour d est d → String. Considérons aussi la même mise à jouru2et le documentt3de la Figure 4.7. Le projecteurπ′′2 inféré pouru2et

la nouvelle DTD à partir des cheminsself :: doc/a/b/text()/parent::node()/child::node() et self :: doc/a/d est donné par :

π′′

2={doc, a, b, d, String}.

Ce projecteur permet de générer la mise à jour partielle et de réaliser la fusion de manière correcte. Cependant, ce projecteur n’est pas précis puisqu’appliqué sur un document dont les noeuds étiquetésd ont des fils de type String va avoir pour effet de projeter inutilement ces derniers. C’est le cas du documentt3 de la Figure 4.7 pour lequelπ2′′(t3)=t3.

doc [ǫ] a [1] b [1.1] ’no’ c [1.3] [1.4]d ’yes’ a [2] d [1.4] ’gold’ doc [ǫ] a [1] b [1.1] ’no’ c [1.3] [1.4]d a [2] d [1.4] t3= π′′2(t3) πu2(t3)

FIGURE4.7 – Projection des textes seuls en utilisantπolb.



La stratégie que nous introduisons pour la projection des textes peut être utilisée dans le contexte des requêtes pures pour lequel elle apporte un gain significatif relativement à la stratégie proposée dans [BCCN06]. En effet, les noeuds textes constituent, en général, une part importante des docu- ments XML. Pouvoir restreindre la projection des textes à ceux qui sont réellement utilisés par les requête est donc crucial pour la réduction de la taille des documents projetés.

La discussion qui suit concerne un autre cas pour lequel notre méthode de projection permet un traitement plus efficace que la méthode de [BCCN06]. Il s’agit de l’extraction d’éléments. Cette opération est omniprésente dans les requêtes puisque l’évaluation de celles-ci consiste à retourner tous les descendants des noeuds ciblés par les chemins. Elle est aussi utile pour les mises à jour, en particulier les insertions et remplacements qui permettent de copier des éléments à des emplacements spécifiques.

Pour comprendre en quoi la méthode de [BCCN06] est insuffisante pour inférer un projecteur précis dans le cas de l’extraction d’éléments, considérons l’exemple suivant.

doc → a* a → b*,c*,d ?

b → (f | g)∗ d → (f | g)∗ (1) La DTDD2.

for $x in self : :doc/a

return replace $x/b with $x/d (2) La mise à jouru3. doc [ǫ] a [1] b [1.1] f [1.1.1] c [1.2] [1.3]d f [1.3.1] g [1.3.2] a [2] b [2.1] f [2.1.1] g [2.1.2] doc [ǫ] a [1] b [1.1] c [1.2] [1.3]d f [1.3.1] g [1.3.2] a [2] b [2.1] (3)t4 = π3(t4) (4)πu3(t4)

FIGURE4.8 – Traitement des insertions : approche syntaxique vs projection à deux niveaux.

Intuitivement, la mise à jour de remplacement se traite comme une suppression suivie d’une insertion. Donc, le cheminself :: doc/a/b spécifiant la cible de la mise à jour doit être considéré comme pour le cas de l’insertion, un chemin ciblant des noeuds devant être projetés avec tous leurs fils. Par conséquent, le composantπolbdu projecteurπ3 pouru3etD doit contenir l’étiquette a du

parent du noeud ciblé par ce chemin i.eπolb={a}. Le chemin self :: doc/a/d retourne les éléments

copiés par la mise à jouru3à l’emplacement indiqué par le cheminself :: doc/a/b. Par conséquent,

les éléments retournés par ce chemin doivent être projetés.

La première solution qui s’offre à nous pour inférer un projecteur pour la mise à jouru3consiste

à suivre l’approche de [BCCN06] pour la projection des chemins returned (cf. discussion du Cha- pitre 3 concernant la précision de la projection basée sur les schémas). Cette approche consiste à considérer self :: doc/a/d comme chemin returned, et de ce fait, d’étendre ce dernier pour don- nerself :: doc/a/d/desc-or-self::node(). Le but de l’ajout de l’étape desc-or-self::node() au cheminself :: doc/a/d est de projeter tous les sous-arbres enracinés aux noeuds étiquetés par d en générant les étiquettesf , g dans le projecteur. Le projecteur π3obtenu pouru3et la DTDD′serait

alors :

πno = {doc, b, d, f, g}, πolb= {a}.

La projection det4suivantπ3conduit à projeter tous les noeuds de ce dernier et la figure 4.8 montre

queπ3(t4)=t4.

Par souci de générer des projecteurs les plus précis possible, nous avons opté pour une stratégie différente de celle présentée ci-dessus. Cette nouvelle stratégie consiste à introduire, en plus des composants πno et πolb, un troisième composant au projecteur, le composant πeb ’everything

below’ (qu’on abrège en∀ below). Ce composant πebcontient des étiquettes qui vont déclencher la

projection de tout le sous-arbre enraciné par un noeud de type∀ below. Le projecteurπu3 que nous proposons pour la mise à jouru3est spécifié par :

πno = {doc, b}, πolb= {a}, πeb= {d}.

Il permet de projeter tous les descendants du noeudt4@1.3 sans entraîner la projection des descen-

dants du noeudb qui sont etiquetés f et g. La projection de t4 suivantπu3 est présentée dans la Figure 4.8-(4). Notons ici queπu3 est un sous-arbre strict det4. 

Les différents exemples et la discussion ci-dessus nous am `ne à introduire un projecteur pour les mises à jour que nous appelons dans la suite tri-projecteur4 constitué de trois composants, chaque composant étant un ensemble de types (étiquettes). Nous récapitulons la fonction de chacun de ces trois composants :

– πno le composant ’node only’ contient les types des noeuds devant être projetés et dont les

fils doivent être examinés et projetés en fonction du tri-projecteur,

– πolble composant ’one level below’ contient les types des noeuds devant être projetés avec

tous leurs noeuds fils,

– πeble composant ’∀ below’ contient les types des noeuds devant être projetés avec tous leurs

descendants.

Dans le document en fr (Page 87-89)