1

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

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

是否可以使用 Java 代码(VirtuosoExecutionFactoryJenaUPDATE或 我想从代码中调用 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.createServiceRequestQueryExecutionFactory.sparqlService. 这些适用于SELECT但不适用于UPDATE. 请让我知道如何通过从 Java 代码调用 SPARQL 端点来进行更新。任何建议,提示都非常感谢。

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

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

在尝试使用UpdateExecutionFactory和 Http Client 时,在执行时遇到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:连接到 IP:8890 被拒绝
    在 org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:158)
    在 org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:149)
    在 org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:121)
    在 org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:573)
    在 org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:425)
    在 org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820)
    在 org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754)
    在 org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:732)
    在 org.openjena.riot.web.HttpOp.execHttpPost(HttpOp.java:208)
    在 org.openjena.riot.web.HttpOp.execHttpPost(HttpOp.java:154)
    在 org.openjena.riot.web.HttpOp.execHttpPost(HttpOp.java:128)
    在 com.hp.hpl.jena.sparql.modify.UpdateProcessRemote.execute(UpdateProcessRemote.java:60)

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

4

3 回答 3

2

更新不是 SPARQL 中的查询。

利用

UpdateExecutionFactory

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

顺便提一句:

INSERT DATA  INTO <PERSONGRAPH>

不是合法的 SPARQL 更新语法。

于 2012-09-21T18:08:01.780 回答
1

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

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

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

于 2013-03-20T19:46:45.880 回答
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();

查看Virtuoso Jena Provider 示例中的VirtuosoSPARQLExample8.javaVirtuosoSPARQLExample9.java

于 2013-11-07T14:09:33.837 回答