我正在尝试学习graphdb并将其功能与关系数据库进行比较。考虑以下问题:
我有两个日期范围列表:date-in和date-out:
约会日期范围:
过期日期范围:
我要进行的计算是从日期输入日期范围中减去所有日期删除日期范围,这意味着我想知道日期输入范围中所述的所有日期范围。请注意,日期范围可能会重叠。
正确答案是:
我知道如何使用关系数据库(例如Postgres)解决此问题。关系数据库解决方案将是:
使用generate_series()列出日期范围和日期范围中所述的所有日期。这里大约有33年,所以总共大约有12,000天。
从“输入日期天数”列表中选择所有不在“过期日期天数”列表中的日期。这应该很快,因为这又只有33年左右,因此总共约有12,000天。
使用“岛屿”检测SQL查询https://www.red-gate.com/simple-talk/sql/t-sql-programming/the-sql-of-gaps-and-islands-in-sequences/从步骤2的结果天数列表中查找连续的日期范围。
我没有使用graphdb gremlin遍历来解决此问题的方法。我在graphdb中尝试了与关系db中相同的方法,但是我知道在graphdb的AWS Neptune实现中没有generate_series()。此外,我不想只是为了运行像这样的读取类型查询而将节点添加到graphdb。
是否有针对该问题的graphdb解决方案?
答案 0 :(得分:1)
扩大我的评论作为答案。
这可能不是在Gremlin中轻松完成的计算类型。有一些谓词,例如within
,without
和between
,可用于检查值是否在范围内,但不等于generate_series
。 math
步骤提供了科学的计算器功能,但我认为通常这种计算在应用程序中更好。
Gremlin确实允许在查询中包含行内代码(lambda /闭包),但是许多Graph Database Engines不允许这样做,因为允许任意代码作为遍历图的一部分会带来许多风险。即使允许这样做,我还是认为此操作最好在应用程序中完成,而不是尝试通过查询来完成。
在更简单的情况下,您可以使用以下方法测试日期范围内的值:
gremlin> g.addV('test').property('date',1599830201421)
==>v[60867]
gremlin> g.V().hasLabel('test').has('date',between(1599830201402,1599830212143))
==>v[60867]