9

Tôi đang mô hình hóa một đồ thị cho một ứng dụng mà tôi hiện đang xây dựng, nơi tôi có n Người dùng kết nối với n Users, tôi cũng có n bài có thể được thích bởi n Users. Vì vậy, cấu trúc sẽ trông giống như thế này, đối với một người dùng cụ thể, enter image description hereCách tốt nhất để kết nối các nút n với một nút duy nhất là gì?

nếu một người dùng thích hàng trăm nút Bài đăng, nó sẽ tạo 100 cạnh (thực) cho nút, khi bài viết là n, các cạnh cũng sẽ là n. do đó một người dùng sẽ được kết nối với n Người dùng và n bài đăng và các loại nút trong tương lai.

Vì vậy, sử dụng một nút trung gian do đó làm giảm các cạnh đến nút nhất định, mà sẽ giống như thế này,

enter image description here

Trong trường hợp người sử dụng có một nút trung gian có tên Bộ sưu tập này sẽ được kết nối với thích, vì đây là biểu đồ thuộc tính, tôi có thể thêm thuộc tính vào nút trung gian và làm cho nó hoạt động giống như kết nối từ người dùng (giống như, Likes.username = User.username)

Điều này tương tự như vậy câu hỏi (Graph database modelling: Should i use a collection node to avoid to many rel on a node)

ý tưởng của tôi là

Cách này của nút kết nối trung gian có thể cách ly rác khỏi nút chính, do đó có thể tăng tốc các thuật toán tùy chỉnh.

Câu hỏi của tôi,

  1. giải pháp tốt nhất để điều này mà quy mô là gì?
  2. Tại sao tôi nên xem xét giải pháp này so với giải pháp khác?

Trả lời

6

Theo cuốn sách học tập rất tốt Neo4j (bởi Rik Van Bruggen, có sẵn cho download in the Neo4j's web site), vấn đề của bạn được gọi là "Nút dày đặc" hoặc "Siêu nút": các nút có quá nhiều kết nối.

Vẫn theo cuốn sách, siêu nút

"trở thành một vấn đề thực sự cho thuật toán duyệt đồ thị vì đồ thị hệ thống quản lý cơ sở dữ liệu sẽ phải đánh giá tất cả các kết nối mối quan hệ để nút đó để xác định những gì bước tiếp theo sẽ có trong quá trình truyền tải biểu đồ. "

Giải pháp được đề xuất bởi Rik rất gần với giải pháp của bạn (Thêm nút trung gian): nó bao gồm thêm nút "meta" giữa Người dùng và Bài đăng bạn thích. Nút meta này sẽ có tối đa một trăm kết nối. Nếu nút meta hiện tại đạt 100 kết nối một nút meta mới phải được tạo ra và thêm vào hệ thống phân cấp, theo các ví dụ về con số, cho thấy một ví dụ với các nghệ sĩ nổi tiếng và người hâm mộ của bạn:

Dense node

Đội Neo4j đã thực hiện một nỗ lực rất lớn để cải thiện hiệu năng về các siêu nút, như có thể thấy trong this Github commit (ví dụ) thay đổi cách các mối quan hệ cho một nút được lưu trữ trên đĩa, trong cấu trúc danh sách liên kết.

Tôi tin rằng tốt nhất là giữ cho mô hình đồ thị của bạn đơn giản nhất có thể lúc đầu. Bạn không có một vấn đề nút dày đặc (chưa) và một tối ưu hóa sớm có thể sẽ thêm một số phức tạp không cần thiết cho mô hình của bạn. Nếu trong các nút dày đặc trong tương lai trở thành một vấn đề bạn có thể thay đổi mô hình của mình chính xác hơn. Đơn giản là một lựa chọn tốt lúc đầu.

Bạn có thể đọc thêm một chút về các nút siêu trong cơ sở dữ liệu đồ thị trong những liên kết này:

8

Giải pháp này sẽ có ưu điểm và nhược điểm.

Điểm bất lợi chính là các hoạt động truyền tải sẽ đắt hơn, ví dụ: bạn sẽ phải đi qua một nút khác trước khi tìm các bài đăng.

Những lợi thế đang theo dõi:

  • ít ganh đua trên nút Người dùng khi bạn thêm mới "thích", tức là. User @version sẽ không được tăng lên, vì vậy bạn sẽ có thể thực hiện cập nhật trên Người dùng đồng thời, mà không có xung đột phiên bản
  • khả năng thêm thông tin vào nút "thích". Bạn có thể làm điều đó cũng với các cạnh một mình, nhưng bạn sẽ phải sao chép thông tin trên tất cả các cạnh.
  • Người dùng nhỏ hơn, cụ thể bên dưới ngưỡng cấm/cây che phủ http://orientdb.com/docs/2.2.x/RidBag.html Chỉ cần xem xét với giao thức nhị phân, khi bạn có cây RidBag, nó sẽ không được sắp xếp ngay lập tức cho khách hàng, nhưng bạn sẽ có một trình lặp , do đó, chi phí trong việc tìm nạp một Người dùng sẽ không đáng kể. Mặt khác, với giao thức HTTP, bạn sẽ nhận được tất cả các RID cạnh với đỉnh, vì vậy trong trường hợp này, bạn sẽ tiết kiệm rất nhiều băng thông và thời gian tính toán bằng cách sử dụng phương pháp thứ hai.

Về câu hỏi của bạn, giải pháp tốt nhất là giải pháp phù hợp hơn với khối lượng công việc của bạn: nếu bạn thực hiện nhiều cập nhật trên Người dùng, giải pháp thứ hai sẽ mang lại cho bạn lợi thế trước mắt; nếu bạn thường xuyên tìm nạp người dùng, giải pháp thứ hai cũng sẽ mang lại lợi thế; mặt khác, nếu mối quan tâm chính của bạn là truyền tải nhanh, giải pháp thứ hai sẽ không phù hợp lắm.

Các vấn đề liên quan