我必须使用此Sparql查询来检索有关某人的信息,我的问题是将可选构造分解为多个可选构造。
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX dbpprop: <http://dbpedia.org/property/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT DISTINCT ?label ?abstract ?placeOfBirth
?birthPlace ?birthDate ?page ?thumbnail
WHERE {
<http://dbpedia.org/resource/Ismail_Kadare> rdfs:label ?label ;
dbo:abstract ?abstract ;
foaf:page ?page .
OPTIONAL {
<http://dbpedia.org/resource/Ismail_Kadare> dbpprop:placeOfBirth ?placeOfBirth ;
dbpprop:birthPlace ?birthPlace ;
dbo:birthDate ?birthDate ;
dbo:thumbnail ?thumbnail .
}
FILTER (LANG(?label) = 'en')
FILTER (LANG(?abstract) = 'en')
}
LIMIT 1
答案 0 :(得分:3)
模式
<http://dbpedia.org/resource/Ismail_Kadare> dbpprop:placeOfBirth ?placeOfBirth ;
dbpprop:birthPlace ?birthPlace ;
dbo:birthDate ?birthDate ;
dbo:thumbnail ?thumbnail .
是四种三重模式的简写:
<http://dbpedia.org/resource/Ismail_Kadare> dbpprop:placeOfBirth ?placeOfBirth .
<http://dbpedia.org/resource/Ismail_Kadare> dbpprop:birthPlace ?birthPlace .
<http://dbpedia.org/resource/Ismail_Kadare> dbo:birthDate ?birthDate .
<http://dbpedia.org/resource/Ismail_Kadare> dbo:thumbnail ?thumbnail .
而不是OPTIONAL { …first pattern… }
,您只需使用四个可选块,四个三重模式中的每一个都有一个:
optional { <http://dbpedia.org/resource/Ismail_Kadare> dbpprop:placeOfBirth ?placeOfBirth }
optional { <http://dbpedia.org/resource/Ismail_Kadare> dbpprop:birthPlace ?birthPlace }
optional { <http://dbpedia.org/resource/Ismail_Kadare> dbo:birthDate ?birthDate }
optional { <http://dbpedia.org/resource/Ismail_Kadare> dbo:thumbnail ?thumbnail }
语言匹配比字符串匹配要复杂得多,而不是
FILTER (LANG(?label) = 'en')
FILTER (LANG(?abstract) = 'en')
你应该真正使用
filter(langMatches(lang(?label),'en'))
filter(langMatches(lang(?abstract),'en'))
允许您检索使用全部为英语的不同语言标记的结果。
select distinct
和limit 1
不是必需的请注意,select distinct
可确保您的结果中没有任何重复的行。但是,limit 1
意味着您最多只能获得一个结果,因此不会删除任何重复项。
看起来您正在查询DBpedia,因此使用public endpoint定义的相同名称空间前缀可能是值得的,这样您就可以更轻松地复制和粘贴查询并进行实验。这样做(并使用values ?x { dbpedia:Ismail_Kadare }
来避免某些输入,我们最终得到此查询:
select ?label ?abstract ?placeOfBirth ?birthPlace ?birthDate ?page ?thumbnail
where {
values ?x { dbpedia:Ismail_Kadare }
?x rdfs:label ?label ;
dbpedia-owl:abstract ?abstract ;
foaf:page ?page .
optional { ?x dbpprop:placeOfBirth ?placeOfBirth }
optional { ?x dbpprop:birthPlace ?birthPlace }
optional { ?x dbpedia-owl:birthDate ?birthDate }
optional { ?x dbpedia-owl:thumbnail ?thumbnail }
filter langMatches(lang(?label),'en')
filter langMatches(lang(?abstract),'en')
}
limit 1
DBpedia端点不会返回该查询的任何内容,但这是因为http://dbpedia.org/resource/Ismail_Kadare没有foaf:page
属性,而不是因为查询格式错误。我不知道你是否真的对DBpedia运行这个,所以这可能或不重要。