110

我开始使用 REST API 使用 Neo4j 进行开发。我看到执行复杂查询有两种选择——Cypher(Neo4j 的查询语言)和 Gremlin(通用图形查询/遍历语言)。

这就是我想知道的 - 是否有任何查询或操作可以使用 Gremlin 完成而不能使用 Cypher 完成?或相反亦然?

Cypher 对我来说似乎比 Gremlin 清楚得多,而且总的来说,Neo4j 中的人似乎都在使用 Cypher。但是 - 如果 Cypher 与 Gremlin 相比是有限的 - 我真的很想提前知道这一点。

4

9 回答 9

88

对于一般查询,Cypher 就足够了,而且可能更快。Gremlin 相对于 Cypher 的优势在于您可以进行高级遍历。在 Gremlin 中,您可以更好地定义准确的遍历模式(或您自己的算法),而在 Cypher 中,引擎会尝试自行找到最佳遍历解决方案。

我个人使用 Cypher 是因为它的简单性,并且迄今为止,我还没有遇到任何必须使用 Gremlin 的情况(除了使用 Gremlin graphML 导入/导出函数)。然而,我希望即使我需要使用 Gremlin,我也会为我在网上找到的特定查询这样做,并且永远不会再回来。

你总是可以很快(在几天内)学习 Cypher,然后继续学习(长期)通用 Gremlin。

于 2012-12-12T09:26:47.033 回答
47

我们必须在查询中遍历数千个节点。Cypher 很慢。Neo4j 团队告诉我们,直接针对 Java API 实现我们的算法将快 100-200 倍。我们这样做了,并且轻松地从中获得了 60 倍的收益。由于缺乏信心,到目前为止,我们的系统中没有单个 Cypher 查询。Easy Cypher 查询很容易用 Java 编写,复杂的查询不会执行。问题是当您的查询中有多个条件时,Cypher 无法判断执行遍历的顺序。因此,您的密码查询可能首先会以错误的方向进入图表。我对 Gremlin 所做的不多,但我可以想象你使用 Gremlin 可以获得更多的执行控制。

于 2013-03-22T14:43:59.653 回答
29

Neo4j 团队在 Cypher 上的努力确实令人印象深刻,而且已经取得了长足的进步。Neo 团队通常会推动人们走向它,随着 Cypher 的成熟,Gremlin 可能会受到较少的关注。Cypher 是一个不错的长期选择。

也就是说——Gremlin 是一个 Groovy DSL。通过其 Neo4j REST 端点使用它可以完全、不受限制地访问底层 Neo4j Java API。它(以及同类别的其他脚本插件)在低级功率方面无法匹敌。另外,您可以从 Gremlin 插件中运行 Cypher

无论哪种方式,都有一个明智的升级路径,您可以同时学习两者。我会选择能让你更快地启动和运行的那个。在我的 项目中,我通常使用 Gremlin,然后在需要表格结果或表达模式匹配时调用 Cypher(无论是否在 Gremlin 内部)——这两者都是 Gremlin DSL 的痛点。

于 2013-01-04T16:20:57.227 回答
20

我最初开始使用 Gremlin。但是,当时 REST 接口有点不稳定,所以我切换到了 Cypher。它对 Neo4j 有更好的支持。但是,有些类型的查询根本无法使用 Cypher,或者 Cypher 无法完全优化您使用 Gremlin 的方式。

Gremlin 是基于 Groovy 构建的,因此您实际上可以将它用作让 Neo4j 执行“Java”代码并从服务器执行各种任务的通用方式,而无需从 REST 接口获取 HTTP 命中。其中,Gremlin 将允许您修改数据。

但是,当我只想查询数据时,我会选择 Cypher,因为它更具可读性且更易于维护。Gremlin 是达到限制时的后备方案。

于 2012-12-11T19:03:26.453 回答
10

Gremlin 查询可以通过编程方式生成。(请参阅http://docs.sqlalchemy.org/en/rel_0_7/core/tutorial.html#intro-to-generation-selects了解我的意思。)这对于 Cypher 来说似乎有点棘手。

于 2013-04-11T07:39:59.847 回答
9

Cypher 仅适用于简单查询。当您开始将复杂的业务逻辑整合到您的图遍历中时,它会变得异常缓慢或完全停止工作。

Neo4J 清楚地知道 Cypher 并没有削减它,因为它们还提供了 APOC 程序,其中包括备用路径扩展器(apoc.path.expand,apoc.path.subgraphAll等)。

Gremlin 更难学习,但比 Cypher 和 APOC 更强大。您可以在 Gremlin 中实现您能想到的任何逻辑。

我真的希望 Neo4J 附带一个可切换的 Gremlin 服务器(通过阅读,这曾经是这种情况)。你可以让 Gremlin 在一个实时的 Neo4J 实例上运行,但它需要跳过很多圈。我的希望是,既然 Neo4J 的竞争对手允许 Gremlin 作为选项,Neo4J 也会效仿。

于 2019-04-10T00:03:13.927 回答
8

Cypher 是一种用于查询图形数据库的声明式查询语言。声明式这个术语很重要,因为它是一种不同于命令式编程范式的编程方式。

在像 Cypher 和 SQL 这样的声明式查询语言中,我们告诉底层引擎我们想要获取什么数据,并且我们没有指定我们希望如何获取数据。

在 Cypher 中,用户在 MATCH 子句中定义了一个感兴趣的子图。然后底层引擎运行模式匹配算法来搜索图数据库中子图的相似出现。

Gremlin 既是声明性的又是命令式的特性。它是一种图形遍历语言,用户必须明确说明如何导航图形。

在这种情况下,这些语言之间的区别在于,在 Cypher 中,我们可以使用 Kleene 星号运算符来查找图形数据库中任意两个给定节点之间的路径。然而,在 Gremlin 中,我们必须明确定义所有此类路径。但是我们可以在 Gremlin 中使用重复运算符来查找图形数据库中此类显式路径的多次出现。但是,在 Cypher 中不可能对显式结构进行迭代。

于 2019-02-20T07:34:30.173 回答
4

如果你使用 gremlin,那么它可以让你迁移到不同的图数据库,由于大多数图数据库都支持 gremlin 遍历,所以选择 gremlin 是个好主意。

于 2019-10-26T10:51:47.823 回答
3

长答案短:使用 cypher 进行查询,使用 gremlin 进行遍历。您将自己看到响应时间。

于 2018-03-20T18:36:29.280 回答