我可以在查询中包含URI和变量,但我不能
在我的查询中包含文字.
发现,我有一些成功读取RDF文件的代码
所有带有skos的RDF三元组:prefLabels,计算它们,然后
从一组关键字中识别出几个特定的:
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和技术映射是文件中的prefLabels.
我真正想要做的是构造和执行Sparql查询
依次查找每个关键字.但这就是我脱离困境的地方,
因为我无法将字符串放入查询中.我试过这个,因为
例:
o = rdflib.Literal(u'Jackknifing')
qres = graph.query(q,initBindings = {'p' : p,'o' : o})
q = sparql.prepareQuery('SELECT ?s ?p WHERE { ?s ?p "Technology-mapping" .}')
qres = graph.query(q,initBindings = {'p' : p})
但这也会返回一个空结果.
最佳答案
如果数据中的文字具有数据类型,或者是具有语言标记的字符串,那么注入查询的普通文字(即没有数据类型或语言标记的文字)将不匹配.
RDFLib docs on Literals显示了使用数据类型创建文字的方法,但没有使用语言标记创建文字的示例.但是,文档也附有源代码
和the signature for Literal
‘s __new__
是:
static __new__(lexical_or_value,lang=None,datatype=None,normalize=None)
由于数据中的文字具有语言标记(‘en’),因此您应该将文字创建为
o = rdflib.Literal(u'Jackkifing',lang='en')