如何以编程方式在neo4jclient中设置节点标签?

时间:2017-06-14 17:26:47

标签: c# neo4j neo4jclient

我有一个字符串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中的变量设置节点标签的预期方法是什么?

2 个答案:

答案 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,如果你确实需要这样做,但字符串选项将更容易使用