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

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

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 สำหรับผู้เริ่มต้น”

Leave a Reply