Запрос Sparql параметризован конкатенацией строк

Я хотел бы написать запрос Sparql для получения информации о конкретных статьях в Википедии. Я новичок в sparql и мог бы использовать некоторые идеи об использовании zlist в качестве параметра и передаче ему списка статей, как .format сделал бы в python.

SELECT DISTINCT ?lemma ?item 
WHERE {
  ?sitelink schema:about ?item;
    schema:isPartOf <https://de.wikipedia.org/>;
    schema:name ?lemma.
  FILTER (?lemma IN (zlist@de))
}

Например, я безуспешно пробовал:

from SPARQLWrapper import SPARQLWrapper, JSON
import pandas as pd
sparql = SPARQLWrapper("https://query.wikidata.org/sparql")
sparql.setReturnFormat(JSON)
mylist = "Prato della Valle"

sparql.setQuery("""
SELECT DISTINCT ?item ?lemma ?instance_of 
WHERE {
  ?item wdt:P31 ?instance_of.    
  ?sitelink schema:about ?item;
    schema:isPartOf <https://de.wikipedia.org/>;
    schema:name ?lemma.
    FILTER (?lemma IN ( { %s }@de))
}                  
"""%mylist) 

results = sparql.query().convert()
results_df = pd.io.json.json_normalize(results['results']['bindings'])
print(results_df)

Однако я могу заставить их работать:

from SPARQLWrapper import SPARQLWrapper, JSON
import pandas as pd

mylist = ["word2vec"]
mystring = '"' + '" "'.join(mylist) + '"'
# mystring = (' '.join('"{0}"'.format(v) for v in mylist) )

sparql = SPARQLWrapper("https://query.wikidata.org/sparql")

sparql.setQuery("""
    SELECT DISTINCT ?item {
    VALUES ?searchTerm { %s }
    SERVICE wikibase:mwapi {
        bd:serviceParam wikibase:api "EntitySearch".
        bd:serviceParam wikibase:endpoint "www.wikidata.org".
        bd:serviceParam mwapi:search ?searchTerm.
        bd:serviceParam mwapi:language "en".
        ?item wikibase:apiOutputItem mwapi:item.
        ?num wikibase:apiOrdinal true.
    }
    ?item (wdt:P279|wdt:P31) ?type
    }
    ORDER BY ?searchTerm ?num                    
""" % mystring ) 
sparql.setReturnFormat(JSON)
results = sparql.query().convert()
results_df = pd.io.json.json_normalize(results['results']['bindings'])
print(results_df)
from SPARQLWrapper import SPARQLWrapper, JSON
sparql = SPARQLWrapper("http://live.dbpedia.org/sparql")
sparql.setReturnFormat(JSON)

my_variable = 'dbc:Meteorological_concepts'

sparql.setQuery(" ASK {{ {}  skos:broader{{1,7}} dbc:Medicine }} ".format(my_variable))
results = sparql.query().convert()
print(results['boolean'])
from SPARQLWrapper import SPARQLWrapper, JSON
from string import Template

sparql = SPARQLWrapper("http://dbpedia.org/sparql")

query = Template("""
    PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
    SELECT ?label
    WHERE { $uri rdfs:label ?label }
""")

sparql.setQuery(query.substitute(uri='<http://dbpedia.org/resource/Asturias>'))
sparql.setReturnFormat(JSON)
results = sparql.query().convert()
for result in results["results"]["bindings"]:
    print (result["label"]["value"])

Примечание. Этот ответ о переполнении стека и this и также это и эта и эта проблема Github вместе с этот оказался наиболее полезным.


person rene    schedule 14.01.2020    source источник
comment
Обычно это называется подготовленными запросами или параметризованными запросами. Сам SPARQL не имеет для этого никаких функций - это будет функция в любой программной библиотеке, которую вы используете для создания и выполнения запроса SPARQL.   -  person Jeen Broekstra    schedule 14.01.2020
comment
Спасибо за отзыв, Джин. Я использовал python и sparqlwrapper. Я читал, что sparqlwrapper не поддерживает подготовленные запросы, поэтому я попытался создать параметризованные запросы с использованием rdflib для этого сообщения stackoverflow.com/questions/8422401/, но пока не добился успеха. Интересно, можно ли для этого использовать sparqlwrapper и rdflib?   -  person rene    schedule 19.01.2020
comment
Если это не сработает, вероятно, полученный запрос sparql неверен. Не зная, в чем заключается ошибка, трудно определить, в чем вы ошибаетесь. Совет: распечатайте строку запроса после внедрения списка и проверьте, является ли он синтаксически правильным sparql. У меня есть подозрение, что это может иметь какое-то отношение к языковому тегу @de в вашем запросе.   -  person Jeen Broekstra    schedule 20.01.2020
comment
спасибо за напоминание о чаевых, которое помогло   -  person rene    schedule 21.01.2020


Ответы (1)


В этом случае элементы моего списка должны быть заключены в одинарные кавычки. И {} вокруг переменной в строке FILTER пришлось опустить.

from SPARQLWrapper import SPARQLWrapper, JSON
import pandas as pd
sparql = SPARQLWrapper("https://query.wikidata.org/sparql")
sparql.setReturnFormat(JSON)

preptitles = ['Prato della Valle']
mystring = ','.join('"{0}"@de'.format(w) for w in preptitles) 

sparql.setQuery("""
SELECT DISTINCT ?item ?lemma ?instance_of 
WHERE {
  ?item wdt:P31 ?instance_of.    
  ?sitelink schema:about ?item;
    schema:isPartOf <https://de.wikipedia.org/>;
    schema:name ?lemma.
    FILTER (?lemma IN (%s))
}                  
"""%mylist) 

results = sparql.query().convert()
results_df = pd.io.json.json_normalize(results['results']['bindings'])
print(results_df)
person rene    schedule 21.01.2020