Użycie Pythona rdflib: jak włączyć literały w zapytaniach sparql?
W zapytaniach mogę zawierać identyfikatory URI i zmienne, ale nie mogę dołączać literałów do zapytań.
Mam tutaj kod, który z powodzeniem odczytuje plik RDF, znajduje wszystkie trójki RDF za pomocą skos: prefLabels, zlicza je, a następnie identyfikuje kilka konkretnych z zestawu słów kluczowych:
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
Zgodnie z oczekiwaniami kod ten drukuje:
2299
Jackknifing
Technology-mapping
ponieważ mapowanie Jackknifing i Technology to prefabrykaty w pliku.
To, co naprawdę chcę zrobić, to skonstruować i wykonać zapytanie Sparql, aby po kolei szukać każdego słowa kluczowego. Ale w tym miejscu dochodzę do wniosku, że nie mogę umieścić ciągu w zapytaniu. Próbowałem tego, na przykład:
o = rdflib.Literal(u'Jackknifing')
qres = graph.query(q, initBindings = {'p' : p, 'o' : o})
ale qres jest pusty. Próbowałem również umieścić dosłownie w zapytaniu, np.
q = sparql.prepareQuery('SELECT ?s ?p WHERE { ?s ?p "Technology-mapping" .}')
qres = graph.query(q, initBindings = {'p' : p})
ale to również zwraca pusty wynik.
W jaki sposób zapytania są uwzględniane w zapytaniu?