Die Speicherung mehrerer Graphen in Neo4J
Ich habe eine Anwendung, die speichert die Beziehung von Informationen in einer MySQL-Tabelle (contact_id, other_contact_id, Stärke, recorded_at). Das ist in Ordnung, wenn alles, was ich tun müssen, ist zeigen, die einen Kontakt der Beziehungen oder sogar zu generate eine Liste der gemeinsamen Kontakte zwei Kontakte.
Aber jetzt brauche ich zum generieren von stats wie: "was war die Gesamtzahl der 2-Wege-verbindungen der Stärke 3 oder besser im Januar 2011" oder (unter der Annahme, dass jeder Kontakt ist Teil einer Gruppe) 'die Gruppe hat die größte Anzahl von verbindungen zu anderen Gruppen etc.
Habe ich schnell festgestellt, dass das SQL für die Erstellung dieser Statistiken wurde unhandlich wirklich schnell.
Also schrieb ich ein Skript, dass für einen bestimmten Zeitpunkt wird es erzeugt eine Grafik im Speicher. Dann könnte ich jede beliebige stat ich wollte gegen das, graph. Viel einfacher zu verstehen, und im Allgemeinen, viel mehr Leistung bietet, auch -- außer für die Erzeugung der Graphen-Teil.
Mein Nächster Gedanke war der cache diese Diagramme so konnte ich fordere Sie auf, Wann immer ich gebraucht, um eine neue stat (oder generieren Sie einen später-Diagramm: z.B. für die heutige Grafik nehme ich die gestrige Grafik und übernehmen Sie alle änderungen, die geschehen, seit gestern). Ich habe versucht, memcached, die Super geklappt, bis die Graphen wuchs > 1 MB.
So, jetzt ich ' m denken über die Verwendung einer graphdatenbank wie Neo4J.
Problem ist nur, ich habe nicht nur eine Grafik. Oder ich tun, aber es ist eine, über die Zeit verändert und ich muss in der Lage sein, Abfragen mit verschiedenen Referenz-Zeiten.
Ja, kann ich:
- speichern mehrere Diagramme in Neo4J und rertrieve/mit Ihnen interagieren, getrennt? würde ich dann erstellen und speichern von individuellen sozialen Graphen, die für jedes Datum.
oder
- hinzufügen, gültig vom und Zeitstempel auf jeder Kante und filtern Sie die Graphik entsprechend: also, wenn ich wollte ein graph, für den "1. Mai" würde ich nur Folgen den neuesten Kante zwischen zwei noeds, die erstellt wurde, bevor "1. Mai" (und wenn alle Kanten, die erstellt wurden, nach dem 1. Mai werden dann die Knoten würden nicht angeschlossen werden).
Ich bin ziemlich neu im graph-Datenbanken, so dass jede Hilfe/Zeiger/- Hinweise werden dankbar angenommen.
- nach etwas Lesen Frage ich mich, ob Referenz-Knoten sind die Schlüssel? ich könnte einen Referenz-Knoten, für jeden Tag und bauen, die am Tag des Graphen aus der Referenz-Knoten...
- Hallo, ich denke, mit exntry Knoten für den Graphen, und vielleicht indizieren Sie mit irgendeiner Eigenschaft, so dass Sie Sie finden können nicht nur aus einem Referenz-Knoten, aber durch index-lookup hier helfen kann. Würde die Indizierung bestimmter "meta-Daten" Eigenschaften des Teilgraphen Eintrag Knoten geben Sie die richtigen Ansatzpunkte?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Recht, jetzt können Sie speichern nur eine graph-Datenbank in einer einzigen Neo4j-Instanz, aber dieses graphdb kann enthalten so viele verschiedene sub-Graphen, wie Sie möchten. Sie müssen nur im Hinterkopf behalten, wenn dabei Globale Operationen (wie index-Abfragen) aber es gibt Sie tun können zusammengesetzte Abfragen Zeitstempel-Eigenschaften sowie zur Begrenzung der Ergebnisse.
Einen Weg, das zu tun ist, wie Sie sagten, das hinzufügen von Zeitinformationen zu den Rändern, die zum darstellen der Struktur eines Graphen für ein bestimmtes Datum können Sie dann durchqueren die Struktur des Graphen zurück dann.
Referenz-Knoten hat eine andere Bedeutung in Neo4j.
Verwendung von Kategorie-Knoten pro Tag (und Sie zu verknüpfen und auch das zusammenfassen für höhere level Zeitspannen) ist das mehr typographie Art und Weise der Kategorisierung der Knoten als indizierte Eigenschaften. (Effektiv diese sind im Diagramm Indizes, können Sie einfach in Ihren traversalen und graph-Abfragen).
Sie nicht haben, um doppelte Knoten, so lange, wie Sie sind nur daran interessiert, die unterschiedlichen zeitlichen Strukturen. Wenn Ihre Knoten sind auch unterschiedlich (z.B. ändern der Eigenschaften, können Sie entweder duplizieren Sie Sie, und so effektiv erstellen verschiedene Teilgraphen) oder erstellen Sie eine verbundene Liste der history-Knoten auf jedem Knoten enthalten nur die änderungen (oder die vollständige Momentaufnahme, abhängig von Ihren Anforderungen).
Ihre domain klingt sehr passend für die graph-Datenbank. Wenn Sie weitere und detaillierte Fragen feel free to join the Neo4j mailing-Liste.
Nicht die einfachste Lösung (ich nehme an, Sie arbeiten nur mit einer Maschine), aber wenn Sie wirklich wollen, trennen Sie Ihre Grafiken, die Sie nur brauchen, um Bedenken Sie, dass ein graph ist ein Verzeichnis.
Können Sie dann erstellen Sie eine dynamische loader-Klasse, die den Pfad der Datenbank, die Sie möchten, laden Sie es im Speicher für die Abfrage, und schließen Sie es nach, Sie bekommen Ihre Antwort. Könnte man auch so konfigurieren, proxy-server und senden von 2 Parametern zum loader: Ihre Anfrage (wie ich vermute, ist eine cypher-query in diesem Fall) und der Pfad der Datenbank, die Sie Abfragen möchten.
Dies ist nicht ausreichend, wenn Sie haben Tonnen von Echtzeit-Abfragen zu beantworten. Aber wenn es einfach für die Speicherung und das tun einige Analysen über die Daten legt, kann es auf jeden Fall die Antwort auf Ihre Bedürfnisse.