Cơ bản về Graph database trong Ruby
Bài đăng này đã không được cập nhật trong 8 năm
Tổng quan về graph database
Như tên gọi thì graph databse là một kiểu cơ sở dữ liệu đồ thị, một tập các đối tượng gọi là đỉnh nối với nhau bởi các cạnh. Thông thường, đồ thị được vẽ dưới dạng một tập các điểm (đỉnh, nút) nối với nhau bởi các đoạn thẳng (cạnh). Tùy theo ứng dụng mà một số cạnh có thể có hướng.
Chúng ta đã quen với cách biểu diễn theo cơ sở dữ liệu quan hệ truyền thống, nhưng với những bài toán cần nhiều quan hệ việc sử hệ để lưu trữ không phải là một giải pháp hay vì :
- Việc biểu diễn quan hệ dưới dạng bảng không phải là một cách làm trực quan.
- Các phép join thường tốn rất nhiều chi phí
Trong Graph Database quan hệ là những liên kết trực tiếp giữa các thực thể (các đỉnh). Do đó graph database giúp trả lời rất nhiều câu hỏi liên quan đến truy vấn dữ liệu một cách hiệu quả.
Trong graph database có 3 khái niệm cơ bản quan trọng nhất :
-
Node
: chính là các thực thế hay các đối tượng, graph ko quan tâm đến kiểu dữ liệu của các thực thể. -
Properties
: là các thuộc tính, được đặt tên sao cho nó liên quan nhất đến các node. Ví dụ: nếu ta đặt 1 node làxe máy
thì ta sẽ liên tưởng đến các thuộc tínhphân khối
... -
Edges
: là các cạnh nối các node, có thể coi chúng là quan hệ giữa các đối tượng và tạo lên các cấu trúc dữ liệu. Một điều quan trọng mà ta cần hiểu được là xác định được node đến và node đi để xác định đúng mối quan hệ giữa chúng
Với những nơi có dữ liệu liên kết nhiều: ví dụ của mạng xã hội, các ứng dụng gợi ý nghe nhạc, xem phim, các phầm mềm quản lý xí nghiệp nhà máy thì Graph Database sẽ là 1 lựa chọn tốt nhất.
Một vài ví dụ về graph database
Hãy cùng thử tưởng tượng 1 kịch bản sau: John là bạn Bob, Bob là bạn Mark và mối qun hệ đó biểu diễn thông qua graph database như sau
Rõ ràng cách biểu diễn trên rất đơn giản dễ nhìn dễ hiểu so với cách biểu diễn bằng các CSDL thông thường. Ví dụ Mysql:
Mỗi 1 hàng trong bảng user sẽ biểu diễn 1 người, và phải liệt kê quan hệ bạn bè qua bảng friends
, và nếu ta muốn biểu diễn 1 thuộc tính khác của user thì ta phải tạo bảng mới để mô tả thuộc tính đó rồi liên kết với bảng user. Rất phức tạp.
Và để thực hiện các yêu cầu trên, một cách tổng quát thì ta chỉ cần biểu diễn với graph database như sau
Graph ko biểu diễn cấu trúc của dữ liệu. Mỗi node sẽ là 1 đối tượng (ở đây là user
), và mỗi 1 node lại có các thuộc tính ( ở đây là name
) và mỗi đường nối các node biểu hiện mối quan hệ giữa chúng.
Giới thiệu về Neo4j
Neo4j
là 1 trong các CSDL graph nguồn mở phổ biến nhất. Neo4j
hỗ trợ ngôn ngữ truy vấn Cypher, một ngôn ngữ rất trực quan trong việc truy vấn dữ liệu dưới dạng Graph.
Tính năng nỏi bật của Neo4j
- Dễ dùng và áp dụng cho các API hướng đối tượng
- Tối ưu hóa cho dữ liệu có tính kết nối cao
- Cụ thể hóa các mối quan hệ tại thời điểm tạo, kết quả là không có cho truy vấn thời gian phức tạp.
- Bỏ qua các hằng số thời gian cho các quan hệ kể cả về chiều sâu và chiều rộng do cách biều diễn các nút và quan hệ có khả năng.
- Tất cả quan hệ trong Neo4j đều quan trọng và nhanh chóng, khiến nó có thể trở thành thực thể và dử dụng các mối quan hệ mới sau này trên "shortcut" và tăng tốc độ dữ liệu tên miền khi có nhu cầu phát sinh.
- Lưu trữ nhỏ gọn và bộ nhớ đệm cho các đồ thị, vì vậy có thể khả năng mở rộng lưu trữ hàng tỉ nút trong một cơ sở dữ liệu trên một hệ thống phần cứng vừa phải.
- Viết trên các JVM(Java virtual machine).
Một ví dụ biểu diễn mối quan hệ thông qua Graph-Neo4j
Sử dụng Graph Database với ruby
Có khá nhiều cách để tích hợp Neo4j
với ruby:
- Object Oriented Mapping
- “Drop-in” replacement for ActiveModel
- Embedded database
- Thin Ruby wrapper to the Neo4j REST Api
- Indexing for full-text search
- Chainable methods, e.g: method(x).method(y).method(z)…
- When using with Rails, the syntax is very similar to ActiveRecord
Install Neo4j
:
Cách đơn giản nhất là cài thông qua homebrew
:
brew update && brew install neo4j
Sau khi cài đặt thành công, ta khởi động server neo4j
neo4j start
Để tắt server:
neo4j stop
Sau khi cài đặt và chạy server neo4j, ta mở trình duyệt chạy giao diện admin
http://localhost:7474/webadmin/
Sử dụng Neo4j với ruby
Trong bài này, ta sẽ sử dụng Neo4j.rb
để tích hợp graph với ruby. Và để cài đặt Neo4j.rb
thì yêu cầu hệ thống đã cài đặt jruby
. Sử dụng RVM để cài jruby
rvm install jruby
Sau khi cài jruby, ta load thư viện jruby bằng rvm
rvm use jruby
Cuối cùng ta tiến hành cài gem neo4j
gem install neo4j
Tiến hành dùng Neo4j
Trước khi khởi tạo các node và các quan hệ, ta chú ý luôn luôn khai báo chúng trong transaction. Trong bài này ta sẽ tạo 1 file geo4j_example.rb
để thực hiện demo. và tất cả code của chúng ta được viết trong block transaction
require 'rubygems'
require 'bundler/setup'
require 'neo4j'
Neo4j::Transaction.run do
end
Bây giờ ta sẽ thực hiện khai báo khởi tạo các node biểu thị cho thông tin của các user:
me = Neo4j::Node.new(:name => 'Me', :age => 31)
bob = Neo4j::Node.new(:name => 'Bob', :age => 29)
mark = Neo4j::Node.new(:name => 'Mark', :age => 34)
mary = Neo4j::Node.new(:name => 'Mary', :age => 32)
john = Neo4j::Node.new(:name => 'John', :age => 33)
andy = Neo4j::Node.new(:name => 'Andy', :age => 31)
Tiếp đó ta sẽ khai báo quan hệ giữa các node user ở trên:
me.both(:friends) << bob
bob.both(:friends) << mark
mark.both(:friends) << mary
mary.both(:friends) << john
john.both(:friends) << andy
Có thể biểu diễn các mối quan hệ trên qua biểu đồ như sau
Cuối cùng ta hiển thị tất cả các mối quan hệ bạn bè từ me
đến andy
:
puts me.outgoing(:friends).depth(5).map{|node| node[:name]}.join(" => ")
Kết quả là:
Me => Bob => Mark => Mary => John => Andy
Kết luận
Bài viết đã giới thiệu cơ bản về graph database và sử dụng với ruby. Điều thuận lợi nhất của CSDL này là hỗ trợ điều hướng nhanh hơn giữa các các mối quan hệ (relationship). Ví dụ, Facebook dùng CSDL graph để liệt kê và minh họa các mỗi quan hệ khác nhau giữa những người dùng. Và Neo4j là 1 trong các CSDL graph nguồn mở phổ biến nhất. Bài sau chúng ta sẽ cùng nhau đi vào chi tiết hơn và thử xây dựng 1 ứng dụng sử dụng CSDL graph
Tham khảo
http://neo4j.com/developer/example-project/
http://www.sitepoint.com/create-neo4j-graph-database-using-rest-api/
All rights reserved