Как я могу загрузить и запросить RDF одновременно

Можете ли вы придумать способ одновременно загружать и запрашивать тройки 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 как параметр решить проблему? (Инициализация репозитория не ожидает загрузки файла, и можно будет выполнить запрос до завершения загрузки).

1 ответ

Решение

Используя FileInputStream вместо File не будет иметь никакого значения в том, как Сезам обрабатывает файл: 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();
Другие вопросы по тегам