2011-12-28 130 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)+ " } "); 
} 

這可能會幫助你