使用 Jena 更新 VOS 6.1.6,而无需通过调用 Sparql 端点加载到内存



如果我从SPARQL端点运行DELETE/INSERT查询,则UPDATE操作有效。SPARQL 查询是

SELECT ALL
INSERT DATA  INTO <PERSONGRAPH>  { personURI rdf:type   foaf:Person }

是否可以使用 Java 代码(Jena 或VirtuosoExecutionFactory)执行相同的操作,以便在不需要将整个图形加载到内存中的情况下进行UPDATE操作?我想从代码中调用SPARQL端点来执行UPDATE操作。如果图形的整个三元组将加载到内存中的假设是错误的,请纠正我。以下 Jena 代码有效,但它将整个模型加载到内存中,这会导致机器在三倍大小增长到 50,000 以上时无法工作。

SELECT ALL
String queryString1 = " INSERT DATA  { personURI 
rdf:type   foaf:Person } "; 
UpdateRequest request1 = UpdateFactory.create(queryString1);
UpdateAction.execute(request1, personModel);

我想通过调用sparqlService或使用createServiceRequest来做同样的事情,这样它就可以避免将整个图形加载到内存中,类似于它对 SPARQL 端点的工作方式。

以下代码不会更新 Virtuoso 存储。

SELECT ALL
String queryString1 = " INSERT DATA  { personURI 
rdf:type  foaf:Person } ";
com.hp.hpl.jenafix.query.Query query1 = com.hp.hpl.jenafix.query.QueryFactory.create(queryString1);
com.hp.hpl.jenafix.query.QueryExecution qexec1 = com.hp.hpl.jenafix.query.QueryExecutionFactory.sparqlService("http://IP:8890/sparql", query1);

我尝试使用VirtuosoQueryExecutionFactory.sparqlServiceQueryExecutionFactory.createServiceRequestQueryExecutionFactory.sparqlService。这些适用于SELECT,但不适用于UPDATE。请让我知道如何通过从 Java 代码调用 SPARQL 端点来进行更新。任何建议,提示非常感谢。

对于新的 StackOverflow 用户,限制为 2 个 URL。可悲的是,personUri是一个URL,由于限制而无法提及。为了完整起见,我在这里提到personUripersonUrihttp://onmobile.com/umdb/person/juhi_chawla_268e7a02-8737-464f-97f8-172961d3335b

根据Andy的反馈,尝试使用UpdateExecutionFactory和Http客户端的建议。

尝试使用UpdateExecutionFactory和Http客户端时,在执行UPDATE时遇到了Connection refused问题,但在执行SELECT时却没有。代理主机和端口已设置。

感谢您的评论。INSERT语法适用于正在使用的商店Virtuoso Open Source。我在使用UpdateExecutionFactory时遇到问题。我尝试了以下内容

String queryString =  "DELETE DATA FROM <PERSONGRAPH> {  <"
+ personURI
+ "> rdf:type   foaf:Person } ";
com.hp.hpl.jena.update.UpdateRequest request = com.hp.hpl.jena.update.UpdateFactory.create(queryString);
UpdateProcessor proc = UpdateExecutionFactory.createRemote(request, "http://IP:8890/sparql");
proc.execute(); 

并得到以下错误堆栈跟踪

org.apache.http.conn.HttpHostConnectException: 连接到 IP:8890 被拒绝 at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:158) at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:149) at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:121) at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:573) at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:425) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:732) at org.openjena.riot.web.HttpOp.execHttpPost(HttpOp.java:208) at org.openjena.riot.web.HttpOp.execHttpPost(HttpOp.java:154) at org.openjena.riot.web.HttpOp.execHttpPost(HttpOp.java:128) at com.hp.hpl.jena.sparql.modify.UpdateProcessRemote.execute(UpdateProcessRemote.java:60)是否有

可能 Virtuoso 有不同的 URL 端点进行更新?

更新不是SPARQL中的查询。

UpdateExecutionFactory

要将数据流式传输到服务器,只需打开内容类型为application/sparql-update的 HTTP POST 连接,然后将更新(包含大数据)写入流中。

顺便说一句:

INSERT DATA  INTO <PERSONGRAPH>

不是合法的 SPARQL 更新语法。

我不确定我是否遵循您的问题。 目前尚不清楚在AndyS的回应之后添加了什么,以及开始了什么。 他关于语法错误的注释可能值得更多研究,如果你还没有解决这个问题 - 如果你有,分享该解决方案的更新将是一个好主意。

我还建议查看有关耶拿与Virtuoso连接的文档。

同样值得注意的是,关于Virtuoso的问题通常最好在公共OpenLink论坛,Virtuoso用户邮件列表或通过保密的支持案例提出。

可以使用以下代码直接在服务器端更新数据,而无需加载到本地客户端内存。

public static void main(String[] args) {
String url;
if(args.length == 0)
url = "jdbc:virtuoso://localhost:1111";
else
url = args[0];
VirtGraph set = new VirtGraph (url, "dba", "dba");
String str = "CLEAR GRAPH <http://test1>";
VirtuosoUpdateRequest vur = VirtuosoUpdateFactory.create(str, set);
vur.exec();                  
str = "INSERT INTO GRAPH <http://test1> { <http://aa> <http://bb> 'cc' . <http://aa1> <http://bb> 123 . <http://aa1> <http://bb> 124 . <http://aa1> <http://bb> 125 .  }";
vur = VirtuosoUpdateFactory.create(str, set);
vur.exec();

查看 VirtuosoSPARQLExample8.java和 VirtuosoSPARQLExample9.java in Virtuoso Jena Provider 示例。

最新更新