Postgres वरील Apache AGE वापरून व्हिडिओ संबंधांचा शोध घेणे
रिलेशनल डेटाबेसना (Relational databases) खोलवर असलेल्या संबंधांशी (deep relationships) संघर्ष करावा लागतो.
TrendVidStream मध्ये, आम्ही आठ क्षेत्रांमधील (regions) स्ट्रीमिंग टायटल्सचे कॅटलॉग व्यवस्थापित करतो. आम्ही सुरुवातीला FTS5 सह SQLite वापरत होतो. ते फुल-टेक्स्ट सर्च (full-text search) आणि साध्या उपयोजनांसाठी (deployments) चांगले काम करत होते.
जेव्हा वापरकर्त्यांनी गुंतागुंतीचे प्रश्न विचारण्यास सुरुवात केली, तेव्हा समस्या निर्माण झाली. त्यांना जाणून घ्यायचे होते: "या विशिष्ट दिग्दर्शक आणि या कलाकारांच्या या थ्रिलर चित्रपटापासून दोन किंवा तीन स्टेप्स (hops) दूर आणखी काय आहे?"
SQL मध्ये, यासाठी अनेक self-joins लागतात. प्रत्येक अतिरिक्त स्टेपमुळे (hop) क्वेरी मेंटेन करणे कठीण होते आणि तिचा वेगही मंदावतो. 'Join fan-out' ही एक मोठी समस्या बनते.
आम्ही PostgreSQL वरील Apache AGE extension वापरून एक ग्राफ लेअर (graph layer) जोडून ही समस्या सोडवली.
हे विभाजन का फायदेशीर ठरते याची कारणे खालीलप्रमाणे आहेत:
• तुम्ही PostgreSQL कायम ठेवू शकता. तुम्ही तेच कनेक्शन्स, ट्रान्झॅक्शन्स आणि बॅकअप टूल्स वापरू शकता. तुम्हाला Neo4j सारखा वेगळा डेटाबेस घेण्याची गरज नाही. • तुम्ही ग्राफ आणि रिलेशनल डेटा एकत्र करू शकता. तुम्ही Cypher क्वेरीज चालवू शकता आणि त्यांचे निकाल मानक (standard) SQL टेबल्ससोबत जॉइन करू शकता. • तुम्ही बदलत्या खोलीचे (variable depth) सहज व्यवस्थापन करू शकता. एक ते तीन स्टेप्समधील (hops) कनेक्शन शोधणे ही Cypher मधील एक साधी कमांड आहे. • तुम्ही साधेपणा टिकवून ठेवता. ग्राफ हा तुमच्या डेटाचा एक प्रोजेक्शन (projection) आहे, तो माहितीचा वेगळा स्रोत (separate source of truth) नाही.
आमच्या मॉडेलमध्ये चार vertex labels वापरले आहेत:
- Video
- Person
- Platform
- Region
आम्ही SIMILAR_TO, WORKED_ON, आणि AVAILABLE_IN सारखे विशिष्ट edge types वापरतो.
एक महत्त्वाचा धडा: तुमचे एन्ट्री पॉइंट्स (entry points) नेहमी इंडेक्स करा. आम्ही Video vertices वरील ext_id प्रॉपर्टी इंडेक्स करतो. याशिवाय, प्रत्येक ट्रॅव्हर्सल (traversal) एका संथ सिक्वेन्शिअल स्कॅनने (sequential scan) सुरू होते.
याचा परिणाम म्हणजे शिफारसींसाठी (recommendations) एक स्वच्छ आणि वाचनीय क्वेरी मिळते:
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);
ही क्वेरी जर्मनीमध्ये उपलब्ध असलेले आणि तीन स्टेप्सच्या (hops) मर्यादेतील संबंधित व्हिडिओ शोधते. SQL मध्ये, हे जॉइन्सचा एक मोठा ढिगारा असेल. Cypher मध्ये, हे एक साधे पॅटर्न आहे.
आम्ही टेक्स्ट सर्चसाठी SQLite ठेवले आणि कनेक्टिव्हिटीसाठी AGE वापरले. प्रत्येक टूल त्याच्या सर्वोत्तम कामासाठी वापरले जाते.
