2016-02-10 27 views
0

我一直無法找到SQL的答案。OrientDB SQL檢查是否有多對頂點連接

給定它們之間的頂點對(記錄ID)和邊類型,我想檢查是否所有的對都存在。

V1 --E1 - > V2

V3 --E2 - > V4

...等等。我想要的答案是真/假或者相同的東西。所有連接必須存在才能評估爲真,因此每對至少必須存在一個(正確類型的)邊緣。

假,問題是:

Does V1 have edge <E1EdgeType> to V2? 
AND 
Does V3 have edge <E2EdgeType> to V4? 
AND 
... and so on 

有誰知道orientDB SQL將是實現這一目標呢?

UPDATE

我也已經有了,如果已知頂點之間存在一個單一的邊緣檢測的一種方式。這也許不是很漂亮下去,但它的工作原理:如果類型爲「TestEdge」邊緣由第12存在:

SELECT FROM (
    SELECT EXPAND(out('TestEdge')) FROM #12:0 
) WHERE @rid=#12:1 

這將目的地記錄(0 12):返回0到12:1。但是,如果我有兩個這樣的查詢,那麼如何查詢兩個查詢的單個結果。例如:

SELECT <something with $c> LET 
    $a = (SELECT FROM (SELECT EXPAND(out('TestEdge')) FROM #12:0) WHERE @rid=#12:1) 
    $b = (SELECT FROM (SELECT EXPAND(out('AnotherTestEdge')) FROM #12:2) WHERE @rid=#12:3) 
    $c = <something that checks that both a and b yield results> 

這就是我的目標。請告訴我,如果我以錯誤的方式解決這個問題。我甚至不確定合併這種查詢的好處是什麼,而不是重複查詢。

+0

也許你可以嘗試一個JavaScript函數? –

回答

1

也許下面的查詢

SELECT eval('sum($a.size(),$b.size())==2') as existing_edges 
let $a = (SELECT from TestEdge where out = #12:0 and in = #12:1 limit 1), 
    $b = (SELECT from AnotherTestEdge where out = #12:2 and in = #12:3 limit 1) 

希望它可以幫助你有用。

+0

是的,非常有用,因爲它既可以擴展到更多的邊,也可以顯示返回單個布爾值的方法。謝謝! – dargolith

2

給定一對頂點,說#11:0和12:0,以下查詢將有效地檢查是否有E型的從#11的邊緣:0 至#12:0

select from (select @this, out(E) from #11:0 unwind out) where out = #12:0 

----+------+-----+----- 
# |@CLASS|this |out 
----+------+-----+----- 
0 |null |#11:0|#12:0 
----+------+-----+----- 

這是非常不雅,我會鼓勵你想想在https://github.com/orientechnologies/orientdb/issues

一種方式相應地制定一個增強請求納入你的想法是通過以下所示的布爾測試:

select from 
    (select $a.size() as a, $b.size() as b 
    let a=(select count(*) as e from (select out(E) from #11:0 unwind out) 
            where out = #12:0), 
     b=(select count(*) as e from (select out(E) from #11:1 unwind out) 
            where out = #12:2)) 
where a > 0 and b > 0 

是,inelegance再次:-(

+0

非常感謝這個例子!是否有可能將它變成更真/假的結果和/或將它合併成你所做的兩個(或更多)這些示例(查詢)。我知道如何使用LET合併查詢,我只是不知道如何處理查詢結果,我需要查看每個查詢是否需要「返回true」(即每個查詢都需要成功檢查邊緣是否存在於頂點),同時我需要確保每個查詢都成功找到了一條邊,以便將整個查詢返回爲「真」。 – dargolith

+0

我實際上有另一種方法找出它與你的有點相似,我會用它更新我的問題(如果你有意見,哪一個更好,請賜教)。但我仍然不知道如何修改返回數據,以便能夠同時對多個查詢結果進行邏輯檢查。 – dargolith

+0

我第一次看到你的更新。這也是一個解決方案。也可以使用'$ a.size()。asBoolean()'將size()轉換爲布爾值。結果仍然是一組布爾值。儘管如此,還有一些技巧可以將它壓縮爲單個布爾值,因爲標記的答案顯示了一個例子。我同意,有一些更簡單的方法可以做到這一點很好。最好內置功能,因爲它感覺真的很有用。 – dargolith