%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Setup des Dokuments
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\documentclass[12pt,DIV14,BCOR10mm,a4paper,twoside,parskip=half-,headsepline,headinclude]{scrreprt} % Grundgröße 12pt, zweiseitig
% Packages from template
\usepackage[headsepline,automark]{scrpage2} % Seitenköpfe automatisch
\KOMAoptions{headinclude} % Fix
\usepackage[german]{babel} % Sprachpaket für Deutsch (Umlaute, Trennung,deutsche Überschriften)
% Not needed anymore
% \usepackage{blindtext}
\usepackage{graphicx,hyperref} % Graphikeinbindung, Hyperref (alles klickbar, Bookmarks)
\usepackage{amssymb} % Math. Symbole aus AmsTeX
\usepackage[utf8]{inputenc} % Umlaute
% Custom packages
\usepackage[autostyle=true,german=quotes]{csquotes} % Anführungszeichen mit \enquote{}
\usepackage{textcomp} % Zusätzliches Package für °C
\usepackage{listings} % Codesnippets
\usepackage{scrhack} % Hack for lstlisting i suspect :-/
\usepackage{color}
% Setup für Codeblocks
\lstset{
	% Optionen
	breaklines=true,
	breakatwhitespace=true,
	breakautoindent=true,
	frame=single,
	%framexleftmargin=19pt,
	inputencoding=utf8,
	%language=awk,
	%numbers=left,
	%numbersep=8pt,
	showspaces=false,
	showstringspaces=false,
	tabsize=1,
	%xleftmargin=19pt,
	captionpos=b,
	% Styling
	basicstyle=\footnotesize\ttfamily,
	commentstyle=\footnotesize,
	keywordstyle=\footnotesize\ttfamily,
	numberstyle=\footnotesize,
	stringstyle=\footnotesize\ttfamily,
}
% Hack für Sonderzeichen in Codeblocks
\lstset{literate=%
    {Ö}{{\"O}}1
    {Ä}{{\"A}}1
    {Ü}{{\"U}}1
    {ß}{{\ss}}1
    {ü}{{\"u}}1
    {ä}{{\"a}}1
    {ö}{{\"o}}1
    {°}{{${^\circ}$}}1
}

% Befehl für TODO-Markierungen
\newcommand{\todo}[1]{\textcolor{blue}{\emph{Hier gibt es noch zu tun: #1}}}

% Broken citation needs broken command
\newcommand\mathplus{+}

% Festlegung Kopf- und Fußzeile     
\defpagestyle{meinstil}{%
	{\headmark \hfill}
	{\hfill \headmark}
	{\hfill \headmark\hfill}
	(\textwidth,.4pt)
}{%
	(\textwidth,.4pt)
	{\pagemark\hfill Jan Philipp Timme}
	{Version 0.1 vom \today \hfill \pagemark}
	{Version 0.1 vom \today \hfill \pagemark}
}
\pagestyle{meinstil}

\raggedbottom

\renewcommand{\topfraction}{1}
\renewcommand{\bottomfraction}{1}
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Beginn der Inhalte
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}

% Titelseite
\thispagestyle{empty}
\includegraphics[width=0.2\textwidth]{res/Wortmarke_WI_schwarz.pdf}
{ ~ \sffamily
	\vfill
	{\Huge\bfseries Verarbeitung von Datenströmen im RDF-Format in Kombination mit Hintergrundwissen in der C-SPARQL-Engine}
	\bigskip

	{\Large Jan Philipp Timme
		\\[2ex]
		Bachelor-Arbeit im Studiengang "`Angewandte Informatik"'
		\\[5ex]
		\today
	}
}
\vfill
	~ \hfill
	\includegraphics[height=0.3\paperheight]{res/H_WI_Pantone1665.pdf}
\vspace*{-3cm}

% Seite mit Personen und Selbstständigkeitserklärung
\newpage \thispagestyle{empty}
\begin{tabular}{ll}
{\bfseries\sffamily Autor} &  Jan Philipp Timme \\ 
	& 1271449 \\
	& jan-philipp.timme@stud.hs-hannover.de \\[5ex]
{\bfseries\sffamily Erstprüfer} & Prof. Dr. Jürgen Dunkel \\
	& Abteilung Informatik, Fakultät IV \\
	& Hochschule Hannover \\
	& juergen.dunkel@hs-hannover.de \\[5ex]
{\bfseries\sffamily Zweitprüfer} & N. N. \\
	& Abteilung Informatik, Fakultät IV \\
	& Hochschule Hannover \\
	& ---@---.--
\end{tabular}

\vfill

% fett und zentriert in der Minipage
\begin{center} \sffamily\bfseries Selbständigkeitserklärung \end{center}

Hiermit erkläre ich, dass ich die eingereichte Bachelor-Arbeit
selbständig und ohne fremde Hilfe verfasst, andere als die von mir angegebenen Quellen
und Hilfsmittel nicht benutzt und die den benutzten Werken wörtlich oder
inhaltlich entnommenen Stellen als solche kenntlich gemacht habe. 
\vspace*{7ex}

Hannover, den \today \hfill Unterschrift

\pdfbookmark[0]{Inhalt}{contents}
% Inhaltsverzeichnis
\tableofcontents
% Abbildungsverzeichnis
\listoffigures
% Codeverzeichnis
\lstlistoflistings
% Tabellenverzeichnis
\listoftables

\newpage

%%% Hier kommt inhaltlicher Inhalt! %%%

\chapter{Einleitung}

Diese Arbeit beschäftigt sich mit \enquote{Complex Event Processing} (CEP), also der Verarbeitung komplexer Ereignisse auf Ereignisdatenströmen mit Integration von Hintergrundwissen, und der praktischen Nutzung der CEP-Engine C-SPARQL.

Nach einem kurzen Einstieg in das Thema CEP soll der Leser einen Einblick in die Features von aktuellen CEP-Engines erhalten und am Beispiel der Engine C-SPARQL\footnote{Mehr Informationen zu C-SPARQL und Download unter \url{http://streamreasoning.org/download}} die Verarbeitung von Ereignisströmen im RDF-Format in Kombination mit Hintergrundwissen im Detail kennenlernen.
An einem Beispielszenario soll dann der Praxiseinsatz von C-SPARQL erklärt werden, in dem einige der vorgestellten Funktionen Anwendung finden. Im Abschluss wird ein kurzer Ausblick auf die technischen Möglichkeiten des \enquote{Reasoning} gegeben - eine Technik, die es erlaubt auf den vorhandenen und eingehenden Daten logische Operationen und Schlussfolgerungen durchzuführen um daraus neues Wissen abzuleiten.

\todo{Mehr Inhalt}

\section{Einführung in Complex Event Processing}

Im folgenden Abschnitt wird ein kurzer Einstieg in das Konzept von Complex Event Processing (CEP) gegeben. Eine detailreiche Erläuterung von CEP und die beispielhafte Anwendung der CEP-Engine \enquote{Esper} wird in \cite{hsh:cep} beschrieben.

Wie der Begriff \enquote{Complex Event Processing} schon andeutet, geht es bei CEP um die Verarbeitung von komplexen Ereignissen.
Dank der immer weiter fortschreitenden Digitalisierung in unserer Welt steckt in nahezu jedem Gebäude, Fahrzeug, Haushaltsgerät bis hin zur Hosentasche inzwischen ein (wenn auch kleiner) Computer, der über seine Umgebung Informationen sammelt.
Dies kann durch angeschlossene Sensoren geschehen, Überwachung von vernetzten Komponenten oder durch menschliche Bedienung oder Nutzung.
Beispielsweise erhält der Bordcomputer eines Autos regelmäßig Informationen von den im Auto verbauten Komponenten über fehlgeschlagene Zündungen, die Temperatur des Motors, oder den Einschlagswinkel des Lenkrades.
All diese Informationen können als Messereignisse betrachtet werden, die dem Bordcomputer von den einzelnen Sensoren und Komponenten übermittelt werden.

Während das Beispiel des PKW schon bald komplett in die Kategorie des sogenannten \enquote{Internet der Dinge} fallen wird, finden sich im Internet auf Webseiten zahlreiche weitere Beispiele für Informationen, die in Form von Ereignissen auftreten. 
Ein Beispiel hierfür sind Benutzerinteraktionen: Das Auslösen einer Bestellung in einem Onlineshop, das Ändern eines Passwortes durch einen Benutzer oder das Versenden einer Nachricht in einem sozialen Netzwerk sind Ereignisse, die eine Menge an Informationen enthalten.

Abhängig von der Anzahl aktiver Benutzer auf der Webseite, die als Datenquelle dienen soll, kann die Anzahl der dort ausgelösten Ereignisse so groß werden, dass innerhalb von kleinen Zeiträumen bereits \emph{sehr große Datenmengen} zusammenkommen.
Eine Speicherung der Ereignisse hat aufgrund der begrenzten Gültigkeitsdauer ihrer Informationen\footnote{Das Ergebnis der Messung der aktuellen Temperatur eines Automotors kann je nach Situation nur wenige Minuten aktuell sein und wird durch das nächste Messergebnis obsolet.} höchstens einen protokollierenden Nutzen. Daher werden die Ereignisse in Form von Datenströmen an die CEP-Engine übermittelt und dort \emph{nur} für den Zeitraum der Verarbeitung im Hauptspeicher vorgehalten.

Die Informationen der Ereignisse stellen den momentanen Zustand dar; allerdings sind sie für sich alleine betrachtet Kontext- und somit Bedeutungslos. Betrachtet man beispielsweise das Ereignis \enquote{Die gemessene Motortemperatur beträgt 40°C.}, so ist daraus nicht zu erkennen, ob das Fahrzeug gerade seit kurzem auf der Straße unterwegs ist oder lediglich im Hochsommer in der Sonne steht. Auch ist nicht zu erkennen, ob es sich bei dem Motor überhaupt um einen Automotor handelt. Dass überhaupt von einer \enquote{Motortemperatur} die Rede sein kann impliziert bereits die Existenz von \emph{Hintergrundwissen} darüber, wo der Temperatursensor platziert ist - und somit, worauf sich die gemessene Temperatur bezieht.

Ein weiterer wichtiger Faktor ist der Zeitraum, in dem Ereignisse auftreten. Um dies näher zu erläutern, betrachten wir beispielhaft den folgenden Ereignisstrom:
\begin{lstlisting}[caption={Exemplarischer Ereignisstrom: Motortemperatur eines PKW}]
[T=1] Temperatursensor: 40°C
[T=2] Temperatursensor: 48°C
[T=3] Temperatursensor: 61°C
[T=4] Temperatursensor: 84°C
\end{lstlisting}
Unter Verwendung von Hintergrundwissen sei nun verraten: Der Temperatursensor befindet sich an dem Motor eines PKW und hat in regelmäßigen Abständen diese vier Messwerte gemeldet. Auf den ersten Blick ist ersichtlich, dass die Messwerte einen sehr starken Temperaturanstieg abbilden, jedoch kann über den nächsten Messwert nur spekuliert werden, da die zeitlichen Abstände zwischen den Messereignissen einen großen Unterschied ausmachen können. Liegen zwischen den Messereignissen beispielsweise etwa 30-60 Minuten, so könnte es sich um einen normalen Betrieb bei hoher Geschwindigkeit handeln. Sollten jedoch nur wenige Minuten zwischen den Messereignissen vergangen sein, so lassen die Messwerte auf einen Defekt im Kühlsystem schließen und ein Motorschaden wäre eine mögliche Folge. Die Zeitachse darf somit bei der Ereignisverarbeitung nicht vernachlässigt werden.

Ein weiterer wichtiger Gesichtspunkt ist die Kombination von verschiedenen Ereignissen miteinander. Dies kann genutzt werden, um für ein Ereignis weitere Informationen aus dem Kontext zu erhalten oder um ein Ereignis mit Daten aus anderer Quelle abgleichen zu können. So können beispielsweise die Temperaturmessungen aus dem obigen Beispiel mit Informationen über die Geschwindigkeit des PKW in dem Zeitraum abgeglichen werden oder durch den Vergleich mit anderen Temperatursensoren falsche Messergebnisse durch defekte Sensoren erkannt werden.
Darauf aufbauend ist die Mustererkennung ist ein weiteres Kernfeature von CEP-Engines und dient dazu, aus bestimmten primitiven Ereignissen in vorgegebener Abfolge einen höheren Sachverhalt abzuleiten. Treten bei einem PKW beispielsweise nacheinander die Ereignisse \enquote{Motor abgeschaltet}, \enquote{Fahrzeug verriegelt} und \enquote{PKW beschleunigt} auf, so ist ein abgestelltes Fahrzeug losgerollt, und man sollte unverzüglich dessen Besitzer darüber informieren.

Insgesamt liegt die Herausforderung bei CEP also darin große Ströme von Ereignissen unter Zuhilfenahme von Hintergrundwissen zu kombinieren, relevante Ereignisse daraus zu selektieren und unter diesen Muster zu erkennen, daraus höherwertige und bedeutungsvolle Ereignisse zu konstruieren und möglichst in Echtzeit weiterzugeben.

\section{Complex Event Processing auf RDF-Datenströmen}

Um Ereignisse aus verschiedenartigen Quellen gemeinsam zu verarbeiten ist das RDF-Format das Mittel der Wahl. Das Ressource Description Framework (RDF) wird bereits im semantischen Web zur Erfassung und Verknüpfung von Wissen verwendet und kann leicht über die Sprache SPARQL (\enquote{SPARQL Protocol And RDF Query Language}) abgefragt werden. Hierbei werden die Ereignisdatenströme der Engine entweder direkt als RDF-Datenstrom zugeführt oder falls nötig zuvor in einen RDF-Datenstrom konvertiert. Da RDF-Daten aus vielen (Subjekt, Prädikat, Objekt)-Tripeln bestehen, gehen bei der Umwandlung keine Informationen verloren.

\begin{lstlisting}[caption={Beispielhafte Ereignisse im RDF-Format}]
http://myexample.org/cars/event#1468064960110	http://myexample.org/cars#carID	http://myexample.org/cars#8
http://myexample.org/cars/event#1468064960110	http://myexample.org/cars#currentTemperature	"27"^^http://www.w3.org/2001/XMLSchema#integer	
http://myexample.org/cars/event#1468064960110	http://myexample.org/cars#currentSpeed	"13"^^http://www.w3.org/2001/XMLSchema#integer	
\end{lstlisting}

Der große Vorteil bei der Arbeit mit SPARQL auf RDF-Datenströmen liegt darin, innerhalb einer einzigen SPARQL-Abfrage Ereignisse aus verschiedenen Quellen miteinander zu kombinieren, direkt mit Hintergrundwissen zu kombinieren, nach eigenen Kriterien zu filtern, einfache Berechnungen anzustellen und aus dem Ergebnis neue Ereignisse beliebiger Struktur zu erzeugen.

\begin{lstlisting}[caption={Erzeugung von Beschleunigungs-Ereignissen mit SPARQL}]
REGISTER QUERY ConstructAcceleratingCars AS
PREFIX f: <http://larkc.eu/csparql/sparql/jena/ext#>
PREFIX cars: <http://myexample.org/cars#>
CONSTRUCT {
	[] cars:carID ?car;
	   cars:acceleratedBy ?deltaSpeed .
}
FROM STREAM <http://myexample.org/cars> [RANGE 5s STEP 1s]
WHERE {
	?e1 cars:carID ?car ;
	    cars:currentSpeed ?speed1 .
	?e2 cars:carID ?car ;
	    cars:currentSpeed ?speed2 .
	BIND (?speed2 - ?speed1 AS ?deltaSpeed)
	FILTER(f:timestamp(?e1,cars:carID,?car) < f:timestamp(?e2,cars:carID,?car))
	FILTER(?speed1 < ?speed2)
}
\end{lstlisting}


\chapter{Gegenüberstellung existierender CEP-Engines}

Es gibt bereits einige Technologien um Ereignisströme zu verarbeiten.
Im Folgenden stelle ich nun ein paar bekannte Systeme kurz vor.

\section{Anforderungen an CEP-Engines}

Wichtig wären gegebenenfalls diese Kriterien:

\begin{itemize}
\item Verarbeitung von mehreren Ereignisströmen
\item Kombination von Ereignissen \enquote{Join}
\item Konstruktion neuer Ereignisse
\item Sliding/Tumbling Windows
\item Mustererkennung (Abfolge, Präsenz/Absenz von Ereignissen [zeitlicher Abstand])
\item \enquote{COMPUTE EVERY} - Neuberechnung in festen Intervallen
\item Ausführen von benutzerdefiniertem Code
\item Integration von Hintergrundwissen [aus weiteren Quellen]
\item Aggregationsfunktionen über mehrere Ereignisse (Sum, Avg, ...)
\item Vergleichsoperatoren für Selektionskriterien
\item Bonuspunkte: Reasoning (Logikoperationen und Schlussfolgerungen)
\end{itemize}

\section{Etalis/EP-SPARQL?}

\todo{Grobe Charakteristik recherchieren}

\section{CQELS?}

\todo{Generell mal recherchieren}

\section{Esper}

\todo{}
Ein Ansatz mit einer eigenen Abfragesprache.
Hintergrundwissen etwas fummelig, aber theoretisch möglich. Nur halt nicht in der selben Abfragesprache.

\section{C-SPARQL}

Verarbeitet Ströme im RDF-Format. Kann Hintergrundwissen im RDF-Format einbeziehen. Wurde in Java implementiert \dots
Es gibt einen W3C-Standard für die Sprache C-SPARQL.
Diese Engine werde ich nachher genauer vorstellen und benutzen.

\subsection{Bekannte Probleme}

Die Timestamp-Funktion der C-SPARQL-Engine (Version 0.9.6) gibt für Tripel die Literale enthalten keinen Timestamp zurück. Dadurch ist es nicht direkt möglich, solche Tripel zeitlich einzuordnen. Es ist allerdings möglich, dieses Problem durch Erweiterung oder Umstrukturierung der Ereignistripel zu umgehen.

\chapter{Die C-SPARQL-Engine im Detail}

So, hier kommt dann das, was man so zu C-SPARQL erzählen kann.
Dieser Bereich bekommt noch genug Sections für die Features von C-SPARQL.

\todo {Teilbereiche überdenken und füllen}

\section{Abfrage von bestimmten Ereignistypen}

\todo{Überhaupt Text}

\section{Keine Ahnung, aber ganz viel}

\todo{Überhaupt Text}

\chapter{Die C-SPARQL-Engine im Einsatz}

Hier wird jetzt mal wirklich C-SPARQL verwendet.

\section{RDF-Datenströme}

Spannender ist es, wenn man dann ein Haufen RDF-Tripel reingedrückt bekommt.
Die sehen anders aus, sind aber auch toll.
Schemenhaft könnten die ja so aussehen:

Wir können uns diese Datenströme angucken und beispielsweise auf bestimmte Dinge achten.
Aber irgendwie ist das nicht so toll, weil unsere Abfragen recht spezifisch sein müssen.
Wäre es nicht toll, wenn wir bestimmte Dinge bereits vorher irgendwie da integrieren könnten?

\section{Beispielszenario}

Ich hab noch keine richtig tolle Idee, aber das kommt noch.

\section{Umsetzung mit C-SPARQL}

Jetzt kommt ein kurzer Schwank dazu, wie die Umsetzung gedacht ist.

\subsection{Nötiger Code für das Setup}

Zunächst wird ein Datenstrom benötigt; dafür wäre ein kleiner Generator nicht verkehrt.

\subsection{Abfrage des Datenstroms mit C-SPARQL}

Und jetzt werden Listener und Abfragen gebaut, um aus diesem Strom Informationen zu extrahieren oder neue, höherwertige Ereignisse zu konstruieren.

\section{Bewertung/Ergebnis}

\enquote{Und? Wie war's?}

\chapter{Fazit}

Die Engine macht sich hoffentlich ganz gut.

\chapter{Ausblick}

Vielleicht geht das mit dem Reasoning später ja noch besser - aktueller Stand ist noch limitiert, aber es wird fleißig daran geforscht. \dots

% Kurzer Test
\cite{hsh:cep}[Einstieg]
\cite{hsh:integrating}[erste Quelle]
\cite{barbieri:reasoning}[zweite Quelle]
\cite{barbieri:querying}[dritte Quelle]

% Referenz auf Bibtex mit Kommentar
% \cite{robbins:gawk}[Siehe ab S.95]

% Einbinden von Tex-Files
%\input{abkuerz.tex}
%\input{einfuehrung.tex}

% Einbinden von größeren Tex-Files, z.B. Kapiteln
%\include{normen}
%\include{aufbau}
%\include{zitieren}
%\include{form}
%\include{allgtips}

%%% Ende inhaltlicher Inhalt! %%%

% Literaturverzeichnis
% Schlüssel als Buchstaben
\bibliographystyle{alpha}
\bibliography{Literaturverweise}

\end{document}
% Nothing beyond this line!
