จากที่ได้ลองศึกษา และทำความเข้าใจกับ เทคโนโลยีนี้มาหลายบทความพอสมควร
ผู้เขียนก็ได้อ่านและรวบรวมข้อมูลแปลแล้วสรุป ผิดบ้างถูกบ้างก็ถูๆไถกันไป
จากนั้นก็นำมาเล่าให้อ่านกันเพื่อเป็นประโยชน์แก่ผู้ที่สนใจเรื่อยๆ
สามารถเข้าไปอ่านเต็มๆได้ที่ http://neo4j.com/developer/guide-data-modeling/
ในบทความนี้ลองมาทบทวน ให้เข้าใจมากขึ้นกับการประยุกษ์ใช้ Cypher
ให้มากขึ้นอีกสักนิดนึงกับทฤษฎีเล็กๆน้อยๆกันสักหน่อย
หลังจากที่ได้ทำความรู้จัก กับ Cypher พื้นฐานกันไปแล้ว พอจะเห็นได้จากการปฎิบัติกับคำสั่งเบื้องต้นกันไปแล้วนะครับ
ลองมาพิจารณา กับประโยคด้านล่าง
Two people, John and Sally, are friends. Both John and Sally have read the book,Graph Databases.
เราสามารถจับเอาประโยคดังกล่าว มาแปลงเป็นส่วนประกอบต่างๆใน Graph Database อย่างไรได้บ้างกันครับ
มาทบทวนกันหน่อย
Node
หน่วยที่เป็นพื้นฐานที่สุดของ Graph จริงๆแล้ว คือ Node และ Relationship
ใน Neo4j ทั้งสองอย่างที่ได้กล่าวไป สามารถมี Properties เป็นของตัวเอง
Node บ่อยครั้งมักจะแทน Entity แต่ขึ้นอยู่กับ Ralationship
ส่วนที่แยกออกมาจาก Properties คือ Label
Node สามารถ มี Label หลาย Label หรือไม่มีก็ได้ ดังภาพด้านล่าง
เราสามารถระบุ Node เป็น Entity โดยการดึง concept ที่ได้กล่าวไว้ ดังนั้นในกรณีนี้สามารถระบุได้ว่า
Node
- John
- Sally
- Graph Databases
Label
เป็นชื่อของโครงสร้าง Graph ก็คือเป็นกลุ่ม Node ที่อยู่ใน Set เดียวกัน
ทุก node ที่ถูกตั้งชื่อ Node เหมือนกันจะ เป็น Node ที่อยู่ใน St ที่เหมือนกัน
ในการ Query ในฐานข้อมูลที่มีจำนวนมาก สามารถทำงานร่วมกับ กลุ่ม Set แทนจำนวนโหนดทั้งหมดของ Graph ได้ ดังภาพด้านล่าง
ในขั้นแรกจะต้องระบุ กฎให้กับ Object หรือวัตถุ เสียก่อน เช่น John และ Sally และ Graph Database เรารู้อยู่แล้วว่า ในประโยคดังกล่าว มีความแตกต่างของ ชนิดอยู่คือ
- Person
- Book
เราจึงสามารถระบุ Node และ Label ได้ว่า John และ Sally เป็น Person
และ Graph Database คือ Book
Relationship
คราวนี้มาดูเรื่อง Relationship กันบ้าง
เราสามารถสร้างความสัมพันธ์ ระหว่าง Node ได้ดังนี้
- John is a friend of Sally
- Sally is a friend of John
- John has read Graph Databases
- Sally has read Graph Databases
ตอนนี้เราสามารถอธิบาย ขอบเขตของ Node กับ Label ได้แล้วสามารถเชื่อมความสัมพันธ์ ระหว่าง
Node เข้าด้วยกันได้จากประโยคดังกล่าว สามารถจับคู่ ที่ Label เป็น Person ด้วยกัน โดยคำว่า Friend of
และจับคู่ที่ไม่ใช่ กลุ่มเดียวกัน ที่ Label คือ Book กับ Person ด้วยคำว่า has Read
เราก็จะได้ Model ดังภาพด้านล่าง
หลังจากที่ได้ผ่านกระบวนการสร้าง Data Model จากพื้นฐานในเรื่อง Graph เพื่อเชื่อมระหว่าง
Person และ Book เข้าด้วยกัน หลังจากนี้ เราสามารถที่จะนำ Data model มากำหนดข้อมูล
ให้สามารถ Implement สามารถที่เราต้องการได้
แต่คำถามคือ จะทำอย่างไรถึงจะรู้ได้ละว่าจะต้องมีข้อมูลอะไรบ้าง
ไม่ยาก คำตอบก็คือ การตั้งคำถาม
โดยเริ่มตั้งคำถามจากสิ่งที่เราอยากรู้
- When did John and Sally become friends?
- What is the average rating of the book Graph Databases?
- Who is the author of the book Graph Databases?
- How old is Sally?
- How old is John?
- Who is older, Sally or John?
- Who read the book Graph Databases first, Sally or John?
เราก็จะได้ต้องข้อมูลมาใส่ได้อย่างสมบูรณ์ดังภาพด้านล่าง
จากนั้นก็นำ Cypher มาหาคำตอบที่เราต้องการ
// Create Sally CREATE (sally:Person { name: 'Sally', age: 32 }) // Create John CREATE (john:Person { name: 'John', age: 27 }) // Create Graph Databases book CREATE (gdb:Book { title: 'Graph Databases', authors: ['Ian Robinson', 'Jim Webber'] }) // Connect Sally and John as friends CREATE (sally)-[:FRIEND_OF { since: 1357718400 }]->(john) // Connect Sally to Graph Databases book CREATE (sally)-[:HAS_READ { rating: 4, on: 1360396800 }]->(gdb) // Connect John to Graph Databases book CREATE (john)-[:HAS_READ { rating: 5, on: 1359878400 }]->(gdb)
จากคำสั่งในการสร้าง Node แนะนำว่าให้สร้างพร้อมกันหรือเขียนคำสั่ง สร้าง Node และ Relationship ให้ครบก่อนจะ Execute
ก็จะได้ ความสัมพันธ์ในรูปแบบ GUI ด้านล่าง
When did John and Sally become Friends?
What is the average rating of Graph Databases?
Who are the authors of Graph Databases?
How old is Sally?
How old is John?
Who is older, Sally or John?
Who Read Graph Databases First, Sally or John?
เป็นอย่างไรกันบ้างครับ
สามารถนำไปประยุกษ์กันได้แล้วนะครับ