2011-05-08 5 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']을 포함하는 문자열을 만드는 것입니다. 그냥 봐

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

감사합니다. 아직 파이썬에서 JSON을 사용해야합니다. XML 및 다른 언어에 익숙합니다. – NealWalters

0

에 인쇄 문을 수정해야 할 줄 바꿈으로 구분 된 모든 costars과 영화를 포함하는 문자열을 인쇄하려면 지금

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

: result 하나는 당신이 이것을 달성 할 수 주어진 SPARQLWrapper의 샘플 코드 :

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