Как я могу загрузить и запросить 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();