2017-02-06 3 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); 
      } 
     } 

Я Cypher нуб, но я понимаю, что я, вероятно, следует передать детям в качестве параметров запроса, включающего UNWIND или FOREACH, но это мне не ясно, как этот будет происходить программно, так как необязательный второй параметр равен Run() либо Dictionary, либо object (непонятно, как этот объект будет интерпретироваться). Итак, как это сделать эффективно с C#?

+0

Где определена переменная 'neoId'? –

+0

'neoId' длинный. Код - всего лишь фрагмент, чтобы дать представление о том, чего я хочу достичь. Не задано '' '' '' '' '' '' '' '. –

ответ

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); 
}