2011-12-12 33 views
9

Tôi muốn đại diện cho thay đổi độ mạnh của các mối quan hệ giữa các nút trong biểu đồ Neo4j.Biểu thị cường độ mối quan hệ (và tăng dần) trong Neo4j

Đối với một đồ thị tĩnh, điều này có thể dễ dàng thực hiện bằng cách thiết lập một "sức mạnh" tài sản trên các mối quan hệ:

A --knows--> B 
     | 
    strength 
     | 
     3 

Tuy nhiên, đối với một đồ thị mà cần cập nhật theo thời gian, có một vấn đề, vì incrementing giá trị của thuộc tính không thể được thực hiện một cách nguyên tử (thông qua giao diện REST) ​​vì cần đọc trước khi ghi. Việc tăng dần (thay vì chỉ cập nhật) là cần thiết nếu biểu đồ đang được cập nhật để đáp ứng với dữ liệu được truyền trực tiếp. Tôi sẽ cần đảm bảo rằng chỉ có một máy khách REST đọc và viết cùng một lúc (đồng bộ hóa bên ngoài), hoặc chỉ gắn vào API được nhúng để tôi có thể sử dụng các giao dịch được tích hợp sẵn. Điều này có thể hoàn toàn khả thi nhưng có vẻ khó xử.

Một giải pháp khác có thể là để ghi lại nhiều mối quan hệ, mà không cần bất kỳ thuộc tính, do đó "sức mạnh" thực sự là số lượng các mối quan hệ, tức là

A knows B 
A knows B 
A knows B 

nghĩa một mối quan hệ về sức mạnh 3.

  • Bất lợi: chỉ có các điểm số nguyên có thể được ghi
  • Ưu điểm: không cần đọc trước khi viết
  • Bất lợi: (có thể) lưu trữ nhiều hơn cần thiết
  • Nhược điểm: (có lẽ) chậm hơn để trích xuất các giá trị kể từ nhiều mối quan hệ phải được trích xuất và tính

Có ai đã thử phương pháp này, và nó có khả năng chạy vào vấn đề hiệu suất, đặc biệt là khi đọc ?

Có cách nào tốt hơn để tạo mô hình này không?

Trả lời

5

Ý tưởng hay. Để giảm dung lượng lưu trữ và đọc nhiều mối quan hệ có thể được tổng hợp thành một trong một công việc hàng loạt chạy giao dịch.

Mỗi liên kết cũng có thể mang một giá trị trọng số riêng lẻ, có giá trị tổng hợp được sử dụng làm trọng số. Nó không phải là số nguyên dựa và cũng có thể là số âm để biểu thị các số thập phân.

Bạn cũng có thể viết một phần mở rộng máy chủ nhỏ để cập nhật giá trị trọng số trên một mối quan hệ đơn lẻ. thậm chí có lẽ có ý nghĩa cho REST API (như ngoài tiêu chí "thiết lập giá trị duy nhất" hoạt động đã sửa đổi một hoạt động giá trị duy nhất.

PUT http://localhost:7474/db/data/node/15/properties/mod/foo 

Cơ thể chứa giá trị delta (1,5, -10). Một ý tưởng khác sẽ để thay thế từ khóa chế độ theo hoạt động thực tế

PUT http://localhost:7474/db/data/node/15/properties/add/foo 
PUT http://localhost:7474/db/data/node/15/properties/or/foo 
PUT http://localhost:7474/db/data/node/15/properties/concat/foo 

Điều gì sẽ "tăng" có nghĩa là trong trường hợp không phải là số nguyên?

+0

Cảm ơn - một số khả năng thú vị ở đó! Sau khi kiểm tra từ điển, tôi nghĩ rằng nó là OK để nói về số nguyên không 'increments' (mặc dù rõ ràng bạn sẽ phải xác định số tiền)! – DNA

1

Phụ thuộc một chút vào tải đọc và ghi mà bạn đang nhắm mục tiêu. Làm thế nào lớn là tổng số đồ thị sẽ được?

+0

Tại một dự đoán sơ bộ, tôi muốn nói vài chục triệu nút. Số lượng các mối quan hệ là ít nhất định, nhưng có lẽ là một số lượng nhỏ của số lượng các nút. Biểu đồ sẽ được cập nhật liên tục, thêm hoặc cập nhật hàng chục hoặc hàng trăm thực thể mỗi giây. Tải đọc có lẽ sẽ khá nhẹ; chọn một số lượng nhỏ các nút trong địa phương của một nút cụ thể, ví dụ. – DNA

+0

mmh, nếu bạn có thể nhóm các bản cập nhật trong các giao dịch lớn hơn các giao dịch một, bạn sẽ có hiệu suất tốt một cách khôn ngoan. –

2

Hmm một chút về cách tiếp cận khác, nhưng bạn có thể xem xét sử dụng hệ thống xếp hàng. Tôi cũng đang sử dụng giao diện REST Neo4j và đang xem xét lưu trữ sức mạnh mối quan hệ liên tục thay đổi. Dự án nằm trong Rails và sử dụng Resque. Bất cứ khi nào cập nhật cơ sở dữ liệu Neo4j là bắt buộc, nó được ném vào hàng đợi Resque để được hoàn thành bởi một nhân viên. Tôi chỉ có một nhân viên làm việc trên hàng đợi Neo4j Resque nên nó không bao giờ cố gắng thực hiện nhiều hơn một bản cập nhật Neo4j cùng một lúc.

Điều này có lợi ích bổ sung là không khiến người dùng phải chờ cập nhật neo4j khi họ thực hiện hành động kích hoạt cập nhật. Tuy nhiên, nó chỉ là một giải pháp khả thi nếu bạn không cần phải sử dụng/hiển thị các cập nhật Neo4j ngay lập tức (mặc dù tùy thuộc vào tốc độ của nhân viên của bạn và kích thước của hàng đợi của bạn, nó sẽ chỉ mất một vài giây).

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