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