ก้าวแรกสู่ Neo4j และ Graph Database
ครอบคลุม Cypher: Query Language ของ Neo4j
Neo4j เป็นฐานข้อมูลแบบ NoSQL ในรูปแบบ Graph database ถ้าถามว่า Graph database คืออะไร? ก็สามารถไปอ่านมาก่อนได้ตามลิ้งข้างต้นเลยนะครับ
เริ่มต้นที่การติดตั้ง
เราสามารถไปโหลดตัว Neo4j ได้จากลิ้งนี้ Neo4j Download Center โดยเราจะเลือกโหลดตัว Community Server แล้วก็เลือกตาม OS ที่เราใช้งานอยู่ได้เลย ส่วนตัวของผู้เขียนจะใช้เป็น Linux
เมื่อโหลดเสร็จเรียบร้อยแล้ว ก็ให้เราแตกไฟล์และวางไฟล์ไว้ในตำแหน่งที่ต้องการ directory ระดับบนสุดเราจะเรียกว่า NEO4J_HOME
เปิดหน้า terminal/shell ของเราขึ้นมาเพื่อใช้ Neo4j
เปิดแบบ Console application ใช้คำสั่ง
<NEO4J_HOME>/bin/neo4j console
เปิดแบบ Backgroung process ใช้คำสั่ง
<NEO4J_HOME>/bin/neo4j start
เรียบร้อยแล้วที่นี้เราก็ลองไปเปิด http://localhost:7474/ ใน browser ของเรา แล้ว login ด้วย username neo4j
password neo4j
เปิด Neo4j บน browser
หลังจากเราเปิดเข้ามา เปลี่ยนรหัสเรียบร้อยจะได้หน้าตามรูปที่แสดงข้างล่างนี้
Cypher คืออะไร?
เราจะมาเริ่มต้นการใช้ Neo4j ด้วยการอธิบายเกี่ยวกับ Cypher ซึ่งเป็นภาษาที่ใช้สำหรับ query คุณควรมีความคุ้นเคยกับแนวคิดของ Graph database และ คุณสมบัติของ Graph model อ่านได้จาก Graph database คืออะไร?
เนื่องจาก Cypher ได้ออกแบบออกมาเพื่อให้สามารถอ่านได้โดยง่าย เราต้องลองดูข้อมูลจากกราฟข้างล่างนี้ เราจะสามารถเข้าใจมันได้ว่าอย่างไร (คำตอบเขียนไว้ใต้รูป)
คนที่ชื่อว่า Jennifer ชอบเทคโนโลยีที่เป็น Graphs เป็นเพื่อนกับ Michael ตั้งแต่ปี 2018 รวมถึง Jennifer ทำงานที่บริษัท Neo4j
รูปแบบของ Cypher จะสร้างตามโครงสร้างความคิดของมนุษย์เรา ทำให้ง่ายต่อการทำความเข้าใจ
รูปแบบของ Node ใน Cypherรวมถึง
ให้เราจำไว้ว่า Node จะเป็นเหมือน objects ที่ใช้เก็บข้อมูลของเรา เมื่ออยู่ใน database จะถูกแสดงเป็นลูกกลม ๆ
การใช้ตัวแปรกับ Node จะใช้เมื่อเราต้องการอ้างอิงถึง Node ของเราในภายหลัง สามารถให้ชื่อของ Node ได้โดยการใช้ (p)
แต่ในความเป็นจริงเราควรจะใช้ (person)
หรือ (company)
เพื่อให้เข้าใจได้ง่ายเหมือนกับการเขียนโปรแกรมภาษาอื่น ๆ หากเราไม่ต้องการค่าที่ส่งกลับมา เราอาจไม่ระบุชื่อให้กับ Node นั้น ๆ โดยใช้วงเล็บเปล่า ()
ซึ่งเราจะไม่สามารถได้รับค่าที่ส่งกลับมาได้
การติด label ให้กับ Node หากเราย้อนขึ้นไปดู Graph model จะเห็นว่า Node มีการจัดกลุ่มกันอยู่ด้วยการติด label ให้ Node นั้น ๆ การติด label จะทำให้เราสามารถระบุประเภทเพื่อค้นหาหรือสร้างได้ ตามตัวอย่าง model ข้างบนPerson
, Technology
, Company
จะเป็น label
ตัวอย่างการใช้ Node ใน Cypher ให้ใช้กราฟข้างบนเพื่อดูว่าเราจะสามารถระบุ Node ของเราได้อย่างไร
() //node ไม่ระบุชื่อ สามารถอ้างถึง node ใด ๆ ในฐานข้อมูลได้
(p:Person) //ใช้ตัวแปรชื่อ p และติด label Person
(:Technology) //ไม่ใช้ตัวแปร แต่ติด label Technology
(work:Company) //ใช้ตัวแปรชื่อ work และติด label Company
รูปแบบของ Relationships ใน Cypher
เพื่อให้เราสามารถออกแบบและใช้งาน Graph database ได้อย่างเต็มประสิทธิภาพเราจำเป็นต้องมี relationship เชื่อมระหว่าง Node ของเรา การสร้าง relationship เราจะใช้วงเล็บเหลี่ยม []
เชื่อมกับ Node ในรูปแบบ ()-[]->()
ก็จะเป็น relationship แบบมีทิศทางหรือเราจะไม่กำหนดทิศทางของ relationship ก็ได้ซึ่งก็จะมีความยืดหยุ่นในการค้นหาข้อมูล
ตัวอย่างการใช้ Relationship ใน Cypher ให้ใช้กราฟข้างบนเพื่อดูว่าเราจะสามารถระบุ Node ของเราได้อย่างไร
//สร้างข้อมูลขึ้นมาเก็บในทิศทางนี้
$ CREATE (p:Person)-[:LIKES]->(t:Technology)
//query relationship แบบย้อนกลับจะไม่แสดงผลลัพธ์
$ MATCH (p:Person)<-[:LIKES]-(t:Technology) RETURN *
//จะดีกว่าถ้าเรา query relationship แบบไม่กำหนดทิศทางถ้าเราไม่รู้ทิศทางที่แน่นอน
$ MATCH (p:Person)-[:LIKES]-(t:Technology) RETURN *
แต่เราจะเห็นว่า Node และ relationship ของเรายังไม่มี properties ทำให้ไม่มีการแสดงข้อมูลใด ๆ นอกจาก ID
ที่ Neo4j สร้างขึ้นมา โดยถ้าเราต้องการเพิ่ม properties ใน Node หรือ relationship ให้เราเพิ่ม {}
แล้วใส่ข้อมูลที่เราต้องการเก็บเข้าไปข้างในได้เลย
ยกตัวอย่างถ้าเราต้องการสร้าง Graph แบบที่ผมยกตัวอย่างมานั้นจะต้องพิมพ์คำสั่งทีละอันตามตัวอย่างข้างล่างนี้
$ CREATE (:Person {name: 'Jennifer'})-[:IS_FRIENDS_WITH{since:2018}]->(:Person {name: 'Michael'})
$ MATCH (person:Person)
WHERE person.name = 'Jennifer'
CREATE (person)-[:LIKES]->(:Technology {type: 'Graphs'})
$ MATCH (person:Person)
WHERE person.name = 'Jennifer'
CREATE (person)-[:WORKS_FOR]->(:Company {name: 'Neo4j'})
$ MATCH (n) RETURN n
เราก็คงพอเข้าใจคร่าว ๆ แล้ว ว่าคำสั่งต่าง ๆ ใช้ทำอะไรได้บ้าง ทีนี้มาดูกันว่าคำสั่งแต่ละอย่างใช้ทำอะไรได้บ้าง
คำสั่งใน Cypher ที่ควรรู้
CREATE
เป็นคำสั่งที่ใช้ในการสร้าง Node และ relationship
MATCH
เป็นคำสั่งที่ใช้ในการค้นหา Node หรือ relationship ที่มีอยู่แล้วใน database ถ้าให้เปรียบเทียบกับ SQL ก็จะคล้ายกับ SELECT
DELETE
เป็นคำสั่งที่ใช้ลบ Node ออกจาก database แต่หาก Node นั้น ๆ มี relationship เชื่อมกับอีก Node หนึ่งอยู่จะต้องใช้ DETACH DELETE
เพื่อลบ relationship ที่เชื่อมโยงกับ Node ที่ต้องการจะลบ
RETURN
เป็นคำสั่งที่ใช้ส่งค่ากลับผ่านตัวแปรที่เราอ้างอิงไว้จากคำสั่ง MATCH
การประยุกต์ใช้งานกับ Neo4j Driver
สามารถไปโหลด official driver ได้จาก Neo4j Driver ซึ่งมีให้เราเลือกใช้อยู่ 5 ภาษาคือ C#, Go, Java, JavaScript, Python แต่ในบทความนี้เราจะยังไม่พูดถึง ก็อาจจะเป็นในบทความข้างหน้า