Khám Phá Neo4j - hj88

| Jan 10, 2025 min read

24 tháng 11 năm 2024 - hj88 Máy tính

Neo4j được viết bằng ngôn ngữ Java và Scala, là một hệ quản trị cơ sở dữ liệu nguồn mở chuyên dụng để xử lý dữ liệu dạng đồ thị. Hệ thống này biểu diễn dữ liệu thông qua các nút (Node), mối quan hệ (Relationship) và thuộc tính (Property) một cách trực quan, cho phép lưu trữ và truy vấn hiệu quả mạng lưới quan hệ phức tạp. Neo4j đặc biệt phù hợp cho các tình huống liên quan đến kết nối như mạng xã hội, hệ thống gợi ý và bản đồ kiến thức.

Ngoài các đặc điểm cốt lõi của cơ sở dữ liệu đồ thị, Neo4j còn hỗ trợ giao dịch, triển khai cụm hóa và khả năng chịu lỗi trong thời gian chạy. Bài viết này sẽ bắt đầu bằng việc giới thiệu những kiến thức cơ bản về Neo4j, sau đó trình bày cách sử dụng các chức năng cơ bản của nó thông qua ví dụ.

Dưới đây là cách giới thiệu Neo4j theo dạng “đồ thị”:

! Giới thiệu Neo4j theo dạng đồ thị

Trong hình trên, các vòng tròn đại diện cho các nút, các đường nối có mũi tên là mối quan hệ, và hộp vuông ở góc trên bên phải của vòng tròn có thể được xem là nhãn của nút, dùng để phân nhóm hoặc đánh dấu các nút. Từ hình trên ta có thể thấy:

  • Neo4j là một cơ sở dữ liệu đồ thị.
  • Neo4j sở hữu neo4j.com.
  • Neo4j được tạo ra bởi Emil và Emil làm việc tại Neo4j.
  • Công ty Neo4j đặt trụ sở tại London.

Sau khi có cái nhìn tổng quan về đồ thị và Neo4j, chúng ta sẽ tập trung vào việc giới thiệu kiến thức cơ bản về Neo4j, sau đó áp dụng chúng thông qua ví dụ thực tế.

1 Kiến Thức Cơ Bản Về Neo4j

Trước khi đi sâu vào các khái niệm cơ bản và thuật ngữ riêng của Neo4j, hãy cùng xem xét một ví dụ minh họa dưới dạng đồ thị về việc Ngô Kinh tham gia bộ phim “Chiến Lang II”. Điều này sẽ giúp hiểu rõ hơn khi kết hợp với ví dụ này trong quá trình giải thích các khái niệm.

! Ví dụ về Ngô Kinh tham gia “Chiến Lang II”

(Ví dụ về Ngô Kinh tham gia “Chiến Lang II”)

1.1 Các Khái Niệm Cốt Lõi

Các nút (Node), mối quan hệ (Relationship) và thuộc tính (Property) là những khái niệm cốt lõi mà Neo4j sử dụng để biểu diễn các đối tượng và mối liên kết giữa chúng.

Thuộc tính là thông tin dạng cặp khóa-giá trị mô tả các nút hoặc mối quan hệ.

Nút được dùng để biểu diễn các thực thể như sản phẩm, xe cộ, vị trí, v.v., tất cả đều có thể là một nút. Nút có thể được gắn nhãn (Label) để phân nhóm. Bên cạnh đó, nút cũng có thể có nhiều thuộc tính.

Mối quan hệ được dùng để kết nối hai nút, biểu diễn sự liên kết giữa hai nút. Mối quan hệ chỉ có một loại (Type) và luôn mang tính hướng. Mối quan hệ cũng có thể có thuộc tính để cung cấp thêm thông tin.

Dựa vào ví dụ “Ngô Kinh tham gia ‘Chiến Lang II’” ở phần đầu bài, ta có thể giải thích ba khái niệm này. Trong hình, các vòng tròn là nút, mũi tên là mối quan hệ, và thông tin trong hộp vuông dưới vòng tròn và mũi tên chính là thuộc tính. Hình có hai nút: một là Ngô Kinh, một là “Chiến Lang II”. Ngô Kinh có một nhãn (diễn viên), “Chiến Lang II” có hai nhãn (phim, phim hành động). Ngô Kinh có hai thuộc tính (quốc tịch: Trung Quốc, năm sinh: 1974), “Chiến Lang II” cũng có hai thuộc tính (tên: Chiến Lang II, năm phát hành: 2017). Giữa hai nút có một mũi tên có hướng là mối quan hệ, loại mối quan hệ này là “đã tham gia”, và mối quan hệ này có một thuộc tính (vai diễn: Lạnh Phong).

