[TASK] Generic commit.

This commit is contained in:
Jan Philipp Timme 2016-10-04 15:45:06 +02:00
parent 2a24a9002d
commit 773c7f64d6

View File

@ -489,15 +489,15 @@ ACTION
... auszulösende Aktionen ...
\end{lstlisting}
\paragraph{Aggregation von Ereignissen}
\paragraph{Aggregation von Ereignissen}\label{cpt:cep_aggregate_events}
Eine weitere Möglichkeit zur Auswertung von Ereignisdaten ist die Aggregation der Attributdaten von Ereignissen zu höherwertigeren Ereignissen. Hierbei werden Ereignisse gleichen Typs innerhalb eines Sliding Windows betrachtet, mit Ereignismustern und Kontextbedingungen vorgefiltert. Dann können sie nach ihren Attributwerten gruppiert werden und diese dann mittels Aggregationsfunktionen zusammengefasst werden. So können Trends oder Kennzahlen aus Ereignisdaten gewonnen werden, die zur Interpretation der Ereignisdaten beitragen können.
\todo{GRAFIK: Aggregation visuell zeigen?}
In einer CEP-Regel können Aggregation mit dem Konstrukt
\begin{lstlisting}
AGGREGATE(event, "attribute", function)
AGGREGATE(event, "attribute", {groupByVariable}, function)
\end{lstlisting}
notiert werden, wobei \texttt{event} eine Ereignisinstanz enthält, \texttt{'attribute'} den Namen des zu aggregierenden Attributs nennt, und \texttt{function} die Funktion nennt, mit der die Daten aggregiert werden sollen. Das Ergebnis der Aggregationsfunktion kann direkt in Kontextbedingungen verwendet werden oder mit dem \texttt{AS}-Operator einer lokalen Variable zugewiesen werden. Die folgenden Funktionen stehen zur Verfügung:
notiert werden, wobei \texttt{event} eine Ereignisinstanz enthält, \texttt{'attribute'} den Namen des zu aggregierenden Attributs nennt, \texttt{\{groupByVariable\}} eine Liste von Variablen enthält, nach denen die Ereignistypen zu gruppieren sind, und \texttt{function} die Funktion nennt, mit der die Daten aggregiert werden sollen. Das Ergebnis der Aggregationsfunktion kann direkt in Kontextbedingungen verwendet werden oder mit dem \texttt{AS}-Operator einer lokalen Variable zugewiesen werden. Die folgenden Funktionen stehen zur Verfügung:
\begin{itemize}
\item COUNT: Zählt alle Ereignisinstanzen; die Angabe des Attributnamen wird nicht berücksichtigt.
\item SUM: Bildet Summe über Attributwerte
@ -509,7 +509,7 @@ notiert werden, wobei \texttt{event} eine Ereignisinstanz enthält, \texttt{'att
Um die Verwendung von Aggregationsfunktionen innerhalb von CEP-Regeln zu demonstrieren, folgt nun ein Beispiel: Innerhalb eines 15 Minuten Zeitfensters soll die durchschnittliche Geschwindigkeit von PKW bestimmt werden, die einen Messpunkt an einer Straße passieren. Unterschreitet die Durchschnittsgeschwindigkeit den Wert von 60km/h, so soll die Regel feuern.
\begin{lstlisting}[mathescape=true,label={lst:abstract_cep_rule_four},caption={Beispiel zur Nutzung von \texttt{AGGREGATE()}}]
CONDITION ($MeasureEvent\ AS\ m$)
$\wedge$ AGGREGATE(m, "speed", AVG) AS averageSpeed
$\wedge$ AGGREGATE(m, "speed", {m.relatedCar}, AVG) AS averageSpeed
$\wedge$ averageSpeed < 60
ACTION
... auszulösende Aktionen ...
@ -517,9 +517,9 @@ ACTION
Die in Listing~\ref{lst:abstract_cep_rule_four} gezeigte CEP-Regel demonstriert die Umsetzung dieses Beispiels. Der Aufruf
\begin{lstlisting}
AGGREGATE(m, "speed", AVG) AS averageSpeed
AGGREGATE(m, "speed", {m.relatedCar}, AVG) AS averageSpeed
\end{lstlisting}
sorgt hierbei dafür, dass alle durch das Ereignismuster gefundenen Ereignisinstanzen in der Variable \texttt{m} für die Aggregation vorgesehen werden. Die Werde des Attributes \enquote{speed} werden für alle gefunden Ereignisinstanzen mit der Funktion \texttt{AVG} ausgewertet und so die Durchschnittsgeschwindigkeit aller gemessenen PKW-Geschwindigkeiten in der Variable \texttt{averageSpeed} abgelegt, welche dann für die weitere Auswertung verwendet wird.
sorgt hierbei dafür, dass alle durch das Ereignismuster gefundenen Ereignisinstanzen in der Variable \texttt{m} für die Aggregation vorgesehen werden. Die Werde des Attributes \enquote{speed} werden für alle gefunden Ereignisinstanzen nach \texttt{m.relatedCar} gruppiert, und mit der Funktion \texttt{AVG} ausgewertet und so die Durchschnittsgeschwindigkeit aller gemessenen PKW-Geschwindigkeiten in der Variable \texttt{averageSpeed} abgelegt, welche dann für die weitere Auswertung verwendet wird.
\paragraph{Integration von Domänenwissen}
Die Kontextbedingungen der CEP-Regeln können auch Bezug auf \emph{Domänenwissen} nehmen, welches von der Anwendung lokal vorgehalten wird.
@ -829,7 +829,9 @@ Dieses Muster verbietet die Vorkommnis von Ereignistyp B lediglich dann, wenn er
\end{itemize}
\paragraph{Aggregation von Ereignissen}
Ergeben sich für Ereignismuster über ein Sliding Window eine größere Menge an Ergebnissen, so kann es sinnvoll sein, diese Anhand von bestimmten Kriterien in einzelne Gruppen zusammenzufassen und mittels Aggregationsfunktionen diese Gruppen zusammenzufassen. Um dies zu tun, gibt es in C-SPARQL das Konstrukt \texttt{GROUP BY (\emph{?var})}, wobei \texttt{?var} eine Variable aus der \texttt{WHERE}-Klausel ist, nach der gruppiert werden soll. Wird eine solche Gruppierung vorgenommen, so können über die daraus resultierenden Gruppen die folgenden Aggregationsfunktionen zur Zusammenfassung der Ergebnisgruppen verwendet werden\cite{barbieri:querying}:
Ergeben sich für Ereignismuster über ein Sliding Window eine größere Menge an Ergebnissen, so kann es sinnvoll sein, diese Anhand von bestimmten Kriterien in einzelne Gruppen zusammenzufassen und mittels Aggregationsfunktionen diese Gruppen zusammenzufassen. Um dies zu tun wurde in Kapitel~\ref{cpt:cep_aggregate_events} das Konstrukt \texttt{AGGREGATE} eingeführt.
Als passendes Gegenstück gibt es C-SPARQL das Konstrukt \texttt{GROUP BY (\emph{?var})}, wobei \texttt{?var} eine Variable aus der \texttt{WHERE}-Klausel ist, nach der gruppiert werden soll. Wird eine solche Gruppierung vorgenommen, so können über die daraus resultierenden Gruppen die folgenden Aggregationsfunktionen zur Zusammenfassung der Ergebnisgruppen verwendet werden\cite{barbieri:querying}:
\begin{itemize}
\item \texttt{COUNT(\emph{?var})}: Zählt die Anzahl Tupel pro Gruppe
\item \texttt{SUM(\emph{?var})}: Bildet Summe der Variable über jede Gruppe
@ -841,7 +843,17 @@ Ergeben sich für Ereignismuster über ein Sliding Window eine größere Menge a
Nachdem nun die grundlegenden Werkzeuge zur Aggregation von Daten in C-SPARQL erläutert wurden, sollen diese in mit einem Beispiel demonstriert werden: Gegeben seien Statusmeldeereignisse von PKW, die zur weiteren Auswertung aggregiert werden sollen. Hierbei sollen für jeden einzelnen PKW, dessen durchschnittliche Motordrehzahl über 3000 Umdrehungen pro Minute liegt, die minimale beziehungsweise maximale Motordrehzahl ermittelt werden.
Um dies umzusetzen, müssen die Ereignistupel nach den PKW, auf die sie sich beziehen mit \texttt{GROUP BY} gruppiert werden. Dann können die gewünschten Werte in der \texttt{SELECT}-Klausel unter Nutzung der Funktionen \texttt{MIN()} und \texttt{MAX()} selektiert werden. Zuletzt kann das Kriterium, dass die durchschnittliche Motordrehzahl 3000 Umdrehungen pro Minute überschreitet mit einer \texttt{HAVING}-Anweisung umgesetzt werden. Die folgende C-SPARQL-Abfrage demonstriert dies:
Abstrakt formuliert ergibt sich hierbei folgende CEP-Regel:
\begin{lstlisting}[mathescape=true,label={},caption={}}]
CONDITION ($CarStatusEvent\ AS\ statusEvent$)
$\wedge$ AGGREGATE(statusEvent, "motorRPM", {statusEvent.relatedCar}, MIN) AS minRPM
$\wedge$ AGGREGATE(statusEvent, "motorRPM", {statusEvent.relatedCar}, MAX) AS maxRPM
$\wedge$ AGGREGATE(statusEvent, "motorRPM", {statusEvent.relatedCar}, AVG) > 3000
ACTION
... auszulösende Aktionen ...
\end{lstlisting}
Um dies in C-SPARQL umzusetzen, müssen die Ereignistupel nach den PKW, auf die sie sich beziehen mit \texttt{GROUP BY} gruppiert werden. Dann können die gewünschten Werte in der \texttt{SELECT}-Klausel unter Nutzung der Funktionen \texttt{MIN()} und \texttt{MAX()} selektiert werden. Zuletzt kann das Kriterium, dass die durchschnittliche Motordrehzahl 3000 Umdrehungen pro Minute überschreitet mit einer \texttt{HAVING}-Anweisung umgesetzt werden. Die folgende C-SPARQL-Abfrage demonstriert dies:
\begin{lstlisting}[label={lst:sample_csparql_aggregation_query},caption={Ermittlung minimaler und maximaler Motordrehzahl pro PKW}]
SELECT (MIN(?carRPM) AS ?minRPM) (MAX(?carRPM) AS ?maxRPM)
FROM STREAM ...
@ -853,6 +865,7 @@ WHERE {
GROUP BY ?car
HAVING AVG(?carRPM) > 3000
\end{lstlisting}
Somit stellt die Aggregation von Ereignisdaten kein Problem dar und kann regulär in CEP-Regeln verwendet werden.
\section{Auslösen von Aktionen}\label{cpt:register_stream}