Aufbau von graphbasierten Video-Beziehungsabfragen mit Apache AGE

Unsere teuerste Abfrage war ein einfaches „Ähnliche Videos anzeigen“-Panel.

Bei ViralVidVault verfolgen wir Videotrends. Wir haben festgestellt, dass das Finden verwandter Videos über gemeinsame Kanäle oder gemeinsam angesehene Sitzungen unsere Datenbankleistung massiv beeinträchtigte. Wir haben versucht, SQLite mit rekursiven Joins zu nutzen. Bei einem Hop funktionierte es. Bei zwei Hops explodierten die Datenmengen. Eine einzige Abfrage erzeugte Hunderttausende von Zeilen. Unsere Worker begannen, in ein Timeout zu laufen.

Die Daten sind ein Graph. Wir haben versucht, sie in Tabellen zu pressen, und mussten den Preis dafür zahlen.

Wir haben die Beziehungsebene auf Apache AGE verlagert. Dies ist eine openCypher-Erweiterung für PostgreSQL. Unsere PHP 8.4-App und unseren SQLite-Speicher haben wir beibehalten.

Die Ergebnisse: • Die Latenz des Panels für verwandte Videos sank von 900 ms auf unter 40 ms. • Komplexe Zwei-Hop-Traversierungen dauern nun nur noch einstellige Millisekunden. • Unsere betriebliche Arbeitslast blieb gleich, da AGE innerhalb von Postgres läuft.

Warum Apache AGE anstelle einer eigenständigen Graphdatenbank verwenden?

  1. Betriebliche Einfachheit Sie benötigen keine neue Datenbank für Backups oder zur Absicherung. AGE nutzt Ihr bestehendes Postgres-Setup, die Connection Pools und die Sicherheitsregeln.

  2. Native Graph-Abfragen In SQL erfordern Pfade variabler Länge komplexe Rekursionen. In Cypher schreiben Sie diese als einfache Muster. Ein 40-zeiliger rekursiver SQL-Block wurde zu einer 6-zeiligen Cypher-Abfrage.

  3. Bessere Performance Eine Graph-Engine indiziert die Adjazenz. Sie stoppt das Erweitern von Pfaden, die nicht passen. Dies verhindert das Data Fan-out, das unser vorheriges System zum Absturz gebracht hat.

Eine wichtige Lektion aus unserer Migration: Indizieren Sie immer Ihre Einstiegspunkt-Eigenschaften (Entrypoint Properties). Wenn Sie die ID nicht indizieren, die Sie zum Starten einer Traversierung verwenden, führt AGE einen Full Scan durch. Das macht selbst die beste Graph-Abfrage langsam.

Wir nutzen den Graphen als Read-Model. Unsere Rohdaten bleiben in SQLite. Wir verwenden ein Python-Skript, um beide zu synchronisieren. Das hält unseren Graphen schnell, leichtgewichtig und einfach wiederaufbaubar.

Wenn Ihre rekursiven SQL-Abfragen zu komplex werden, kämpfen Sie nicht gegen das relationale Modell an. Erstellen Sie eine kleine Graph-Projektion parallel zu Ihrem aktuellen Speicher.

Quelle: https://dev.to/ahmet_gedik778845/building-graph-based-video-relationship-queries-with-apache-age-2p12