Querying Video-relaties met Apache AGE op Postgres

Relationele databases hebben moeite met diepe relaties.

Bij TrendVidStream beheren we een catalogus van streamingtitels in acht regio's. Oorspronkelijk gebruikten we SQLite met FTS5. Dat werkte goed voor full-text search en eenvoudige implementaties.

Het probleem begon toen gebruikers complexe vragen stelden. Ze wilden weten: "Wat is er nog meer twee of drie hops verwijderd van deze thriller met deze specifieke regisseur en deze acteurs?"

In SQL vereist dit veel self-joins. Elke extra hop maakt de query moeilijker te onderhouden en trager om uit te voeren. De join fan-out wordt een nachtmerrie.

We hebben dit opgelost door een graph-laag toe te voegen met de Apache AGE-extensie op PostgreSQL.

Dit is waarom deze splitsing werkt:

• Je behoudt PostgreSQL. Je gebruikt dezelfde verbindingen, transacties en backup-tools. Je hebt geen aparte database zoals Neo4j nodig. • Je combineert graph- en relationele data. Je kunt Cypher-queries uitvoeren en de resultaten koppelen aan standaard SQL-tabellen. • Je gaat eenvoudig om met variabele diepte. Het vinden van verbindingen over één tot drie hops is een eenvoudige opdracht in Cypher. • Je behoudt de eenvoud. De graph is een projectie van je data, geen aparte source of truth.

Ons model gebruikt vier vertex-labels:

  • Video
  • Person
  • Platform
  • Region

We gebruiken specifieke edge-types zoals SIMILAR_TO, WORKED_ON en AVAILABLE_IN.

Eén cruciale les: indexeer altijd je instappunten. We indexeren de ext_id-property op Video-vertices. Zonder dit begint elke traversal met een trage sequential scan.

Het resultaat is een schone, leesbare query voor aanbevelingen:

SELECT * FROM cypher('discovery', $$ MATCH (seed:Video {ext_id: 'vid_8842'}) MATCH (seed)-[:SIMILAR_TO|WORKED_ON*1..3]-(rec:Video)-[:AVAILABLE_IN]->(:Region {code: 'DE'}) WHERE rec.ext_id <> 'vid_8842' RETURN DISTINCT rec.ext_id, rec.title, rec.year LIMIT 24 $$) AS (ext_id agtype, title agtype, year agtype);

Deze query vindt gerelateerde video's binnen drie hops die beschikbaar zijn in Duitsland. In SQL zou dit een enorme berg joins zijn. In Cypher is het een eenvoudig patroon.

We hielden SQLite voor tekstzoekopdrachten en gebruikten AGE voor connectiviteit. Elk hulpmiddel doet waar het het beste in is.

Bron: https://dev.to/ahmet_gedik778845/querying-video-relationships-with-apache-age-graph-extension-on-postgres-3g54