在Neo4J中,如何将标签设置为Java的密码查询中的参数?
我在Java的Neo4J中的cypher中的参数有问题。我运行嵌入的数据库。
代码应该是这样的(GraphDB.cypher直接进入执行引擎)
HashMap<String, Object> parameter = new HashMap<>();
parameter.put("theLabel1", "Group");
parameter.put("theRelation", "isMemberOf");
parameter.put("theLabel2", "Person");
GraphDB.cypher("MATCH (n1:{theLabel1})-[r:{theRelation}]->(n2:{theLabel2}) RETURN n1, r, n2", parameter);
但它以这个例外结束
Exception in thread "main" Invalid input '{': expected whitespace or a label name (line 1, column 11)
"MATCH (n1:{theLabel1})-[r:{theRelation}]->(n2:{theLabel2}) RETURN n1, r, n2"
文档(和教程)告诉使用 { } 来覆盖参数,但这也用作属性的密码 json 表示法。@See http://docs.neo4j.org/chunked/milestone/tutorials-cypher-parameters-java.html
有没有另一种方法可以解决这个问题,而不是像这样构建查询字符串(或使用其他模板方法)
GraphDB.cypher("MATCH (n:" + labelName + ")-[r:" + relationName + "]->...
这是必需的,因为目标标签可以更改,并且我想完全重用代码。
提前致谢。
[[在得到A(叹息)后编辑不作为答案]]
由于目前不支持这种形式的参数(2014.6),因此在发送查询之前,我将运行一个小的替换器。
HashMap<String, Object> parameter = new HashMap<>();
parameter.put("theLabel1", "Group");
parameter.put("theRelation", "isMemberOf");
parameter.put("theLabel2", "Person");
parameter.put("aName", "Donald Duck");
GraphDB.cypher("MATCH (n1:#theLabel1#)-[r:#theRelation#]->(n2:#theLabel2#) WHERE n2.Name = {aName} RETURN n1, r, n2", parameter);
... with ...
public static ExecutionResult cypher(String query, Map<String, Object> params) {
for (String key : params.keySet()) {
query = query.replaceAll("#" + key + "#", String.valueOf(params.get(key)));
}
return params == null ? cypherEngine.execute(query) : cypherEngine.execute(query, params);
}
可以有一个更可读性