2015-12-07 92 views
1

我對Orient SQL查詢有一個語義問題。Orient SQL - 使用WHERE篩選結果集?

採取例如這個非常簡單的曲線圖:

v(#12:1 User) --> e(#13:1 FriendOf) --> v(#12:2 User) 

換句話說,給定的用戶與除掉#12:1是朋友與除掉#12另一用戶:2。

要獲得用戶#12的朋友:1,人們可能會在東方SQL表達這種像這樣:

SELECT EXPAND(both("FriendOf")) FROM #12:1 

該查詢將返回由用戶與擺脫#12的結果列表:2。

現在可以說,我想通過一個額外的標準來篩選結果列表,就像說一個數值(「時代」):

SELECT EXPAND(both("FriendOf")) FROM #12:1 WHERE age >= 10 

上面的查詢將篩選當前頂點(#12:1 ),而不是結果集。這是有道理的,但有沒有辦法將過濾器應用到EXPAND(兩者(「FriendOf」))結果而不是當前頂點?我知道我可以用小鬼做到這一點,像這樣:

SELECT EXPAND(gremlin('current.both("FriendOf").has("age",T.gte,10)')) FROM #12:1 

但上面似乎沒有利用索引(至少不是當我問它來解釋)。對於非常大的數據集,這是有問題的。

那麼有沒有適當的方法來將WHERE語句應用於結果數據集?

謝謝!

+0

這似乎也工作,但不使用索引: SELECT EXPAND(both(「FriendOf」)[age> = 10])FROM#12:1 – nightrise

回答

0

...有沒有辦法將過濾器應用到EXPAND(Both(「FriendOf」))結果而不是當前頂點?

簡單的答案是嵌入到你的基本「選擇展開......」另一個SELECT內,即

SELECT FROM (SELECT EXPAND(both("FriendOf")) FROM #12:1) WHERE age >= 10 

順便說一句,我的Mac上,上面帶着.005s相比,超過2秒Gremlin版本。在這裏必須有一個道德:-)

+0

@nightrise - 我不明白爲什麼在SELECT FROM(SELECT EXPAND(_)....)...語句中需要調用EXPAND。你做?無論如何,我已經能夠找到的關於EXPAND的OrientDB文檔非常不起眼;如果你有同樣的印象,也許我們中的一個應該在https://github.com/orientechnologies/orientdb/issues創建一個文檔ER ...) – peak

+0

我認爲不同的是,沒有EXPAND,你基本上只是得到記錄id(@rid)。使用EXPAND,你基本上是通過遍歷鏈接來獲取實際記錄數據。例如,對於具有將其連接到其他用戶頂點的「FriendOf」邊的給定用戶頂點「Bob」,「Bob」頂點文檔具有RID列表,其表示到邊緣的鏈接(或者在「輕量級」邊緣)。那有意義嗎?是的,我傾向於儘可能使用Orient SQL,因爲它在許多情況下似乎更快! – nightrise

+0

我應該補充說,有時你不想遍歷鏈接,只是爲了檢索擺脫或檢查它的存在。我個人親自使用了這個功能,當你不需要整個數據集時,它在性能上會有很大的差異(特別是在使用輕量級邊緣時)。 – nightrise