Neo4j - Cypher vs Gremlin查询语言

时间:2012-12-11 17:04:02

标签: neo4j graph-databases cypher gremlin

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

以下是我想知道的内容 - 是否可以使用Gremlin完成任何查询或操作,而Cypher无法完成?反之亦然?

Cypher对我来说似乎比Gremlin更清楚,而且一般来说Neo4j中的人似乎都会选择Cypher。 但是 - 如果Cypher与Gremlin比较有限 - 我真的很想提前知道。

9 个答案:

答案 0 :(得分:61)

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

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

你总是可以非常快速地学习Cypher(在几天内),然后继续学习(长期)一般的Gremlin。

答案 1 :(得分:33)

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

答案 2 :(得分:25)

Neo4j团队在Cypher上的努力令人印象深刻,而且还有很长的路要走。 Neo团队通常会推动人们走向它,随着Cypher的成熟,Gremlin可能会受到更少的关注。 Cypher是一个很好的长期选择。

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

无论哪种方式,都有一个理智的升级路径,你可以学习它们。我会选择让你起得更快,跑得更快的那个。在my projects中,我通常使用Gremlin,然后在需要表格结果或表达模式匹配时调用Cypher(来自Gremlin内部),这两者都是Gremlin DSL的痛苦。

答案 3 :(得分:17)

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

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

然而,当我想要的只是查询数据时,我选择Cypher,因为它更易读,更易于维护。当达到限制时,Gremlin就是后备者。

答案 4 :(得分:7)

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

答案 5 :(得分:2)

Cypher是用于查询图形数据库的声明性查询语言。声明性一词很重要,因为它是一种不同于命令式编程范式的编程方式。在像Cypher和SQL这样的声明性查询语言中,我们告诉底层引擎我们要获取哪些数据,而我们没有指定如何获取数据。在Cypher中,用户在MATCH子句中定义了感兴趣的子图。然后,底层引擎运行模式匹配算法,以在图数据库中搜索子图的相似出现。 Gremlin是声明式和命令式功能。它是一种图形遍历语言,用户必须明确指示如何导航图形。在这种情况下,这些语言之间的差异在于,在Cypher中,我们可以使用Kleene star运算符在图形数据库中找到任意两个给定节点之间的路径。但是,在Gremlin中,我们将必须明确定义所有此类路径。但是我们可以在Gremlin中使用重复运算符在图形数据库中查找多次这样的显式路径。但是,在Cypher中不可能对显式结构进行迭代。

答案 6 :(得分:1)

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

答案 7 :(得分:1)

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

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

克里姆林宫较难学习,但比Cypher和AP​​OC强大。您可以在Gremlin中实现您可以想到的任何逻辑。

我真的希望Neo4J带有可切换的Gremlin服务器(从阅读情况来看,以前是这样)。您可以使Gremlin在实时Neo4J实例上运行,但这涉及跳很多圈。我的希望是,由于Neo4J的竞争对手允许选择Gremlin,Neo4J也会效仿。

答案 8 :(得分:0)

如果您使用gremlin,则可以将其迁移到其他图形数据库, 由于大多数图形数据库都支持gremlin遍历,因此选择gremlin是一个好主意。

相关问题