当前位置: 首页 > 知识库问答 >
问题:

如何在事务中批量插入GraphDB中的数据

卫英悟
2023-03-14

我试图将数据插入GraphDB,因此SPARQL更新查询由总大小约为1M的语句组成,并带有一些DELETE和WHERE语句。我使用GraphDB REST API执行此操作失败:

1) 成功启动了发送更新请求(python代码段)的事务处理POST/repositories/{repositoryID}/transactions 2)

requests.put(
    url='/repositories/{repositoryID}/transactions/{transactionID}'
    params={'update': sparql, 'action': 'ADD'}
) 

获取错误

<!doctype html><html lang="en"><head><title>HTTP Status 400 – Bad Request</title><style type="text/css">h1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} h2 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:16px;} h3 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px;} body {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;} b {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;} p {font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;} a {color:black;} a.name {color:black;} .line {height:1px;background-color:#525D76;border:none;}</style></head><body><h1>HTTP Status 400 – Bad Request</h1><hr class="line" /><p><b>Type</b> Exception Report</p><p><b>Message</b> Request header is too large</p><p><b>Description</b> The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).</p><p><b>Exception</b></p><pre>java.lang.IllegalArgumentException: Request header is too large

此Sparql语句成功地执行在工作台SPARQL控制台。但是如果我增加我得到的数据数量

java.lang.StackOverflowError

在工作台UI中。

我想执行的Sparql是以下的

PREFIX time: <http://www.w3.org/2006/time#> 
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> 
PREFIX tr: <http://www.semanticweb.org/tr#> 
PREFIX owl: <http://www.w3.org/2002/07/owl#>  
PREFIX geosparql: <http://www.opengis.net/ont/geosparql#>

DELETE { tr:ontologyVersion tr:hasTimestamp ?o . }
INSERT {
    trip:ontologyVersion a time:Instant, owl:NamedIndividual ; 
                     trip:hasTimestamp "2019-10-11 14:56:06.750130+00:00"^^xsd:dateTime . 

    <a lot of new triples>
} 
WHERE { 
    OPTIONAL { tr:ontologyVersion tr:hasTimestamp ?o . } 
} 

那么,如何将数据插入GraphDB,正确的方法是什么?

更新1

我重写了代码以便使用

requests.put(url=url, data={'update': sparql}, params={'action': 'COMMIT'}) 

并使用sparql=“删除数据{};插入数据{}”。请求已完成,响应代码为200,但由于某些原因,数据不在GraphDB中。

更新2

根据rdf4j服务器RESTAPI,我将请求更改为

requests.put(url=transaction_url, data={'update': sparql}, params={'action': 'UPDATE'}) 
requests.put(url=transaction_url, params={'action': 'COMMIT'}) 

并且仍然使用sparql=“删除数据{};插入数据{}”。内容类型为“application/x-www-form-urlencoded”和url编码的sparql字符串的请求。

在这种情况下,我得到406个错误

org.eclipse.rdf4j.http.server.ClientHTTPException: Could not read SPARQL update string from body.

共有2个答案

夹谷阳夏
2023-03-14

最后,我想出了解决办法。

requests.put(url=transaction_url, data=sparql, params={'action': 'UPDATE'}, headers={'Conteny-Type': 'application/sparql-update'}) 
requests.put(url=transaction_url, params={'action': 'COMMIT'}) 

事实证明,RDF4J transactions API希望查询按原样位于主体中,而不使用任何urlencoding和“update=”参数名。在这里找到java/org/eclipse/rdf4j/http/server/repository/transaction/TransactionController。JAVA

桂鑫鹏
2023-03-14

这里有两个不同的问题。

第一个问题是当您尝试将sparql更新作为事务的一部分执行时。错误消息是“请求头太大”。对我来说,这听起来像是您的请求试图将负载作为头字段发送,而不是作为数据负载发送。我认为您可能需要稍微更改Python代码,例如:

requests.put(
    url='/repositories/{repositoryID}/transactions/{transactionID}'
    data={'update': sparql, 'action': 'ADD'}
) 

(因此是数据而不是参数

第二个问题听起来像是工作台UI的一个限制(假设这就是抛出StackOverflowerError的原因),但除此之外,插入新数据的方式效率非常低:作为批量数据上载的一部分,您正在执行可选查询,并且使用插入。。。在哪里也一样。

我建议改为使用INSERT DATA命令进行批量上传:

INSERT DATA {
  // ... large amount of triples
}

如果您使用时间戳所做的这件事应该是您试图实现的一部分,我建议您在批量上传之前或之后,作为单独的操作来查询和更新该时间戳-如果您在同一事务上执行此操作,最终结果将是相同的。

哦,当然,一旦完成,就需要提交事务。

 类似资料:
  • 问题内容: 这是我的用例: 我有多个并行运行的芹菜任务 每个任务可以批量 创建 或 更新 许多对象。为此,我正在使用django-bulk 所以基本上我使用的是一个非常方便的功能insert_or_update_many: 它首先执行选择 如果找到对象,它将对其进行更新 否则会创建它们 但这引入了并发问题。例如:如果在第1步中不存在对象,则将其添加到要插入的对象列表中。但是在此期间,另一个Cele

  • 问题内容: 使用hibernate时,当我尝试使用以下方式启用批量插入时 我得到以下输出: 然后这个: 基本上没有。 我是否缺少设置? 问题答案: 原来在这种情况下缺少的是: 现在我明白了 频繁得多(任何大于1的值基本上都意味着它成功完成了批量插入)。 hibernate.jdbc.batch_versioned_data也可能有用。 jdbc:mysql:// localhost:3306 /

  • 问题内容: 我有许多记录需要输入到表中。在查询中执行此操作的最佳方法是什么?我是否应该进行循环并在每次迭代中插入一条记录?或者,还有更好的方法? 问题答案: 从MySQL手册 使用VALUES语法的INSERT语句可以插入多行。为此,请包括多个列值列表,每个列值括在括号内并用逗号分隔。例:

  • 问题内容: 在MS SQL上,我可以使用以下sql命令进行批量插入: 现在我想在MySQL上做同样的事情,但是我似乎无法弄清楚它是如何工作的以及使用什么查询。 问题答案: 在MySQL中,等效项为 加载数据文件 http://dev.mysql.com/doc/refman/5.1/en/load- data.html

  • 本文向大家介绍如何在mybatis中向BLOB字段批量插入数据,包括了如何在mybatis中向BLOB字段批量插入数据的使用技巧和注意事项,需要的朋友参考一下   最近接手一个需求,需要用xxl-job定时任务同步三方库中新增的数据,粗略一看挺得意,以为一两小时就搞定了,但事与愿违,编码两小时却被一个BLOB字段玩了一下午。   每次获取50条数据过来,每条数据中有一个字段是BLOB类型的图片,需

  • 问题内容: 使用休眠时,当我尝试使用以下方式启用批量插入时 我得到以下输出: 然后这个: 基本上没有。 我是否缺少设置? 问题答案: 原来这种情况下缺少的是: 参考:https : //forum.hibernate.org/viewtopic.php ? p =2374413,https : //stackoverflow.com/a/5240930/32453 或可能是hibernate.or