2015-12-24 10 views
0

Этот вопрос относится к 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. Как мне нужно поступать по-другому?

+0

Вы не указали, какова фактическая величина вашего параметра «url». –

+0

Добавлено значение. Я проверил URL. При вводе в браузер он возвращает файл .rdf со всеми операторами в репозитории. – kurious

+0

Это выглядит правильно. HTTP 201 - это нормальный ответ, который я ожидаю по запросу POST, поэтому Dydra не генерирует ошибку. Я не уверен, что происходит с этой точки зрения. Вы могли бы посмотреть на Sesame Server, чтобы проверить, не заметили ли вы что-нибудь подозрительное, но кроме этого я думаю, вам нужно будет связаться с командой Dydra. –

ответ

0

Я не собираюсь отвечать на вопрос, почему вы получаете эту синтаксическую ошибку в этом обновлении SPARQL, поскольку это кажется несущественным для того, что вы на самом деле хотите знать. Я также не буду беспокоиться о том, как загрузить RDFLib-график в Dydra, так как это также кажется несущественным для того, что вы хотите знать. На этом я отвечу, что вы можете загружать данные из магазина Sesame в магазин Dydra, программно, без необходимости повторять все троек и без использования предложения SERVICE.

Dydra's REST API в основном идентичен Sesame REST API, поэтому большинство операций REST, которые вы можете выполнить в магазине Sesame, также можете выполнять в магазине Dydra.

Вы можете запросить HTTP POST на URL-адрес REST API вашего магазина Dydra для инструкций: repository/<ACCOUNT_ID>/<REPO_ID>/statements (см. here in the Dydra docs для получения дополнительной информации). Добавьте параметр url, который указывает URL-адрес вашего исходного URL-адреса хранилища кунжута для операторов: (repository/<REPO_ID>/statements).Также убедитесь, что в запросе POST указывается HTTP-заголовок Content-Type, который указывает тип MIME формата синтаксиса RDF, поддерживаемый Dydra (хороший выбор - это что-то вроде TriG или N-Quads, поскольку эти форматы поддерживают названные графики).

Вам не нужен RDFLib для любого из этого. Предположительно, вы знаете, как сделать простой HTTP-запрос от Python, если нет, я уверен, что примеров есть много, так как это довольно общая вещь.

+0

Одно небольшое редактирование. URL-адрес API Dydra REST для операторов: http://dydra.com/ /репозитории//statements. – kurious

+0

Обновленные документы находятся на странице https://github.com/dydra/http-api-tests. Они рекомендуют использовать протокол хранения графа. – kurious

 Смежные вопросы

  • Нет связанных вопросов^_^