【问题标题】:General Cypher performance通用 Cypher 性能
【发布时间】:2013-03-12 11:19:44
【问题描述】:

在参加了一个非常有趣的以 Cypher 为重点的教程后,我对 Cypher 查询语言的声明性感到惊喜。在我看来,这是从 Neo4J 检索数据的一种非常自然的方式。

在此之前,我只使用过原生 API。虽然这不是声明性的,但你会在一段时间后习惯它。复杂的结构都非常相似,仅在我的具体项目的细节上有所不同。

不过,Cypher 对我来说看起来更自然,所以我正在考虑构建我的应用程序的第二个版本,主要使用 Cypher 查询来与我的数据库交互。但是我遇到了一个问题。

有很多方法可以将我的应用程序转换为 Cypher,在尝试了几个可能的查询后,所有查询都达到了预期的结果,即使是最快的查询似乎仍然比原生 API 慢 20 倍。

现在,我不介意为了声明性而放弃一些性能,但是对于一个已经在性能上苦苦挣扎的应用程序,20 倍对我来说有点过分了。是否有解决此问题的方法,还是我只需要坚持使用本机 API?

【问题讨论】:

  • 您能分享一些您的疑问吗?也许你的数据集?很想看看,应该不会那么慢。您使用的是哪个 Neo4j 版本?
  • 数据集因用户上传的文件而异。我使用的是 1.9.M05 atm,但我也尝试过使用最新的稳定版本。今晚我会发布一些我的查询,但问题是我在 Cypher 中不够具体。使用 Core API,我可以仔细控制每一步,并且了解我的数据库结构,这意味着我不必处理大量无用的关系,而在 Cypher 中我必须这样做。

标签: neo4j cypher


【解决方案1】:

你的结论对我来说听起来很熟悉。当我同时使用 Neo4j 和 Spring Data Neo4j 时,我也遇到了性能问题。在性能真正重要的部分,我切换到核心 Traversal API,它现在比普通的 Cypher 查询快得多。这与没有处理查询的事实以及您控制遍历的各个方面的事实有很大关系。 Cypher 只能猜测最优策略是什么。我相信它会在(不久的)将来加快速度,但如果性能真的很重要,我会说坚持使用核心 API。

另外,如果您使用 java 和 spring data neo4j,请考虑使用比简单映射模式快得多的高级映射模式 (AspectJ)。

【讨论】:

  • 实际上,根据我所做的一些测试,添加的 Spring Data 层也减慢了我的应用程序。因此,我制作了自己的界面,以针对我的特定应用程序以最有效的方式直接与数据库对话。我想将该接口的实现转换为 Cypher,但我不知道它会破坏我的性能。
  • 虽然 Cypher 可能总是比使用核心 API 慢,但您可以尝试调整您的 Cypher 语句。这是一个很好的资源,对我帮助很大:thought-bytes.blogspot.in/2013/01/…
  • 这是另一篇精彩的文章:rene-pickhardt.de/…。它比较了核心 API、遍历 API 和多个 Cypher 版本的速度。
  • 是的,我找到了那个链接。但我的查询远没有皮克哈特先生的复杂。尽管如此,在无休止地优化我的查询之后,它们仍然没有接近原生 api 的速度。我只能想象当您使用更复杂的查询时会有什么不同。
  • 也许 blueprints 项目的 Gemlin 也是一种选择,但据我所知,它与 Neo4j 结合使用并不广泛。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多