2017-11-17 109 views
0

我得到了20 000個蘋果。優化創建

如何以比這更聰明的方式創建它們?

 foreach (var a in apples) 
     { 
      graphClient.Cypher 
       .Create("(a:Apple {newApple})") 
       .WithParam("newApple", a) 
       .ExecuteWithoutResults(); 
     } 

尋找一種通用的方法來傳遞對象而不指定每個屬性。

class Fruit 
{ 
    [JsonProperty(PropertyName = "Color")] 
    public bool Color { get; set; } 
} 

class Apple : Fruit 
{ 
    [JsonProperty(PropertyName = "Variety")] 
    public String Variety { get; set; } 
} 

回答

2

我想​​是詞典的列表。在這種情況下,以純Cypher支架更優化的查詢應該是這樣的:

UNWIND {apples} AS newApple 
CREATE (a:Apple) 
SET a = newApple 

我還沒有使用的Neo4jClient .NET的lib,但這些方針的東西應該工作:

graphClient.Cypher 
    .Unwind(apples, "newApple") 
    .Create("(a:Apple)") 
    .Set(...) 
    .ExecuteWithoutResults(); 

20K節點可能在單個事務中工作,但實施一些批處理並使用大約幾個批次是很有必要的。 10k個節點。

更新。根據Chris Skardon的建議更新了實施。

備註。在Cypher支架查詢,如果您正在使用的Neo4j 3.2+,您應該切換到new parameter syntax,使用$param樣式參數,所以查詢稍微更易於閱讀:

UNWIND $apples AS newApple 
CREATE (a:Apple) 
SET a = newApple 
+1

有了客戶端,你可以做'放鬆(蘋果,「新蘋果」)'並免除'WithParam'位。 –

+0

Unwind似乎是要走的路,但我不斷收到'Neo4jClient.NeoException:'ParameterNotFoundException:期望一個名爲newApple''的參數,現在看不到爲什麼 – JOG

+0

@JOG我更新了我的答案,使用'SET'而不是它在一個'CREATE'中。 –