如何在Gremlin查询中重命名groupBy分组标签并解决执行报错
报错原因
你的查询报错和逻辑不生效有三个核心问题:
- 不存在全局可直接调用的
regex()方法:Gremlin中正则匹配谓词需要通过TextP.regex()调用,不能直接写regex('xxx'),否则Groovy脚本引擎会找不到对应方法,抛出你看到的「方法签名不匹配」错误。 - 分组键转换的逻辑位置错误:
group()步骤的键转换逻辑必须写在对应by()调制器内部,你把coalesce逻辑放在了group()步骤外层,根本不会作用到分组键的生成逻辑上,就算不报错也出不来想要的结果。 - 逻辑冗余:这个场景下分组键本身是布尔类型,直接判断布尔值即可,完全不需要用正则做匹配,用正则反而会增加不必要的性能开销。
正确实现代码
直接用choose()步骤做布尔值到业务名称的映射即可,写法简洁执行效率高:
g.V().has('KType', 'ec2.Subnet') .group() .by( choose(values('DefaultForAz').is(true), constant('AWS Created'), constant('Customer Created') ) ) .by(count())
执行后返回结果为{AWS Created=14, Customer Created=4},和你原始groupCount()查询的计数结果完全一致。
如果后续遇到字符串类型分组键需要正则匹配重命名的场景,要记得把正则谓词放在is()内部,用TextP.regex()的标准写法,参考写法如下(当前布尔场景不需要这么写):
g.V().has('KType', 'ec2.Subnet') .group() .by( coalesce( values('DefaultForAz').is(TextP.regex('^true$')).constant('AWS Created'), values('DefaultForAz').is(TextP.regex('^false$')).constant('Customer Created') ) ) .by(count())
内容的提问来源于stack exchange,提问作者7uper
相关产品推荐
相关产品推荐

