1

次の SparQL クエリがあります。

SELECT ?b ?c WHERE {
ont:http\:\/\/test.com\/test\#com.test.test.test.2.3.4 ?b ?c}

これは、正常にOpenRDF Workbench 2.6.5で正しい結果を返します。ただし、次のコードを使用してクエリを実行すると、Jena 2.6.4を使用している私の Java では

private static ResultSet getQueryResults(String stringQuery, String service) {
    Query query = QueryFactory.create(stringQuery);
    QueryExecution qexec = QueryExecutionFactory.sparqlService(
            service, query);
    ResultSet results = qexec.execSelect(); 
    //ResultSetFormatter.out(System.out, results, query);
    return results;
}

public static ResultSet getDetails(String ID) {
    //we define our sparql query
    String sanatizedID = "ont:" +  sanitizeString(ID);
    String stringQuery = " SELECT ?b ?c WHERE" +
            " { " + sanatizedID + 
            //"{?a"+
            " ?b" +
            " ?c}";
    System.out.println(stringQuery);
    //we define our service
    String service = "http://test.test.com:8181/test-sesame/repositories/test";

    //We write the results of our query into a results set
    ResultSet results = getQueryResults(stringQuery, service);
    return results;
}

private static String sanitizeString(String s) {
    s = s.replace("/", "\\/");
    s = s.replace("#", "\\#");
    s = s.replace(":", "\\:");
    s = s.replace("\"", "\\\"");

    return s;
}

次のエラーが表示されます

Exception in thread "main" com.hp.hpl.jena.query.QueryParseException: Lexical error at line 1, column 871.  Encountered: ":" (58), after : "\\" 

オンラインクエリ query = QueryFactory.create(stringQuery);

Jena のバージョンを変更しようとしましたが、うまくいきませんでした。クエリが OpenRDF Workbench 2.6.5 では有効で、Java クエリでは無効である理由がわかりません (独自のサナタイズを行う可能性があると思います):/

助けていただければ幸いです。

4

2 に答える 2

0

"ont:" + sanitizeString(ID);

ont:クエリで for のプレフィックス宣言が必要な場合、または完全な形式の and を使用する必要があります<...>

于 2013-03-08T13:42:33.163 に答える
0

少し古いバージョンの SPARQL 1.1 仕様をサポートする Sesame のバージョンを使用しています。接頭辞付きの名前は実際には有効ではありません。

ont:http\:\/\/test.com\/test\#com.test.test.test.2.3.4

SPARQL 仕様の最新バージョンでは、追加:の文字を接頭辞付きの名前に直接使用できるようになりました。これを . でエスケープする必要はありません\\したがって、このクエリを Jena で機能させるには、2 番目の前のを削除するだけです。:

Sesame が最新の SPARQL 1.1 仕様に準拠しているかどうかはわかりませんが、より新しいバージョンの Sesame でこのクエリを試すと、Jena と一致する動作が見られる可能性があります。

于 2013-03-08T17:15:57.210 に答える