3.0版本,执行GO语句查询时,怎么把过滤条件下推到遍历过程中?

  • nebula 版本:3.0
  • 部署方式:分布式

3.0版本,执行GO语句查询时,怎么把点的过滤条件下推到计算中?
示例:
点(属性c1): 1(“aaa”),2(“bbb”),3(“ccc”),4(“ddd”)
边 : 1->2, 2->3, 3->4
语句:
GO 1 to 4 steps FROM “1” OVER * where properties($^).c1 != “bbb” and properties($$).c1 != “bbb” YIELD src(edge),dst(edge),properties($^).c1,properties($$).c1

期望结果: 无返回结果。
实际结果:
src(edge) dst(edge) properties($^).c1 properties($$).c1
3 4 ccc ddd

期望应该是先按 c1 != “bbb” 过滤掉点"2",然后再执行图遍历。结果却是先进行图遍历,再过滤。导致了错误数据 3->4 的出现。

如 return 结果,这里 properties($^) 的语义就是最后一跳的条件,所以你过滤了 1-2 和 1-2-3 这两个 walk,但是 1-2-3-4 里 where properties($^).c1 != “bbb” and properties($$).c1 != “bbb” 依然是满足的哈,因为只取匹配 3, 4。

这个其实不是“下推”的问题,不过理解你的意思是一步一步拓展“边过滤掉了就不往下拓展”了,这种情况下只能手写固定跳数的 管道 GO,或者用 MATCH 去表达了呢。

见下边回答

我复现了下。

应该是个bug,我提了个issue-4573

1 个赞

感谢,所以 properties($^).c1 的表达其实 applied 到每一跳而不是最后一跳?这样确实更合理,我之前以为只是apply 最后一跳。

我看explain信息,filter是在loop里面的,应该是每一步都filter。

1 个赞

:+1:t2:,原来如此, 如此 properties($^) 是相对的表达了(这样确实也更有意义,符合直觉)

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