問題があり、何時間も検索しても適切な解決策が見つかりませんでした。タートル構文 (~8GB) で巨大な RDF ドキュメントを解析したいと考えています。これが、jena riot が提供するストリーム アプローチ、つまり RDFDataMgr を選択した理由です。処理中のファイルは、空白を含む無効な URI を使用しています。これにより致命的な例外が発生し、解析が停止します。とにかく役に立たないので、これらの無効な URI を事前に認識し、ステートメント全体をスキップしたいと思います。Apache メール アーカイブから提案されたソリューションを試しましたが、トリプルが発行される前に例外が発生するため、期待どおりに機能しません。私が間違っている場所を誰かが知っていますか、それとも別の解決策を見つける必要がありますか? ここで私が使用しているサンプルコードを参照してください:
import org.apache.jena.atlas.lib.Sink;
import org.apache.jena.graph.Triple;
import org.apache.jena.riot.system.StreamRDF;
import org.apache.jena.riot.system.StreamRDFLib;
import org.apache.jena.riot.system.StreamRDFWrapper;
import org.apache.jena.riot.system.SyntaxLabels;
import org.apache.jena.sparql.core.Quad;
import org.apache.jena.riot.RDFDataMgr;
import org.apache.jena.riot.out.SinkQuadOutput;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStream;
public class JenaStreamWrapper extends StreamRDFWrapper {
public static void main(String... argv) throws FileNotFoundException {
String filename = "file.ttl";
OutputStream outputStream = new FileOutputStream(new File("file.nq"));
StreamRDF filtered = new JenaStreamWrapper(StreamRDFLib.writer(outputStream));
RDFDataMgr.parse(filtered, filename);
}
public JenaStreamWrapper(StreamRDF other) {
super(other);
}
@Override
public void triple(Triple triple) {
if ((triple.getSubject().isURI() && triple.getSubject().getURI().contains(" "))
|| (triple.getObject().isURI() && triple.getObject().getURI().contains(" ")))
System.out.println(triple.getSubject().getURI());
else
other.triple(triple);
}
}
ここでは、データセットから抽出されたステートメントの例をいくつか示します。
@prefix gndo: <http://d-nb.info/standards/elementset/gnd#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix dnbt: <http://d-nb.info/standards/elementset/dnb/> .
<http://d-nb.info/gnd/117177040> a gndo:DifferentiatedPerson ;
owl:sameAs <http://viaf.org/viaf/64153583> ;
gndo:gndIdentifier "117177040" ;
gndo:oldAuthorityNumber "(DE-588a)117177040" , "(DE-588a)117177040670 BnF" ;
owl:sameAs <http://d-nb.info/gnd/117177040670 BnF> ;
dnbt:deprecatedUri "http://d-nb.info/gnd/117177040670 BnF" ;
gndo:oldAuthorityNumber "(DE-588)117177040670 BnF" ;
gndo:variantNameForThePerson "Jourdan, Camille" ;
gndo:variantNameEntityForThePerson _:node1aj1cbug9x62759112 .
コードを実行すると、次のメッセージが表示されます。
Exception in thread "main" org.apache.jena.riot.RiotException: [line: 9, col: 55] Bad character in IRI (space): <http://d-nb.info/gnd/117177040670[space]...>
at org.apache.jena.riot.system.ErrorHandlerFactory$ErrorHandlerStd.fatal(ErrorHandlerFactory.java:136)
at org.apache.jena.riot.lang.LangEngine.raiseException(LangEngine.java:165)
at org.apache.jena.riot.lang.LangEngine.nextToken(LangEngine.java:108)
at org.apache.jena.riot.lang.LangTurtleBase.predicateObjectItem(LangTurtleBase.java:286)
at org.apache.jena.riot.lang.LangTurtleBase.predicateObjectList(LangTurtleBase.java:280)
at org.apache.jena.riot.lang.LangTurtleBase.triples(LangTurtleBase.java:249)
at org.apache.jena.riot.lang.LangTurtleBase.triplesSameSubject(LangTurtleBase.java:190)
at org.apache.jena.riot.lang.LangTurtle.oneTopLevelElement(LangTurtle.java:46)
at org.apache.jena.riot.lang.LangTurtleBase.runParser(LangTurtleBase.java:89)
at org.apache.jena.riot.lang.LangBase.parse(LangBase.java:42)
at org.apache.jena.riot.RDFParserRegistry$ReaderRIOTLang.read(RDFParserRegistry.java:179)
at org.apache.jena.riot.RDFDataMgr.process(RDFDataMgr.java:861)
at org.apache.jena.riot.RDFDataMgr.parse(RDFDataMgr.java:667)
at org.apache.jena.riot.RDFDataMgr.parse(RDFDataMgr.java:637)
at org.apache.jena.riot.RDFDataMgr.parse(RDFDataMgr.java:626)
at org.apache.jena.riot.RDFDataMgr.parse(RDFDataMgr.java:617)
at zbw.tbl.schemex.additions.JenaStreamWrapper.main(JenaStreamWrapper.java:27)
あらゆる種類の有用な情報に感謝します。