Ich möchte Apache Cassandra verwenden, um eine große Menge von Diagrammdaten gemäß einem Eigenschaftsdiagrammmodell zu speichern . Das Modell enthält die folgenden Entitäten:
- Scheitelpunkte : Enthält eine Karte mit Schlüssel / Wert-Paaren (Eigenschaften). Einige Schlüssel sollten zum Abfragen indiziert werden (siehe unten).
- Kanten : Verbindet zwei Eckpunkte in einer bestimmten Richtung miteinander . Enthält eine Beschriftung und möglicherweise einige Kantendaten . Die Kantendaten sind eine Karte von Schlüssel / Wert-Paaren, wobei einige Schlüssel auch zum Abfragen indiziert werden sollten.
Sowohl Scheitelpunkte als auch Kanten haben einen eindeutigen Primärschlüssel , der eine Zeichenfolge oder ein ganzzahliger Wert sein kann.
Beispiel:
#A vertex
{node_type:'module',pk: 1,...}
#Another vertex
{node_type:'function',pk: 2,...}
#An edge
{incoming_vertex: 1,outgoing_vertex: 2,label: 'body',data : {}}
Ich möchte die folgenden Arten von Abfragen für das Diagramm ausführen:
- Rufen Sie eine Liste von Scheitelpunkten basierend auf ihrem Primärschlüssel (z. B. "Abrufen des Scheitelpunkts mit pk = a5f ...") oder dem Wert einer oder mehrerer indizierter Eigenschaften (z. B. "Abrufen aller Scheitelpunkte mit
node_type = 'module'
und ...") ab. - Traverse das Graphen von einem gegebenen Knoten entlang ihrer Kanten, unter Verwendung der Kanten Etikett, Richtung und einer oder mehr indizierte Kanteneigenschaften den Pfad zu bestimmen , entnommen (zB „fetch alle Vertices, die Ecke A durch einen verbundene abgehenden Rand mit Etikett Körper und Eigentum ... = ...).
Darüber hinaus habe ich folgende Anforderungen und Randbedingungen:
- Das Abrufen der Kantenliste für einen bestimmten Scheitelpunkt sollte so effizient wie möglich sein (idealerweise O (1)).
- Die Anzahl der Kanten ist viel größer als die Anzahl der Scheitelpunkte im Diagramm.
- Das Modell sollte auf mehrere Milliarden Eckpunkte und mehrere hundert Milliarden Kanten skaliert werden (geeignete Hardware wird bereitgestellt).
- Die Diagrammdaten werden normalerweise nur einmal geschrieben und viele Male gelesen, sodass das Modell auf Kosten der Schreibleistung für die Abfrageleistung optimiert werden kann.
Meine ursprüngliche Idee für ein Datenmodell lautet wie folgt:
- Verwenden Sie eine Spaltenfamilie für Scheitelpunkte bzw. Kanten, wobei der Zeilenschlüssel der Primärschlüssel des Scheitelpunkts / der Kante ist und eine einzelne Textspalte ihre JSON-Daten enthält. Indizes für Scheitelpunkt- / Kanteneigenschaften werden als zusätzliche Spalten modelliert (deren Daten denormalisiert und manuell aktualisiert werden, wenn sich die Scheitelpunkt- / Kantendaten ändern).
- Verwenden Sie eine dynamische Spaltenfamilie zum Verwalten der Adjazenzliste (Kante) für Scheitelpunkte mit einem zusammengesetzten Primärschlüssel, der den Primärschlüssel des Scheitelpunkts, den Primärschlüssel der Kante, die Kantenbeschriftung und die Kantenrichtung (eingehend oder ausgehend) für enthält jeder Scheitelpunkt.
Ist das ein sinnvolles Datenmodell? Irgendwelche anderen Vorschläge, wie dies umgesetzt werden kann?