是否有 Cypher 语法定义?

jam*_*her 3 syntax bnf neo4j cypher

我正在寻找 Cypher 查询语言的语法定义。我尝试过这些文档,但它们非常模糊。

理想情况下,我想要一个 BNF (或任何变体)定义,或者像这样这样的“图形”定义之一。确实,任何类似于正式定义的东西。

jja*_*erg 6

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

\n\n
\n\n
    \n
  • 2016 年 1 月 30 日更新:语法的初稿现已在\\https://github.com/opencypher/openCypher/blob/master/grammar.ebnf提供。
  • \n
  • 更新:2016 年 10 月 17 日:EBNF 和 Antlr 语法、TCK、铁路图和社区项目列表可在http://www.openencypher.org/#resources上找到。
  • \n
\n\n
\n\n

看一下最近宣布的(2015 年 10 月)openCypher 项目。其中包括发布语言规范等。

\n\n

从公告来看:

\n\n
\n

1. Cypher 参考文档: \n 全面的用户文档,通过示例和教程描述了 Cypher 查询语言的使用。

\n\n

2. 技术兼容性工具包 (TCK): \n TCK 由软件供应商运行的许多测试组成,以便自我证明对给定版本的 Cypher 的支持。

\n\n

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

\n\n

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

\n
\n\n

同一份公告还表示,该流程是开放的,可以提交、审查和评论语言提案。

\n


Fro*_*its 5

更新

自从写完这个答案以来,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 需要寻找什么。