1

我正在使用带有 java-rest-binding 1.8.M07 的 neo4j 1.9.M01 版本,并且我对这段代码有疑问,该代码旨在从 neo4j 数据库中获取属性为“ARREL”的“URL”节点,通过休息使用查询语言。问题似乎只发生在事务内部,引发异常,但其他方面效果很好:

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();
}
(...)

但是会发生异常: *exception tx0: Error reading as 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()* 返回一个引发异常的空对象时失败。

问题是我需要使用事务来优化查询,否则需要花费太多时间来处理我需要做的所有查询。我是否应该尝试将多个操作加入查询,以避免使用事务?

4

2 回答 2

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" }

使用参数时不需要引号,就像 SQL 准备语句一样。

于 2012-12-19T18:02:37.437 回答
0

尝试在以下位置添加单引号:

START n=node(*) WHERE n.URL =~ '{URL}' RETURN n
于 2012-12-18T09:29:06.670 回答