2017-02-06 8 views
0

Neo4jで永続化したいC#オブジェクトモデルがあります。各プロジェクトには10​​00〜4000人の子供がいる数十のプロジェクトが含まれています。私は現在公式のC#ドライバを使用していますが、別のものに切り替えることができます。一度にこの1人の子供をすることは、意外にも非効率的です。これは、1つのプロジェクトのために数分かかります: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); 
      } 
     } 

私はサイファーのnoobだけど、私は、私はおそらくUNWINDまたはFOREACHを含むクエリにパラメータとして子供を渡す必要があることを集めるが、どのようにそれは私にははっきりしていませんRun()へのオプションの第2パラメータがDictionaryまたはobject(そのオブジェクトがどのように解釈されるかはわかりません)のいずれかであるため、プログラム的に発生します。 これを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); 
} 
関連する問題