我使用neo4j-rest-binding API进行开发,但在使用RestCypherQueryEngine的参数时遇到问题。
QueryResult<Map<String,Object>> result = engine.query("MATCH (n:{label}) RETURN n", MapUtil.map("label", label));
label是我在地图结构中指定的参数,但它有一个错误:
org.neo4j.rest.graphdb.RestResultException: Invalid input '{': expected whitespace or an identifier (line 1, column 10)
"MATCH (n:{label}) RETURN n"
^ at
SyntaxException
org.neo4j.cypher.internal.compiler.v2_0.parser.CypherParser$$anonfun$parse$1.apply(CypherParser.scala:51)
org.neo4j.cypher.internal.compiler.v2_0.parser.CypherParser$$anonfun$parse$1.apply(CypherParser.scala:41)
...
我可以使用其他方法来解决这个问题:
QueryResult<Map<String,Object>> result = engine.query("MATCH (n:" + label +") RETURN n", null);
但我认为当我想传递多个参数时,上述方法是不合适的。
答案 0 :(得分:1)
:{
是一个语法错误。正如例外情况告诉您的那样,Cypher期望冒号后的标识符 - 即标签的名称 - 和标识符(如在大多数语言中)不能包含括号。
听起来你对标签和参数之间的区别感到困惑:
以下内容有效:MATCH (n:employee{name:"foo"})
此处employee
为label。您可以应用冒号分隔的任意数量的标签。 {name:"foo"}
是一个参数块 - 请注意它包含您要匹配的字段和值。因此,此查询将返回标记为employee
的所有节点,其name
值为&#34; foo&#34;。 MATCH (n:employee:custodian{name:"foo"})
将为您提供所有名为&#34; foo&#34;的保管人员。
如果您希望所有节点的name
值为&#34; foo&#34;,请使用MATCH (n {name:"foo"})
(请注意没有冒号)。
修改(回复您的评论)您的查询与您引用的示例中的查询有两点不同,start n=node({id}) return n
显然是一个START子句,do very different things并且MATCH子句中的语法规则不同:id
中的({id)}
只是在索引中查找的值。在MATCH子句中,{ }
块内的内容是键值对,如上所述。 Inside 一个参数块(即一组大括号),冒号用于将键与值分开。在MATCH子句中的括号外部用于分隔labels,它们完全是不同的东西。
第二个区别是,如果你仔细观察START子句,就会有一个括号将冒号与括号分开。 :{
永远不会好,这是您的错误消息告诉您的。