0

我对 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

4

2 回答 2

1

SPARQL 规范是您的第一资源。

关于您的问题,根据您的查询,Union 构造用于匹配备选方案,例如?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 构造并相应地制定您的查询。一切都在规范中,而且非常简单。

于 2015-05-30T12:11:37.467 回答
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 ]
}

但是,比这更好的是,您根本不需要 ?s 部分。除非组合节点的值是 tpl:composition 的某个值的 tpl:Data 的值很重要,否则您可以直接从组合节点开始:

select ?elementName ?value {
  [] tpl:elementName/rdf:value ?elementName ;
     tpl:value/rdf:value ?value .
}
于 2015-05-30T18:34:07.187 回答