Warum sollten Sie eine Diagrammdatenbank verwenden?

Jeff Carpenter ist technischer Evangelist bei DataStax.

In letzter Zeit gab es viel Hype um Graphendatenbanken. Während es Grafikdatenbanken wie DataStax Enterprise Graph (basierend auf Titan DB), Neo4 und IBM Graph seit mehreren Jahren gibt, deuten jüngste Ankündigungen von verwalteten Cloud-Diensten wie AWS Neptune und Microsoft durch die Hinzufügung von Grafikfunktionen zu Azure Cosmos DB auf Grafikdatenbanken hin sind in den Mainstream eingetreten. Wie können Sie bei all diesem Interesse feststellen, ob eine Diagrammdatenbank für Ihre Anwendung geeignet ist?

Was ist eine Graphendatenbank?

Bevor wir weiter gehen, definieren wir eine Terminologie. Was ist eine Graphendatenbank? Denken Sie an das Datenmodell. Ein Diagrammdatenmodell besteht aus Scheitelpunkten , die die Entitäten in einer Domäne darstellen, und Kanten , die die Beziehungen zwischen diesen Entitäten darstellen. Da sowohl Scheitelpunkte als auch Kanten zusätzliche Name-Wert-Paare haben können, die als Eigenschaften bezeichnet werden , wird dieses Datenmodell formal als Eigenschaftsgraph bezeichnet . Bei einigen Diagrammdatenbanken müssen Sie ein Schema für Ihr Diagramm definieren, dh Beschriftungen oder Namen für Ihre Scheitelpunkte, Kanten und Eigenschaften definieren, bevor Sie Daten auffüllen. In anderen Datenbanken können Sie ohne festes Schema arbeiten.

Wie Sie vielleicht bemerkt haben, enthält das Diagrammdatenmodell keine neuen Informationen, die wir in einem herkömmlichen relationalen Datenmodell nicht erfassen konnten. Schließlich ist es einfach, Beziehungen zwischen Tabellen mithilfe von Fremdschlüsseln zu beschreiben, oder wir können Eigenschaften einer Beziehung mit einer Verknüpfungstabelle beschreiben. Der Hauptunterschied zwischen diesen Datenmodellen besteht in der Art und Weise, wie Daten organisiert werden und auf sie zugegriffen wird. Die Erkennung von Kanten als „Bürger erster Klasse“ neben Scheitelpunkten im Diagrammdatenmodell ermöglicht es der zugrunde liegenden Datenbank-Engine, sehr schnell in jede Richtung durch Netzwerke von Scheitelpunkten und Kanten zu iterieren, um Anwendungsabfragen zu erfüllen, ein Prozess, der als Traversal bezeichnet wird .

Die Flexibilität des Diagrammdatenmodells ist ein Schlüsselfaktor für den jüngsten Anstieg der Popularität von Diagrammdatenbanken. Die gleichen Anforderungen an Verfügbarkeit und Umfang, die in den letzten 10 Jahren die Entwicklung und Einführung verschiedener NoSQL-Angebote vorangetrieben haben, tragen auch weiterhin Früchte im jüngsten Grafiktrend.

Wie Sie wissen, wann Sie eine Diagrammdatenbank benötigen

Wie bei jeder gängigen Technologie kann es jedoch zu einer Tendenz kommen, Diagrammdatenbanken auf jedes Problem anzuwenden. Es ist wichtig sicherzustellen, dass Sie einen Anwendungsfall haben, der gut passt. Beispielsweise werden Diagramme häufig auf Problemdomänen angewendet wie:

  • Soziale Netzwerke
  • Empfehlung und Personalisierung
  • Kunde 360, einschließlich Entitätsauflösung (Korrelation von Benutzerdaten aus mehreren Quellen)
  • Entdeckung eines Betruges
  • Anlagenmanagement

