nebula GO语句where条件中tag相关的filter逻辑是否有pushDown到storage层

背景:问这个问题是因为我这边有不少稠密点,所以服务端开启了配置max_edge_returned_per_vertex,比如值配置为1000,但遇到了问题,当where条件以tag中的props做过滤时,经实践以及查看代码、发现tag的过滤条件并没有pushDonw到storage层;

导致的问题:拿到的数据rows_num少于真实数据集,举一个简单的例子来描述下场景,如下:
1.为了限制稠密点疯狂扩散,服务端storage配置:

  • UPDATE CONFIGS storage:enable_reservoir_sampling = false;
  • UPDATE CONFIGS storage:max_edge_returned_per_vertex=N; 这里设置N=2

2.具体执行过程如截图,最开始N还未设置为2:

您好,拿目标点的属性作为过滤条件,现在是没有做下推了,拿起点属性和边属性作为过滤条件才会做下推。

恩恩,那我的需求现在有办法满足么?既:
A是稠密点,往外1跳会扩散比如100W个点,实际返回N个dst就行了、但是这N个dst尽量是tag的prop满足某个条件的,如截图,N=2,people这个tag的age>3,然后给我返回两个dst、不要只返回1个dst

很抱歉,我们后续的版本,这种过滤是会下推到存储层的。现在的版本不支持,你那边假如内存够的话,就不要开启截断才能保证拿到您想要的所有数据,不然截断是会存在这个问题的。

了解了,感谢 :+1:

请问3.0版本现在where条件能够下推到目标点属性上了吗?
例如 A → B(age = 9) → C
where B.age > 10
会查询出C吗?

可以用对应的 query 试试最新的 nightly,后面 nebula 做了比较多的 match 相关的优化,创建好 schema 不需要导入数据,只要 explain 你的 query 即可看到有没有对应的下推,你举的示例最新的分支上是做了优化的:

但是还是要看具体的 query 是什么写法,所以建议还是试一下最新的镜像看看结果

1 个赞