在Java中使用多个ResourceIterator对象?

时间:2014-05-05 19:03:59

标签: neo4j cypher

我的问题是:如何阅读从查询中回来的多个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;列表是空的。

1 个答案:

答案 0 :(得分:3)

您似乎只能通过ExecutionResult中的行迭代一次columnAs()方法遍历所有行,但仅返回单个列中的值。第二次调用columnAs()将不会返回任何值,因为您已经在ExecutionResult的末尾。

您需要重新构建逻辑并使用{​​{1}}方法,一次处理一行。

引用JavaDoc for iterator()

  

public ResourceIterator&lt; Map&lt; String,Object&gt;&gt;迭代器()

     

返回查询的return子句的迭代器。格式是   一个映射,其中包含列的名称或其显式的键   名称(通过&#39; as&#39;设置),值是计算值。每   迭代器项是查询结果的一行。

换句话说,每次通过iterator()循环都会提供一个包含结果行列的Map。 Map中的每个键都是列的名称,每个键的值都是列的数据。