我开始使用REST API开发Neo4j。我看到有两种执行复杂查询的选项-Cypher(Neo4j的查询语言)和Gremlin(通用图查询/遍历语言)。
这就是我想知道的-是否有任何查询或操作可以通过使用Gremlin来完成,而不能通过Cypher来完成?或相反亦然?
对我而言,Cypher似乎比Gremlin更清晰,总的来说,似乎Neo4j中的家伙正在与Cypher一起使用。但是-如果Cypher与Gremlin相比有限,我真的很想提前知道。
我开始使用REST API开发Neo4j。我看到有两种执行复杂查询的选项-Cypher(Neo4j的查询语言)和Gremlin(通用图查询/遍历语言)。
这就是我想知道的-是否有任何查询或操作可以通过使用Gremlin来完成,而不能通过Cypher来完成?或相反亦然?
对我而言,Cypher似乎比Gremlin更清晰,总的来说,似乎Neo4j中的家伙正在与Cypher一起使用。但是-如果Cypher与Gremlin相比有限,我真的很想提前知道。
Answers:
对于一般查询,Cypher就足够了,并且可能更快。相对于Cypher,Gremlin的优势在于您可以进行高级遍历。在Gremlin中,您可以更好地定义精确的遍历模式(或您自己的算法),而在Cypher中,引擎会尝试找到最佳的遍历解决方案本身。
由于其简单性,我个人使用了Cypher,到目前为止,我还没有遇到过必须使用Gremlin的情况(使用Gremlin graphML导入/导出功能除外)。但是,我希望即使我需要使用Gremlin,我也会在网上找到特定的查询,而以后再也不会使用它。
您总是可以在几天之内真正快速地学习Cypher,然后继续(长期运行)通用Gremlin。
我们必须遍历查询中的数千个节点。密码很慢。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.expand
,apoc.path.subgraphAll
等)。
Gremlin较难学习,但比Cypher和APOC强大。您可以实现在Gremlin中可以想到的任何逻辑。
我真的希望Neo4J带有可切换的Gremlin服务器(从阅读情况来看,以前是这样)。您可以使Gremlin在实时Neo4J实例上运行,但这涉及跳很多圈。我的希望是,由于Neo4J的竞争对手允许Gremlin作为选择,因此Neo4J将效仿。
Cypher是用于查询图形数据库的声明性查询语言。声明性一词很重要,因为它是不同于命令式编程范式的编程方式。
在诸如Cypher和SQL之类的声明性查询语言中,我们告诉底层引擎我们要获取哪些数据,而我们没有指定如何获取数据。
在Cypher中,用户在MATCH子句中定义了感兴趣的子图。然后,底层引擎运行模式匹配算法,以在图数据库中搜索子图的相似出现。
Gremlin是声明式和命令式功能。它是一种图形遍历语言,用户必须明确指示如何导航图形。
在这种情况下,这些语言之间的区别在于,在Cypher中,我们可以使用Kleene star运算符在图形数据库中找到任意两个给定节点之间的路径。但是,在Gremlin中,我们将必须明确定义所有此类路径。但是我们可以在Gremlin中使用重复运算符在图形数据库中查找多次此类显式路径。但是,在Cypher中不可能对显式结构进行迭代。