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)
问题是你失去了时间分支所获得的所有效率.
通过试验和阅读有关orientdb中数据类型的一点,我发现:
方括号允许:
选项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)
我强烈推荐阅读此内容.