1.2 Xây Dựng Dữ Liệu

Xây dựng dữ liệu là quy trình ánh xạ các thực thể và mối liên hệ giữa chúng trong thực tế sang các nút, mối quan hệ và thuộc tính trong cơ sở dữ liệu đồ thị.

Một nguyên tắc vàng trong xây dựng dữ liệu được minh họa như sau:

! Nguyên Tắc Vàng

Tức là nút nên sử dụng danh từ, mối quan hệ nên sử dụng động từ.

1.3 Ngôn Ngữ Cypher

Cypher là một ngôn ngữ khai báo được thiết kế riêng cho Neo4j để thao tác với cơ sở dữ liệu đồ thị. Nó cho phép sử dụng cú pháp bao gồm ngoặc tròn, dấu gạch ngang và mũi tên để biểu diễn và thao tác dữ liệu. Ngôn ngữ truy vấn này tương tự như SQL nhưng đã được tối ưu hóa cho cơ sở dữ liệu đồ thị.

Đối với ví dụ “Ngô Kinh tham gia ‘Chiến Lang II’” ở phần đầu bài, có thể sử dụng các câu lệnh Cypher sau để tạo dữ liệu:

CREATE
 (a:Actor {name: "Ngô Kinh", nationality: "Trung Quốc", yearOfBirth: 1974}),
 (m:Movie {name: "Chiến Lang II", releasedAt: 2017}),
 (a)-[r:ACTED_IN {role: "Lạnh Phong"}]->(m)

Câu lệnh Cypher trên tương đương với ba câu lệnh sau, nó tạo ra hai nút (diễn viên và phim) và mối quan hệ “diễn viên - đã tham gia -> phim”:

CREATE (a:Actor {name: "Ngô Kinh", nationality: "Trung Quốc", yearOfBirth: 1974})
CREATE (m:Movie {name: "Chiến Lang II", releasedAt: 2017})
CREATE (a:Actor)-[r:ACTED_IN {role: "Lạnh Phong"}]->(m:Movie)

Ngoặc tròn ((...) ) biểu diễn nút, ngoặc nhọn trong ngoặc tròn biểu diễn thuộc tính của nút ({...}), dấu gạch ngang, ngoặc vuông và mũi tên biểu diễn mối quan hệ (-[...]->), ngoặc vuông trong mối quan hệ biểu diễn thuộc tính của mối quan hệ ({...}), và a, m, r là các biến trỏ tới nút Actor, Movie và mối quan hệ ACTED_IN.

Nếu muốn tìm tên diễn viên và vai diễn trong “Chiến Lang II” vừa được tạo, có thể sử dụng câu lệnh Cypher sau:

// Tìm tất cả mẫu "diễn viên - đã tham gia -> phim" từ cơ sở dữ liệu
MATCH (a:Actor)-[r:ACTED_IN]->(m:Movie)
// Sau đó lọc theo tên phim
WHERE m.name = "Chiến Lang II"
// Chỉ định giá trị trả về
RETURN a.name AS actor, r.role AS role

So sánh với SQL trong cơ sở dữ liệu quan hệ, có thể thấy rằng MATCH của Cypher tương đương với FROM/JOIN của SQL, WHERE tương đương với WHERE của SQL, và RETURN tương đương với SELECT của SQL.

2 Sử Dụng Đầu Tiên Với Neo4j

Sau khi giới thiệu các khái niệm cơ bản về Neo4j, bây giờ chúng ta sẽ bắt tay vào cài đặt một phiên bản Neo4j trên máy cục bộ và sử dụng Cypher để tạo và truy vấn dữ liệu.

2.1 Cài Đặt Neo4j Desktop

Cách đơn giản nhất để cài đặt và sử dụng Neo4j trên máy cục bộ là cài đặt “Neo4j Desktop”. Neo4j Desktop tích hợp sẵn Neo4j Server và cung cấp giao diện quản lý trực quan, hỗ trợ kết nối với cơ sở dữ liệu Neo4j cục bộ và từ xa. Ngoài ra, Neo4j Desktop còn tích hợp Neo4j Browser và Neo4j Bloom để thực hiện truy vấn Cypher và thao tác dữ liệu trực quan.

