Neo4jClient传递单引号

时间:2014-06-14 04:30:25

标签: c# neo4jclient

我正在尝试传入一个带有单引号的变量,以便在使用Neo4jClient时存储在Neo4j中,我似乎无法正确地转义字符。

当我使用它时:

var Command = new UpdateCommand()
{
    Name = "3 o'clock";
};

我收到错误消息,指出存在语法错误。当我使用它时:

var Command = new UpdateCommand()
{
    Name = "3 o\\'clock ";
};

它正在使用额外的转义字符错误地存储变量名称。

我的创建节点非常简单,看起来像这样,newUser对象有一个由命令设置的属性(Name)。

_client.Cypher
   .Create("(u:User {user})")
   .WithParams(new { user = newUser })
   .ExecuteWithoutResults();

我在这里做错了什么?使用Neo4jClient逃避字符串的正确方法是什么?

更新:我的问题不是如上所述创建一个新节点,而是在匹配密码上创建on。我试图简化SO的问题,我删除了问题。请参阅下面更新的代码,这段代码对我而言是错误的。可能是因为我正在进行创建/匹配错误。

_client.Cypher
    .Merge("(u:User { UserId: " + userId + "})")
    .OnCreate()
    .Set("u = {user}")
    .WithParams(new { user = newUser })
    .OnMatch()
    .Set(string.Format("u.Name = '{0}'",
         newUser.Name))
    .ExecuteWithoutResults();

1 个答案:

答案 0 :(得分:1)

除了标准的C#(单引号中不需要)之外,您不需要进行任何转义。以下代码创建一个名为3 O'clock的新用户,并将其完全返回。

var newUser = new User{Name = "3 O'clock"};

gc.Cypher
    .Create("(u:Test {user})")
    .WithParams(new {user = newUser})
    .ExecuteWithoutResults();

var val = gc.Cypher
    .Match("(n:Test)")
    .Return(n => n.As<User>())
    .Results
    .First();

Console.WriteLine(val.Name);

如果此代码不适合您 - 您使用的是什么版本的Neo4jClient,针对的是什么版本的Neo4j,以及这个'UpdateCommand'有什么作用?


编辑更新

您仍应使用参数进行设置:

gc.Cypher
    .Merge(string.Format("(u:User {{UserId: {0}}})", userId))
    .OnCreate().Set("u = {userParam}").WithParam("userParam", newUser)
    .OnMatch().Set("u.Name = {nameParam}").WithParam("nameParam", newUser.Name)
    .ExecuteWithoutResults();

让Neo4jClient处理参数的所有引号/格式!