我正在尝试传入一个带有单引号的变量,以便在使用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();
答案 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处理参数的所有引号/格式!