Postgres ನಲ್ಲಿ Apache AGE ಬಳಸಿ ವಿಡಿಯೋ ಸಂಬಂಧಗಳನ್ನು ಪ್ರಶ್ನಿಸುವುದು (Querying)
ರಿಲೇಶನಲ್ ಡೇಟಾಬೇಸ್ಗಳು ಆಳವಾದ ಸಂಬಂಧಗಳನ್ನು (deep relationships) ನಿರ್ವಹಿಸುವಲ್ಲಿ ಕಷ್ಟಪಡುತ್ತವೆ.
TrendVidStream ನಲ್ಲಿ, ನಾವು ಎಂಟು ಪ್ರದೇಶಗಳಲ್ಲಿನ ಸ್ಟ್ರೀಮಿಂಗ್ ಶೀರ್ಷಿಕೆಗಳ ಕ್ಯಾಟಲಾಗ್ ಅನ್ನು ನಿರ್ವಹಿಸುತ್ತೇವೆ. ನಾವು ಮೂಲತಃ FTS5 ನೊಂದಿಗೆ SQLite ಅನ್ನು ಬಳಸುತ್ತಿದ್ದೆವು. ಇದು ಫುಲ್-ಟೆಕ್ಸ್ಟ್ ಸರ್ಚ್ ಮತ್ತು ಸರಳ ನಿಯೋಜನೆಗಳಿಗೆ (deployments) ಚೆನ್ನಾಗಿ ಕೆಲಸ ಮಾಡುತ್ತಿತ್ತು.
ಬಳಕೆದಾರರು ಸಂಕೀರ್ಣವಾದ ಪ್ರಶ್ನೆಗಳನ್ನು ಕೇಳಲು ಪ್ರಾರಂಭಿಸಿದಾಗ ಸಮಸ್ಯೆ ಎದುರಾಯಿತು. ಅವರು ಹೀಗೆ ತಿಳಿಯಲು ಬಯಸಿದ್ದರು: "ಈ ನಿರ್ದಿಷ್ಟ ನಿರ್ದೇಶಕ ಮತ್ತು ಈ ನಟರಿರುವ ಈ ಥ್ರಿಲ್ಲರ್ ವಿಡಿಯೋದಿಂದ ಎರಡು ಅಥವಾ ಮೂರು ಹಂತಗಳ (hops) ದೂರದಲ್ಲಿ ಬೇರೆ ಇನ್ಯಾವ ವಿಡಿಯೋಗಳಿವೆ?"
SQL ನಲ್ಲಿ, ಇದಕ್ಕೆ ಅನೇಕ self-joins ಬೇಕಾಗುತ್ತವೆ. ಪ್ರತಿ ಹೆಚ್ಚುವರಿ ಹಂತವು (hop) ಕ್ವೇರಿಯನ್ನು ನಿರ್ವಹಿಸುವುದನ್ನು ಕಷ್ಟಕರವಾಗಿಸುತ್ತದೆ ಮತ್ತು ಅದರ ವೇಗವನ್ನು ಕಡಿಮೆ ಮಾಡುತ್ತದೆ. Join fan-out ಒಂದು ದೊಡ್ಡ ತಲೆನೋವು (nightmare) ಆಗುತ್ತದೆ.
PostgreSQL ನಲ್ಲಿ Apache AGE extension ಬಳಸಿ ಗ್ರಾಫ್ ಲೇಯರ್ ಅನ್ನು ಸೇರಿಸುವ ಮೂಲಕ ನಾವು ಇದನ್ನು ಪರಿಹರಿಸಿದೆವು.
ಈ ವಿಭಜನೆಯು ಏಕೆ ಕೆಲಸ ಮಾಡುತ್ತದೆ ಎಂಬ ಕಾರಣಗಳು ಇಲ್ಲಿವೆ:
• ನೀವು PostgreSQL ಅನ್ನು ಹಾಗೆಯೇ ಇರಿಸಿಕೊಳ್ಳಬಹುದು. ನೀವು ಅದೇ ಕನೆಕ್ಷನ್ಗಳು, ಟ್ರಾನ್ಸಾಕ್ಷನ್ಗಳು ಮತ್ತು ಬ್ಯಾಕಪ್ ಪರಿಕರಗಳನ್ನು ಬಳಸಬಹುದು. ನಿಮಗೆ Neo4j ನಂತಹ ಪ್ರತ್ಯೇಕ ಡೇಟಾಬೇಸ್ ಅಗತ್ಯವಿಲ್ಲ. • ನೀವು ಗ್ರಾಫ್ ಮತ್ತು ರಿಲೇಶನಲ್ ಡೇಟಾವನ್ನು ಬೆರೆಸಬಹುದು. ನೀವು Cypher ಕ್ವೇರಿಗಳನ್ನು ಚಲಾಯಿಸಬಹುದು ಮತ್ತು ಅದರ ಫಲಿತಾಂಶಗಳನ್ನು ಸ್ಟ್ಯಾಂಡರ್ಡ್ SQL ಟೇಬಲ್ಗಳೊಂದಿಗೆ ಜೋಡಿಸಬಹುದು (join). • ನೀವು ಬದಲಾಗುವ ಆಳವನ್ನು (variable depth) ಸುಲಭವಾಗಿ ನಿರ್ವಹಿಸಬಹುದು. ಒಂದುಿಂದ ಮೂರು ಹಂತಗಳವರೆಗಿನ ಕನೆಕ್ಷನ್ಗಳನ್ನು ಕಂಡುಹಿಡಿಯುವುದು Cypher ನಲ್ಲಿ ಒಂದು ಸರಳ ಕಮಾಂಡ್ ಆಗಿದೆ. • ನೀವು ಸರಳತೆಯನ್ನು ಕಾಪಾಡಿಕೊಳ್ಳಬಹುದು. ಗ್ರಾಫ್ ಎಂಬುದು ನಿಮ್ಮ ಡೇಟಾದ ಪ್ರಕ್ಷೇಪಣೆಯಾಗಿದೆ (projection), ಅದು ಪ್ರತ್ಯೇಕ ಮೂಲವಲ್ಲ (source of truth).
ನಮ್ಮ ಮಾಡೆಲ್ ನಾಲ್ಕು vertex labels ಬಳಸುತ್ತದೆ:
- Video
- Person
- Platform
- Region
ನಾವು SIMILAR_TO, WORKED_ON, ಮತ್ತು AVAILABLE_IN ನಂತಹ ನಿರ್ದಿಷ್ಟ edge types ಬಳಸುತ್ತೇವೆ.
ಒಂದು ಪ್ರಮುಖ ಪಾಠ: ಯಾವಾಗಲೂ ನಿಮ್ಮ ಎಂಟ್ರಿ ಪಾಯಿಂಟ್ಗಳನ್ನು ಇಂಡೆಕ್ಸ್ ಮಾಡಿ. ನಾವು 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);
ಈ ಕ್ವೇರಿಯು ಜರ್ಮನಿಯಲ್ಲ ಲಭ್ಯವಿರುವ ಮೂರು ಹಂತಗಳ ಒಳಗಿನ ಸಂಬಂಧಿತ ವಿಡಿಯೋಗಳನ್ನು ಹುಡುಕುತ್ತದೆ. SQL ನಲ್ಲಿ, ಇದು ದೊಡ್ಡ ಮಟ್ಟದ joins ಗಳ ಗುಂಪಾಗುತ್ತಿತ್ತು. Cypher ನಲ್ಲಿ, ಇದು ಒಂದು ಸರಳ ಪ್ಯಾಟರ್ನ್ ಆಗಿದೆ.
ನಾವು ಟೆಕ್ಸ್ಟ್ ಸರ್ಚ್ಗಾಗಿ SQLite ಅನ್ನು ಇರಿಸಿಕೊಂಡೆವು ಮತ್ತು ಕನೆಕ್ಟಿವಿಟಿಗಾಗಿ AGE ಅನ್ನು ಬಳಸಿದೆವು. ಪ್ರತಿಯೊಂದು ಪರಿಕರವು ತನ್ನ ಅತ್ಯುತ್ತಮ ಕೆಲಸವನ್ನು ಮಾಡುತ್ತದೆ.
