我正在寻找Cypher查询语言语法的定义。我试过the docs,但他们非常模糊。
理想情况下,我喜欢BNF(或任何变体)的定义,或者其中一个" graph" this或this等定义。真的,任何类似于正式定义的东西。
答案 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语法。
查看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之以鼻。