Modellieren von Diagrammdaten in Cassandra DB

7

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?

Der Physiker
quelle
2
Es gibt Technologien, die speziell für die Verarbeitung von Grafiken entwickelt wurden. Neo4J ist eines, mit dem ich gearbeitet habe und das ich schnell und einfach gefunden habe. Es hat eine gute Unterstützung für Stackoverflow. Es gibt mehrere andere mit spezifischen Stärken. Ich würde Ihnen dringend empfehlen, diese zu untersuchen.
Michael Green
Vielen Dank, Michael. Ich habe bereits gute Gründe, Cassandra anstelle von Neo4j für mein Projekt zu untersuchen (z. B. Skalierbarkeit, Vorhersagbarkeit der Leistung).
ThePhysicist

Antworten:

3

Für die Graph-Datenbank auf Cassandra schauen Sie sich TitanDB an :

Was Sie brauchen, ist bereits in TitanDB implementiert. Die Implementierung einer eigenen Grafikdatenbank ist nicht trivial und sehr zeitaufwändig. In den meisten Fällen ist eine bewährte Lösung am besten. (Übrigens bin ich nicht an der Entwicklung oder dem Geschäft von TitanDB beteiligt.) Ich habe keine Ahnung von Ihrem Anwendungsfall, sehe aber keinen Grund, etwas Neues zu implementieren, außer als Hobby.

Update Ich habe ein Whitepaper zum Datenmodell von Titan GraphDB in der Datenbank gefunden: https://github.com/thinkaurelius/titan/wiki/Titan-Data-Model . Es gibt einige Hinweise zum Entwerfen eines Datenspeichers für Diagramme.

Aurelius ist jetzt auch Teil von Datastax und arbeitet an einer kombinierten Lösung zum Speichern großer Grafiken in Cassandra.

Rick-Rainer Ludwig
quelle
1
Danke, ich kenne TitanDB, aber das beantwortet meine Frage nicht;)
ThePhysicist
0

Eine Grafikdatenbank für Cassandra finden Sie unter Datastax Graph, wo dies bereits implementiert ist und die CQL- und Gremlin-Syntax unterstützt.

Robert Corvus
quelle