求等价于指定SQL的Gremlin查询:将空值置于末尾排序
等价于指定SQL的Gremlin查询(空值/空字符串排末尾)
你的目标是实现和这条SQL等价的Gremlin逻辑:
select * from test.test_table order by alias = '', alias asc, name asc;
这条SQL会把alias为空字符串的行排在最后,再按alias、name升序排序。而默认的Gremlin排序会把空字符串、null值排在结果顶部,需要调整排序规则来匹配SQL行为。
解决方案
通过在排序时先给非空的alias标记优先级,让空值/空字符串自动落到末尾,再按原字段排序:
g.V("ID") .inE('RELATIONSHIP_NAME') .outV() .order() // 第一步:给非空alias标记0,空值/空字符串标记1,升序后非空在前 .by( __.coalesce( __.has('alias', neq('')).has('alias', neq(null)), __.constant(0), __.constant(1) ), asc ) // 第二步:按alias字段升序 .by('alias', asc) // 第三步:按name字段升序 .by('name', asc) .valueMap() .toList()
逻辑说明
- 第一个
by遍历器:用coalesce判断顶点是否有非空且非null的alias属性,满足条件返回0,否则返回1。升序排序时,0会排在1前面,自然把空值/空字符串的顶点放到结果末尾。 - 后续的两个
by分别对应SQL中alias asc和name asc的排序规则,保证非空部分的排序和SQL一致。
如果仅需要处理null值(无需处理空字符串),可简化为使用nullsLast(需对应支持的TinkerPop版本):
g.V("ID") .inE('RELATIONSHIP_NAME') .outV() .order() .by('alias', asc, nullsLast) .by('name', asc) .valueMap() .toList()
注意这个写法仅对null值生效,不会处理空字符串场景。
内容的提问来源于stack exchange,提问作者Ethen
相关产品推荐
相关产品推荐

