อัพเดทล่าสุด

NoSQL Graph Database สำหรับผู้เริ่มต้น

Kasidis Satangmongkol Notion

By:

Posted in:

NoSQL databases คือหนึ่งใน core skills ของ future data analyst ถ้าเราสามารถทำงานกับ NoSQL ได้ด้วย จะสามารถวิเคราะห์ข้อมูลได้หลากหลายรูปแบบมากขึ้น

บทความนี้สรุปเนื้อหาบางส่วนจากคอร์ส Graph Fundamentals ของ Neo4j academy สำหรับเพื่อนๆที่สนใจเรื่อง NoSQL คอร์สนี้ไม่ควรพลาดเลย (เรียนฟรีด้วย)

📑 Neo4j คือ Native Graph Databases ที่ได้รับความนิยมอันดับต้นๆ รองลงมาคือ Arango DB, AWS Neptune, Gremlin API + Azure Cosmos DB เป็นต้น

Table of Contents

The Seven Bridges

ในปี 1736 ที่เมือง Königsberg, Prussia (หรือ Russia ในปัจจุบัน) นักคณิตศาสตร์ชาวสวิตเซอร์แลนด์ชื่อ Leonhard Euler ตั้งคำถามในใจว่า “มันเป็นไปได้หรือเปล่าที่เราจะเดินข้าม 7 สะพานในเมือง โดยไม่ข้ามสะพานเดิมซ้ำกันเลย?”

Leonhard Euler (1707-1783)

Euler ค้นพบว่าสะพานที่เชื่อมส่วนต่างๆของเมืองเป็นสิ่งสำคัญที่สุดในการแก้ปัญหานี้ เขาจึงพยายามแก้ปัญหานี้แบบ abstract โดยวาดเป็นรูป nodes แทนที่ดินในเมือง (land masses) และ edges เพื่อแทนสะพาน (bridges)

Leonhard Euler และสะพานทั้ง 7

Euler พบว่าจาก nodes + edges ที่เค้าวาดขึ้นมา เราไม่สามารถเดินข้ามสะพานในเมืองโดยไม่ข้ามซ้ำกันเลย i.e. ยังไงต้องมีการข้ามสะพานซ้ำอย่างน้อยหนึ่งครั้งเสมอ (no solution)

แต่ความพยายามของ Euler ไม่เสียเปล่า เพราะสิ่งนี้คือพื้นฐานสำคัญของ Graph Theory ที่เราใช้กันอยู่ในปัจจุบัน (ขอบคุณ Euler, you rock!)

Graph Elements

Graph ประกอบด้วยสองส่วนสำคัญคือ

  1. Nodes (หรือ Vertices) => วัตถุ สิ่งของ หรือ objects ต่างๆในโลกความจริง เช่น person, product, event, book, movies เป็นต้น
  2. Relationships (หรือ Edges) => ความสัมพันธ์ระหว่าง objects ที่เราสร้างขึ้นมา

ในรูปด้านล่างเรามีทั้งหมด 5 nodes: [person, company, product] และมีเส้น relationships ทั้งหมด 4 เส้น (ยังไม่ต้องสนใจเส้นประนะครับ – – -) 😝

ตัวอย่าง nodes และ edges ใน graph
ตัวอย่าง nodes และ edges ใน graph

สังเกตที่ relationships สามารถมีทิศทางบอกได้ด้วย (directed graph) เช่น ->, <- หรือจะเป็นแบบ bidirectional ก็ได้ เช่น ความสัมพันธ์ [:MARRIED_TO] ระหว่าง Anna และ David

  • Anna -[:WORKS_AT]-> Apple
  • Euler -[:WORKS_AT]-> Apple
  • Apple -[:PRODUCES]-> iPhone
  • David -[:MARRIED_TO]- Anna

📑 เส้นประ – – – ระหว่าง Anna กับ Euler เป็นเหมือน implied relationship เพราะว่าทั้งสองคนทำงาน [:WORKS_AT] Apple เหมือนกัน ทั้งสองคนอาจจะรู้จักก็ได้?

อีกคอนเซ็ปต์ที่สำคัญของ graph คือ weighted vs. unweighted graphs ในรูปด้านล่างเราวาด directed graph โดยเส้นความสัมพันธ์ [:LOVES] มีค่า weight ชื่อว่า strength เพื่อ

