2016-05-10 43 views
1

有沒有人使用紅寶石neo4j-core來批量處理數據?具體來說,我在看從關係數據庫採取在500K左右線,並通過類似於插入它們:紅寶石neo4j核心批量處理數據

Neo4j::Session.current.transaction.query 
      .merge(m: { Person: { token: person_token} }) 
      .merge(i: { IpAddress: { address: ip, country: country, 
             city: city, state: state } }) 
      .merge(a: { UserToken: { token: token } }) 
      .merge(r: { Referrer: { url: referrer } }) 
      .merge(c: { Country: { name: country } }) 
      .break # This will make sure the query is not reordered 
      .create_unique("m-[:ACCESSED_FROM]->i") 
      .create_unique("m-[:ACCESSED_FROM]->a") 
      .create_unique("m-[:ACCESSED_FROM]->r") 
      .create_unique("a-[:ACCESSED_FROM]->i") 
      .create_unique("a-[:ACCESSED_FROM]->r") 
      .create_unique("i-[:IN]->c") 
      .exec 

但是這樣做在本地花費小時數十萬的事件。到目前爲止,我已經嘗試過以下幾種:

  • 包裝Neo4j :: ConnectionPool中的連接和多線程 - 我在這裏沒有看到很多速度的改進。
  • tx = Neo4j::Transaction.newtx.close每1000個事件處理 - 看着一個TCP轉儲,我不確定這實際上做我的預期。它以相同的頻率完成相同的請求,但只是具有不同的響應。

用的Neo4j ::交易我看到一個貼子每次.query(...).exec被稱爲時間:

  • 請求:{"statements":[{"statement":"MERGE (m:{token: {m_Person_token}}) ...{"m_Person_token":"AAA"...,"resultDataContents":["row","REST"]}]}
  • 響應:{"commit":"http://localhost:7474/db/data/transaction/868/commit","results":[{"columns":[],"data":[]}],"transaction":{"expires":"Tue, 10 May 2016 23:19:25 +0000"},"errors":[]}

隨着非Neo4j的: :交易我看到相同的POST頻率,但是這個數據:

  • 請求:{"query":"MERGE (m:{token: {m_Person_token}}) ... {"m_Person_token":"AAA"..."c_Country_name":"United States"}}
  • 響應:{"columns" : [ ], "data" : [ ]}

(不知道這是預期的行爲,但它看起來像較少的數據通過非Neo4j的傳輸::交易技術 - 高度可能是我我做錯了什麼)

我有一些其他的想法: *後處理成CSV,SCP up,然後使用neo4j-import命令行實用程序(雖然,這似乎有點hacky)。 *結合我上面嘗試的兩種技巧。

有沒有其他人遇到這個/有其他建議嗎?

回答

1

好的!

所以你是絕對正確的。使用neo4j-core,您一次只能發送一個查詢。通過交易,您真正獲得的是回滾的能力。 Neo4j確實有一個很好的HTTP JSON API用於事務,它允許你在同一個HTTP請求中發送多個Cypher請求,但neo4j-core目前不支持(我正在爲下一個主要版本做一個重構,這將允許這個) 。因此有多種選擇:

  • 您可以通過原始HTTP JSON將請求提交給API。如果你仍然想使用Query API,您可以使用to_cyphermerge_params方法來獲取該Cypher支架,而params(merge_params目前是私有方法,所以你需要send(:merge_params)
  • 您可以通過CSV作爲加載你說。您可以
    • 使用neo4j-import命令,它允許你導入非常快,但需要你把你的CSV以特定的格式,要求你必須從頭開始建立一個數據庫,並要求您創建索引/事實上的約束
    • 使用LOAD CSV命令,它不那麼快,但仍然非常快。
  • 您可以使用neo4apis創建一個DSL來導入您的數據。寶石將在封面下創建Cypher查詢,並將其批量進行性能測試。看到它使用了寶石的例子通過neo4apis-twitterneo4apis-github
  • 如果你是一個有點冒險,你可以在GitHub庫通過new_cypher_api分公司使用新的API Cypher支架在neo4j-core。該分支中的README有關於API的一些文檔,但如果您對此或其他任何問題有任何疑問,請隨時通過我們的Gitter chat room下載。

如果您正在實施這將會使查詢,如上述,如果有多個MERGE條款的解決方案,你可能會想配置您的查詢,以確保您的avoiding the eager(該職位是有點Neo4j的老和新版本緩解了一些需要照顧,但你仍然可以尋找EagerPROFILE

也值得一看:最大德Marzi的崗位上Scaling Cypher Writes