Logische Verknüpfung von Objekten

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
würmchen
User
Beiträge: 255
Registriert: Mittwoch 7. November 2007, 14:17

Hi Leute,
Ich habe ein paar selbst geschriebene Klassen und erzeuge davon Objekte. Diese Suchen mir in einer Datenbank nach Informationen.

Im Moment gehe ich hin und sage das Alle Objekte mit UND kombiniert sind. Also Objekt zwei nimmt die Ergebnisse von Objekt eins und sucht nur noch auf diesem Teilergebnis.

Jetzt würde ich gerne diese Sachen mit NICHT und ODER Kombinieren und wollte mal fragen ob es vielleicht Pakete gibt, die sich damit beschäftigen oder ob Jemand eine Idee hat wie ich vorgehen könnte.
Danke schonmal...
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

Moin,

was machst du denn genau? Benutzt du eine SQL-Datenbank? Vielleicht solltest du die Bedingung im SQL-Statement bereits entsprechend gestalten.

Oder haben deine Objekte bereits alle Daten gelesen? Dann könntest du schick mit sets arbeiten.

Gruß,
Manuel
würmchen
User
Beiträge: 255
Registriert: Mittwoch 7. November 2007, 14:17

Da es riesen Datenmengen sind, versuche ich den Weg mit den Ergebnissen in Python zu speichern zu sparen.

Im Moment habe ich eine Tabelle in der MySQL Datenbank, in die ich alle Ergebnisse eintrage, die ein Objekt findet.
Dabei hat jedes Objekt eine ID und trägt diese in die Datenbank mit ein...

Ich geh dann einfach mit dem zweiten Objekt hin und mache dann einfach "WHERE id = 2" oder so in der Art.

Zweites Problem ist das die Objekte auch noch hierarchisch geschachtelt sind....

Ein Objekt kenn im Moment nur seine Kinder, weiß aber sonst nichts von denen. Also ob sie untereinander mit AND,OR,NOT kombiniert sind oder so, könnte ich aber ändern...

Auch seine Geschwister kennt es nicht, und wie diese verbunden sind, könnte ich aber auch ändern.

sets kannte ich noch nicht, les mich gerade mal ein, ob das helfen könnte, aber eigentlich würde ich die infos nicht so gerne in dem python programm speichern.
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

Für mich klingt das ein bisschen so, als versuchtest du, ein ORM wie z.B. SQLAlchemy nachzubauen. Vielleicht schaust du dir das mal an. Braucht natürlich ein bisschen Einarbeitungszeit, aber dafür brauchst du dann keine Energie mehr ins Entwickeln und Testen zu stecken ...
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Warum machst du nicht für jedes Objekt eine Spalte mit Boolwert in deiner Ergebnisliste.
Dann kannst mit SQL auswerten (WHERE obj1 = 1 AND obj2 = 1).
OR und NOT kannst du so dann auch auswerten.
würmchen
User
Beiträge: 255
Registriert: Mittwoch 7. November 2007, 14:17

ice2k3 hat geschrieben:Warum machst du nicht für jedes Objekt eine Spalte mit Boolwert in deiner Ergebnisliste.
Dann kannst mit SQL auswerten (WHERE obj1 = 1 AND obj2 = 1).
OR und NOT kannst du so dann auch auswerten.
Das Problem ist das die Datenbank unglaublich groß ist (mehrere Tabellen mit weit über 10 000 000 Einträgen) und ich gerne meine Suchen optimieren will. Wieso sollte Objekt zwei noch auf der kompletten Datenbank suchen, wenn es mit UND und Objekt eins kombiniert ist, und das nur 3 Ergebnisse findet...
Pekh hat geschrieben:Für mich klingt das ein bisschen so, als versuchtest du, ein ORM wie z.B. SQLAlchemy nachzubauen. Vielleicht schaust du dir das mal an. Braucht natürlich ein bisschen Einarbeitungszeit, aber dafür brauchst du dann keine Energie mehr ins Entwickeln und Testen zu stecken ...
Mein Problem mit einem ORM ist, das ich Speicherprobleme mit den riesen Datenmengen bekomme und es langsamer ist als direkt die SQL Kommandos auszuführen.
Außerdem sollte das alles Modular aufgebaut sein, so dass man nur neue Objekte anlegt und die eigenständig suchen. Hatte es anfangs mit einem ORM versucht, bin aber an den Punkten gescheitert... :-/
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

Vielleicht liegt es ja an zu wenig Koffein, aber ich versteh's nicht :oops: .

Wie sieht deine Tabelle aus und was wird darin gespeichtert? Bist du auf SQL festgetackert oder könnte LDAP die Antwort sein?

Gruß,
Manuel
würmchen
User
Beiträge: 255
Registriert: Mittwoch 7. November 2007, 14:17

Es geht um Biologische Daten...
In meiner Ergebnistabelle stehen nur Zahlen zu den richtigen Werten in den restlichen Tabellen... Also praktisch jeweils die PRIMARY KEYS...

Code: Alles auswählen

+----+-----------+----------+-----------------+
| id | entry_key | query_id | my_molecule_key |
+----+-----------+----------+-----------------+
|  1 |         1 |        1 |               1 |        
|  2 |         2 |        1 |              16 |      
|  3 |         3 |        1 |              19 |      
|  4 |         4 |        1 |              32 |      
|  5 |         5 |        1 |              34 |      
|  6 |         5 |        1 |              39 |     
|  7 |         1 |        2 |               1 |       
|  8 |         3 |        2 |              19 |      
|  9 |         5 |        2 |              39 |      
| 10 |         5 |        3 |              39 |      
+----+-----------+----------+-----------------+
So hier mal ein Beispiel...
Das erste Suchkriterium (query_id = 1) findet 1,2,3,4,5,6 bestimmte entrys und von denen jeweils ein molekül, auf das die beschreibung zutrifft.... beim entry 5 findet es sogar zwei moleküle... (PRIMERY_KEY 34 und 39)...
Die zweite suchanfrage JOINT dann ein paar Tabellen, unteranderem diese und sagt, WHERE query_id = 1, um nurnoch auf den Ergebnissen von Query 1 zu suchen.... und findet dann nur noch 3 Ergebniss...


