2011-05-08 101 views
3

我想解析來自芝麻SPARQL查詢的結果。 我找到示例代碼,下面的相關部分,我在下面顯示我的結果。從RDF查詢結果打印/解析JSON對象

(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 . . . 

我怎樣才能改變 「打印」 聲明?

我希望看到的是類似的配角和電影的名字在同一行:

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

後來,我會脫掉的命名空間。

謝謝!

回答

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語句

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

謝謝,完美。我仍然必須完成Python中的JSON;更習慣於XML和其他語言。 – NealWalters 2011-05-10 01:20:10

0

看看換行分隔的所有搭檔和電影的字符串以SPARQLWrapper的示例代碼:

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