【发布时间】:2016-02-09 03:57:07
【问题描述】:
我一直在使用 RDFLib 来解析数据并将其插入到三元存储中。我遇到的一个常见问题是在从链接数据存储库解析时缺少包含 URL 的尖括号。
要上传数据,我必须手动添加 < 和 > 并使用 URIRef 重新创建 URL。
我的方法有问题吗?有没有办法解析 URL 和尖括号?
代码如下:
#Querying the triplestore to retrieve all results
dbpediaSparqlEndpoint = 'http://dbpedia.org/sparql/'
sparql = SPARQLWrapper(dbpediaSparqlEndpoint)
dbpedia_query = 'PREFIX : <http://dbpedia.org/resource/> DESCRIBE :Benin'
dataGraph = Graph()
sparql.setQuery(dbpedia_query)
sparql.method = 'GET'
sparql.setReturnFormat(JSON)
output = sparql.query().convert()
# print list(output['results']['bindings'])
print type(output['results']['bindings'])
#Iterating through the output and adding the data to dataGraph
#First value is that of the index of the list
for index, value in enumerate(output['results']['bindings']):
#The encoding is necessary to parse non-English characters
test = value['s']['value'].encode('utf-8')
subj_raw = '<' + test + '>'
subj_refined = URIRef(subj_raw)
pred_raw = '<' + value['p']['value'].encode('utf-8') + '>'
pred_refined = URIRef(pred_raw)
if 'http' in value['o']['value']:
obj_raw = '<' + value['o']['value'].encode('utf-8') + '>'
obj_refined = URIRef(obj_raw)
else:
obj_raw = '"' + value['o']['value'].encode('utf-8') + '"'
obj_refined = URIRef(obj_raw)
dataGraph.add((subj_refined,pred_refined,obj_refined))
【问题讨论】:
-
目前还不清楚到底是什么问题。我对 RDFLib 不是很熟悉,但是您处理查询结果的代码对我来说似乎是不必要的复杂。一般提示:尖括号实际上并不是 URI 的一部分,这可能是您在处理查询结果时看不到它们的原因。我不确定你为什么认为你需要手动重新标记它们,但你可能在这里让事情变得太难了。
-
我还建议 RDFLib 文档提供了很多关于如何执行查询和处理结果的信息(包括示例)。例如,参见rdflib.readthedocs.org/en/stable/intro_to_sparql.html
-
我已经浏览了你提到的资源。如果我没记错的话,RDF 中的 URL 必须用尖括号括起来。我尝试使用 RDFLib 将不带尖括号的三元组上传到 Sesame。不工作。使用上面的代码添加尖括号后,INSERT 就可以正常工作了。这是我对尖括号感到好奇的主要原因。没有它们,(至少两个)三重存储(Sesame、Dydra)不接受 INSERT 并且不显示任何错误。我会很高兴被证明是错误的并学习一种更简单的方法来实现这一点。
-
@kurious 尖括号不是 URI 引用的一部分,并且“在 RDF 中”不需要它们(但是 RDF 抽象数据模型,所以无论如何这都没有意义)。尖括号用于在 SPARQL 查询中“引用” URI,就像引用字符串需要双引号或单引号一样。听起来您正在根据从其他地方读取的一些结果创建 sparql 更新。如果是这种情况,您可能会发现“插入位置”查询很有帮助(如果适用于您的用例)和准备好的语句(RDFlib 可能支持也可能不支持,我不知道)。
-
是的,我正在尝试使用 sparql 更新。感谢您的演示
标签: python sparql dbpedia linked-data rdflib