[TASK] Generic commit.

This commit is contained in:
Jan Philipp Timme 2016-10-01 19:17:49 +02:00
parent b067451a2f
commit e9962f9aee

View File

@ -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 <http://example.org/type/A> .
?a rdf:type <http://example.org/type/A> .
}
OPTIONAL {
?eventB rdf:type <http://example.org/type/B> .
?b rdf:type <http://example.org/type/B> .
}
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 <http://example.org/type/A> .
}
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}