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