go 语句实现 分组排序 同时返回边相关所有数据

提问参考模版:

  • nebula 版本:v2.0.1
  • 部署方式(分布式 / 单机 / Docker / DBaaS):分布式
  • 是否为线上版本:Y
  • 硬件信息
    • 磁盘( 推荐使用 SSD)SSD
    • CPU、内存信息
  • 问题的具体描述

业务需要,如何用Go 语句实现以下业务表达

MATCH (a:Player)<-[r:Rel_A|Rel_B|Rel_C]-(b:Team) WHERE a.keyNo = "keyNo" AND a.keyNo <> b.keyNo RETURN b, a.keyNo as fromKeyNo, a.name as fromName, collect(r.role), collect(type(r)), count(b.keyNo) order by count(b.keyNo) desc

Rel_A/Rel_B/Rel_C 拥有相同的字段, role
KeyNo 可以理解为VID

为啥要改成go,我认为go是表达不了这个语义的。因为go同时扩展多条边是每条边产生一列,所以r.role这个属性就没法取

这个是Neo4j 之前的业务, 现在切Nebula,因为现在Nebula生产环境没有加索引,不确定加索引会产生多大影响,就想用Go 改写

没有索引的话,(a:Player)这个pattern也没法表达的,就算是ngal的lookup也需要索引

是的,所以想避免用这两个,用Go 怎么实现上述的写法, 可以多个语句,尽可能的实现上述的需求

实现不了

刨除关系相关属性的获取,可以实现聚合后,节点属性一起返回吗?

类似下面这种

(root@nebula) [ProdRelation]> go from 815677140545765099 OVER Employ, Invest, Legal Reversely yield $$.Person.keyno as keyno, $$.Person.name as name, $^.Company.keyno as src, $^.Company.name as srcName, Employ.role as eRole, Invest.role as iRole, Legal.role as lRole | group by $-.keyno yield $-.keyno, count(*) as nameCnt, $-.srcName | order by $-.nameCnt desc

[ERROR (-12)]: SemanticError: Yield non-agg expression `$-.srcName' must be functionally dependent on items in GROUP BY clause

group by这里只能yield前面group by有的属性

该话题在最后一个回复创建后30天后自动关闭。不再允许新的回复。