Java-код для преобразования строкового сообщения в модель Jena
У меня есть строковое сообщение от брокера сообщений AMQP, которое состоит из операторов RDF. Я хочу преобразовать ее в модель Jena с использованием Java, а затем объединить преобразованную модель с другой в одну модель. Как я могу это сделать?
1 ответ
Это можно разделить на три логических шага. Некоторые из них вы, возможно, уже сделали:
- Выделить выражения RDF из не-rdf текста
- Определите синтаксис, используемый для RDF (может быть частью #1)
- Разобрать полученную строку в 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 из первой половины этого ответа по-прежнему имеет отношение к вашему сценарию.