Usando o Python rdflib: como incluir literais em consultas sparql?

Posso incluir URIs e variáveis ​​nas minhas consultas, mas não posso incluir literais nas minhas consultas.

Aqui, eu tenho um código que lê com sucesso um arquivo RDF, encontra todos os triplos de RDF com skos: prefLabels, conta-os e, em seguida, identifica alguns específicos de um conjunto de palavras-chave:

import rdflib.plugins.sparql as sparql
import rdflib
import rdflib.graph as g

graph = g.Graph()
# Read the RDF file
graph.parse(
   'h:\......SKOSTaxonomy.rdf',
   format='xml')

# Build and execute the query
q = sparql.prepareQuery('SELECT ?s ?p ?o WHERE { ?s ?p ?o .}')
p = rdflib.URIRef("http://www.w3.org/2004/02/skos/core#prefLabel")
qres = graph.query(q, initBindings = {'p' : p})

print len(qres)

# Look for keywords among the results
keywords = set([u'Jackknifing', 'Technology-mapping', 'Something random'])

for (subj, pred, obj) in qres:
    if obj.value in keywords:
        print obj.value

Como esperado, esse código imprime:

2299
Jackknifing
Technology-mapping

desde Jackknifing e Technology-mapping são prefLabels no arquivo.

O que eu realmente quero fazer é construir e executar uma consulta Sparql para procurar cada palavra-chave por vez. Mas é aí que eu me solto, porque não posso colocar uma string na consulta. Eu tentei isso, por exemplo:

o = rdflib.Literal(u'Jackknifing')
qres = graph.query(q, initBindings = {'p' : p, 'o' : o})

mas qres está vazio. Eu também tentei colocar um literal explicitamente na consulta, por exemplo

q = sparql.prepareQuery('SELECT ?s ?p WHERE { ?s ?p "Technology-mapping" .}')
qres = graph.query(q, initBindings = {'p' : p})

mas isso também retorna um resultado vazio.

Como os literais são incluídos em uma consulta?

questionAnswers(1)

yourAnswerToTheQuestion