2015-05-30 85 views
0

我對sparql查詢有點新,我在生成一個簡單的數據集時遇到了很多麻煩。基本上這就是我想要做的。由於數據結構如下:SPARQL查詢分層數據使用rdf和tpl

Data 
    -Composition 
      -ElementName:"A" 
      -Value  :"4" 

我要輸出類似下面的

----------------------- 
| elementName | Value | 
===================== 
| "A"   | "1" | 
| "B"   | "2" | 
| "C"   | "3" | 
| "D"   | "4" | 
----------------------- 

使用下面的代碼

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX tpl: <http://www.example.com/1962c0ea39923156f8ef72fa44584f26e7c5ae20#> 

SELECT ?elementNameValue ?valueValue 
WHERE { 
{ 
?s tpl:Data/tpl:composition/tpl:elementName ?o . 
?o rdf:value ?elementNameValue . 
} 
UNION 
{ 
?s tpl:Data/tpl:composition/tpl:value ?o . 
?o rdf:value ?valueValue . 
} 
} 

我輸出

----------------------- 
| elementName | Value | 
===================== 
| "A"   |  | 
| "B"   |  | 
| "C"   |  | 
| "D"   |  | 
|    | "1" | 
|    | "2" | 
|    | "3" | 
|    | "4" | 
----------------------- 

我在做什麼 錯誤?對資源的指導也很有幫助。使用APache-Jena

+0

什麼,當你寫操作發生'選擇elementNameValue?valueValue WHERE { {s}:tpl:Data/tpl:composition/tpl:elementName | tpl:value?o。 ?rdf:value?elementNameValue。 ?rdf:value?valueValue。 }' – Artemis

回答

1

SPARQL spec是您的頭號資源。

關於你的問題,根據你的查詢的聯合構造用於匹配選擇例如?elementNameValue是來自UNION第一個分支的解決方案,?valueValue是來自第二個分支的解決方案。

如果你在內部相當於尋找的東西加入(符合雙方的名稱和一個值,如結果),然後去除工會可能是你所追求的:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX tpl: <http://www.example.com/1962c0ea39923156f8ef72fa44584f26e7c5ae20#> 

SELECT ?elementNameValue ?valueValue WHERE { 
    ?s tpl:Data/tpl:composition/tpl:elementName ?name . 
    ?name rdf:value ?elementNameValue . 
    ?s tpl:Data/tpl:composition/tpl:value ?value . 
    ?value rdf:value ?valueValue . 
} 

這可能要進行優化:

SELECT ?elementNameValue ?valueValue WHERE { 
    ?s tpl:Data/tpl:composition ?o . 
    ?o tpl:elementName/rdf:value ?elementNameValue; 
    tpl:value/rdf:value ?valueValue . 
} 

這會給你帶有名稱和值的結果行。另請參閱Joshua Taylor對使用空白節點變量的替代形式的回答。

如果您想要完全外連接的等價物(例如結果具有值或名稱或兩者都有),那麼您可以查看Optional構造並相應地制定您的查詢。所有在spec和非常簡單。

+1

「假設聰明的語法是正確的,我不熟悉」只是好奇,你指的是哪一部分? –

1

由於查詢部分:

?s tpl:Data/tpl:composition/tpl:elementName ?o . 
?o rdf:value ?elementNameValue . 

?s tpl:Data/tpl:composition/tpl:value ?o . 
?o rdf:value ?valueValue . 

的流汗你,你要找的部分,我認爲你可以使用這樣的查詢來獲取你正在尋找的結果:

select ?elementName ?value { 
    ?s tpl:Data/tpl:composition ?composition . 
    ?composition tpl:elementName/rdf:value ?elementName ; 
       tpl:value/rdf:value ?value . 
} 

現在,你可以使哪怕是一點點縮短使用空白節點:

select ?elementName ?value { 
    ?s tpl:Data/tpl:composition [ tpl:elementName/rdf:value ?elementName . 
           tpl:value/rdf:value ?value ] 
} 

但是,甚至比這更好的,你並不真的需要在所有的角色呢?。除非是很重要的組成節點是第三方物流的價值:TPL的一些價值的組成:數據,你可以就在合成節點開始:

select ?elementName ?value { 
    [] tpl:elementName/rdf:value ?elementName ; 
    tpl:value/rdf:value ?value . 
}