首页 > 解决方案 > 在graphdb中减去多个日期范围

问题描述

我正在尝试学习 graphdb 并将其功能与关系数据库进行比较。考虑以下问题:

我有两个日期范围列表:日期输入和日期输出:

日期范围:

过期日期范围:

我想要做的计算是从日期日期范围中减去所有日期出日期范围,这意味着我想知道日期中未描述的日期范围中描述的所有日期范围-超出范围。请注意,日期范围可能重叠。

正确答案是:

我知道如何使用 Postgres 等关系数据库来解决这个问题。关系数据库解决方案将是:

  1. 使用 generate_series() 列出 Date-in 范围和 Date-out 日期中描述的所有日期。这里大约有 33 年,所以总共大约 12,000 天。

  2. 从 Date-in days 列表中选择 Date-out days 列表中不存在的所有日期。这应该很快,因为同样只有 33 年,所以总共大约 12,000 天。

  3. 使用“孤岛”检测 SQL 查询https://www.red-gate.com/simple-talk/sql/t-sql-programming/the-sql-of-gaps-and-islands-in-sequences/查找步骤 2 生成的天数列表中的连续日期范围。

我没有使用graphdb gremlin 遍历来解决这个问题的方法。我在 graphdb 中尝试了与关系数据库中相同的方法,但我知道在 graphdb 的 AWS Neptune 实现中没有 generate_series() 。此外,我不想将节点添加到 graphdb 只是为了运行像这样的读取类型查询。

这个问题有graphdb解决方案吗?

标签: gremlingraph-databasesamazon-neptune

解决方案


扩展我的评论作为答案。

这可能不是在 Gremlin 中容易完成的计算类型。有一些谓词,例如within,可以用来检查一个值是否在一个范围内,但没有等价于。有一个步骤提供科学计算器功能,但我认为一般来说,这种计算最好在应用程序中完成。withoutbetweengenerate_seriesmath

Gremlin 确实允许在查询中包含内联代码(lambda/闭包),但许多图形数据库引擎不允许这样做,因为允许任意代码作为图形遍历的一部分可能会暴露任意数量的风险。即使允许这样做,我觉得这个操作可能最好在应用程序中完成,而不是试图提出一个查询来完成它。

在更简单的情况下,您可以使用以下方法测试日期范围内的值:

gremlin> g.addV('test').property('date',1599830201421)
==>v[60867]

gremlin> g.V().hasLabel('test').has('date',between(1599830201402,1599830212143))
==>v[60867]

推荐阅读