是否有Cypher语法定义?

时间:2014-10-13 10:26:15

标签: syntax neo4j cypher bnf

我正在寻找Cypher查询语言语法的定义。我试过the docs,但他们非常模糊。

理想情况下,我喜欢BNF(或任何变体)的定义,或者其中一个" graph" thisthis等定义。真的,任何类似于正式定义的东西。

4 个答案:

答案 0 :(得分:4)

更新

自从这个答案写完以来,Neo4j发生了很大的变化。在2017年,简单的答案是肯定的,您可以从https://www.opencypher.org/

下载语法文件

以下是旧答案,2014年准确无误

据我所知,唯一正式的定义是在代码中。这是坏消息。

好消息是代码使用scala库进行解析,这使得代码规则看起来像BNF一样有点/类似。还有一些关于如何阅读它的文档。

Here's a link into a scala object that defines what a query is

github上的

This general package看起来像它包含了所有的cypher命令实现,并且应该包含你要求的所有内容。

此包中的代码是用scala编写的,如下所示:

object Query {
  def start(startItems: StartItem*) = new QueryBuilder().startItems(startItems:_*)
  def matches(patterns:Pattern*) = new QueryBuilder().matches(patterns:_*)
  def optionalMatches(patterns:Pattern*) = new QueryBuilder().matches(patterns:_*).makeOptional()
  def updates(cmds:UpdateAction*) = new QueryBuilder().updates(cmds:_*)
  def unique(cmds:UniqueLink*) = new QueryBuilder().startItems(Seq(CreateUniqueStartItem(CreateUniqueAction(cmds:_*))):_*)
(...)

这大致与upper right hand quadrant of the Cypher refcard匹配。您可以看到可以有一个start子句,一个match子句等等。这包括指向其他​​实现类的链接(如UpdateAction,它进一步定义了考虑更新操作的子句。

请务必阅读How Neo4J Uses Scala's Parser Combinator: Cypher's Internals Part 1以获取有关此处发生的更多信息,以及scala类与我们通常认为的EBNF之间的映射。这篇博文是陈旧的(2011),它提供的具体代码示例不应该被信任,但我认为它有关于实现如何工作的良好的一般信息,以及如果你想了解cypher背后的EBNF需要寻找什么。

免责声明:我不是斯卡拉铁杆,YMMV,IANAL,如果我错了,开发者请原谅我。

答案 1 :(得分:4)

您正在寻找的内容将在 openCypher 中提供。一些项目将作为项目的一部分发布,其中第一项是BNF语法。

  • 更新2016-01-30 :语法的初稿现在可以在 \ https://github.com/opencypher/openCypher/blob/master/grammar.ebnf上找到
  • 更新:2016-10-17 :EBNF和Antlr语法,TCK,铁路图和社区项目列表可在http://www.opencypher.org/#resources
  • 获取

查看recently announced(2015年10月)openCypher project。它涉及发布语言规范等等。

宣布:

  

<强> 1。 Cypher参考文档:   一个全面的用户文档,描述了使用Cypher查询语言的示例和教程。

     

<强> 2。技术兼容性套件(TCK):   TCK由软件供应商运行的许多测试组成,以便自我认证对特定版本Cypher的支持。

     

第3。参考实施:   在Apache 2.0许可下分发,参考实现是在数据平台或工具中支持Cypher所需的堆栈关键部分的全功能实现。第一个计划的可交付成果是一个解析器,它将获取Cypher语句并将其解析为AST(抽象语法树)表示。参考实现通过提供Cypher的工作实现来补充文档和测试 - 这些实现是许可的 - 并且可以用作示例或作为自己实现的基础。

     

<强> 4。 Cypher语言规范:   根据Creative Commons许可,Cypher语言规范是语言语法的技术表达,使解析器能够自动生成查询语法。完整的语义规范也计划作为openCypher项目的一部分。

同一声明还表示该流程是开放的,可以提交,审核和评论语言提案。

答案 2 :(得分:0)

Michael Hunger在评论中回答,所以我无法接受他的回答。这是他的答案:)

Cypher使用parboiled作为解析器,简化的规则DSL非常容易阅读和理解。 https://github.com/neo4j/neo4j/blob/d18583d260a957ab1a14bd27d34eb5625df42bc5/community/cypher/cypher-compiler-2.2/src/main/scala/org/neo4j/cypher/internal/compiler/v2_2/parser/Clauses.scala

答案 3 :(得分:0)

这些似乎都不起作用了。

opencypher.org网站上没有任何看起来像要下载的语法的内容。

Michael Hunger的工作中没有github链接。

我真的很想访问一些资源,在这里我可以学习如何构造对诸如avg之类的函数的查询,这些函数据称以列表表达式作为参数,但对我能找出的每个变体都bar之以鼻。