知道错哪了吗?NGCP 错题解析

熟悉 NebulaGraph 社区的小伙伴可能都知道一个技能认证叫做:NGCP,全称 NebulaGraph Certified Professional。用户在考试认证期间在 1 个小时内回答 100 道题目,并获得 60+ 分,便是 NebulaGraph 认证过的 NGCP 用户。NGCP 用户除了会有实体证书之外,拥有与企业认证用户相同的技术支持服务。

看样子,只要回答 100 道问题,NGCP 证书、认证奖励就到手!但,你知道 NGCP 通过率是多少吗

答案是:16.7%

在 NebulaGraph 认证考试出题人查看 NGCP 考试成绩时,发现有部分试题的正确率特别低,针对这些难题这次我们来一把解析,给考过没考过的小伙伴递个“小纸条”。

下面,请听题:

题 1. 要查看 TAG player 上的 TTL 选项值,错误的命令有

A. SHOW TAGS

B. DESCRIBE TAG player

C. SHOW CREATE TAG player

D. SHOW TTL ON player

解析:

SHOW TAGS 显示当前图空间内的 Tag 名称;DESCRIBE TAG 显示 Tag 的字段名称、数据类型、是否支持为 NULL、默认值和描述;SHOW TTL ON player 是错误命令。只有 SHOW CREATE TAG player 命令能看到完整的 Tag 创建语句,包含 TTL 选项值。所以,正确答案为 ABD

题 2. ACID 意义上,在不同的客户端进程看来,NebulaGraph 的隔离性是

A. 序列化读

B. 可重复读

C. 提交读

D. 未提交读

解析:

因为当前没有隔离性,所以是未提交读。例如,前一个子句完成而后一个子句没有完成,此时并发地另一个会话执行查询,可能会查询到不完整的数据。所以,正确答案为 D

题 3. 在创建全文索引时,索引名称可以为下面哪些

A. nebula-index

B. index_1

C. nebula_index

D. _index_1

解析:

NebulaGraph 的全文索引名称必须以 nebula 开头。所以,正确答案为 AC

题 4. 设置 timezone_name 修改时区后,返回结果为所设置时区的是

A. TIMESTAMP 类型数据

B. DATETIME 类型数据

C. TIME 类型数据

D. 查询执行时间

解析:

TIMESTAMP 类型数据与时区无关;DATETIME 和 TIME 类型数据的时区由配置文件的 timezone_name 决定;查询执行时间的时区由服务所在机器的系统时区决定。所以,正确答案为 BC

题 5. NebulaGraph 内核部分默认使用的端口有

A. 9559

B. 19669

C. 9780

D. 19560

解析:

9559 为 Meta 服务的对外端口;19669 为 Graph 服务的 HTTP 端口,可以用来查询 Graph 服务的监控指标;9780 为 Storage 服务的对内端口之一,还有 9777 和 9778;19560 是已经弃用的 HTTPS 端口。所以,正确答案为 ABC

题 6. 以下返回不为 NULL 的有

A. hash( NULL )

B. 2 >= “2”

C. NULL == null

D. null IS NULL

解析:

对 NULL 进行哈希操作,结果不为 NULL;数字 2 和字符串 2 无法对比,所以结果为 NULL;NULL 表示没有值,进行对比没有意义,结果为 NULL;null IS NULL 为正常的判断语句,结果不为 NULL。所以,正确答案为 AD

题 7. 关于 NebulaGraph 执行计划的说法中,错误的有

A. 实现了基于代价的优化

B. 实现了基于规则的优化

C. 可以通过创建索引来加速查询

D. 可以进行计划缓存

解析:

NebulaGraph 只支持基于规则的优化;NebulaGraph 中的索引没有加速查询的功能,只是用于定位到数据的必要前置条件;NebulaGraph 无法进行查询的预编译(包括相应的计划缓存)。所以,正确答案为 ACD@biu 感谢 biu 对本题解析做的勘误,已纠正,谢谢 :face_holding_back_tears:

