在询问有关 Gremlin 的问题时,最好提供一个示例图表作为可以粘贴到 Gremlin 控制台中的 Gremlin 脚本,如下所示:
g.addV('person').property('name','a').property('changedOn', '2018-01-15T11:53:00').as('a').
addV('person').property('name','b').property('changedOn', '2018-01-15T12:53:00').as('b').
addV('person').property('name','c').property('changedOn', '2018-01-15T13:53:00').as('c').
addV('person').property('name','d').property('changedOn', '2018-01-15T14:53:00').as('d').
addV('person').property('name','e').property('changedOn', '2018-01-15T13:53:00').as('e').
addE('link').from('a').to('b').
addE('link').from('b').to('c').
addE('link').from('c').to('d').
addE('link').from('d').to('e').iterate()
鉴于该图,您可以使用 emit() 解决您的问题,它向 repeat() 解释了应该继续执行该步骤的遍历器:
gremlin> g.V().has('person','name','a').
......1> emit(has('changedOn',lt('2018-01-15T14:53:00'))).
......2> repeat(out('link')).
......3> valueMap()
==>[name:[a],changedOn:[2018-01-15T11:53:00]]
==>[name:[b],changedOn:[2018-01-15T12:53:00]]
==>[name:[c],changedOn:[2018-01-15T13:53:00]]
==>[name:[e],changedOn:[2018-01-15T13:53:00]]
注意几点:
- 在这种情况下,
emit() 的定位发生在 repeat() 之前,因为您想发出“a”顶点 - 如果它定位在 repeat() 之后,您将无法获得该顶点。
- 您尝试使用
until(),但这只是控制循环停止的时间。在我的示例中,它会一直运行到链中没有更多顶点 - 根据您的情况,您可能还需要一个 until() 步骤。
- 我不知道您在图表中存储的是什么形式的日期,但我使用了 ISO-8601 格式 - 您可能希望这样做或只是将日期存储为长。对于“小于”和“大于”的目的,两者都具有可比性,并且可以移植到我所知道的所有图形数据库中。