[TASK] Generic commit.

This commit is contained in:
Jan Philipp Timme 2016-10-05 19:50:55 +02:00
parent 51aeb6c141
commit 437cc82521
1 changed files with 38 additions and 2 deletions

View File

@ -909,7 +909,7 @@ Da C-SPARQL die gleichzeitige Nutzung von \texttt{GROUP BY} mit \texttt{CONSTRUC
\paragraph{Ausführen von Code und Anstoßen externer Dienste} \paragraph{Ausführen von Code und Anstoßen externer Dienste}
Natürlich bietet die C-SPARQL-Engine auch Möglichkeiten zum Ausführen von eigenem Code und somit auch zum Anstoßen von externen Diensten. Allerdings bietet sie dafür keine Möglichkeiten innerhalb der C-SPARQL-Sprache selbst, sondern erfordert das Anbringen von einem \texttt{Observer} an den durch die Registrierung eines Queries an der Engine entstandenen \texttt{CsparqlQueryResultProxy}. Dieser wird jedes Mal benachrichtigt, wenn für den registrierten Query ein Ergebnis vorliegt. Dabei wird die durch das \texttt{Observer}-Interface implementierte Methode \texttt{update()} aufgerufen, welcher der \texttt{CsparqlQueryResultProxy} des Queries sowie die \texttt{RDFTable} mit den Ergebnissen übergeben wird. Innerhalb der Methode \texttt{update()} kann dann beliebiger Java-Code hinterlegt werden, der mit den Ergebnisdaten arbeitet oder einen externen Dienst anstößt. Natürlich bietet die C-SPARQL-Engine auch Möglichkeiten zum Ausführen von eigenem Code und somit auch zum Anstoßen von externen Diensten. Allerdings bietet sie dafür keine Möglichkeiten innerhalb der C-SPARQL-Sprache selbst, sondern erfordert das Anbringen von einem \texttt{Observer} an den durch die Registrierung eines Queries an der Engine entstandenen \texttt{CsparqlQueryResultProxy}. Dieser wird jedes Mal benachrichtigt, wenn für den registrierten Query ein Ergebnis vorliegt. Dabei wird die durch das \texttt{Observer}-Interface implementierte Methode \texttt{update()} aufgerufen, welcher der \texttt{CsparqlQueryResultProxy} des Queries sowie die \texttt{RDFTable} mit den Ergebnissen übergeben wird. Innerhalb der Methode \texttt{update()} kann dann beliebiger Java-Code hinterlegt werden, der mit den Ergebnisdaten arbeitet oder einen externen Dienst anstößt.
Somit kann von der CEP-Regel in Listing~\ref{lst:abstract_cep_rule_six} nur der \texttt{CONDITION}-Teil in C-SPARQL umgesetzt werden, da für den \texttt{ACTION}-Teil zusätzlicher Java-Code benötigt wird: Somit kann von der CEP-Regel in Listing~\ref{lst:abstract_cep_rule_six} nur der \texttt{CONDITION}-Teil in C-SPARQL umgesetzt werden (Listing~\ref{lst:csparql_speedavg_greater_140}), da für den \texttt{ACTION}-Teil zusätzlicher Java-Code benötigt wird:
\begin{lstlisting}[mathescape=true,label={lst:abstract_cep_rule_six},caption={CEP-Regel stößt externen Dienst an}] \begin{lstlisting}[mathescape=true,label={lst:abstract_cep_rule_six},caption={CEP-Regel stößt externen Dienst an}]
CONDITION ($(CarStatusEvent\ AS\ statusEvent)$)[WindowSize:15min,StepSize:5m] CONDITION ($(CarStatusEvent\ AS\ statusEvent)$)[WindowSize:15min,StepSize:5m]
$\wedge$ AGGREGATE(statusEvent, "speed", {statusEvent.relatedCar}, AVG) AS avgSpeed $\wedge$ AGGREGATE(statusEvent, "speed", {statusEvent.relatedCar}, AVG) AS avgSpeed
@ -918,8 +918,44 @@ ACTION
callNotifyCustomerIsSpeedingService(relatedCar=statusEvent.relatedCar, averageSpeed=avgSpeed) callNotifyCustomerIsSpeedingService(relatedCar=statusEvent.relatedCar, averageSpeed=avgSpeed)
\end{lstlisting} \end{lstlisting}
\begin{lstlisting}[label={lst:csparql_speedavg_greater_140},caption={Fahrzeuge mit Durchschnittsgeschwindigkeit $>$ 140km/h}]
REGISTER QUERY getSpeedingCars AS
SELECT ?car (AVG(?speed) AS ?avgSpeed)
FROM STREAM <...> [RANGE 15m STEP 1m]
WHERE {
?e rdf:type car:CarStatusEvent .
?e car:relatedCar ?car .
?e car:speed ?speed .
}
GROUP BY (?car)
\end{lstlisting}
\section{Einbindung von Domänenwissen} \section{Einbindung von Domänenwissen}
Integration von Hintergrundwissen findet live im Query statt ohne extra Klimmzüge, da alles innerhalb der C-SPARQL-Queries abzufragen ist. Lediglich der lokale Graph muss gegebenenfalls genannt werden. Zur Einbindung von lokalem Domänenwissen bietet C-SPARQL sehr leicht zugängliche Möglichkeiten. Bevor das lokale Domänenwissen in C-SPARQL-Queries zur Verfügung steht, muss es zunächst in einen Graphen geladen werden. Der folgende Code liest die in der Date \texttt{data/carSimulationABox.rdf} gespeicherten RDF-Daten und hinterlegt sie für die Engine in dem Graphen \texttt{http://example.org/carSimKnowledgeGraph}:
\begin{lstlisting}
engine.putStaticNamedModel("http://example.org/carSimKnowledgeGraph",
CsparqlUtils.serializeRDFFile("data/carSimulationABox.rdf"));
\end{lstlisting}
Um auf diese Daten aus einem C-SPARQL-Query zugreifen zu können, ist es lediglich notwendig, den Graphen mit einer zusätzlichen \texttt{FROM}-Klausel als Datenquelle anzugeben:
\begin{lstlisting}
FROM <http://example.org/carSimKnowledgeGraph>
\end{lstlisting}
Danach stehen die Daten aus dem Graphen im Kontext der Abfrage zur frei zur Verfügung. Der folgende C-SPARQL-Query nutzt Daten aus dem lokalen Domänenwissen, um für zu schnell fahrende PKW den aktuellen Fahrer zu ermitteln:
\begin{lstlisting}[label={lst:csparql_lookup_driver},caption={Zugriff auf lokales Domänenwissen aus Graph}]
REGISTER QUERY getSpeedingCars AS
SELECT ?driverName ?car (AVG(?speed) AS ?avgSpeed)
FROM STREAM <...> [RANGE 15m STEP 1m]
FROM <http://example.org/carSimKnowledgeGraph>
WHERE {
?e rdf:type car:CarStatusEvent .
?e car:relatedCar ?car .
?e car:speed ?speed .
?driver car:isDriving ?car .
?driver car:hasName ?driverName .
}
GROUP BY (?car)
\end{lstlisting}
Die Verknüpfung von Ereignisdaten mit lokalem Domänenwissen ist bei der Nutzung der C-SPARQL-Engine direkt innerhalb von CEP-Regeln möglich und erleichtert somit deutlich die Formulierung von Regeln.
\section{Reasoning auf RDF-Datenströmen} \section{Reasoning auf RDF-Datenströmen}