如果我从SPARQL endpoints 运行 DELETE
/ INSERT
查询,则 UPDATE
操作有效 . SPARQL查询是
SELECT ALL
INSERT DATA INTO <PERSONGRAPH> { personURI rdf:type foaf:Person }
是否可以使用Java代码(Jena或 VirtuosoExecutionFactory
)执行相同的操作,以便 UPDATE
操作发生而无需将整个图形加载到内存中?我想从代码中调用SPARQL endpoints 来执行 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 endpoints 的工作方式 .
以下代码未更新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.sparqlService
, QueryExecutionFactory.createServiceRequest
和 QueryExecutionFactory.sparqlService
. 这些适用于 SELECT
但不适用于 UPDATE
. 请通过从Java代码调用SPARQL endpoints 告诉我如何进行更新 . 任何建议,提示都非常感谢 .
对于新的StackOverflow用户,限制为2个URL . 可悲的是 personUri
是一个URL,由于限制而无法提及 . 我在这里提到 personUri
的完整性 . personUri
是http://onmobile.com/umdb/person/juhi_chawla_268e7a02-8737-464f-97f8-172961d3335b
根据Andy的反馈尝试使用 UpdateExecutionFactory
和Http Client的建议 .
在尝试使用 UpdateExecutionFactory
和Http Client时,在执行 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();
并得到以下错误stacktrace
org.apache.http.conn.HttpHostConnectException: Connection to IP:8890 refused
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 endpoints 吗?
3 回答
更新不是SPARQL中的查询 .
使用
要将数据流式传输到服务器,只需打开内容类型为
application/sparql-update
的HTTP POST连接,并将更新(包含大数据)写入流中 .BTW:
是不合法的SPARQL更新语法 .
我不确定我是否按照你的提问 . 目前尚不清楚在AndyS的回应之后添加了什么,以及从那开始的是什么 . 他关于你的语法错误的说明可能值得更多研究,如果你还没有解决这个问题 - 如果你有,那么更新共享该解决方案将是一个好主意 .
我还建议您查看有关Jena connections to Virtuoso的文档 .
另外值得注意的是 - 通常最好在public OpenLink Discussion Forums,Virtuoso Users mailing list或confidential Support Case上提出有关Virtuoso的问题 .
您可以使用以下代码直接在服务器端更新数据,而无需加载到本地客户端内存 .
在Virtuoso Jena Provider examples中查看VirtuosoSPARQLExample8.java和VirtuosoSPARQLExample9.java .