Unabhängig davon, ob Ihr Anwendungsfall in eine dieser Domänen passt oder nicht, sollten Sie einige andere Faktoren berücksichtigen, anhand derer Sie feststellen können, ob eine Diagrammdatenbank für Sie geeignet ist:

  • Viele-zu-viele-Beziehungen. In seinem Buch „Entwerfen datenintensiver Anwendungen“ (O'Reilly) schlägt Martin Kleppmann vor, dass häufige Viele-zu-Viele-Beziehungen in Ihrer Problemdomäne ein guter Indikator für die Verwendung von Diagrammen sind, da relationale Datenbanken in der Regel Schwierigkeiten haben, diese Beziehungen effizient zu steuern.
  • Hoher Wert von Beziehungen. Eine andere Heuristik, die ich häufig gehört habe: Wenn die Beziehungen zwischen Ihren Datenelementen genauso wichtig oder wichtiger sind als die Elemente selbst, sollten Sie die Verwendung eines Diagramms in Betracht ziehen.
  • Geringe Latenz im großen Maßstab. Das Hinzufügen einer weiteren Datenbank zu Ihrer Anwendung erhöht auch die Komplexität Ihrer Anwendung. Die Fähigkeit von Diagrammdatenbanken, schneller als andere Datenbanktypen durch die in großen Datenmengen dargestellten Beziehungen zu navigieren, rechtfertigt diese zusätzliche Komplexität. Dies gilt insbesondere in Fällen, in denen eine komplexe relationale Verknüpfungsabfrage nicht mehr ausgeführt wird und keine zusätzlichen Optimierungsgewinne für die Abfrage oder die relationale Struktur erzielt werden müssen.

Definieren von Diagrammschemata und Abfragen mit Gremlin

Schauen wir uns anhand eines realen Beispiels, dem Empfehlungssystem, das wir kürzlich zu KillrVideo hinzugefügt haben, an, wie Sie mit der Verwendung einer Diagrammdatenbank beginnen. KillrVideo ist eine Referenzanwendung zum Teilen und Ansehen von Videos, die wir erstellt haben, um Entwicklern den Umgang mit DataStax Enterprise zu erleichtern, einschließlich DataStax Enterprise Graph, einer Grafikdatenbank, die auf hoch skalierbaren Datentechnologien wie Apache Cassandra und Apache Spark basiert.

Die Sprache für die Beschreibung und Interaktion mit Diagrammen in DataStax Enterprise Graph ist Gremlin, das Teil des Apache TinkerPop-Projekts ist. Der Gremlin ist aufgrund seiner Flexibilität, Erweiterbarkeit und Unterstützung sowohl für deklarative als auch für imperative Abfragen als Anlaufstelle für die Beschreibung von Diagrammdurchläufen bekannt. Gremlin basiert auf der Sprache Groovy und Treiber sind in mehreren Sprachen verfügbar. Am wichtigsten ist, dass Gremlin von den beliebtesten Grafikdatenbanken unterstützt wird, darunter DataStax Enterprise Graph, Neo4j, AWS Neptune und Azure Cosmos DB.

Wir haben einen Empfehlungsalgorithmus entwickelt, um die Daten zu identifizieren, die wir als Eingabe benötigen würden. Der Ansatz bestand darin, Empfehlungen für einen bestimmten Benutzer basierend auf Videos zu generieren, die ähnlichen Benutzern gefallen haben. Unser Ziel war es, Empfehlungen in Echtzeit zu generieren, wenn Benutzer mit der KillrVideo-Anwendung interagieren, dh als OLTP-Interaktion.

Um das Schema zu definieren, haben wir eine Teilmenge der von KillrVideo verwalteten Daten identifiziert, die wir für unser Diagramm benötigten. Dies umfasste Benutzer, Videos, Bewertungen und Tags sowie Eigenschaften dieser Elemente, auf die wir möglicherweise im Algorithmus verweisen oder die in Empfehlungsergebnissen enthalten sind. Anschließend haben wir im Gremlin ein Diagrammschema erstellt, das folgendermaßen aussieht:

// Scheitelpunktbeschriftungen erstellen

schema.vertexLabel ("Benutzer"). partitionKey ('Benutzer-ID').

  Eigenschaften ("Benutzer-ID", "E-Mail", "hinzugefügtes Datum"). ifNotExists (). create ();

schema.vertexLabel ("video"). partitionKey ('videoId').

  Eigenschaften ("VideoId", "Name", "Beschreibung", "Added_date",

Vorschau_Bildort ”). ifNotExists (). create ();

schema.vertexLabel ("tag"). partitionKey ('name').

  Eigenschaften ("Name", "Tagged_Datum"). ifNotExists (). create ();

// Kantenbeschriftungen erstellen

schema.edgeLabel ("bewertet"). multiple (). Eigenschaften ("Bewertung").

  Verbindung ("Benutzer", "Video"). ifNotExists (). create ();

schema.edgeLabel ("hochgeladen"). single (). Eigenschaften ("hinzugefügtes Datum").

  Verbindung ("Benutzer", "Video"). ifNotExists (). create ();

schema.edgeLabel ("taggedWith"). single ().

  Verbindung ("Video", "Tag"). ifNotExists (). create ();

Wir haben Benutzer, Videos und Tags als Scheitelpunkte modelliert und Kanten verwendet, um zu identifizieren, welche Benutzer welche Videos hochgeladen haben, Benutzerbewertungen von Videos und die mit jedem Video verknüpften Tags. Wir haben Scheitelpunkten und Kanten Eigenschaften zugewiesen, auf die in Abfragen verwiesen oder die in Ergebnissen enthalten sind. Das resultierende Schema sieht in DataStax Studio, einem Entwicklertool im Notebook-Stil zum Entwickeln und Ausführen von Abfragen in CQL und Gremlin, folgendermaßen aus.

Basierend auf diesem Schema haben wir Abfragen definiert, die Daten in das Diagramm einfügen, und Abfragen, die Daten aus dem Diagramm abrufen. Schauen wir uns eine Diagrammabfrage an, die Empfehlungen generiert. Hier ist der grundlegende Ablauf: Identifizieren Sie für einen bestimmten Benutzer ähnliche Benutzer, denen Videos gefallen haben, die dem bestimmten Benutzer gefallen haben, wählen Sie Videos aus, die ähnlichen Benutzern auch gefallen haben, schließen Sie Videos aus, die der angegebene Benutzer bereits gesehen hat, ordnen Sie diese Videos nach Beliebtheit und geben Sie die Ergebnisse an.

def numRatingsToSample = 1000

def localUserRatingsToSample = 10

def minPositiveRating = 4

def userID = ...

gV (). has ("Benutzer", "Benutzer-ID", Benutzer-ID) .as ("^ currentUser")

    // Alle Videos abrufen, die der Benutzer gesehen hat, und speichern

    .map (out ('bewertet'). dedup (). fold ()). as ("^ watchVideos")

    // gehe zurück zum aktuellen Benutzer

    .select ("^ currentUser")

    // identifiziere die Videos, die der Nutzer hoch bewertet hat

    .outE ('bewertet'). hat ('Bewertung', gte (minPositiveRating)). inV ()

    // Welche anderen Nutzer haben diese Videos hoch bewertet?

    .inE ('bewertet'). hat ('Bewertung', gte (minPositiveRating))

    // Begrenze die Anzahl der Ergebnisse, damit dies als OLTP-Abfrage funktioniert

    .sample (numRatingsToSample)

    // Nach Bewertung sortieren, um Benutzer zu bevorzugen, die diese Videos am höchsten bewertet haben

    .by ('Bewertung'). outV ()

    // den aktuellen Benutzer entfernen

    .where (neq ("^ currentUser"))

Lassen Sie uns einen Moment innehalten, um zu Atem zu kommen. Bisher haben wir in dieser Durchquerung ähnliche Benutzer identifiziert. Der zweite Teil der Durchquerung nimmt diese ähnlichen Benutzer auf, greift auf eine begrenzte Anzahl von Videos zu, die den ähnlichen Benutzern gefallen haben, entfernt Videos, die der Benutzer bereits gesehen hat, und generiert eine nach Beliebtheit sortierte Ergebnismenge.

    // wähle eine begrenzte Anzahl hoch bewerteter Videos von jedem ähnlichen Benutzer aus

   .local (outE ('bewertet'). hat ('Bewertung', gte (minPositiveRating)). limit (localUserRatingsToSample)). sack (zuweisen) .by ('Bewertung'). inV ()

     // Videos ausschließen, die der Benutzer bereits gesehen hat

    .not (wo (innerhalb ("^ WatchedVideos")))

    // identifiziere die beliebtesten Videos anhand der Summe aller Bewertungen

    .group (). by (). by (sack (). sum ())

    // Jetzt, da wir eine große Karte von [Video: Score] haben, bestellen Sie sie

    .order (local) .by (values, decr) .limit (local, 100) .select (keys) .unfold ()

    // empfohlene Videos ausgeben, einschließlich des Benutzers, der jedes Video hochgeladen hat

    .project ('Video', 'Benutzer')

        .durch()

        .by (__. in ('hochgeladen'))

Während diese Durchquerung kompliziert aussieht, denken Sie daran, dass es sich um die gesamte Geschäftslogik eines Empfehlungsalgorithmus handelt. Wir werden hier nicht auf jeden Schritt dieser Durchquerung im Detail eingehen, aber die Sprachreferenz ist eine großartige Ressource, und es werden qualitativ hochwertige Schulungen angeboten.

Ich empfehle, Traversen interaktiv über einen repräsentativen Datensatz mit einem Tool wie DataStax Studio oder der Gremlin-Konsole von Apache TinkerPop zu entwickeln. Auf diese Weise können Sie Ihre Durchquerungen schnell durchlaufen und verfeinern. DataStax Studio ist eine webbasierte Umgebung, die mehrere Möglichkeiten bietet, Traversal-Ergebnisse als Netzwerke von Knoten und Kanten zu visualisieren (siehe Abbildung unten). Weitere unterstützte Ansichten sind Tabellen, Diagramme und Grafiken sowie die Leistungsverfolgung.

DataStax

Einbinden einer Diagrammdatenbank in Ihre Architektur

Sobald Sie Ihr Diagrammschema und Ihre Abfragen entworfen haben, ist es Zeit, das Diagramm in Ihre Anwendung zu integrieren. So haben wir DataStax Enterprise Graph in KillrVideo integriert. Die mehrschichtige Architektur von KillrVideo besteht aus einer Webanwendung, die auf einer Reihe von Mikrodiensten basiert, mit denen Benutzer, Videos (einschließlich Tags) und Bewertungen verwaltet werden. Diese Dienste nutzen die DataStax Enterprise Graph-Datenbank (basierend auf Apache Cassandra) für die Datenspeicherung und den Zugriff auf die Daten mithilfe von CQL.

Wir haben unsere Empfehlungs-Engine als Teil des Service für empfohlene Videos implementiert (siehe unten). Dieser Dienst generiert eine Liste von Empfehlungen mit einer Benutzer-ID. Um die Empfehlungs-Engine zu implementieren, haben wir die oben beschriebene Gremlin-Durchquerung in Java-Code übersetzt.

DataStax

Diese Architektur unterstreicht eine häufige Herausforderung bei Microservice-Architekturen - die Notwendigkeit, mit Daten zu interagieren, die mehreren Diensten gehören. Wie oben gezeigt, basiert das zur Generierung von Empfehlungen verwendete Diagramm auf Daten aus den Diensten Benutzerverwaltung, Videokatalog und Bewertungen.

Wir haben den Dateneigentum unserer vorhandenen Dienste durch asynchrones Messaging erhalten. Die Dienste Benutzerverwaltung, Videokatalog und Bewertungen veröffentlichen Ereignisse zu Datenänderungen. Der Dienst für empfohlene Videos abonniert diese Ereignisse und aktualisiert das Diagramm entsprechend. Die Kompromisse, die wir hier eingegangen sind, sind typisch für Anwendungen, die einen Multi-Modell-Ansatz verwenden, ein Thema, das ich in meinem vorherigen Artikel untersucht habe.

Implementieren von Gremlin-Traversen in Java

Der DataStax Java-Treiber bietet eine benutzerfreundliche, fließende API für die Implementierung von Gremlin-Traversen mit DataStax Enterprise Graph. Die API machte es trivial, Groovy-basierte Abfragen, die wir in DataStax Studio erstellt haben, in Java-Code zu migrieren.

Wir konnten dann unseren Java-Code mithilfe einer Gremlin-Funktion, die als DSLs, domänenspezifische Sprachen, bekannt ist, noch lesbarer und wartbarer machen. Ein DSL ist eine Erweiterung von Gremlin in eine bestimmte Domäne. Für KillrVideo haben wir ein DSL erstellt, um die Gremlin-Traversal-Implementierung um Begriffe zu erweitern, die für die Videodomäne relevant sind. Die KillrVideoTraversalDslKlasse definiert Abfrageoperationen wie u ser(), die den Scheitelpunkt im Diagramm mit einer bereitgestellten UUID lokalisieren und recommendByUserRating()Empfehlungen für einen bereitgestellten Benutzer basierend auf Parametern wie einer Mindestbewertung und einer angeforderten Anzahl von Empfehlungen generieren.

Die Verwendung von DSL vereinfachte die Implementierung des Vorgeschlagenen Videodienstes in etwa dem folgenden Beispiel, wodurch eine erstellt wird GraphStatement, die wir dann mit dem DataStax-Java-Treiber ausführen:

GraphStatement gStatement = DseGraph.statementFromTraversal (killr.users (userIdString)

       .recommendByUserRating (100, 4, 500, 10)

);

Durch die Verwendung von DSL konnten wir einen Teil der Komplexität unserer Diagramminteraktionen in wiederverwendbaren Funktionen verbergen, die dann nach Bedarf kombiniert werden können, um komplexere Durchquerungen zu bilden. Auf diese Weise können wir zusätzliche Empfehlungs-Engines implementieren, die von einem ausgewählten Benutzerscheitelpunkt ausgehen, der von der user()Methode bereitgestellt wird , und es der Anwendung ermöglichen, zwischen den verschiedenen Implementierungen zu wechseln.

Ein Beispiel für ein Arbeitsdiagramm

Die Ergebnisse unserer Integration von DataStax Enterprise Graph in KillrVideo finden Sie im Abschnitt "Für Sie empfohlen" der unten gezeigten Webanwendung. Probieren Sie es selbst unter //www.killrvideo.com aus, indem Sie ein Konto erstellen und einige Videos bewerten.

DataStax

Ich hoffe, dass dieser Artikel Ihnen einige großartige Ideen gibt, wie eine Grafikdatenbank für Ihre Anwendung sinnvoll sein kann und wie Sie mit Gremlin und DataStax Enterprise Graph beginnen können.

Jeff Carpenter ist technischer Evangelist bei DataStax, wo er seinen Hintergrund in Systemarchitektur, Microservices und Apache Cassandra nutzt, um Entwicklern und Betriebsingenieuren dabei zu helfen, verteilte Systeme zu erstellen, die skalierbar, zuverlässig und sicher sind. Jeff ist der Autor von Cassandra: The Definitive Guide, 2nd Edition.

- -

Das New Tech Forum bietet einen Ort, an dem Sie neue Unternehmenstechnologien in beispielloser Tiefe und Breite erkunden und diskutieren können. Die Auswahl ist subjektiv, basierend auf unserer Auswahl der Technologien, die wir für wichtig und für die Leser von größtem Interesse halten. akzeptiert keine Marketingmaterialien zur Veröffentlichung und behält sich das Recht vor, alle eingebrachten Inhalte zu bearbeiten. Senden Sie alle Anfragen an  [email protected] .