diff --git a/Bachelorarbeit.tex b/Bachelorarbeit.tex index ffe653c..7d21672 100644 --- a/Bachelorarbeit.tex +++ b/Bachelorarbeit.tex @@ -785,8 +785,28 @@ Innerhalb der \texttt{WHERE}-Klausel sieht dies wie folgt aus: ?eventY rdf:type . FILTER(f:timestamp(?eventX,rdf:type,) < f:timestamp(?eventY,rdf:type,)) \end{lstlisting} -\item Die \textbf{boolschen Operatoren} $\wedge$ und $\vee$: Öhm ... muss ich selber bauen \todo{FUCK!} -\item Der \textbf{Negationsoperator} ($\neg A$): \dots +\item Die \textbf{boolschen Operatoren} $\wedge$ und $\vee$: Mit dem Operator $\wedge$ kann über Ausdrücke wie $(A \wedge B)$ definiert werden, dass sowohl ein Ereignis vom Typ A als auch ein Ereignis vom Typ B im Muster vorkommen müssen. Um dies innerhalb von C-SPARQL auszudrücken, müssen innerhalb der \texttt{WHERE}-Klausel lediglich die Tripel selektiert werden, die zu den Ereignistypen korrespondieren: +\begin{lstlisting} +WHERE { + ?eventA rdf:type . + ?eventB rdf:type . +} +\end{lstlisting} +Sollte eines der beiden Tripel nicht in der zu verarbeitenden Datenmenge enthalten sein, so gibt die gesamte C-SPARQL-Abfrage kein Ergebnis zurück. Somit ist gewährleistet, dass diese \texttt{WHERE}-Klausel dem Ereignismuster $(A \wedge B)$ entspricht. + +Für den Operator $\vee$, mit dem eine entweder-oder-Beziehung ausgedrückt werden kann, ist etwas mehr Arbeit erforderlich. Nimmt man den Ausdruck $(A \vee B)$, so bedeutet dieser, dass \emph{entweder} ein Ereignis vom Typ A \emph{oder} ein Ereignis vom Typ B vorkommt, jedoch nicht beide zugleich. Innerhalb von C-SPARQL bedeutet dies, dass für die Selektion der Tripel für die Ereignistypen A und B zwei \emph{separate} \texttt{OPTIONAL}-Blöcke verwendet werden müssen. Auf Basis der selektierten Tripel wird dann eine \texttt{FILTER}-Anweisung gebaut, die mit Hilfe von \texttt{BOUND()} alle Tripel aus der Ergebnismenge ausschließt, bei denen beide oder keiner von beiden Ereignistypen vorhanden ist: +\begin{lstlisting} +WHERE { + OPTIONAL { + ?eventA rdf:type . + } + OPTIONAL { + ?eventB rdf:type . + } + FILTER((BOUND(?eventA) || BOUND(?eventB)) && NOT (BOUND(?eventA) && BOUND(?eventB))) +} +\end{lstlisting} +\item Der \textbf{Negationsoperator} ($\neg A$): \dots dafür wird \texttt{FILTER NOT EXISTS \{ \dots \}} benötigt, dann kann man einigermaßen akzeptable Muster bauen. \end{itemize} \paragraph{Aggregation von Ereignissen}