我对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
答案 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 .
}