Spring 数据 Neo4j 比休息慢得离谱

Spring Data Neo4j Ridiculously Slow Over Rest

     public List<Errand> interestFeed(Person person, int skip, int limit)
        throws ControllerException {

    person = validatePerson(person);
    String query = String
            .format("START n=node:ErrandLocation('withinDistance:[%.2f, %.2f, %.2f]') RETURN n  ORDER BY n.added DESC SKIP %s LIMIT %S",
                    person.getLongitude(), person.getLatitude(),
                    person.getWidth(), skip, limit);
    String queryFast = String
            .format("START n=node:ErrandLocation('withinDistance:[%.2f, %.2f, %.2f]') RETURN n SKIP %s LIMIT %S",
                    person.getLongitude(), person.getLatitude(),
                    person.getWidth(), skip, limit);
    Set<Errand> errands = new TreeSet<Errand>();
    System.out.println(queryFast);

    Result<Map<String, Object>> results = template.query(queryFast, null);


    Iterator<Errand> objects = results.to(Errand.class).iterator();
    return copyIterator (objects);
}

public List<Errand> copyIterator(Iterator<Errand> iter) {
    Long start = System.currentTimeMillis();
    Double startD = start.doubleValue();
    List<Errand> copy = new ArrayList<Errand>();
    while (iter.hasNext()) {
        Errand e = iter.next();
        copy.add(e);
        System.out.println(e.getType());
    }
    Long end = System.currentTimeMillis();
    Double endD = end.doubleValue();
    p ((endD - startD)/1000);
    return copy;
}

当我分析 copyIterator 函数时,大约需要 6 秒才能获取 10 个结果。我使用 Spring Data Neo4j Rest 连接我本地机器上的 Neo4j 服务器 运行。我什至放了一个打印函数来查看迭代器转换为列表的速度有多快,它看起来确实很慢。每个 iterator.next() 是否进行新的 Http 调用?

如果 Errand 是一个节点实体,那么是的,spring-data-neo4j 将为每个实体进行 http 调用以获取其所有标签(这是 neo4j 的错,它不会 return 标签,当你 return 整个节点在密码中)。

您可以在 org.springframework.data.neo4j.rest.SpringRestCypherQueryEngine 中启用调试级别日志记录,以记录所有进入 neo4j 的密码语句。

要避免此调用,请使用 @QueryResult http://docs.spring.io/spring-data/data-neo4j/docs/current/reference/html/#reference_programming-model_mapresult