我正在尝试使用以下SPARQL查询来查找法国的Rhône部门。
SELECT * WHERE {
?x rdfs:label "Rhone"@en.
?x rdf:type dbpedia-owl:Place.
?x dbpedia-owl:abstract ?abstract.
FILTER (LANGMATCHES(LANG(?abstract), 'en'))
}
以下是DBPEDIA资源:http://dbpedia.org/page/Rh%C3%B4ne_(department)
问题在于它不断寻找罗纳河,而不是部门(或州)。如果我将rdf:type更改为PopulatedPlace或Settlement,则搜索找不到任何内容。
我可以使用'*'或'?'用于扩大搜索字符串的字符,例如:
'*罗纳*'
如:
SELECT * WHERE {
?x rdfs:label "*Rhone*"@en.
?x rdf:type dbpedia-owl:Settlement.
?x dbpedia-owl:abstract ?abstract.
FILTER (LANGMATCHES(LANG(?abstract), 'en'))
}
其次,我认为在一个查询中使用多个过滤器是可以的,例如:
SELECT * WHERE {
?x rdfs:label "Rhone"@en.
?x rdf:type dbpedia-owl:Place.
?x rdf:type dbpedia-owl:PopulatedPlace.
?x rdf:type dbpedia-owl:Settlement.
?x dbpedia-owl:abstract ?abstract.
FILTER (LANGMATCHES(LANG(?abstract), 'en'))
}
答案 0 :(得分:4)
是的,您可以使用通配符创建搜索字符串 - 排序。您可以FILTER
字符串将正则表达式与FILTER (regex(?label, "Rhone"))
匹配,该字符串匹配内容中任意位置字符串“Rhone”的字符串。此FILTER
可能会使查询执行速度变慢。
但是,这不会返回您想要的资源,因为该部门的标签是“Rhône”。
任何字符的通配符都是.
(句点)。因此,如果您不确定“Rhône”的拼写并希望它出现在标签的任何位置,您可以使用
SELECT * WHERE {
?x rdf:type dbpedia-owl:Place.
?x dbpedia-owl:abstract ?abstract.
?x rdfs:label ?label.
FILTER (regex(?label, "Rh.ne") && LANGMATCHES(LANG(?abstract), 'en'))
}
由于正则表达式,完成此查询需要很长时间。我刚刚尝试了这个查询,它超时了。
第三个查询有效,但只会匹配dbpedia-owl:Place
和dbpedia-owl:PopulatedPlace
s和dbpedia-owl:Settlement
s(同时)的资源。罗纳全都是三个
如果您需要dbpedia-owl:Place
或dbpedia-owl:PopulatedPlace
或dbpedia-owl:Settlement
,请使用:
SELECT DISTINCT * WHERE {
{
?x rdf:type dbpedia-owl:Place.
?x rdfs:label ?label.
?x dbpedia-owl:abstract ?abstract.
FILTER (regex(?label, "Rhône") && LANGMATCHES(LANG(?abstract), 'en'))
} UNION {
?x rdf:type dbpedia-owl:Settlement.
?x rdfs:label ?label.
?x dbpedia-owl:abstract ?abstract.
FILTER (regex(?label, "Rhône") && LANGMATCHES(LANG(?abstract), 'en'))
} UNION {
?x rdf:type dbpedia-owl:PopulatedPlace.
?x rdfs:label ?label.
?x dbpedia-owl:abstract ?abstract.
FILTER (regex(?label, "Rhône") && LANGMATCHES(LANG(?abstract), 'en'))
}
}