2014-07-06 45 views
0

我想寫一個SPARQL查詢,但沒有得到它的權利。我想獲得?x每種類型的一個答案,我想DISTINCT關鍵字會做的?x在jena sparql中使用Distinct?

沒有重複的值,但它確實不是我的數據,這是我的查詢:

SELECT DISTINCT ?x ?ax ?bx ?cx 
WHERE 
{ 
    ?a <SUB:> ?x . 
    ?a <DATE:> ?ax . 
    ?a <SENDERNAME:> ?bx . 
    ?a <MESSAGEID:> ?cx. 
    ?a <REFERENCES:> ?z . 
    FILTER regex(?z,'<','i') 
} 
LIMIT 30 OFFSET 0 

的問題是我仍然得到重複值?x

我該如何才能將ditinct應用於?x

回答

0

DISTINCT SPARQL將應用於行而不是變量,因此,如果整行是不同的,則對於行中的一個/多個列獲取重複值是完全有效的。

實現目標的典型方法是使用GROUP BY子句按特定變量對解決方案進行分組,然後使用?x - 然後使用SAMPLE()聚合爲您感興趣的其他列提取樣本值在例如

SELECT ?x (SAMPLE(?ax) AS ?date) (SAMPLE(?bx) AS ?sender) (SAMPLE(?cx) AS ?messageID) 
WHERE 
{ 
    ?a <SUB:> ?x . 
    ?a <DATE:> ?ax . 
    ?a <SENDERNAME:> ?bx . 
    ?a <MESSAGEID:> ?cx. 
    ?a <REFERENCES:> ?z . 
    FILTER regex(?z,'<','i') 
} 
GROUP BY ?x 
LIMIT 30 OFFSET 0 

現在,這可能也會給你你正在尋找的,因爲你還沒有告訴我們您的數據或者什麼預期結果的任何細節應該像(這樣做將會大幅度提高您發表未來的問題)

什麼

。上面給你的每個?x一個行,然後爲每個?ax?bx?cx從構成每個組的行採取隨機選擇的值。

如果你實際想要做的是拉出不同的主題,然後找到與該主題相關的消息的詳細信息,那麼你必須使用現有的查詢,並在代碼中手動進行分組,或者你會需要進行兩個單獨的查詢 - 一個獲取不同的主題,另一個查詢每個不同的主題以獲取與其關聯的消息。

相關問題