我正在尝试使用SPARQL CONSTRUCT从dbpedia中剥离一组数据 - 我只对一组艺术家感兴趣,我希望Sesame尽可能小的速度。
我认为我可以做的是使用CONSTRUCT来获取给定艺术家的每个谓词。我可以得到第一个CONSTRUCT子句,以确保我得到类型“人”,但这只给了我满足该条款的三元组 - 我想要他们的名字,标签,birthPlaces等。我在下面的查询是试图在第二个CONSTRUCT子句中捕获Monet的名字?如果我说对了,这会给我三倍的
<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
如何让我的查询使用Monet名称的对象作为变量来使用我要插入空引号的地方?这是查询
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
任何帮助真的很感激
麦克
答案 0 :(得分: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
}
答案 1 :(得分: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。
答案 2 :(得分:1)
我看到你已经answered you own question,但我想指出,当construct
查询返回的三元组与{{1}匹配的三元组完全相同时部分,而where
部分不包含任何过于花哨的内容,您可以使用特殊的简写where
:
16.2.4 CONSTRUCT WHERE
为案例提供了CONSTRUCT查询表单的简短表单 模板和模式相同,模式是 只是一个基本的图形模式(没有
construct where
s,没有复杂的图形模式 允许以简短形式)。中需要关键字WHERE 简短形式。
使用FILTER
,并使用namespaces已定义的DBpedia SPARQL endpoint(传统的construct where
而不是rdfs
,以及w3
而非dc
),您的查询将变为:
purl