Sparql запрос вернул значение целое число, не могу отфильтровать его, чтобы получить int - PullRequest
0 голосов
/ 14 апреля 2020

Хотя запрос возвращает названия стран без фильтрации населения, в то время как я использую фильтр, чтобы взять целое число, ничего не возвращается.

PREFIX  dbo:  <http://dbpedia.org/ontology/>

SELECT DISTINCT  str(?country_label) ?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:integer ) 

 }

1 Ответ

0 голосов
/ 14 апреля 2020

Я не уверен, что вы пытаетесь достичь с помощью этого условия 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" )
 }
...