Gremlin graphdb中多个日期范围的减法

Gremlin graphdb中多个日期范围的减法,gremlin,graph-databases,amazon-neptune,Gremlin,Graph Databases,Amazon Neptune,我试图学习graphdb,并将其功能与关系数据库进行比较。考虑以下问题: 我有两个日期范围列表:输入日期和输出日期: 日期范围中的日期: 2000年1月1日至2025年12月31日 2026年1月1日至2030年12月31日 2030年2月1日至2033年12月31日 日期范围: 2/1/2005-12/31/2020 2024年1月1日至2026年12月31日 我要做的计算是从日期范围内的日期中减去所有的日期范围,这意味着我想知道日期范围内描述的所有日期范围,而日期范围内没有描述。注意

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

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

日期范围中的日期:

  • 2000年1月1日至2025年12月31日
  • 2026年1月1日至2030年12月31日
  • 2030年2月1日至2033年12月31日
日期范围:

  • 2/1/2005-12/31/2020
  • 2024年1月1日至2026年12月31日
我要做的计算是从日期范围内的日期中减去所有的日期范围,这意味着我想知道日期范围内描述的所有日期范围,而日期范围内没有描述。注意日期范围可能重叠

正确答案是:

  • 2000年1月1日至2005年1月31日
  • 2021年1月1日至2023年12月31日
  • 2027年1月1日至2030年12月31日
  • 2030年2月1日至2023年12月31日
我知道如何使用关系数据库(如Postgres)解决这个问题。关系数据库解决方案是:

  • 使用generate_series()列出日期范围和日期截止日期中描述的所有日期。这里大约有33年,总共大约12000天

  • 从“输入日期”列表中选择“输出日期”列表中不存在的所有日期。这应该很快,因为同样的,它只有33年,总共大约12000天

  • 使用“孤岛”检测SQL查询从步骤2得到的天数列表中查找连续的日期范围

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


    这个问题有没有图形解决方案?

    扩展我的评论作为答案


    这可能不是在Gremlin中容易完成的计算类型。有一些谓词,例如
    内、
    不在
    内和
    之间,可用于检查值是否在某个范围内,但不存在与
    生成序列
    等价的谓词。有一个
    math
    步骤提供了科学计算器功能,但我认为一般来说,这种计算最好在应用程序中完成

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

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

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

    这可能不是在Gremlin中容易完成的计算类型。有一些谓词,例如
    内、
    不在
    内和
    之间,可用于检查值是否在某个范围内,但不存在与
    生成序列
    等价的谓词。有一个
    math
    步骤,但我认为一般来说,这个计算最好在应用程序中完成。