摘自:http://blog.csdn.net/hwz2311245/article/details/54602706
我們通常會(huì)將現(xiàn)實(shí)生活中的關(guān)系型數(shù)據(jù),通過(guò)一定的方式嚎卫,轉(zhuǎn)化為圖形化的結(jié)構(gòu)存儲(chǔ)起來(lái)。盡管圖形化的結(jié)構(gòu)相比于表結(jié)構(gòu)更加直觀炕淮,但也存在一些常見(jiàn)的誤區(qū)鉴竭。在這篇博文中,我們來(lái)討論其中的一個(gè)容易讓人混淆的概念:雙向關(guān)系循未。
單向關(guān)系
在Neo4j中陷猫,所有的關(guān)系都必須有一個(gè)類型來(lái)進(jìn)行區(qū)分,同時(shí)的妖,也必須有一個(gè)方向绣檬。通常來(lái)說(shuō),關(guān)系的方向同樣會(huì)包含一些信息嫂粟。換句話來(lái)說(shuō)娇未,如果沒(méi)有方向,一些關(guān)系的意義就會(huì)變得模糊赋元。打個(gè)比方忘蟹,下面的圖結(jié)構(gòu)表明了在冰球比賽中,Czech Republic隊(duì)擊敗了Sweden搁凸。假如這個(gè)關(guān)系的方向反過(guò)來(lái)媚值,那么就意味著Sweden勝利了。如果沒(méi)有任何方向护糖,那么這個(gè)關(guān)系的意義就變得很模糊了褥芒,因?yàn)闆](méi)有辦法區(qū)分出到底是哪個(gè)隊(duì)獲勝了。
可以發(fā)現(xiàn),在這里锰扶,一個(gè)單向的關(guān)系同時(shí)也表明了一個(gè)反向關(guān)系的存在献酗,正如下一張圖所示蚕脏。通常情況下都是如此撩荣。再打個(gè)比方:昆汀·塔倫蒂諾導(dǎo)演了《低俗小說(shuō)》腌逢,同時(shí)也意味著《低俗小說(shuō)》的導(dǎo)演是昆汀·塔倫蒂諾斯撮。
在設(shè)計(jì)這類模型的時(shí)候固耘,同時(shí)創(chuàng)建兩個(gè)方向的關(guān)系是一個(gè)常見(jiàn)的錯(cuò)誤柱查。因?yàn)橐粋€(gè)關(guān)系可以同時(shí)意味著另一個(gè)關(guān)系祸憋,因此仆葡,不論在空間還是遍歷時(shí)間上蹂楣,這都是一種浪費(fèi)俏站。Neo4j可以在任何方向上進(jìn)行遍歷。更重要的是痊土,Neo4j存儲(chǔ)數(shù)據(jù)的方式肄扎,使得遍歷的速度和關(guān)系的方向沒(méi)有任何關(guān)系。
雙向關(guān)系
有一些關(guān)系在設(shè)計(jì)上就是雙向的赁酝。一個(gè)很典型的例子就是Fackbook或者現(xiàn)實(shí)生活中的朋友關(guān)系犯祠。這種關(guān)系是相互的:當(dāng)某個(gè)人是你的朋友,你也是他的朋友赞哗。根據(jù)我們對(duì)模型理解的不同雷则,也可以說(shuō)這種關(guān)系是無(wú)向的。
GraphAware和Neo Technology是合作公司肪笋。因?yàn)檫@是一個(gè)相互的關(guān)系月劈,我們可以分別構(gòu)建雙向或者無(wú)向的關(guān)系模型。
但是藤乙,因?yàn)镹eo4j并不支持雙向或者無(wú)向的關(guān)系猜揪,初學(xué)者往往會(huì)構(gòu)造出下面這樣的結(jié)構(gòu)來(lái)。這和上述冰球的模型犯了同樣的錯(cuò)誤:多了一種不需要的關(guān)系坛梁。
Neo4j的API允許開(kāi)發(fā)人員在查詢的時(shí)候完全忽略關(guān)系的方向而姐。比如,在Neo4j的查詢語(yǔ)言Cypher中划咐,查詢Neo Technology的全部合作公司的語(yǔ)句可以大致如下:
MATCH (neo)-[:PARTNER]-(partner)
查詢結(jié)果會(huì)和下面兩條語(yǔ)句執(zhí)行并合并后的結(jié)果完全一致:
MATCH (neo)-[:PARTNER]->(partner)
and MATCH (neo)<-[:PARTNER]-(partner)
因此拴念,構(gòu)建合作關(guān)系正確(至少是最有效)的方式就是用一個(gè)單向的關(guān)系,而且方向可以任意褐缠。
結(jié)論
在Neo4j中政鼠,遍歷關(guān)系的任何一個(gè)方向所需的時(shí)間是相同的。進(jìn)一步說(shuō)队魏,方向可以被完全忽略公般。因此,當(dāng)單向的關(guān)系可以同時(shí)代表另一個(gè)方向的關(guān)系的時(shí)候,沒(méi)有必要同時(shí)創(chuàng)建兩個(gè)方向的關(guān)系官帘。