【问题标题】:Error in inserting a string parameter to a cypher query in a java code将字符串参数插入到 java 代码中的密码查询时出错
【发布时间】:2017-01-14 03:16:12
【问题描述】:

我想将字符串参数插入到 Java 中的密码查询中。下面是我使用的代码,我有一个名为“piyumi”的人员节点,我想与一个活动节点建立关系。活动节点的名称是'walking'。当我执行代码时,我得到 http 状态码 400。谁能帮我修改密码查询,以便我可以插入字符串变量 s 而不会出错。

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter;
import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;

import javax.ws.rs.core.MediaType;

public class NeoAPIClass {
    private final String baseUri = "http://localhost:7474/db/data/cypher";
    private final String user = "neo4j";
    private final String password = "12345";

    public static void main(String args[]) throws JSONException {
            NeoAPIClass n=new NeoAPIClass();
            n.runQuery();
    }

    void runQuery() throws JSONException {
        Client client = Client.create();
        client.addFilter(new HTTPBasicAuthFilter(user, password));
        WebResource cypherResource = client.resource(baseUri);


        String s="walking";
        JSONObject obj = new JSONObject();
        obj.put("query", "Match(piyumi : Person{name:\"Piyumi\"}) create (piyumi)-[:doing{timestamp:4789}]->(n:activity) WHERE n.name=s");
        String st = obj.toString();

        ClientResponse cypherResponse = cypherResource.accept(MediaType.APPLICATION_JSON)
                .type(MediaType.APPLICATION_JSON_TYPE).entity(st).post(ClientResponse.class);

        System.out.println("Output from Server .... "+ cypherResponse.getStatus());


    }

}

【问题讨论】:

    标签: java neo4j cypher graph-databases


    【解决方案1】:

    不可能将createwhere 组合在一起。您需要先匹配人员和活动,然后创建关系。

    并且还建议在请求的单独部分中简化传输参数(https://neo4j.com/docs/rest-docs/current/#rest-api-use-parameters):

    JSONObject request = new JSONObject();
    JSONObject params =  new JSONObject();
    
    String query =  "MATCH (P:Person { name:{personName} }) \n";
    query = query + "MATCH (A:activity { name:{activityName} }) \n";
    query = query + "CREATE (P)-[rel:doing { timestamp:{activityTimestamp} }]->(A) \n";
    query = query + "RETURN P, A, rel";
    
    request.put("query", query);
    
    params.put("personName", "Piyumi");
    params.put("activityName", "walking");
    params.put("activityTimestamp", 4789);
    
    request.put("params", params);
    
    ClientResponse cypherResponse = cypherResource.accept(MediaType.APPLICATION_JSON)
                .type(MediaType.APPLICATION_JSON_TYPE)
                .entity(request.toString())
                .post(ClientResponse.class);
    
    System.out.println("Response: " + cypherResponse.getEntity(String.class));
    

    【讨论】:

      【解决方案2】:

      您的问题是密码服务器无法从您的 Java 代码中看到变量 s。您需要传递一个包含 String 本身的密码查询,而不是 Java 变量的名称。

      您可以将带有obj.put 的行更改为此。

      obj.put("query", "Match(piyumi : Person{name:\"Piyumi\"}) create (piyumi)-[:doing{timestamp:4789}]->(n:activity) WHERE n.name=\"" + s + "\"");
      

      【讨论】:

      • 非常感谢您的快速回复。我用您给出的行替换了 obj.out 行。但我仍然得到同样的错误。你能帮我解决这个问题吗?
      • 嗯,该错误表明密码服务器无法理解您提供的查询。我不知道为什么,因为我对密码查询语言不是特别熟悉。密码服务器是否生成任何可能包含更有用错误的日志?
      • 那我不知道怎么帮你。您需要非常了解 cypher 的人来查看您的查询。问题出在查询本身,而不是 Java 程序。抱歉,我无法提供更多帮助。
      • 还是非常感谢
      【解决方案3】:

      当您尝试检索现有节点时出现问题。 所以,转到http://localhost:7474/browser/ 并执行以下查询,

      匹配(n:活动) WHERE n.name="walking" CREATE (piyumi:Person{name:"Piyumi"}) - [r1:doing{timestamp:4789}]-> (n)

      如果它工作正常,然后检索它。 MATCH (piyumi:Person)-[r1:doing]->(n:activity) 返回 r1

      所以你的查询代码应该是这样的,

      "MATCH (n:activity)\nWHERE n.name=\"walking\"\nCREATE (piyumi:Person{name:\"Piyumi\"}) - [r1:doing{timestamp:4789}]-> (n)"

      【讨论】:

      • 非常感谢您的快速回复。但我需要一个变量名,而不是那里的“walking”。你能帮我解决这个问题吗?我想把 s 放在那里。
      • 如果这是正确的,那么你可以通过写"MATCH (n:activity)\nWHERE n.name=\"" + s + "\"\nCREATE (piyumi:Person{name:\"Piyumi\"}) - [r1:doing{timestamp:4789}]-> (n)"来构造它
      • 已添加变量“s”,obj.put("query", "MATCH (n:activity)\nWHERE n.name=\"" + s + "\"\nCREATE (piyumi:Person{name:\"Piyumi\"}) - [r1:doing{timestamp:4789}]-> (n)"); 这应该可以工作并提供 http 状态 200
      猜你喜欢
      • 2012-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多