2016-10-28 4 views
1

Я начал использовать базу данных Neo4j несколько дней назад, и в итоге у меня возникла проблема, которую я не понимаю с помощью драйвера .NET. У меня есть следующий код:Обработка ошибок драйвера Neo4j .NET

using (var driver = GraphDatabase.Driver("bolt://localhost", AuthTokens.Basic("neo4j", "neo4j"))) 
using (var session = driver.Session()) 
{ 
    foreach(...) 
     { 
     // Build cypher query 
     string cypher_query = "..."; 

     try 
     { 
      session.Run(cypher_query).Consume(); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine("Failed running query : " + cypher_query + "\r\n" + e.Message); 
     } 
    } 
} 

мне нужно пробежать много шифровальщика запроса (все MERGE запросы) внутри цикла Еогеасп. Моя проблема в том, что все запросы не удались после первого исключения.

Когда я смотрю, что отображается на консоли, переменная cypher_query содержит правильную вещь и изменяется на каждой итерации, но сообщение об исключении остается неизменным.

Когда я отлаживаю, у меня возникает ощущение, что запрос выполнен правильно, но мы все равно выполняем предложение catch.

Любая идея о том, что может произойти здесь?

+0

Вы не указали t он исключение. Измените свой вопрос, чтобы включить его. –

+0

Я изменил свой код, чтобы он работал сейчас, и я не помню, что было исключением. Это не так хорошо, как решение, так как я убираю и воссоздаю сеанс в предложении catch, чтобы он мог продолжить. К сожалению, мой проект приостановлен на данный момент, и я не могу работать над этим, на случай, если я смогу продолжить, я снова опубликую, чтобы найти лучшее решение. Благодарю. – user1923976

ответ

1

Я понимаю, что это устарело, но причина в том, что исключение приводит к тому, что сеанс переходит в недопустимое состояние.

Этот код выполняется, чтобы показать проблему, первый метод обертка:

public static void ExecuteCypher(IDriver driver, ISession session, string cypher, bool createNewSessionOnException = true) 
{ 
    try 
    { 
     //Attempt to run the cypher... 
     session.Run(cypher).Consume(); 
    } 
    catch (Exception e) 
    { 
     //Write out error caught 
     Debug.WriteLine("Caught Exception: {0}", e.ToString()); 

     //If we should create a new session 
     if (createNewSessionOnException) 
     { 
      //first clear up the old one 
      session.Dispose(); 

      //Create new one 
      Console.WriteLine("New Session"); 
      session = driver.Session(); 
     } 
    } 
} 

Что вы называете, как:

using (var driver = GraphDatabase.Driver("bolt://localhost", AuthTokens.Basic("neo4j", "neo4j"))) 
{ 
    var session = driver.Session(); 
    ExecuteCypher(driver, session, "Broken Cypher"); 
    ExecuteCypher(driver, session, "Match (x) RETURN count(x)"); 
    session.Dispose(); 
}  

Какой будет работать, но если вы измените его, чтобы он оленья кожа Вы создадите новую сессию, вы получите исключение:

using (var driver = GraphDatabase.Driver("bolt://localhost", AuthTokens.Basic("neo4j", "neo4j"))) 
{ 
    var session = driver.Session(); 
    ExecuteCypher(driver, session, "Broken Cypher", false); //<-- here 
    ExecuteCypher(driver, session, "Match (x) RETURN count(x)"); 
    session.Dispose(); 
}  
+0

Просто для добавления - с предварительной версией (1.1x) вы можете просто просто вызвать 'session.Reset()', чтобы обойти это :) –

+0

Большое спасибо за этот ответ, помните об этом. Вопрос в том, почему сеанс переходит в недопустимое состояние после исключения :-) – user1923976

+0

Я думаю, что более того, драйвер в 1.0 не признает исключение, и пока это не произойдет, сервер будет продолжать пытаться отправить его клиенту несмотря на. –

Смежные вопросы