Правильный способ записи данных JSON, возвращаемых из запроса SPARQL в Python

Я использую python3 для выполнения запросов SPARQL. Мне нужно прочитать базу данных Virtuoso и вывести триплеты. Некоторые данные в триплетах содержат специальные символы, такие как перевод строки и тому подобное.

Во всяком случае, я могу получить данные следующим образом:

queryString = "some query"
sparql.setQuery(queryString)
sparql.setReturnFormat(JSON)
try:
    jsonData = sparql.query()
    for result in jsonData:
        print('Result: ***')
        f.write(str(result) + '\n')
except:
    print("Oops:", sys.exc_info()[0], file=sys.stderr)

Когда я это делаю, я получаю следующий вывод в файле:

b'{\n'
b'  "head" : {\n'
b'    "vars" : [\n'
b'      "subject",\n'
b'      "predicate",\n'
b'      "object"\n'
b'    ]\n'
b'  },\n'
b'  "results" : {\n'
b'    "bindings" : [\n'
b'      {\n'
b'        "predicate" : {\n'
b'          "type" : "uri",\n'
b'          "value" : "http://www.w3.org/1999/02/22-rdf-syntax-ns#type"\n'
b'        },\n'
b'        "subject" : {\n'
b'          "type" : "uri",\n'
b'          "value" : "http://www.ontologyrepository.com/CommonCoreOntologies/delimits"\n'
b'        },\n'
b'        "object" : {\n'
b'          "type" : "uri",\n'
b'          "value" : "http://www.w3.org/2002/07/owl#InverseFunctionalProperty"\n'
b'        }\n'
b'      },\n'

и так далее. Я не уверен, что делает префикс b в этих строках. Во всяком случае, у меня проблемы с чтением этого с библиотеками JSON. Поэтому я бы предпочел написать его в формате JSON.

Я хотел бы заменить цикл for простой вещью, например

json.dump(jsonData, f)

or

json.dumps(jsonData, f)

Когда я это делаю, я получаю сообщение об ошибке Oops: <class 'TypeError'>. Я заметил, что тип jsonData равен <class 'SPARQLWrapper.Wrapper.QueryResult'>.

Запрос SPARQL не возвращает JSON? Есть ли какое-то другое преобразование, которое я должен сделать?


person elbillaf    schedule 23.07.2018    source источник
comment
Я предполагаю, что вы используете какую-то библиотеку Python, а не строгий Python. Конкретные сведения о версии (Python, эта библиотека, целевой Virtuoso) могут иметь значение. По какой-то причине каждая строка выходного файла оборачивается b' ' (т. е. это не просто префикс b), а переводы строк в JSON заменяются на \n — что я не могу сразу объяснить, но кажется, что очистка должна быть довольно легко с любым количеством инструментов, если мы не можем понять, как предотвратить это.   -  person TallTed    schedule 23.07.2018
comment
Вы можете попробовать использовать define output:format "fmt" прагму вывода от Virtuoso, чтобы запустить запрос строка, указывающая JSON вместо Python sparql.setReturnFormat(JSON)   -  person TallTed    schedule 23.07.2018
comment
Моя компьютерная система отключается, возможно, до среды, но я сначала попробую формат вывода.   -  person elbillaf    schedule 23.07.2018


Ответы (1)


b перед вашей строкой означает, что ваша строка является не строкой, а строкой байтов, и ваши байты интерпретируются как символы для печати. Дополнительную информацию см. здесь

В следующий раз будет проще, если вы расскажете нам больше о своей проблеме. Какую библиотеку вы используете, какая версия, пример запроса и т. д.

В вашем случае я предполагаю, что вы используете библиотеку SPARQLWrapper. Вы очень близки к решению своей проблемы, вам нужно только преобразовать ваш QueryResult. Просто вызовите jsonData = sparql.query().convert() вместо jsonData = sparql.query(), и вы получите словарь, который можно записать в файл json с помощью json.dump.

person Bierbarbar    schedule 23.07.2018