摘自: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中,遍歷關系的任何一個方向所需的時間是相同的。進一步說,方向可以被完全忽略。因此,當單向的關系可以同時代表另一個方向的關系的時候,沒有必要同時創建兩個方向的關系。