[TASK] Generic commit.
This commit is contained in:
parent
b067451a2f
commit
e9962f9aee
@ -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}
|
||||
|
Loading…
Reference in New Issue
Block a user