posted by Trần Phước Tú on 2014-12-03 21:44

1.Graph database là gì

Hiểu 1 cách đơn giản, graph database là database sử dụng cấu trúc graph để lưu trữ dữ liệu, nó khác so với cơ sỡ dữ liệu quan hệ lưu data dưới dạng bảng, hay NoSQL  lưu data dưới dạng document key value.

Các record dữ liệu trong graph database được gọi là Nodes, các node được kết nối với nhau bằng các quan hệ Relationships. Nodes và Relationships đều có thể có các thuộc tính Properties. Các Nodes có thể phân thành các group để dễ quản lý nhờ vào Label

2. Tại sao dùng Graph database:

Graph database không có mục đích là thay thế relational database hayNoSQL database, nó được dùng cho các ứng dụng focus vào các quan hệ(relationship) giữa các thực thể dữ liệu, ví dụ các ứng dụng mạng xã hội, các chức năng suggest, recommend(suggest 1 item cho người sử dụng dựa trên lịch sử hoạt động của người đó), quản lý các mạng lưới(network, traffic...)...

Với những kiểu ứng dụng như vậy thì cách lưu trữ dữ liệu của relational database hoặc NoSQL database đều không thích hợp khi mà chúng chỉ normalize dữ liệu để lưu vào các bẳng hay các document và làm giảm đi tính kết nối. Cách duy nhất để tạo kết nối ở 2 loại database trên là tạo các foreign key/link đến các record/document khác, và việc join các bảng hay lần ngược lại các link là việc phức tạp, kém hiệu quả và dễ gây lỗi, đặc biệt nếu các quan hệ là phức tạp

3. Ưu điểm của Graph database:

3.1 Performance:

Performance là ưu điểm rất lớn của graph databse so với relational database và Nosql database. Khi dữ liệu trở nên lớn cùng với việc sử dụng nhiều câu lệnh join sẽ khiến performance trở nên rất tệ, trong khi thì graph database với cách query dữ liệu chỉ focus vào 1 phân khu của graph có chức các dữ liệu liên quan nên performance không thay đổi nhiều.

3.2: Dễ thay đổi:
Chúng ta có thể thêm vào các nodes, các relationships, các subgraph mà không làm ảnh hưởng đến dữ liệu cũ, các query cũ.

4. Neo4j

+Là 1 open-source graph database

+Được viết bằng Java

+Là 1 implement hoàn thiện của graph database

+Là graph database nổi tiếng nhất hiện tại

5. Sử dụng Neo4J để xây dựng ứng dụng:

Thử tạo 1 ứng dụng nhỏ sử dụng neo4j để hiểu về graph database, ứng dụng này là mô phỏng lại chức năng nhỏ của mạng xã hội, đó là kết nối friend, gồm các chức năng:
+Xem danh sách friend của mình

+Search 1 user khác

+Xem danh sách friends của 1 user

+Xem có bao nhiêu bạn chung giữa mình và người khác

+Kết bạn

+Suggest bạn dựa trên số bạn chung

 

Graph model của ứng dụng sẽ như sau:

Ở các Nodes là các User

Các user nếu là friend của nhau thì sẽ có kết nối FRIEND, quan hệ này là 2 chiều, tức A là friend của B thì B cũng là friend của A

Các User có các thuộc tính sau:

+name: tên

+email: email của user

+password: mật khẩu

Các câu query trong chương trình:

@Query("match (user: User {email: {0}})-[:FRIEND]-(friend) "

       + "with user, friend "

       + "OPTIONAL match (user)-[:FRIEND]-(other)-[:FRIEND]-(friend) "

       + "return friend, count(other) as common_friend "

       + "order by common_friend DESC")

 

Dùng để lấy danh sách friend của user đang login, cùng với số friend chung giữa user và mỗi friend

 

@Query("match (user: User {email: {0}}), (me: User {email: {1}}) "

        + "with user, me "

        + "optional match (user)-[r:FRIEND]-(me) "

        + "with user, me, r "

        + "optional match (user)-[:FRIEND]-(other)-[:FRIEND]-(me) "

        + "return user, count(other) as common_friend, count(r) as is_my_friend "

        + "limit 1")

 

Lấy thông tin của 1 user thông qua email, gồm các thuộc tính của user đó, cùng với số friend chung giữa user đang login và user được search và kiểm tra user đang login và user search đã là friend chưa

 

@Query("match (me:User {email:{0}})-[:FRIEND]-(other)-[:FRIEND]-(user) "

       + "where me <> user and not (me)-[:FRIEND]-(user) "

       + "return user, count(other) as common_friend "

       + "order by common_friend DESC")

 

Lấy danh sách các user sẽ được suggest cho user đang login, kết quả sẽ là những user chưa phải là bạn với user đang login và đang là bạn của bạn của user đang login

 

@Query("match (user: User {email: {0}})-[:FRIEND]-(other), (me: User {email: {1}}) "

      + "where other <> me "

      + "with other, me "

      + "optional match other-[:FRIEND]-(so)-[:FRIEND]-(me) "

      + "with other, me, count(so) as common_friend "

      + "optional match (other)-[r:FRIEND]-(me) "

      + "return other as user, common_friend, count(r) as is_my_friend ")

 

Lấy danh sách friend của 1 user bất kỳ(không phải user đang login)

 

 

Kết quả: Truy cập http://dev.co-mit.com:8081/graph_friends, thực hiện đăng ký để tham gia mạng lưới friend :)

 

Với việc sử dụng Graph database cho các ứng dụng hướng đến các kết nối thì công việc sẽ được đơn giản đi rất nhiều. Việc sử dụng các database khác cho ứng dụng demo này cũng được nhưng các câu query sẽ phức tạp hơn rất nhiều, sử dụng nhiều các lệnh join, và tất nhiên sẽ ảnh hưởng nhiều đến performance của hệ thống.


One comment

#70
Esme
2015-03-08 17:44
Neo4j in 3D Graph Visualization Neo Technology, Graph Database Max De Marzi uses Three.js, a lightweight jvaiscrapt library which renders 3D graph visualizations of Neo4j. In his blog, he shows you how to build it with code www.neotechnology.com/ /neo4j-in-3d-graph-visualization/

Leave a Comment

Fields with * are required.