首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在不遍历每个三元组的情况下将RDFlib图中的所有三元组插入到另一个存储库中?

如何在不遍历每个三元组的情况下将RDFlib图中的所有三元组插入到另一个存储库中?
EN

Stack Overflow用户
提问于 2015-12-25 07:39:00
回答 1查看 1.1K关注 0票数 0

此问题与What URI to use for a Sesame repository while executing a SPARQL ADD query相关。

我正在尝试将Sesame存储库中的所有三元组插入到另一个存储库(Dydra)中。有几种方法可以做到这一点,例如使用SERVICE子句或Dydra的GUI。然而,Dydra限制了服务的使用,我想要一种有效的方式来以编程的方式插入数据。这是我现在拥有的代码:

代码语言:javascript
复制
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()

该代码会导致以下错误:

代码语言:javascript
复制
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

这是我尝试实现建议答案的代码:

代码语言:javascript
复制
    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

这是错误:

代码语言:javascript
复制
q_status_code: 400

但是,如果我注释掉'url‘属性,我会得到这样的结果:

代码语言:javascript
复制
q_status_code: 201

任何关于如何解决的想法都将是非常有用的。

更新2

现在,不管'url‘是在headersPOST还是paramsPOST下,我得到了以下输出:

代码语言:javascript
复制
q_status_code: 201

然而,我想要发布的数据没有得到POSTed。我需要怎样做才能有所不同?

EN

回答 1

Stack Overflow用户

发布于 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请求,如果不知道,我相信有很多例子,因为这是一个相当通用的事情。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34458826

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档