【问题标题】:Neo4jClient Transaction ErrorNeo4jClient 事务错误
【发布时间】:2015-10-31 02:22:00
【问题描述】:

当我尝试在不使用事务的情况下更新 Neo4JClient 中的现有节点时,该节点对 Id 和 Name 属性具有唯一约束,我收到此异常:

CypherExecutionException:节点 6 已经存在,标签为 User 和属性“Name”=[Mike]

但是当我尝试更新事务中的节点时,我收到了这个异常:

执行请求时收到意外的 HTTP 状态。

响应状态为:404 Not Found

Neo4j 的响应(可能包含有用的细节!)是:{"results":[],"errors":[{"code":"Neo.ClientError.Transaction.UnknownId","message":"无法识别的事务 ID。事务可能已超时并已回滚。"}]}

我的代码是这样的:

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

我的问题是:有没有办法在使用事务时得到实际错误,就像我在不使用事务时得到的一样?

谢谢

编辑 1:

看起来 NULL Id 没有被正确处理。向下钻取后,我设法提取了实际错误。第一个例外是:

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

此异常的堆栈跟踪是:

在 [PATH_HIIDEN]\Neo4jClient\Serialization\CypherJsonDeserializer.cs:line 291 中的 Neo4jClient.Serialization.CypherJsonDeserializer1.GetRootResultInTransaction(JObject root) in [PATH_HIIDEN]\Neo4jClient\Serialization\CypherJsonDeserializer.cs:line 316 at Neo4jClient.Serialization.CypherJsonDeserializer1.CheckForErrorsInTransactionResponse(字符串内容) 在 Neo4jClient.GraphClient.c__DisplayClass84_01.<PrepareCypherRequest>b__0(Task1 responseTask) 在 [PATH_HIIDEN]\Neo4jClient\GraphClient.cs:line 933 在 System.Threading.Tasks.ContinuationResultTaskFromResultTask`2.InnerInvoke() 在 System.Threading.Tasks.Task.Execute()

然后出现 404 NOT Found 错误的异常。为此,堆栈跟踪是:

在 Neo4jClient.Execution.HttpResponseMessageExtensions.EnsureExpectedStatusCode(HttpResponseMessage response, String commandDescription, HttpStatusCode[] expectedStatusCodes) 在 [PATH_HIIDEN]\Neo4jClient\Execution\HttpResponseMessageExtensions.cs:line 41 在 [PATH_HIIDEN]\Neo4jClient\Execution\HttpResponseMessageExtensions.cs:line 14 中的 Neo4jClient.Execution.HttpResponseMessageExtensions.EnsureExpectedStatusCode(HttpResponseMessage response, HttpStatusCode[] expectedStatusCodes) 在 Neo4jClient.Execution.ResponseBuilder.c__DisplayClass21_0.b__0(Task1 requestTask) in [PATH_HIIDEN]\Neo4jClient\Execution\ResponseBuilder.cs:line 127 at System.Threading.Tasks.ContinuationResultTaskFromResultTask2.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();
}

意思是fluent Api导致错误。

【问题讨论】:

  • 嗨 huber - 这些是不同的错误 - 您是否在 Tx 代码中设置断点?当我在 Tx 中运行时,我得到了同样的错误......??
  • 你说得对,克里斯,我已经编辑了我的帖子,请查看“编辑 1”并给你的 cmets。
  • 关注这个的人,请看github.com/Readify/Neo4jClient/issues/127

标签: neo4j neo4jclient


【解决方案1】:

所以问题是在Neo4j 2.2.6 中引入了一个更改,任何ClientError(约束冲突等)都会导致服务器上的事务自动回滚。

Neo4jClient 已经在错误时自动回滚,并继续这样做。对于 2.2.6,这会导致 404 错误,因为事务不再存在(以前的版本很好)。

所以,我已经修复并发布了更新的 Nuget 包,所以 Neo4jClient 的版本 1.1.0.12 现在会给你正确的响应。

【讨论】:

  • 谢谢克里斯。这是固定的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多