go 查询语句中如何把第一个跳的结果传递通过管道传递到fetch中

提问参考模版:

  • nebula 版本:v2.6.1
  • 部署方式:分布式
  • 安装方式:RPM
  • 是否为线上版本:Y
  • 硬件信息
    • 磁盘( 推荐使用 SSD)
    • CPU、内存信息
  • 问题的具体描述
    由于v1.x 的历史原因,目前space 中点的vid 是hash 之后的int64, 现在有这么一个关系:
    A -Relation ->B, Relation 有个属性keyno,hash之后是点的vid。

需求是: 获取relation之后的keyno 根据publish_time 排序.
我的想法是

GO FROM 3436443372514187470 OVER Relation BIDIRECT WHERE Relation.name=="XXX”  \
YIELD  $^.Company.name, $$.Company.keyno as keyno, \
    $$.Company.name as name, Relation.keyno as keyno2 | \
fetch prop on TagB hash($-.keyno2) yield properties(vertex).publish_time as t | \
    order by $-.t

现在的问题

  1. 不想拆开,因为返回结果可能很多,拆开排序可能要多次请求
  2. 如果不拆开管道传入的话,
    2.1 如何把前面的返回值也传到后面
    2.2 keyno 不是vid ,在语句中有办法把UDF hash 解析吗?

ping… ::

目前不支持自定义函数,试试将$-.keyno2再次在yield字句返回?

  1. 我测试了下语法,好像不支持。go from 之后 | fetch 把 go from 的结果传递过来,测试如下

  2. 现在的问题,go from 之后获取的关系里面的存储点的keyno 想要做个排序,目前没有排序所需的字段,需要二次fetch prop 但是,这个keyno 不是hash 之后的vid,这个地方没有好的办法解决吗?

你是要获取relation这个边上的keyno,但是需要根据Tender这个点的publish_time进行排序?另外hash(keyno)是Tender的vid,且Trender中不包括keyno这个属性。是这个意思吗?

是这个意思,Tender里面有keyno 这个属性,但是没有加索引。

那你是不是fetch prop on TagB hash($-.keyno2) yield的时候把keyno返回就行了呢

A- Relation → B,schema 大概这样
从A 出发 通过Relation 找到B(B有很多), 而且相同的A->B 可能也有很多条Relation,rank 不同,Relation 上有个keyno

同时还需要把B的属性返回。

我刚刚看了Lookup 发现即便给Tender 的keyno 加索引 好像语法也不支持,look up on Tender where Tender.keyno = $-.keyno

我的理解keyno也是B的属性之一,fetch的时候把你想要的属性都返回,按照需要排序的属性排序就可以了呀

不是,A B 的Tag 都是Company ,Relation 上的keyno 的Tag是Tender,不同的A B通过Tender 联系到一起的

还有个问题,如果改变schema, Relation的keyno 改成vid,后面管道符| fetch prop … 好像前面B的属性无法传递过来? 这样的话该怎么写呢?

Relation上只有 Tender 这一个逻辑的点么?
一个 Relation 和 Tender 的对应关系是如何,如果是 1-1 对应,可不可以考虑 把 Tender 信息直接作为 Relation 的属性?
如果是 1-n 是同类么?如果是同类,还是可以作为属性,rank 区隔,如此的话 1 step 的 go 就全获取了。

还有就是把 Relation 拆成 companyA —> tenderB—>companyC 这样呢?

  1. Relation 上确实只有一个Tender 点,现在我的想法就是尽量小的改变schema,因为有业务再跑,改动太大影响太大了。我现在想的是,把Relation 上的Tender keyno 改为存储Tender vid 或者在rank 上存储vid ,问题就是这样好像go…| fetch prop on * vid 之后,前面B的属性我发现这种写法传递不过来

  2. Relation 上Tender是1-1,但是会有多条同为Relation 的Tender。

  3. Relation 拆成 companyA —> tenderB—>companyC 这样呢?这样改动太大了
    ps: 历史原因,space 里面其实存在了多种Relation,但是存储时,同构了,都用Relation,但是name 不同,加了不同的rank

1 个赞

ping…

我确实找不到能把前边的信息一起传到后边的方法:sob:,所以建议的改 modeling方式,看起来是在边上逻辑关联了点,所以按照图库的方式去建模会比较自然。
可以等其他的同学也看看 @dbacyj @CPWstatic

等一下上面同学看看有没有合适的方法

1 个赞
GO FROM 3436443372514187470 OVER Relation BIDIRECT YIELD properties($$). publish_time as t | order by t

类似这样

1 个赞

不好意思哈,前面信息比较多,有点乱。
现在结构时这样的
A - Relation - B
Relation 上有个keyno/ _rank 存放C 的vid
希望获取的B 的信息, 同时根据C节点的publish_time 属性进行排序。

GO FROM 3436443372514187470 OVER Relation BIDIRECT WHERE Relation.name=="XXX”  \
YIELD  $^.Company.name, $$.Company.keyno as keyno, \
    $$.Company.name as name, Relation.keyno as keyno2 | \
fetch prop on TagB hash($-.keyno2) yield properties(vertex).publish_time as t | \
    order by $-.t

类似上面的语句,但是没办法把节点B 的信息传递到下一层

GO FROM 3436443372514187470 OVER Relation BIDIRECT WHERE Relation.name=="XXX”  \
YIELD  $^.Company.name, $$.Company.keyno as keyno, \
    $$.Company.name as name, Relation.keyno as keyno2  | GO FROM hash($-.keyno2)  OVER * YIELD $-.name, $-.keyno, properties($$).publish_time as t | order by $-.t