我正在使用带有java-rest-binding 1.8.M07的neo4j 1.9.M01版本,我有一个问题,这个代码旨在从neo4j数据库获取一个带有属性“URL”的节点“ARREL”,通过休息使用查询语言。这些问题似乎只发生在一个事务中,抛出一个异常,但效果很好:
RestGraphDatabase graphDb = new RestGraphDatabase("http://localhost:7474/db/data");
RestCypherQueryEngine queryEngine = new RestCypherQueryEngine(graphDb.getRestAPI());
Node nodearrel = null;
Transaction tx0 = gds.beginTx();
try{
final String queryStringarrel = ("START n=node(*) WHERE n.URL =~{URL} RETURN n");
QueryResult<Map<String, Object>> retornar = queryEngine.query(queryStringarrel, MapUtil.map("URL","ARREL"));
for (Map<String,Object> row : retornar)
{
nodearrel = (Node)row.get("n");
System.out.println("Arrel: "+nodearrel.getProperty("URL")+" id : "+nodearrel.getId());
}
tx0.success();
}
(...)
但发生异常:*异常tx0:读取为JSON时出错“ *每次执行返回QueryResult对象的行。
我也尝试过使用ExecutionEngine(在事务之间):
ExecutionEngine engine = new ExecutionEngine( graphDb );
String ARREL = "ARREL";
ExecutionResult result = engine.execute("START n=node(*) WHERE n.URL =~{"+ARREL+"} RETURN n");
Iterator<Node> n_column = result.columnAs("n");
Node arrelat = (Node) n_column.next();
for ( Node node : IteratorUtil.asIterable( n_column ) )
(...)
但它也在* n_column.next()*失败时返回一个抛出异常的空对象。
问题是我需要使用事务来优化查询,因为如果不需要花费太多时间来处理我需要做的所有查询。我应该尝试将多个操作连接到查询,以避免使用事务吗?
答案 0 :(得分:0)
尝试在:
添加单引号START n=node(*) WHERE n.URL =~ '{URL}' RETURN n
答案 1 :(得分:0)
您可以将java-rest-binding更新到最新版本(1.8)吗?在这两者之间,我们有一个版本可以自动将REST批处理操作应用到具有事务语义的地方。
因此,您看到的交易不是真正的交易,只是将您的操作记录为tx.success/finish
上的批量休息操作
在交易中执行查询,但只能在>完成tx后访问结果。然后你的结果将在那里。
例如,这可以将多个密码查询一次性发送到服务器,然后将结果全部一次性地发送。
是的@ulkas使用参数但不是这样:
START n=node(*) WHERE n.URL =~ {URL} RETURN n
params: { "URL" : "http://your.url" }
使用params时不需要引号,就像SQL预处理语句一样。