2013-02-11 66 views
0

我正在運行一個很好的兩部分Neo4j搜索。如何加快解析Neo4j ExecutionResult集?

result = engine.execute("START facility=node({id}), service=node({serviceIds}) WHERE facility-->service RETURN facility.name as facilityName, service.name as serviceName", cypherParams); 

for (Map<String, Object> row : result) 
{   
    sb.append((String) row.get("facilityName")+" : " + (String) row.get("serviceName") + "<BR/>"); 
} 

爲加快這件事有什麼建議:不過,ExecutionResult一套實際的解析是由我通過ExecutionResult地圖循環如下一個8或10因數大於Cypher支架查詢需要更長的時間?謝謝

+0

多少行,你在'result'得到了什麼? – ulkas 2013-02-12 08:03:33

+0

我得到的行少於100行,需要大約4秒才能遍歷地圖。 – 2013-02-12 14:22:18

回答

1

您是否需要訪問實體或是否足以使用節點(從而使用核心API)?在後一種情況下,您可以使用比Cypher更快的遍歷API。

我不知道你的使用情況是什麼,但根據情況,你也可能做這樣的事情:

for (final Path position : Traversal.description().depthFirst() 
     .relationships(YOUR_RELATION_TYPE, Direction.INCOMING) 
     .uniqueness(Uniqueness.NODE_RECENT) 
     .evaluator(Evaluators.toDepth(1) 
     .traverse(facilityNode,serviceNode)) { 
     // do something like e.g. position.endNode().getProperty("name") 
    } 
+0

感謝您的反饋。有沒有一種方法使用遍歷API來傳入想要限制遍歷的一組節點?在我們上面的例子中,我們傳入了Cypher查詢的一個節點標識列表,我們從作爲第一步運行的Neo4j空間查詢中獲取。我們只想在隨後的遍歷中包含這組節點。 – 2013-02-12 15:38:38

+0

據我所知,你只能提供你想從頭開始的節點。如果這裏是節點之間的最小和最大距離,則可以像上例中那樣在Evaluator中指定它們。接下來,您可以檢查* position.endNode()*是否與您希望的任何節點相對應。 – tstorms 2013-02-12 15:52:46