Spring Neo4j:同一个密码查询在通过不同的控制台执行时占用不同的时间

时间:2014-07-01 11:14:53

标签: neo4j spring-data-neo4j

相同的密码查询在通过不同的控制台执行时花费不同的时间:

通过 spring-data-neo4j执行:(花了8秒)

@Query(
"MATCH (user:User {uid:{0}})-[:FRIEND]-(friend:User)" +
"RETURN friend"
)
public List<User> getFriends(String userId);

通过 http://localhost:7474/browser/执行:(耗时250毫秒)

通过 http://localhost:7474/webadmin/#/console/执行:(耗时18毫秒)

即使通过控制台执行的查询非常快并且在可接受的范围内花费时间,但是对于生产我必须​​从我的Java应用程序执行这些查询,在这种情况下,查询所花费的时间是完全不可接受的。

修改

@NodeEntity
public class User extends AbstractEntity {

    @RelatedToVia(elementClass = Friendship.class, type = FRIEND, direction = BOTH)
    private Set<Friendship>     friendships;

    ...
}

1 个答案:

答案 0 :(得分:-1)

确保在进行基准测试时至少运行3次测试,并计划删除第一项测试。我发现对于任何给定的查询,需要一次或两次运行来为Neo4j加热缓存。这与大多数不以相同方式缓存的RDBMS不同。

我的做法是运行5次测试查询并删除前2次。无论数据集的大小(我用数万和数十万个节点进行测试)以及数据集的复杂性,这对我来说都是非常一致的。脚本(我有一些Cypher语句,运行超过50行左右,多个WITHs等)。我发现的是,在前两次运行之后,从一次运行到下一次查询的性能往往保持在相同的值附近..

因此,请确保在制作过程中,您已为所有常见查询加热了缓存。并确保您有足够的内存可供JVM和Neo4j使用。如果Neo4j可以访问足够的内存,大多数数据集都小于几GB,因此可以适合内存。

最后,请确保您已准备好索引(例如,CREATE INDEX ON:User(uid))。大多数图形及其属性都加载到内存中,并且正确的索引就位,Neo4j应该真正执行。