מבוא לנתוני האביב Neo4j

1. סקירה כללית

מאמר זה הוא מבוא ל- Spring Data Neo4j, מאגר הגרפים הפופולרי.

Spring Data Neo4j מאפשר פיתוח מבוסס POJO עבור מסד הנתונים הגרפי Neo4j ומשתמש במושגי Spring מוכרים כגון שיעורי תבנית לשימוש בסיסי ב- API ומספק מודל תכנות מבוסס ביאור.

כמו כן, הרבה מפתחים לא ממש יודעים אם Neo4j אכן יתאים לצרכים הספציפיים שלהם; הנה סקירה מוצקה על Stackoverflow הדנה מדוע להשתמש ב- Neo4j והיתרונות והחסרונות.

2. תלות Maven

נתחיל בהכרזה על תלות Spring Data Neo4j ב pom.xml. מודולי האביב המוזכרים להלן נדרשים גם עבור Spring Data Neo4j:

 org.springframework.data spring-data-neo4j 5.0.1.RELEASE org.neo4j neo4j-ogm-test 3.1.2 test 

תלות זו כוללת גם את המודולים הנדרשים לבדיקה.

שימו לב שהתלות האחרונה מוגדרת כ'בדיקה '. אך שימו לב גם שבפיתוח יישומים בעולם האמיתי, יש סיכוי גבוה יותר ששרת Neo4J מלא יפעל.

אם אנו רוצים להשתמש בשרת המשובץ, עלינו להוסיף את התלות:

 org.neo4j neo4j-ogm-embedded-driver 3.1.2 

תלות האביב-נתונים-neo4j, neo4j-ogm-test ו- neo4j-ogm-embedded-driver-dependences זמינים ב- Maven Central.

3. תצורת Neo4Jj

תצורת ה- Neo4j היא מאוד קדימה ומגדירה את הגדרת החיבור ליישום להתחברות לשרת. בדומה לרוב המודולים האחרים של נתוני קפיץ, זוהי תצורת קפיץ שניתן להגדיר כצורת XML או Java.

במדריך זה נשתמש בתצורה מבוססת Java בלבד:

סופי ציבורי סטטי ציבורי URL = System.getenv ("NEO4J_URL")! = null? System.getenv ("NEO4J_URL"): "// neo4j: [דוא"ל מוגן]: 7474"; @Bean org org.neo4j.ogm.config.Configuration תצורה getConfiguration () {להחזיר Builder חדש (). Uri (URL) .build (); } @Bean SessionFactory ציבורי getSessionFactory () {להחזיר SessionFactory חדש (getConfiguration (), "com.baeldung.spring.data.neo4j.domain"); } @Bean Neo4jTransactionManager publicManager () {להחזיר Neo4jTransactionManager חדש (getSessionFactory ()); }

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

Neo4j יסיק את מחלקת הנהגים בהתבסס על הפרוטוקול של ה- URI, במקרה שלנו "http".

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

4. מאגרי Neo4j

בהתאמה למסגרת Spring Data, Neo4j תומך בהתנהגות הפשטה של ​​מאגרי Data. כלומר גישה למנגנון המתמשך הבסיסי מופשט במובנה מאגר Neo4j כאשר פרויקט יכול להרחיב אותו ישירות ולהשתמש בפעולות הניתנות מחוץ לקופסה.

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

4.1. יצירת מאגר סרטים & מאגר אישי

אנו משתמשים בשני מאגרים במדריך זה לצורך התמדה בנתונים:

ממשק ציבורי @Repository MovieRepository מרחיב את Neo4jRepository {Movie findByTitle (@Param ("title") כותרת מחרוזת); @Query ("MATCH (m: Movie) WHERE m.title = ~ ('(? I). *' + {Title} + '. *') RETURN m") אוסף findByTitleContaining (@Param ("כותרת") מחרוזת כותרת); @Query ("MATCH (m: Movie) <- [: ACTED_IN] - (a: Person) RETURN m.title as movie, Collect (a.name) as cast LIMIT {limit}") List גרף (@Param ("הגבלה") מגבלת int); } 

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

הבא יש לנו את הפשוט יותר מאגר אישי, שיש לו רק את הפעולות הסטנדרטיות:

