在java代码中向密码查询插入字符串参数时出错
我想在Java中向密码查询插入一个字符串参数。下面是我使用的代码,我有一个名为“piyumi”的person节点,我想与活动节点建立关系。活动节点的名称为“行走”。当我执行代码时,我得到http状态代码400。谁能帮我修改cypher查询,这样我就可以插入字符串变量s而不会出错在java代码中向密码查询插入字符串参数时出错,java,neo4j,cypher,graph-databases,Java,Neo4j,Cypher,Graph Databases,我想在Java中向密码查询插入一个字符串参数。下面是我使用的代码,我有一个名为“piyumi”的person节点,我想与活动节点建立关系。活动节点的名称为“行走”。当我执行代码时,我得到http状态代码400。谁能帮我修改cypher查询,这样我就可以插入字符串变量s而不会出错 import com.sun.jersey.api.client.Client; import com.sun.jersey.api.client.ClientResponse; import com.sun.jerse
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());
}
}
您的问题是cypher服务器无法从Java代码中看到变量
s
。您需要传递一个本身具有字符串的密码查询,而不是Java变量的名称
您可以使用obj.put
将行更改为该行
obj.put("query", "Match(piyumi : Person{name:\"Piyumi\"}) create (piyumi)-[:doing{timestamp:4789}]->(n:activity) WHERE n.name=\"" + s + "\"");
您的问题是cypher服务器无法从Java代码中看到变量s
。您需要传递一个本身具有字符串的密码查询,而不是Java变量的名称
您可以使用obj.put
将行更改为该行
obj.put("query", "Match(piyumi : Person{name:\"Piyumi\"}) create (piyumi)-[:doing{timestamp:4789}]->(n:activity) WHERE n.name=\"" + s + "\"");
尝试检索现有节点时出现问题。
因此,转到并执行下面的查询
匹配(n:活动)
其中n.name=“步行”
创建(piyumi:Person{name:“piyumi”})-[r1:doing{timestamp:4789}]>(n)
如果工作正常,则检索它。
匹配(皮尤米:人)-[r1:做]->(n:活动)
返回r1
所以你的查询代码应该是这样的
“匹配(n:activity)\n其中n.name=\“walking\”\n创建(piyumi:Person{name:\“piyumi\”})-[r1:doing{timestamp:4789}]>(n)”
尝试检索现有节点时出现问题。
因此,转到并执行下面的查询
匹配(n:活动)
其中n.name=“步行”
创建(piyumi:Person{name:“piyumi”})-[r1:doing{timestamp:4789}]>(n)
如果工作正常,则检索它。
匹配(皮尤米:人)-[r1:做]->(n:活动)
返回r1
所以你的查询代码应该是这样的
“匹配(n:activity)\n其中n.name=\“walking\”\n创建(piyumi:Person{name:\“piyumi\”)-[r1:doing{timestamp:4789}]>(n)
不可能将创建
和其中
组合起来。您需要首先匹配人员和活动,然后创建关系
还建议在请求()的单独部分简化传输参数:
无法将创建
和其中
组合起来。您需要首先匹配人员和活动,然后创建关系
还建议在请求()的单独部分简化传输参数:
非常感谢您的快速回复。我将obj.out行替换为您给出的行。但我还是犯了同样的错误。你能帮我进一步解决这个问题吗?这个错误表明cypher服务器无法理解你提供的查询。我不知道为什么,因为我对cypher查询语言不是特别熟悉。cypher服务器是否生成了可能有更有用错误的日志?那么我不知道如何帮助您。您需要一个非常了解cypher的人来查看您的查询。问题在于查询本身,而不是Java程序。对不起,我帮不上什么忙了。无论如何,非常感谢您的快速回复。我将obj.out行替换为您给出的行。但我还是犯了同样的错误。你能帮我进一步解决这个问题吗?这个错误表明cypher服务器无法理解你提供的查询。我不知道为什么,因为我对cypher查询语言不是特别熟悉。cypher服务器是否生成了可能有更有用错误的日志?那么我不知道如何帮助您。您需要一个非常了解cypher的人来查看您的查询。问题在于查询本身,而不是Java程序。对不起,我帮不上什么忙了。无论如何,非常感谢您的快速回复。但我需要一个变量名,而不是“行走”。你能帮我做这个吗。我想把s放在那里。如果这是正确的,那么您可以通过编写“MATCH(n:activity)\nWHERE n.name=\'+s+“\”\n创建它(piyumi:Person{name:\'piyumi\})-[r1:doing{timestamp:4789}]>(n)
变量“s”已经添加了obj.put(“查询”,“MATCH(n:activity)\nWHERE n.name=\\\\+s+\n创建它(piyumi:Person{name:\\'piyumi\})-[r1:doing{timestamp:4789}]->(n)”;
这应该可以工作,并给出http状态200非常感谢您的快速响应。但是我需要一个变量名,而不是“walking”。您能帮我吗?我想把s放在那里。如果这是正确的,那么您可以通过编写“MATCH”(n:activity)来构造它\nWHERE n.name=\\'+s+\'\n创建(piyumi:Person{name:\'piyumi\'})-[r1:doing{timestamp:4789}]->(n)
Variable“s”添加了,obj.put(“查询”,“匹配(n:activity)\nWHERE n.name=\'+s+“\n创建(piyumi:Person{name:\'piyumi\}-[r1:doing{timestamp:4789]->(n);