2011-12-28 135 views
7

在这段代码中,我如何遍历ExecutionResult结果中的所有节点?Neo4j Cypher:如何遍历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 

回答

8

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参数引用结果子句中的“列名”。在这个例子中,我们需要“x”列,我们期望它包含Node对象,所以我们可以直接指定到Iterator<Node>然后使用它。如果找不到列,我们会得到一个org.neo4j.graphdb.NotFoundException

如果我们要求分配到错误的班级,我们会得到通常的java.lang.ClassCastException

完整的工作示例,请访问: https://github.com/akollegger/neo4j-trials/blob/master/src/test/java/org/akollegger/neo4j/trials/richardw/ExecutionResultIteratorTrial.java

希望有所帮助。

干杯, 安德烈亚斯

+0

我在http://api.neo4j.org加入javadoc的一些基本的解释,也是,可见 – akollegger 2011-12-29 20:33:23

+0

重要的是要注意,这是一个'scala.collection.Iterator',而不是'java.util.Iterator'! – jocull 2013-10-25 18:09:31

2
for (Map<String,Object> row : result) { 
    Node x = (Node)row.get("x"); 
    for (String prop : x.getPropertyKeys()) { 
     System.out.println(prop +": "+x.getProperty(prop)); 
    } 
} 
+0

它在x在每一行中具有单个值时有效。如果x在一行中有多个值,你将如何迭代? (例如)。在x,芒果,橙,香蕉在第一行。梨,樱桃在第二行。当我与这样的考试合作时,它会引发我的classcast异常。你有什么主意吗? – priya 2016-01-10 09:13:33

1
Iterator<Object> columnAs = result.columnAs("n"); 
while(columnAs.hasNext()) 
{ 
Node n = (Node)columnAs.next(); 
for (String key : n.getPropertyKeys()) { 
sysout("{ " + key + " : " + n.getProperty(key)+ " } "); 
} 

这可能会帮助你