您正在寻找的内容将在openCypher中提供。几个项目将作为该项目的一部分发布,其中第一个就是 BNF 语法。
\n\n看一下最近宣布的(2015 年 10 月)openCypher 项目。其中包括发布语言规范等。
\n\n从公告来看:
\n\n\n\n\n1. Cypher 参考文档: \n 全面的用户文档,通过示例和教程描述了 Cypher 查询语言的使用。
\n\n2. 技术兼容性工具包 (TCK): \n TCK 由软件供应商运行的许多测试组成,以便自我证明对给定版本的 Cypher 的支持。
\n\n3. 参考实现: \n 在 Apache 2.0 许可证下分发,参考实现是在数据平台或工具内支持 Cypher 所需的堆栈关键部分的全功能实现。第一个计划的交付成果是一个解析器,它将接受 Cypher 语句并将其解析为 AST(抽象语法树)表示形式。参考实现通过提供 Cypher \xe2\x80\x93 的工作实现来补充文档和测试,这些实现已获得许可 \xe2\x80\x93 并可用作示例或作为 one\xe2\x80\x99s 自己的实现的基础。
\n\n4. Cypher 语言规范: \n Cypher 语言规范根据 Creative Commons 许可证获得许可,是语言语法的技术表达,使解析器能够自动生成查询语法。完整的语义规范也计划作为 openCypher 项目的一部分。
\n
同一份公告还表示,该流程是开放的,可以提交、审查和评论语言提案。
\n更新!
自从写完这个答案以来,Neo4j 已经发生了很大的变化。在 2017 年,简单的答案是肯定的,您可以从https://www.openencypher.org/下载语法文件
以下是旧答案,2014 年准确
据我所知,唯一的正式定义是在代码中。这是坏消息。
好消息是代码使用 scala 库进行解析,这使得代码规则看起来有点像 BNF。还有一些关于如何阅读它的文档。
下面是一个指向 scala 对象的链接,该对象定义了查询是什么。
在我看来,github 上的这个通用包包含所有 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:_*))):_*)
(...)
Run Code Online (Sandbox Code Playgroud)
这与Cypher 参考卡的右上象限大致匹配。您可以看到可以有一个开始子句、一个匹配子句等等。这包括到其他实现类的链接(例如UpdateAction进一步定义考虑更新操作的子句)。
请务必阅读Neo4J 如何使用 Scala 的解析器组合器:Cypher 的内部结构第 1 部分,以获取有关此处发生的情况以及 scala 类与我们通常认为的 EBNF 之间的映射的更多信息。这篇博文很旧(2011 年),它给出的具体代码示例不应该被信任,但我认为它提供了关于实现如何工作的良好一般信息,以及如果您想了解 cypher 背后的 EBNF 需要寻找什么。