match 语句改go 语句

  • nebula 版本:v 2.6.0
  • 部署方式:分布式
  • 安装方式: RPM
  • 是否为线上版本:Y

有这么个需求,已知A和B的 vid, 需要找A 和 B 一个方向上的关系,或者中间通过某个点指向的关系。
match 表达如下:

A - [GLF*0..2] ->(C)<-[GLF*0..2]-(B)

上面语句包含了三种情况:

1. A - [GLF*0..2] ->(C)<-[GLF*0..2]-(B)
2. A -[GLF*0..4]->(B)
3. B -[GLF*0..4] ->(A)

在nebula 中直接用match 语句性能不太好,想改成go

  • 对于1:
go 1 to 2 steps from vid(A) OVER GLF yield GLF._dst  as dst |\
go 1 to 2 steps from $-.dst over GLF Reversely where GLF._dst == vid(B)
  • 对于2, 3:
go 1 to 4 steps from vid(A) over GLF  where GLF  ._dst == vid(B);

现在的问题是,我想返回的是路径, 但是上面的go表达都不能返回对应的路径, 请问这个该怎么用go语句改写呢?

ping…

go 语句不能返回路径, 2,3 可以用 find path 改写, 1的话好像没办法了

大部分满足需求的数据 都是都在1 这个pattern 下。
那如果不能用go 语句, 用 match 有没有什么方法优化下?

find all path from A to B over GLF bidirect yield path as p

找A和B的路径,然后对结果再进行一些处理,找到 中间节点 存在c的点

这个Bidrect 逻辑不一样了

  1. 这样会找到这种pattern, 这种不满足要求的
    A <- D -> c <- E -> B
  2. 中间节点 存在c的点, 情况是我不知道C 的vid, 所以也没办法说过滤一遍
  3. 做过对比,find all pathmatch p= A - [GLF*0..2] ->(C)<-[GLF*0..2]-(B) 找到的路径差距挺大的,响应太久 无法接受了

这样会找到这种pattern, 这种不满足要求的
A ← D → c ← E → B

这种路径 match 语句也会找到的

对,这个是可以的,这个不满足需求 A ← D <- c ← E → B或者 这种 A ← D → c -> E → B 也不满足需求

目前没别的办法,go是不返回路径的

浙ICP备20010487号