Sau khi cài đặt Neo4j Desktop xong, mở nó lên, tạo một dự án mới tên là test, và tạo một Local DBMS mới trong dự án này:

! Tạo dự án mới trong Neo4j Desktop

Sau khi tạo xong, có thể kết nối với Local DBMS này, sau khi kết nối thành công, có thể nhập và thực thi câu lệnh Cypher trong khung chữ nhật phía trên:

! Bảng điều khiển thực thi Cypher trong Neo4j Desktop

2.2 Chèn Dữ Liệu

Dưới đây là việc sử dụng câu lệnh CREATE để tạo thêm một số dữ liệu “diễn viên - đã tham gia -> phim”:

CREATE
 (a1:Actor {name: "Ngô Kinh", nationality: "Trung Quốc", yearOfBirth: 1974}),
 (a2:Actor {name: "Lư Tịnh Shan", nationality: "Trung Quốc", yearOfBirth: 1985}),
 (m1:Movie {name: "Chiến Lang II", releasedAt: 2017}),
 (m2:Movie {name: "Thái Cực Tông Sư", releasedAt: 1998}),
 (m3:Movie {name: "Trái Đất Lang Thang II", releasedAt: 2023}),
 (m4:Movie {name: "Tôi Và Quê Hương Tôi", releasedAt: 2020}),
 (a1)-[:ACTED_IN {role: "Lạnh Phong"}]->(m1),
 (a1)-[:ACTED_IN {role: "Dương Dật Canh"}]->(m2),
 (a1)-[:ACTED_IN {role: "Lưu Pei Cường"}]->(m3),
 (a2)-[:ACTED_IN {role: "Rachel"}]->(m1),
 (a2)-[:ACTED_IN {role: "EMMA MEIER"}]->(m4)

j88bet 2.3 Truy Vấn Dữ Liệu Đơn Giản

Sau khi chèn xong dữ liệu, sử dụng câu lệnh sau để biểu diễn cấu trúc dữ liệu dưới dạng đồ thị:

CALL db.schema.visualization()

! Biểu diễn cấu trúc dữ liệu dưới dạng đồ thị

Tiếp theo, truy vấn tất cả diễn viên và phim trong mẫu “diễn viên - đã tham gia -> phim”:

MATCH (a:Actor)-[:ACTED_IN]->(m:Movie)
RETURN a, m

Kết quả trả về dưới dạng đồ thị như sau:

! Mối quan hệ “diễn viên - đã tham gia -> phim”

Thực hiện một truy vấn phức tạp hơn: tìm các phim mà diễn viên đã tham gia “Chiến Lang II” cũng tham gia:

MATCH (Movie {name: "Chiến Lang II"})<-[:ACTED_IN]-(a:Actor)-[:ACTED_IN]->(m:Movie)
RETURN a.name AS actorName, m.name as movieName

Kết quả trả về dạng bảng như sau:

actorName movieName
Ngô Kinh Thái Cực Tông Sư
Ngô Kinh Trái Đất Lang Thang II
Lư Tịnh Shan Tôi Và Quê Hương Tôi

2.4 Truy Vấn Dữ Liệu Phức Tạp

Trước khi tiến hành, hãy thêm một tập dữ liệu “người dùng - đánh giá -> phim”. Trước đó, dữ liệu đã được tạo trực tiếp bằng câu lệnh CREATE, bây giờ thử một phương thức khác: nhập từ tệp CSV.

Tập tin dữ liệu đánh giá phim của người dùng ratings.csv có nội dung như sau:

user,movie,rating
Hè,Chiến Lang II,9
Sơn Sơn,Chiến Lang II,9
Đại Bằng,Chiến Lang II,8
Đóa Đóa,Chiến Lang II,8
Lạc Lạc,Chiến Lang II,8
Tháng Ba,Chiến Lang II,9
Hè,Trái Đất Lang Thang II,8
Sơn Sơn,Trái Đất Lang Thang II,8
Đại Bằng,Trái Đất Lang Thang II,7
Đóa Đóa,Trái Đất Lang Thang II,8
Lạc Lạc,Trái Đất Lang Thang II,8
Tháng Ba,Trái Đất Lang Thang II,6

Sau khi đặt tệp này vào thư mục chỉ định của Neo4j, sử dụng câu lệnh sau để đọc từng dòng trong tệp CSV, sau đó tạo User, tìm Movie và tạo mối quan hệ “người dùng - đã đánh giá -> phim (User - RATED -> Movie)” cho mỗi dòng dữ liệu.

