【问题标题】:Working with the absence of <> enclosing URLs while using RDFLib在使用 RDFLib 时处理缺少 <> 封闭 URL
【发布时间】:2016-02-09 03:57:07
【问题描述】:

我一直在使用 RDFLib 来解析数据并将其插入到三元存储中。我遇到的一个常见问题是在从链接数据存储库解析时缺少包含 URL 的尖括号。

要上传数据,我必须手动添加 &lt;&gt; 并使用 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


【解决方案1】:

我认为直接将您的查询和更新结合起来可能会更好,我认为您可以轻松做到这一点。我认为您将无法再使用 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 可用于传入初始字典 绑定:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-27
    • 1970-01-01
    • 2016-11-20
    • 1970-01-01
    • 2017-01-20
    • 2016-03-08
    相关资源
    最近更新 更多