2015-10-31 2 views
1

При попытке обновить существующий узел в Neo4JClient без использования транзакции, которая имеет уникальное ограничение на Ид и имя свойства, я получаю это исключение:Neo4jClient Transaction Ошибка

CypherExecutionException: Узел-уже существует с меткой Пользователь и свойство «Name» = [Mike]

Но когда я пытаюсь обновить узел в транзакции, я получаю это исключение:

получил неожиданное HTTP-статус при выполнении запроса.

Статус ответ был: 404 Не найдено

ответ от Neo4j был (который может включать в себя полезную деталь!): { "Результаты": [], "ошибки": [{ "код": "Neo .ClientError.Transaction.UnknownId», "сообщение": " Непризнанный идентификатор транзакции транзакция может таймаут и был откат"}]}

Мой код выглядит так:.

using (var transaction = client.BeginTransaction()) 
{ 
    client.Cypher 
     .Merge("(user:User { Id: {id}})") 
     .OnCreate().Set("user = {user}") 
     .OnMatch().Set("user = {user}") 
     .WithParams(new { id = user.Id, user = user }) 
     .ExecuteWithoutResults(); 

    transaction.Commit(); 
} 

Мой вопрос: есть ли способ получить фактическую ошибку при использовании транзакции, как я получаю, когда я не использую транзакцию?

Благодаря

EDIT 1:

Похоже, что Id NULL в не обрабатываются корректно. После сверления мне удалось вытащить реальную ошибку. Первое исключение в это:

errors = {[ 
    { 
    "code": "Neo.ClientError.Statement.InvalidSemantics", 
    "message": "Cannot merge node using null property value for Id" 
    } 
]} 

трассировки стека для этого исключения является:

на Neo4jClient.Serialization.CypherJsonDeserializer 1.GetRootResultInTransaction(JObject root) in [PATH_HIIDEN]\Neo4jClient\Serialization\CypherJsonDeserializer.cs:line 316 at Neo4jClient.Serialization.CypherJsonDeserializer 1.CheckForErrorsInTransactionResponse (содержание строк) в [PATH_HIIDEN] \ Neo4jClient \ \ сериализации CypherJsonDeserializer.cs: строка 291 в Neo4jClient.GraphClient. <> c__DisplayClass84_0 1.<PrepareCypherRequest>b__0(Task 1 responseTask) в [PATH_HIIDEN] \ Neo4jClient \ GraphClient.cs: линия 933 на System.Threading.Tasks.ContinuationResultTaskFromResultTask`2.InnerInvoke() в System.Threading.Tasks.Task.Execute()

И после этого существует исключение с ошибкой 404 NOT Found. Для этого стек трассировки:

на Neo4jClient.Execution.HttpResponseMessageExtensions.EnsureExpectedStatusCode (HttpResponseMessage ответа, String commandDescription, HttpStatusCode [] expectedStatusCodes) в [PATH_HIIDEN] \ Neo4jClient \ Исполнение \ HttpResponseMessageExtensions.cs: строка 41 на Neo4jClient.Execution.HttpResponseMessageExtensions.EnsureExpectedStatusCode (HttpResponseMessage response, HttpStatusCode [] expectedStatusCodes) в [PATH_HIIDEN] \ Neo4jClient \ Execution \ HttpResponseMessageExtensions.cs: строка 14 в Neo4jClient.Execution.ResponseBuilder. <> c__DisplayClass21_0.b__0 (Задача 1 requestTask) in [PATH_HIIDEN]\Neo4jClient\Execution\ResponseBuilder.cs:line 127 at System.Threading.Tasks.ContinuationResultTaskFromResultTask 2.InnerInvoke() в System.Threading.Tasks.Task.Execute()

Возможно, эта ошибка будет исправлена ​​в следующем выпуске, пожалуйста?

РЕДАКТИРОВАТЬ 2

using (var transaction = client.BeginTransaction()) 
{ 
    manifest.Users = client.Cypher 
     .Merge("(n:User { Id: '8be0b8fd-c433-44d3-a7e2-3f0d1a03fefa'}) " + 
      "ON CREATE " + 
      "SET n = { " + 
       "Id: '8be0b8fd-c433-44d3-a7e2-3f0d1a03fefa', " + 
       "UserName: 'test.user', " + 
       "Name: 'Test User', " + 
       "Active: true " + 
      "} " + 
      "ON MATCH " + 
      "SET n = { " + 
       "Id: '8be0b8fd-c433-44d3-a7e2-3f0d1a03fefa', " + 
       "UserName: 'test.user', " + 
       "Name: 'Test User', " + 
       "Active: true " + 
      "}") 
     .Return(n => n.As<User>()) 
     .Results 
     .ToList(); 
    transaction.Commit(); 
} 

Значение свободно Api вызывает ошибку.

+0

Привет, huber - это разные ошибки - вы прорываете в своем коде Tx? Когда я бегу в Tx, я получаю ту же ошибку обратно .... ?? –

+0

Вы правы, Крис, я редактировал свой пост, см. «Редактировать 1» и дайте свои комментарии. –

+0

Для всех, кто следует за этим, см. Https://github.com/Readify/Neo4jClient/issues/127 –

ответ

0

Таким образом, проблема заключается в том, что в Neo4j 2.2.6 было внесено изменение, посредством которого любое ClientError (Нарушение ограничений и т. Д.) Привело к автоматическому откату транзакции на сервере.

Neo4jClient уже сделал автоматический откат при ошибке и продолжал это делать. В результате 2.2.6 это привело к ошибке 404, поскольку транзакция больше не была (предыдущие версии были прекрасными).

Итак, я исправился и опубликовал обновленный пакет Nuget, поэтому версия 1.1.0.12 от Neo4jClient теперь даст вам правильный ответ.

+0

Спасибо Крис. Это исправлено. –

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