首页 文章

如何将所有三元组从RDFlib图插入另一个存储库而不迭代每个三元组?

提问于
浏览
0

这个问题与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 回答

  • 0

    我也不打算回答如何将RDFLib图表上传到Dydra,因为这对你想知道的事情似乎并不重要 . 我将在这里回答的是如何以编程方式将数据从Sesame商店上传到Dydra商店,而不必迭代所有三元组,并且不使用 SERVICE 子句 .

    Dydra的REST APISesame 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请求,如果不是,我确定有很多例子,因为它是一个相当通用的事情 .

相关问题