ממשק ציבורי @ מאגר PersonRepository מרחיב את Neo4jRepository {//}

אולי כבר שמת לב לזה מאגר אישי הוא רק ממשק ה- Spring Data הסטנדרטי. הסיבה לכך היא, שבדוגמה הפשוטה הזו, כמעט מספיק להשתמש בפעולות המובנות בעצם כיוון שמערכת הפעולה שלנו קשורה ל סרט יֵשׁוּת. עם זאת אתה תמיד יכול להוסיף כאן פעולות מותאמות אישית שעשויות לעטוף פעולות מובנות בודדות / מרובות.

4.2. הגדרת תצורה של Neo4jמאגרים

כצעד הבא, עלינו להודיע ​​לאביב את המאגר הרלוונטי המציין זאת ב- Neo4j תצורה הכיתה שנוצרה בסעיף 3:

@Configuration @ComponentScan ("com.baeldung.spring.data.neo4j") @ EnableNeo4jRepositories (basePackages = "com.baeldung.spring.data.neo4j.repository") מחלקה ציבורית MovieDatabaseNeo4jConfiguration {//}

5. מודל הנתונים המלא

התחלנו כבר להסתכל על מודל הנתונים, אז בואו נניח הכל - המלא סרט, תפקיד ו אדם. ה אדם ישות מפנה את סרט ישות דרך תַפְקִיד מערכת יחסים.

סרט בכיתה ציבורית @NodeEntity {@Id @GeneratedValue מזהה ארוך; כותרת מחרוזת פרטית; פרטי שוחרר; שורת מחרוזת פרטית; @Relationship (type = "ACTED_IN", direction = Relationship.INCOMING) תפקידי רשימה פרטית; // קונסטרוקטור סטנדרטי, גטרים וקובעים}

שימו לב איך הערנו סרט עם @NodeEntity כדי לציין כי מחלקה זו ממופה ישירות לצומת ב- Neo4j.

@JsonIdentityInfo (מחולל = JSOGGenerator.class) @NodeEntity אדם בכיתה ציבורית {@Id @GeneratedValue מזהה ארוך; שם מחרוזת פרטי; פרטי נולד; @Relationship (type = "ACTED_IN") סרטי רשימה פרטיים; // קונסטרוקטור, סטרים וקובעים סטנדרטיים} @JsonIdentityInfo (מחולל = JSOGGenerator.class) @RelationshipEntity (type = "ACTED_IN") תפקיד בכיתה ציבורית {@Id @GeneratedValue מזהה ארוך; תפקידי אוסף פרטי; אדם אדם פרטי @StartNode; סרט סרט פרטי @EndNode; // קונסטרוקטור סטנדרטי, גטרים וקובעים}

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

6. גישה לנתונים באמצעות MovieRepository

6.1. שמירת אובייקט סרט חדש

בואו נשמור נתונים - ראשית, סרט חדש, אחר כך אדם וכמובן תפקיד - כולל גם את כל נתוני הקשר שיש לנו:

סרט italianJob = סרט חדש (); italianJob.setTitle ("המשרה האיטלקית"); italianJob.setReleased (1999); movieRepository.save (italianJob); סימן אדם = אדם חדש (); mark.setName ("מארק וולברג"); personRepository.save (סימן); תפקיד שרלי = תפקיד חדש (); charlie.setMovie (ג'וב איטלקי); charlie.setPerson (סימן); אוסף roleNames = HashSet חדש (); roleNames.add ("צ'רלי קרוקר"); charlie.setRoles (roleNames); תפקידי רשימה = ArrayList חדש (); תפקידים.תוסיפו (שרלי); italianJob.setRoles (תפקידים); movieRepository.save (italianJob);

6.2. אחזור אובייקט סרט קיים לפי כותרת

בואו נוודא את הסרט שהוכנס על ידי אחזורו באמצעות הכותרת המוגדרת שהיא פעולה מותאמת אישית:

תוצאת הסרט = movieRepository.findByTitle (כותרת);

6.3. אחזור אובייקט סרט קיים לפי חלק מהכותרת

אפשר לחפש לחיפוש בסרט קיים באמצעות חלק מהכותרת:

תוצאת האוסף = movieRepository.findByTitleContaining ("איטלקית");

6.4. מאחזר את כל הסרטים

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

תוצאת האוסף = (Collection) movieRepository.findAll ();

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

6.5. ספרו את חפצי הסרט הקיימים

לאחר הכנסת מספר אובייקטים לסרט, אנו יכולים לקבל ספירת סרטים יוצאת מהכלל:

סרט movieCount ארוך = movieRepository.count ();

6.6. מחיקת סרט קיים

movieRepository.delete (movieRepository.findByTitle ("העבודה האיטלקית"));

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

assertNull (movieRepository.findByTitle ("העבודה האיטלקית"));

6.7. מחק את כל הנתונים שהוכנסו

ניתן למחוק את כל האלמנטים במסד הנתונים מה שהופך את מסד הנתונים לריק:

movieRepository.deleteAll ();

התוצאה של פעולה זו מסירה במהירות את כל הנתונים מטבלה.

7. מסקנה

במדריך זה עברנו את היסודות של Spring Data Neo4j תוך שימוש בדוגמה מאוד פשוטה.

עם זאת Neo4j מסוגל לספק מענה ליישומים מתקדמים ומורכבים מאוד עם מערכת ענק של קשרים ורשתות. ו- Spring Data Neo4j מציע גם תכונות מתקדמות למיפוי כיתות ישויות המאושרות למסד הנתונים הגרפי Neo4j.

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


$config[zx-auto] not found$config[zx-overlay] not found