题 8. 已知 Tag player 有属性 name 和 age,Tag player 本身和属性 name 上有索引,在执行 LOOKUP ON player WHERE player.age == 36 YIELD player.name 时,Nebula Graph 会优先查找 age 属性上的索引,当发现 age 属性没有索引,NebulaGraph 可能会

A. 使用 name 属性的索引继续查询

B. 使用 Tag player 本身的索引继续查询

C. 使用 VID 继续查询

D. 报错,提示找不到索引

解析:

索引之间有可替代关系。在 LOOKUP 语句中 player 本身的索引和 name 属性的索引可能替代 age 属性索引用于属性查找。所以,正确答案为 AB

题 9. 以下 nGQL 语句错误的是

A. $var = GO FROM “player100” OVER follow YIELD dst(edge) AS id GO FROM $var.id OVER serve YIELD properties($$).name AS Team, properties($^).name AS Player;

B. $var = GO FROM “player100” OVER follow YIELD dst(edge) AS id | GO FROM $var.id OVER serve YIELD properties($$).name AS Team, properties($^).name AS Player;

C. $var = GO FROM “player100” OVER follow YIELD dst(edge) AS id; GO FROM $var.id OVER serve YIELD properties($$).name AS Team, properties($^).name AS Player;

D. $var = GO FROM “player100” OVER follow YIELD dst(edge) AS id;| GO FROM $var.id OVER serve YIELD properties($$).name AS Team, properties($^).name AS Player;

解析:

只有选项 C 的语句是正确的。选项 A 的 2 个语句没有分隔;选项 B 使用管道符时,后一个语句中的 $var.id 需要改成引用符 $-.id;选项 D 同时使用了分号和管道符。所以,正确答案为 ABD

不知道看完本文的是,在解析问题之前答对多少道呢?来挑战下 NGCP 题库,拿个认证考试证书吧!扫描下方二维码即可开启 NGCP 认证之旅,点击链接是一样效果哟 https://academic.nebula-graph.io/?lang=ZH_CN

1 个赞

nebula 的索引不用来加速查询,那用来干啥的? :melting_face: :melting_face: :melting_face:

为什么认证链接打不开呢??点进去只看到一个小方块一直转圈

访问有点不稳定,你刷新下试试。

抱歉,服务有些问题,正在排查中,稍等哈

用来强迫用户必须建索引才能查。。。。

首先,索引确实是用来加速查询的,不然要索引干嘛,增加写开销吗。所以 “NebulaGraph 中的索引没有加速查询的功能,只是用于定位到数据的必要前置条件” 这样说肯定是错的。
确实目前 nebula 支持 cypher 的实现对索引的依赖比较强,但这也是 by design 的,如果有更好的解决方案可以跟 PD 提需求,但是文档中的描述确实应该准确严谨些https://docs.nebula-graph.com.cn/3.3.0/3.ngql-guide/14.native-index-statements/。(个人观点:确实应该提供类似 all node scan 这种查询退化机制。
Fwiw,上面链接文档里边的 “原生索引” 又是个啥,和非原生索引有啥区别?

  1. 那等能支持扫描再改吧
  2. 非原生就是用es呗

已修复,可以打开了哈

不行啊,现在更严重,直接报错了,链接失效

访问有点慢,你再试试呢。我刚打开了。

ctrl+F5不带缓存刷新一下哈

1 个赞

如果是 macOS 的话,就是 command + shift + r,强刷。

1 个赞

题 7. 关于 NebulaGraph 执行计划的说法中,错误的有:

A. 实现了基于代价的优化

B. 实现了基于规则的优化

C. 可以通过创建索引来加速查询

D. 可以进行计划缓存

解析:

NebulaGraph 只支持基于规则的优化;NebulaGraph 中的索引没有加速查询的功能,只是用于定位到数据的必要前置条件;NebulaGraph 无法进行查询的预编译(包括相应的计划缓存)。所以,正确答案为 B。

– 按照解析说明来,正确答案是ACD吧

1 个赞

正确答案是 BC。