我一直在使用RDFLib来解析数据并将其插入到三重存储中。我遇到的一个常见问题是,当从关联数据存储库中解析时,没有包含URL的尖括号。
要上传数据,我必须手动添加<
和>
并使用URIRef
重新创建网址。
我的做法有问题吗?有没有办法解析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))
答案 0 :(得分:4)
我认为将您的查询与您的更新直接结合起来可能会更好,我认为您可以毫不费力地完成。我认为你不能再使用 describe ,因为它没有指定结果,但我认为你可以这样做:
insert {
?a ?b dbr:Berlin .
dbr:Berlin ?c ?d
}
where {
service <http://dbpedia.org/sparql> {
?a ?b dbr:Berlin .
dbr:Berlin ?c ?d .
}
}
但是,如果您确实需要构建一些查询并从其他来源向其中注入值,那么就应该使用准备好的查询。 RDFlib supports prepared queries,以便您可以执行以下操作(例如文档中的示例):
initBindings kwarg可用于传入初始的dict 绑定:
q = prepareQuery( 'SELECT ?s WHERE { ?person foaf:knows ?s .}', initNs = { "foaf": FOAF }) g = rdflib.Graph() g.load("foaf.rdf") tim = rdflib.URIRef("http://www.w3.org/People/Berners-Lee/card#i") for row in g.query(q, initBindings={'person': tim}): print row
您可以执行类似的操作,并将您的查询设为:
INSERT DATA { ?s ?p ?o }
并传递一个initBindings参数来填充?s?p?o值。