2013-01-15 55 views
3

我查詢用一個簡單的SPARQL查詢的API:SPARQL獲得超過一個子項

PREFIX ... 
SELECT DISTINCT * 
    WHERE { 
    ?item dct:date ?date . 
    ?item dct:title ?title . 
    ?item rdfs:info ?info . 
    } 

這將返回我的XML

<results> 
    <result> 
     <binding name='title'> 
      <literal>titletitle</literal> 
     </binding> 
     <binding name='info'> 
      <uri>link</uri> 
     </binding> 
     <binding name='date'> 
      <literal datatype='http://www.w3.org/2001/XMLSchema#dateTime'>2012-12-21T02:26:00+00:00</literal> 
     </binding> 
     <binding name='item'> 
      <uri>link</uri> 
     </binding> 
    </result> 
    ... 
</results> 

但問題是:我知道,有與此項目匹配的多個rdfs:info鏈接。我如何查詢我得到的

... 
<binding name='info'> 
    <uri>link1</uri> 
</binding> 
<binding name='info'> 
    <uri>link2</uri> 
</binding> 
<binding name='info'> 
    <uri>link3</uri> 
</binding> 
... 

?這很簡單,還是我需要一個子查詢或一些奇怪的UNION? 如果我只是嘗試

PREFIX ... 
SELECT DISTINCT * 
    WHERE { 
    ?item dct:date ?date . 
    ?item dct:title ?title . 
    OPTIONAL (?item rdfs:info ?info1). 
    OPTIONAL (?item rdfs:info ?info2). 
    } 

,將返回的?info1?info2值的所有可能的排列。另外,我不知道信息項目的數量。

如果我加FILTER (?info1 != ?info2),我仍然會得到一些排列組合。我認爲從代數的角度來看,可能會丟棄排列組合。但我怎樣才能在uris上應用<

+2

我發佈這http://answers.semanticweb.com/questions/20424/sparql-get-more-than-one-subitem並投票結束,因爲一個小時後,只有7個意見。這似乎是脫離主題。 –

回答

2

你不能這樣做,恐怕。 SELECT(或者實際上,任何WHERE)的結果都是表格式的,而且不能有嵌套表格(如某些關係數據庫中的表格)或任何其他合適的結構。

直接的選項是將ORDER BY ?item添加到您現有的查詢。至少可以保持一切,所以你可以逐項處理。在過去,我已經寫了包裝遍歷這樣的關係數據,允許這樣的:

foreach (item: iterateOverBy(results, "item") 
    foreach (date: iterateOverBy(results, "date") 
     foreach (title: iterateOverBy(results, "title") 
      foreach (info: iterateOverBy(results, "info") 
       ...do something... 

但SPARQL可以返回RDF,當然,這樣你就可以使用:

CONSTRUCT { ?item dct:date ?date ; dct:title ?title ; rdfs:info ?info } 
WHERE ... 

該內部會做同樣的工作,但結果不會包含大量的重複,如SELECT會。

我的最終建議並不適合問題,但我應該提及它。

到目前爲止,實際的查詢處理還沒有真正改變,只是結果的形式。但是,假設查詢其中的形式爲:

WHERE { 
    ...some condition to select items... 
    ?item dct:date ?date . 
    ?item ... as before ... 
} 

的條件可能是FILTER (?date > ...something...)?item rdf:type ex:InterestingItem,或什麼的。

在這種情況下,你可能會考慮DESCRIBE

DESCRIBE ?item WHERE { ...some condition to select items... } 

,將返回(在RDF)約匹配條件的項目信息。這裏的查詢只是選擇了這些項目,而不是我們想要了解的內容。