簡體   English   中英

OrientDB時間跨度搜索查詢

[英]OrientDB Time Span Search Query

OrientDB中,我已使用此用例設置了時間序列。 但是,我沒有將我的頂點作為嵌入列表附加到各個小時,而是選擇僅創建一個從小時到與時間相關的頂點的邊。

為了爭辯,可以說每個小時最多包含60個時間Vertex每個時間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

問題是您失去了時間分支所獲得的所有效率。

通過試驗和閱讀有關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

我強烈建議您閱讀此內容

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM