Apache AGE ഉപയോഗിച്ച് ഗ്രാഫ് അധിഷ്ഠിത വീഡിയോ റിലേഷൻഷിപ്പ് ക്വറികൾ നിർമ്മിക്കുന്നു

ഞങ്ങളുടെ ഏറ്റവും കൂടുതൽ റിസോഴ്സ് ഉപയോഗിക്കുന്ന ക്വറി ഒരു ലളിതമായ "show related videos" പാനൽ ആയിരുന്നു.

ViralVidVault-ൽ, ഞങ്ങൾ വീഡിയോ ട്രെൻഡുകൾ ട്രാക്ക് ചെയ്യുന്നു. പങ്കിട്ട ചാനലുകൾ വഴിയോ ഒരേസമയം കണ്ട വീഡിയോകൾ (co-viewed sessions) വഴിയോ ബന്ധപ്പെട്ട വീഡിയോകൾ കണ്ടെത്തുന്നത് ഞങ്ങളുടെ ഡാറ്റാബേസ് പെർഫോമൻസിനെ സാരമായി ബാധിക്കുന്നുണ്ടെന്ന് ഞങ്ങൾ കണ്ടെത്തി. റിക്കഴ്‌സീവ് ജോയിനുകൾ (recursive joins) ഉപയോഗിച്ച് SQLite പരീക്ഷിച്ചു നോക്കി. ഒരു ഹോപ്പ് (one hop) വരെ അത് പ്രവർത്തിച്ചു. എന്നാൽ രണ്ട് ഹോപ്പിൽ എത്തിയപ്പോൾ ഡാറ്റാ അളവ് കുതിച്ചുയർന്നു. ഒരു ക്വറി ലക്ഷക്കണക്കിന് വരികൾ (rows) സൃഷ്ടിച്ചു. ഞങ്ങളുടെ വർക്കറുകൾ ടൈം ഔട്ട് ആകാൻ തുടങ്ങി.

ഡാറ്റ ഒരു ഗ്രാഫ് ആണ്. ഞങ്ങൾ അതിനെ ടേബിളുകളിലേക്ക് നിർബന്ധപൂർവ്വം മാറ്റാൻ ശ്രമിക്കുകയും അതിന്റെ പ്രത്യാഘാതങ്ങൾ അനുഭവിക്കുകയും ചെയ്തു.

ഞങ്ങൾ റിലേഷൻഷിപ്പ് ലെയർ Apache AGE-ലേക്ക് മാറ്റി. ഇത് PostgreSQL-നുള്ള ഒരു openCypher എക്സ്റ്റൻഷനാണ്. ഞങ്ങൾ ഞങ്ങളുടെ PHP 8.4 ആപ്പും SQLite സ്റ്റോറും നിലനിർത്തി.

ഫലങ്ങൾ: • റിലേറ്റഡ് പാനൽ ലേറ്റൻസി 900ms-ൽ നിന്ന് 40ms-ൽ താഴെയായി കുറഞ്ഞു. • സങ്കീർണ്ണമായ രണ്ട്-ഹോപ്പ് ട്രാവേഴ്സലുകൾ (two-hop traversals) ഇപ്പോൾ ഒറ്റ അക്ക മില്ലിസെക്കൻഡുകൾ മാത്രം എടുക്കുന്നു. • AGE Postgres-നുള്ളിൽ പ്രവർത്തിക്കുന്നതിനാൽ ഞങ്ങളുടെ ഓപ്പറേഷണൽ വർക്ക്ലോഡ് മാറ്റമില്ലാതെ തുടർന്നു.