die letzte query sucht dann nur noch auf den ergebnissen von der zweiten usw...


jetzt will ich sowas eben kombinieren mit UND bzw. ODER
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

Wenn du zwei solche Ergebnisse zusammenfassen (OR) willst, dann kannst du das ganz einfach machen.

Code: Alles auswählen

SELECT * FROM foo WHERE query_id = 1 OR query_id = 2
Oder mit UNION, wenn die Sache sehr komplex ist:

Code: Alles auswählen

SELECT * FROM foo UNION SELECT * from bar
Ausschließen kannst du auch ganz einfach:

Code: Alles auswählen

SELECT * FROM foo WHERE query_id = 1 AND entry_key != 2
Oder aber via Sub-Select:

Code: Alles auswählen

SELECT * FROM foo WHERE query_id = 1 AND entry_key NOT IN (SELECT entry_key FROM foo WHERE query_id = 5)
Gibt viele Möglichkeiten. Es kommt halt ganz darauf an, was du genau machen willst und machst. Wenn die Abfragen zu komplex werden, dann kannst du auch Views erstellen, die dann für Übersicht sorgen können.

Gruß,
Manuel
würmchen
User
Beiträge: 255
Registriert: Mittwoch 7. November 2007, 14:17

Hm, deine Lösung ist ja vergleichbar mit der von ice2k3, ich müsste jedes Objekt auf der gesamten Datenbank suchen lassen und dann danach die gefundenen Ergebnisse kombinieren.

Ich würde es gerne schon im Vorfeld bestimmen, welches Objekt Ergebnisse vom Vorgänger einbezieht (Im Falle einer Undverknüpfung) oder ob es doch den kompletten Datensatz nimmt (Oderverknüpfung)

Will dazu die SQL-Query dynamisch machen und zum Beispiel bei einem query_id 3 oder 4 dann ein

Code: Alles auswählen

... WHERE query_id IN (3,4)
Wenn aber die beiden Queries mit UND kombiniert sind, dann würde erst query 3 suchen und danach query 4 und würde die Ergebnistabelle JOINen und testen wo die query_id = 3 ist....

Dein Vorschlag mit Subselect bringt bei mir nicht so viel, weil MySQL nicht alle Optimierungsschritte anwenden kann. Es ist hier sinnvoller mit JOIN zu arbeiten.
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

Ich bin die ganze Zeit versucht zu sagen: "Dann mach's doch." :D

Ich steh nach wie vor auf dem Schlauch. Ich weiß nicht, was genau dein Problem ist.

Du hast eine Tabelle, in der irgendwelche Ergebniss drin stehen. OK
Du willst, dass eine weitere Query auf diesen Ergebnissen weiterarbeitet. OK
Diese Ergebnisse willst du verknüpfen (AND, OR, NOT). OK

Das geht ganz einfach über WHERE x = y AND/OR foo=bar. Ohne Schnickschnack. Die DB optimiert das dann schon und wenn entsprechende Indexe vorhanden sind, geht das auch schön schnell.

Willst du dieses Ergebnis wieder speichern und darauf weiterarbeiten? Dann speichere es und mach damit weiter.

Aber irgendwie glaube ich nicht, dass ich dir damit geholfen hab ;-).
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

würmchen hat geschrieben:Mein Problem mit einem ORM ist, das ich Speicherprobleme mit den riesen Datenmengen bekomme und es langsamer ist als direkt die SQL Kommandos auszuführen.
Du kannst SQLAlchemy auch ohne das ORM nutzen.
würmchen
User
Beiträge: 255
Registriert: Mittwoch 7. November 2007, 14:17

helduel hat geschrieben:Ich bin die ganze Zeit versucht zu sagen: "Dann mach's doch." :D

Ich steh nach wie vor auf dem Schlauch. Ich weiß nicht, was genau dein Problem ist.

Du hast eine Tabelle, in der irgendwelche Ergebniss drin stehen. OK
Du willst, dass eine weitere Query auf diesen Ergebnissen weiterarbeitet. OK
Diese Ergebnisse willst du verknüpfen (AND, OR, NOT). OK

Das geht ganz einfach über WHERE x = y AND/OR foo=bar. Ohne Schnickschnack. Die DB optimiert das dann schon und wenn entsprechende Indexe vorhanden sind, geht das auch schön schnell.

Willst du dieses Ergebnis wieder speichern und darauf weiterarbeiten? Dann speichere es und mach damit weiter.

Aber irgendwie glaube ich nicht, dass ich dir damit geholfen hab ;-).
Eigentlich hast Du vollkommen recht. Mein Problem ist es ein Algorithmus zu schreiben der eben meine Suchkriterien nach boolschen regeln anordnet/vereinfacht.

Das bin ich gerade dabei zu entwickeln....
Leonidas hat geschrieben:Du kannst SQLAlchemy auch ohne das ORM nutzen.
Oh dass wusste ich nicht... Hm, muss ich mich da nochmal einlesen und testen ob des mir was bringt... Danke für den Hinweis.
BlackJack

Das Vereinfachen der Suchanfrage würde ich der Datenbank überlassen, falls die nicht total "dumm" ist. Die hat nämlich Informationen über Indexe und eventuell auch Statistiken über die Verteilung von Werten und sollte Anfragen so umschreiben, dass sie effizient(er) sind.
Antworten