3.5 Jointure entre Flux RSS et document XML
Pour permettre plus d'opérations sur les flux RSS et de
les compléter avec des données plus riches, on a ajouté
l'option qui permet à un pair d'exécuter une jointure entre un
flux RSS et des sources XML.
Pour mieux comprendre l'utilité de cette option, prenons
l'exemple d'un utilisateur qui s'intéresse au flux RSS
«voitures», et plus précisément qu'à un certains
nombre de voitures.
Pour recevoir que ce qu'il veut, l'utilisateur stocke les noms
des voitures qui lui intéressent dans un fichier XML et le publie dans
la DHT, qu'il appelle «mes_voitures.xml», et effectue la jointure
entre le flux RSS« voitures» et le document XML
«mes_voitures.xml».
Exemple :
L'utilisateur s'intéresse aux voitures
monospaces qui ont été publiées les 5 derniers jours
(d'où la clause Temps Valide=5) :
For $i in document (`voitures')/rss/channel/item
For $j in document (`mes_voitures.xml')/voiture
Where contains($i/title, $j/nom) and contains($j/type,
`Monospace')
Return $i
Temps Valide = 5 jours
3.5.1 Problèmes
Dans l'exemple précédent, on a supposé que
le pair qui va exécuter la requête possède le flux RSS et
le document XML.
PB1. Il se peut que le pair qui a fait la meilleure offre pour
fournir le flux RSS, ne soit pas celui qui possède le document XML. En
d'autres termes, le flux RSS et le document XML ne sont pas sur le même
pair, ceci constitue un frein pour notre travail.
PB2. Un autre problème se pose aussi, si on regarde
l'exemple ci-dessus, on va constater que pour rechercher la source `voitures',
on ne dispose pas de mot clé associé c'est-à-dire d'un
paramètre qui garantie une recherche pertinente de sources, on ne
dispose que du chemin ($i/title).
3.5.2 Solution
Pour résoudre le premier problème, on s'est
inspiré de l'approche e-commerce, en procédant à un
éclatement de la requête en deux parties [3], une partie RSS et
une autre XML, grâce à la DHT, on cherche les pairs qui
contiennent la source RSS, ensuite ceux qui ont fait les meilleures offres,
pareil pour la source XML.
Pour le second problème, on s'est contenté de
publier les chemins. Ainsi, pour la requête ci- dessus, pour chercher le
flux `voitures', on ne cherche que le chemin $i/title.
Pour mieux comprendre les deux solutions décrites
ci-dessus, voyons cet exemple.
Exemple :
L'utilisateur s'intéresse aux voitures monospaces qui
sont publiées les cinq derniers jours, mais, après la
sélection des meilleures offres, il s'avère que, le flux
`voiture' est localisé sur le pair P1 et le document XML
`mes_voitures.xml' est localisé sur le pair P2.
For $i in document (`voitures')/rss/channel/item
For $j in document (`mes_voitures.xml')/voiture
Where contains($i/title, $j/nom) and contains($j/type,
`Monospace')
Return $i
Temps valide = 5 jours
Ø Eclatement de la requête :
Q1= For $i in document (`voitures')/rss/channel/item
Where dateToday-5 <= $i/pubDate <= dateToday
Return $i
Q2= For $j in document (`mes_voitures.xml')/voiture
Where contains ($j/nom, `Monospace')
Return $j/nom
Ø Envoi des requêtes :
Envoyer Q1 P1= Résultat1
Envoyer Q2 P2= Résultat2
Ø Reconstitution du résultat final :
For $i in document (`Résultat1')/rss/channel/item
For $j in document (`Résultat2')/voiture
contains($i/title, $j/nom)
Return $i
Remarque :
Dans la requête Q2, on a effectué la restriction
et la projection au plus haut niveau, pour que transitent dans le réseau
que les données nécessaires, dans le but de réduire au
maximum la charge du réseau [2].
|