您能想到同时加载和查询RDF三元组的任何方法吗?

我只知道在Sesame中,您必须首先初始化存储库(例如加载rdf文件),然后才能通过SPARQL查询。

想象一下,我们初始化了一个RDF存储库(输入文件),并且不想完成加载,但是在加载RDF数据的同时,想要通过SPARQL查询数据以进行验证。

对于以下初始化,应该等到存储库中RDF文件的加载完成(我的假设)之后,您才可以查询存储库中的RDF数据:

File rdfFile; // parameter, RDF file.
repo = new SailRepository(new MemoryStore());
repo.initialize();

        try {
            RepositoryConnection con = repo.getConnection();
            try {
                con.add(rdfFile, null, rdfFormat);
            } finally {
                con.close();
            }
        }


在上面的代码中,RepositoryConnection.add获得一个File作为参数。将FileInputStream作为参数可以解决该问题吗? (存储库的初始化不会等待加载文件,并且可以在加载完成之前进行查询)。

最佳答案

使用FileInputStream代替File不会对Sesame处理文件的方式产生影响:add方法在完全添加数据之前仍然不会返回。

但是,可以通过在与加载文件不同的线程中执行查询,然后使用隔离级别为READ_UNCOMMITTED的事务来实现所需的目标。当然,在这种情况下几乎不能保证查询结果的完整性或一致性,但是从技术上讲是可行的。

这样的事情(从我的头顶开始,所以未经测试):

   File rdfFile; // parameter, RDF file.
   repo = new SailRepository(new MemoryStore());
   repo.initialize();

   Thead loader = new Thread() {
      public void run() {
       try (RepositoryConnection con = repo.getConnection()) {
            con.add(rdfFile, null, rdfFormat);
       }
      }
   };
   Thead query = new Thread() {
      public void run() {
       try (RepositoryConnection con = repo.getConnection()) {
        conn.begin(IsolationLevels.READ_UNCOMMITTED);
        String query = "SELECT * WHERE ... ";
        try(TupleQueryResult result = conn.prepareTupleQuery(query).evaluate()) {
           while (result.hasNext()) {
                ...
           }
        }
        conn.commit();
      }
   };
   loader.start();
   query.start();

08-25 13:08
查看更多