Postgres పై Apache AGE ఉపయోగించి వీడియో సంబంధాలను క్వెరీ చేయడం

రిలేషనల్ డేటాబేస్‌లు లోతైన సంబంధాలను (deep relationships) నిర్వహించడంలో ఇబ్బంది పడతాయి.

TrendVidStreamలో, మేము ఎనిమిది ప్రాంతాలలో స్ట్రీమింగ్ టైటిల్స్ యొక్క క్యాటలాగ్‌ను నిర్వహిస్తాము. మేము మొదట FTS5తో కూడిన SQLiteని ఉపయోగించాము. ఇది ఫుల్-టెక్స్ట్ సెర్చ్ మరియు సింపుల్ డిప్లాయ్‌మెంట్‌లకు బాగా పనిచేసింది.

వినియోగదారులు సంక్లిష్టమైన ప్రశ్నలు అడగడం ప్రారంభించినప్పుడు సమస్య మొదలైంది. వారు ఇలా తెలుసుకోవాలని అనుకున్నారు: "ఈ నిర్దిష్ట దర్శకుడు మరియు ఈ నటులతో ఉన్న ఈ థ్రిల్లర్ నుండి రెండు లేదా మూడు హాప్స్ (hops) దూరంలో ఇంకేమున్నాయి?"

SQLలో, దీనికి అనేక self-joins అవసరమవుతాయి. ప్రతి అదనపు హాప్ క్వెరీని నిర్వహించడం కష్టతరం చేస్తుంది మరియు రన్ అవ్వడానికి సమయం తీసుకుంటుంది. join fan-out ఒక పీడకలగా మారుతుంది.

PostgreSQLలో Apache AGE ఎక్స్‌టెన్షన్‌ను ఉపయోగించి గ్రాఫ్ లేయర్‌ను జోడించడం ద్వారా మేము దీనిని పరిష్కరించాము.

ఈ విభజన ఎందుకు పని చేస్తుందంటే:

• మీరు PostgreSQLని కొనసాగించవచ్చు. మీరు అదే కనెక్షన్‌లు, ట్రాన్సాక్షన్‌లు మరియు బ్యాకప్ టూల్స్‌ను ఉపయోగిస్తారు. మీకు Neo4j వంటి ప్రత్యేక డేటాబేస్ అవసరం లేదు. • మీరు గ్రాఫ్ మరియు రిలేషనల్ డేటాను మిక్స్ చేయవచ్చు. మీరు Cypher క్వెరీలను రన్ చేయవచ్చు మరియు ఫలితాలను స్టాండర్డ్ SQL టేబుల్స్‌తో జాయిన్ చేయవచ్చు. • మీరు వేరియబుల్ డెప్త్‌ను (variable depth) సులభంగా హ్యాండిల్ చేయవచ్చు. ఒకటి నుండి మూడు హాప్స్ వరకు కనెక్షన్‌లను కనుగొనడం Cypherలో ఒక సాధారణ కమాండ్. • మీరు సరళతను (simplicity) కాపాడుకోవచ్చు. గ్రాఫ్ అనేది మీ డేటా యొక్క ప్రొజెక్షన్ మాత్రమే, అది వేరుగా ఉండే సోర్స్ ఆఫ్ ట్రూత్ కాదు.

మా మోడల్ నాలుగు vertex labels ఉపయోగిస్తుంది:

  • Video
  • Person
  • Platform
  • Region

మేము SIMILAR_TO, WORKED_ON, మరియు AVAILABLE_IN వంటి నిర్దిష్ట edge types ఉపయోగిస్తాము.

ఒక ముఖ్యమైన పాఠం: ఎల్లప్పుడూ మీ ఎంట్రీ పాయింట్‌లను ఇండెక్స్ చేయండి. మేము Video vertices పై ext_id ప్రాపర్టీని ఇండెక్స్ చేస్తాము. ఇది లేకపోతే, ప్రతి traversal నెమ్మదైన sequential scanతో ప్రారంభమవుతుంది.

దీని ఫలితంగా రికమెండేషన్ల కోసం ఒక క్లీన్ మరియు రీడబుల్ క్వెరీ లభిస్తుంది:

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ని ఉపయోగించాము. ప్రతి టూల్ దానికి సంబంధించిన ఉత్తమ పనిని చేస్తుంది.

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