我开始使用REST API开发Neo4j,我看到有两个选项可以执行复杂查询- Cypher(Neo4j的查询语言)和Gremlin(通用图形查询/遍历语言)。这是我想知道的--有没有什么查询或操作可以用Gremlin完成而不能用Cypher完成?或者反之亦然?Cypher对我来说似乎比Gremlin清楚得多,总的来说Neo4j中的家伙似乎会选择Cypher。但是-如果Cypher与Gremlin相比是有限的-我真的很想提前知道这一点。
3z6pesqy1#
对于一般的查询,Cypher已经足够了,而且可能更快。Gremlin比Cypher的优势在于当你进入高级遍历时。在Gremlin中,你可以更好地定义精确的遍历模式(或者你自己的算法),而在Cypher中,引擎试图自己找到最佳的遍历解决方案。我个人使用Cypher是因为它的简单性,到目前为止,我还没有遇到过任何必须使用Gremlin的情况(除了使用Gremlin graphML导入/导出函数)。然而,我希望,即使我需要使用Gremlin,我也会在网上找到一个特定的查询,并且永远不会再回来。你总是可以很快学会密码(几天),然后继续(长期)一般小精灵。
jaxagkaj2#
我们的查询需要遍历数千个节点。密码查询速度很慢。Neo4j团队告诉我们,直接针对Java API实现我们的算法会快100-200倍。我们这样做了,很容易就得到了因子60。到目前为止,由于缺乏信心,我们的系统中还没有一个密码查询。简单的密码查询很容易用Java编写,复杂的查询将无法执行。问题是,当查询中包含多个条件时,Cypher无法判断遍历的执行顺序。因此,您的Cypher查询可能会先在错误的方向上进入图中。我没有使用Gremlin做过很多工作,但我可以想象,使用Gremlin可以获得更多的执行控制。
bf1o4zei3#
Neo4j团队在Cypher上的努力确实令人印象深刻,而且已经取得了长足的进步。Neo团队通常会推动人们走向它,随着Cypher的成熟,Gremlin可能会得到更少的关注。Cypher是一个不错的长期选择。Gremlin是一个Groovy DSL。通过它的Neo4j REST端点使用它可以完全、不受限制地访问底层Neo4j Java API。它(以及同类的其他脚本插件)在低级功能方面无法与之相比。另外,您可以在Gremlin插件中运行Cypher。无论哪种方式,都有一条明智的升级路径,你可以同时学习这两种方法。我会选择让你更快地启动和运行的方法。在myprojects中,当我需要表格结果或表达模式匹配时,我通常使用Gremlin,然后调用Cypher(无论是否在Gremlin中)--这两种方法都是Gremlin DSL中的一个难题。
qmb5sa224#
我最初开始使用Gremlin。但是,当时,REST界面有点不稳定,所以我切换到Cypher。它对Neo4j有更好的支持。但是,有一些类型的查询根本不可能使用Cypher,或者Cypher不能像使用Gremlin那样优化。Gremlin是在Groovy上构建的,所以你实际上可以把它作为一种通用的方法来让Neo4j执行“Java”代码,并从服务器执行各种任务,而不必从REST接口接受HTTP的攻击。然而,当我想要的只是查询数据时,我会选择Cypher,因为它更具可读性,更容易维护。
v09wglhw5#
Gremlin查询可以通过编程方式生成。(请参阅http://docs.sqlalchemy.org/en/rel_0_7/core/tutorial.html#intro-to-generative-selects了解我的意思。)使用Cypher时,这似乎有点棘手。
9wbgstp76#
Cypher只适用于简单的查询,当你开始将复杂的业务逻辑合并到你的图形遍历中时,它会变得非常慢或者完全停止工作。Neo4J清楚地知道Cypher不会削减它,因为他们还提供了APOC程序,其中包括一个备用路径扩展器(apoc.path.expand,apoc.path.subgraphAll等)。Gremlin比较难学,但是它比Cypher和APOC更强大。你可以在Gremlin中实现任何你能想到的逻辑。我真的希望Neo4J附带一个可切换的Gremlin服务器(从阅读资料来看,过去是这样的)。你可以让Gremlin运行在一个实时的Neo4J示例上,但这需要跨越很多障碍。我希望,既然Neo4J的竞争对手允许Gremlin作为一个选项,Neo4J也会效仿。
apoc.path.expand
apoc.path.subgraphAll
iszxjhcz7#
Cypher是一种用于查询图形数据库的声明式查询语言。声明式一词很重要,因为它是一种不同于命令式编程范式的编程方式。在声明式查询语言(如Cypher和SQL)中,我们告诉底层引擎我们想要获取什么数据,而不指定我们想要如何获取数据。在Cypher中,用户在MATCH子句中定义感兴趣的子图,然后底层引擎运行模式匹配算法在图数据库中搜索子图的相似出现。Gremlin是一种声明性和命令性的特性,它是一种图遍历语言,用户必须给予关于如何导航图的显式指令。在这种情况下,这两种语言之间的区别在于,在Cypher中,我们可以使用Kleene星星运算符来查找图数据库中任意两个给定节点之间的路径。然而,在Gremlin中,我们必须显式地定义所有这样的路径。但是,在Gremlin中,我们可以使用重复运算符来查找图数据库中多次出现的这样的显式路径。然而,在Cypher中,在显式结构上进行迭代是不可能的。
sdnqo3pr8#
如果你使用gremlin,那么它允许你迁移到不同的图形数据库,因为大多数图形数据库支持gremlin遍历,选择gremlin是个好主意。
k0pti3hp9#
长答短:使用cypher进行查询,使用gremlin进行遍历。您将自己看到响应时间。
9条答案
按热度按时间3z6pesqy1#
对于一般的查询,Cypher已经足够了,而且可能更快。Gremlin比Cypher的优势在于当你进入高级遍历时。在Gremlin中,你可以更好地定义精确的遍历模式(或者你自己的算法),而在Cypher中,引擎试图自己找到最佳的遍历解决方案。
我个人使用Cypher是因为它的简单性,到目前为止,我还没有遇到过任何必须使用Gremlin的情况(除了使用Gremlin graphML导入/导出函数)。然而,我希望,即使我需要使用Gremlin,我也会在网上找到一个特定的查询,并且永远不会再回来。
你总是可以很快学会密码(几天),然后继续(长期)一般小精灵。
jaxagkaj2#
我们的查询需要遍历数千个节点。密码查询速度很慢。Neo4j团队告诉我们,直接针对Java API实现我们的算法会快100-200倍。我们这样做了,很容易就得到了因子60。到目前为止,由于缺乏信心,我们的系统中还没有一个密码查询。简单的密码查询很容易用Java编写,复杂的查询将无法执行。问题是,当查询中包含多个条件时,Cypher无法判断遍历的执行顺序。因此,您的Cypher查询可能会先在错误的方向上进入图中。我没有使用Gremlin做过很多工作,但我可以想象,使用Gremlin可以获得更多的执行控制。
bf1o4zei3#
Neo4j团队在Cypher上的努力确实令人印象深刻,而且已经取得了长足的进步。Neo团队通常会推动人们走向它,随着Cypher的成熟,Gremlin可能会得到更少的关注。Cypher是一个不错的长期选择。
Gremlin是一个Groovy DSL。通过它的Neo4j REST端点使用它可以完全、不受限制地访问底层Neo4j Java API。它(以及同类的其他脚本插件)在低级功能方面无法与之相比。另外,您可以在Gremlin插件中运行Cypher。
无论哪种方式,都有一条明智的升级路径,你可以同时学习这两种方法。我会选择让你更快地启动和运行的方法。在myprojects中,当我需要表格结果或表达模式匹配时,我通常使用Gremlin,然后调用Cypher(无论是否在Gremlin中)--这两种方法都是Gremlin DSL中的一个难题。
qmb5sa224#
我最初开始使用Gremlin。但是,当时,REST界面有点不稳定,所以我切换到Cypher。它对Neo4j有更好的支持。但是,有一些类型的查询根本不可能使用Cypher,或者Cypher不能像使用Gremlin那样优化。
Gremlin是在Groovy上构建的,所以你实际上可以把它作为一种通用的方法来让Neo4j执行“Java”代码,并从服务器执行各种任务,而不必从REST接口接受HTTP的攻击。
然而,当我想要的只是查询数据时,我会选择Cypher,因为它更具可读性,更容易维护。
v09wglhw5#
Gremlin查询可以通过编程方式生成。(请参阅http://docs.sqlalchemy.org/en/rel_0_7/core/tutorial.html#intro-to-generative-selects了解我的意思。)使用Cypher时,这似乎有点棘手。
9wbgstp76#
Cypher只适用于简单的查询,当你开始将复杂的业务逻辑合并到你的图形遍历中时,它会变得非常慢或者完全停止工作。
Neo4J清楚地知道Cypher不会削减它,因为他们还提供了APOC程序,其中包括一个备用路径扩展器(
apoc.path.expand
,apoc.path.subgraphAll
等)。Gremlin比较难学,但是它比Cypher和APOC更强大。你可以在Gremlin中实现任何你能想到的逻辑。
我真的希望Neo4J附带一个可切换的Gremlin服务器(从阅读资料来看,过去是这样的)。你可以让Gremlin运行在一个实时的Neo4J示例上,但这需要跨越很多障碍。我希望,既然Neo4J的竞争对手允许Gremlin作为一个选项,Neo4J也会效仿。
iszxjhcz7#
Cypher是一种用于查询图形数据库的声明式查询语言。声明式一词很重要,因为它是一种不同于命令式编程范式的编程方式。
在声明式查询语言(如Cypher和SQL)中,我们告诉底层引擎我们想要获取什么数据,而不指定我们想要如何获取数据。
在Cypher中,用户在MATCH子句中定义感兴趣的子图,然后底层引擎运行模式匹配算法在图数据库中搜索子图的相似出现。
Gremlin是一种声明性和命令性的特性,它是一种图遍历语言,用户必须给予关于如何导航图的显式指令。
在这种情况下,这两种语言之间的区别在于,在Cypher中,我们可以使用Kleene星星运算符来查找图数据库中任意两个给定节点之间的路径。然而,在Gremlin中,我们必须显式地定义所有这样的路径。但是,在Gremlin中,我们可以使用重复运算符来查找图数据库中多次出现的这样的显式路径。然而,在Cypher中,在显式结构上进行迭代是不可能的。
sdnqo3pr8#
如果你使用gremlin,那么它允许你迁移到不同的图形数据库,因为大多数图形数据库支持gremlin遍历,选择gremlin是个好主意。
k0pti3hp9#
长答短:使用cypher进行查询,使用gremlin进行遍历。您将自己看到响应时间。