# "Mustererkennung" in DB



## flagg (24. Jun 2008)

Hallo,
ich beschreibe mal kurz um was es geht.

Ich logge mit Log4j in eine DB Tabelle. Dazu hab ich nen Logfileviewer implementiert, der mir dir Datensätze ausgibt, man nach Datensätzen suche kann usw.

Die nächste Anforderung ist nun, dass es möglich sein soll Muster in der Tabelle zu erkennen.
Soll heißen ob beispielsweise Einträge 3,5 und 7 öfters in dieser Reihenfolge in der Tabelle vorkommen.

Im 1. Schritt sollte das Muster vorgegeben werden und dann in der DB-Tabelle gefunden werden.
Im 2. Schritt sollte ein Möglichkeit gefunden werden, dass eigenständig derartige Muster erkannt werden.

Jetzt suche ich nach einem Ansatz wie man das lösen könnte.
Über Anregungen und Hinweise würde ich mich sehr freuen.


----------



## SlaterB (24. Jun 2008)

eine Tabelle hat von Natur aus keine Reihenfolge, aber du hast bestimmt ein passendes Kriterium wie einen Index,

in SQL kannst das nicht oder nur ganz begrenzt machen, wage ich mal allumfassend zu sagen,
dass du überhaupt eine Nummerierung hast ist schon kein Standard-SQL und nur von bestimmten DBs geschenkt,
nett ist dann damit zu filtern, etwa Zeilennummer < x, Zeilennummer gerade oder so,
aber viel mehr geht nicht, schon gar nicht verschiedene Zeilen zu vergleichen

aber einen Vorschlag habe ich da:
wenn deine Zeilen die forlaufenen Ids 1, 2, 3, 4, .. haben,
dann mache einen dreifachen Join darauf:
Tabelle a x Tabelle b x Tabelle c
mit b.id = a.id+1 und c.id = b.id+1

so kannst du auf alle Dreier-Paare zugreifen und dann suchen, 
nach a.xy = 3 and b.xy = 5, c.xy = 7

du kannst auch diese drei xy-Werte zu einem String oder sonstigen Wert zusammenfassen und darüber gruppieren und nach Gruppen mit count(*) > z filtern,
so findest du Muster


-----------


alle Möglichkeiten hast du natürlich, wenn du die Daten in Java einliest


----------



## flagg (24. Jun 2008)

Mh, ok dann hab ich wohl ins falsche Forum gepostet.

Dass die Logik zum Großteil in Java passieren soll, hatte ich vorrausgesetzt.

Nochmal kurz was zur Sache: Es ist nur 1 Tabelle. 
Allerdings können die Datensätze in die Millionen gehen, aber ist nebensächlich.

Ne fortlaufende ID hab ich, wird mit einem Trigger erzeugt. Die ist aber eindeutig also nicht mein Merkmal. 
Das ist ein Varchar Feld, das die Klasse enthält, aus der die Logmeldung stammt.


----------



## SlaterB (24. Jun 2008)

tja, ich zumindest bin jetzt bisschen festgefahren auf meinen Vorschlag, der dann auch in Java auch nicht viel anders aussieht,

zunächst mal würde ich, falls es zu lange dauert, die Klassennamen per Mapping durch 1, 2, 3 usw. ersetzen, String oder Integer,
schneller zu vergleichen, billiger zu speichern

und dann die Liste der Einträge durchgehen, 
immer drei oder auch mehr Einträge gleichzeitig anschauen, 
aus den jeweiligen Werten einen Key berechnen und in einer Map die Anzahl speichern,
häufige Muster werden hohe Anzahlen haben

evtl. die Dreier- oder sonstige Gruppen in separaten Objekten speichern und vor der Detailsuche vorsortieren, z.B. nach dem Wert im ersten Feld


----------



## flagg (24. Jun 2008)

SlaterB hat gesagt.:
			
		

> aus den jeweiligen Werten einen Key berechnen


Ausser den Satz denke ich weiss ich was du meinst.

Das funkt dann für gegebene Suchmuster. 

Die Klassennamen in Nummern umwandeln, bzw mappen macht meiner Meinung nach auch Sinn. 

Aber schonmal danke für die Anregung.


----------



## SlaterB (24. Jun 2008)

> aus den jeweiligen Werten einen Key berechnen

aus 3, 5, und 7 wird "3|5|7" um es mit anderen Keys wie "4|5|7" in einem Schritt vergleichen zu können, 
andere Key-Arten sind natürlich auch denkbar, z.B. ein Objekt einer eigenen Klasse

> Das funkt dann für gegebene Suchmuster.

wenn du alle Keys bestimmst und die Anzahl heraufsindest,
dann für beliebige Muster,
wobei natürlich die Anzahl der zu vergleichenden Elemente und die Felder darin vorgegeben sein müssen,
die Anzahl kann man variieren, aber wenn es noch dynamischer werden soll, na dann halleluja


----------



## flagg (24. Jun 2008)

Ok, verstanden... :toll: 




			
				SlaterB hat gesagt.:
			
		

> aber wenn es noch dynamischer werden soll, na dann halleluja



Naja, das entscheide leider nicht ich 

Das Problem, das ich sehe ist, dass es sich um ein Multi-user System handelt und die Meldungen nicht so geordent in die Tabelle kommen, dass der Zusammenhang klar wird. Ich hoffe das ist verständlich. 

Aber das muss ich jetzt mal überdenken, bzw besprechen.


----------

