2013-02-20 122 views
1

我有一個表存儲在一個典型的MySQL數據庫,我已經使用java構建了一個小的分析器工具來解析並構建neo4j數據庫。該數據庫將有約4000萬個節點,每個節點具有一個或多個邊緣(可能最多有10個邊緣)。問題來自我必須創建特定節點的方式。有一個用戶節點,評論節點和hashtag節點。用戶節點和主題標籤節點必須都是唯一的。我使用的代碼從下面的例子中,以確保其唯一性:插入大量的節點到Neo4J

public Node getOrCreateUserWithUniqueFactory(String username, GraphDatabaseService graphDb) 
{ 
    UniqueFactory<Node> factory = new UniqueFactory.UniqueNodeFactory(graphDb, "users") 
    { 
    @Override 
    protected void initialize(Node created, Map<String, Object> properties) 
    { 
     created.setProperty("name", properties.get("name")); 
    } 
}; 

return factory.getOrCreate("name", username); 

}

我曾想過使用批量插入,但在執行我還沒有看到一個方法來檢查,如果一個節點是獨一無二的批量插入。所以我的問題是什麼是插入所有這些節點的最快方式,同時仍然確保它們保持唯一性。任何幫助將一如既往地不勝感激。

回答

3

如果任何人在這裏運行到這個問題,我想記錄什麼我自己和一位同事能夠弄清楚爲了提高速度。首先一個關於數據或兩注:

  • 有大量的用戶,他們佔
  • 也有大量的井號標籤的節點的大約30%的人會傾向於只哈希不談
  • 這兩個必須保證唯一現在

那這就是出路上的優化。首先,formost需要確保插入循環每次插入節點時完成。有這對於我們來看看這樣intially代碼看起來像這樣(僞代碼)

Transaction begin 
While(record.next()){ 
    parse record 
    create unique user 
    create unique hashtag 
    create comment 
    insert into graph 
} 
Transaction success 
Transaction finish 

雖然這工作確定並完成了相對較快的小型數據集並沒有很好地擴展沒有實際的例子。因此,我們看一看在每一個功能的目的和重構的代碼如下所示:

While(record.next()){ 
    Transaction begin 

    parse record 
    create unique user 
    create unique hashtag 
    create comment 
    insert into graph 

    Transaction success 
    Transaction finish 
} 

這大大加快的事情了,但它是不夠的,我的同事。所以他發現可以在節點屬性上創建Lucene索引,並且我們可以在Unique Node工廠中引用這些索引。這給了我們另一個顯着的提速。以至於我們可以在約10秒內插入1,000,000個節點,而無需使用批處理器。感謝大家的幫助。

+1

「所以他發現Lucene索引可以在節點屬性上創建,我們可以在Unique Node工廠中引用這些索引。」你能解釋一下嗎?我有一個帶索引節點屬性的索引,例如'名稱'並將其用於唯一節點工廠。這是你的意思嗎? – joewhite86 2013-07-17 09:49:20

+0

是的,請!我也想知道這個增加neo4j插入速度的神奇咒語是什麼! :-) – Stewart 2013-08-21 08:41:08

0

爲什麼不在批量插入過程中創建本地緩存?您可以使用java Map和密鑰name和值NodeId(來自批量插入器)。