我的问题是:如何阅读从查询中回来的多个ResourceIterator
个对象,一个" row"一次?
我有一系列返回多列的查询;我试图编写一个通用函数来处理从java执行Cypher查询的细节,使用结果,并将其作为一个简单的Map返回,将请求的列名称映射回结果列表。
问题是,ResourceIterator
发回的某些ExecutionResult
响应似乎是空的,尽管它们不应该是。我想知道是否需要并行使用多个ResourceIterators
,或者在我阅读它们之前导致它们耗尽的其他一些障碍。
public Map<String,List<Object>> runQueryComplexResult(NeoProfiler parent, String query, String...columns) {
HashMap<String,List<Object>> all = new HashMap<String,List<Object>>();
ExecutionEngine engine = new ExecutionEngine(parent.getDB());
List<Object> retvals = new ArrayList<Object>();
try ( Transaction tx = parent.getDB().beginTx() ) {
log.info(query);
ExecutionResult result = engine.execute(query);
List<ResourceIterator<Object>> rits = new ArrayList<ResourceIterator<Object>>();
List<List<Object>> consumed = new ArrayList<List<Object>>();
for(String col : columns) {
// rits.add(result.columnAs(col));
all.put(col, IteratorUtil.asList(result.columnAs(col)));
}
}
return all;
}
然后我这样调用这个函数:
Map<String,List<Object>> ret = runQueryComplexResult(parent,
"match n-[r:" + type + "]->m return n as left, m as right limit 50",
"right", "left");
在这种情况下,结果中的列标有&#34; right&#34;将首先阅读。如果是,我会得到一个空的结果列表&#34; left&#34;柱。如果我切换顺序(并从&#34;左&#34;首先读取结果),则反过来发生; &#34;权利&#34;列表是空的。
答案 0 :(得分:3)
您似乎只能通过ExecutionResult
中的行迭代一次。 columnAs()
方法遍历所有行,但仅返回单个列中的值。第二次调用columnAs()
将不会返回任何值,因为您已经在ExecutionResult
的末尾。
您需要重新构建逻辑并使用{{1}}方法,一次处理一行。
public ResourceIterator&lt; Map&lt; String,Object&gt;&gt;迭代器()
返回查询的return子句的迭代器。格式是 一个映射,其中包含列的名称或其显式的键 名称(通过&#39; as&#39;设置),值是计算值。每 迭代器项是查询结果的一行。
换句话说,每次通过iterator()
循环都会提供一个包含结果行列的Map。 Map中的每个键都是列的名称,每个键的值都是列的数据。