Gremlin排序查询中如何实现字符串属性的大于条件筛选
Gremlin字符串属性大于条件筛选实现方案
你遇到的问题本质来自两点:
- 遍历步骤顺序不合理:原语句先执行全量排序再做筛选,不仅性能差,部分图数据库会在排序阶段做属性类型推导,误将后续
gt比较判定为数值比较逻辑 - 部分低版本TinkerPop生态实现对
gt的字符串类型自动推导支持不完善,没有显式走字典序比较逻辑
可用实现方案
方案1:调整步骤顺序,使用标准gt谓词(推荐)
标准TinkerPop 3.4+版本原生支持gt对字符串做Unicode字典序比较,只需要把筛选步骤放到排序之前,既可以解决类型推导问题,也能减少排序的数据量提升性能:
traversal.has("someAttribute", gt("c")) .order().by("someAttribute") .range(0, 2)
在你给出的示例数据中,执行后只会返回someAttribute = "d"的顶点,完全符合预期。
方案2:使用where步骤显式绑定比较逻辑
如果你使用的图数据库版本存在gt字符串比较的兼容bug,可以通过where步骤显式指定属性比较逻辑,绕开类型推导问题:
traversal.where(values("someAttribute").is(gt("c"))) .order().by("someAttribute") .range(0, 2)
注意事项
字符串类型的gt比较是逐位按Unicode编码值做字典序比较,不是按字符串长度比较:比如"c0"、"ca"这类值都会被判定为大于"c",如果你的业务有特殊比较规则,需要额外自定义比较函数。
内容的提问来源于stack exchange,提问作者rbednarska
相关产品推荐
相关产品推荐

