Het bouwen van graafgebaseerde video-relatiequery's met Apache AGE

Onze zwaarste query was een simpel "toon gerelateerde video's"-paneel.

Bij ViralVidVault volgen we videotrends. We ontdekten dat het vinden van gerelateerde video's via gedeelde kanalen of gezamenlijke sessies onze databaseprestaties volledig ondermijnde. We probeerden SQLite te gebruiken met recursieve joins. Voor één hop werkte het. Bij twee hops explodeerde de hoeveelheid data. Eén query genereerde honderdduizenden rijen. Onze workers begonnen time-outs te geven.

De data is een graaf. We probeerden het in tabellen te dwingen en betaalden daar de prijs voor.

We hebben de relatielaag verplaatst naar Apache AGE. Dit is een openCypher-extensie voor PostgreSQL. We behielden onze PHP 8.4-app en onze SQLite-opslag.

De resultaten: • De latentie van het gerelateerde paneel daalde van 900ms naar minder dan 40ms. • Complexe twee-hop traversals kosten nu slechts enkele milliseconden. • Onze operationele workload bleef gelijk omdat AGE binnen Postgres draait.

Waarom Apache AGE gebruiken in plaats van een standalone graafdatabase?

  1. Operationele eenvoud Je hebt geen nieuwe database nodig om te back-uppen of te beveiligen. AGE maakt gebruik van je bestaande Postgres-setup, connection pools en beveiligingsregels.

  2. Native graafquery's In SQL vereisen variabel lengtepaden complexe recursie. In Cypher schrijf je ze als eenvoudige patronen. Een recursief SQL-blok van 40 regels werd een Cypher-query van 6 regels.

  3. Betere prestaties Een graaf-engine indexeert nabijheid (adjacency). Het stopt met het uitbreiden van paden die niet overeenkomen. Dit voorkomt de data fan-out die ons vorige systeem deed crashen.

Een belangrijke les uit onze migratie: Indexeer altijd je entrypoint-eigenschappen. Als je de ID die je gebruikt om een traversal te starten niet indexeert, voert AGE een volledige scan uit. Dit maakt zelfs de beste graafquery traag.

We gebruiken de graaf als een read model. Onze ruwe data blijft in SQLite. We gebruiken een Python-script om de twee te synchroniseren. Dit houdt onze graaf snel, lichtgewicht en gemakkelijk opnieuw op te bouwen.

Als je recursieve SQL-query's te complex worden, vecht dan niet tegen het relationele model. Bouw een kleine graafprojectie naast je huidige opslag.

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