Neo4j-Cypher vs Gremlin查询语言


102

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

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

对我而言,Cypher似乎比Gremlin更清晰,总的来说,似乎Neo4j中的家伙正在与Cypher一起使用。但是-如果Cypher与Gremlin相比有限,我真的很想提前知道。


1
Cypher是一种非图灵完整的说明性语言。Gremlin是Neo4j Java API的精美包装,它势在必行。显然,在gremlin中可以做一些事情,而在密码中是做不到的。
Prakhar Agrawal

1
Apache Spark 3将包括Cypher,这充分说明了他们对此的看法。
沃克·罗

Answers:


77

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

由于其简单性,我个人使用了Cypher,到目前为止,我还没有遇到过必须使用Gremlin的情况(使用Gremlin graphML导入/导出功能除外)。但是,我希望即使我需要使用Gremlin,我也会在网上找到特定的查询,而以后再也不会使用它。

您总是可以在几天之内真正快速地学习Cypher,然后继续(长期运行)通用Gremlin。


2
neo4j.org/learn/cypher开始有一个新的在线教程,供您入门
Peter Neubauer 2012年

3
我的理解是Cypher更像SQL,因为您告诉它想要的内容,并且可以知道如何执行。使用Gremlin,您将发出必须遵守的精确遍历命令。
斯图尔特

2
对我而言,Gremlin在大多数查询中碰巧比Cypher快得多。
2014年

9
TinkerPop 3.x开始,Gremlin具有命令性和声明性特征。您可以按照此答案所述编写遍历以定义确切的遍历模式,也可以使用匹配步骤简单地定义您要查找的模式,Gremlin会为您解决。
stephen mallette 2016年

41

我们必须遍历查询中的数千个节点。密码很慢。Neo4j团队告诉我们,直接针对Java API实施算法的速度将提高100-200倍。我们这样做了,很容易就把其中的60倍了。截至目前,由于缺乏信心,我们的系统中没有单个Cypher查询。Easy Cypher查询很容易用Java编写,复杂的查询则无法执行。问题是,当您在查询中有多个条件时,Cypher中没有办法告诉您执行遍历的顺序。因此,您的密码查询可能首先会以错误的方向进入图表。我对Gremlin并没有做太多事情,但我可以想象到您可以使用Gremlin获得更多的执行控制。


当您说“直接针对Java API”时,是指嵌入Java的Neo4j吗?
帕维尔2014年

2
使用neo4j中作为独立服务器安装的服务器扩展。
海因里希

12
从2018年开始更新-考虑到在现代版本的neo4j中大量本机索引类型,此答案已经过时;neo4j已发布性能数据
FrobberOfBits '18年

3
“直接根据Java API实现我们的算法”实际上有点误导。显然,从A点到达B点的最快方法是走最短路径。这需要了解其他特定信息。降低级别总是会胜过机器计划者,因为您知道可以假设机器无法做到。但是,Cypher可以轻松胜过天真的实现的低级算法,所需知识要少得多,并且实现起来也快得多。特别是由于Cypher在每个Neo4j版本中都变得更好。(更明智的计划者)
Tezra

29

Neo4j团队在Cypher方面的努力确实给人留下了深刻的印象,并且取得了长足的进步。Neo团队通常会将人们推向它,随着Cypher的成熟,Gremlin可能会受到较少的关注。Cypher是一个不错的长期选择。

就是说-Gremlin是Groovy DSL。通过其Neo4j REST端点使用它可以完全不受限制地访问基础Neo4j Java API。它(以及同一类别中的其他脚本插件)就低级功能而言无法匹配。另外,您可以从Gremlin插件中运行Cypher

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


20

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

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

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


1
Cypher自Neo4j 1.7起就支持更新查询,请参阅docs.neo4j.org/chunked/snapshot/cypher-query-lang.html
Peter Neubauer

3
请注意,在TinkerPop 3中,REST接口将消失。用户应将Gremlin的字符串发送到Gremlin Server(基本上是Rexster,已重命名和改进)。
jbmusso 2014年

10

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


@MattLuongo:1,我不了解neo4django,2,并非在所有情况下都适用(例如,语言不是Python)3,如果您自己以编程方式编写查询或使用库来创建查询,则不一样以编程方式为您查询。在这方面,可以认为neo4django是Cypher和Gremlin的替代解决方案。
Tohotom

3
哦,当然,我不希望neo4django立即可用。这就是一个例子,就像您回答SQL Alchemy一样。但事实并非如此,生成Cypher 困难。Cypher和Gremlin采用不同的方法作为查询语言,但我不认为Cypher很难以编程方式生成...
Matt Luongo 2014年

8

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

Neo4j的清楚的知道,Cypher支架未切割的,因为它们还提供了APOC程序,其中包括一个备用路径膨胀机(apoc.path.expandapoc.path.subgraphAll等)。

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

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


1
neo4j是世界上最受欢迎的图形数据库,我认为他们可能还没有采用gremlin是有原因的。
卢克·阿隆

1
由于您不同意这些原因,因此我认为您的评论没有任何价值
user1302130

4

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

在诸如Cypher和SQL之类的声明性查询语言中,我们告诉底层引擎我们要获取哪些数据,而我们没有指定如何获取数据。

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

Gremlin是声明式和命令式功能。它是一种图形遍历语言,用户必须明确指示如何导航图形。

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


3

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.