2015-02-23 100 views
1

我正在用OrientDb與示例車輛歷史數據庫進行試驗,並且執行了這兩個SQL查詢,我認爲它們是相同的。我試圖找到所有向一名男性出售車輛的女性。選擇和遍歷的不同結果?

SELECT expand(out('Bought').in('Sold')[gender="Female"]) FROM Person 
    WHERE gender = "Male" LIMIT = -1 

此人返回124條記錄。

雖然

SELECT FROM (TRAVERSE in('Sold') FROM ( 
    SELECT FROM (TRAVERSE out('Bought') FROM ( 
    SELECT FROM Person WHERE gender = "Male") 
) WHERE @class = "Transaction")) 
WHERE @class = "Person" and gender = "Female" LIMIT = -1 

返回117條記錄。

我希望有人能向我解釋有什麼不同?

+0

TRAVERSE沒有WHILE任何條件沒有得到一個級別。但我需要你的分貝來玩。有機會在任何地方在網上發佈它? – Lvca 2015-02-24 18:06:47

+0

@Lvca它是公共'VehicleHistoryGraph' db – codemix 2015-02-24 20:24:42

回答

2

我們在gitter上解決了這個問題,但是對於其他人想知道的 - 這是因爲第二個查詢將刪除重複項(因爲遍歷),但第一個不會。

1

@codemix是正確的,有相同的結果使用set()排除重複:喜歡你用SELECT做

SELECT FROM (
    TRAVERSE in('Sold') FROM ( 
    SELECT FROM (
     TRAVERSE set(out('Bought')) FROM ( 
     SELECT FROM Person WHERE gender = "Male" 
    ) 
    ) WHERE @class = "Transaction" 
) 
) 
WHERE @class = "Person" and gender = "Female" LIMIT = -1 
+0

實際上,遍歷似乎是自動重複的。看起來第一個查詢是返回附加結果的查詢。所以這套應該適用於它。感謝您展示設置功能! – Ryan 2015-02-25 22:50:16