Mengueri Hubungan Video dengan Apache AGE pada Postgres
Pangkalan data hubungan sukar mengendalikan hubungan yang mendalam.
Di TrendVidStream, kami menguruskan katalog tajuk penstriman di lapan wilayah. Pada asalnya, kami menggunakan SQLite dengan FTS5. Ia berfungsi dengan baik untuk carian teks penuh dan penggunaan yang ringkas.
Masalah bermula apabila pengguna mengajukan soalan yang kompleks. Mereka ingin tahu: "Apakah lagi kandungan yang berada dua atau tiga langkah jauhnya daripada filem thriller dengan pengarah dan pelakon tertentu ini?"
Dalam SQL, ini memerlukan banyak self-join. Setiap langkah tambahan menjadikan kueri lebih sukar untuk diselenggara dan lebih lambat untuk dijalankan. Join fan-out menjadi satu mimpi ngeri.
Kami menyelesaikan masalah ini dengan menambah lapisan graf menggunakan sambungan Apache AGE pada PostgreSQL.
Berikut adalah sebab mengapa pembahagian ini berkesan:
• Anda mengekalkan PostgreSQL. Anda menggunakan sambungan, transaksi, dan alatan sandaran yang sama. Anda tidak memerlukan pangkalan data berasingan seperti Neo4j. • Anda mencampurkan data graf dan hubungan. Anda boleh menjalankan kueri Cypher dan menggabungkan hasilnya dengan jadual SQL standard. • Anda mengendalikan kedalaman berubah dengan mudah. Mencari sambungan merentasi satu hingga tiga langkah adalah arahan mudah dalam Cypher. • Anda mengekalkan kesederhanaan. Graf tersebut adalah unjuran data anda, bukan sumber kebenaran yang berasingan.
Model kami menggunakan empat label bucu:
- Video
- Orang
- Platform
- Wilayah
Kami menggunakan jenis tepi khusus seperti SIMILAR_TO, WORKED_ON, dan AVAILABLE_IN.
Satu pengajaran penting: sentiasa indeks titik kemasukan anda. Kami mengindeks sifat ext_id pada bucu Video. Tanpa ini, setiap penelusuran bermula dengan imbasan turutan yang perlahan.
Hasilnya ialah kueri yang bersih dan mudah dibaca untuk cadangan:
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);
Kueri ini mencari video berkaitan dalam lingkungan tiga langkah yang tersedia di Jerman. Dalam SQL, ini akan menjadi timbunan join yang besar. Dalam Cypher, ia hanyalah satu corak yang mudah.
Kami mengekalkan SQLite untuk carian teks dan menggunakan AGE untuk ketersambungan. Setiap alatan melakukan apa yang terbaik bagi fungsinya.
