关于NebulaGraph查询Filter下推的问题

  • nebula 版本:3.6.0
  • 部署方式:单机
  • 安装方式:RPM
  • 是否上生产环境:N
  • 硬件信息
    • 磁盘:HDD
    • CPU、内存信息:16U64G
  • 问题的具体描述
    执行模糊匹配的查询语句时发现properties(vertex)可以下推,但是查出来的结果和properties(v)不下推的结果不一致。
    原始语句
    Match(v:player) where properties(v).name contains ”Tim“ return id(v)
    改写语句:
    Match(v:player) where properties(vertex).name contains ”Tim“ return id(v)
    image

如果把name直接作为Id的话,写成:
Match(v:player) where id(vertex) contains ”Tim“ return id(v)
执行的结果是正确的。
image

想请问一下各位大佬,这个可能是什么问题呢?

这两个写法都哪里看来的啊? :innocent:

估计是函数里对vertex保留字的校验不够所以没报错,但本质上这两个写法都是不对的。

用v.player.name是ok的,在尝试看看执行计划对于哪些操作下推的时候发现这两种写法也是可以执行的。
v.player.name和properties(v).name的效果是一样的,但是properties(vertex).name就不一样了
所以很好奇内部的实现机制,具体的vertex和edge这种关键字是怎么处理的呢?

第 2 条语句感觉就是个 bug;

第3 条语句我执行失败,第一次知道还能这么写。。

[ERROR (-1009)]: SemanticError: `id(VERTEX).name', expected type with attribute like Date, Time, DateTime, Map, Vertex or Edge but was STRING: id(VERTEX)```

第三条更正一下,直接是id(vertex)没有.name了,就是取id

第二条是个bug吗?但是执行计划看着是ok的,只不过第三个是取id,第二个是取property

如果是 id 的话,语法是正确的,但应该是不符合逻辑的

用id的话考虑的是需要改一下图数据模型。
但是如果要是用properties有什么不对的吗?具体内部的机制有什么变化吗?
使用properties执行的话结果是空的

vertex 这个变量应该是在 go 里有效的,在 match 里应该是无效的。