database - Cypher 和 Gremlin 的语法和语义

标签 database cypher graph-databases gremlin

我想知道我能用 Cypher 和 Gremlin 执行什么样的查询,但我没能找到该语言的完整语法及其到操作语义的翻译。有谁知道是否有什么东西可以阐明这些语言的表达能力?

最佳答案

对于 cypher,语法作为一组使用 Parboiled 库的 Scala 文件提供。您应该能够在 neo4j github 存储库中找到这些 scala 文件。它本身不是正式语法,但如果您查看源文件,您将获得与您期望的正式语法相同的产生式规则。 You can find that here on github .查看 Query.scala 作为定义 Cypher 查询及其语法组件的起点。

对于 gremlin,我不确定它是如何工作的,但我再次猜测您需要深入研究源代码,他们很可能也使用某种解析器生成器,语法将有效地在其中代码。

不过,您关于“表达能力”的问题有点含糊;只要说 cypher 是一种声明性语言(专注于返回什么,不指定如何遍历),gremlin 在我看来就像一种声明性语言(因为它说明了如何进行遍历而不是返回什么数据) .最后他们都图灵完整,所以虽然他们的风格完全不同,但在任何形式意义上,一个并不比另一个更“强大”。

根据您正在执行的特定任务以及“强大”的上下文定义,一个可能比另一个更强大。说你想做的是对树进行广度优先搜索以寻找特定的东西。在这种情况下,面向遍历的方法是最好的,也许 gremlin 更好,因为 Cypher 不允许您指定遍历顺序。另一方面,假设您想表达一个复杂的路径查询,它返回某个数据项,而不管它在图中的什么位置。那么也许可以说 cypher 更强大,因为它关注的是“什么”而不是“如何”。

关于database - Cypher 和 Gremlin 的语法和语义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33391712/

相关文章:

neo4j - 合并替代条件和多个条件

sql - 如何编写一个选择查询或服务器端函数,从许多数据点生成一个整洁的时间流图?

java - 按需将 Neo4J 加载到内存中以进行繁重的计算

graph - Neo4j设计: Property vs "Node & Relationship"

vba - 删除连续的重复项 : "File sharing lock count exceeded" at 9k of 1m records

sql - 如何设计对具有添加关系的单个数据库表的循环引用?

node.js - Neo4J 如果属性存在则合并 Node 并创建另一个具有关系的 Node

c - 哪个能够容纳 1 亿条记录的嵌入式数据库具有高效的 C 或 C++ API

MySQL数据类型 "int"超出限制

javascript - 如何在现有 Node 之间创建/匹配多个关系? (通过相同的参数)