SPARQL使用rdf和tpl

时间:2015-05-30 10:27:22

标签: rdf sparql hierarchy apache-jena

我对sparql Query有点新,我在生成一个简单的数据集时遇到了很多麻烦。基本上这就是我想要做的。鉴于以下数据结构:

 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

2 个答案:

答案 0 :(得分: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的值:tpl:Data的某个值的组合,你可以从组合节点开始:

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