Uso de rdflib de Python: ¿cómo incluir literales en consultas de sparql?
Puedo incluir URI y variables en mis consultas, pero no puedo incluir literales en mis consultas.
Aquí, tengo un código que lee con éxito un archivo RDF, encuentra todos los triples RDF con skos: prefLabels, los cuenta y luego identifica un par de específicos de un conjunto de palabras clave:
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 era de esperar, este código se imprime:
2299
Jackknifing
Technology-mapping
ya que Jackknifing y Technology-mapping son prefLabels en el archivo.
Lo que realmente quiero hacer es construir y ejecutar una consulta Sparql para buscar cada palabra clave a su vez. Pero aquí es donde me desprendo, porque no puedo poner una cadena en la consulta. He intentado esto, por ejemplo:
o = rdflib.Literal(u'Jackknifing')
qres = graph.query(q, initBindings = {'p' : p, 'o' : o})
pero qres esta vacio También he intentado poner un literal explícitamente en la consulta, por ejemplo,
q = sparql.prepareQuery('SELECT ?s ?p WHERE { ?s ?p "Technology-mapping" .}')
qres = graph.query(q, initBindings = {'p' : p})
pero eso también devuelve un resultado vacío.
¿Cómo se incluyen los literales en una consulta?