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
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