在Transaction中使用QueryEngine的异常

时间:2012-12-18 08:57:52

标签: java neo4j cypher

我正在使用带有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()*失败时返回一个抛出异常的空对象。

问题是我需要使用事务来优化查询,因为如果不需要花费太多时间来处理我需要做的所有查询。我应该尝试将多个操作连接到查询,以避免使用事务吗?

2 个答案:

答案 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预处理语句一样。