[TASK] Generic commit.
This commit is contained in:
parent
51aeb6c141
commit
437cc82521
|
@ -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 <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}
|
||||
|
|
Loading…
Reference in New Issue