哪里有 Cypher 语法定义?

问题描述 投票:0回答:4

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

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

syntax neo4j cypher bnf
4个回答
6
投票

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


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

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

来自公告:

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

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

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

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

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


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:_*))):_*)
(...)

这与 Cypher 参考卡的右上象限大致匹配。您可以看到可以有一个开始子句、一个匹配子句等等。这包括到其他实现类的链接(例如 UpdateAction

,它进一步定义了考虑更新操作的子句。

请务必阅读

Neo4J 如何使用 Scala 的解析器组合器:Cypher 的内部结构第 1 部分,以获取有关此处发生的情况以及 scala 类与我们通常认为的 EBNF 之间的映射的更多信息。这篇博文很旧(2011 年),它给出的具体代码示例不应该被信任,但我认为它提供了关于实现如何工作的良好一般信息,以及如果您想了解 cypher 背后的 EBNF 需要寻找什么。


1
投票

Michael Hunger在评论中回答了,所以我不能接受他的回答。这是他的回答:)

Cypher 使用 parboiled 作为解析器,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


-1
投票
这些似乎都不再起作用了。

我在 opencypher.org 网站上没有看到任何看起来像可供下载的语法的内容。

Michael Hunger 的 github 链接都不起作用。

我真的很想访问一些资源,在那里我可以学习如何为像 avg 这样的函数构造查询,据称这些函数将列表表达式作为参数,但对我能弄清楚的每个变体都感到厌烦。

© www.soinside.com 2019 - 2024. All rights reserved.