• +49-(0)721-402485-12
Ihre Experten für XML, XQuery und XML-Datenbanken

Existenzielle Quantifizierung

Handelt es sich um eine existenzielle Quantifizierung, eingeleitet mit dem Schlüsselwort some, so wird der quantifizierende Ausdruck zu wahr evaluiert, falls es mindestens eine Belegung der Variablen gibt, für die der zu quantifizierende Ausdruck den effektiven booleschen Wert true liefert. Im Extremfall bedeutet dies, dass eine existenzielle Quantifizierung über eine leere Sequenz, die sich aus der Variablenbindung ergibt, grundsätzlich mit false bewertet wird. Der folgende Ausdruck wird entsprechend mit true bewertet, da mindestens eine Belegung der temporär gebundenen Variablen $x ("Lehner") die geforderte Zeichenkettenlänge erfüllt.

some $x in ("Lehner", "Schöning")
satisfies fn:string-length($x) = 6

Die explizite existenzielle Quantifizierung spiegelt im Wesentlichen die Standardauswertung von Prädikaten innerhalb von FLWOR-Ausdrücken wider. Folgendes Beispiel illustriert dies, in dem alle Operationen im Sinne von Ärztefehlern ausgegeben werden sollen, bei denen der erste Einschnitt ohne Betäubung vorgenommen wurde:

<Arztfehler>
{
for $o in fn:collection("Patienten")//Operation
where some $i in $o//Einschnitt
satisfies fn:empty($o//Anästhesie[. << $i])
return $o
}
</Arztfehler>

Diese Anfrage ermittelt zunächst alle Operationen und bindet diese an die Variable $o. Die Operation wird jedoch nur in das Ergebnisdokument übernommen, falls die entsprechende existenzielle Quantifizierung zu true ausgewertet wird. In dem quantifizierenden Ausdruck werden alle Einschnitte innerhalb einer Behandlung dahingehend abgeprüft, ob – innerhalb derselben Behandlung – eine Betäubung existiert, die vor dem Einschnitt stattgefunden hat.

Die existenzielle Quantifizierung kann direkt durch die where-Klausel eines FLWOR-Ausdrucks bzw. als Filterausdruck in einem Pfadausdruck simuliert werden. Obiges Beispiel kann somit in analoger Weise wie folgt formuliert werden:

<Arztfehler>
{
for $o in fn:collection("Patienten")
//Operation[.//Einschnitt[not(../Anästhesie[1]<<.)]]
return $o
}
</Arztfehler>

Die Variable $o wird dabei nur an die Operationen gebunden, bei denen die Reihenfolge "Einschnitt" vor "Anästhesie" innerhalb der Dokumentordnung vorgefunden wird. Der Pfadausdruck ist dabei in zwei Schritten zu interpretieren, die in der folgenden Abbildung verdeutlicht werden. Das Prädikat des äußeren Pfadausdrucks ist ein Pfadausdruck, der zunächst alle Einschnitte innerhalb der gerade betrachteten Operation identifiziert (und implizit auf deren Existenz prüft). Im zweiten Schritt erfolgt die Auswertung des Prädikates des inneren Pfadausdrucks, wobei das Prädikat nur dann zu true evaluiert wird, wenn der erste Anästhesieeintrag innerhalb dieser Operation nicht vor dem aktuell betrachteten Einschnitt (durch .-Notation gekennzeichnet) liegt.

Simulation existenzieller Quantifizierung mit Pfadausdrücken

Abb.: Simulation existenzieller Quantifizierung mit Pfadausdrücken

Des Weiteren zeigt das obige Beispiel, dass die innerhalb eines quantifizierenden Ausdrucks gebundenen Variablen auch in dem zu überprüfenden Ausdruck nach dem satisfies-Schlüsselwort referenziert werden können. Eine Referenzierung außerhalb des quantifizierenden Ausdrucks ist hingegen nicht erlaubt, so dass folgende XQuery-Anweisung zur Ausgabe der "kritischen" Behandlung mit dem entsprechenden zu früh durchgeführten Eingriff einen Fehler (zur Übersetzungszeit) liefern würde:

<Arztfehler>
{
for $o in fn:collection("Patienten")//Operation
where some $i in $o//Einschnitt
satisfies fn:empty($o//Anästhesie[. << $i])
return ($o, $i) (: Fehler, $i ist hier nicht bekannt :)
}
</Arztfehler>

Als Letztes sei angemerkt, dass existenzielle Quantifizierungen oftmals gewinnbringend in konditionale Ausdrücke eingebettet werden. So wird mit folgendem Ausdruck jeder Arzt mit einer Eigenschaft versehen, die darauf hinweist, ob ein Arztfehler vorgelegen hat oder ob bisher nur fehlerfreies Arbeiten aufgetreten ist:

for $a in fn:doc("Hochwaldklinik.xml")//Arzt
for $p in fn:collection("Patienten")//Patient_stationär
let $o := $p//Operation
where xqb:follow-xlink($p/Arzt/@xlink:href) is $a
return
<Arzt>
{
$a/Name,
<Anmerkung>
{ if some $i in $o//Einschnitt
satisfies fn:empty($o//Anästhesie[. << $i])
then xs:string("Arztfehler liegt vor")
else xs:string("Fehlerfreies Arbeiten")
}
</Anmerkung>}
}
</Arzt>

 

Quelle: "XQuery – Grundlagen und fortgeschrittene Methoden", dpunkt-Verlag, Heidelberg (2004)

<< zurückvor >>