使用Python rdflib:如何在SPARQL查询中包含文字?

8

我可以在我的查询中包含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})

但是这也返回了一个空结果。

如何在查询中包含文字?


1
你能展示一下你的数据吗?你的数据中的字面量可能具有数据类型,或者是带有语言标签的字符串吗?如果是这样,并且你正在注入一个未分类的字面量或没有语言标签的字面量,那么事情就不会匹配。如果你能展示你的数据,并展示应用了initBindings的最终SPARQL查询(如果你可以使用RDFLib/RDFLib-SPARQL做到这一点),问题可能会变得非常清晰。 - Joshua Taylor
啊哈 - 是的,文件中有语言标签,但没有数据类型。因此查询要注意。 - Diana Bental
1
啊哈 - 是的,文件中有语言标签,但没有数据类型。查询q = sparql.prepareQuery('SELECT ?s ?p WHERE { ?s ?p "Technology-mapping"@en .}')可以正常工作。所以看起来问题就在这里了,非常感谢。现在我需要弄清楚如何向文字添加语言标签。我不知道如何打印已构建的查询 - 如果我弄清楚了,我会更新的。 - Diana Bental
1个回答

5
如果您的数据中的文字有数据类型,或者是带有语言标记的字符串,那么插入查询的纯文字,即没有数据类型或语言标记的文字,将无法匹配。
RDFLib的文档关于Literals的文档展示了创建带有数据类型的literals的方法,但没有创建带有语言标记的literal的示例。然而,文档还附有源代码,Literal__new__签名如下:
static __new__(lexical_or_value, lang=None, datatype=None, normalize=None)

由于您的数据中的文字带有语言标签('en'),因此您应该将文字创建为

o = rdflib.Literal(u'Jackkifing',lang='en')

以便将语言标签与文字关联起来。


@DianaBental 很高兴听到你找到了!看了文档后,我发现了一个之前没有的“_source_”链接,并在源代码中找到了“lang”参数。我已经更新了我的答案,包括我们在评论中讨论的信息和“lang”参数。 - Joshua Taylor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接