Neo4j – Cypher vs Gremlin查询语言
我正在开始使用REST API与Neo4j一起开发。 我发现执行复杂查询有两种select:Cypher(Neo4j的查询语言)和Gremlin(通用graphics查询/遍历语言)。
这是我想知道的 – 是否有任何查询或操作,可以通过使用Gremlin完成,不能用Cypher完成? 或相反亦然?
Cypher似乎比Gremlin更清楚,总的来说,Neo4j的人似乎正在和Cypher一起。 但是 – 如果Cypher与Gremlin相比是有限的 – 我真的想提前知道。
对于一般的查询,Cypher就足够了,可能会更快。 Gremlin优于Cypher的优点是当你进入高级遍历 – 在Gremlin中,你可以更好地定义确切的遍历模式(或者你自己的algorithm),而在Cypher中引擎试图自己find最好的遍历解决scheme。
我个人使用Cypher,因为它的简单性,迄今为止我还没有任何情况下,我不得不使用Gremlin(除了Gremlin graphML导入/导出function)。 不过,我期望,即使我需要使用Gremlin,我也会这样做,在网上find一个具体的查询,而且不会再回来。
你总是可以快速学习Cypher(天),而不是继续(长期)Gremlin将军。
我们必须在我们的查询中遍历数千个节点。 Cypher很慢。 Neo4j团队告诉我们,直接针对Java API实现我们的algorithm会快100-200倍。 我们这样做,容易得到因子60。 截至目前,由于缺乏信心,我们的系统中没有单一的Cypher查询。 Easy Cypher查询很容易用Java编写,复杂的查询不会执行。 问题是当你在查询中有多个条件时,Cypher没有办法告诉按照何种顺序来执行遍历。 因此,您的密码查询可能首先以错误的方向进入图表。 对于Gremlin我没有太多的工夫,但是我可以想象,你可以用Gremlin来执行更多的执行控制。
Neo4j团队在Cypher上的努力令人印象深刻,而且还有很长的路要走。 Neo团队通常会推动人们走向它,而随着Cypher的成熟,Gremlin可能会得到更less的关注。 Cypher是一个很好的长期select。
这就是说Gremlin是一个Groovy DSL。 通过Neo4j REST端点使用它可以完全无拘无束地访问底层的Neo4j Java API。 它(和其他脚本插件在同一类别)不能匹配低级别的权力。 另外,你可以在Gremlin插件中运行Cypher 。
无论哪种方式,有一个理智的升级path,你学习两个。 我会select一个让你快速跑步的人。 在我的 项目中 ,我通常使用Gremlin,然后在需要列表结果或表示模式匹配时调用Cypher(从Gremlin内部或不在),这两者都是Gremlin DSL中的一个痛苦。
我最初开始使用Gremlin。 但是,当时REST接口有点不稳定,于是我转向了Cypher。 它对Neo4j有更好的支持。 然而,有些types的查询根本不可能与Cypher一起使用,或者Cypher不能完全优化Gremlin的方式。
Gremlin是build立在Groovy之上的,所以你可以把它作为一个通用的方式来让Neo4j执行Java代码并从服务器执行各种任务,而不必从REST接口中获取HTTP命中。 其中,Gremlin会让你修改数据。
但是,当我想要查询数据时,我会selectCypher,因为它更易读,更容易维护。 Gremlin是达到限制时的后备。