【问题标题】:For Apache Jena input: Conversion from CSV to RDF Format对于 Apache Jena 输入:从 CSV 转换为 RDF 格式
【发布时间】:2017-06-23 09:18:56
【问题描述】:

我将使用 Apache Jena,它采用 RDF 作为输入格式。但我有 CSV 格式的数据。我研究了很多,找不到转换它的方法。有谁知道如何有效地做到这一点。

我已经使用了 xml123 之类的工具,但下载链接不起作用。

【问题讨论】:

    标签: converter rdf jena rdfs apache-jena


    【解决方案1】:

    使用 jena-arq 和 jena-csv(均为 v3.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
    

    输出(turtle 中的 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");
    

    这个sn-p会生成如下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"
    ] .
    

    【讨论】:

    • Tmp1.class 来自哪里?它是耶拿的依赖吗?需要哪个正确的导入?
    • 这是关于 java,而不是 jena。 Tmp1 是工作示例类的名称。请阅读 java.lang.Class#getResourceAsStream(String) 方法的 javadoc,
    【解决方案2】:

    您还可以使用 https://github.com/AtomGraph/CSV2RDF 构建通用 CSV/RDF 图,然后使用 SPARQL CONSTRUCT 查询对其进行转换。 (免责声明:我是作者)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-31
      • 1970-01-01
      相关资源
      最近更新 更多