Java-код для преобразования строкового сообщения в модель Jena

У меня есть строковое сообщение от брокера сообщений AMQP, которое состоит из операторов RDF. Я хочу преобразовать ее в модель Jena с использованием Java, а затем объединить преобразованную модель с другой в одну модель. Как я могу это сделать?

1 ответ

Решение

Это можно разделить на три логических шага. Некоторые из них вы, возможно, уже сделали:

  1. Выделить выражения RDF из не-rdf текста
  2. Определите синтаксис, используемый для RDF (может быть частью #1)
  3. Разобрать полученную строку в Apache Jena Model,

Поскольку первые два относятся к конкретному домену, вы вряд ли найдете здесь большую помощь, если не предоставите пример ввода. Кроме того, это, вероятно, будет рассматриваться как отдельный вопрос (например, "как я могу разбить строку на основе наличия синтаксиса RDF?")

В-третьих, это чрезвычайно быстро и легко сделать. Давайте предположим, что у вас есть документ в N-Triples Формат, который вы извлекли из остальной части вашего текста. Следующий тест JUnit демонстрирует способность анализировать это и взаимодействовать с его содержимым.

final String nTriplesDoc = "<urn:ex:s> <urn:ex:p> <urn:ex:o> . ";

final Model model = ModelFactory.createDefaultModel();
try( final InputStream in = new ByteArrayInputStream(nTriplesDoc.getBytes("UTF-8")) ) {
    /* Naturally, you'd substitute the syntax of your actual
     * content here rather than use N-TRIPLE.
     */
    model.read(in, null, "N-TRIPLE");
}

final Resource s = ResourceFactory.createResource("urn:ex:s");
final Property p = ResourceFactory.createProperty("urn:ex:p");
final Resource o = ResourceFactory.createResource("urn:ex:o");
assertTrue( model.contains(s,p,o) );

Редактировать / Часть II

Увидев ваш комментарий, я счел целесообразным добавить еще одну заметку о слиянии моделей. В Jena вы можете объединять модели, складывая все их тройки вместе. Это может создать некоторые оставшиеся модели, которые в конечном итоге будут собирать мусор, что не обязательно является лучшим сценарием для вашей системы.

final Model model0 = ModelFactory.create();
// Add things to model 0...
final Model model1 = ModelFactory.create();
// Add things to model 1...

final Model merger = ModelFactory.create();
merger.add(model0);
merger.add(model1);

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

final Model union = ModelFactory.createModelForGraph( new Union(model0.getGraph(), model1.getGraph()) );

Я также оставляю предположение, что вы можете получить String объекты с вашего сервера AMQP, так что № 3 из первой половины этого ответа по-прежнему имеет отношение к вашему сценарию.

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