不设置特定参数时的ParameterNotFoundException

时间:2018-01-02 12:31:17

标签: neo4j neo4jclient

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

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

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

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

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

但是正在运行

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

抛出:

  

Neo4jClient.NeoException:&#39; ParameterNotFoundException:期望一个名为newApple&#39;

的参数

Create行更改为

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

似乎有效,因此找到了预期的参数newApple。这里的问题是,如果我更改类的属性,我必须更改密码查询字符串中的直接依赖。

问题

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

pickerView

graphClient.Cypher .Unwind(apples, "newApple") .Create("(a: Apple)") .Set("a = newApple") .ExecuteWithoutResults(); 允许使用JsonAttribute属性设置整个对象,而不在cypher中指定显式参数。