使用<>的缺席使用RDFLib

时间:2016-02-09 03:57:07

标签: python sparql dbpedia linked-data rdflib

我一直在使用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))

1 个答案:

答案 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值。