Этот вопрос относится к вопросу rcreswick на Сериализация изменений Jena OntModel. У меня есть модели Jena на двух (или более) машинах, которые должны оставаться синхронизированными через сокеты. Основная проблема, которую мне нужно решить, заключается в том, что модели могут содержать анонимные узлы (bnodes), которые могут возникать в любой из моделей.
Вопрос. Я на правильном пути или есть более надежный подход, который я не рассматриваю?
Я могу придумать 3 подхода к этой проблеме:
- Сериализировать всю модель: это непомерно дорого для синхронизации небольших обновлений. Кроме того, поскольку изменения могут происходить на любой машине, я не могу просто заменить модель машины B сериализованной моделью машины A. Мне нужно их объединить.
- Сериализация частичной модели. Используйте выделенную модель для сериализации, которая содержит только те изменения, которые необходимо отправить через сокет. Этот подход требует специальной лексики для представления утверждений, которые были удалены из модели. Предположительно, когда я сериализую модель с машины A на машину B, идентификаторы анонимных узлов будут уникальными для машины A, но могут перекрываться с идентификаторами анонимных узлов, созданных на машине B. Поэтому мне придется переименовать анонимные узлы и сохранить сопоставление. из анонимных идентификаторов машины А в идентификаторы машины Б, чтобы правильно обрабатывать будущие изменения.
- Сериализация отдельных операторов: этот подход не требует специальной лексики, но может быть не таким надежным. Есть ли проблемы, кроме анонимных узлов, с которыми я еще не сталкивался?
- Создание глобально уникальных идентификаторов bnode (НОВИНКА). Мы можем создавать глобально уникальные идентификаторы для анонимных узлов, добавляя к идентификатору префикс с уникальным идентификатором машины. К сожалению, я не понял, как сказать Jena использовать мой генератор 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» машины A. Таким образом, машине B действительно необходимо сохранять сопоставление идентификаторов анонимных узлов каждой другой машины с ее локальными идентификаторами, а не только удаленных идентификаторов в целом с локальными идентификаторами. При обработке входящих изменений он должен учитывать, откуда пришли изменения, чтобы правильно сопоставить идентификаторы.