SUBGRAPH 的 WHERE 过滤条件不起作用

  • nebula 版本:3.4.1
  • 部署方式:分布式
  • 安装方式:源码编译
  • 是否上生产环境:Y
  • 硬件信息
    • 磁盘SSD
    • CPU、内存信息:32C64G
  • 运行如下语句,where过滤条件不起作用

GET SUBGRAPH WITH PROP 1 STEPS FROM ‘bdsp:hivetb:id:xxxxxx’ OUT INHERITED_BY WHERE $$.HiveTable.dept_name == “人工智能一部” YIELD VERTICES AS v

数据库中INHERITED_BY边的终点节点的tag不只有HiveTable,不知是否和这个有关

在 3.5 的版本上验证上面的 query,看计划中的 filter 做了下推:

这里的不起作用是说结果当中没能过滤掉对应的数据? 你也可以通过 explain 查看一下执行计划,确认过滤条件是否正确。

我们代码中也有相应的测试用例,有类似上述的 case。

就是没有过滤掉对应的数据。
看了执行计划,看不出来没什么问题



看 filter 是已经下推了过滤条件。你那边有非中文的字符串过滤条件吗? 可以试试是否是中文的原因。

尝试了

GET SUBGRAPH WITH PROP 1 STEPS FROM ‘bdsp:hivetb:id:XXXX’ OUT INHERITED_BY WHERE $$.HiveTable.safety == ‘S2’ YIELD VERTICES AS v

同样没有生效,返回的结果中存在非‘S2’的结果

但是发现一个现象,就是过滤条件并非完全没有生效,比如我的过滤条件是 == ‘S2’ ,结果集中S2就会占大多数,如果我的过滤条件是 == ‘S3’ ,结果集中S3就会占大多数。也就是说存在一些数据被漏掉了

起点的结果中有 S3 或者 S2 吗,这里的过滤条件的逻辑是:不过滤起点,对其他经过的点应用 filter

这个明白的,就是针对除起点之外的点的filter好像没有完全起作用

如果是这样,那可能就是 bug 了,可以帮我们提个可以复现的 issue 吗?:pray:

你也可以简单的在最新的 3.5 版本上验证一下,看看是否问题还存在。目前我在小的数据集上还没复现类似的问题。

好的,我稍后提个issue。
我想问一下针对这个问题有什么临时的解决方案吗,因为是线上服务,所以可能需要找一个方案先让功能正常

可以考虑一下在 GET SUBGRAPH 后面再增加一个 filter 过滤,当然这样可能就把起点的点也过滤掉了(可能也不要紧),类似如下:

GET SUBGRAPH ... YIELD VERTICES as v | \
YIELD $-.v as v WHERE all(i IN $-.v WHERE i.HiveTable.safety== "s3")
1 个赞

问题一:我刚才试了一下这个语句,

GET SUBGRAPH WITH PROP 1 STEPS... YIELD VERTICES as v | \
YIELD $-.v as v WHERE all(i IN $-.v WHERE i.HiveTable.safety== "s3")

貌似这个过滤条件只针对了起点(也就是0层),往下一层/n层的节点全部被过滤掉了。

我使用了如下语句,可以成功过滤,但是丢失了下游节点的层数信息(某个节点是下游第几层的)

GET SUBGRAPH WITH PROP 1 STEPS ... YIELD VERTICES AS v | \
UNWIND $-.v AS v | \
YIELD id($-.v) AS vid WHERE $-.v.HiveTable.safety == "S2"

问题二:另外想确认一下是否可以针对边也一起过滤?比如:

GET SUBGRAPH WITH PROP 1 STEPS... YIELD EDGES AS e | \
YIELD $-.e as e WHERE all(i IN $-.e WHERE src($-.e).HiveTable.safety == "S2" AND dst($-.e).HiveTable.safety == "S2" )

我尝试的结果是以上语句没有生效,猜测是返回的EDGES的起点和终点是不带属性的,因此无法通过该语句来过滤节点的属性。想跟您确认一下

上面的语句需要把起点排除,不然 all 中的结果确实都含有一个 false,可以按照如下的方式修改:

GET SUBGRAPH WITH PROP 1 STEPS... YIELD VERTICES as v | \
YIELD $-.v as v WHERE all(i IN $-.v WHERE i.HiveTable.safety== "s3" or id(i)=="bdsp:hivetb:id:xxxxxx")

你再试试看,如果不清楚 all 中的值对不对,可以通过下面的方式来调试:

GET SUBGRAPH WITH PROP 1 STEPS... YIELD VERTICES as v | \
YIELD [i IN $-.v | i.HiveTable.safety== "s3" or id(i)=="bdsp:hivetb:id:xxxxxx"]
1 个赞

上面还有另外一种写法就是在过滤的时候把第一个点排除:

GET SUBGRAPH WITH PROP 1 STEPS... YIELD VERTICES as v | \
YIELD $-.v as v WHERE all(i IN $-.v[1..] WHERE i.HiveTable.safety== "s3")

或者

GET SUBGRAPH WITH PROP 1 STEPS... YIELD VERTICES as v | \
YIELD $-.v as v WHERE all(i IN tail($-.v) WHERE i.HiveTable.safety== "s3")

此话题已在最后回复的 30 天后被自动关闭。不再允许新回复。