首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SPARQL使用rdf和tpl查询分层数据

SPARQL使用rdf和tpl查询分层数据
EN

Stack Overflow用户
提问于 2015-05-30 18:27:22
回答 2查看 356关注 0票数 0

我对sparql查询有点陌生,我在生成一个简单的数据集时遇到了很多问题。基本上,这就是我想要做的。给定以下数据结构:

代码语言:javascript
复制
 Data
     -Composition
           -ElementName:"A"
           -Value      :"4"

我想输出如下所示的内容

代码语言:javascript
复制
----------------------- 
| elementName | Value |
 =====================
| "A"         | "1"   |
| "B"         | "2"   |
| "C"         | "3"   |
| "D"         | "4"   |
-----------------------

对以下代码执行USing命令

代码语言:javascript
复制
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 .
}
} 

我正在输出

代码语言:javascript
复制
----------------------- 
| elementName | Value |
 =====================
| "A"         |       |
| "B"         |       |
| "C"         |       |
| "D"         |       |
|             | "1"   |
|             | "2"   |
|             | "3"   |
|             | "4"   |
-----------------------

我做错了什么?资源的说明也很有帮助。使用APache-Jena

EN

回答 2

Stack Overflow用户

发布于 2015-05-30 20:11:37

SPARQL spec是你的头号资源。

关于您的问题,根据您的查询,UNION构造用于匹配备选方案,例如,?elementNameValue用于Union的第一个分支的解决方案,?valueValue用于第二个分支的解决方案。

如果你正在寻找等同于内连接的东西(例如,同时匹配名称和值的结果),那么删除联合可能是你想要的:

代码语言:javascript
复制
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 .
} 

可以对其进行优化:

代码语言:javascript
复制
SELECT ?elementNameValue ?valueValue WHERE {
  ?s tpl:Data/tpl:composition ?o .
  ?o tpl:elementName/rdf:value ?elementNameValue;
     tpl:value/rdf:value ?valueValue . 
} 

这将为您提供同时具有名称和值的结果行。另请参阅Joshua Taylor的答案,了解使用空白节点变量的另一种形式。

相反,如果您想要与完整的外连接等价的东西(例如,结果要么具有值,要么具有名称,或者两者都有),那么您可以查看可选构造,并相应地制定查询。所有这些都在spec中,而且非常简单。

票数 1
EN

Stack Overflow用户

发布于 2015-05-31 02:34:07

由于查询部分:

代码语言:javascript
复制
?s tpl:Data/tpl:composition/tpl:elementName ?o .
?o rdf:value ?elementNameValue .

代码语言:javascript
复制
?s tpl:Data/tpl:composition/tpl:value ?o .
?o rdf:value ?valueValue .

得到了你正在寻找的部分,我认为你可以使用这样的查询来获得你正在寻找的结果:

代码语言:javascript
复制
select ?elementName ?value {
  ?s tpl:Data/tpl:composition ?composition .
  ?composition tpl:elementName/rdf:value ?elementName ;
               tpl:value/rdf:value ?value .
}

现在,您可以通过使用空白节点来使其更短:

代码语言:javascript
复制
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节点开始:

代码语言:javascript
复制
select ?elementName ?value {
  [] tpl:elementName/rdf:value ?elementName ;
     tpl:value/rdf:value ?value .
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30544980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档