【发布时间】:2019-04-07 10:38:50
【问题描述】:
参数化查询背后的想法是重用(缓存)执行计划。
如果节点标签或关系类型不变,则执行计划将完全一样,因此可以实现执行计划缓存的好处。
目前,我的完整 Cypher Query 是使用 Java String Building 构建的。我不想使用字符串构建创建整个 Cypher 查询,而是希望将属性的值作为参数值以及属性名称作为参数传递或不传递。我需要示例代码和相同的指导。
我当前的代码
import org.neo4j.driver.v1.AuthTokens;
import org.neo4j.driver.v1.Driver;
import org.neo4j.driver.v1.GraphDatabase;
import org.neo4j.driver.v1.Session;
public class ForStackoverflowQuestion {
public static void main(String[] args) {
Driver driver = GraphDatabase.driver(
"bolt://localhost:7687", AuthTokens.basic("neo4j", "12345"));
Session session = driver.session();
String Node1 = "Software_Engineer";
String Node2 = "Programming_Language";
String relationBetweenNode1andNode2 = "LEARNS";
String PersonNameAttribute = "name";
String PersonNameValue = "Jaykant";
String ProgrammingLanguageAttribute = "version";
String ProgrammingLanguageValue = "Neo4j";
String t = "MERGE(n1:"+Node1+"{"+PersonNameAttribute+":\""+PersonNameValue+"\"})"+"-[:"+relationBetweenNode1andNode2+"]->(n2:" + Node2 +" {"+ProgrammingLanguageAttribute+":'"+ProgrammingLanguageValue+"'})";
System.out.println(t);
session.run(t);
session.close();
driver.close();
}
}
我知道我上面的代码没有使用参数化密码查询;所以它不会在 neo4j 中生成任何查询计划。
为了使用查询计划并从中受益,我需要使用参数化查询。
如果不是Node1、Node2和relationBetweenNode1和Node2作为参数,那么至少以下值可以作为参数传递。
PersonNameAttribute = "name";
PersonNameValue = "Jaykant";
ProgrammingLanguageAttribute = "version";
ProgrammingLanguageValue = "Neo4j";
有示例代码吗?教程?
【问题讨论】: