在Neo4J中,如何在Java的cypher查询中将标签设置为参数?
发布时间:2020-12-14 05:41:19 所属栏目:Java 来源:网络整理
导读:我在 Java中使用Neo4J中的cypher参数时遇到问题.我运行嵌入的数据库. 代码应该是这样的(GraphDB.cypher直接转到ExecutionEngine) HashMapString,Object parameter = new HashMap();parameter.put("theLabel1","Group");parameter.put("theRelation","isMembe
我在
Java中使用Neo4J中的cypher参数时遇到问题.我运行嵌入的数据库.
代码应该是这样的(GraphDB.cypher直接转到ExecutionEngine) 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,n2" 文档(和教程)告诉使用{}来覆盖参数,但这也用作属性的密码json表示法. 是否有另一种方法来解决此问题,而不是像这样(或使用其他模板方法)构建查询字符串 GraphDB.cypher("MATCH (n:" + labelName + ")-[r:" + relationName + "]->... 这是必需的,因为目标标签可以更改,我想完全重用代码. 提前致谢. [[取得(叹气)没有作为答复后的行为]] 由于这种形式的参数目前(2014.6)不受支持,我将在发送查询之前运行一点替换. HashMap<String,"Person"); parameter.put("aName","Donald Duck"); GraphDB.cypher("MATCH (n1:#theLabel1#)-[r:#theRelation#]->(n2:#theLabel2#) WHERE n2.Name = {aName} RETURN n1,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); } 可以有更多的阅读 解决方法
我担心此刻不支持此事.
它可能与本期中解释的原因完全相同:https://github.com/neo4j/neo4j/pull/1542. 参数化查询背后的想法是重用(缓存)执行计划.如果节点标签或关系类型不同,则执行计划根本不会相同,从而破坏了执行计划缓存的有用性. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |