Dia*_*tal 5 python sparql rdflib
我可以在查询中包含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
Run Code Online (Sandbox Code Playgroud)
如预期的那样,此代码将输出:
2299
Jackknifing
Technology-mapping
Run Code Online (Sandbox Code Playgroud)
因为Jackknifing和Technology-mapping是文件中的prefLabel。
我真正想做的是构造并执行一个Sparql查询,依次查询每个关键字。但这是我无法解决的地方,因为我无法在查询中放入字符串。我已经试过了,例如:
o = rdflib.Literal(u'Jackknifing')
qres = graph.query(q, initBindings = {'p' : p, 'o' : o})
Run Code Online (Sandbox Code Playgroud)
但qres为空。我也尝试过将文字明确地放入查询中,例如
q = sparql.prepareQuery('SELECT ?s ?p WHERE { ?s ?p "Technology-mapping" .}')
qres = graph.query(q, initBindings = {'p' : p})
Run Code Online (Sandbox Code Playgroud)
但这也会返回空结果。
查询中如何包含文字?
如果数据中的文字具有数据类型,或者是带有语言标签的字符串,那么注入到查询中的纯文字(即没有数据类型或语言标签的文字)将不匹配。
文字上的 RDFLib文档显示了使用数据类型创建文字的方法,但没有使用语言标签创建文字的示例。但是,文档还附有源代码,并且's的签名Literal__new__是:
static __new__(lexical_or_value, lang=None, datatype=None, normalize=None)
Run Code Online (Sandbox Code Playgroud)
由于数据中的文字具有语言标记 ( 'en'),因此您应该将文字创建为
o = rdflib.Literal(u'Jackkifing',lang='en')
Run Code Online (Sandbox Code Playgroud)
以便语言标签与文字相关联。
| 归档时间: |
|
| 查看次数: |
1411 次 |
| 最近记录: |