代码之家  ›  专栏  ›  技术社区  ›  Alexander Langer

Neo4jClient:与OnCreate合并会导致中断的Cypher查询

  •  0
  • Alexander Langer  · 技术社区  · 9 年前

    cypher examples this 在这里,我们认为这应该是非常直接的:

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

    不幸的是,这会导致以下输出和异常:

    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 = ...

    当我们几乎一字不差地复制示例时,谁知道是什么导致了中断的查询?

    1 回复  |  直到 9 年前
        1
  •  0
  •   Alexander Langer    9 年前

    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 web前端,查询仍然会中断:

    Neo4j Query

    因为唯一的变化是 neuerKlient 属性中,我假设内部有某种行为导致了错误(即使调试查询输出是相同的)。