Neo4j - Cypher vs Gremlin查询语言

Rub*_*nsh 95 neo4j graph-databases cypher gremlin

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

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

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

ulk*_*kas 71

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

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

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

  • 截至[TinkerPop 3.x](http://tinkerpop.apache.org/),Gremlin具有命令性和声明性特征.您可以编写遍历以定义本答案中所述的精确遍历模式,或者您可以使用[匹配步骤](http://tinkerpop.apache.org/docs/3.1.1-incubating/reference/#match-step)简单地定义你正在寻找的模式,Gremlin将解决这个问题. (8认同)
  • 从http://www.neo4j.org/learn/cypher开始有一个新的在线教程,您也可以继续学习. (2认同)
  • 我理解Cypher更像是SQL,因为你告诉它你想要什么,并且知道如何做到这一点.使用Gremlin,您可以发出必须遵守的精确遍历命令. (2认同)
  • 对我来说,在大多数查询中,Gremlin恰好比Cypher快得多. (2认同)

Hei*_*ich 39

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

  • 从2018年更新 - 鉴于neo4j的现代版本中有大量原生索引类型,这个答案已基本过时; neo4j发布了性能数据 (8认同)
  • “直接根据Java API实现我们的算法”实际上有点误导。显然,从A点到达B点的最快方法是走最短路径。这需要了解其他特定信息。降低级别将永远胜过机器计划器,因为您知道可以假设机器做不到。但是,Cypher可以轻松胜过天真的实现的低级算法,所需的知识要少得多,实现起来也快得多。特别是由于Cypher在每个Neo4j版本中都变得更好。(更聪明的计划者) (3认同)
  • 使用neo4j中的服务器扩展作为独立服务器安装. (2认同)

Mat*_*ngo 28

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

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

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


Lou*_*eau 18

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

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

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

  • 请注意,REST接口将在TinkerPop 3中消失.用户需要将Gremlin的字符串发送到Gremlin Server(基本上是Rexster,重命名和改进). (2认同)

小智 9

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

  • 哦,当然我不希望neo4django立即适用; 这是一个例子,就像SQL Alchemy在你的答案中一样.但是生成Cypher并不是很困难.Cypher和Gremlin采用不同的方法作为查询语言,但我不知道Cypher如何更难以编程生成... (3认同)

use*_*130 8

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

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

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

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

  • 因为您没有分享这些原因可能是什么,所以我认为您的评论没有任何价值 (4认同)

小智 7

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

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

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

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

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


小智 5

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