2011-09-24 61 views
18

Tôi có một câu hỏi chung về mô hình hóa trong một cơ sở dữ liệu đồ thị mà tôi dường như không thể quấn quanh đầu.Làm thế nào để mô hình hóa các mối quan hệ trong thế giới thực trong một cơ sở dữ liệu đồ thị (như Neo4j)?

Làm cách nào để bạn mô hình loại mối quan hệ này: "Newton đã phát minh ra tích phân"?

Trong một simple graph, bạn có thể mô hình nó như thế này:

Newton (node) -> invented (relationship) -> Calculus (node) 

... vì vậy bạn muốn có một loạt các "phát minh" mối quan hệ đồ thị khi bạn mở thêm nhiều người và phát minh.

Vấn đề là, bạn bắt đầu cần phải thêm một loạt các tính tới mối quan hệ:

  • invention_date
  • influential_concepts
  • influential_people
  • books_inventor_wrote

... và bạn sẽ muốn bắt đầu tạo mối quan hệ giữa các thuộc tính đó và các nút khác, chẳng hạn như:

  • influential_people: mối quan hệ với người các nút
  • books_inventor_wrote: mối quan hệ để đặt các nút

Vì vậy, bây giờ nó có vẻ như "mối quan hệ thực tế" ("phát minh") thực sự phải là một nút trong biểu đồ và biểu đồ sẽ trông giống như sau:

Newton (node) -> (relationship) -> Invention of Calculus (node) -> (relationship) -> Calculus (node) 

Và để làm phức tạp hơn nữa, những người khác cũng tham gia vào việc phát minh Calculus, vì vậy đồ thị bây giờ trở thành một cái gì đó như:

Newton (node) -> 
    (relationship) -> 
    Newton's Calculus Invention (node) -> 
     (relationship) -> 
     Invention of Calculus (node) -> 
      (relationship) -> 
      Calculus (node) 
Leibniz (node) -> 
    (relationship) -> 
    Leibniz's Calculus Invention (node) -> 
     (relationship) -> 
     Invention of Calculus (node) -> 
      (relationship) -> 
      Calculus (node) 

Vì vậy, tôi đặt câu hỏi vì nó có vẻ như bạn không muốn thiết lập các thuộc tính trên cơ sở dữ liệu đồ thị thực tế "mối quan hệ" đối tượng, bởi vì bạn có thể muốn xem xét một số điểm coi chúng là các nút trong biểu đồ.

Điều này có đúng không?

Tôi đã nghiên cứu Freebase Metaweb Architecture và dường như chúng đang xử lý mọi thứ dưới dạng nút. Ví dụ: Freebase có ý tưởng là Mediator/CVT, nơi bạn có thể tạo nút "Hiệu suất" liên kết nút "Diễn viên" với nút "Phim", như ở đây: http://www.freebase.com/edit/topic/en/the_last_samurai. Không hoàn toàn chắc chắn nếu điều này là cùng một vấn đề mặc dù.

Một số nguyên tắc hướng dẫn bạn sử dụng để tìm hiểu xem "mối quan hệ trong thế giới thực" có thực sự là nút đồ thị thay vì mối quan hệ đồ thị không?

Nếu có bất kỳ sách hay nào về chủ đề này, tôi rất muốn biết. Cảm ơn!

Trả lời

18

Một số thứ này, chẳng hạn như invention_date, có thể được lưu trữ dưới dạng thuộc tính trên các cạnh như trong hầu hết các cơ sở dữ liệu biểu đồ cạnh có thể có thuộc tính giống như cách mà đỉnh có thể có thuộc tính.Ví dụ bạn có thể làm một cái gì đó như thế này (mã sau TinkerPop's Blueprints):

Graph graph = new Neo4jGraph("/tmp/my_graph"); 
Vertex newton = graph.addVertex(null); 
newton.setProperty("given_name", "Isaac"); 
newton.setProperty("surname", "Newton"); 
newton.setProperty("birth_year", 1643); // use Gregorian dates... 
newton.setProperty("type", "PERSON"); 

Vertex calculus = graph.addVertex(null); 
calculus.setProperty("type", "KNOWLEDGE"); 

Edge newton_calculus = graph.addEdge(null, newton, calculus, "DISCOVERED"); 
newton_calculus.setProperty("year", 1666); 

Bây giờ, cho phép mở rộng nó một chút và thêm vào Liebniz:

Vertex liebniz = graph.addVertex(null); 
liebniz.setProperty("given_name", "Gottfried"); 
liebniz.setProperty("surnam", "Liebniz"); 
liebniz.setProperty("birth_year", "1646"); 
liebniz.setProperty("type", "PERSON"); 

Edge liebniz_calculus = graph.addEdge(null, liebniz, calculus, "DISCOVERED"); 
liebniz_calculus.setProperty("year", 1674); 

Thêm trong cuốn sách:

Vertex principia = graph.addVertex(null); 
principia.setProperty("title", "Philosophiæ Naturalis Principia Mathematica"); 
principia.setProperty("year_first_published", 1687); 
Edge newton_principia = graph.addEdge(null, newton, principia, "AUTHOR"); 
Edge principia_calculus = graph.addEdge(null, principia, calculus, "SUBJECT"); 

Để tìm hiểu tất cả các cuốn sách mà Newton đã viết về những điều ông phát hiện ra chúng tôi có thể xây dựng một bản đồ truyền tải. Chúng tôi bắt đầu với Newton, theo các liên kết từ anh ta đến những thứ anh ta phát hiện, sau đó đi qua các liên kết ngược lại để có được sách về chủ đề đó và một lần nữa đi ngược lại trên một liên kết để có được tác giả. Nếu tác giả là Newton sau đó quay trở lại cuốn sách và trả lại kết quả. Truy vấn này được viết bằng Gremlin, một miền Groovy dựa ngôn ngữ cụ thể cho thuật toán duyệt đồ thị:

newton.out("DISCOVERED").in("SUBJECT").as("book").in("AUTHOR").filter{it == newton}.back("book").title.unique() 

Vì vậy, tôi hy vọng tôi đã thể hiện một chút làm thế nào một traversal thông minh có thể được sử dụng để tránh các vấn đề với việc tạo ra các nút trung gian đại diện cạnh. Trong một cơ sở dữ liệu nhỏ nó sẽ không quan trọng nhiều, nhưng trong một cơ sở dữ liệu lớn, bạn sẽ bị ảnh hưởng lớn với việc thực hiện điều đó.

Có, bạn không thể kết hợp các cạnh với các cạnh khác trong biểu đồ, nhưng đó là giới hạn của cấu trúc dữ liệu của các cơ sở dữ liệu này. Đôi khi nó có ý nghĩa để làm cho tất cả mọi thứ một nút, ví dụ, trong Mediator/CVT một hiệu suất có một chút cụ thể hơn nó quá. Các cá nhân có thể chỉ muốn nói đến diễn xuất của Tom Cruise trong "The Last Samurai" trong một bài đánh giá. Tuy nhiên, đối với hầu hết các cơ sở dữ liệu đồ thị tôi đã tìm thấy rằng ứng dụng của một số traversals đồ thị có thể giúp tôi có được những gì tôi muốn ra khỏi cơ sở dữ liệu.

+0

câu trả lời xuất sắc! điều này thực sự xóa mọi thứ cho tôi, cảm ơn bạn. –

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