首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >包含谓词文字的SPARQL构造子句

包含谓词文字的SPARQL构造子句
EN

Stack Overflow用户
提问于 2013-10-27 07:35:01
回答 3查看 1.1K关注 0票数 2

我正在尝试使用SPARQL结构从dbpedia中剥离一组数据-我只对一组艺术家感兴趣,我希望Sesame在速度上尽可能小。

我认为我可以做的是使用CONSTRUCT来获取给定艺术家的每个谓词。我可以让第一个构造子句工作,以确保我得到类型"Person",但这只给了我满足那个子句的三个子句-我想要他们的名字,标签,birthPlaces等。我下面的查询是试图在第二个构造子句中捕获Monet的名字?如果我没记错的话,这会给我三倍的

代码语言:javascript
运行
复制
<http://dbpedia.org/resource/Claude_Monet>  
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type>   
<http://xmlns.com/foaf/0.1/Person>

像这样的三元组

代码语言:javascript
运行
复制
<http://dbpedia.org/resource/Claude_Monet>  
<http://xmlns.com/foaf/0.1/name>
"Claude Monet"@en

我如何让我的查询使用Monet名字的对象作为变量,以便在插入空引号时使用?下面是查询

代码语言:javascript
运行
复制
PREFIX purl: <http://purl.org/dc/elements/1.1/>
PREFIX foaf:    <http://xmlns.com/foaf/0.1/>
CONSTRUCT {
  ?s a foaf:Person .
  ?s foaf:name ""
} WHERE { 
  ?s foaf:surname "Monet"@en . 
  ?s purl:description "Painter"@en
} LIMIT 100

真的很感谢你的帮助

麦克

EN

回答 3

Stack Overflow用户

发布于 2013-10-28 05:21:39

我们到了,就是这里。一旦我弄清楚了结构和它的实际位置之间的变量绑定是很简单的。

每个WHERE语句从代码库中选择这些值,并且在引用相同变量的构造中需要一个匹配的模板语句。该值刚刚被替换。我想很明显吧。

注意,self -必须停止像RDBMS那样思考。

代码语言:javascript
运行
复制
PREFIX purl: <http://purl.org/dc/elements/1.1/>
PREFIX foaf:    <http://xmlns.com/foaf/0.1/>
PREFIX dbont:  <http://dbpedia.org/ontology/>
PREFIX w3: <http://www.w3.org/2000/01/rdf-schema#>

CONSTRUCT 
{
    ?s a foaf:Person .
    ?s foaf:name ?a .
    ?s foaf:surname ?b .
    ?s foaf:givenName ?c .
    ?s w3:label ?d .
    ?s purl:description ?e .
    ?s dbont:birthPlace ?f .
    ?s dbont:deathPlace ?g .
    ?s dbont:birthDate ?h .
    ?s dbont:deathDate ?i
}  
WHERE {
    ?s foaf:name ?a .
    ?s foaf:surname ?b .
    ?s foaf:givenName ?c .
    ?s w3:label ?d .
    ?s purl:description ?e .
    ?s dbont:birthPlace ?f .
    ?s dbont:deathPlace ?g .
    ?s dbont:birthDate ?h .
    ?s dbont:deathDate ?i .
    ?s purl:description "Painter"@en
}
票数 2
EN

Stack Overflow用户

发布于 2013-10-28 11:55:43

作为替代/速记,您还可以使用DESCRIBE查询,例如:

代码语言:javascript
运行
复制
DESCRIBE <http://dbpedia.org/resource/Claude_Monet>

将为您提供一个子图,其中包含<http://dbpedia.org/resource/Claude_Monet>的所有传入和传出属性,或者:

代码语言:javascript
运行
复制
DESCRIBE ?x WHERE { ?x purl:description "Painter"@en }

将为所有具有匹配purl:description?x提供一个子图。

当然,这给了你更少的对提取的精确三元组的控制,但好处是它更短,并且如果特定资源不存在特定的三元组模式,也不需要进行调整(例如,如果由于任何原因,特定的绘制程序在WHERE子句中没有deathDatefoaf:surname或任何其他属性,则构造查询将不匹配)。

一个小小的警告: DESCRIBE查询结果的精确内容依赖于实现。例如,一些三元组可能选择只返回传出属性。但是Sesame (我相信DBPedia端点也是如此)返回所谓的Symmetric Concise Bounded Description

票数 1
EN

Stack Overflow用户

发布于 2013-10-29 02:10:04

我看到您已经answered you own question了,但是我确实想指出,当construct查询返回的三元组与where部件匹配的三元组完全相同,并且where部件不包含任何太花哨的东西时,您可以使用特殊的简写construct where

16.2.4 CONSTRUCT WHERE

对于模板和模式相同并且模式只是基本图形模式的情况,提供了构造查询表单的简短形式(在简短形式中不允许FILTER和复杂的图形模式)。缩写形式中的关键字WHERE是必需的。

使用construct where,以及使用DBpedia SPARQL endpoint已经定义的相同namespaces (这是常规的,例如,rdfs而不是w3,以及dc而不是purl),您的查询将变成:

代码语言:javascript
运行
复制
construct where {
    ?s foaf:name ?a ;
       foaf:surname ?b ;
       foaf:givenName ?c ;
       rdfs:label ?d ;
       dc:description ?e, "Painter"@en ;
       dbpedia-owl:birthPlace ?f ;
       dbpedia-owl:deathPlace ?g ;
       dbpedia-owl:birthDate ?h ;
       dbpedia-owl:deathDate ?i .
}

SPARQL results

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19613074

复制
相关文章

相似问题

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