12/08/2018, 13:06

Cơ bản về Graph database trong Ruby

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ó ...

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ính phâ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

Image

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:

Image

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

Image

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

Image

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

Image

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/

0