语法校验失效

语法只校验了空间、实体或者边是否存在,但是没有校验属性字段是否正确。??

提问的时候注意看下模版,不要将帖子发到不正确的分类里。一般研发同学专注于 用户问答分类的,以及分类乱用的话,会降低服务等级的,具体参考 关于论坛帖子审核时间的说明(最后更新 2023.04.20)

我把分类改回来了,然后:thinking: 这似乎是个需求,GitLLTT 方便吗?可以去 GitHub 给我们提个 feature issue 吗?传送下 https://github.com/vesoft-inc/nebula/issues/new/choose

可以,但是github一直打不开。。等能打开了提交下。

1 个赞

好的好的,谢谢啦

此处的 propertices(edge).de 是没有校验 schema 的,主要原因是 propertices(edge) 其实是返回的一个 map 的结构,类似于 JSON;后续再访问 de 时,内核这块就不在看成与 schema 相关的约束,而是视作纯表达式的行为,类似于 json 中访问了一个不存在的成员。

在实现中为了兼容 openCypher 的一些行为,nebula 没有严格按照强 schema 的做法来实现,所以会有一些地方不符合强类型系统的感受。

1 个赞

实现中只有 match/unwind/with/return 这些语句在兼容 OpenCypher 行为,原生的 ngql 比如 go/fetch/lookup/pipe 这些语法设计之初就是遵循强 schema 的语法检查,实现应该考虑这一点。目前这样的语法检查会给用户造成一些困惑:

(root@nebula) [nba]> go from "Tim Duncan" over like yield like.propx
[ERROR (-1009)]: SemanticError: `like.propx', not found the property `propx'.

(root@nebula) [nba]> go from "Tim Duncan" over like yield properties(edge).propx
+------------------------+
| properties(EDGE).propx |
+------------------------+
+------------------------+

另外,properties 这个函数本身的设计也有问题,nebula 2.5 版本之后对于 match 语句取点属性也需要明确指定 tag,比如 MATCH (v:player) RETURN v.player.name,那么支持 MATCH (v:player) RETURN properties(v).name 是否也违背了最初的设计。

建议从产品层定义所有 ngql 的 schema 校验行为,比如 类 cypher 语法目前的 schema 校验行为其实也没有很清晰:

(root@nebula) [nba]> match (v:nontag) return v
[ERROR (-1009)]: SemanticError: `nontag': Unknown tag

(root@nebula) [nba]> match (v:player) return v.nontag.propx
+----------------+
| v.nontag.propx |
+----------------+
+----------------+
neo4j@neo4j> match (v:nontag) return v;
+---+
| v |
+---+
+---+

neo4j@neo4j> match (v) return v.nontag.propx;
+----------------+
| v.nontag.propx |
+----------------+
| NULL           |
| NULL           |
| NULL           |
| NULL           |
+----------------+

2 个赞