此问题与What URI to use for a Sesame repository while executing a SPARQL ADD query相关。
我正在尝试将Sesame存储库中的所有三元组插入到另一个存储库(Dydra)中。有几种方法可以做到这一点,例如使用SERVICE子句或Dydra的GUI。然而,Dydra限制了服务的使用,我想要一种有效的方式来以编程的方式插入数据。这是我现在拥有的代码:
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然而,我想要发布的数据没有得到POSTed。我需要怎样做才能有所不同?
发布于 2015-12-26 06:39:30
我不会费心去回答为什么在SPARQL更新时会出现语法错误,因为它似乎与您真正想知道的内容无关。我也不会费心回答如何将RDFLib图上传到Dydra,因为这似乎也与你想知道的无关。这里我要回答的是,如何以编程方式将数据从Sesame商店上传到Dydra商店,而不必遍历所有的三元组,也无需使用SERVICE子句。
Dydra的REST API基本上与Sesame REST API相同,所以可以在芝麻存储上执行的大多数REST操作也可以在Dydra存储上执行。
您可以向Dydra store的REST API URL发出HTTP POST请求,以获取以下语句:repository/<ACCOUNT_ID>/<REPO_ID>/statements (有关更多详细信息,请参阅here in the Dydra docs )。添加一个参数url,它指向语句的源芝麻商店URL:(repository/<REPO_ID>/statements)。还要确保在POST请求中指定RDF头,该头指定了Content-Type支持的RDF语法格式的MIME类型(最好选择类似TriG或N-Quads的格式,因为这些格式支持命名图)。
你甚至不需要RDFLib来做这些事情。大概你知道如何从Python做一个简单的HTTP请求,如果不知道,我相信有很多例子,因为这是一个相当通用的事情。
https://stackoverflow.com/questions/34458826
复制相似问题