什么是nGQL

nGQL(Nebula Graph Query Language)是Nebula Graph使用的的声明式图查询语言,支持灵活高效的图模式,而且nGQL是为开发和运维人员设计的类SQL查询语言,易于学习。

nGQL是一个进行中的项目,会持续发布新特性和优化,因此可能会出现语法和实际操作不一致的问题,如果遇到此类问题,请提交issue通知Nebula Graph团队。Nebula Graph 2.0及更新版本正在支持openCypher 9

nGQL可以做什么

  • 支持图遍历

  • 支持模式匹配

  • 支持聚合

  • 支持修改图

  • 支持访问控制

  • 支持聚合查询

  • 支持索引

  • 支持大部分openCypher 9图查询语法(不支持修改和控制语法)

示例数据 Basketballplayer

用户可以下载Nebula Graph示例数据basketballplayer文件,然后使用Nebula Graph Console,使用选项-f执行脚本。

占位标识符和占位符值

Nebula Graph查询语言nGQL参照以下标准设计:

  • (Draft) ISO/IEC JTC1 N14279 SC 32 - Database_Languages - GQL

  • (Draft) ISO/IEC JTC1 SC32 N3228 - SQL_Property_Graph_Queries - SQLPGQ

  • OpenCypher 9

在模板代码中,任何非关键字、字面值或标点符号的标记都是占位符标识符或占位符值。

本文中 nGQL 语法符号的说明如下。

符号含义
< >语法元素的名称。
::=定义元素的公式。
[ ]可选元素。
{ }显式的指定元素。
|所有可选的元素。
可以重复多次。

例如创建点或边的nGQL语法:

  1. CREATE {TAG | EDGE} {<tag_name> | <edge_type>}(<property_name> <data_type>
  2. [, <property_name> <data_type> ...]);

示例语句:

  1. nebula> CREATE TAG player(name string, age int);

关于openCypher兼容性

原生 nGQL 和 openCypher 的关系

原生 nGQL 是由 Nebula Graph 自行创造和实现的图查询语言。OpenCypher 是由 openCypher Implementers Group 组织所开源和维护的图查询语言,

最新版本为 openCypher 9。由于 nGQL 语言部分兼容了 openCypher,这个部分在本文中称为 openCypher 兼容语句。

nGQL 完全兼容 openCypher 9吗?

不。

nGQL和openCypher 9的主要差异有哪些?

类别openCypher 9nGQL
Schema弱Schema强Schema
相等运算符===
数学求幂^使用pow(x, y)替代^
边Rank无此概念@rank设置。
语句-不支持 openCypher 9 的所有 DML 语句(如CREATEMERGE等),不支持所有的 DCL, 和支持部分 MATCH 语法和函数(不支持OPTIONAL MATCH,不支持多MATCH)。
语句文本换行换行符\ + 换行符
Label与Tag是不同的概念Label用于寻找点(点的索引)。Tag用于定义点的一种类型及相应的属性,无索引功能。
预编译与参数化查询支持不支持

哪里可以找到更多nGQL的示例?

用户可以在Nebula Graph GitHub的features目录内查看超过2500条nGQL示例。

features目录内包含很多.features格式的文件,每个文件都记录了使用nGQL的场景和示例。例如:

  1. Feature: Basic match
  2. Background:
  3. Given a graph with space named "basketballplayer"
  4. Scenario: Single node
  5. When executing query:
  6. """
  7. MATCH (v:player {name: "Yao Ming"}) RETURN v;
  8. """
  9. Then the result should be, in any order, with relax comparison:
  10. | v |
  11. | ("player133" :player{age: 38, name: "Yao Ming"}) |
  12. Scenario: One step
  13. When executing query:
  14. """
  15. MATCH (v1:player{name: "LeBron James"}) -[r]-> (v2)
  16. RETURN type(r) AS Type, v2.name AS Name
  17. """
  18. Then the result should be, in any order:
  19. | Type | Name |
  20. | "follow" | "Ray Allen" |
  21. | "serve" | "Lakers" |
  22. | "serve" | "Heat" |
  23. | "serve" | "Cavaliers" |
  24. Feature: Comparison of where clause
  25. Background:
  26. Given a graph with space named "basketballplayer"
  27. Scenario: push edge props filter down
  28. When profiling query:
  29. """
  30. GO FROM "player100" OVER follow
  31. WHERE follow.degree IN [v IN [95,99] WHERE v > 0]
  32. YIELD follow._dst, follow.degree
  33. """
  34. Then the result should be, in any order:
  35. | follow._dst | follow.degree |
  36. | "player101" | 95 |
  37. | "player125" | 95 |
  38. And the execution plan should be:
  39. | id | name | dependencies | operator info |
  40. | 0 | Project | 1 | |
  41. | 1 | GetNeighbors | 2 | {"filter": "(follow.degree IN [v IN [95,99] WHERE (v>0)])"} |
  42. | 2 | Start | | |

示例中的关键字说明如下。

关键字说明
Feature描述当前文档的主题。
Background描述当前文档的背景信息。
Given描述执行示例语句的前提条件。
Scenario描述具体场景。如果场景之前有@skip标识,表示这个场景下示例语句可能无法正常工作,请不要在生产环境中使用该示例语句。
When描述要执行的nGQL示例语句。可以是executing queryprofiling query
Then描述执行When内语句的预期返回结果。如果返回结果和文档不同,请提交issue通知Nebula Graph团队。
And描述执行When内语句的副作用或执行计划。
@skip跳过这个示例。通常表示测试代码还没有准备好。

欢迎增加更多 tck case,在 CI/CD 中自动回归所使用的语句。

是否支持TinkerPop Gremlin?

不支持。也没有计划。

是否支持 W3C 的RDF(SPARQL) 或 GraphQL 等?

不支持。也没有计划。

Nebula Graph的数据模型是属性图,是一个强Schema系统,不支持RDF标准。

nGQL 也不支持 SPARQL 和 GraphQL。