1

foaf ファイルをロードしようとしています:

import org.apache.jena.rdf.model.Model;
import org.apache.jena.rdf.model.ModelFactory;

public class Testbed {
    public static void main(String[] args) {
        Model model = ModelFactory.createDefaultModel();

        try {
                model.read("http://www.csail.mit.edu/~lkagal/foaf", "RDF/XML"); 
        }
        catch(Exception ex) {
            System.out.println(ex.toString());
        }
    }
}

次の例外が発生します。

org.apache.jena.riot.RiotException: [行: 1, 列: 50] publicId と systemId の間に空白が必要です。

この例外の意味がわかりません。どうすれば修正できますか。間違った形式を使用していませんか (「TURTLE」やその他の形式のように見えません)?

私の環境(Windows 10 x64、apache-jena-3.1.1):

Java バージョン "1.8.0_112" Java(TM) SE ランタイム環境 (ビルド 1.8.0_112-b15) Java HotSpot(TM) 64 ビット サーバー VM (ビルド 25.112-b15、混合モード)

4

1 に答える 1

4

URLhttp://www.csail.mit.edu/~lkagal/foafは実際には にリダイレクトされていhttp://people.csail.mit.edu/lkagal/foafます。リダイレクトの存在がエラーの原因です。

この問題はすでに報告され、開発ブランチで修正されていますJena(バグ[JENA-1263] )。

分析

Apache Jenaは、接続処理にApache HttpClientを使用します。特に、で に更新されたものをJena 3.1.0使用します。HttpClient 4.2.6HttpClient 4.5.2Jena 3.1.1

@potameが指摘したように、この問題は を使用しても存在しません。その理由は、リダイレクトを自動的に追跡Jena 3.1.0するなど、デフォルトでさまざまな機能をサポートする接続を作成するためです (使用しますnew SystemDefaultHttpClient())。

反対に、 の更新ではHttpClientJena 3.1.1リダイレクトをたどることができない、より最小限のタイプの接続を作成するようにコードが変更されました (それは を使用しますHttpClients.createMinimal())。

何が起こるかというと、foafファイルに到達する代わりに、次のようなリダイレクト メッセージを取得するだけです。

name="[xml]",ch=DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a href="http://people.csail.mit.edu/lkagal/foaf">here</a>.</p>
<hr>
<address>Apache/2.2.16 (Debian) Server at www.csail.mit.edu Port 80</address>
</body></html>

次に、実際に例外をスローするApache Xercesで解析しようとします (ex.printStackTrace()の代わりに使用することで確認できますSystem.out.println(ex.toString()))。

...
at org.apache.xerces.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:282)
at org.apache.xerces.impl.XMLScanner.reportFatalError(XMLScanner.java:1467)
at org.apache.xerces.impl.XMLScanner.scanExternalID(XMLScanner.java:1001)
...

ソリューション

  • 直接URLを使用し、http://people.csail.mit.edu/lkagal/foaf
  • の以前のバージョンを使用するJena
  • の開発ブランチを使用するJena
  • デフォルトの接続の代わりに使用する、独自の「リダイレクト可能な」接続を提供Jenaします。HttpOp.setDefaultHttpClientを使用する前にメソッドを呼び出すことができますmodel.read。次に例を示します。

    HttpOp.setDefaultHttpClient(HttpClientBuilder.create().build());
    
于 2016-12-24T01:44:48.807 に答える