[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}
|
\begin{lstlisting}
|
||||||
WHERE {
|
WHERE {
|
||||||
OPTIONAL {
|
OPTIONAL {
|
||||||
?eventA rdf:type <http://example.org/type/A> .
|
?a rdf:type <http://example.org/type/A> .
|
||||||
}
|
}
|
||||||
OPTIONAL {
|
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}
|
\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}
|
\end{itemize}
|
||||||
|
|
||||||
\paragraph{Aggregation von Ereignissen}
|
\paragraph{Aggregation von Ereignissen}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user