我对sparql查询有点陌生,我在生成一个简单的数据集时遇到了很多问题。基本上,这就是我想要做的。给定以下数据结构:
Data
-Composition
-ElementName:"A"
-Value :"4"我想输出如下所示的内容
-----------------------
| elementName | Value |
=====================
| "A" | "1" |
| "B" | "2" |
| "C" | "3" |
| "D" | "4" |
-----------------------对以下代码执行USing命令
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
发布于 2015-05-30 20:11:37
SPARQL spec是你的头号资源。
关于您的问题,根据您的查询,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的答案,了解使用空白节点变量的另一种形式。
相反,如果您想要与完整的外连接等价的东西(例如,结果要么具有值,要么具有名称,或者两者都有),那么您可以查看可选构造,并相应地制定查询。所有这些都在spec中,而且非常简单。
发布于 2015-05-31 02:34:07
由于查询部分:
?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部分。除非重要的是composition节点是tpl:Data的某个值的tpl:composition的值,否则您可以直接从composition节点开始:
select ?elementName ?value {
[] tpl:elementName/rdf:value ?elementName ;
tpl:value/rdf:value ?value .
}https://stackoverflow.com/questions/30544980
复制相似问题