5. Nội dung nghiên cứu
1.3.2. Mô hình dữ liệu
1.3.2.1 Kiến trúc logic của Neo4j.
Kiến trúc logic của Neo4j được mô tả theo hình dưới đây:
Hình 1.16: Kiến trúc logic của Neo4j
Trong đó:
- File system: là các file trên ổ cứng, được lưu trữ cẩn thận để tính toán các offset và tìm đến đến bất kỳ một record nào trong các file một cách nhanh nhất. Ta lưu trữ tách biệt các nút, các quan hệ và các thuộc tính, và tối ưu trong những trường hợp chung nhằm để đảm bảo dữ liệu được tìm thấy trên 1 file.
- Memory-mapped (N)IO: ta sử dụng java IO cho mục đích nhanh chóng.
- Caches: cho phép làm việc nhanh chóng trên các đĩa quay, cho phép chúng ta duyệt hàng triệu phép duyệt mỗi giây trên một phần cứng của máy laptop.
- CoreAPI : là phần nhân của Neo4j, lưu trữ các cấu trúc mức trừu tượng của đồ thị, mang tính hiệu quả cao.
- Traversal Framework: tầng truy vấn dữ liệu.
- JVM Language Bindings: các thành phần của Java API như Jruby, Jython, Scala,…
1.3.2.2. Nút.
Đơn vị chủ chốt hình thành nên 1 đồ thị là các nút và các mối quan hệ. Trong Neo4j, các nút và các mối quan hệ có thể có các thuộc tính liên quan.
Các nút thường được dùng để biểu diễn các thuộc tính, phụ thuộc vào miền của các mối quan hệ mà có thể được sử dụng cho nhiều mục đích khác nhau.
Hình 1.17: Nút, các mối quan hệ và tập thuộc tính
Một đồ thị đơn giản chỉ chứa 1 nút, và có thể chỉ chứa một thuộc tính. Ví dụ:
Hình 1.18: Ví dụ về một đồ thị đơn giản với 1 nút và 1 thuộc tính
Trong ví dụ trên, đồ thị có 1 nút có 1 thuộc tính tên là “name”, với giá trị là “Lam”.
1.3.2.3. Mối quan hệ.
Trong cơ sở dữ liệu đồ thị, các mối quan hệ giữa các nút là thành phần quan trọng của cơ sở dữ liệu đồ thị. Chúng cho phép tìm kiếm các dữ liệu có liên quan với nhau. Cũng giống như các nút, các mối quan hệ cũng có tập các thuộc tính.
Hình 1.19: Mối quan hệ và các quan hệ liên quan
Một mối quan hệ kết nối 2 nút với nhau, gồm nút bắt đầu và nút kết thúc. Mỗi mối quan hệ có kiểu quan hệ, mỗi kiểu quan hệ này được xác định bởi một tên (định danh) duy nhất. Một mối quan hệ có tập các thuộc tính với các giá trị của các thuộc tính này.
Một mối quan hệ luôn có hướng. Chúng biểu diễn quan hệ đầu vào của 1 nút, và quan hệ đầu ra của 1 nút, dùng cho phép duyệt đồ thị:
Hình 1.20: Một mối quan hệ giữa nút bắt đầu và nút kết thúc
Hình 1.21: Quan hệ vào và quan hệ ra của một nút
Một nút cũng có thể tự có quan hệ với chính nó:
Để nâng cao hơn phép duyệt đồ thị tất cả các mối quan hệ có một kiểu quan hệ, có thể được xem là nhãn của một mối quan hệ.
Ví dụ:
Hình 1.23: Ví dụ một mạng xã hội
Trong mạng xã hội trên, có 2 kiểu dữ liệu là “follows” và “blocks”, thể hiện mối quan hệ giữa các nút : Nam, Lam, Ly và Vy.
1.3.2.4. Thuộc tính.
Cả nút và mối quan hệ đều có tập các thuộc tính.
Thuộc tính là cặp khóa – giá trị trong đó khóa có kiểu là String (kiểu mô tả này tương tự như kiểu dữ liệu Map trong Java). Các giá trị của thuộc tính có thể là 1 kiểu nguyên thủy, hoặc một mảng của nhiều kiểu nguyên thủy. Ví dụ : kiểu String, kiểu int, hoặc mảng int[].
Các thuộc tính không chứa giá trị null, nếu một thuộc tính có giá trị = null nghĩa là không tồn tại khóa đó trong tập các thuộc tính của các nút hay các mối quan hệ.
Hình 1.24: Biểu diễn một thuộc tính
1.3.2.5. Đường đi.
Một đường đi là một hay nhiều nút được kết nối với nhau bởi các mối quan hệ, thường được biểu diễn bằng kết quả của phép duyệt.
Đường đi ngắn nhất có thể bằng 0 khi đó là đường đi từ 1 nút đến chính nó, như hình dưới đây:
Hình 1.26: Đường đi đến chính nút đó bằng 0
Đường đi của một nút đến nút khác được biểu diễn như sau :
Hình 1.27: Đường đi từ nút 1 đến nút 2 có quan hệ relationship 1
1.3.2.6. Nhãn.
Nhãn được sử dụng để nhóm các nút vào một bộ (tập hợp). Tất cả các nút có nhãn giống nhau cùng thuộc về một bộ. Nhiều truy vấn cơ sở dữ liệu có thể làm việc với các bộ thay vì toàn bộ đồ thị, làm cho các truy vấn dễ dàng hơn để viết và hiệu quả hơn. Một nút có thể được gắn nhãn với bất kì số nào hoặc không, làm cho các nhãn trở nên không bắt buộc trong đồ thị.
1.3.2.7. Duyệt đồ thị.
Duyệt đồ thị là cách truy vấn đồ thị, điều hướng từ bắt đầu từ một nút đến các nút có liên quan để trả lời cho các câu hỏi dạng như “Bạn của tôi thích thể loại nhạc nào?”, hay “Những người bạn của bạn tôi là ai?”,…
Duyệt một đồ thị nghĩa là đi thăm các nút của đồ thị đó, dựa trên các mối quan hệ giữa các nút theo một số quy tắc. Trong một số trường hợp, chỉ có một đồ thị con được thăm.
Kết quả của duyệt đồ thị có thể trả về là một đường đi từ nút này đến nút kia.