Как создать параметризованный запрос в SPARQLWrapper на Python

Я использую следующий запрос sparql с использованием SPARQLWrapper следующим образом.

from SPARQLWrapper import SPARQLWrapper, JSON
sparql = SPARQLWrapper("http://live.dbpedia.org/sparql")
sparql.setReturnFormat(JSON)
sparql.setQuery(" ASK { dbc:Meteorological_concepts skos:broader{1,7} dbc:Medicine } ")
results = sparql.query().convert()
print(results['boolean'])

Этот запрос возвращает False, что является правильным выводом.

Я пытаюсь изменить вышеупомянутый код, преобразовав запрос в параметризованный запрос (используя переменную для category name следующим образом).

from SPARQLWrapper import SPARQLWrapper, JSON
sparql = SPARQLWrapper("http://live.dbpedia.org/sparql")
sparql.setReturnFormat(JSON)

my_variable = 'dbc:Meteorological_concepts'

sparql.setQuery(" ASK { ?my_variable skos:broader{1,7} dbc:Medicine } ")
results = sparql.query().convert()
print(results['boolean'])

После внесения этой модификации код теперь возвращает True, что неверно. Просто интересно, где я сделал неправильный код.

При необходимости я с радостью предоставлю более подробную информацию.


person EmJ    schedule 22.02.2019    source источник
comment
comment
@StanislavKralin Не могли бы вы сообщить мне, знаете ли вы ответ на этот вопрос: stackoverflow.com/questions/55206966/   -  person EmJ    schedule 17.03.2019


Ответы (3)


Поскольку вы хотите ввести значение переменной, оно должно быть вне строки. И вы не делаете этого с ?, вы делаете это с помощью конкатенации начала строки + your_variable + конца строки.

from SPARQLWrapper import SPARQLWrapper, JSON
sparql = SPARQLWrapper("http://live.dbpedia.org/sparql")
sparql.setReturnFormat(JSON)

my_variable = 'dbc:Meteorological_concepts'

sparql.setQuery(" ASK { "+my_variable+" skos:broader{1,7} dbc:Medicine } ")
results = sparql.query().convert()
print(results['boolean'])
person luis.galdo    schedule 22.02.2019

Если вы используете Python 3.6+, вы можете использовать f-строки:

f" ASK {{ {my_variable}  skos:broader{{1,7}} dbc:Medicine }} "

будет

' ASK { dbc:Meteorological_concepts  skos:broader{1,7} dbc:Medicine } '

для более старых версий вы можете использовать format:

" ASK {{ {}  skos:broader{{1,7}} dbc:Medicine }} ".format(my_variable)

дающий тот же результат.

person Cleb    schedule 22.02.2019

Этот код должен решить вашу проблему, проверьте это.

from SPARQLWrapper import SPARQLWrapper, JSON
sparql = SPARQLWrapper("http://dbpedia.org/sparql")
sparql.setQuery("\n"
                    "    PREFIX dbpedia: <http://dbpedia.org/resource/>"
                    " PREFIX dbo: <http://dbpedia.org/ontology/>"
                    "PREFIX dbp: <http://dbpedia.org/property/>\n"
                    "PREFIX foaf: <http://xmlns.com/foaf/0.1/>\n"
                    "PREFIX rdfs:   <http://www.w3.org/2000/01/rdf-schema#>\n"
                    "PREFIX dct:    <http://purl.org/dc/terms/>\n"
                    "SELECT DISTINCT ?name  ?birthDate   WHERE {\n"
                   "dbpedia:"+d+" foaf:name ?name\n"
                    "}\n"
                    "                   ")
person Saad Khan    schedule 24.02.2019