2014-03-31 22 views
0

我正在使用neo4j java-rest-binding項目實現遍歷框架。 代碼如下:無法從RestTraverser訪問iterator(),它會給出異常java.lang.IllegalAccessError

RestAPI db = new RestAPIFacade("http://localhost:7474/db/data"); 
RestNode n21 = db.getNodeById(21); 
Map<String,Object> traversalDesc = new HashMap<String, Object>(); 
traversalDesc.put("order", "breadth_first"); 
traversalDesc.put("uniqueness", "node_global"); 
traversalDesc.put("uniqueness", "relationship_global"); 
traversalDesc.put("returnType", "fullpath"); 
traversalDesc.put("max_depth", 2); 
RestTraverser traverser = db.traverse(n21, traversalDesc); 
Iterable<Node> nodes = traverser.nodes(); 
System.out.println("All Nodes:");  // First Task 
for(Node n:nodes){ 
System.out.println(n.getId()); 
} 
Iterable<Relationship> rels = traverser.relationships(); 
System.out.println("All Relations:"); // Second Task 
for(Relationship r:rels){ 
System.out.println(r.getId()); 
} 
Iterator<Path> paths = traverser.iterator(); // Third Task 
while(paths.hasNext()){ 
    System.out.println(paths.next()); 
} 

我需要做3個任務註釋代碼:

  1. 打印所有節點沒有相關的節點ID。 21
  2. 打印所有與節點號相關的關係ID。 21
  3. 遍歷所有與節點號相關的路徑。 21

任務1 & 2工作正常。 但是,當我嘗試做traverser.iterator()在第三個任務,它拋出一個異常說法:

java.lang.IllegalAccessError: tried to access class org.neo4j.helpers.collection.WrappingResourceIterator from class org.neo4j.rest.graphdb.traversal.RestTraverser 

任何人都可以請爲什麼發生這種情況,或者如果我做錯了又是什麼做的正確方法。 在此先感謝。

+0

你可以分享完整的堆棧跟蹤嗎? –

+0

你的客戶項目中有哪些neo4j版本?和哪個版本的java-rest-binding?他們應該匹配。 –

+0

我使用2.0.1 neo4j和java-rest-binding(neo4j-rest-graphdb.jar)獲得了相同的'java.lang.IllegalAccessError:org/neo4j/helpers/collection/WrappingResourceIterator'。看起來像'org.neo4j.helpers.collection.WrappingResourceIterator'已經在[neo4j-kernel](https://github.com/neo4j/neo4j/blame/master/community/kernel/src/ main/java/org/neo4j/helpers/collection/WrappingResourceIterator.java) – alphageek

回答

0

我不相信通過REST DB綁定使用Neo4j遍歷框架得到了適當的支持,這也不是可取的。如果您通過REST遍歷,隨着遍歷的進行,每個節點和每個關係都將在網絡中檢索,導致遍歷的巨大開銷。

編輯:以上是不正確的,REST遍歷器比我想象的更聰明。

一般來說,使用Cypher並使用JDBC訪問Neo4j服務器會更快。在這裏閱讀有關JDBC的更多信息:https://github.com/neo4j-contrib/neo4j-jdbc

如果您確實想使用遍歷框架,您應該使用服務器擴展,它允許您設計一個遍歷在服務器本身上運行,然後只移動遍歷的結果通過網絡。點擊這裏瞭解更多關於服務器擴展的信息:http://docs.neo4j.org/chunked/stable/server-unmanaged-extensions.html

+1

實際上,rest-traverser收集客戶端上的信息,並向服務器發送遍歷描述以執行。 –

相關問題