0

此问题与执行 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

但是,我想发布的数据没有被发布。我需要如何做不同的事情?

4

1 回答 1

0

我不会费心回答为什么您在 SPARQL 更新中会遇到语法错误,因为这对您真正想知道的内容似乎无关紧要。我也不会费心回答如何将 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请参阅Dydra 文档中的此处)。添加一个参数,该参数url指向语句的源芝麻商店 URL 的 URL:( repository/<REPO_ID>/statements)。还要确保Content-Type在 POST 请求中指定 HTTP 标头,该标头指定 Dydra 支持的 RDF 语法格式的 MIME 类型(一个不错的选择是 TriG 或 N-Quads,因为这些格式支持命名图)。

你甚至不需要 RDFLib 来做这些。大概你知道如何从 Python 发出一个简单的 HTTP 请求,如果不知道的话,我敢肯定有很多例子,因为这是一件相当通用的事情。

于 2015-12-25T22:39:29.997 回答