2017-06-06 112 views
1

我正在設計一個使用Neo4j的擴展家族樹。 在關係的設計,我想出了兩種方法:Neo4j家族樹關係設計

  1. CREATE (p:Person)-[:PARENT_OF]->(s:Person) CREATE (p:Person)-[:STEPPARENT_OF]->(s:Person) CREATE (p:Person)-[:MARRIED_TO]->(s:Person)

通過這種方法,我對每一種情況下產生不同的關係(請記住,會有很多的情況下=很多關係)

  • CREATE (p:Person)-[r:PARENT_OF {type:'natural'}]->(s:Person) CREATE (p:Person)-[r:PARENT_OF {type:'step'}]->(s:Person) CREATE (p:Person)-[r:SPOUSE_OF {type:'marriage'}]->(s:Person)
  • 用這種方法會減少關係,但設計有點雜亂。

    我想知道哪種方法會更好,爲什麼?

    +0

    你的數據將回答什麼問題? –

    +0

    其中一些可能是: 約翰的父母是誰? 約翰與誰有關? 約翰的孩子是誰? 約翰離婚了嗎? 約翰是否收養了孩子? – Porjaz

    回答

    2

    您選擇beetwen細粒度(:PARENT_OF:STEPPARENT_OF:MARRIED_TO)或通用的關係(:PARENT_OF {type:'natural'}:PARENT_OF {type:'step'}:SPOUSE_OF {type:'marriage'})。

    本書圖形數據庫(在Neo4j的網站avaliable對download)由伊恩·羅賓遜,吉姆·韋伯和埃米爾Eifrém說:

    通過關係名區分是消除 大片的最佳途徑來自遍歷的圖形。使用一個或多個 屬性值來決定是否遵循關係 在首次訪問這些屬性時會導致額外的I/O,因爲 屬性位於 關係的獨立存儲文件中(之後,它們被緩存)。

    請記住,應該針對應用程序需求建立圖形數據庫模型。那就是:它基本上取決於你向數據庫詢問什麼類型的查詢。

    • 如果您需要評估圖橫向查詢中關係的type,可能是將它分割爲分離關係類型的一個好主意。
    • 否則,請將其保留爲通用關係類型的屬性。