Neo4j數據建模優化:雙向關系

摘自:http://blog.csdn.net/hwz2311245/article/details/54602706
我們通常會將現實生活中的關系型數據,通過一定的方式,轉化為圖形化的結構存儲起來。盡管圖形化的結構相比于表結構更加直觀,但也存在一些常見的誤區。在這篇博文中,我們來討論其中的一個容易讓人混淆的概念:雙向關系。
單向關系
在Neo4j中,所有的關系都必須有一個類型來進行區分,同時,也必須有一個方向。通常來說,關系的方向同樣會包含一些信息。換句話來說,如果沒有方向,一些關系的意義就會變得模糊。打個比方,下面的圖結構表明了在冰球比賽中,Czech Republic隊擊敗了Sweden。假如這個關系的方向反過來,那么就意味著Sweden勝利了。如果沒有任何方向,那么這個關系的意義就變得很模糊了,因為沒有辦法區分出到底是哪個隊獲勝了。

這里寫圖片描述

可以發現,在這里,一個單向的關系同時也表明了一個反向關系的存在,正如下一張圖所示。通常情況下都是如此。再打個比方:昆汀·塔倫蒂諾導演了《低俗小說》,同時也意味著《低俗小說》的導演是昆汀·塔倫蒂諾。
這里寫圖片描述

在設計這類模型的時候,同時創建兩個方向的關系是一個常見的錯誤。因為一個關系可以同時意味著另一個關系,因此,不論在空間還是遍歷時間上,這都是一種浪費。Neo4j可以在任何方向上進行遍歷。更重要的是,Neo4j存儲數據的方式,使得遍歷的速度和關系的方向沒有任何關系。
雙向關系
有一些關系在設計上就是雙向的。一個很典型的例子就是Fackbook或者現實生活中的朋友關系。這種關系是相互的:當某個人是你的朋友,你也是他的朋友。根據我們對模型理解的不同,也可以說這種關系是無向的。
GraphAware和Neo Technology是合作公司。因為這是一個相互的關系,我們可以分別構建雙向或者無向的關系模型。
這里寫圖片描述

但是,因為Neo4j并不支持雙向或者無向的關系,初學者往往會構造出下面這樣的結構來。這和上述冰球的模型犯了同樣的錯誤:多了一種不需要的關系。
這里寫圖片描述

Neo4j的API允許開發人員在查詢的時候完全忽略關系的方向。比如,在Neo4j的查詢語言Cypher中,查詢Neo Technology的全部合作公司的語句可以大致如下:
MATCH (neo)-[:PARTNER]-(partner)

查詢結果會和下面兩條語句執行并合并后的結果完全一致:
MATCH (neo)-[:PARTNER]->(partner)
and MATCH (neo)<-[:PARTNER]-(partner)

因此,構建合作關系正確(至少是最有效)的方式就是用一個單向的關系,而且方向可以任意

這里寫圖片描述

結論
在Neo4j中,遍歷關系的任何一個方向所需的時間是相同的。進一步說,方向可以被完全忽略。因此,當單向的關系可以同時代表另一個方向的關系的時候,沒有必要同時創建兩個方向的關系。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1: 本地存儲方式2: 內置查詢語言分析3: 性能分析4: 圖算法支持 本地存儲方式 Neo4J neo4j數據庫...
    YOTOY閱讀 29,086評論 2 22
  • 1 序 2016年6月25日夜,帝都,天下著大雨,拖著行李箱和同學在校門口照了最后一張合照,搬離寢室打車去了提前租...
    RichardJieChen閱讀 5,165評論 0 12
  • 佳佳媽一到睡覺就焦慮,就因為晚上要給5歲的佳佳講睡前故事。 在佳佳一歲多的時候,佳佳媽從育兒專家和周圍家長哪里了解...
    愛家心理閱讀 348評論 0 1
  • 時光總會讓你成長 慢慢你明白當初看不清的過不去的坎現在都不算什么 那些你認為無法放下的事情 也終會被溫暖填滿 人生...
    穩襲藥閱讀 186評論 0 0
  • 程序員,對很多人來說,其生活方式都是神秘的,甚至可以說程序員都是不善于表達卻擁有非凡技能的一類人,在這行業中,我們...
    ewfeqf閱讀 350評論 0 1