【问题标题】:OrientDB Time Search QueryOrientDB时间搜索查询
【发布时间】:2015-07-03 13:37:38
【问题描述】:

OrientDB 中,我使用use case 设置了一个时间序列。但是,我没有将我的顶点作为嵌入列表附加到相应的小时,而是选择仅创建从小时到时间相关顶点的边。

为了争论,假设每个小时最多有 60 个时间Vertex,每个时间都由时间戳标识。这意味着我可以执行以下查询来获取特定的所需顶点:

SELECT FROM ( SELECT expand( month[5].day[12].hour[0].out() ) FROM Year WHERE year = 2015) WHERE timestamp = 1434146922

这个问题的第一部分是将时间戳存储为顶点的属性(如上查询)与将其存储为边缘(或边缘属性)是否有任何优点/缺点。在这种情况下,我认为查询将是:

SELECT expand( month[5].day[12].hour[0].out('1434146922') ) FROM Year WHERE year = 2015

虽然这看起来更优雅,但我有两个问题;创建新边缘类型的开销。如果您实际上不知道确切的时间戳,则具有灵活性。

问题的第二部分涉及这样一个事实,即一旦我根据时间隔离了单个 Vertex,这只是 Vertex 层次结构树的头部。

我当然可以从上面的查询中得到@rid,然后构造一个新的查询,但我想知道如何调整上面的内容来完成所有这些。例如,假设在所有层次顶点中有一个名为activeboolean 属性。如何获取所有true 的顶点?

【问题讨论】:

    标签: sql select graph orientdb


    【解决方案1】:

    回答您问题的第一部分:

    如用例文档中所述:

    如果您需要比小时更多的粒度,您可以继续直到您需要的时间单位:

    Hour -> minute (map) -> Minute -> second (map) -> Second
    

    通过向树添加更高的精度而不是以小时为单位存储时间的时间戳,您可以获得更大的灵活性。

    向树添加更高的精度具有能够以真正有效的方式按更小的时间单位进行分组的唯一优势。如果您不需要按小时以下的更小的单位进行分组,那么您不必增加更多的精度。

    时间戳应该存储在 vertex 属性中,因为过滤会简单而高效。查看此博客博斯特以了解在遍历时过滤顶点属性的最佳方法: Improved SQL filtering

    回答你问题的第二部分:

    获取特定的顶点,然后对顶点的分层树进行查询:

    <your-hierachical-tree-query> from (select out('edge')[property = "value"] from
    (select expand(month[1].day[1].hour[1].min[1]) from Year where year = 2015))
    

    【讨论】:

    • 我知道时间树的粒度可以增加,但是每个 second 分支有 2 条记录与将 100 条记录分组到 hour 分支中是否有优势?
    • 我不知道在一个顶点上有 100 条不同名称的边是否是一个好习惯。您需要多少粒度?您是否总是在一小时内查询所有记录?您应该扩展时间序列树,以便您可以按所需的时间单位进行分组。哦,我也回答了你问题的第二部分吗?
    • 第二部不错。记录的数量不是线性的。我们可能在 1 秒内有 5 个,然后在 45 分钟内什么也没有。所以 1 小时在技术上是一个很好的粒度,因为如果我精确到秒,我需要知道确切的秒来获取记录。我只是不确定使用时间戳作为矢量或边缘的属性是否更好。
    • 我再次更新了我的答案,在上面的评论中回答了你的问题:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    • 2016-03-11
    • 1970-01-01
    • 2014-09-13
    • 2019-10-31
    • 1970-01-01
    相关资源
    最近更新 更多