Querying Video Relationships with Apache AGE on Postgres

ਰਿਲੇਸ਼ਨਲ ਡੇਟਾਬੇਸ ਡੂੰਘੇ ਰਿਲੇਸ਼ਨਸ਼ਿਪਸ (relationships) ਨਾਲ ਸੰਘਰਸ਼ ਕਰਦੇ ਹਨ।

TrendVidStream ਵਿਖੇ, ਅਸੀਂ ਅੱਠ ਖੇਤਰਾਂ ਵਿੱਚ ਸਟ੍ਰੀਮਿੰਗ ਟਾਈਟਲਜ਼ ਦਾ ਇੱਕ ਕੈਟਾਲਾਗ ਪ੍ਰਬੰਧਿਤ ਕਰਦੇ ਹਾਂ। ਅਸੀਂ ਸ਼ੁਰੂ ਵਿੱਚ FTS5 ਦੇ ਨਾਲ SQLite ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਸੀ। ਇਹ ਫੁੱਲ-ਟੈਕਸਟ ਸਰਚ ਅਤੇ ਸਰਲ ਡਿਪਲਾਈਮੈਂਟਸ ਲਈ ਵਧੀਆ ਕੰਮ ਕਰਦਾ ਸੀ।

ਸਮੱਸਿਆ ਉਦੋਂ ਸ਼ੁਰੂ ਹੋਈ ਜਦੋਂ ਉਪਭੋਗਤਾਵਾਂ ਨੇ ਗੁੰਝਲਦਾਰ ਸਵਾਲ ਪੁੱਛੇ। ਉਹ ਜਾਣਨਾ ਚਾਹੁੰਦੇ ਸਨ: "ਇਸ ਖਾਸ ਡਾਇਰੈਕਟਰ ਅਤੇ ਇਹਨਾਂ ਅਦਾਕਾਰਾਂ ਵਾਲੀ ਥ੍ਰਿਲਰ ਫਿਲਮ ਤੋਂ ਦੋ ਜਾਂ ਤਿੰਨ ਹੌਪਸ (hops) ਦੂਰ ਹੋਰ ਕੀ ਹੈ?"

SQL ਵਿੱਚ, ਇਸ ਲਈ ਕਈ self-joins ਦੀ ਲੋੜ ਹੁੰਦੀ ਹੈ। ਹਰ ਵਾਧੂ ਹੌਪ ਕੁਐਰੀ ਨੂੰ ਬਣਾਈ ਰੱਖਣਾ ਮੁਸ਼ਕਲ ਬਣਾ ਦਿੰਦਾ ਹੈ ਅਤੇ ਇਸ ਨੂੰ ਚਲਾਉਣਾ ਹੌਲੀ ਕਰ ਦਿੰਦਾ ਹੈ। Join fan-out ਇੱਕ ਦੁਸ਼ਵਾਰੀ ਬਣ ਜਾਂਦਾ ਹੈ।

ਅਸੀਂ PostgreSQL 'ਤੇ Apache AGE ਐਕਸਟੈਂਸ਼ਨ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਇੱਕ ਗ੍ਰਾਫ ਲੇਅਰ ਜੋੜ ਕੇ ਇਸ ਨੂੰ ਹੱਲ ਕੀਤਾ।

ਇੱਥੇ ਦੱਸਿਆ ਗਿਆ ਹੈ ਕਿ ਇਹ ਵੰਡ ਕਿਉਂ ਕੰਮ ਕਰਦੀ ਹੈ:

• ਤੁਸੀਂ PostgreSQL ਨੂੰ ਬਰਕਰਾਰ ਰੱਖਦੇ ਹੋ। ਤੁਸੀਂ ਉਹੀ ਕਨੈਕਸ਼ਨਾਂ, ਟ੍ਰਾਂਜੈਕਸ਼ਨਾਂ ਅਤੇ ਬੈਕਅੱਪ ਟੂਲਸ ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਹੋ। ਤੁਹਾਨੂੰ Neo4j ਵਰਗੇ ਵੱਖਰੇ ਡੇਟਾਬੇਸ ਦੀ ਲੋੜ ਨਹੀਂ ਹੈ। • ਤੁਸੀਂ ਗ੍ਰਾਫ ਅਤੇ ਰਿਲੇਸ਼ਨਲ ਡੇਟਾ ਨੂੰ ਮਿਲਾ ਸਕਦੇ ਹੋ। ਤੁਸੀਂ Cypher ਕੁਐਰੀਆਂ ਚਲਾ ਸਕਦੇ ਹੋ ਅਤੇ ਨਤੀਜਿਆਂ ਨੂੰ ਸਟੈਂਡਰਡ SQL ਟੇਬਲਾਂ ਨਾਲ ਜੋੜ ਸਕਦੇ ਹੋ। • ਤੁਸੀਂ ਵੇਰੀਏਬਲ ਡੈਪਥ (variable depth) ਨੂੰ ਆਸਾਨੀ ਨਾਲ ਸੰਭਾਲ ਸਕਦੇ ਹੋ। ਇੱਕ ਤੋਂ ਤਿੰਨ ਹੌਪਸ ਦੇ ਵਿਚਕਾਰ ਕਨੈਕਸ਼ਨ ਲੱਭਣਾ Cypher ਵਿੱਚ ਇੱਕ ਸਧਾਰਨ ਕਮਾਂਡ ਹੈ। • ਤੁਸੀਂ ਸਰਲਤਾ ਬਣਾਈ ਰੱਖਦੇ ਹੋ। ਗ੍ਰਾਫ ਤੁਹਾਡੇ ਡੇਟਾ ਦਾ ਇੱਕ ਪ੍ਰੋਜੈਕਸ਼ਨ ਹੈ, ਨਾ ਕਿ ਸੱਚਾਈ ਦਾ ਕੋਈ ਵੱਖਰਾ ਸਰੋਤ (separate source of truth)।

ਸਾਡਾ ਮਾਡਲ ਚਾਰ 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