Graph Database - Neo4j

Sắp đến đi hướng dẫn thực hành, thôi thì trước khi đi hướng dẫn lên đây viết lại cho nhớ vậy.

Graph Database

Lưu trữ dữ liệu thì cần có hệ cơ sở dữ liệu, nhất là khi dữ liệu có tính tổ chức cao và có số lượng bản ghi rất lớn. Đồ thị cũng vậy, cách đơn giản nhất là dử dụng 2 files csv riêng biệt cho tập đỉnh và tập cạnh, gây khó khăn trong quá trình truy xuất dữ liệu, hoặc dữ liệu chứa nhiều thuộc tính và không đồng bộ. Để xử lí cho vấn đề này, ta sử dụng tới hệ cơ sở dữ liệu đồ thị

Why Neo4j?

Hiện nay trên thị trường có rất nhiều các hệ cơ sở dữ liệu đồ thị mà các bạn có thể tham khảo, tôi sẽ liệt kê dưới đây một vài hệ cơ sở dữ liệu đồ thị để tham khảo:

  1. Neo4j
  2. GrapheneDB
  3. OrientDB

Nói chung, tìm kiếm với từ khóa Graph Database sẽ cho ra hàng triệu kết quả. Vậy, tại sao lại chọn Neo4j?

Tôi xin trình bày đơn giản thôi:

Tôi biết dùng mỗi Neo4j, nếu biết dùng cái khác mà thấy hay hơn thì tôi sẽ trình bày sau

Neo4j

Trong phần này tôi sẽ trình bày một số mục chính, bao gồm:

  1. Concept cơ bản của đồ thị
  2. Các đối tượng của đồ thị
  3. Truy vấn với Cypher
  4. Kết nối với Python thông qua Neo4j Driver

Concept cơ bản của đồ thị

Một đồ thị trong Neo4j về cơ bản được biểu diễn như sau

Diagram

Nói cách khác tất cả các đồ thị trong Neo4j đều được lưu trữ ở dạng trên.

Các thành phần cơ bản

Về cơ bản, bất kì một thực thể nào trong Neo4j đều có:

  1. Labels (Node) hoặc rel_type (Relationship)
  2. Properties

Các labels thường được dùng cho nhiệm vụ phân chia các thực thể thành các nhóm: những thực thể có cùng labels thường có chung một đặc điểm nào đó. Điều này khá là tương đồng với việc coi các thực thể này là instances của một class trong lập trình hướng đối tượng.

Một nodes có thể có nhiều labels, hoặc không có label. Điều này không đúng với các Relationship.

Các đơn vị cấu thành

Nodes

Nodes gồm 2 phần:

Labels Properties
Các nodes cùng label thì cùng nhóm Các thuộc tính của một nodes
Một nodes có thể có nhiều hoặc không có nhãn Không giới hạn số lượng. Lưu theo cặp {key:value}

Relationship

Tương đương với cạnh trong đồ thị, thể hiện quan hệ giữa các nodes.

Luôn luôn có hướng

Tương tự như nodes, chỉ thay label bằng Rel_type

Làm việc với hệ cơ sở dữ liệu đương nhiên cần đến ngôn ngữ truy vấn cơ sở dữ liệu. Khác với các cơ sở dữ liệu thường gặp như SQLite, MySQL,…Neo4j sử dụng Cypher. Phần tiếp theo sẽ viết về Cypher và các cú pháp cơ bản.

Cypher - Neo4j query language

Ngôn ngữ truy vấn sử dụng trong Neo4j là Cypher, trong bài này tôi sẽ trình bày về cách sử dụng hết sức cơ bản. Tutorial chi tiết hơn có thể xem trên docs của Neo4j.

Do docs của bọn này viết chi tiết quá, có hẳn code minh họa nên thôi tôi không viết nữa.

Để lại đây một tia thần thức

Neo4j - Python Driver

Làm việc với Neo4j trực tiếp không phải là bất khả thi với sự hỗ trợ khá đầy đủ đến từ APOC. Tuy nhiên, cú pháp của Cypher nói chung là không thân thiện như các ngôn ngữ lập trình khác, mặt khác Cypher nhìn chung không có được sự hỗ trợ tốt như các ngôn ngữ khác. Chính vì vậy, việc sử dụng Neo4j gián tiếp qua các ngôn ngữ khác là một sự lựa chọn sáng suốt. Ở đây tôi dùng python.

Có một số Neo4j driver được tìm thấy trên Neo4j.com, có thể kể đến như sau

  1. Neo4j

    Nên dùng, driver chính thức của neo4j

  2. Py2neo

    Dùng khá dễ chịu, tuy nhiên mãi đến gần đây mới bắt đầu có cái docs tử tế

  3. Neomodel

    Chưa dùng bao giờ

Docs của neo4j nhìn chung là rất đủ, tôi cũng không trình bày nữa.

Sáng nay dạy thì nhìn chung là ổn, tạm thời xong được vụ khởi tạo đồ thị. Ngày mai sẽ tiếp tục với pha neo4j và sigmajs

Share on: