我有一个字符串nodeType
,需要将其存储在neo4j中作为节点的标签。在Cypher中,这将是
CREATE (n:nodeType)
其中nodeType
是在此操作之前设置的字符串。在neo4jclient中我试过了
.Create("(x:{type})")
.WithParam("type", nodeType)
但这显然不是参数的正确用法,并给出错误
Unhandled Exception: Neo4jClient.NeoException: SyntaxError:
Invalid input '{': expected whitespace or a label name
"CREATE (x:{type})"
^
将标签添加移动到单独的设置操作会产生相同的错误。
.Create("(x)")
.Set("x :{type}")
.WithParam("type", nodeType)
official neo4jclient documentation on parameters表示"您可以在流畅的查询中随时创建参数..."但事实并非如此,因为开放式支架并未被Cypher发动机视为参数的起点。我在这里做错了什么?
由于字符串连接是一个非常非常坏的想法,从neo4jclient中的变量设置节点标签的预期方法是什么?
答案 0 :(得分:1)
标签无法在密码查询中进行参数化。
要使用动态标签创建节点,您可以使用APOC执行此过程:CALL apoc.create.node(['Label'], {key:value,…})
答案 1 :(得分:1)
就我个人而言:
var nodeType = "MyNode";
client.Cypher.Create($"(x:{nodeType})").ExecuteWithoutResults();
或者如果你不能使用C#6:
client.Cypher.Create(string.Format("(x:{0})", nodeType).ExecuteWithoutResults()
我认为这里要注意的是,这些都不是使用字符串连接。这是string.Format
和字符串插值旨在帮助的内容。
logisima是正确的,你不能通过Cypher做到这一点,你唯一的选择是转移到APOC,如果你确实需要这样做,但字符串选项将更容易使用