我想更新neo4j数据库中的一些记录。为了在C#中用Neo4jClient写这个查询:
_client.Cypher
.Unwind(skills, "updatedSkill")
.Match("(s : Skill {Name: updatedSkill.Name}")
.Set("s = updatedSkill");
.ExecuteWithoutResults();
技能是技能对象的简单列表:
public class Skill
{
public string Name { get; set; }
public string Phrase { get; set; }
}
但是当我调用它时,这段代码会抛出异常。其翻译的Cypher查询是:
UNWIND [{
"Name": "name1",
"Phrase": "phrase1",
},{
"Name": "name2",
"Phrase": "phrase2",
}] AS updatedSkill
MATCH (s : Skill {Name: updatedSkill.Name}
SET s = updatedSkill
例外情况如下:
Invalid input '"': expected whitespace, comment, an identifier,
UnsignedDecimalInteger, a property key name or '}' (line 3, column 5 (offset: 17))
" "Name": "name1","
^
当我删除属性名称和短语的双引号时,查询正确运行。但我可以这样做,因为查询是由Neo4jClient自动生成的。
有什么想法吗?
答案 0 :(得分:0)
您的MATCH
声明中有拼写错误。缺少结束)
。如果您更正此问题,您的查询应该按预期工作。另外,在SET
语句的末尾还有一个额外的分号,我已将其删除。
_client.Cypher
.Unwind(skills, "updatedSkill")
.Match("(s:Skill {Name: updatedSkill.Name})")
.Set("s = updatedSkill")
.ExecuteWithoutResults();
另外,这是一个示例,您正在查看的查询并不能真正代表发送到Neo4j REST API的参数化查询。我假设您是通过查看_cypher.Query.DebugQueryText
获得的?对于大多数情况,这很好但是在传递JSON对象的情况下,由于它操纵参数对象的字符串表示的方式,它可能导致误导性查询。如果您查看Neo4jClient抛出的实际异常,应告知您问题的真正原因。在这种情况下
SyntaxException:输入'S'无效:预期的空格,注释,')'或关系模式...... “SET s = updatedSkill”
^
这告诉您真正的问题是您在开始MATCH
声明之前没有关闭SET
声明。