为何NebulaGraph的GET SUBGRAPH语句无法像GO语句那样使用tagName.propName格式?
关于NebulaGraph中GET SUBGRAPH与GO语句属性引用差异的原因
这是因为两种语句的语法解析逻辑和上下文定位规则存在差异,具体如下:
1. GET SUBGRAPH的语法解析规则
GET SUBGRAPH用于抽取子图,它的WHERE子句默认会将未加前缀的标识符识别为边类型。
正确示例(使用
$$.前缀指定顶点):(root@nebula) [subgraph]> GET SUBGRAPH 6 STEPS FROM "player101" WHERE $$.player.age>50 YIELD VERTICES AS nodes, EDGES AS relationships; +---------------------------+---------------+ | nodes | relationships | +---------------------------+---------------+ | [("player101" :player{})] | [] | +---------------------------+---------------+ Got 1 rows (time spent 5803/7091 us) Thu, 20 Oct 2022 03:45:11 UTC这里
$$.明确告诉解析器要访问的是顶点的属性,因此player会被识别为顶点标签,player.age能正确匹配到顶点属性。错误示例(直接使用标签名):
(root@nebula) [subgraph]> GET SUBGRAPH 6 STEPS FROM "player101" WHERE player.age>50 YIELD VERTICES AS nodes, EDGES AS relationships; [ERROR (-1005)]: EdgeName `player' is nonexistent解析器把未加前缀的
player当成了边类型,但player是顶点标签不是边,所以报错。
2. GO语句的语法逻辑
GO语句是基于边遍历的,上下文会优先绑定OVER指定的边类型:
边属性引用示例:
(root@nebula) [subgraph]> GO FROM "player100" OVER follow WHERE follow.degree > 90 YIELD dst(edge); +-----------+ | dst(EDGE) | +-----------+ +-----------+这里
OVER follow已经明确了遍历的边类型,所以follow.degree会被直接解析为当前遍历的follow边的degree属性,无需额外前缀。注意:如果要在GO语句中访问顶点属性,同样需要用
$$(目标顶点)或$^(源顶点)前缀,比如GO FROM "player100" OVER follow WHERE $$.player.age > 30 YIELD dst(edge),不加$$.同样会报错。
总结
- 访问顶点属性时,无论哪种语句,都必须用
$$/$^前缀来明确指代顶点; - GO语句中直接写
edge.prop生效,是因为OVER指定了边上下文,而GET SUBGRAPH没有默认边上下文,未加前缀的标识符会被当作边类型解析。
内容的提问来源于stack exchange,提问作者foesa Yang
相关产品推荐
相关产品推荐

