Для ввода Apache Jena: преобразование из формата CSV в формат RDF

Я собираюсь использовать Apache Jena, и он использует RDF в качестве входного формата. Но у меня есть данные в формате CSV. Я много исследовал и не мог найти способ преобразовать его. Кто-нибудь знает, как это сделать эффективно.

Я использовал такие инструменты, как xml123, но ссылка для скачивания не работала.


person Rajat Agarwal    schedule 23.06.2017    source источник


Ответы (2)


Используя jena-arq и jena-csv (обе версии 3.0.1), у меня работает следующий способ:

public static void main(String ... strings) throws Exception {
    CSV2RDF.init();
    //load through manager:
    //Model m = RDFDataMgr.loadModel("test.csv") ;
    //classic way to load:
    Model m = ModelFactory.createDefaultModel();
    try (InputStream in = JenaCSVTest.class.getResourceAsStream("/test.csv")) {
        m.read(in, "http://example.com", "csv");
    }
    m.setNsPrefix("test", "http://example.com#");
    m.write(System.out, "ttl");
}

Вход (test.csv):

Town,Population
Southton,123000
Northville,654000

Выход (rdf в черепахе):

@prefix test:  <http://example.com#> .

[ test:Population  "123000"^^<http://www.w3.org/2001/XMLSchema#double> ;
  test:Town        "Southton" ;
  <http://w3c/future-csv-vocab/row>
          1
] .

[ test:Population  "654000"^^<http://www.w3.org/2001/XMLSchema#double> ;
  test:Town        "Northville" ;
  <http://w3c/future-csv-vocab/row>
          2
] .

См. официальный документ jena-csv

ОБНОВЛЕНИЕ:

Запуск jena-3.10.0 jena-csv упразднен. Последний выпуск jena-csv — 3.9.0. Вместо этого вы можете использовать любые другие преобразователи csv2rdf. Например, tarql.

Быстрый демонстрационный пример для com.github.tarql:tarql версии v1.2 (получен через jitpack.io - похоже, релиза maven-central нет ):

    Path file = Paths.get(JenaCSVTest.class.getResource("/test.csv").toURI());
    String base = "http://example.com#";
    Model m = ModelFactory.createDefaultModel().setNsPrefix("xsd", XSD.getURI()).setNsPrefix("test", base);
    Graph g = m.getGraph();
    CSVOptions op = new CSVOptions();
    op.setDefaultsForCSV();
    String query = "PREFIX test: <" + base + ">\n" +
            "PREFIX xsd: <" + XSD.getURI() + ">\n" +
            "CONSTRUCT {\n" +
            "  ?Row a test:Row;\n" +
            "    test:town ?town;\n" +
            "    test:population ?population;\n" +
            "} \n" +
            "WHERE {\n" +
            "  BIND (BNODE() AS ?Row)\n" +
            "  BIND (xsd:string(?Town) AS ?town)\n" +
            "  BIND (xsd:integer(?Population) AS ?population)\n" +
            "}";
    TarqlQuery q = new TarqlQuery(QueryFactory.create(query));
    InputStreamSource src = InputStreamSource.fromFilenameOrIRI(file.toUri().toString());
    TarqlQueryExecution qe = TarqlQueryExecutionFactory.create(q, src, op);
    qe.execTriples().forEachRemaining(g::add);
    m.write(System.out, "ttl");

Этот фрагмент сгенерирует следующий RDF:

@prefix test:  <http://example.com#> .
@prefix xsd:   <http://www.w3.org/2001/XMLSchema#> .

[ a                test:Row ;
  test:population  123000 ;
  test:town        "Southton"
] .

[ a                test:Row ;
  test:population  654000 ;
  test:town        "Northville"
] .
person ssz    schedule 23.06.2017
comment
Откуда Tmp1.class? Это зависимость от Йены? Какой правильный импорт необходим? - person Drubio; 07.05.2019
comment
Речь идет о яве, а не о йене. Tmp1 — это имя класса рабочего примера. Пожалуйста, прочитайте javadoc для метода java.lang.Class#getResourceAsStream(String), - person ssz; 07.05.2019

Вы также можете использовать https://github.com/AtomGraph/CSV2RDF, который строит общий график CSV/RDF. а затем преобразует его с помощью запроса SPARQL CONSTRUCT. (Отказ от ответственности: я автор)

person Martynas Jusevičius    schedule 17.08.2019