2013-03-16 122 views
1

我想了解noSQL數據庫的想法,更準確地說,neo4j圖形數據庫背後的概念。我有SQL數據庫(MySQL,MS SQL)的經驗,但管理分層數據的侷限性使我擴展了我的知識。但現在我有一些問題,我找不到他們的答案(也許我不知道要搜索什麼)。對象數據庫介紹

想象一下,我們有世界上的國家的名單。每個國家每年都有GDP。每個國家的GDP均由不同來源計算 - 世界銀行,其政府,中央情報局等。在這種情況下組織數據的最佳方式是什麼?

裏面傳來記住最簡單的事情是讓節點(該值是虛構的)

China: 
    GDPByWorldBank2012: 999, 
    GDPByCIA2011: 994, 
    GDPByGovernment2012: 1102, 

在關係數據庫中,我將在三個表分割數據:國家,來源和值,在那裏價值我會有國內生產總值的價值,年份,國家的id和來源的id。

其他想到的事情是創建節點中央情報局,世界銀行,但節點政府看起來很奇怪。雖然,這個想法是有關係(valueIfGDP):

CIA -> valueOfGDP - {year: 2011, value: 994} -> China 
World Bank -> valueOfGDP - {year: 2012, value: 999} -> China 

這看起來對我來說很奇怪,更重要的是,當我們從一個源中的所有年增加值時會發生什麼?我們會有多重關係或什麼?

對不起,如果我的問題太愚蠢了,我會很高興,如果有人解釋我或告訴我什麼書/文章閱讀。

在此先感謝。 :)

回答

3

你的問題是非常合法的,你是不是遇到困難,首先要把握圖​​形建模是唯一一個;)

它總是更容易開始思考問題,你用你之前想的數據回答在前面進行建模。

讓我們想象一下你想要檢索由所有國家的CIA計算的2012年GDP。

實現此目的的一種簡單方法是統一標記國家/地區節點,並設置明顯取決於國家/地區名稱的屬性名稱。

此外,中央情報局/世界銀行/政府在這個領域都是「來源」,讓我們也統一標籤。

例如,可能會看到這樣的信息:

(ORGANIZATION {name: CIA})-[:HAS_COMPUTED_GDP {year:2011, value:994}]->(COUNTRY {name:China}) 

隨着Cypher支架查詢語言,使用這種模型,可以執行下列查詢:

START cia = node:nodes(name = "CIA") 
MATCH cia-[gdp:HAS_COMPUTED_GDP]->(country) 
WHERE gdp.year = 2012 
RETURN cia, country, gdp 

在此查詢中,我用了一個索引查找作爲起點(而不是ID不應該使用的內部技術概念)來檢索CIA並按照相關子圖最終返回CIA,GDP關係及其與輸入約束匹配的鏈接國家。

儘管Neo4J完全是無模式的,但這並不意味着您應該有一個完全靈活的數據模型。有一個小結構總是有助於使查詢或遍歷更易於閱讀。

如果你不熟悉的Cypher查詢語言(這是來讀取或寫入數據到圖形的唯一方式),看看Neo4j的(Cypher支架的優秀文檔:http://docs.neo4j.org/chunked/stable/cypher-query-lang.html,完整:http://docs.neo4j.org/chunked/stable/index.html )並嘗試一些查詢:http://console.neo4j.org/

要回答你的第二個問題,如果你想再增加一年的GDP計算,這隻會歸結爲在組織和國家之間增加新的關係「HAS_COMPUTED_GDP」,沒有更多。

希望它有幫助:)

+0

非常感謝你的非常描述性的答案。還有一個問題 - 如果我們擴大我們的中國範例並向鄰國添加數據,可以說俄羅斯,我想我必須在中國和俄羅斯之間建立外向和即將到來的關係:HAS_BORDER_COUNTRY {borderLength:1000}?有什麼更好的 - 在中國的節點上擁有totalBorderLength屬性,還是總結HAS_BORDER_COUNTRY關係的borderLength屬性會更好?我應該花更多時間玩數據庫,以便更好地理解它。 – suricactus 2013-03-17 18:19:19

+0

不客氣:) 再說一遍,如果不考慮用例,這有點難說。從你所描述的,我的2美分會去總結borderLength。 – Rolf 2013-03-17 19:52:11