From 437cc82521b01cffee95b86717d2d0d4416068f2 Mon Sep 17 00:00:00 2001 From: Jan Philipp Timme Date: Wed, 5 Oct 2016 19:50:55 +0200 Subject: [PATCH] [TASK] Generic commit. --- Bachelorarbeit.tex | 40 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/Bachelorarbeit.tex b/Bachelorarbeit.tex index 1d6c8c7..b5e6f33 100644 --- a/Bachelorarbeit.tex +++ b/Bachelorarbeit.tex @@ -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} 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}] CONDITION ($(CarStatusEvent\ AS\ statusEvent)$)[WindowSize:15min,StepSize:5m] $\wedge$ AGGREGATE(statusEvent, "speed", {statusEvent.relatedCar}, AVG) AS avgSpeed @@ -918,8 +918,44 @@ ACTION callNotifyCustomerIsSpeedingService(relatedCar=statusEvent.relatedCar, averageSpeed=avgSpeed) \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} -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 +\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 +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}