Einseitig äußerer Verbund
Die Symmetrie der geschachtelten for-Klauseln ist nur dann zu erhalten, wenn garantiert werden kann, dass für jedes Element mindestens ein Verbundpartner existiert und somit kein Informationsverlust erzeugt wird. Zum Beispiel ist für jeden Patienten eine Liste der im Notfall zu kontaktierenden Ärzte zu erstellen, wobei ein Verbund der Kollektion der Patientendokumente mit dem XML-Dokument Hochwaldklinik.xml durchgeführt werden muss.
Als Bedingung gilt dabei, dass der Notfallarzt in der gleichen Stadt wie der Patient wohnen muss. Die Anfrage iteriert dabei über alle Patienten und alle Ärzte und überprüft in der where-Klausel das Verbundprädikat. In der return-Klausel werden die ermittelten Kombinationen aus Patientenname und Notfallarzt zusammengeführt.
<Patientenliste>
{
for $p in fn:collection("Patient")
for $a in fn:doc("Hochwaldklinik.xml")//Arzt
where $p//Adresse/Stadt = $a//Adresse/Stadt
return
<Patient>
{ $p/*/Name }
<Notfallarzt>
{ $a/Name }
{ $a/Adresse }
</Notfallarzt>
</Patient>
}
</Patientenliste>
In der Liste tauchen somit nur Patienten auf, die in einer Stadt wohnen, in denen auch mindestens ein Arzt der Klinik seinen Wohnort hat, da andernfalls die where-Klausel nicht erfüllt werden kann. Die restlichen Patienten erscheinen nicht im Ergebnisdokument. Um dies dennoch zu erreichen, muss in einem äußeren FLWOR-Ausdruck zunächst die Patienteninformation erzeugt werden und dann in einem inneren FLWOR-Ausdruck die (möglicherweise leere) Liste der entsprechenden Notfallärzte hinzugefügt werden. Ein entsprechender einseitig äußerer Verbund wird sich dann wie folgt ergeben:
<Patientenliste>
{
for $p in fn:collection("Patient")
return
<Patient>
{ $p/*/Name }
<Notfallärzte>
{
for $a in fn:doc("Hochwaldklinik.xml")//Arzt
where $p//Adresse/Stadt = $a//Adresse/Stadt
return
<Notfallarzt>
{ $a/Name }
{ $a/Adresse }
</Notfallarzt>
}
</Notfallärzte>
</Patient>
}
</Patientenliste>
Ein Patient taucht in diesem Fall im Ergebnisdokument auch dann auf, wenn es keinen Arzt in seiner nächsten Umgebung, d. h. in der gleichen Stadt gibt.
Zu beachten ist hierbei, dass die Semantik einer einseitigen äußeren Verbundoperation durch die Möglichkeit der Schachtelung von XQuery- bzw. insbesondere von FLWOR-Ausdrücken realisierbar ist und somit der hierarchischen Charakteristik von XML entspricht.
Quelle: "XQuery – Grundlagen und fortgeschrittene Methoden", dpunkt-Verlag, Heidelberg (2004)
<< zurück | vor >> |