При попытке обновить существующий узел в 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_01.<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 вызывает ошибку.
Привет, huber - это разные ошибки - вы прорываете в своем коде Tx? Когда я бегу в Tx, я получаю ту же ошибку обратно .... ?? –
Вы правы, Крис, я редактировал свой пост, см. «Редактировать 1» и дайте свои комментарии. –
Для всех, кто следует за этим, см. Https://github.com/Readify/Neo4jClient/issues/127 –