เป็นแฟนกัน ไม่จำเป็นที่ความรักของเราต้องเท่ากัน 😭 (ทำไมน้ำตาไหล ยั๊งงง 555+)

Directed + Weighted graph
ตัวอย่าง directed + weighted graph

Technical Note – ใน graph database เราสามารถใช้ค่า weight ในการทำนายว่า information จะส่งผ่าน graph networks ได้ไกลแค่ไหนด้วย (information spread)

Graph Traversal

Computer scientists หาคำตอบต่างๆในกราฟด้วยการ “Traversing the graph” ตัวอย่างเข่น จงหาระยะทางที่สั้นที่สุดในการเดินทางจากกรุงเทพไปโซล [shortest path]

Graph network ของทั้ง 5 เมือง

ตัวอย่าง paths ที่เราเลือก traverse ได้ เราจะเลือก path ที่สั้นที่สุด (minimum distance)

  • Bangkok -> Osaka -> London -> Seoul [32]
  • Bangkok -> Osaka -> Tokyo -> Seoul [28]
  • Bangkok -> London -> Seoul [32]

นอกจากค่า weights ในกราฟ เรายังสามารถเพิ่ม label และ property อื่นๆได้ด้วยเพื่อสร้าง context ให้กับกราฟของเรา Neo4j เรียกคอนเซ็ปต์นี้ว่า Property Graph

Graph property in Neo4j full size
ตัวอย่างของ labels และ property (key-value pairs)

ใน Neo4j ทุกความสัมพันธ์ต้องมี direction เสมอ (required) เช่น [:MARRIED_TO] ระหว่าง David กับ Anna แต่เราสามารถเขียน query เพื่อดึงข้อมูลได้จากทั้งสองฝั่งเลย

Query language ที่ออกแบบมาสำหรับ Neo4j เรียกว่า Cypher หรือ CQL เรียกว่าเป็น SQL ของ graph databases ก็ได้ ตัวอย่าง query ที่ดึงชื่อภรรยาของ David เขียนได้แบบนี้

// traverse the David node to return the Anna node
MATCH
  (p:Person {firstname: 'David'})-[:MARRIED_TO]-(n) 
RETURN n;

จุดเด่นของ graph databases เปรียบเทียบกับ relational databases (RDBMS) คือ fewer index lookups, no table scans, reduced duplication of data ทำให้การค้นหาข้อมูลใน graph สามารถทำได้เร็วมาก => อ่านเพิ่มเติมเรื่อง index-free adjacency

Graph Academy

สำหรับเพื่อนๆที่อยากศึกษา Graph databases สามารถสมัครเรียนฟรีได้ที่ Neo4j Graph Academy มีคอร์สเรียนน่าสนใจหลายวิชา เรียนจบสามารถสอบ certifications ได้ด้วย

ตัวอย่างคอร์สของ Neo4j แอดว่า CQL สนุกมาก ตอนเรียนครั้งแรกงงมากเช่นกัน 555+

  • Neo4j fundamentals
  • Cypher fundamentals (CQL เป็น query language ในการดึงข้อมูล graph databases)
  • Graph data modeling fundamentals
  • Importing CSV data into Neo4j

Key Takeaway

  • Leonhard Euler เป็นผู้คิดค้น Graph Theory ในปี 1736
  • Graph theory ถูกนำมาใช้แก้ complex problems หลายอย่าง เช่น root finding, real-time recommendations, supply chain analytics เป็นต้น
  • เราใช้ Graph database เวลาที่อยากจะโมเดลความสัมพันธ์ของเรื่องต่างๆ
  • Nodes และ Relationships สามารถมี property เพื่อใส่ context ให้กับข้อมูลของเราได้ด้วย (Neo4j เรียกคอนเซ็ปต์นี้ว่า property graph)
  • Graph algorithms สามารถ traverse (เดินทางตาม edges) เพื่อหาข้อมูลที่เราต้องการได้เร็วมากๆ ตัวอย่างเช่น Shortest Path หรือ Dijkstra’s A*

Reference – What is a graph database? by Neo4j

2 responses to “NoSQL Graph Database สำหรับผู้เริ่มต้น”

  1. Mac Avatar

    Great article. Thank you very much krub. 😊

    1. Kasidis Satangmongkol Avatar

      Thank you kub K’Mac. Hope you enjoy na kub 🙂

Leave a Reply