python - 使用 Python rdflib : how to include literals in sparql queries?

标签 python sparql rdflib

我可以在查询中包含 URI 和变量,但我不能 在我的查询中包含文字。

在这里,我有一些成功读取 RDF 文件的代码,发现 所有的 RDF 三元组与 skos: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 和 Technology-mapping 是文件中的 prefLabels。

我真正想做的是构建并执行一个 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})

但这也会返回一个空结果。

如何在查询中包含文字?

最佳答案

如果数据中的文字具有数据类型,或者是带有语言标签的字符串,那么注入(inject)到查询中的普通文字(即没有数据类型或语言标签的文字)将不匹配。

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')

使语言标签与文字相关联。

关于python - 使用 Python rdflib : how to include literals in sparql queries?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17144088/

相关文章:

Python按(一个列表的)值对两个对应列表进行排序

python - 随机数字列表并将它们相加

java - 如何使用 Jena 编写 SPARQL 查询以在所有类的所有对象中查找文字匹配?

python - 长 SELECT 查询的 SPARQLWrapper QueryBadFormed 错误

python - 使用 Python 3.6、Apache 2.4 和 Django 1.11 在 Ubuntu 上安装 mod_wsgi

sparql - 我想在本地设置 dbpedia 数据集

graph - 对两个图运行 sparql 查询?

python - 使用 RDFlib 获取 Literal 对象的 lang 值

python - 从 rdflib 中的 rdf 三元组写入 RDF/XML 文件

python - 谷歌应用引擎中的内存缓存