Можно ли одновременно записывать данные в один и тот же файл набора данных, но в разные именованные графы (каждый поток записывает в разные именованные графы)?

В TDB Йены кажется, что данные организованы "набором данных" (указанным каталогом), который может содержать несколько "именованных графов".

Что касается политики параллелизма для запроса таких данных, единственная документация, которую я нашел касательно параллелизма, - это следующее предложение из документации TDB, API-интерфейс TDB Java:

Для параллельного доступа можно действовать напрямую с набором данных без транзакций с политикой Multiple Reader или Single Writer (MRSW).

Однако я не уверен в степени детализации такой политики MRSW. Это весь набор данных или отдельный граф с именем из набора данных?

РЕДАКТИРОВАТЬ: Более конкретно, мое требование заключается в том, чтобы я хотел делать обновления только для записи для разных именованных графов (каждый поток записывает в разные именованные графы) без какой-либо операции чтения, возможно ли это? Или я должен позволить одному обновлению потока за один раз.

3 ответа

Учитывая, что в связанной документации написано

Для параллельного доступа можно действовать напрямую с набором данных без транзакций с политикой Multiple Reader или Single Writer (MRSW).

Я ожидаю, что если у вас есть несколько писателей, которые будут иметь доступ к набору данных, даже если в разных именованных графах, вы должны использовать транзакции. В документации по транзакциям TDB говорится о транзакциях записи:

Общий шаблон:

 dataset.begin(ReadWrite.WRITE) ;
 try {
   ...
   dataset.commit() ;
 } finally { 
   dataset.end() ; 
 }

и эти призывы к begin а также end связаны с набором данных, а не с отдельными именованными графами.

Многие тройные хранилища (и я думаю, что TDB включен в это) рассматривают тройки в именованных графах как четырехкратные (часто просто называемые четырехугольниками). Тройной a b c в названном графе g1 может храниться вместе с тройной d e f в названном графе g2 в той же четверной таблице:

g1 a b c
g2 d e f

и затем эта четырехугольная таблица, представляющая один набор данных, может быть проиндексирована в любом из четырех столбцов. В этом представлении часть данных с именованным графом на самом деле ничем не отличается от остальных данных, поэтому именованные графы не обеспечивают никакой изоляции от проблем параллелизма. Действительно, поскольку в общем случае запросы и обновления SPARQL могут считывать или обновлять несколько именованных графов, невозможно заранее узнать именованные графы, к которым будет обращаться запрос или обновление.

Видимо можно написать следующий код:

ХОРОШО. Видимо можно написать следующий код:

Dataset dataset = TDBFactory.createDataset("demo");
Model model = dataset.getNamedModel("aModel");
try {
    model.enterCriticalSection(False);   //Write Lock

    // write triples to model

    model.commit();
    TDB.sync(model);
} finally {
    model.leaveCriticalSection();
}

В соответствии с этим, я думаю, что не должно быть никаких проблем с одновременной записью в разные именованные графы. Это все еще не проверено все же.

Не безопасно писать в два графика в одном и том же наборе данных одновременно.

Может показаться, что работает без транзакций, но это потенциально небезопасно. Код может обнаружить это и предупредить, но это гарантировано.

Вы должны использовать транзакции.

Когда два писателя пытаются записать, нет истинной параллельной записи (есть внутренняя блокировка, чтобы сохранить все в безопасности).

Если вы хотите сделать акцент на записи, подумайте о наличии двух наборов данных, а затем создайте универсальный набор (структура в памяти) с моделями из каждого отдельного набора данных.

На практике истинные параллельные записывающие устройства могут не дать вам больших преимуществ по сравнению с транзакциями записи в одну и ту же базу данных, если на обычных серверах с одним диском имеется только один путь к диску. CPU+RAM не является ограничением.

Другие вопросы по тегам