Neo4jClient:与 OnCreate 合并导致 Cypher 查询损坏
Neo4jClient: Merge with OnCreate leads to broken Cypher Query
我们正在使用 Neo4j Community 3.2.2 和 Neo4jClient 2.0.0.9 并尝试创建一个节点(如果它不存在)。这在 SO 的 cypher examples and questions like 中有所介绍,因此我们认为应该非常简单:
public class KlientNode
{
[JsonProperty(PropertyName = "id")]
public Guid Id { get; set; }
}
和:
var neuerKlient = new KlientNode { Id = ev.KlientId };
var kq = graphClient.Cypher
.Merge("(klient:Klient { id: {klientId} })")
.OnCreate()
.Set("klient = {neuerKlient}").WithParams(new
{
klientId = neuerKlient.Id,
neuerKlient
});
Console.WriteLine(kq.Query.DebugQueryText);
kq.ExecuteWithoutResults();
所以我们基本上照搬了例子1:1。
不幸的是,这会导致以下输出和异常:
MERGE (klient:Klient { id: "80248429-ea80-4a5d-8d4e-88dc1499ea8a" })
ON CREATE
SET klient = {
"id": "80248429-ea80-4a5d-8d4e-88dc1499ea8a"
}
Neo4jClient.NeoException: SyntaxError: Invalid input 'N': expected 'p/P' (line 5, column 2 (offset: 250))
"ON CREATE"
^
原因似乎是 SET klient = ...
查询中 "id"
周围的引号。如果我将生成的查询粘贴到 neo4j web 控制台,它会显示语法错误,如果我删除引号,查询运行正常。
当我们似乎几乎逐字复制示例时,有人知道可能导致查询中断的原因吗?
FWIW,我不确定为什么会这样,但我们能够按如下方式解决它:
var kq = graphClient.Cypher
.Merge($"(klient:{NodeName} {{ id: {{klientId}} }})")
.OnCreate()
.Set("klient = {neuerKlient}").WithParams(new
{
klientId = ev.KlientId,
neuerKlient = new KlientNode
{
Id = ev.KlientId,
},
});
Console.WriteLine(kq.Query.DebugQueryText);
kq.ExecuteWithoutResults();
调试输出还是一样(忽略不同的随机Guid):
MERGE (klient:Klient { id: "87798b47-ab1b-49b7-9c5e-018cd244465e" })
ON CREATE
SET klient = {
"id": "87798b47-ab1b-49b7-9c5e-018cd244465e"
}
如果我尝试将其粘贴到 neo4j 网络前端,查询仍然会中断:
但是,查询现在执行无异常。
因为唯一的变化是匿名对象中 neuerKlient
属性 的 shorthand 定义,我假设内部有一些行为导致了错误(即使调试查询输出是相同的)。
我们正在使用 Neo4j Community 3.2.2 和 Neo4jClient 2.0.0.9 并尝试创建一个节点(如果它不存在)。这在 SO 的 cypher examples and questions like
public class KlientNode
{
[JsonProperty(PropertyName = "id")]
public Guid Id { get; set; }
}
和:
var neuerKlient = new KlientNode { Id = ev.KlientId };
var kq = graphClient.Cypher
.Merge("(klient:Klient { id: {klientId} })")
.OnCreate()
.Set("klient = {neuerKlient}").WithParams(new
{
klientId = neuerKlient.Id,
neuerKlient
});
Console.WriteLine(kq.Query.DebugQueryText);
kq.ExecuteWithoutResults();
所以我们基本上照搬了例子1:1。
不幸的是,这会导致以下输出和异常:
MERGE (klient:Klient { id: "80248429-ea80-4a5d-8d4e-88dc1499ea8a" })
ON CREATE
SET klient = {
"id": "80248429-ea80-4a5d-8d4e-88dc1499ea8a"
}
Neo4jClient.NeoException: SyntaxError: Invalid input 'N': expected 'p/P' (line 5, column 2 (offset: 250))
"ON CREATE"
^
原因似乎是 SET klient = ...
查询中 "id"
周围的引号。如果我将生成的查询粘贴到 neo4j web 控制台,它会显示语法错误,如果我删除引号,查询运行正常。
当我们似乎几乎逐字复制示例时,有人知道可能导致查询中断的原因吗?
FWIW,我不确定为什么会这样,但我们能够按如下方式解决它:
var kq = graphClient.Cypher
.Merge($"(klient:{NodeName} {{ id: {{klientId}} }})")
.OnCreate()
.Set("klient = {neuerKlient}").WithParams(new
{
klientId = ev.KlientId,
neuerKlient = new KlientNode
{
Id = ev.KlientId,
},
});
Console.WriteLine(kq.Query.DebugQueryText);
kq.ExecuteWithoutResults();
调试输出还是一样(忽略不同的随机Guid):
MERGE (klient:Klient { id: "87798b47-ab1b-49b7-9c5e-018cd244465e" })
ON CREATE
SET klient = {
"id": "87798b47-ab1b-49b7-9c5e-018cd244465e"
}
如果我尝试将其粘贴到 neo4j 网络前端,查询仍然会中断:
但是,查询现在执行无异常。
因为唯一的变化是匿名对象中 neuerKlient
属性 的 shorthand 定义,我假设内部有一些行为导致了错误(即使调试查询输出是相同的)。