diff --git a/Bachelorarbeit.tex b/Bachelorarbeit.tex index 4ff50c2..747f477 100644 --- a/Bachelorarbeit.tex +++ b/Bachelorarbeit.tex @@ -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}