מדריך ל- Neo4J עם Java

1. הקדמה

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

2. מוטבע Neo4j

הדרך הקלה ביותר להתחיל איתה Neo4j היא להשתמש בגרסה המוטמעת שבה Neo4j פועל באותו JVM כמו היישום שלך.

ראשית, עלינו להוסיף תלות ב- Maven:

 org.neo4j neo4j 3.4.6 

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

לאחר מכן, בואו ניצור מפעל:

GraphDatabaseFactory graphDbFactory = GraphDatabaseFactory חדש ();

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

GraphDatabaseService graphDb = graphDbFactory.newEmbeddedDatabase (קובץ חדש ("נתונים / מכוניות"));

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

graphDb.beginTx ();

ברגע שתהיה לנו עסקה, נוכל להתחיל להוסיף צמתים:

צומת רכב = graphDb.createNode (Label.label ("רכב")); car.setProperty ("make", "טסלה"); car.setProperty ("דגם", "דגם 3"); בעל הצומת = graphDb.createNode (Label.label ("אדם")); owner.setProperty ("firstName", "baeldung"); owner.setProperty ("lastName", "baeldung");

כאן הוספנו צומת אוטו עם נכסים עשה ו דֶגֶם כמו גם צומת אדם עם נכסים שם פרטי ו שם משפחה

כעת אנו יכולים להוסיף מערכת יחסים:

owner.createRelationshipTo (רכב, RelationshipType.withName ("בעלים"));

ההצהרה לעיל הוסיפה קצה המצטרף לשני הצמתים באמצעות בעלים תווית. אנו יכולים לאמת קשר זה על ידי הפעלת שאילתה שנכתבה ב Neo4j של חָזָק סייפר שפה:

תוצאת התוצאה = graphDb.execute ("MATCH (c: Car) <- [owner] - (p: Person)" + "WHERE c.make = 'tesla'" + "RETURN p.firstName, p.lastName");

כאן אנו מבקשים למצוא בעל רכב לכל מכונית שתוצרתה היא טסלה ולהחזיר לנו את שם פרטי / שם משפחה. באופן לא מפתיע, זה מחזיר: {p.firstName = baeldung, p.lastName = baeldung}

3. שפת שאילתת סייפר

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

3.1. צור צומת

ניתן להשתמש במילת מפתח ליצור כדי ליצור גם צמתים וגם קשרים.

ליצור (עצמי: חברה {שם: "באלדונג"}) להחזיר את עצמי

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

3.2. צור קשר

אפשר ליצור צומת וקשר לצומת זה בשאילתה אחת:

תוצאת התוצאה = graphDb.execute ("CREATE (baeldung: Company {name: \" Baeldung \ "})" + "- [: owns] -> (tesla: Car {make: 'tesla', model: 'modelX'} ) "+" חזרה באלדונג, טסלה ");

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

3.3. שחזר מידע

התאמה מילת המפתח משמשת למציאת נתונים בשילוב עם לַחֲזוֹר כדי לקבוע אילו נקודות נתונים מוחזרות. ה איפה ניתן להשתמש בסעיף כדי לסנן רק את הצמתים בעלי התכונות הרצויות לנו.

בואו נבין את שם החברה שבבעלותה דגם טסלה X:

תוצאת תוצאה = graphDb.execute ("MATCH (חברה: חברה) - [: בעלים] -> (רכב: רכב)" + "WHERE car.make = 'tesla' ו- car.model = 'modelX'" + "חברת RETURN .שֵׁם");

3.4. עדכן צמתים

מַעֲרֶכֶת ניתן להשתמש במילת המפתח לצורך עדכון מאפייני הצומת או תוויות. בואו נוסיף קילומטראז לטסלה שלנו:

תוצאת התוצאה = graphDb.execute ("MATCH (car: Car)" + "WHERE car.make = 'tesla'" + "SET car.milage = 120" + "SET car: Car: Electro" + "SET car.model = NULL "+" רכב חזור ");

כאן אנו מוסיפים נכס חדש שנקרא מילאז ', שנה תוויות כך שיהיו שניהם אוטו ו חַשׁמַלִי ולבסוף, אנחנו מוחקים דֶגֶם רכוש לגמרי.

3.5. מחק צמתים

ניתן להשתמש במילת מפתח DELETE להסרה קבועה של צמתים או קשרים מהתרשים:

graphDb.execute ("MATCH (חברה: חברה)" + "WHERE company.name = 'Baeldung'" + "DELETE company");

כאן מחקנו חברה בשם Baeldung.

3.6. כריכת פרמטר

בדוגמאות שלעיל יש לנו ערכי פרמטרים מקודדים שאינם השיטה הטובה ביותר. לְמַרְבֶּה הַמַזָל, Neo4j מספק מתקן לאיחוד משתנים לשאילתה:

