从RDF查询结果打印/解析JSON对象

3 投票
2 回答
1434 浏览
提问于 2025-04-16 17:14

我正在尝试从Sesame中解析一个SPARQL查询的结果。
我找到了示例代码,下面是相关的部分,我展示了我的结果。

(response, content) = httplib2.Http().request(endpoint, 'POST', urllib.urlencode(params), headers=headers)

print "Response %s" % response.status
results = json.loads(content)
print "\n".join([result['type']['value'] for result in results['results']['bindings']])

{

   "head": {

       "vars": [ "costar", "movie" ]

   },

   "results": {

       "bindings": [

           {

               "costar": { "type": "uri", "value": "http:\/\/rdf.freebase.com\/ns\/en.connie_nielsen" },

               "movie": { "type": "uri", "value": "http:\/\/rdf.freebase.com\/ns\/en.basic_2003" }

           },

           {

               "costar": { "type": "uri", "value": "http:\/\/rdf.freebase.com\/ns\/en.timothy_daly" },

               "movie": { "type": "uri", "value": "http:\/\/rdf.freebase.com\/ns\/en.basic_2003" }

           },


      ]

   }

}     

但是我遇到了这个错误:

Traceback (most recent call last):
  File "C:\Software\rdflib\movieSparqlQuery.py", line 45, in <module>
    print "\n".join([result['type']['value'] for result in results['results']['b
indings']])
KeyError: 'type'
Press any key to continue . . .

我该如何修改“print”语句呢?

我想看到的是像演员和电影名称在同一行显示的结果:

http://rdf.freebase.com/ns/en.connie_nielsen  http://rdf.freebase.com/ns/en.basic_2003

之后,我会去掉命名空间。

谢谢!

2 个回答

0

看看这个SPARQLWrapper的示例代码:

for result in results["results"]["bindings"]:
    print(result["label"]["value"])
2

你收到的错误提示说明 result 这个字典里没有键 'type'。如果你仔细检查一下,results['results']['bindings'] 中的每个元素都是一个字典,里面有两个键:'costar''movie',所以你的 result 变量实际上是一个包含这两个键的字典。

result['costar']result['movie'] 这两个值也是字典,它们各自有两个键:'type''value'。你真正想要的是构建一个字符串,这个字符串包含 result['costar']['value']result['movie']['value'],它们之间用空格隔开。对于单个 result,你可以这样实现:

" ".join(result[var]['value'] for var in results['head']['vars'])

现在,如果你想打印一个包含所有演员和电影的字符串,并且它们之间用换行符分隔,你只需要修改你的打印语句为:

print "\n".join([" ".join(result[var]['value'] for var in results['head']['vars']) for result in results['results']['bindings']])

撰写回答