LOAD CSV WITH HEADERS FROM 'file:///ratings.csv' AS row
MERGE (u:User {name: row.user})
WITH u, row
MATCH (m:Movie {name: row.movie})
CREATE (u)-[:RATED {rating: toInteger(row.rating)}]->(m);

Câu lệnh trên sử dụng từ khóa MERGE tương đương với CREATE or MATCH, tức là tạo dữ liệu nếu chưa có và khớp dữ liệu nếu đã tồn tại.

Sau khi hoàn tất việc chèn dữ liệu “người dùng - đánh giá -> phim”, có thể sử dụng câu lệnh sau để truy vấn:

MATCH (u:User)-[:RATED]-(m:Movie)
RETURN u, m

Biểu diễn mối quan hệ “người dùng - đánh giá -> phim” dưới dạng đồ thị như sau:

! Biểu diễn mối quan hệ “người dùng - đánh giá -> phim” dưới dạng đồ thị

Tương tự như SQL, trong Cypher cũng có thể sử dụng hàm tập hợp, dưới đây là câu lệnh tìm phim có điểm trung bình cao nhất:

MATCH (u:User)-[r:RATED]->(m:Movie)
RETURN m.name AS movie, avg(r.rating) AS avgRating
ORDER BY avgRating DESC
LIMIT 1

Kết quả trả về dạng bảng như sau:

movie avgRating
Chiến Lang II 8.5

Cuối cùng, hãy khám phá sức mạnh của cơ sở dữ liệu đồ thị, chúng ta sẽ thử tìm đường ngắn nhất giữa hai diễn viên “Ngô Kinh” và “Lư Tịnh Shan”:

MATCH (a1:Actor {name: "Ngô Kinh"})
MATCH (a2:Actor {name: "Lư Tịnh Shan"})
MATCH p = shortestPath((a1)-[*..10]-(a2))
RETURN p

Câu lệnh trên trước tiên tìm ra hai diễn viên a1 và a2, sau đó sử dụng hàm shortestPath để tìm đường ngắn nhất giữa a1 và a2. Hàm này nhận tham số (a1)-[*..10]-(a2), trong đó * biểu diễn bất kỳ loại nào không giới hạn kiểu đường kết nối giữa hai nút, không có mũi tên nghĩa là không giới hạn hướng kết nối, và ..10 giới hạn độ sâu tìm kiếm không vượt quá 10 lớp để tránh tìm kiếm vô tận. Lưu ý rằng nếu có nhiều kết quả cùng độ sâu, chỉ một kết quả sẽ được trả về.

Kết quả trả về dưới dạng đồ thị như sau:

! Tìm đường ngắn nhất giữa hai diễn viên

Như có thể thấy, “Ngô Kinh” và “Lư Tịnh Shan” đều đã tham gia “Chiến Lang II”, đây là đường ngắn nhất giữa họ.

Tiếp theo, sử dụng shortestPath để tìm xem có đường ngắn nhất giữa người dùng đánh giá “Đại Bằng” và diễn viên “Ngô Kinh” hay không:

MATCH (u:User {name: "Đại Bằng"})
MATCH (a:Actor {name: "Ngô Kinh"})
MATCH p = shortestPath((u)-[*..10]-(a))
RETURN p

Kết quả trả về dưới dạng đồ thị như sau:

! Đường ngắn nhất giữa người dùng đánh giá “Đại Bằng” và diễn viên “Ngô Kinh”

Như vậy, “Đại Bằng” đã đánh giá “Chiến Lang II”, và “Ngô Kinh” đã tham gia “Chiến Lang II”, đây là mối liên hệ gần nhất giữa họ.

3 Kết Luận

Tóm lại, bài viết này đã giới thiệu các khái niệm và kiến thức cơ bản về Neo4j, sau đó tải xuống và cài đặt “Neo4j Desktop” trên máy cục bộ, chèn dữ liệu mẫu và thực hiện sử dụng cơ bản Cypher Query. Nhìn chung, Neo4j là một cơ sở dữ liệu đồ thị thú vị, các tính năng nâng cao hơn của nó đáng để khám phá thêm.

[1] YouTube: Training Series - Introduction to Neo4j - [2] Neo4j: What is a graph database - [3] Neo4j: What is Neo4j? - [4] Neo4j: What is Cypher - [5] Neo4j: Desktop Download - [6] Neo4j: Importing CSV data into Neo4j -

#Neo4j