OrientDB时间跨度搜索查询

tar*_*rka 1 sql select orientdb

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

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

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

我可以从用例中看到,我可以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
)
Run Code Online (Sandbox Code Playgroud)

如果你只有少量的分支,这可以正常工作,但如果你想获得给定时间跨度的所有记录,它就不能很好地工作.假设你想获得所有记录;

month[3].day[20].hour[11] -> month[3].day[29].hour[23]
Run Code Online (Sandbox Code Playgroud)

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

SELECT FROM Sector WHERE timestamp BETWEEN 1406588622 AND 1406588624
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*exB 5

通过试验和阅读有关orientdb中数据类型的一点,我发现:

方括号允许:

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

选项1(更新):

如果您不想创建所有索引并且范围很小,则使用联合多次加入是唯一的选择.这是一个在文档中使用union的查询例子.

方案2:

如果始终为所有时间创建索引,并且在宽范围内进行过滤,则应按范围进行过滤.对于必须创建要筛选的所有索引的成本,这比选项1更具性能.关于现场部分的官方文件.

这是查询的样子:

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

我强烈推荐阅读此内容.