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?