OrientDB 时间跨度搜索查询

OrientDB Time Span Search Query

OrientDB I have setup a time series using this use case。但是,我没有将我的顶点作为嵌入列表附加到相应的小时,而是选择只创建从小时到时间相关顶点的边。

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

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

从用例中可以看出,我可以使用UNION一次性获取多个指定时间分支

SELECT expand( records ) FROM (
  SELECT union( month[3].day[20].hour[10].out(), month[3].day[20].hour[11].out() ) AS records
  FROM Year WHERE year = 2015
)

如果您只有少量分支,此方法工作正常,但如果您想获取给定时间跨度内的所有记录,则此方法效果不佳。假设您想获取所有记录;

month[3].day[20].hour[11] -> month[3].day[29].hour[23]

我可以遍历时间跨度并创建一个巨大的联合查询,但在某些时候我猜想查询会太长而且我猜它不会非常有效。我也可以完全绕过时间分支,直接根据时间戳查询Vectors。

SELECT FROM Sector WHERE timestamp BETWEEN 1406588622 AND 1406588624

问题是你失去了时间分支获得的所有效率。

通过试验和阅读一些关于 orientdb 中数据类型的内容,我发现:

方括号允许:

  • 按一个索引过滤,示例 out()[0]
  • 通过多个索引过滤,示例 out()[0,2,4]
  • 按范围过滤,示例 out()[0-9]

选项 1(更新):

如果您不想创建所有索引并且您的范围很小,那么使用联合多次加入是唯一的选择。 Here is a query exemple using union in the documentation.

选项 2:

如果您始终拥有为您的时间创建的所有索引,并且如果您在较宽的范围内进行过滤,则应该按范围进行过滤。这比选项 1 的性能更高,因为必须创建要过滤的所有索引的成本。 Official documentation about field part.

这是查询的样子:

select 
    *
from 
(
    select 
        expand(hour[0-23].out()) 
    from 
       (select 
            expand(month[3].day[20-29]) 
       from 
            Year 
       where 
            year = 2015)
)
where timestamp > 1406588622

我强烈推荐阅读 this