2010-12-11 16 views
5

Ich bin bereit, ein Property Graph in HBase zu speichern. Ein Eigenschaftsdiagramm ist ein Graph, Knoten und Kanten haben Eigenschaften und mehrere Kanten können dasselbe Tupel von Knoten verbinden, solange die Kanten zu verschiedenen Typen gehören.Datamodel für Property Graph über HBase/Cassandra

Mein Abfrage-Muster fragt entweder nach Eigenschaften und Nachbarschaft oder durchläuft den Graphen. Ein Beispiel ist: Vertex [Name = Claudio] => OutgoingEdge [weiß] => Vertex [Geschlecht = weiblich], die mir alle weiblichen Leute geben wird, die Claudio mag.

Ich weiß, dass eine Graph-Datenbank genau das tut, aber sie skalieren normalerweise nicht auf mehreren Knoten im Falle eines großen Datensatzes. Also ich bin bereit, dies auf einem NoSQL ColumnStore (HBase, Cassandra ...) zu implementieren

Mein Datamodel folgt.

Vertices Tabelle:
Schlüssel: vertexid (UUID)
Familie "Eigenschaften": <Eigenschaftsname> => <Eigenschaftswert> ...
Family "OutgoingEdges:": <Randtaste> => < andere vertexid > ...
Family "IncomingEdges:": wie ausgehenden Kanten ...

Diese Tabelle ermöglicht es mir zu holen schnell die Eigenschaften eines Vertex und seine Adjazenzliste. Ich kann die Vertexid nicht als anderen Endpunkt verwenden, da mehrere Kanten (mit unterschiedlichen Typen) die gleichen zwei Vertices verbinden können.

Edges Tabelle:
Schlüssel: Randtaste (Composite (< Quelle vertexid >, <Ziel> vertexid, < Rand Typname >)) (dh vertexid1_vertexid2_knows)
Familie "Eigenschaften": <Eigenschaftsnamen> => <Eigenschaftswert>, ...

Diese Tabelle ermöglicht es mir, schnell die Eigenschaften einer Kante abzurufen.

Kanten Typen:
Schlüssel: Composite (< Quelle vertexid >, "out | in" < Rand Typname >) (dh vertexid1_out_knows)
Family "Nachbar:": < Ziel vertexid > => null, ...

Diese Tabelle ermöglicht es mir, für Kanten zur Suche/scannen, die entweder eingehenden oder ausgehend von einem Scheitelpunkt sind und zu bestimmten Typ gehören und die Kern des traversin wäre g Fähigkeit der API (so will ich es so schnell wie möglich, sowohl in Bezug auf Netzwerk-I/O (RPCs), Festplatte I/O (suchen)). Es sollte auch "skalieren" auf die Größe des Graphen, was bedeutet, dass mit der Wachstum des Graphen die Kosten für diese Art von Betrieb sollte die Anzahl der Kanten aus dem Scheitelpunkt und nicht auf die Gesamtzahl von Ecken und Kanten. Im obigen Beispiel würde ich vertexid1 den Quellknoten mit betrachten. Eigenschaftsname: claudio Ich würde vertexid1_out_knows scannen und die Liste der verbundenen Scheitelpunkte erhalten. Danach kann ich die Spalte "Eigenschaften: Geschlecht" auf diesen Scheitelpunkten scannen und nach denen suchen, die den "weiblichen" Wert haben.

Fragen:

1) Allgemein: sehen Sie ein besseres Datenmodell für meine Operationen?
2) Kann ich alles in eine Tabelle einfügen, wo für bestimmte Schlüssel einige Familien leer wären (d. H. Die Familie "OutgoingEdges:" würde Sinn für die Kanten nicht machen)? Ich würde das gerne, denn wie Sie sehen können, sind alle Schlüssel durch die Vertidex Uuid-Präfix zusammengesetzt, so dass sie sehr kompakt wären und meist auf dem gleichen Regionserver passen.
3) Ich denke, dass ich für das Scannen ausgiebig Filter verwenden würde. Ich denke, regexp Filter wird mein Freund sein. Haben Sie Bedenken hinsichtlich Leistung von Filtern auf dieses Datenmodell angewendet?

Antwort

2

Dieser Modelltyp sieht für Cassandra (wissen Sie nicht viel über HBase) aus, aber für jeden verteilten Speicher stoßen Sie auf Probleme beim Traversieren, da Traversals mehrere Knoten kreuzen.

Aus diesem Grund verwenden dedizierte Grafikdatenbanken wie Neo4J ein Einzelknoten-Design und versuchen, alle Daten im RAM zu behalten.

Nachschlagen Eigenschaften von bestimmten Knoten oder Kanten sollte gut funktionieren und horizontal skalieren - Twitter FlockDB (jetzt anscheinend aufgegeben) war ein bemerkenswertes Beispiel dafür.

Sie müssen auch darüber nachdenken, ob Sie andere Lookups als die ID benötigen (d. H. Benötigen Sie Indizes)?