Этот вопрос относится к вопросу rcreswick на Serializing Jena OntModel Changes. У меня есть модели Jena на двух (или более) машинах, которые должны оставаться синхронизированными по сокетам. Основная проблема, которую мне нужно решить, состоит в том, что модели могут содержать анонимные узлы (bnodes), которые могут возникнуть в любой из моделей.Синхронизация Jena OntModels с bnodes
Вопрос: Я нахожусь на правильном пути здесь, или есть лучший, более надежный подход, который я не считаю?
я могу думать о 3-х подходах к этой проблеме:
- Serialize полная модель: Это слишком дорого для синхронизации небольших обновлений. Кроме того, поскольку изменения могут произойти на любой машине, я не могу просто заменить модель машины B сериализованной моделью на машине A. Мне нужно объединить их.
- Сериализация частичной модели: Используйте специальную модель для сериализации, которая содержит только те изменения, которые необходимо отправить по сокету. Этот подход требует, чтобы специальный словарь представлял заявления, которые были удалены . Предположительно, когда я сериализую модель с машины A на машину B, анонимные идентификаторы узлов будут уникальными для машины A, но могут перекрываться с идентификаторами для анонимных узлов, созданных на машине B. Поэтому мне придется переименовать анонимные узлы и сохранить сопоставление от идентификаторов anon машины A до идентификаторов машины B, чтобы корректно обрабатывать будущие изменения.
- Сериализация отдельных заявлений: Этот подход не требует специального словаря, но может быть не таким надежным. Есть ли проблемы, кроме анонимных узлов, которые я еще не встречал?
- Генерировать глобально уникальные идентификаторы bnode (NEW): Мы можем генерировать глобально уникальные идентификаторы для анонимных узлов, префикс ID с уникальным идентификатором машины. К сожалению, я не понял how to tell Jena to use my ID generator вместо своего. Это позволило бы сериализовать отдельные заявления без переназначения идентификаторов bnode.
Вот пример, чтобы обсудить это обсуждение немного подробнее. Предположим, у меня есть список на машине представляемого как:
_:a rdf:first myns:tom
_:a rdf:rest rdf:nil
сериализовать эту модель из машины А в машине В. Теперь, потому что машина 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 никогда не сталкивался идентификатор машины А в 'б' прежде, добавляет новое отображение из машины A id 'b' на новый идентификатор '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 действительно необходимо сохранить карту от каждого из анонимных идентификаторов узлов других компьютеров до ее локальных идентификаторов, а не только от удаленных идентификаторов в целом до локальных идентификаторов. При обработке входящих изменений он должен учитывать, где были внесены изменения, чтобы правильно отображать идентификаторы.
Спасибо за ваш ответ! Мы имеем дело с этой проблемой изоморфизма, ограничивая каждую машину определенной частью онтологии. Возвращаясь к вашему примеру, человек A может работать в списке клиентов, в то время как человек B несет ответственность за управление инвентарем. Наш домен также имеет четко определенные уникальные идентификаторы для соответствующих объектов. Проблема заключается в том, что человек A может добавить узел списка в список клиентов, который, случается, перекрывается с идентификатором bnode в списке поставщиков удобрений. –