Gremlin技术问询:如何获取指定日期前创建的关联顶点
解决Gremlin链式遍历筛选顶点的问题
先帮你梳理下原查询里的几个关键问题,然后给出正确的查询写法:
原查询的核心问题
- 属性名笔误:你要筛选的是
createdOn属性,但查询里写的是changedOn,这直接导致过滤逻辑完全错位 - 条件方向搞反:你需要的是早于指定日期的顶点,应该用
lt()(小于),但你用了gt()(大于),逻辑完全相反 - 缺少
emit()收集结果:默认情况下,repeat()只会返回遍历终止时的顶点,而不是所有符合条件的顶点,必须用emit()来指定哪些顶点需要被收集 - 遍历步骤可以简化:
outE().inV()等价于更简洁的out()写法
正确的查询写法
针对你的链式结构(a→b→c→d...),我们需要从a出发,收集所有createdOn早于2017-05-31的顶点,直到遇到不符合条件的顶点或链的末端为止。这里推荐两种可靠的写法:
写法一:优先检查起始顶点,再遍历后续节点
这种写法会先判断起始顶点a是否符合条件,如果符合就收集它,然后依次遍历后续节点,收集符合条件的,直到遇到不符合条件的节点或没有下一个节点:
g.V('a') .emit(has('createdOn', lt('2017-05-31T00:00:00'))) .repeat(out()) .until(has('createdOn', gte('2017-05-31T00:00:00')).or().not(out()))
写法二:先遍历再筛选(适合起始顶点可能不符合条件的场景)
如果起始顶点a的createdOn可能晚于指定日期,不想包含它,可以把emit()放在repeat()之后:
g.V('a') .repeat(out()) .emit(has('createdOn', lt('2017-05-31T00:00:00'))) .until(has('createdOn', gte('2017-05-31T00:00:00')).or().not(out()))
额外注意事项
- 日期格式:建议使用ISO 8601标准格式(如
2017-05-31T00:00:00),不同图数据库对日期字符串的解析规则可能不同,标准格式能避免解析错误 - 终止条件:
until()里的or().not(out())是为了处理链的末端(没有下一个节点)的情况,避免遍历无限循环
内容的提问来源于stack exchange,提问作者jfin3204
相关产品推荐
相关产品推荐

