这个问题与What URI to use for a Sesame repository while executing a SPARQL ADD query有关 .
我正在尝试将所有三元组从芝麻存储库插入另一个(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中的每个三元组并单独地对它们进行迭代 . 我正在寻找一种批量移植数据的方法 .
更新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
但是,我要发布的数据没有发布 . 我该如何做不同的事情?
1 回答
我也不打算回答如何将RDFLib图表上传到Dydra,因为这对你想知道的事情似乎并不重要 . 我将在这里回答的是如何以编程方式将数据从Sesame商店上传到Dydra商店,而不必迭代所有三元组,并且不使用
SERVICE
子句 .Dydra的REST API与Sesame REST API基本相同,因此您可以在Sesame商店执行的大多数REST操作也可以在Dydra商店执行 .
您可以对Dydra商店的REST API URL执行HTTP POST请求以获取语句:
repository/<ACCOUNT_ID>/<REPO_ID>/statements
(有关详细信息,请参阅here in the Dydra docs) . 添加参数url
,该参数指向语句的源Sesame存储URL的URL:(repository/<REPO_ID>/statements
) . 还要确保在POST请求中指定Content-Type
HTTP标头,指定Dydra支持的RDF语法格式的MIME类型(一个好的选择类似于TriG或N-Quads,因为这些格式支持命名图形) .你甚至不需要任何RDFLib . 大概你知道如何从Python做一个简单的HTTP请求,如果不是,我确定有很多例子,因为它是一个相当通用的事情 .