Neo4jClient:与OnCreate合并会导致Cypher查询失败

时间:2017-07-21 20:11:53

标签: c# neo4jclient

我们正在将Neo4j Community 3.2.2与Neo4jClient 2.0.0.9一起使用,并尝试创建一个节点(如果它不存在)。 cypher examplesthis这样的问题在SO上有所涉及,所以我们认为这应该是非常直接的:

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"
      ^

原因似乎是"id"查询中SET klient = ...周围的引号。如果我将生成的查询粘贴到neo4j Web控制台,它会显示语法错误,如果我删除引号,则查询运行正常。

当我们几乎逐字复制这些示例时,任何人都知道可能导致查询损坏的原因是什么?

1 个答案:

答案 0 :(得分:0)

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网络前端,查询仍然会被破坏:

Neo4j Query

然而,查询现在无异常执行。

由于唯一的变化是匿名对象中neuerKlient属性的简写定义,我假设内部有一些导致错误的行为(即使调试查询输出相同)。