neo4j 是否有一个Cypher语法定义的任何地方?[已关闭]

wh6knrhe  于 2023-10-18  发布在  其他
关注(0)|答案(3)|浏览(136)

**已关闭。**此问题正在寻求书籍、工具、软件库等的建议。它不符合Stack Overflow guidelines。它目前不接受回答。

我们不允许问题寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答问题。
上个月关门了。
Improve this question
我在找密码查询语言的语法定义。我试过the docs,但它们非常模糊。
理想情况下,我喜欢BNF(或任何变体)定义,或者像thisthis这样的“图”定义之一。实际上,任何类似于正式定义的东西。

pengsaosao

pengsaosao1#

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

    • 更新时间2016-01-30*:语法的初稿现在可以在https://www.example.com上找到github.com/opencypher/openCypher/blob/master/grammar.ebnf。
    • 更新时间:2016-10-17*:EBNF和Antlr语法、TCK、铁路图和社区项目列表可在www.example.com上获得http://www.opencypher.org/#resources

看看recently announced(2015年10月)openCypher project。它包括发布语言规范等。
从公告来看:

**1. Cypher参考文档:**一个全面的用户文档,通过示例和教程描述了Cypher查询语言的使用。
**2.技术兼容性工具包(TCK):**TCK由软件供应商运行的许多测试组成,以自我认证对给定版本的Cypher的支持。
**3.参考实现:**参考实现是在Apache 2.0许可下发布的,是在数据平台或工具中支持Cypher所需的堆栈关键部分的全功能实现。第一个计划中的可交付成果是一个解析器,它将接受Cypher语句并将其解析为AST(抽象语法树)表示。参考实现通过提供Cypher的工作实现(许可证)来补充文档和测试,并且可以用作示例或作为自己实现的基础。
**4. Cypher语言规范:**Cypher语言规范是一种语言语法的技术表达,允许解析器自动生成查询语法。一个完整的语义规范也计划作为openCypher项目的一部分。

该公告还说,这一过程是开放的,可以提交、审查和评论语言提案。

kmynzznz

kmynzznz2#

更新

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之间的Map。这篇博客文章是旧的(2011年),它给出的具体代码示例不应该被信任,但我认为它有很好的关于实现如何工作的一般信息,以及如果你想了解cypher背后的EBNF应该寻找什么。

e5nszbig

e5nszbig3#

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

相关问题