如果我从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.sparqlService
,QueryExecutionFactory.createServiceRequest
和QueryExecutionFactory.sparqlService
。这些适用于SELECT
,但不适用于UPDATE
。请让我知道如何通过从 Java 代码调用 SPARQL 端点来进行更新。任何建议,提示非常感谢。
对于新的 StackOverflow 用户,限制为 2 个 URL。可悲的是,personUri
是一个URL,由于限制而无法提及。为了完整起见,我在这里提到personUri
。personUri
http://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 示例。