当我尝试不使用对Id和Name属性具有唯一约束的事务更新Neo4JClient中的现有节点时,我会收到以下异常:
CypherExecutionException:节点6已经存在标签用户和属性"Name"=Mike
但是,当我试图更新事务中的节点时,我会收到以下异常:
在执行请求时收到意外的HTTP状态。 响应状态为: 404未找到 来自Neo4j的响应(可能包括有用的细节!)was:{“结果”:[],"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"
}
]}此异常的堆栈跟踪如下:
( Neo4jClient.Serialization.CypherJsonDeserializer
1.GetRootResultInTransaction(JObject root) in [PATH_HIIDEN]\Neo4jClient\Serialization\CypherJsonDeserializer.cs:line 316 at Neo4jClient.Serialization.CypherJsonDeserializer1.CheckForErrorsInTransactionResponse(String content) ( PATH_HIIDEN\Neo4jClient\Serialization\CypherJsonDeserializer.cs:line 291 at Neo4jClient.GraphClient.<>c__DisplayClass84_1.<PrepareCypherRequest>b__0(Task1 responseTask) ( PATH_HIIDEN\Neo4jClient\GraphClient.cs:line 933 at System.Threading.Tasks.ContinuationResultTaskFromResultTask`2.InnerInvoke() at System.Threading.Tasks.Task.Execute()
在此之后,会出现404未找到错误的异常。为此,堆栈跟踪是:
在Neo4jClient.Execution.HttpResponseMessageExtensions.EnsureExpectedStatusCode(HttpResponseMessage响应时,PATH_HIIDEN\Neo4jClient\Execution\HttpResponseMessageExtensions.cs:line 41中的String commandDescription,HttpStatusCode[] expectedStatusCodes(在Neo4jClient.Execution.HttpResponseMessageExtensions.EnsureExpectedStatusCode(HttpResponseMessage response,HttpStatusCode[] expectedStatusCodes)在PATH_HIIDEN\Neo4jClient\Execution\HttpResponseMessageExtensions.cs:line 14 at 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导致了错误。
发布于 2015-11-03 12:19:42
因此,问题是在Neo4j 2.2.6中引入了一个更改,任何ClientError (约束冲突等)都会导致服务器上事务的自动回滚。
Neo4jClient已经对错误进行了自动回滚,并继续这样做。使用2.2.6时,这会导致404错误,因为事务不再存在(以前的版本很好)。
因此,我已经做了一个修复,并发布了一个更新的Nuget包,所以1.1.0.12版本的Neo4jClient现在将给您正确的响应。
https://stackoverflow.com/questions/33447424
复制相似问题