OrientDB时间跨度搜索查询

时间:2015-07-02 13:42:46

标签: sql select orientdb

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

为了论证,可以说每小时最多有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]

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

SELECT FROM Sector WHERE timestamp BETWEEN 1406588622 AND 1406588624

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

1 个答案:

答案 0 :(得分:5)

通过试验和读取有关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