0

我正在使用 neo4j java-rest-binding 项目实现遍历框架。代码如下:

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

任何人都可以检查为什么会发生这种情况,或者如果我做错了,那么正确的方法是什么。提前致谢。

4

1 回答 1

0

我不相信通过 REST DB 绑定使用 Neo4j Traversal Framework 得到适当支持,也不可取。如果您通过 REST 进行遍历,则随着遍历的进行,每个节点和每个关系都将通过网络进行检索,从而导致遍历的巨大开销。

编辑:以上不正确,REST 遍历器比我想象的要聪明。

一般来说,使用 Cypher 会更快,使用 JDBC 访问 Neo4j Server。在此处阅读有关 JDBC 的更多信息:https ://github.com/neo4j-contrib/neo4j-jdbc

如果你真的想使用 Traversal Framework,你应该使用 Server Extensions,它允许你设计一个遍历在服务器本身上运行,然后只在网络上移动遍历的结果。在此处阅读有关服务器扩展的更多信息:http: //docs.neo4j.org/chunked/stable/server-unmanaged-extensions.html

于 2014-04-01T07:41:25.133 回答