2014-06-29 25 views
2

最近我在很多SPARQL查詢中使用VALUES,只是意識到在其中一箇中,我沒有得到我期待的結果。SPARQL BIND打破VALUES?

下面是一個簡單的例子:

@prefix ns: <http://some/ns> . 

<http://some/uri> a ns:Document ; 
ns:A5000 "00003381" ; 
ns:A5080 "sredniowiecze" . 

我使用VALUES從nsA5080文字到URI來 「翻譯」。簡單的查詢:

PREFIX ns: <http://some/ns> 
SELECT ?document ?u ?p ?lp 
WHERE 
{ 
    ?document ns:A5080 ?p .  
     VALUES (?p ?u) { 
      ("sredniowiecze" ns:MiddleAges) 
      ("other" ns:Other) 
    }  
} 

按預期工作:

Document U P LP 
<http://some/uri> <http://some/nsMiddleAges> "sredniowiecze" 

但是,如果我將其更改爲:

SELECT ?document ?u ?p ?lp 
WHERE 
{ 
     ?document ns:A5080 ?p .  
     BIND (LCASE(?p) AS ?lp) 
     VALUES (?lp ?u) { 
      ("sredniowiecze" ns:MiddleAges) 
      ("other" ns:Other) 
    }  

} 

我越來越:

Document U P Lp 
<http://some/uri> <http://some/nsMiddleAges> "sredniowiecze" "sredniowiecze" 
<http://some/uri> <http://some/nsOther> "sredniowiecze" "sredniowiecze" 

哪些呢對我不感興趣。額外的元組來自哪裏?在真正的查詢中,我有ca. VALUES中有30多個元組,它們都落在結果中。 什麼是更有趣的查詢看起來幾乎像那樣 - 在其他地方工作得很好。

想法?

+0

我仍然對解決這個難題感興趣,但同時我想報告說,在原始查詢中添加和刪除BIND和變量的一些空格 - 修復了它。但在上面的查詢中做非常類似的格式 - DID不工作。 ( –

+1

)如果這是一個bug,它可能是特定於某個特定的實現。您使用的是什麼SPARQL引擎?Jena?Virtuoso?其他?爲什麼標記爲[tag:switch-statement]?它沒有任何東西 –

+0

第二個查詢並不完全是你正在運行的,你顯示的輸出有一個Document變量,但你的第二個查詢有DocumentA,我不確定是否這樣做在這裏有一個區別或者不是這樣,但是這使得它難以重現... –

回答

2

我認爲問題在於您同時使用VALUES和BIND來定義?lp。我懷疑沒有人想過發生這種情況,但無論如何,由於VALUES是最後設置的,它應該在BGP中有優先權,但是由於BIND關閉了BGP,結果會變得很奇怪。我懷疑像這樣的查詢,你不使用BIND和VALUES對同一個變量會更好。

SELECT ?document ?u ?p ?lp 
WHERE 
{ 
     ?document ns:A5080 ?p .  
     VALUES (?lp ?u) { 
      ("sredniowiecze" ns:MiddleAges) 
      ("other" ns:Other) 
     FILTER (sameTerm(LCASE(?p), ?lp)) 
    }  
} 
+0

我喜歡這個解決方案,但它看起來像我誤解了VALUES的工作方式。我期待它找到匹配一個(或更多 - 如果已定義)變量的元組。在我的情況下,這是?lp。有趣的是,它的工作原理就像這樣。我創建的30個查詢中有29個 - 全部遵循這種模式,但具有不同的數據。幸運的是,您的解決方案只是我的代碼中的一個小改動。謝謝。 –