我们正在将Neo4j Community 3.2.2与Neo4jClient 2.0.0.9一起使用,并尝试创建一个节点(如果它不存在)。 cypher examples和this这样的问题在SO上有所涉及,所以我们认为这应该是非常直接的:
public class KlientNode
{
[JsonProperty(PropertyName = "id")]
public Guid Id { get; set; }
}
和
var neuerKlient = new KlientNode { Id = ev.KlientId };
var kq = graphClient.Cypher
.Merge("(klient:Klient { id: {klientId} })")
.OnCreate()
.Set("klient = {neuerKlient}").WithParams(new
{
klientId = neuerKlient.Id,
neuerKlient
});
Console.WriteLine(kq.Query.DebugQueryText);
kq.ExecuteWithoutResults();
所以我们基本上复制了示例1:1。
不幸的是,这会导致以下输出和异常:
MERGE (klient:Klient { id: "80248429-ea80-4a5d-8d4e-88dc1499ea8a" })
ON CREATE
SET klient = {
"id": "80248429-ea80-4a5d-8d4e-88dc1499ea8a"
}
Neo4jClient.NeoException: SyntaxError: Invalid input 'N': expected 'p/P' (line 5, column 2 (offset: 250))
"ON CREATE"
^
原因似乎是"id"
查询中SET klient = ...
周围的引号。如果我将生成的查询粘贴到neo4j Web控制台,它会显示语法错误,如果我删除引号,则查询运行正常。
当我们几乎逐字复制这些示例时,任何人都知道可能导致查询损坏的原因是什么?
答案 0 :(得分:0)
FWIW,我不确定为什么会这样,但我们能够按如下方式解决:
var kq = graphClient.Cypher
.Merge($"(klient:{NodeName} {{ id: {{klientId}} }})")
.OnCreate()
.Set("klient = {neuerKlient}").WithParams(new
{
klientId = ev.KlientId,
neuerKlient = new KlientNode
{
Id = ev.KlientId,
},
});
Console.WriteLine(kq.Query.DebugQueryText);
kq.ExecuteWithoutResults();
调试输出仍然相同(忽略不同的随机Guid):
MERGE (klient:Klient { id: "87798b47-ab1b-49b7-9c5e-018cd244465e" })
ON CREATE
SET klient = {
"id": "87798b47-ab1b-49b7-9c5e-018cd244465e"
}
如果我尝试将其粘贴到neo4j网络前端,查询仍然会被破坏:
然而,查询现在无异常执行。
由于唯一的变化是匿名对象中neuerKlient
属性的简写定义,我假设内部有一些导致错误的行为(即使调试查询输出相同)。