【问题标题】:Jena TDB , see how many triple stored during tdb creationJena TDB,查看在创建 tdb 期间存储了多少个三元组
【发布时间】:2014-07-27 19:45:37
【问题描述】:

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

【问题讨论】:

  • 不清楚你在问什么。如果您在设置后查询select (count(*) as ?nTriples) { graph ?g { ?s ?p ?o } },您将获得三元组的计数,或者您可以使用您获得的 TDB 模型,并询问它的 .size(),或者......您尝试了什么以及什么没用?
  • 问题在于设置,我想实时查看有多少个三元组正在存储我的程序
  • bulkloader 打印出添加的三元组/四元组(随着它们的进行)。如果您不使用批量加载程序,正如您所说的使用 API,那么因为它是事务性的,您必须在事务内部询问进行更新。

标签: jena tdb


【解决方案1】:

您可以通过java代码访问bulk-loader(查看引入的三元组),如下:

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,而是使用 zip),然后 as per an answer to this question,您可以通过在传递文件之前将文件连接成单个文件来获得优化的性能到散装装载机。改进的性能源于延迟创建索引,直到引入所有三元组。我确定还有其他格式支持,但我只测试了N-TRIPLES

以下示例使用来自commons-ioIOUtils 来复制流:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    相关资源
    最近更新 更多