如果我从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个网址。遗憾的是personUri
是一个URL,由于限制而无法提及。我在这里提到personUri
的完整性。 personUri
为http://onmobile.com/umdb/person/juhi_chawla_268e7a02-8737-464f-97f8-172961d3335b
基于Andy的反馈尝试使用UpdateExecutionFactory
和Http客户端的建议。
尝试使用UpdateExecutionFactory
和Http客户端时,在执行Connection refused
时遇到UPDATE
问题,但在执行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: 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端点吗?
答案 0 :(得分:2)
更新不是SPARQL中的查询。
使用
UpdateExecutionFactory
要将数据流式传输到服务器,只需打开内容类型为application/sparql-update
的HTTP POST连接,并将更新(包含大量数据)写入流中。
顺便说一句:
INSERT DATA INTO <PERSONGRAPH>
不是合法的SPARQL更新语法。
答案 1 :(得分:1)
我不确定我是否按照您的提问。目前尚不清楚在AndyS的回应之后添加了什么,以及从那开始的是什么。他关于你的语法错误的说明可能值得更多研究,如果你还没有解决这个问题 - 如果你有,那么分享该解决方案的更新将是一个好主意。
我还建议您查看有关Jena connections to Virtuoso的文档。
另外值得注意的是 - 通常最好在public OpenLink Discussion Forums,Virtuoso Users mailing list或confidential Support Case上提出有关Virtuoso的问题。
答案 2 :(得分:0)
您可以使用以下代码直接在服务器端更新数据,而无需加载到本地客户端内存。
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和Virtuoso Jena Provider examples。