Neo4j-Cypher与Gremlin查询语言

Neo4j-Cypher与Gremlin查询语言,neo4j,graph-databases,cypher,gremlin,Neo4j,Graph Databases,Cypher,Gremlin,我开始使用RESTAPI开发Neo4j。 我看到执行复杂查询有两种选择——Cypher(Neo4j的查询语言)和Gremlin(通用图形查询/遍历语言) 我想知道的是,有没有什么查询或操作可以用Gremlin完成,而不能用Cypher完成?反之亦然 对我来说,Cypher似乎比Gremlin更清楚,而且总体而言,Neo4j中的人似乎都是和Cypher一起去的。 但是-如果Cypher与Gremlin相比是有限的-我真的很想提前知道这一点。我最初开始使用Gremlin。然而,当时REST接口有点不

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

我想知道的是,有没有什么查询或操作可以用Gremlin完成,而不能用Cypher完成?反之亦然

对我来说,Cypher似乎比Gremlin更清楚,而且总体而言,Neo4j中的人似乎都是和Cypher一起去的。
但是-如果Cypher与Gremlin相比是有限的-我真的很想提前知道这一点。

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

Gremlin是在Groovy上构建的,因此您实际上可以使用它作为让Neo4j执行“Java”代码和从服务器执行各种任务的通用方法,而不必从REST接口接受HTTP攻击。其中,Gremlin将允许您修改数据


然而,当我只想查询数据时,我使用Cypher,因为它更可读,更易于维护。当达到限制时,Gremlin是一种退路。

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

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


你可以很快(几天内)学会Cypher,然后继续学习(长期)Gremlin将军。

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

也就是说,Gremlin是一个Groovy DSL。通过其Neo4j REST端点使用它,可以完全、不受限制地访问底层Neo4j Java API。它(以及同一类别中的其他脚本插件)在低级别能力方面无法与之匹敌。另外,你可以跑步


无论哪种方式,都有一个明智的升级途径,让您同时学习这两种方法。我会选择那个能让你站起来跑得更快的。在中,当我需要表格结果或表达模式匹配时,我通常使用Gremlin,然后调用Cypher(无论是否从Gremlin中调用),这两个都是Gremlin DSL中的难题。

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

Gremlin查询可以通过编程方式生成。 (看看我是什么意思。)
使用Cypher似乎有点棘手。

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

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

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

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

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


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

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

Neo4J清楚地知道Cypher并没有切断它,因为它们还提供了APOC过程,其中包括一个备用路径扩展器(
APOC.path.expand
APOC.path.subgraph
,等等)

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

我真的希望Neo4J附带一个可切换的Gremlin服务器(从阅读资料来看,以前是这样)。你可以让Gremlin在一个真实的Neo4J实例上运行,但它需要跨越很多障碍。我的希望是,由于Neo4J的竞争对手允许Gremlin作为一种选择,Neo4J将效仿