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 สะพานในเมือง โดยไม่ข้ามสะพานเดิมซ้ำกันเลย?”

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

Euler พบว่าจาก nodes + edges ที่เค้าวาดขึ้นมา เราไม่สามารถเดินข้ามสะพานในเมืองโดยไม่ข้ามซ้ำกันเลย i.e. ยังไงต้องมีการข้ามสะพานซ้ำอย่างน้อยหนึ่งครั้งเสมอ (no solution)
แต่ความพยายามของ Euler ไม่เสียเปล่า เพราะสิ่งนี้คือพื้นฐานสำคัญของ Graph Theory ที่เราใช้กันอยู่ในปัจจุบัน (ขอบคุณ Euler, you rock!)
Graph Elements
Graph ประกอบด้วยสองส่วนสำคัญคือ
- Nodes (หรือ Vertices) => วัตถุ สิ่งของ หรือ objects ต่างๆในโลกความจริง เช่น person, product, event, book, movies เป็นต้น
- Relationships (หรือ Edges) => ความสัมพันธ์ระหว่าง objects ที่เราสร้างขึ้นมา
ในรูปด้านล่างเรามีทั้งหมด 5 nodes: [person, company, product] และมีเส้น relationships ทั้งหมด 4 เส้น (ยังไม่ต้องสนใจเส้นประนะครับ – – -) 😝

สังเกตที่ 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+)

Technical Note – ใน graph database เราสามารถใช้ค่า weight ในการทำนายว่า information จะส่งผ่าน graph networks ได้ไกลแค่ไหนด้วย (information spread)
Graph Traversal
Computer scientists หาคำตอบต่างๆในกราฟด้วยการ “Traversing the graph” ตัวอย่างเข่น จงหาระยะทางที่สั้นที่สุดในการเดินทางจากกรุงเทพไปโซล [shortest path]

ตัวอย่าง 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

ใน 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
Great article. Thank you very much krub. 😊
Thank you kub K’Mac. Hope you enjoy na kub 🙂
กำลังหาข้อมูล อ่านเข้าใจง่ายดีค่ะ ขอบคุณค่ะ
กำลังหาข้อมูล อ่านเข้าใจง่ายค่ะ ขอบคุณค่ะ