相同的密码查询在通过不同的控制台执行时花费不同的时间:
通过 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;
...
}
答案 0 :(得分:-1)
确保在进行基准测试时至少运行3次测试,并计划删除第一项测试。我发现对于任何给定的查询,需要一次或两次运行来为Neo4j加热缓存。这与大多数不以相同方式缓存的RDBMS不同。
我的做法是运行5次测试查询并删除前2次。无论数据集的大小(我用数万和数十万个节点进行测试)以及数据集的复杂性,这对我来说都是非常一致的。脚本(我有一些Cypher语句,运行超过50行左右,多个WITHs等)。我发现的是,在前两次运行之后,从一次运行到下一次查询的性能往往保持在相同的值附近..
因此,请确保在制作过程中,您已为所有常见查询加热了缓存。并确保您有足够的内存可供JVM和Neo4j使用。如果Neo4j可以访问足够的内存,大多数数据集都小于几GB,因此可以适合内存。
最后,请确保您已准备好索引(例如,CREATE INDEX ON:User(uid))。大多数图形及其属性都加载到内存中,并且正确的索引就位,Neo4j应该真正执行。