不设置特定参数时的ParameterNotFoundException

问题描述 投票:0回答:2

我正在尝试使用Neo4jClient来运行Cypher语法:

    UNWIND {apples} AS newApple
    CREATE (a:Apple {newApple})

使用对象List<Apple> a的C#列表,其中对象可以是:

class Apple : Fruit
{
    [JsonProperty(PropertyName = "Variety")]
    public String Variety { get; set; }
}

我不想在代码周围的不同位置展开对象变量规范。

但跑步

            graphClient.Cypher
                .Unwind(a, "newApple")
                .Create("(a: Apple {newApple})")
                .ExecuteWithoutResults()

抛出:

Neo4jClient.NeoException:'ParameterNotFoundException:期望一个名为newApple的参数'

Create行更改为

            .Create("(a: Apple {Id: newApple.Id})")

似乎工作,所以找到预期的参数newApple。这里的问题是,如果我更改类的属性,我必须更改密码查询字符串中的直接依赖项。

Questions

  1. 为什么是这样?我希望在两种情况下都能找到Unwind中指定的标识符。
  2. 任何解决方法,以便我可以保留通用代码?我的目标是能够发送任何POCO对象以自动匹配neo节点类型参数。
neo4j neo4jclient
2个回答
1
投票

因为newApple不再是参数,而是变量,而您使用的语法只能应用于外部参数。

对于变量可以这样使用:

WITH [{id: 1, name: 'appe1'}, {id: 2, name: 'apple2'}] as apples
UNWIND apples as newApple
CREATE (a:Apple) SET a = newApple
RETURN a

0
投票

基于Gabor的答案,对于可以像这样实现的C#neo4jclient(在评论和编辑中展开over here):

graphClient.Cypher
    .Unwind(apples, "newApple")
    .Create("(a: Apple)")
    .Set("a = newApple")
    .ExecuteWithoutResults();

SET允许使用JsonAttribute属性设置整个对象,而无需在cypher中指定显式参数。

© www.soinside.com 2019 - 2024. All rights reserved.