2017-02-06 112 views
0

我有一個C#對象模型,我想堅持與Neo4j。它包含數十個項目,每個項目有1000-4000個孩子。我目前使用官方的C#驅動程序,但我可以切換到別的東西。毫不奇怪,一次做這個小孩效率不高。這需要幾分鐘的一個項目:如何創建許多節點和與Neo4j.Driver.V1的關係

 foreach (var service in project.Services) 
     { 
      using (var session = _driver.Session()) 
      { 
       var query = "MATCH (p:Project) WHERE ID(p) = " + neoId + 
          " CREATE (ds:Service {name:\"" + service.Name + 
          "\"})<-[:HAS_SERVICE]-(p)"; 
       var result = session.Run(query); 
      } 
     } 

我是一個暗號小白,但據我瞭解,我也許應該通過孩子作爲參數涉及UNWINDFOREACH查詢,但它不是很清楚,我怎麼說將以編程方式發生,因爲Run()的可選第二參數是Dictionaryobject(不清楚該對象將如何解釋)。 那麼,如何從C#高效地執行此操作?

+0

變量'neoId'是在哪裏定義的? –

+0

'neoId'很長。代碼只是一個片段,給我一個想法,我想完成。沒有定義'project'或'_driver'。 –

回答

2

1)首先,您需要創建一個包含服務名稱數組的字典。

2)內部查詢使用UNWIND展開它們。

var servicesNames_ = new List<string>(); 
foreach (var service in project.Services) 
{ 
    servicesNames_.Add(service.Name); 
} 
var servicesName = servicesNames_.ToArray(); 

var params = new Dictionary<string, object> { 
    {"services", servicesName}, 
    {"neoId", neoId} 
}; 

using (var session = _driver.Session()) 
{ 
    var query = "WITH {neoId} as neoId, {services} as services " + 
       "MATCH (p:Project) WHERE ID(p) = {neoId} " + 
       "UNWIND services as serviceName " + 
       "CREATE (ds:Service {name: serviceName})<-[:HAS_SERVICE]-(p) "; 
    var result = session.Run(query, params); 
}