首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jena TDB,查看在tdb创建过程中存储了多少三元组

Jena TDB,查看在tdb创建过程中存储了多少三元组
EN

Stack Overflow用户
提问于 2014-07-28 03:45:37
回答 1查看 341关注 0票数 0

在用java api创建tdb的过程中,可以看到存储中的三元组的数量吗?我使用turtle中的一个rar文件运行TDB工厂,但是在我的目录中创建文件的过程中,我看不到它存储了多少三元组。我该如何解决这个问题?

EN

回答 1

Stack Overflow用户

发布于 2014-09-18 22:11:38

您可以通过java代码访问批量加载器(查看引入的三元组),如下所示:

代码语言:javascript
复制
final Dataset tdbDataset = TDBFactory.createDataset( /*location*/ );
try( final InputStream in = /*get input stream for your large file*/) {
    TDBLoader.load( ((DatasetGraphTransaction)tdbDataset.asDatasetGraph()).getBaseDatasetGraph() , in, true);
}

如果您的归档中有多个文件(为简单起见,我不做rar,而是压缩),那么在将文件传递给批量加载器之前,您可以通过将这些文件连接到单个文件中来获得优化的性能。改进的性能源于延迟索引创建,直到所有三元组都被引入。我确信还有其他支持的格式,但我只测试过N-TRIPLES

以下示例使用commons-io中的IOUtils复制流:

代码语言:javascript
复制
final Dataset tdbDataset = TDBFactory.createDataset( /*location*/ );
final PipedOutputStream concatOut = new PipedOutputStream();
final PipedInputStream concatIn = new PipedInputStream(concatOut);

final ExecutorService workers = Executors.newFixedThreadPool(2);
final Future<Long> submitter = workers.submit(new Callable<Long>(){
    @Override
    public Long call() throws Exception {
        long filesLoaded = 0;
        try( final ZipFile zipFile = new ZipFile( /* Archive Location */ ) {
            final Enumeration< ? extends ZipEntry> zipEntries = zipFile.entries();
            while( zipEntries.hasMoreElements() ) {
                final ZipEntry entry = zipEntries.nextElement();
                try( final InputStream singleIn = zipFile.getInputStream(entry) ) {
                    // If your file is in a supported format already
                    IOUtils.copy(singleIn, concatOut); 
                    /*(final Model m = ModelFactory.createDefaultModel();
                    m.read(singleIn, null, "lang");
                    m.write(concatOut, "N-TRIPLES");*/
                }
                filesLoaded++;
            }
        }
        concatOut.close();
        return filesLoaded;
    }});

final Future<Void> comitter = workers.submit(new Callable<Void>(){
    @Override
    public Void call() throws Exception {
        TDBLoader.load( ((DatasetGraphTransaction)tdbDataset.asDatasetGraph()).getBaseDatasetGraph() , concatIn, true);
        return null;
    }});

workers.shutdown();
System.out.println("submitted "+submitter.get()+" input files for processing");
comitter.get();
System.out.println("completed processing");
workers.awaitTermination(1, TimeUnit.SECONDS); // NOTE this wait is redundant
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24984934

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档