• בלוג
  • פשוט כי ככה ראיתי בדוגמה

פשוט כי ככה ראיתי בדוגמה

11/10/2023

אז אני לומד עכשיו גרמלין ואחד הדברים הבולטים בתהליך הוא היחס לכיוון הקשתות. אתם מבינים בבסיס נתונים גרפי יש לנו צמתים וקשתות, הצמתים שומרים מידע והקשתות מחברות בין הצמתים ומגדירות את היחסים (בעיקרון גם על קשתות אפשר לשמור מידע, אבל נשאיר את זה רגע בצד). אז בדוגמה של בלוג יהיה לנו צומת שמייצג פוסט, צומת שמייצג קטגוריה וקשת ביניהם כדי להגיד שפוסט שייך לקטגוריה מסוימת. ברשת חברתית יהיה לנו צומת לכל משתמש וקשת שמחברת בין משתמשים שהם חברים. עד פה קל.

העניין עם בסיסי נתונים גרפיים הוא שלקשתות שם יש כיוון. כלומר אנחנו צריכים לבחור האם הקשת יוצאת מהבלוג לקטגוריה או מהקטגוריה לבלוג. רוב הזמן המידע הזה לא חשוב כי תהיה לנו רק קשת אחת בין שני צמתים וממילא בגלל אינדקסים בגרף אין בעיה לטייל על קשתות בשני הכיוונים. כלומר בדוגמה של הבלוג והקטגוריה זה לא משנה מאיפה תצא הקשת ולאן, בכל מקרה אפשר יהיה להסתכל על קטגוריה ולקחת את כל הפוסטים שלה, או להסתכל על פוסט ולקחת את כל הקטגוריות להן הוא שייך.

כל שפת שאילתות לגרפים מאפשרת לציין את כיוון הקשת או להשמיט אותו. אז בסייפר יהיה לי:

MATCH (tom:Person {name:'Tom Hanks'})-[rel:DIRECTED]-(movie:Movie)
RETURN tom.name, tom.born, movie.title, movie.released

כדי להחזיר את כל הסרטים בהם שיחק טום הנקס בלי להתחייב על כיוון הקשת DIRECTED, או את:

MATCH (:Person {name: 'Tom Hanks'})-[:DIRECTED]->(movie:Movie)
RETURN movie.title

שתופסת רק את הסרטים כשכיוון הקשת הוא מהשחקן לסרט. בגרמלין אם יש לי בגרף צומת מסוג person בשם marko וממנו יוצאת קשת בשם created לצומת שמייצג פרויקט שמרקו יצר אז השאילתה:

g.V().has('person','name','marko').out('created')

תחזיר את הפרויקט בהנחה שכיוון הקשת הוא מהיוצר אל הפרויקט, והשאילתה:

g.V().has('person','name','marko').both('created')

תחזיר את הפרויקט בלי להתחייב על כיוון הקשת.

ותוך כדי שאני לומד גרמלין פתאום שמתי לב שבגרמלין אני משתמש בכתיב שמתחייב על כיוון הקשת, אבל בסייפר אני מעדיף את הכתיב שלא מתחייב על כיוון הקשת. זאת אפילו שאני כותב שאילתות לאותו בסיס נתונים (כן הרבה בסיסי נתונים גרפיים יודעים לדבר בשתי השפות).

מאיפה נולדה ההעדפה הזאת? במקרה שלי המקור הוא הדוגמאות ברשת וחומרי הלימוד של שתי השפות. רוב הדוגמאות של סייפר מגיעות עם הכתיב הדו-כיווני והדוגמאות של גרמלין בדרך כלל יגדירו את כיוון הקשת.

אז נכון מצד אחד כשלומדים שפה חדשה כדאי לשים לב לסטנדרטים של קידוד וצורת העבודה המומלצת ולהשתמש בכתיב כמה שיותר דומה לדוגמאות כדי שיהיה לאנשים אחרים קל להבין אותנו ולנו קל להבין קוד של אחרים, אבל באותה נשימה חשוב לשים לב איפה הסמנטיקה החדשה שונה מדברים שאולי עזרו לנו בשפות אחרות, ולבחור את שיטות העבודה שלנו בצורה מודעת ולפי צרכי הפרויקט, ולא רק לפי מה שדומה למה שראיתי בדוגמה.