2013-03-11 126 views
1

數據以300-500 TPS的速率連續進入系統。我需要導入其與下面的方案來的Neo4j:Neo4j有條件批量導入

  1. 如果N節點不存在,則創建它
  2. 如果該關係N- [REL:rel_type] - > X不存在,則創建
  3. 遞增相對權重

使用REST批處理似乎不可能解決問題。 不同的密碼查詢太長,因爲它們產生很多小事務。

Gremlin的工作速度更快。我爲數組中的gremlin腳本收集參數並將其作爲批處理執行。但即使我幾乎無法達到300 TPS的速度。

我應該指出,除了將有疑問的流動〜500個TPS:

START N=node(...) MATCH N-[rel:rel_type]->X return rel.weight,X.name; 

堆大小設置爲5 GB。附加選項:

-XX:MaxPermSize=1G -XX:+CMSClassUnloadingEnabled -XX:+UseParallelGC -XX:+UseNUMA 

導入此類數據的最佳方式和配置是什麼?

+0

您是否嘗試過使用沒有使用密碼或gremlin的REST批次插入?該批處理在單個事務上運行,並且我獲得了相當不錯的性能(特別是在插入的進程與db在同一個框中時) – RaduK 2013-03-11 10:08:12

回答

3

要檢查傳入節點是否存在並且已將rels傳遞給其他節點,可以使用create unique syntax。

START n=node:node_index(newNode={N}) 
CREATE UNIQUE n-[:REL_TYPE]->x ; 

自動遞增的關係的重量,我會假設是這樣的(但沒有這方面的保證,有可能是這樣做的一個更快的方法):

START n=node:node_index(newNode={N}) 
CREATE UNIQUE n-[rel:REL_TYPE]->x 
SET rel.weight = coalesce(rel.weight?,0) +1 
+0

問題是REST API在查詢/交易。這種方法不能保證我所需要的速度。 – maxvgi 2013-03-11 08:22:02

+1

是的,以上是2個不同的查詢。這並不意味着一次使用它們。第二個查詢也包含第一個查詢(雖然我沒有檢查它,所以它可能彈出一些語法錯誤)。 – ulkas 2013-03-11 08:24:13

+3

事實並非如此,Batch-REST-API接受盡可能多的密碼語句。 http://docs.neo4j.org/chunked/milestone/rest-api-batch-ops.html我的表現很不錯。確保使用參數。 – 2013-03-11 14:01:09