【问题标题】:Spring Neo4j: Same cypher query taking different time when executed through different consolesSpring Neo4j:相同的密码查询在通过不同的控制台执行时需要不同的时间
【发布时间】:2014-07-01 11:14:52
【问题描述】:

通过不同的控制台执行相同的密码查询需要不同的时间:

通过 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;

    ...
}

【问题讨论】:

  • 如果重复查询怎么办?可能第一个查询很慢(250 毫秒)而从控制台它很快?如果您先从控制台运行查询会怎样?
  • 你是如何为实体建模的?用户中是否包含使用@Fetch 注释的朋友集?在那种情况下,从 SDN 花费很长时间的原因可能是将对象加载到内存中。高级映射也比简单映射更快。
  • @remigio 是对的,尤其是如果您使用 rest 数据库,这对于此类查询仍然非常无效
  • @frant.hartm 我多次交替执行相同的查询,每次都经历相同的行为
  • 查看this link,了解简单映射和高级映射之间的区别。它可以有所作为。此外@frant.hartm 指出了一个很好的说法:你使用的是 REST 服务器还是 Neo4j 的嵌入式版本?

标签: neo4j spring-data-neo4j


【解决方案1】:

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

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

因此,请确保在生产环境中为常见查询预热缓存。并确保您有足够的内存可供 JVM 和 Neo4j 使用。如果 Neo4j 可以访问足够的内存,大多数数据集都小于几 GB,因此可以放入内存中。

最后,确保您的索引到位(例如 CREATE INDEX ON :User(uid))。随着大部分图表及其属性加载到内存中,并且正确的索引到位,Neo4j 应该真正执行。

【讨论】:

  • 这与慢查询无关。当从不同的控制台运行时,它是相同的查询,但执行时间差异很大。
猜你喜欢
  • 1970-01-01
  • 2019-05-23
  • 2020-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-28
  • 2021-09-23
相关资源
最近更新 更多