Я не уверен, что вы пытаетесь достичь с помощью этого условия FILTER, но причина, по которой ваш запрос возвращает нулевые результаты, состоит в том, что ни одно из значений совокупности не имеет тип данных xsd:integer
.
Кроме того, в вашем запросе есть еще что-то неправильное: использование функции типа str()
в предложении SELECT без привязки результата этой функции к новой переменной (использование as ?new_var
) недопустимо. SPARQL , Я знаю, что конечная точка DBPedia это позволяет, но вы должны знать, что она может выдать вам ошибки, если вы когда-нибудь попробуете это на другом движке SPARQL.
Если вы выполняете запрос без фильтра типа данных:
PREFIX dbo: <http://dbpedia.org/ontology/>
SELECT DISTINCT (str(?country_label) as ?cl) ?population
WHERE
{
?country dct:subject <http://dbpedia.org/resource/Category:Countries_in_Europe>.
?country rdfs:label ?country_label.
?country dbo:populationTotal ?population.
FILTER langMatches( lang(?country_label), "EN" )
}
Вы увидите, что результат содержит только значения типа данных xsd:nonNegativeInteger
. Это другой тип данных, и хотя, конечно, верно, что каждое неотрицательное целое число также является целым числом, вывод типа данных этой формы не является чем-то, что поддерживает большинство конечных точек SPARQL.
Также: в исходном условии фильтра по населению круглые скобки помещены неправильно. Если вы измените свой запрос следующим образом:
PREFIX dbo: <http://dbpedia.org/ontology/>
SELECT DISTINCT (str(?country_label) as ?cl) ?population
WHERE
{
?country dct:subject <http://dbpedia.org/resource/Category:Countries_in_Europe>.
?country rdfs:label ?country_label.
?country dbo:populationTotal ?population.
FILTER langMatches( lang(?country_label), "EN" )
FILTER ( datatype(?population) = xsd:nonNegativeInteger )
}
Вы получите все значения этого типа данных, хотя, как уже было сказано, я не уверен, чего вы добиваетесь, поскольку это Насколько я могу судить, тот же результат, который вы получили бы без проверки типа данных.
Если ваша цель - вернуть номер, но представить его как xsd:integer
вместо xsd:nonNegativeInteger
, вы, конечно, можете разыграть его:
PREFIX dbo: <http://dbpedia.org/ontology/>
SELECT DISTINCT (str(?country_label) as ?cl) (xsd:integer(?population) as ?pop)
WHERE
{
?country dct:subject <http://dbpedia.org/resource/Category:Countries_in_Europe>.
?country rdfs:label ?country_label.
?country dbo:populationTotal ?population.
FILTER langMatches( lang(?country_label), "EN" )
}