Neo4j-Cypher 对 Gremlin 查询语言

我开始使用 RESTAPI 使用 Neo4j 进行开发。 我发现有两个选项可以用来执行复杂的查询—— Cypher (Neo4j 的查询语言)和 Gremlin (通用图形查询/遍历语言)。

以下是我想知道的-是否有任何查询或操作可以通过使用 Gremlin 完成,而不能使用 Cypher?还是相反?

在我看来,塞弗比 Gremlin 要清楚得多,而且总的来说,Neo4j 的人似乎都选择了塞弗。 But - if Cypher is limited compared to Gremlin - I would really like to know that in advance.

45481 次浏览

我最初开始使用 Gremlin。然而,当时 REST 接口有点不稳定,所以我转向了 Cypher。它对 Neo4j 有更好的支持。然而,有些类型的查询是 Cypher 无法实现的,或者 Cypher 不能像 Gremlin 那样进行优化。

Gremlin 是基于 Groovy 构建的,所以实际上你可以使用它作为一种通用的方法来让 Neo4j 执行‘ Java’代码和从服务器执行各种任务,而不必承受来自 REST 接口的 HTTP 命中。Gremlin 将允许您修改数据。

However, when all I want is to query data, I go with Cypher as it is more readable and easier to maintain. Gremlin is the fallback when a limitation is reached.

对于一般查询,Cypher 就足够了,而且可能更快。Gremlin 相对于塞弗的优势在于当你进入高层次穿越时。在 Gremlin,您可以更好地定义确切的遍历模式(或您自己的算法) ,而在 Cypher 中,引擎会尝试找到最佳遍历解决方案本身。

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

您总是可以很快地(在几天内)学习 Cypher,然后继续学习(长期)将军 Gremlin。

Neo4j 团队在 Cypher 上的努力确实令人印象深刻,而且取得了长足的进步。Neo 团队通常会把人们推向它,随着 Cypher 的成熟,Gremlin 可能会得到更少的关注。从长远来看,塞弗是个不错的选择。

也就是说,Gremlin 是一个 Groovy DSL。通过其 Neo4jREST 端点使用它可以完全、不受限制地访问底层的 Neo4jJavaAPI。它(以及同一类别中的其他脚本插件)在低级别功能方面无法匹配。另外,你可以运行 来自 Gremlin 插件的 Cypher

无论哪种方式,都有一个理智的升级途径,可以让你同时学到这两点。我会选那个能让你站起来跑得更快的。在 天啊 项目中,我通常使用 Gremlin,然后在需要表格结果或表达式模式匹配时调用 Cypher (无论是否从 Gremlin 内部调用)——这两者都是 Gremlin DSL 中的痛苦之处。

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

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

长答案短: 使用密码查询和 gremlin 遍历。您将看到自己的响应计时。

Cypher is a declarative query language for querying graph databases. The term declarative is important because is a different way of programming than programming paradigms like imperative.

在 Cypher 和 SQL 这样的声明性查询语言中,我们告诉底层引擎我们想要获取什么数据,而不指定我们想要如何获取数据。

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

Gremlin 同时具有声明性和命令性特征。它是一种图形遍历语言,用户必须给出关于如何导航图形的明确指令。

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

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

Neo4J clearly knows that Cypher isn't cutting it, because they also provide the APOC procedures which include an alternate path expander (apoc.path.expand, apoc.path.subgraphAll, etc).

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

我真的希望 Neo4J 附带一个可切换的 Gremlin 服务器(通过阅读,以前是这样的)。您可以让 Gremlin 与一个实时的 Neo4J 实例对抗,但是它涉及到很多问题。我希望,既然 Neo4J 的竞争对手允许 Gremlin 作为一个选项,Neo4J 将效仿。

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