[TASK] Generic commit.
This commit is contained in:
parent
424db984e5
commit
2cd773b73f
@ -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.
|
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}]
|
\begin{lstlisting}[label={lst:example_csparql_query},caption={Beispielhafter C-SPARQL-Query}]
|
||||||
REGISTER QUERY exampleQuery AS
|
REGISTER QUERY exampleQuery AS
|
||||||
SELECT ?a ?b ?c
|
SELECT ?a ?c
|
||||||
FROM STREAM <http://example.org> [RANGE 5s STEP 1s]
|
FROM STREAM <http://example.org> [RANGE 5s STEP 1s]
|
||||||
WHERE {
|
WHERE {
|
||||||
?a a <http://example.org/type/A> .
|
?a a <http://example.org/type/A> .
|
||||||
@ -666,7 +666,7 @@ WHERE {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
\end{lstlisting}
|
\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}
|
\begin{lstlisting}
|
||||||
'REGISTER' ('QUERY'|'STREAM') QName 'AS' Query
|
'REGISTER' ('QUERY'|'STREAM') QName 'AS' Query
|
||||||
\end{lstlisting}
|
\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.
|
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}
|
\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}
|
\begin{lstlisting}
|
||||||
?eventA rdf:type <http://example.org/type/A> .
|
?eventA rdf:type <http://example.org/type/A> .
|
||||||
\end{lstlisting}
|
\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,
|
\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:
|
||||||
\end{itemize}
|
\begin{lstlisting}
|
||||||
|
?eventX rdf:type <http://example.org/type/X> .
|
||||||
Ich hab da mal etwas vorbereitet, und zwar das Äquivalent zu $A\ \rightarrow\ (\neg B)\ \rightarrow\ C$:
|
?eventY rdf:type <http://example.org/type/Y> .
|
||||||
\begin{lstlisting}[label={},caption={C-SPARQL-Query für Muster $A\ \rightarrow\ (\neg B)\ \rightarrow C$}]
|
FILTER(f:timestamp(?eventX,rdf:type,<http://example.org/type/X>) < f:timestamp(?eventY,rdf:type,<http://example.org/type/Y>))
|
||||||
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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
\end{lstlisting}
|
\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}
|
\paragraph{Aggregation von Ereignissen}
|
||||||
\dots
|
\dots
|
||||||
|
Loading…
Reference in New Issue
Block a user