[TASK] Generic commit.

This commit is contained in:
Jan Philipp Timme 2016-10-05 16:54:01 +02:00
parent 8a5bcba6b2
commit 14c51e8b30

View File

@ -876,7 +876,14 @@ Das Auslösen von Ereignissen innerhalb der Ereignisverarbeitung kann genutzt we
In C-SPARQL können bestimmte Abfragen, wie etwa \texttt{CONSTRUCT}-Queries als Datenströme registriert werden, um somit ihre Ergebnisse in weiteren CEP-Regeln verarbeiten zu können. Hierzu wird nach dem Schlüsselwort \texttt{REGISTER}, wie die Grammatik aus Listing~\ref{lst:register_query_csparql} beschreibt, das Schlüsselwort \texttt{STREAM} angegeben\footnote{Zusätzlich ist es notwendig, den Query nach der Registrierung von einem \texttt{RDFStreamFormatter} beobachten zu lassen, den man separat an der Engine registrieren muss. Mehr dazu in Kapitel~\ref{cpt:csparql_in_practice}}.
Es folgt ein Beispiel in Listing~\ref{lst:csparql_construct_query}, welches für einen \texttt{CONSTRUCT}-Query, welcher die Durchschnittsgeschwindigkeit von PKW ermittelt:
Um dies zu zeigen, sei in Listing~\ref{lst:abstract_cep_rule_five} eine abstrakte CEP-Regel gegeben, die Ereignisse vom Typ \texttt{CarStatusEvent} nach den im Attribut \texttt{relatedCar} angegebenen PKW gruppiert, für jeden PKW dessen durchschnittliche Geschwindigkeit ermittelt und für jedes Ergebnis ein neues Ereignis vom Typ \texttt{AverageSpeedEvent} erzeugt, welches die Durchschnittsgeschwindigkeit enthalten soll.
\begin{lstlisting}[mathescape=true,label={lst:abstract_cep_rule_five},caption={CEP-Regel erzeugt neue Ereignisse}]
CONDITION ($(CarStatusEvent\ AS\ statusEvent)$)[WindowSize:15min,StepSize:5m]
$\wedge$ AGGREGATE(statusEvent, "motorRPM", {statusEvent.relatedCar}, AVG) AS avgSpeed
ACTION
new AverageSpeedEvent(relatedCar=statusEvent.relatedCar, averageSpeed=avgSpeed)
\end{lstlisting}
Diese CEP-Regel lässt sich mit C-SPARQL umsetzen, indem ein entsprechender \texttt{CONSTRUCT}-Query formuliert wird, welcher die Durchschnittsgeschwindigkeit der PKW ermittelt und daraus neue Ereignisinstanzen vom Typ \texttt{AverageSpeedEvent} generiert. Listing~\ref{lst:csparql_construct_query} zeigt einen solchen Query:
\begin{lstlisting}[label={lst:csparql_construct_query},caption={Konstruktion eines Ereignisstromes mit C-SPARQL}]
REGISTER STREAM getAverageSpeedByCar AS
CONSTRUCT {
@ -884,7 +891,7 @@ CONSTRUCT {
; car:relatedCar ?car
; car:averageSpeed ?avgSpeed .
}
FROM STREAM <...> [RANGE 5s STEP 1s]
FROM STREAM <...> [RANGE 15m STEP 1m]
WHERE {
{
SELECT ?car (AVG(?speed) AS ?avgSpeed)
@ -897,6 +904,7 @@ WHERE {
}
}
\end{lstlisting}
Da C-SPARQL die gleichzeitige Nutzung von \texttt{GROUP BY} mit \texttt{CONSTRUCT} erlaubt, nutzt die Abfrage aus Listing~\ref{lst:csparql_construct_query} einen in geschweiften Klammern eingefassten Subquery, um die Aggregation vornehmen zu können. Um für die innerhalb von \texttt{CONSTRUCT} neu zu erzeugten Ereignisinstanzen ein Subjekt zu erhalten, wird mit \texttt{[]} ein sogenannter \emph{Blank Node} verwendet. Nach Auswertung des Queries erhält jeder konstruierte Blank Node von der Engine eine Kennung, anhand der er identifiziert werden kann.
\paragraph{Ausführen von Code und Anstoßen externer Dienste}