在这段代码中,我如何迭代ExecutionResult结果中的所有节点?
CypherParser parser = new CypherParser();
ExecutionEngine engine = new ExecutionEngine( graphDb );
Query query = parser.parse( "START n=node(2) MATCH (n)<-[:IS_A]-(x) RETURN x" );
ExecutionResult result = engine.execute( query );
// iterate over nodes in result and print all properties
答案 0 :(得分:9)
Cypher的javadoc对此并不十分清楚,可能是因为没有。
所以我在“试用版”中重新创建了代码,演示了如何迭代匹配中节点的属性。域是各种水果,其中每种都与“水果”节点相关联。运行查询后,相关代码段为:
Iterator<Node> kindsOfFruit = result.columnAs("x");
while (kindsOfFruit.hasNext()) {
Node kindOfFruit = kindsOfFruit.next();
System.out.println("Kind #" + kindOfFruit.getId());
for (String propertyKey : kindOfFruit.getPropertyKeys()) {
System.out.println("\t" + propertyKey + " : " +
kindOfFruit.getProperty(propertyKey));
}
}
这是关键result.columnAs("x")
。巧妙命名的String n
参数引用result子句中的“列名”。在这个例子中,我们想要“x”列,我们希望它包含Node
个对象,因此我们可以直接分配给Iterator<Node>
,然后使用它。
如果无法找到该列,我们会收到org.neo4j.graphdb.NotFoundException
。
如果我们要求分配到错误的班级,我们将获得通常的java.lang.ClassCastException
。
希望有所帮助。
干杯, 安德烈亚斯
答案 1 :(得分:3)
for (Map<String,Object> row : result) {
Node x = (Node)row.get("x");
for (String prop : x.getPropertyKeys()) {
System.out.println(prop +": "+x.getProperty(prop));
}
}
答案 2 :(得分:2)
Iterator<Object> columnAs = result.columnAs("n");
while(columnAs.hasNext())
{
Node n = (Node)columnAs.next();
for (String key : n.getPropertyKeys()) {
sysout("{ " + key + " : " + n.getProperty(key)+ " } ");
}
这可能会帮助你
答案 3 :(得分:1)
在较新版本的java驱动程序中,可以像这样遍历。
Driver driver = GraphDatabase.driver("bolt://localhost:7687", AuthTokens.basic("neo4j", "neo4j"));
Session session = driver.session();
List<String> teams = new ArrayList<>();
StatementResult cursor = session.run("match (l:League)<-[]-(t:Team) return t.short_name");
while (cursor.hasNext()) {
teams.add(cursor.next().get(cursor.keys().get(0)).toString());
}
session.close();
driver.close();