在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
问题在于你失去了时间分支所获得的所有效率。
答案 0 :(得分:5)
通过试验和读取有关orientdb中数据类型的一点,我发现:
方括号允许:
选项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。