2012-11-12 182 views
3

假設我有一個充滿視頻元數據的三重存儲區。有視頻可以預先定義標籤的任意選擇,就像這樣:SPARQL中的布爾檢查,檢查是否存在語句

v1 ex:hasTag A. 
v2 ex:hasTag B. 
v3 ex:hasTag A; 
    ex:hasTag B. 

因此,對於這個例子來說,只有兩個預先定義的標籤AB。現在

我想獲得該視頻的具有標籤附着的概述,在這樣的矩陣(或類似):

A  B 

v1 true false 
v2 false true 
v3 true true 

不過,我不知道如何來實現這一目標。首先,我需要布爾測試,例如像isTrue(?video ex:hasTag A)或其他任何東西。即使那樣,我也不知道該把它放在哪裏。如果將前面的語句放在WHERE子句中,那麼查詢結果當然只包含標籤爲A的視頻。

來自SQL,我可以想象我需要以某種方式使用子查詢,but these seem not to be standardized at the moment。我也看到了FILTER關鍵字,但我不覺得這就是我想要的。

我目前處於虧損狀態,但總是願意學習。任何幫助表示讚賞。

回答

2

試着以這樣的事:

SELECT ?video ?tagA ?tagB { 
    ?video a ex:Video . 
    OPTIONAL { ?video ex:hasTag ?tagA . FILTER (?tagA = "A") } 
    OPTIONAL { ?video ex:hasTab ?tagB . FILTER (?tagB = "B") } 
} 
將你大概你想要的是什麼

。如果您確實必須具有布爾值而不是簡單檢查未綁定的VAL,請使用:

SELECT ?video (bound(?tagA) as ?a) (bound(?tagB) as ?b) { ... } 

P.S.子查詢(非常接近,在撰寫本文時建議推薦)standardised in SPARQL 1.1

+0

謝謝,這是我需要的。 – cyroxx

4

子查詢位於SPARQL 1.1中,現在已凍結。已經有幾個完整的實現。

除了嵌套SELECT子查詢,SPARQL 1.1還有EXISTS和NOT EXISTS函數來測試模式是否匹配。它#是一種子查詢形式。您可以在過濾器中使用它,或者,如果你真的想返回真/假:

BIND(EXISTS{?video ex:hasTag "A"} AS ?a) 

甚至:

SELECT ?video (EXISTS{?video ex:hasTag "A"} AS ?a) (EXISTS{?video ex:hasTag "B"} AS ?b) 
{   
    ?video a ex:Video . 
} 
+0

使用EXISTS,如果我想檢查多個值,比如'EXISTS(?video ex:hasTag(「A」||「B」)}' – User528491

+1

這是一個完整的模式:'EXISTS {?video ex:hasTag?X。 FILTER(?X IN(「A」,「B」))}' – AndyS