Печать / анализ JSON-объекта из результата запроса RDF - PullRequest
3 голосов
/ 09 мая 2011

Я пытаюсь проанализировать результат запроса SPARQL от Sesame.Я нашел пример кода, соответствующую часть ниже, и я показываю свой результат ниже.

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

2 голосов
/ 09 мая 2011

Полученная вами ошибка указывает на то, что в словаре 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']])
0 голосов
/ 22 мая 2012

Посмотрите на пример кода SPARQLWrapper :

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