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 定义,我假设内部有一些行为导致了错误(即使调试查询输出是相同的)。