我正在寻找 Cypher 查询语言的语法定义。我尝试了文档,但它们非常模糊。
理想情况下,我想要一个 BNF(或任何变体)定义,或者像 this 或 this 这样的“图”定义之一。真的,任何类似于正式定义的东西。
您正在寻找的内容将在 openCypher 中提供。几个项目将作为该项目的一部分发布,其中第一个就是 BNF 语法。
查看最近宣布的(2015 年 10 月)openCypher 项目。其中包括发布语言规范等。
来自公告:
1。密码参考文档: 全面的用户文档,通过示例和教程描述了 Cypher 查询语言的使用。
2。技术兼容性套件 (TCK): TCK 由软件供应商运行的许多测试组成,以便自我认证对给定版本的 Cypher 的支持。
3.参考实现: 该参考实现在 Apache 2.0 许可下分发,是数据平台或工具内支持 Cypher 所需的堆栈关键部分的全功能实现。第一个计划的交付成果是一个解析器,它将接受 Cypher 语句并将其解析为 AST(抽象语法树)表示形式。参考实现通过提供 Cypher 的工作实现(经过许可)来补充文档和测试,并且可以用作示例或作为自己实现的基础。
4。 Cypher 语言规范: Cypher 语言规范根据知识共享许可获得许可,是语言语法的技术表达,使解析器能够自动生成查询语法。完整的语义规范也计划作为 openCypher 项目的一部分。
同一份公告还表示,该流程是开放的,可以提交、审查和评论语言提案。
更新!
自从写完这个答案以来,Neo4j 已经发生了很大的变化。 2017 年,简单的答案是肯定的,您可以从 https://www.openencypher.org/
下载语法文件下面是旧答案,在2014年是准确的
据我所知,唯一的正式定义是在代码中。这是坏消息。
好消息是代码使用 scala 库进行解析,这使得代码规则看起来有点像 BNF。还有一些关于如何阅读它的文档。
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 需要寻找什么。
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
我在 opencypher.org 网站上没有看到任何看起来像可供下载的语法的内容。
Michael Hunger 的 github 链接都不起作用。
我真的很想访问一些资源,在那里我可以学习如何为像 avg 这样的函数构造查询,据称这些函数将列表表达式作为参数,但对我能弄清楚的每个变体都感到厌烦。