1

SPARQL エンドポイントからクエリを実行するDELETEと、操作は機能します。SPARQL クエリはINSERTUPDATE

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);

SPARQL エンドポイントで機能するのと同様に、グラフ全体をメモリにロードしないように、呼び出しsparqlServiceまたは使用して同じことを行いたいと考えています。createServiceRequest

次のコードは、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.createServiceRequestおよびを使用してみQueryExecutionFactory.sparqlServiceました。これらは動作しますが、動作しSELECTませんUPDATE。Java コードから SPARQL エンドポイントを呼び出して更新する方法を教えてください。任意の提案、ヒントをいただければ幸いです。

新しい StackOverflow ユーザーには、2 つの URL の制限があります。残念ながらpersonUriは URL であり、制限により言及できません。personUri完全を期すためにここに言及しています。http://onmobile.com/umdb/person/juhi_chawla_268e7a02-8737-464f-97f8-172961d3335bpersonUriです

Andy のフィードバックに基づいて、UpdateExecutionFactoryと Http Client の両方の提案を使用してみました。

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: 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 Update 構文ではありません。

于 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 に答える