Этот вопрос относится к What URI to use for a Sesame repository while executing a SPARQL ADD query.Как вставить все троек из графика RDFlib в другой репозиторий без повторения каждой тройки?
Я пытаюсь ВСТАВИТЬ все троек из хранилища кунжута в другой (Dydra). Существует несколько способов сделать это, например, с помощью предложения SERVICE или графического интерфейса Dydra. Однако Dydra ограничивает использование SERVICE, и я хочу, чтобы был эффективный способ вставить данные программно. Это код, я прямо сейчас:
queryStringUpload = 'INSERT {?s ?p ?o} WHERE GRAPH %s {?s ?p ?o}' % dataGraph
sparql = SPARQLWrapper(dydraSparqlEndpoint)
sparql.setCredentials(key,key)
sparql.setQuery(queryStringUpload)
sparql.method = 'POST'
sparql.query()
Кодовые приводит к следующей ошибке:
client error: failed to parse after 'GRAPH' at offset 24 on line 1.
INSERT {?s ?p ?o} WHERE GRAPH [a rdfg:Graph;rdflib:storage [a rdflib:Store;rdfs:label 'IOMemory']]. {?s ?p ?o}
.
В принципе, я понимаю, что я неправильно с помощью строки форматирования. Каков правильный способ выполнения запроса?
Один из способов программно сделать это путем итерации через каждую тройку в dataGraph и по отдельности INSERT
их. Я пробовал этот подход. Хотя код работает, не все данные переносятся. Именно по этой причине я ищу способ для массового порта данных.
UPDATE 1
Это код, который я пытался для реализации предложенного ответа:
sesameURL = 'http://my.ip.ad.here:8080/openrdf-sesame/repositories/rep_name/statements'
payloadPOST = {
'url': sesameURL,
# 'account[login]':key,
# 'account[password]':'',
# 'csrfmiddlewaretoken':csrfToken_new,
# 'next':'/',
}
headersPOST = {
'User-Agent': 'python',
'Content-Type': 'application/n-quads',
# 'Referer': dydraLogin,
}
paramsPOST = {
'auth_token': key,
#'url': sesameURL
}
# print payload
try:
q = s.post(dydraUrl,data=payloadPOST, params=paramsPOST, headers=headersPOST)
print "q.text: " + q.text
print "q_status_code: " + str(q.status_code)
except requests.exceptions.RequestException as e:
print e
Это ошибка:
q_status_code: 400
Однако, если я закомментировать «URL ', я получаю это:
q_status_code: 201
Любые идеи о том, как решить, будут очень полезны.
UPDATE 2
Теперь, независимо от того, является ли 'URL' под headersPOST или paramsPOST, я получаю следующее в качестве вывода:
q_status_code: 201
Однако данные, которые я хочу, чтобы отправлять не получить POSTed. Как мне нужно поступать по-другому?
Вы не указали, какова фактическая величина вашего параметра «url». –
Добавлено значение. Я проверил URL. При вводе в браузер он возвращает файл .rdf со всеми операторами в репозитории. – kurious
Это выглядит правильно. HTTP 201 - это нормальный ответ, который я ожидаю по запросу POST, поэтому Dydra не генерирует ошибку. Я не уверен, что происходит с этой точки зрения. Вы могли бы посмотреть на Sesame Server, чтобы проверить, не заметили ли вы что-нибудь подозрительное, но кроме этого я думаю, вам нужно будет связаться с командой Dydra. –