繁体   English   中英

Neo4j - Cypher 与 Gremlin 查询语言

[英]Neo4j - Cypher vs Gremlin query language

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

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

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

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

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

你总是可以很快(几天)学习 Cypher,然后继续学习(长期)一般 Gremlin。

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

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

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

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

我最初开始使用 Gremlin。 不过当时REST接口有点不稳定,所以改用Cypher。 它对 Neo4j 有更好的支持。 但是,有些类型的查询在 Cypher 中根本无法实现,或者 Cypher 无法像使用 Gremlin 那样完全优化。

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

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

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

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

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

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

我真的希望 Neo4J 附带一个可切换的 Gremlin 服务器(从阅读中,这曾经是这种情况)。 您可以让 Gremlin 对一个实时的 Neo4J 实例运行,但这涉及跳过很多环节。 我的希望是,由于 Neo4J 的竞争对手允许 Gremlin 作为一种选择,Neo4J 会效仿。

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

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

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

Gremlin 既是声明性的,也是命令性的。 它是一种图形遍历语言,用户必须在其中给出有关如何导航图形的明确指令。

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

如果您使用gremlin,那么它允许您将其迁移到不同的图数据库,由于大多数图数据库支持gremlin 遍历,因此选择gremlin 是个好主意。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM