我可以在我的查询中包含URI和变量,但是不能包含字面量。
这里有一些代码可以成功读取一个RDF文件,找到所有具有skos:prefLabels的RDF三元组,计数,然后从一组关键字中识别出一些特定的三元组:
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
正如预期的那样,这段代码会输出:
2299
Jackknifing
Technology-mapping
由于Jackknifing和Technology-mapping在文件中是主标签,因此我希望能构建和执行Sparql查询,以便逐个查找每个关键字。但这就是我遇到困难的地方,因为我无法将字符串放入查询中。例如,我尝试过以下操作:
o = rdflib.Literal(u'Jackknifing')
qres = graph.query(q, initBindings = {'p' : p, 'o' : o})
但是qres为空。我也尝试过将文字直接放入查询中,例如:
q = sparql.prepareQuery('SELECT ?s ?p WHERE { ?s ?p "Technology-mapping" .}')
qres = graph.query(q, initBindings = {'p' : p})
但是这也返回了一个空结果。
如何在查询中包含文字?
initBindings
的最终SPARQL查询(如果你可以使用RDFLib/RDFLib-SPARQL做到这一点),问题可能会变得非常清晰。 - Joshua Taylor