我目前正在进行这样的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;");
Run Code Online (Sandbox Code Playgroud)
所以现在我想离开n,r和m.所以我尝试了以下内容:
Node node = IteratorUtil.single(result.javaColumnAs("n"));
Relationship relationship = IteratorUtil.single(result.javaColumnAs("r"));
Node otherNode = IteratorUtil.single(result.javaColumnAs("m"));
Run Code Online (Sandbox Code Playgroud)
现在这似乎不起作用.第一个请求始终有效,但第二个请求将返回一个空迭代器,因此对于关系或对象为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() + "; ");
}
}
Run Code Online (Sandbox Code Playgroud)
现在我希望我不是唯一一个认为这看起来不像我先尝试的代码那么好的人.现在有什么方法可以做得更好吗?
由于您要返回多个列,只需从行中按名称选择它们(这是一个Map,其中键是列名,值是列值):
for (Map<String, Object> row : result) {
node = (Node) row.get("n");
relationship = (Relationship) row.get("r");
otherNode = (Node) row.get("m");
}
Run Code Online (Sandbox Code Playgroud)
PS:您可能刚刚发布了一个示例,但请始终参数化您的查询
归档时间: |
|
查看次数: |
581 次 |
最近记录: |