java - 如何在 Java 应用程序代码中构建参数化密码查询?

标签 java neo4j cypher

参数化查询背后的想法是重用(缓存)执行计划。

如果节点标签或关系类型不变,则执行计划将完全相同,因此可以实现执行计划缓存的好处。

目前,我的完整 Cypher 查询是使用 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 和 relationBetweenNode1andNode2 作为参数,则至少可以传递以下值作为参数。

 PersonNameAttribute = "name";
 PersonNameValue = "Jaykant";

 ProgrammingLanguageAttribute = "version";
 ProgrammingLanguageValue = "Neo4j";

有示例代码吗?教程?

最佳答案

您可以在 session.run() 方法中传递参数和查询。

例如

session.run(query, parameters)

参数应该是一个映射。

HashMap<String, Object> parameters = new HashMap<String, Object>();
parameters.put("PersonNameValue", "Jaykant");
parameters.put("ProgrammingLanguageValue", "Neo4j");

查询可以修改为:

String t = "MERGE (n1:"+Node1+"{"+PersonNameAttribute+":{PersonNameValue}})"+"-[:"+relationBetweenNode1andNode2+"]->(n2:" + Node2 +" {"+ProgrammingLanguageAttribute+": {ProgrammingLanguageValue}})";

最后run语句:

session.run(t, parameters);

关于java - 如何在 Java 应用程序代码中构建参数化密码查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55558047/

相关文章:

neo4j - 余弦相似度 - 作为推荐引擎的缺点?

Neo4j:Cypher WHERE 子句与 MATCH 子句中的花括号 - 哪个更好?

java - 从 Spring MVC Rest 服务抛出的 Jersey REST 客户端捕获异常

java - 如何使用 application.properties 在 Spring 中禁用 csrf?

java - 尽管指定了正确的结构,为什么我会获得无效的内存访问?

java - EJB3 - 处理非标准链接表

java - 如何部署非托管插件并从 Maven 重新启动 Neo4j 服务器?

neo4j - 这个 Neo4J 可视化中使用了什么插件,它可以在这个页面之外使用吗?

Neo4j Cypher 查询和复合对象

string - 如何将列表(从收集)转换为字符串