2

我正在尝试使用 SPARQL CONSTRUCT 从 dbpedia 中删除一组数据-我只对一组艺术家感兴趣,并且我希望 Sesame 尽可能小以提高速度。

我认为我可以做的是使用 CONSTRUCT 来获取给定艺术家的每个谓词。我可以让第一个 CONSTRUCT 子句起作用,以确保我输入“Person”,但这只会让我满足该子句的三倍 - 我想要他们的名字、标签、出生地等。我下面的查询试图在第二个 CONSTRUCT 子句中捕获莫奈的名字?如果我做对了,这会给我三倍

<http://dbpedia.org/resource/Claude_Monet>  
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type>   
<http://xmlns.com/foaf/0.1/Person>

和这样的三重奏

<http://dbpedia.org/resource/Claude_Monet>  
<http://xmlns.com/foaf/0.1/name>
"Claude Monet"@en

如何让我的查询使用莫奈名字的对象作为变量,以便在我插入空引号的地方使用?这是查询

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

任何帮助都非常感谢

麦克风

4

3 回答 3

2

我们来了,就是这样。一旦我弄清楚了 CONSTRUCT 和 WHERE 之间的变量绑定,它实际上就很简单了。

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

自我注意 - 必须停止像 RDBMS 那样思考。

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
}
于 2013-10-27T21:21:39.287 回答
1

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

DESCRIBE <http://dbpedia.org/resource/Claude_Monet>

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

DESCRIBE ?x WHERE { ?x purl:description "Painter"@en }

将为您提供所有?x匹配的子图purl:description

当然,这使您对提取的确切三元组的控制较少,但从好的方面来说,它更短,并且如果特定资源不存在某些三元组模式也不需要调整(例如,您的 CONSTRUCT 查询将不匹配,如果特定画家在您的 WHERE 子句中没有一个或任何其他属性的任何原因deathDate) 。foaf:surname

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

于 2013-10-28T03:55:43.217 回答
1

我看到你已经回答了你自己的问题,但我想指出的是,当construct查询返回的三元组与该部分匹配的三元组完全相同where,并且该 where部分不包含任何太花哨的东西时,你可以使用特殊的速记construct where

16.2.4 在哪里构建

CONSTRUCT 查询表单的简写形式是针对模板和模式相同且模式只是基本图形模式FILTER的情况(简写形式中不允许使用 s 和复杂图形模式)。短格式中需要关键字 WHERE。

使用construct where, 以及使用DBpedia SPARQL 端点已经定义的相同命名空间(这是传统的,例如,而不是,而不是),您的查询变为:rdfsw3dcpurl

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 结果

于 2013-10-28T18:10:04.437 回答