%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 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}{\textcolor{blue}{\emph{Dieser Bereich ist in Bearbeitung.}}} % 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 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 Features Anwendung finden. Im Abschluss wird ein kurzer Ausblick auf die technischen Möglichkeiten des Reasoning gegeben - eine Technik, die es erlaubt auf den vorhandenen und eingehenden Daten logische Schlussfolgerungen und Operationen durchzuführen um neues Wissen zu erhalten. \todo \section{Einführung in Complex Event Processing} Im folgenden Abschnitt wird ein kurzer Überblick über Complex Event Processing (CEP) gegeben. Eine detailreiche Erläuterung von CEP und die Anwendung der Engine Esper in einem Beispielszenario wird in \cite{hsh:cep} beschrieben. Ereignisse stellen einen konkreten momentanen Zustand dar, aber sind für sich alleine betrachtet kontextlos; die daraus resultierende Bedeutung fehlt. Weiterhin sind diese Informationen oft nur für einen begrenzten Zeitraum gültig. Die Erkennung von Mustern in den Ereignissen ist interessant. \section{Ereignisquellen} Ereignisse treten überall auf, wenn man sich darauf einlässt. Welche Ereignisse kann man sich denn so vorstellen? Diese hier: \begin{itemize} \item Ein Online-Shop meldet eine ausgelöste Bestellung \item Ein soziales Netzwerk meldet die Interaktion eines Benutzers \item Die Wetterstation meldet ihre aktuellen Messwerte \item Windkraftanlagen melden ihre Drehgeschwindigkeit \item Ein Auto meldet Fehlzündungen im zweiten Zylinder \item Fabrikmaschinen melden Fehler im Betrieb \item Rauchmelder melden ihre Auslösung \item \dots und vieles mehr \end{itemize} \section{Ereignisse als Informationsträger} Alles, was irgendwo passiert liefert Informationen über den Zustand unserer Umgebung. Jede aktuell gemeldete Information ist ein Ereignis. Eine gerade gemessene Temperatur, eine Fehlermeldung einer Werkzeugmaschine oder das Auslösen eines Rauchmelders sind Ereignisse, die einen aktuellen Zustand unserer Welt repräsentieren. Für unsere Zwecke können wir das nutzen. Ereignisse haben einen Zeitstempel [und eine ID]. Der Zeitstempel ist wichtig, die ID auch etwas. Ein Ereignis kann beispielsweise so strukturiert sein: \begin{lstlisting}[caption={Beispielhaftes Ereignis dargestellt in JSON}] { "ID": "17352", "Zeitstempel": "Mo 4. Apr 12:38:19 CEST 2016", "Daten": { "Temperatur": "19°C", "Luftfeuchtigkeit": "31%" } } \end{lstlisting} \section{Ereignisströme als Datenquelle} Ja, Ereignisse treten öfters in Rudeln auf. Wenn viele Ereignisse aneinandergereiht werden, spricht man von einem Ereignisstrom. Anbieter von Daten können anstatt aktueller Messwerte als einzelnes Ereignis natürlich gleich Ereignisströme liefern. Das ist technisch sicherlich auch ganz praktisch, weil Verzicht auf Polling und so Sachen. \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?} Kenne ich noch nicht. \section{CQELS?} Kenne ich noch nicht. \section{Esper} 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. \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. \section{Abfrage von bestimmten Ereignistypen} \todo \section{Keine Ahnung, aber ganz viel} \todo \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!