From 2cd773b73f312c2207ef7d3dcf63bde5f0201d75 Mon Sep 17 00:00:00 2001 From: Jan Philipp Timme Date: Fri, 30 Sep 2016 15:24:59 +0200 Subject: [PATCH] [TASK] Generic commit. --- Bachelorarbeit.tex | 39 ++++++++++++--------------------------- 1 file changed, 12 insertions(+), 27 deletions(-) diff --git a/Bachelorarbeit.tex b/Bachelorarbeit.tex index f481ccd..ffe653c 100644 --- a/Bachelorarbeit.tex +++ b/Bachelorarbeit.tex @@ -651,7 +651,7 @@ Um die Ereignisdatenströme mit RDF-Quadrupeln nun in der C-SPARQL-Engine verarb Da C-SPARQL die Abfragesprache SPARQL lediglich erweitert, sind alle gültigen SPARQL-Abfragen automatisch auch gültige C-SPARQL-Abfragen\cite{barbieri:csparql}. Bevor nun die einzelnen Features von C-SPARQL erläutert werden, folgt nun ein ein gültiger Beispiel-Query, der als Grundlage der Erläuterungen dienen soll. Die Angabe von Prefixen mit der \texttt{PREFIX}-Klausel ist natürlich auch in C-SPARQL-Abfragen erforderlich, wird in diesem Abschnitt aber aus Gründen der Übersichtlichkeit weggelassen. \begin{lstlisting}[label={lst:example_csparql_query},caption={Beispielhafter C-SPARQL-Query}] REGISTER QUERY exampleQuery AS -SELECT ?a ?b ?c +SELECT ?a ?c FROM STREAM [RANGE 5s STEP 1s] WHERE { ?a a . @@ -666,7 +666,7 @@ WHERE { } } \end{lstlisting} -Zuerst fällt auf, dass C-SPARQL die Registrierung des Queries an der Engine erfordert. Diese wird nach dem folgenden Schema durchgeführt, wobei \texttt{QName} einen Namen für die Abfrage angibt und \texttt{Query} für die gesamte, restliche Abfrage steht: +Betrachtet man den Beispielquery aus Listing~\ref{lst:example_csparql_query}, so ist erkennbar, dass C-SPARQL die Registrierung des Queries an der Engine erfordert. Diese wird nach dem folgenden Schema durchgeführt, wobei \texttt{QName} einen Namen für die Abfrage angibt und \texttt{Query} für die gesamte, restliche Abfrage steht: \begin{lstlisting} 'REGISTER' ('QUERY'|'STREAM') QName 'AS' Query \end{lstlisting} @@ -774,35 +774,20 @@ Natürlich kann man diese Abfrage auch umkehren um alle Personentripel \textbf{m Um nun in C-SPARQL Ereignismuster formulieren zu können, die denen aus Kapitel~\ref{cpt:cep_intro} entsprechen, müssen zunächst die Operatoren aus der Ereignisalgebra aus Anweisungen in C-SPARQL übersetzt werden. \begin{itemize} -\item \textbf{Ereignistypen} $(A)$: Bevor die Operatoren aus der Ereignisalgebra verwendet werden können, muss zunächst die Selektion von Ereignissen spezifischer Typen gezeigt werden. Wie Listing~\ref{lst:sample_event_rdf_quads} bereits demonstriert hat, wird das Prädikat \texttt{rdf:type} verwendet, um den Ereignistyp einer Ereignisinstanz zu spezifizieren. Diese Angabe kann bei der Selektion von Tripeln verwendet werden, um nur Ereignisinstanzen eines bestimmten Ereignistypen zu erhalten. Platziert man das folgende Muster in der \texttt{WHERE}-Klausel einer C-SPARQL-Abfrage, so erhält man Ereignisse vom Typ \texttt{}: +\item \textbf{Ereignistypen} $(A)$: Bevor die Operatoren aus der Ereignisalgebra verwendet werden können, muss zunächst die Selektion von Ereignissen spezifischer Typen gezeigt werden. Wie Listing~\ref{lst:sample_event_rdf_quads} bereits demonstriert hat, wird das Prädikat \texttt{rdf:type} verwendet, um den Ereignistyp einer Ereignisinstanz zu spezifizieren. Diese Angabe kann bei der Selektion von Tripeln verwendet werden, um nur Ereignisinstanzen eines bestimmten Ereignistypen zu erhalten. Platziert man das folgende Muster in der \texttt{WHERE}-Klausel einer C-SPARQL-Abfrage, so erhält man Subjekte von Ereignisinstanzen vom Typ \texttt{} in der Variable \texttt{?eventA}: \begin{lstlisting} ?eventA rdf:type . \end{lstlisting} -\item Der \textbf{Sequenzoperator} $X\ \rightarrow\ Y$: Um die zeitliche Abfolge von Ereignissen mit C-SPARQL zu formulieren, wird die \texttt{f:timestamp(?s,?p,?o)}-Funktion mit der \texttt{FILTER}-Anweisung kombiniert. Hat man bereits zwei Ereignisse --- je eines vom Typ X beziehungsweise Y --- selektiert, so kann man diese Anhand ihrer Zeitstempel filtern, sodass nur in der Ergebnismenge nur Ereignisse übrig bleiben, - -\end{itemize} - -Ich hab da mal etwas vorbereitet, und zwar das Äquivalent zu $A\ \rightarrow\ (\neg B)\ \rightarrow\ C$: -\begin{lstlisting}[label={},caption={C-SPARQL-Query für Muster $A\ \rightarrow\ (\neg B)\ \rightarrow C$}] -REGISTER QUERY matchANotBC AS -PREFIX f: -PREFIX rdf: -PREFIX xsd: -SELECT ?a ?b ?c -FROM STREAM [RANGE 5s STEP 1s] -WHERE { - ?a a . - ?c a . - BIND(f:timestamp(?a,rdf:type,) AS ?tsa) - BIND(f:timestamp(?c,rdf:type,) AS ?tsc) - FILTER(?tsa < ?tsc) - FILTER NOT EXISTS { - ?b a . - BIND(f:timestamp(?b,rdf:type,) AS ?tsb) - FILTER(?tsa < ?tsb && ?tsb < ?tsc) - } -} +\item Der \textbf{Sequenzoperator} $X\ \rightarrow\ Y$: Um die zeitliche Abfolge von Ereignissen mit C-SPARQL zu formulieren, wird die \texttt{f:timestamp(?s,?p,?o)}-Funktion mit der \texttt{FILTER}-Anweisung kombiniert. Hat man bereits zwei Ereignisse --- je eines vom Typ X beziehungsweise Y --- selektiert, so kann man diese Anhand ihrer Zeitstempel filtern, sodass nur in der Ergebnismenge nur die Ereignisinstanzen übrig bleiben, für die gilt: Ereignis vom Typ X kam vor dem Ereignis von Typ Y. +Innerhalb der \texttt{WHERE}-Klausel sieht dies wie folgt aus: +\begin{lstlisting} +?eventX rdf:type . +?eventY rdf:type . +FILTER(f:timestamp(?eventX,rdf:type,) < f:timestamp(?eventY,rdf:type,)) \end{lstlisting} +\item Die \textbf{boolschen Operatoren} $\wedge$ und $\vee$: Öhm ... muss ich selber bauen \todo{FUCK!} +\item Der \textbf{Negationsoperator} ($\neg A$): \dots +\end{itemize} \paragraph{Aggregation von Ereignissen} \dots