בניית שאילתות קשרי וידאו מבוססות גרף באמצעות Apache AGE
השאילתה היקרה ביותר שלנו הייתה פאנל פשוט של "הצג סרטונים קשורים".
ב-ViralVidVault, אנחנו עוקבים אחר טרנדים של וידאו. גילינו שחיפוש סרטונים קשורים דרך ערוצים משותפים או סשנים של צפייה משותפת הרס לנו את ביצועי מסד הנתונים. ניסינו להשתמש ב-SQLite עם recursive joins. זה עבד עבור hop אחד. בשני hops, הנתונים התפוצצו. שאילתה אחת יצרה מאות אלפי שורות. ה-workers שלנו התחילו לקבל timeout.
הנתונים הם גרף. ניסינו לכפות אותם לתוך טבלאות ושילמנו את המחיר.
העברנו את שכבת הקשרים ל-Apache AGE. זהו extension של openCypher עבור PostgreSQL. שמרנו על אפליקציית ה-PHP 8.4 שלנו ועל מאגר ה-SQLite שלנו.
התוצאות: • השהיית (latency) הפאנל הקשור ירדה מ-900ms לפחות מ-40ms. • מעברים (traversals) מורכבים של שני hops לוקחים כעת מילישניות בודדות. • עומס העבודה התפעולי שלנו נשאר זהה מכיוון ש-AGE רץ בתוך Postgres.
למה להשתמש ב-Apache AGE במקום במסד נתונים גרפי עצמאי?
פשטות תפעולית אין צורך במסד נתונים חדש לגיבוי או לאבטחה. AGE משתמש בהגדרות ה-Postgres הקיימות שלך, ב-connection pools ובכללי האבטחה שלך.
שאילתות גרף טבעיות (Native) ב-SQL, נתיבים באורך משתנה דורשים recursion מורכב. ב-Cypher, כותבים אותם כדפוסים (patterns) פשוטים. בלוק SQL רקורסיבי של 40 שורות הפך לשאילתת Cypher של 6 שורות.
ביצועים טובים יותר מנוע גרף מאנדקס סמיכות (adjacency). הוא מפסיק להרחיב נתיבים שאינם תואמים. זה מונע את ה-data fan-out שגרם לקריסה של המערכת הקודמת שלנו.
לקח מרכזי מההגירה שלנו: תמיד תאנדקסו את מאפייני נקודת הכניסה (entrypoint properties) שלכם. אם לא תאנדקסו את ה-ID שבו אתם משתמשים כדי להתחיל traversal, AGE יבצע full scan. זה הופך אפילו את שאילתת הגרף הטובה ביותר לאיטית.
אנחנו משתמשים בגרף כמודל קריאה (read model). הנתונים הגולמיים שלנו נשארים ב-SQLite. אנחנו משתמשים בסקריפט Python כדי לסנכרן בין השניים. זה שומר על הגרף שלנו מהיר, קל וקל לשחזור.
אם שאילתות ה-SQL הרקורסיביות שלכם הופכות למורכבות מדי, אל תילחמו במודל היחסים (relational model). בנו graph projection קטן לצד המאגר הנוכחי שלכם.