Params מפה = HashMap חדש (); params.put ("שם", "באלדונג"); params.put ("make", "tesla"); params.put ("model", "modelS"); תוצאת התוצאה = graphDb.execute ("CREATE (baeldung: Company {name: $ name})" + "- [: own] -> (טסלה: Car {make: $ make, model: $ model})" + "RETURN baeldung, טסלה ", params);

4. מנהל התקן Java

עד כה בדקנו אינטראקציה עם מוטבע Neo4j אולם, ככל הנראה לייצור, נרצה להפעיל שרת עצמאי ולהתחבר אליו באמצעות מנהל התקן מסופק. ראשית, עלינו להוסיף תלות נוספת במאבן שלנו pom.xml:

 org.neo4j.driver neo4j-java-driver 1.6.2 

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

כעת נוכל ליצור קשר:

מנהל התקן נהג = GraphDatabase.driver ("bolt: // localhost: 7687", AuthTokens.basic ("neo4j", "12345"));

לאחר מכן, צור מושב:

מושב מושב = driver.session ();

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

session.run ("CREATE (baeldung: Company {name: \" Baeldung \ "})" + "- [: owns] -> (tesla: Car {make: 'tesla', model: 'modelX'})" + "חזרה באלדונג, טסלה");

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

session.close (); driver.close ();

5. מנהל התקן JDBC

אפשר גם לקיים אינטראקציה עם Neo4j באמצעות נהג JDBC. תלות נוספת עבורנו pom.xml:

 org.neo4j neo4j-jdbc-driver 3.4.0 

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

לאחר מכן, בואו ליצור חיבור JDBC:

חיבור con = DriverManager.getConnection ("jdbc: neo4j: bolt: // localhost /? User = neo4j, password = 12345, scheme = basic");

פה con הוא חיבור JDBC רגיל שיכול לשמש ליצירה וביצוע הצהרות או הצהרות מוכנות:

נסה (הצהרה stmt = con. stmt.execute ("CREATE (baeldung: Company {name: \" Baeldung \ "})" + "- [: own] -> (tesla: Car {make: 'tesla', model: 'modelX'}) "+" RETURN baeldung, tesla ") ResultSet rs = stmt.executeQuery (" MATCH (חברה: חברה) - [: בעלים] -> (רכב: רכב) "+" WHERE car.make = 'טסלה 'ו- car.model =' modelX '"+" RETURN company.name "); while (rs.next ()) {rs.getString (" company.name ");}}

6. מיפוי אובייקטים-גרפים

מיפוי-גרפים או OGM היא טכניקה המאפשרת לנו להשתמש ב- POJOs בתחום כישויות בתחום Neo4j מאגר מידע. הבה נבחן כיצד זה עובד. השלב הראשון, כרגיל, אנו מוסיפים תלות חדשות שלנו pom.xml:

 org.neo4j neo4j-ogm-core 3.1.2 org.neo4j neo4j-ogm-embedded-driver 3.1.2 

אתה יכול לבדוק את קישור הליבה של OGM ואת קישור הנהג המשובץ של OGM כדי לחפש את הגרסאות העדכניות ביותר של ספריות אלה.

שנית, אנו מציינים את ה- POJO שלנו בהערות OGM:

@NodeEntity חברה בכיתה ציבורית {פרטי מזהה ארוך; שם מחרוזת פרטי; @ Relationship (type = "own") רכב פרטי לרכב; } @NodeEntity רכב בכיתה ציבורית {פרטי מזהה ארוך; פרטי מיתרים פרטיים; @ Relationship (direction = "INCOMING") חברה פרטית של חברה; }

@NodeEntity מודיע Neo4j שאובייקט זה יצטרך להיות מיוצג על ידי צומת בגרף המתקבל. @מערכת יחסים מתקשר לצורך ליצור קשר עם צומת המייצג את הסוג הקשור. במקרה זה, א חֶברָה בעלים של אוטו.

שים לב ש Neo4j דורש מכל ישות מפתח ראשי, עם שדה בשם תְעוּדַת זֶהוּת נאספים כברירת מחדל. ניתן להשתמש בשדה בשם חלופי על ידי הערה עליו @ Id @ GeneratedValue.

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

תצורת conf = תצורה חדשה Configuration.Builder (). Build ();

לאחר מכן אנו מאותחלים SessionFactory עם התצורה שיצרנו ושם חבילה שבו POJO המבואר שלנו שוכנים:

מפעל SessionFactory = SessionFactory חדש (conf, "com.baeldung.graph");

לבסוף, אנו יכולים ליצור מוֹשָׁב והתחל להשתמש בו:

מושב מושב = factory.openSession (); טסלה לרכב = רכב חדש ("טסלה", "דגם S"); חברת ביילדונג = חברה חדשה ("ביילדונג"); baeldung.setCar (טסלה); session.save (baeldung);

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

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

7. מסקנה

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

כמו תמיד, הקוד ברישום זה זמין ב- Github.


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