使用@MapResult在spring-data-neo4j中的性能

时间:2013-03-25 06:41:08

标签: performance rest neo4j cypher spring-data-neo4j

我正在使用spring-data-neo4j通过REST api访问独立的Neo4J服务器。使用@MapResult通过spring存储库检索对象时,会观察到严重的性能问题,以转换检索到的对象列表。

首先,我在服务器日志( http.log )中观察到,当我们开始在检索到的@MapResult接口上迭代或调用getter / setter时,会在后台触发大量REST请求。在一个案例中,当Neo4J服务器在同一台机器上运行时,它在迭代和访问5 @MapResult个对象的列表时发出了1900多个休息请求,但需要超过6秒。

我将问题简化为获取一个简单的关系,如下所示。我可以在Neo4J服务器日志中看到,当我调用 MyMapResultInterface.getRoute()时,会触发9个http请求来获取这个单个对象。 是否有这么多的http请求/设计?或者我错过了什么?我可以找到关于@MapResult的使用及其影响的文档。

关系模型:

@RelationshipEntity(type="ROUTE")
@TypeAlias("Route")
public class Route {

    @GraphId 
    private Long id;

    @StartNode
    private Location startAt;

    @EndNode
    private Location endAt;

    private String routeName;
    private String city;
    private long distance;
    private Date createdOn;
}
当我调用 MyMapResultInterface.getRoute()时,

http.log 中的日志:

GET /db/data/relationship/28 HTTP/1.1" 200 0 "-" "neo4j-rest-graphdb/1.8.RC2
GET /db/data/relationship/28 HTTP/1.1" 200 0 "-" "neo4j-rest-graphdb/1.8.RC2
GET /db/data/relationship/28 HTTP/1.1" 200 0 "-" "neo4j-rest-graphdb/1.8.RC2
GET /db/data/relationship/28 HTTP/1.1" 200 0 "-" "neo4j-rest-graphdb/1.8.RC2
GET /db/data/relationship/28 HTTP/1.1" 200 0 "-" "neo4j-rest-graphdb/1.8.RC2
GET /db/data/relationship/28 HTTP/1.1" 200 0 "-" "neo4j-rest-graphdb/1.8.RC2
GET /db/data/node/13/properties HTTP/1.1" 200 0 "-" "neo4j-rest-graphdb/1.8.RC2
GET /db/data/relationship/28 HTTP/1.1" 200 0 "-" "neo4j-rest-graphdb/1.8.RC2
GET /db/data/node/25/properties HTTP/1.1" 200 0 "-" "neo4j-rest-graphdb/1.8.RC2

上面可以看到许多重复的 GET 。只是一种解释,看起来像/db/data/relationship/28 GETs 的数量等于对象 Route 中的字段总数,并且有两个 GET < / em>可能针对/db/data/node/{nodeId}/properties@StartNode字段的@EndNode请求。

修改 根据我的观察,我注意到这不仅是@MapResult的问题,而且还有来自存储库方法的简单映射结果的问题,如下所示

Iterable<Route> routes = routeRepository.getAvailableRoutesForUser(user.getId());

即使这会向neo4j服务器发出大量的http休息请求。

更新

正如Michael Hunger在答案中所建议的那样,这两种方法可以通过Neo4j REST api提高性能。但是,这会导致非常复杂的密码查询以及难以管理且难以维护的代码。

因此,最终在评估了所有方法之后,我们决定取消Neo4j REST界面并开始使用Neo4j嵌入式。并且Neo4j嵌入式不适用于Heroku我们不得不取消Heroku 。我们将应用程序迁移到Amazon AWS。

我们希望Neo4j能够尽早在生产环境中提供性能可接受的远程访问通道。

1 个答案:

答案 0 :(得分:2)

好的一点,一般而言,SDN的对象表示尚未针对Neo4j服务器REST交互进行优化。这将在使用Neo4j的二进制协议和密码的下一个主要版本中发生变化。

您是否可以测试从Cypher和

返回您感兴趣的信息
  1. 直接从Result<Map<String,Object>>读取方法返回类型和
  2. 来自只显示这些原始类型的MapResult