Hm...: Welche Datenbank nehme ich am besten? :)

Hi Leute,

ich kenne mich nicht gut mit Datenbanken aus, möchte (muss) aber folgendes tun:

Ich habe ein Stochastisches Netzwert (Graph) gebaut, welchen ich dauerhaft auf meinem rechner speichern möchte und diesen möchte ich auch in regelmäßig Abständen updaten - das alles möchte ich in java machen.

Folgendes möchte ich tun:

1. Jeder knoten meines Graphen soll folgende Struktur erhalten:
Knoten:
a) Zeilen nummer
b) gewicht (double oder int)
c) name (string)

2. Jeder knoten bekommt eine zeile und in jeder spalte steht dann, welche anderen knoten von diesem einen knoten aus erreichbar sind.

3. Mein ziel ist es dabei, bei millionen knoten, schnell einen pfad mit jeweiligen gewichten durchlaufen zu können.

Beispiel:

Graph in tabelle:
A,B,C,
B,C
C,C,A,B

für den weg von B nach A, würde ich dann zb in A starten mir die zeilennummer von C ausgeben lassen, in die zeile von C gehen und mir die Zeile von B ausgeben lassen.
ich möchte bei bekannter zeilennummer, diese zeile sehr schnell erreichen können.

könnt ihr mir sagen, mit welcher Datenbank ich sowas hinbekomme? eventuell mit mysql? oder geht es eventuell simpler? (ich muss nämlich gucken wie ich sowas auf meinem pc installiere - mit servern und horstangabe kenne ich mich nicht gut aus)

  1. Tach!

    Ich kann dir da nur generelle Hinweise geben.

    Ich habe ein Stochastisches Netzwert (Graph) gebaut, welchen ich dauerhaft auf meinem rechner speichern möchte und diesen möchte ich auch in regelmäßig Abständen updaten - das alles möchte ich in java machen.

    Java ist vermutlich kein Problem. Das ist soweit verbreitet, dass es für jedes in Frage kommende System eine Anbindung geben sollte.

    1. Jeder knoten meines Graphen soll folgende Struktur erhalten:
      Knoten:
      a) Zeilen nummer
      b) gewicht (double oder int)
      c) name (string)

    Kann man mit einer einfachen Tabelle abbilden.

    1. Jeder knoten bekommt eine zeile und in jeder spalte steht dann, welche anderen knoten von diesem einen knoten aus erreichbar sind.

    Bei relationalen DBMS sollte man das nicht in eine Zeile bringen, weil das schlecht durchsuchbar ist. Mit MySQL kannst du auf solche Mehrfachdaten keinen gescheiten Index legen. Jede Beziehung bekommt einen eigenen Datensatz. Wenn es eine Baumstruktur ist (jedes Element kann zwar belibig viele Nachfahren haben, aber nur einen Vorfahren), dann reicht auch ein Parent-Verweis zu jedem Knoten in der Knoten-Tabelle.

    1. Mein ziel ist es dabei, bei millionen knoten, schnell einen pfad mit jeweiligen gewichten durchlaufen zu können.

    Das ist mit einer relationalen Datenbank aufwendig, weil du hier rekursiv drauf losgehen musst. Für jeden nächsten Schritt braucht es das vorhergehende Ergebnis. Baumstrukturen kann man zwar mit Nested Sets abbilden, aber das bringt dir hier nichts, weil du keine kompletten Teilbäume abfragen möchtest, sondern dich per Gewicht vorwärts hangeln willst. Ein RDBMS bringt dir meiner Meinung nach keinen direkten Vorteil. Es kommt darauf an, ...

    ich möchte bei bekannter zeilennummer, diese zeile sehr schnell erreichen können.

    ... dass die Elemente bei der Menge der Daten schnell gefunden werden. Und das sollte mit jeder sortierten Liste möglich sein. Verfahren dazu sind sattsam bekannt.

    könnt ihr mir sagen, mit welcher Datenbank ich sowas hinbekomme? eventuell mit mysql? oder geht es eventuell simpler?

    MySQL kannst du dafür nehmen, aber viel mehr als einen Key-Value-Store brauchst du meiner Einschätzung nach nicht (wobei ich nicht ausschließen möchte, dass diese auch gründlich daneben liegen kann).

    dedlfix.

    1. danke für die antworten.

      ich habe die drei jar dateien von

      http://www.hypergraphdb.org/learn?page=TrivialTutorial&project=hypergraphdb

      in mein java projekt eingebaut und

      HyperGraph graph = new HyperGraph("/path/to/workdir/bje");
      String hello = graph.get(graph.add("Hello World"));
      System.out.println(hello.toLowerCase());
      graph.close();

      getestet.

      als fehlermeldung kam:

      Exception in thread "main" org.hypergraphdb.HGException: java.lang.NoClassDefFoundError: com/sleepycat/db/DatabaseException
      at org.hypergraphdb.HyperGraph.open(HyperGraph.java:392)
      at org.hypergraphdb.HyperGraph.open(HyperGraph.java:211)
      at org.hypergraphdb.HyperGraph.<init>(HyperGraph.java:198)
      at SortData.main(SortData.java:36)
      Caused by: java.lang.NoClassDefFoundError: com/sleepycat/db/DatabaseException
      at org.hypergraphdb.HGStore.<init>(HGStore.java:47)
      at org.hypergraphdb.HyperGraph.open(HyperGraph.java:310)
      ... 3 more
      Caused by: java.lang.ClassNotFoundException: com.sleepycat.db.DatabaseException
      at java.net.URLClassLoader$1.run(Unknown Source)
      at java.net.URLClassLoader$1.run(Unknown Source)
      at java.security.AccessController.doPrivileged(Native Method)
      at java.net.URLClassLoader.findClass(Unknown Source)
      at java.lang.ClassLoader.loadClass(Unknown Source)
      at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
      at java.lang.ClassLoader.loadClass(Unknown Source)
      ... 5 more

      mit marvin etc kenne ich mich nicht aus, was müsste ich machen, um das problem zu beheben?

      1. hm.... ist es möglich nur einen kleinen teil einer xml datei einzulesen und zu updaten?

        falls ja, könnt ich mir das was ich brauche über xml selber schreiben, oder?

        1. hm.... ist es möglich nur einen kleinen teil einer xml datei einzulesen und zu updaten?

          Mit einem SAX Parser sollte das gehen. Parsen kannst du dann alles, aber nur relevante Teile rausfischen.

          falls ja, könnt ich mir das was ich brauche über xml selber schreiben, oder?

          Du willst deine Knoten in XML halten und dann jedesmal, wenn du einen Knoten suchst das XML parsen? Das dauert wesentlich länger als mit deiner DB.
          Ob die von Kay genannten dich bei eiem Graphen unterstützen und schon wesentliche Dinge wie kürzeste Wege Suche schon implementiert haben oder nur darauf basieren kann ich dir nicht sagen. Ersteres wäre natürlich von Vorteil aber auch mit MySQL oder SQLLite, sollte das gehen.
          Soweit ich dich verstanden habe, nutzt du doch nur eine DB weil die Masse an Knoten und Verbindungen nicht als Matrix im Speicher haltbar ist. Das ist Laufzeitmäßig natürlich wesentlich schlechter. Welche DB mit SQL Syntax dann am schnellsten ist, lässt sich ja dann relativ leicht testen.
          Wenn du eine findest, die darauf spezialisiert ist Graphen zu speichern, wird diese natürlich unschlagbar sein im Vergleich zu einer SQL-Datenbank.

  2. http://www.neo4j.org/

    http://www.hypergraphdb.org/

    da gibt es bestimmt noch andere.