Объединение нескольких документов RDF в один

У меня есть два документа RDF:

  1. http://dublincore.org/2012/06/14/dcterms.rdf
  2. http://xmlns.com/foaf/spec/index.rdf

Я хотел бы объединить их в один файл, например, purl_foaf.rdf. Я работаю на Java; как я могу сделать это с Йеной?


person Petr Dušek    schedule 23.09.2013    source источник
comment
Одним из возможных подходов было бы сделать это с помощью простой (?) таблицы стилей XSLT, используя тот факт, что RDF — это XML.   -  person Stephen C    schedule 23.09.2013
comment
@StephenC Это может сработать, если ваш RDF уже сериализован в сериализации RDF на основе XML, RDF/XML, но это совсем не помогает, если это один из других форматов, например N3 или (гораздо более понятный для человека) Черепаха. Для получения дополнительной информации о том, почему вам не следует пытаться работать с RDF как с XML, см. один из моих прошлых ответов, в котором упоминается эта тема.   -  person Joshua Taylor    schedule 23.09.2013


Ответы (3)


Для этого в Jena есть встроенная утилита командной строки: rdfcat. Итак, чтобы объединить эти два RDF-файла и записать результаты как Turtle в файл purl_foaf.rdf, выполните следующие действия в командной строке. Он должен быть на одной строке, но я разделил его для удобства чтения:

rdfcat -out Turtle "http://dublincore.org/2012/06/14/dcterms.rdf" \
   "http://xmlns.com/foaf/spec/index.rdf" > purl_foaf.rdf
person Ian Dickinson    schedule 23.09.2013

Мне нравится ответ Яна Дикинсона, и если бы мне нужно было сделать это только один раз, я бы использовал rdfcat Джены. Вы упомянули, что вам нужно сделать это на Java, поэтому, возможно, инструмент командной строки не подходит. Это по-прежнему довольно легко сделать с помощью Jena API. Если у вас есть только две модели, вы можете создать UnionModel из двух или, если у вас их больше (возможно, две в вопросе — это просто сокращенный случай, и вам действительно нужно обрабатывать больше), вы можете просто создать новую модель для хранения всех троек и добавления троек из двух моделей к новой. Вот код, который показывает каждый подход:

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.ModelFactory;

public class ManualRDFCat {
    public static void main(String[] args) throws FileNotFoundException, IOException {
        final Model dcterms = ModelFactory.createDefaultModel().read( "http://dublincore.org/2012/06/14/dcterms.rdf" );
        final Model foafIndex = ModelFactory.createDefaultModel().read( "http://xmlns.com/foaf/spec/index.rdf" );

        // If you only have two models, you can use Union model.
        final Model union = ModelFactory.createUnion( dcterms, foafIndex );
        try ( final OutputStream out1 = new FileOutputStream( new File( "/tmp/purl_foaf1.rdf" )) ) {
            union.write( out1, "Turtle", null );
        }

        // In general, though, it's probably better to just create a new model to 
        // hold all the triples, and to add the triples to that model.
        final Model blob = ModelFactory.createDefaultModel();
        for ( final Model part : new Model[] { dcterms, foafIndex } ) {
            blob.add( part );
        }
        try ( final OutputStream out2 = new FileOutputStream( new File( "/tmp/purl_foaf2.rdf" )) ) {
            blob.write( out2, "RDF/XML-ABBREV", null );
        }
    }
}
person Joshua Taylor    schedule 23.09.2013

На всякий случай, если вы искали rdfcat, как я, rdfcat устарел. Если у вас установлены инструменты командной строки Jena, вам просто нужно использовать riot. Параметры также изменились, полный список параметров находится здесь. Базовое слияние из командной строки:

riot --time --output=RDF/JSON city.rdf company.ttl country.rdf > output.js
person Artemis    schedule 01.10.2015