From e9962f9aee08cb9814ca79ee9b539e8ce0564d9d Mon Sep 17 00:00:00 2001 From: Jan Philipp Timme Date: Sat, 1 Oct 2016 19:17:49 +0200 Subject: [PATCH] [TASK] Generic commit. --- Bachelorarbeit.tex | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/Bachelorarbeit.tex b/Bachelorarbeit.tex index 7d21672..70475a0 100644 --- a/Bachelorarbeit.tex +++ b/Bachelorarbeit.tex @@ -798,15 +798,31 @@ Für den Operator $\vee$, mit dem eine entweder-oder-Beziehung ausgedrückt werd \begin{lstlisting} WHERE { OPTIONAL { - ?eventA rdf:type . + ?a rdf:type . } OPTIONAL { - ?eventB rdf:type . + ?b rdf:type . } - FILTER((BOUND(?eventA) || BOUND(?eventB)) && NOT (BOUND(?eventA) && BOUND(?eventB))) + FILTER( (BOUND(?a) || BOUND(?b)) + && !(BOUND(?a) && BOUND(?b)) ) } \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. +Das Ergebnis sind ausschließlich Tripel, in denen \emph{entweder} ein Ereignis vom Typ A \emph{oder} ein Ereignis vom Typ B vorkommt. +\item Der \textbf{Negationsoperator} ($\neg A$): Die Abbildung des Negationsoperators in C-SPARQL unterscheidet sich je nach Ereignismuster, in dem er verwendet wird. Um ein Muster vom Schema $(\neg A)$ abbilden zu können, kann eine Kombination aus \texttt{OPTIONAL}-Block und \texttt{FILTER}-Anweisung verwendet werden. Neben der Selektion aller verfügbaren Ereignistripel wird im \texttt{OPTIONAL +}-Block ein Tripel für den Ereignistypen A selektiert. Die auf den Block folgende \texttt{FILTER}-Anweisung filtert dann mit Hilfe von \texttt{BOUND()} nach dem Kriterium, ob das im \texttt{OPTIONAL}-Block selektierte Ereignistripel gefunden wurde oder nicht. Die entsprechende \texttt{WHERE}-Klausel dieser Abfrage sieht dann wie folgt aus: +\begin{lstlisting} +WHERE { + ?anyEvent rdf:type ?anyEventType . + OPTIONAL { + ?eventA rdf:type . + } + FILTER(!BOUND(?eventA)) +} +\end{lstlisting} + +Ein komplexeres Beispiel, in dem ein bestimmter Ereignistyp lediglich nicht zwischen zwei anderen Ereignistypen auftauchen darf, zeigt das folgende Ereignismuster: +\[(A)\ \rightarrow\ (\neg B)\ \rightarrow\ (C)\] +Dieses Muster verbietet die Vorkommnis von Ereignistyp B lediglich dann, wenn er zeitlich zwischen Ereignissen von Typ A und C liegt. Die in Listing~\ref{lst:example_csparql_query} gezeigte Beispielabfrage löst genau dieses Problem mit Hilfe eines \texttt{FILTER NOT EXISTS}-Blocks. Hierfür werden zunächst existierende Ereignisse vom Typ A und C selektiert und mit einer \texttt{FILTER}-Anweisung die Ergebnisse verworfen, in denen die Ereignisse vom Typen C nicht vor denen vom Typ A vorkommen. Dann wird via \texttt{FILTER NOT EXISTS} ein Ereignistripel vom Typ B gesucht, welches zeitlich \emph{zwischen} den gefundenen Ereignissen vom Typ A und C liegt. Falls innerhalb des Blockes ein passendes Ereignistripel gefunden wurde, so gehören die zugehörigen Ereignistripel vom Typ A und C nicht zur Ergebnismenge. Damit bleiben nur noch Ereignisse übrig, die das oben genannte Ereignismuster erfüllen. \end{itemize} \paragraph{Aggregation von Ereignissen}