灰色小精灵:日期过滤器

7

按日期过滤图数据库:我在http://tinkerpop.apache.org/docs/current/reference/上搜索了一下,但没有找到相关文档。

经过一些研究,似乎ltgt等工作正常。但是,我的下面的方法是正确的吗?或者有没有官方的做法? 下面的代码适用于Neptune和NEO4J,但这是供应商无关的吗。

还发现一个4/5年前的旧帖子,其中建议使用long,但我认为这已经非常陈旧了。


示例数据:

g.addV("TestDate2").property("title", "Alpha").property("date", "01-19-2018")
g.addV("TestDate2").property("title", "Bravo").property("date", "02-20-2018")
g.addV("TestDate2").property("title", "Charlie").property("date", "03-13-2018")
g.addV("TestDate2").property("title", "Delta").property("date", "04-14-2018")
g.addV("TestDate2").property("title", "Echo").property("date", "05-15-2018")
g.addV("TestDate2").property("title", "Foxtrot").property("date", "06-16-2018")
g.addV("TestDate2").property("title", "Hotel").property("date", "07-17-2018")
g.addV("TestDate2").property("title", "India").property("date", "08-18-2018")

查询:

(我格式化了输出的数据,所以它不会真正匹配 Gremlin 输出,但更易读)

小于

g.V().has("TestDate2", "date", lt("03-03-2018")).valueMap()
{'date': ['02-20-2018'], 'title': ['Bravo']}
{'date': ['01-19-2018'], 'title': ['Alpha']}

g.V().has("TestDate2", "date", lt("03-24-2018")).valueMap()
{'date': ['03-13-2018'], 'title': ['Charlie']}
{'date': ['02-20-2018'], 'title': ['Bravo']}
{'date': ['01-19-2018'], 'title': ['Alpha']}

大于

g.V().has("TestDate2", "date", gt("06-16-2018")).valueMap()
{'date': ['07-17-2018'], 'title': ['Hotel']}
{'date': ['08-18-2018'], 'title': ['India']}

g.V().has("TestDate2", "date", gte("06-16-2018")).valueMap()
{'date': ['07-17-2018'], 'title': ['Hotel']}
{'date': ['06-16-2018'], 'title': ['Foxtrot']}
{'date': ['08-18-2018'], 'title': ['India']}

Between 过滤器

g.V().has("TestDate2", "date", between("04-01-2018", "07-01-2018")).valueMap()
{'date': ['06-16-2018'], 'title': ['Foxtrot']}
{'date': ['04-14-2018'], 'title': ['Delta']}
{'date': ['05-15-2018'], 'title': ['Echo']}

失败了,但没关系

g.V().has("TestDate2", "date", lt("3-3-2018")).valueMap()
{'date': ['03-13-2018'], 'title': ['Charlie']}
{'date': ['07-17-2018'], 'title': ['Hotel']}
{'date': ['02-20-2018'], 'title': ['Bravo']}
{'date': ['06-16-2018'], 'title': ['Foxtrot']}
{'date': ['04-14-2018'], 'title': ['Delta']}
{'date': ['08-18-2018'], 'title': ['India']}
{'date': ['01-19-2018'], 'title': ['Alpha']}
{'date': ['05-15-2018'], 'title': ['Echo']}

你不能简单地将日期存储为Date对象吗?Date是TinkerPop中自己的类型,通常会将其作为long存储在数据库中,因此易于使用和存储效率高。 - Florian Hockmann
对于Python,它应该与datetime.datetime对象一起使用。 - Florian Hockmann
谢谢,但是我将我的查询以字符串的形式提交,例如client.submit(query),所以我无法将对象放入字符串中。 - Srinath Ganesh
我认为最简单的方法可能是将日期存储为13位或10位数字整数(取决于您需要的精度)。这样可以执行所有所需的比较,而且在查询图形时大部分独立。 - Kelvin Lawrence
正如其他人所提到的,字符串不是存储日期的最佳数据类型。然而,如果你真的想使用字符串,请使用yyyy-MM-dd(Python中的'%Y-%m-%d')来格式化日期。 - Daniel Kuppitz
显示剩余4条评论
1个回答

9
如果您从Python(或任何其他语言)提交Gremlin查询作为字符串,则Amazon Neptune具有用于指定日期的自定义语法。您可以使用函数datetime()将日期指定为ISO8061格式的字符串。该语法将字符串标识为日期对象并相应地处理它。因此,您不必依赖字典序字符串比较来比较日期。这在此处有记录。
例如,您可以按以下方式将查询编写为字符串:
// Insert Date as property
String insertQuery = "g.addV('TestDate2').property('title','Alpha').property('date', datetime('2018-01-19T00:00:00'))";

// Query for the date added above
String query = "g.V().hasLabel('TestDate2').has('date',gte(datetime('1929-01-01T00:00:00'))).valueMap()";

话虽如此,正如其他人所提到的,你也可以使用GLV客户端(使用Gremlin bytecode而不是String提交查询),并使用客户端语言的本地Date实现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接