[TASK] Generic commit.

This commit is contained in:
Jan Philipp Timme 2016-09-30 15:24:59 +02:00
parent 424db984e5
commit 2cd773b73f
1 changed files with 12 additions and 27 deletions

View File

@ -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 <http://example.org> [RANGE 5s STEP 1s]
WHERE {
?a a <http://example.org/type/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{<http://example.org/type/A>}:
\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{<http://example.org/type/A>} in der Variable \texttt{?eventA}:
\begin{lstlisting}
?eventA rdf:type <http://example.org/type/A> .
\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: <http://larkc.eu/csparql/sparql/jena/ext#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
SELECT ?a ?b ?c
FROM STREAM <http://example.org> [RANGE 5s STEP 1s]
WHERE {
?a a <http://example.org/type/A> .
?c a <http://example.org/type/C> .
BIND(f:timestamp(?a,rdf:type,<http://example.org/type/A>) AS ?tsa)
BIND(f:timestamp(?c,rdf:type,<http://example.org/type/C>) AS ?tsc)
FILTER(?tsa < ?tsc)
FILTER NOT EXISTS {
?b a <http://example.org/type/B> .
BIND(f:timestamp(?b,rdf:type,<http://example.org/type/B>) 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 <http://example.org/type/X> .
?eventY rdf:type <http://example.org/type/Y> .
FILTER(f:timestamp(?eventX,rdf:type,<http://example.org/type/X>) < f:timestamp(?eventY,rdf:type,<http://example.org/type/Y>))
\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