Этот вопрос относится к rcreswick вопросу Сериализация изменений Jena OntModel . У меня есть модели Jena на двух (или более) машинах, которые нужно синхронизировать через сокеты. Основная проблема, которую мне нужно решить, состоит в том, что модели могут содержать анонимные узлы (bnodes), которые могут возникать в любой из моделей.
Вопрос : Я на правильном пути или есть лучший, более надежный подход, который я не рассматриваю?
Я могу придумать 3 подхода к этой проблеме:
- Сериализация полной модели : Это слишком дорого для синхронизации небольших обновлений. Кроме того, поскольку изменения могут происходить на любой машине, я не могу просто заменить модель машины B на сериализованную модель из машины A. Мне нужно объединить их.
- Сериализация частичной модели : Используйте выделенную модель для сериализации, которая содержит только те изменения, которые необходимо отправить через сокет. Этот подход требует специального словаря для представления операторов, которые были удалены из модели. Предположительно, когда я сериализую модель с машины A на машину B, идентификаторы анонимных узлов будут уникальными для машины A, но могут совпадать с идентификаторами для анонимных узлов, созданных на машине B. Поэтому мне придется переименовывать анонимные узлы и сохранять сопоставление от идентификаторов машины А к идентификаторам машины В для правильной обработки будущих изменений.
- Сериализация отдельных высказываний : Этот подход не требует специального словарного запаса, но может быть и не таким надежным. Есть ли другие проблемы, кроме анонимных узлов, с которыми я еще не сталкивался?
- Создание глобально уникальных идентификаторов bnode (NEW) : Мы можем генерировать глобально уникальные идентификаторы для анонимных узлов, добавляя префикс ID к уникальному идентификатору машины. К сожалению, я не понял , как сказать Джене использовать мой генератор идентификаторов вместо его собственного. Это позволило бы нам сериализовать отдельные операторы без переназначения идентификаторов bnode.
Вот пример, чтобы обосновать это обсуждение немного подробнее. Предположим, у меня есть список на машине A, представленный в виде:
_:a rdf:first myns:tom
_:a rdf:rest rdf:nil
Я сериализую эту модель с машины A на машину B. Теперь, поскольку на машине B уже может быть (не связанный) анонимный узел с идентификатором «a», я переназначаю идентификатор «a» в новый идентификатор «b»:
_:b rdf:first myns:tom
_:b rdf:rest rdf:nil
Теперь список меняется на машине A:
_:a rdf:first myns:tom
_:a rdf:rest _:b
_:b rdf:first myns:dick
_:b rdf:rest rdf:nil
Поскольку машина B никогда ранее не сталкивалась с идентификатором 'b' машины A, она добавляет новое отображение из идентификатора 'b' машины A в новый идентификатор 'c':
_:b rdf:first myns:tom
_:b rdf:rest _:c
_:c rdf:first myns:dick
_:c rdf:rest rdf:nil
Проблема осложняется более чем двумя машинами. Например, если существует третий компьютер C, у него может быть свой собственный анонимный узел «a», который отличается от анонимного узла компьютера «a». Таким образом, машина B действительно должна хранить карту от идентификаторов анонимных узлов каждого другого компьютера с его локальными идентификаторами, а не только от удаленных идентификаторов в целом с локальными идентификаторами. При обработке входящих изменений необходимо учитывать, откуда произошли изменения, для правильного сопоставления идентификаторов.