此问题与执行 SPARQL ADD 查询时用于芝麻存储库的 URI相关。
我正在尝试将 Sesame 存储库中的所有三元组插入另一个(Dydra)。有几种方法可以做到这一点,例如使用 SERVICE 子句或 Dydra 的 GUI。但是,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
对它们进行处理。我已经尝试过这种方法。虽然代码有效,但并非所有数据都被移植。这就是我正在寻找一种批量移植数据的方法的原因。
更新 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
关于如何解决的任何想法都会非常有帮助。
更新 2
现在,无论“url”是在 headersPOST 还是 paramsPOST 下,我都会得到以下输出:
q_status_code: 201
但是,我想发布的数据没有被发布。我需要如何做不同的事情?