ഒരു സ്റ്റാൻഡ്‌ലോൺ ഗ്രാഫ് ഡാറ്റാബേസിന് പകരം എന്തുകൊണ്ട് Apache AGE ഉപയോഗിക്കണം?

  1. ഓപ്പറേഷണൽ ലാളിത്യം ബാക്കപ്പ് ചെയ്യാനോ സുരക്ഷിതമാക്കാനോ പുതിയൊരു ഡാറ്റാബേസ് നിങ്ങൾക്ക് ആവശ്യമില്ല. AGE നിങ്ങളുടെ നിലവിലുള്ള Postgres സെറ്റപ്പ്, കണക്ഷൻ പൂളുകൾ, സെക്യൂരിറ്റി റൂളുകൾ എന്നിവ ഉപയോഗിക്കുന്നു.

  2. നേറ്റീവ് ഗ്രാഫ് ക്വറികൾ SQL-ൽ, വേരിയബിൾ ലെങ്ത് പാത്തുകൾക്ക് (variable-length paths) സങ്കീർണ്ണമായ റിക്കർഷൻ ആവശ്യമാണ്. എന്നാൽ Cypher-ൽ, അവ ലളിതമായ പാറ്റേണുകളായി എഴുതാം. 40 വരികളുള്ള ഒരു റിക്കഴ്‌സീവ് SQL ബ്ലോക്ക് വെറും 6 വരികളുള്ള ഒരു Cypher ക്വറിയായി മാറി.

  3. മികച്ച പെർഫോമൻസ് ഒരു ഗ്രാഫ് എഞ്ചിൻ അഡ്ജസൻസി (adjacency) ഇൻഡക്സ് ചെയ്യുന്നു. പൊരുത്തപ്പെടാത്ത പാത്തുകൾ വികസിപ്പിക്കുന്നത് ഇത് തടയുന്നു. ഇത് ഞങ്ങളുടെ പഴയ സിസ്റ്റം തകരാറിലാക്കിയ ഡാറ്റാ ഫാൻ-ഔട്ട് (data fan-out) ഒഴിവാക്കുന്നു.

ഞങ്ങളുടെ മൈഗ്രേഷനിൽ നിന്നുള്ള ഒരു പ്രധാന പാഠം: എപ്പോഴും നിങ്ങളുടെ എൻട്രിപോയിന്റ് പ്രോപ്പർട്ടികൾ (entrypoint properties) ഇൻഡക്സ് ചെയ്യുക. ഒരു ട്രാവേഴ്സൽ തുടങ്ങാൻ നിങ്ങൾ ഉപയോഗിക്കുന്ന ID ഇൻഡക്സ് ചെയ്തില്ലെങ്കിൽ, AGE ഒരു ഫുൾ സ്കാൻ (full scan) നടത്തും. ഇത് ഏറ്റവും മികച്ച ഗ്രാഫ് ക്വറിയെപ്പോലും സാവധാനത്തിലാക്കും.

ഞങ്ങൾ ഗ്രാഫിനെ ഒരു റീഡ് മോഡൽ (read model) ആയിട്ടാണ് ഉപയോഗിക്കുന്നത്. ഞങ്ങളുടെ റോ ഡാറ്റ (raw data) SQLite-ൽ തന്നെ ഇരിക്കുന്നു. ഇവ രണ്ടിനെയും സിങ്ക് ചെയ്യാൻ ഞങ്ങൾ ഒരു Python സ്ക്രിപ്റ്റ് ഉപയോഗിക്കുന്നു. ഇത് ഞങ്ങളുടെ ഗ്രാഫിനെ വേഗതയുള്ളതും ഭാരം കുറഞ്ഞതും എളുപ്പത്തിൽ പുനർനിർമ്മിക്കാവുന്നതുമാക്കി മാറ്റുന്നു.

നിങ്ങളുടെ റിക്കഴ്‌സീവ് SQL ക്വറികൾ സങ്കീർണ്ണമായിക്കൊണ്ടിരിക്കുകയാണെങ്കിൽ, റിലേഷണൽ മോഡലിനോട് പൊരുതില്ലെങ്കിൽ മതി. നിങ്ങളുടെ നിലവിലുള്ള സ്റ്റോറിനൊപ്പം ഒരു ചെറിയ ഗ്രാഫ് പ്രൊജക്ഷൻ (graph projection) നിർമ്മിക്കുക.

Source: https://dev.to/ahmet_gedik778845/building-graph-based-video-relationship-queries-with-apache-age-2p12