From af0d0cbbbb276e3d379f58931d03b03cdf74aafe Mon Sep 17 00:00:00 2001 From: Jan Philipp Timme Date: Tue, 13 Sep 2016 19:34:15 +0200 Subject: [PATCH] [TASK] Sliding window graphics. --- Bachelorarbeit.tex | 17 +- img/sliding-window.pdf | Bin 0 -> 9744 bytes img/sliding-window.svg | 940 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 948 insertions(+), 9 deletions(-) create mode 100644 img/sliding-window.pdf create mode 100644 img/sliding-window.svg diff --git a/Bachelorarbeit.tex b/Bachelorarbeit.tex index 8b7fffa..dbb77fa 100644 --- a/Bachelorarbeit.tex +++ b/Bachelorarbeit.tex @@ -153,17 +153,11 @@ Hannover, den \today \hfill Unterschrift \chapter{Motivation}\label{cpt:motivation} -Mit der fortschreitenden Digitalisierung von Alltagsgegenständen und ihrer Verbindung mit dem Internet wächst das sogenannte Internet of Things. Dadurch sind auch immer mehr offene Systeme online verfügbar, die ihre Sensordaten und Zustandsinformationen als \emph{RDF}\footnote{Resource Description Framework --- Mehr dazu in Kapitel \ref{cpt:basics}}-Datenstrom anbieten. Diese Ereignisdatenströme liefern durchgehend und hochfrequent Ereignisdaten, sodass innerhalb kurzer Zeit sehr große Datenmengen anfallen, die zwecks Extraktion von Informationen und Auslösen von Reaktionen in kürzester Zeit verarbeitet werden sollen. +Mit der fortschreitenden Digitalisierung von Alltagsgegenständen und ihrer Verbindung mit dem Internet wächst das sogenannte Internet of Things. Dadurch sind auch immer mehr offene Systeme online verfügbar, die ihre Sensordaten und Zustandsinformationen als \emph{RDF}\footnote{Resource Description Framework --- Mehr dazu in Kapitel \ref{cpt:basics}}-Datenstrom anbieten. Diese Ereignisdatenströme liefern durchgehend und hochfrequent Ereignisdaten, sodass innerhalb kurzer Zeit sehr große Datenmengen anfallen, die zwecks Extraktion von Informationen und Auslösen von Reaktionen in kürzester Zeit verarbeitet werden sollen. Die Ereignisdaten aus diesen Strömen bilden kleine Teile der Realität zumindest nä\-herungs\-wei\-se über die in ihnen enthalten Messdaten und Zustandsinformationen ab, sofern sie nicht bedingt durch technischen Defekt oder Messfehler ungültige Daten enthalten und somit vor der weiteren Verarbeitung herausgefiltert werden sollten. Ein weiteres Problem ist die stark begrenzte Gültigkeit von Ereignisdaten: Oft werden sie schon durch ein neu aufgetretenes Ereignis hinfällig und sind nicht mehr aktuell. -Ereignisse haben für sich alleine betrachtet neben einer begrenzten Gültigkeit eine begrenzte Aussagekraft, daher ist es zum höheren Verständnis der dahinter verborgenen Situation notwendig, sie mit zuvor aufgetretenen Ereignissen in einen Kontext zu setzen. Dadurch können mehrere kleine, hochfrequent auftretende Ereignisse zu einzelnen, niederfrequent auftretenden komplexen Ereignissen aggregiert werden und mittels Mustererkennung höherwertige Informationen aus den Ereignissen extrahiert werden. - -\todo{GRAFIK: viele kleine hochfrequente vs wenige große niederfrequente Events} - -Die Integration von \emph{Domänenwissen}\footnote{Hintergrundwissen für den Kontext der Ereignisverarbeitung, verändert sich während der Verarbeitung nur selten} ist ein weiterer Schritt, der die Brücke zwischen den aus komplexen Ereignissen gewonnenen Kenntnissen und bereits bekannten Fakten schlagen soll, um die gewonnenen Kenntnisse in einen eindeutigen Zusammenhang stellen und eine eindeutige Interpretation zu ermöglichen. - -Um unter diesen Bedingungen viele Ereignisdatenströme mit hochfrequenten Ereignissen in nahezu Echtzeit zu verarbeiten ist \emph{CEP}\footnote{Complex-Event-Processing} das Mittel der Wahl: Mit CEP werden die Ereignisse der verschiedenen Datenströme für begrenzte Zeiträume im Speicher vorgehalten und innerhalb von sogenannten \emph{Sliding-Windows}\footnote{Mehr dazu in Kapitel~\ref{cpt:cep_intro}} betrachtet. Dabei können Ereignismuster erkannt werden und verschiedene Ereignisse aggregiert werden um neue komplexe Ereignisse zu erzeugen. Abbildung~\ref{fig:aggregation_patternmatching} stellt die Aggregation von Ereignissen sowie die Mustererkennung exemplarisch dar. +Ereignisse haben für sich alleine betrachtet neben einer begrenzten Gültigkeit eine begrenzte Aussagekraft, daher ist es zum höheren Verständnis der dahinter verborgenen Situation notwendig, sie mit zuvor aufgetretenen Ereignissen in einen Kontext zu setzen. Dadurch können mehrere kleine, hochfrequent auftretende Ereignisse zu einzelnen, niederfrequent auftretenden komplexen Ereignissen aggregiert werden und mittels Mustererkennung höherwertige Informationen aus den Ereignissen extrahiert werden. In Abbildung~\ref{fig:aggregation_patternmatching} wird die Aggregation von Ereignissen sowie die Mustererkennung exemplarisch dargestellt. \begin{figure}[htbp] \centering @@ -172,6 +166,11 @@ Um unter diesen Bedingungen viele Ereignisdatenströme mit hochfrequenten Ereign \label{fig:aggregation_patternmatching} \end{figure} +Die Integration von \emph{Domänenwissen}\footnote{Hintergrundwissen für den Kontext der Ereignisverarbeitung, verändert sich während der Verarbeitung nur selten} ist ein weiterer Schritt, der die Brücke zwischen den aus komplexen Ereignissen gewonnenen Kenntnissen und bereits bekannten Fakten schlagen soll, um die gewonnenen Kenntnisse in einen eindeutigen Zusammenhang stellen und eine eindeutige Interpretation zu ermöglichen. + +Um unter diesen Bedingungen viele Ereignisdatenströme mit hochfrequenten Ereignissen in nahezu Echtzeit zu verarbeiten ist \emph{CEP}\footnote{Complex-Event-Processing} das Mittel der Wahl: Mit CEP werden die Ereignisse der verschiedenen Datenströme für begrenzte Zeiträume im Speicher vorgehalten und innerhalb von sogenannten \emph{Sliding-Windows}\footnote{Mehr dazu in Kapitel~\ref{cpt:cep_intro}} betrachtet. Dabei können Ereignismuster erkannt werden und verschiedene Ereignisse aggregiert werden um neue komplexe Ereignisse zu erzeugen. + + Ziel dieser Arbeit ist die Einführung in die Konzepte von CEP und RDF, sowie die Demonstration der praktischen Nutzung der CEP-Engine \enquote{C-SPARQL} zur Verarbeitung von RDF-Datenströmen am Beispiel einer Autoverleihgesellschaft zur Überwachung von Leihfahrzeugen. Auch soll ergründet werden, welche technischen Möglichkeiten existieren, um \emph{Reasoning} auf RDF-Datenströmen zu betreiben --- ein Prozess, durch den eine vorhandene Sammlung von Fakten auf Basis von vorgegebener Terminologie automatisch um daraus ableitbarem Wissen angereichert werden kann. Diesbezüglich soll ergründet werden, welche CEP-Engines Reasoning bereits implementieren und wie weit ihre technischen Möglichkeiten reichen --- eine große Herausforderung, da die mit einzubeziehenden Ereignisdaten sich kontinuierlich verändern. @@ -496,7 +495,7 @@ Grobe Eckpunkte zur Orientierung: \todo{Warum jetzt eigentlich C-SPARQL? Weil es in Java fährt, auf Jena basiert, Datenströme im RDF-Format direkt unterstützt, Generatoren zum Einspeisen in die Engine nutzt und somit echt komfortabel in der Handhabung ist. Und trotzdem kommen noch akzeptable Ergebnisse mit minimalem Support für RDFS-Reasoning raus. Dadurch ist es für Einsteiger gut geeignet und bietet dennoch schon solide Features durch CSPARQL.} -\chapter{CEP auf RDF-Datenströmen} +\chapter{CEP auf RDF-Datenströmen anhand der C-SPARQL Engine} \todo{Zusammenfassungsüberleitung über das Kapitel} diff --git a/img/sliding-window.pdf b/img/sliding-window.pdf new file mode 100644 index 0000000000000000000000000000000000000000..832d7c7c9fdb43b19048ba6c14679c195a3db971 GIT binary patch literal 9744 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Sliding Window + + + + + +