neo4j ExecutionResult:提取多个列(因为javaColumnAs只能运行一次)

时间:2014-11-13 12:54:26

标签: java neo4j

我目前正在进行这样的cyper查询:

StringBuilderStringLogger logger = new StringBuilderStringLogger(new StringBuilder());
GraphDatabaseService neo4jDb = database.getDatabase();
ExecutionResult result = engine.execute("MATCH (n:Person{name:'Test'}) MATCH n-[r]->m RETURN n,r,m;");

所以现在我想离开n,r和m。所以我尝试了以下内容:

Node node = IteratorUtil.single(result.javaColumnAs("n"));
Relationship relationship = IteratorUtil.single(result.javaColumnAs("r"));
Node otherNode = IteratorUtil.single(result.javaColumnAs("m"));

现在这似乎不起作用。第一个请求始终有效,但第二个请求将返回一个空迭代器,因此对于关系或对象为null。 原因是,ExecutionResul是一个懒惰的迭代器。所以如果你经历过一次(比如javaColumnAs,它会迭代它),那么你之后就无法获得任何东西了。我在哪里找到这个解释:https://groups.google.com/forum/#!searchin/neo4j/javacolumnAs/neo4j/oUP_2b8mAlY/Sp39sfYm9_4J

现在,如果我这样做,它就能正常工作。

Node node = null;
Relationship relationship = null;
Node otherNode = null;

for (Map<String, Object> row : IteratorUtil.asIterable(result.javaIterator())) {
    for (Map.Entry<String, Object> column : row.entrySet()) {

        switch (column.getKey()){
            case "n":
                node = (Node) column.getValue();
                break;
            case "r":
                relationship = (Relationship) column.getValue();
                break;
            case "m":
                otherNode = (Node) column.getValue();
                break;
        }
        System.out.println(column.getKey() + ": " + column.getValue() + "; ");
    }
}

现在我希望我不是唯一一个认为这看起来不像我先尝试的代码那么好的人。现在有什么方法可以做得更好吗?

1 个答案:

答案 0 :(得分:6)

由于您要返回多个列,只需从行中按名称选择它们(这是一个Map,其中键是列名,值是列值):

for (Map<String, Object> row : result) {
   node = (Node) row.get("n");        
   relationship = (Relationship) row.get("r");
   otherNode = (Node) row.get("m"); 
}

PS:您可能刚刚发布了一个示例,但请始终参数化您的查询