对于 Apache Jena 输入:从 CSV 格式转换为 RDF 格式
For Apache Jena input: Conversion from CSV to RDF Format
我将使用 Apache Jena,它采用 RDF 作为输入格式。但我有 CSV 格式的数据。我研究了很多,但找不到转换它的方法。有谁知道如何有效地做到这一点。
我已经使用了 xml123 等工具,但下载 link 无法正常工作。
使用 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
输出(海龟中的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"
] .
您还可以使用 https://github.com/AtomGraph/CSV2RDF 构建通用 CSV/RDF 图,然后使用 SPARQL CONSTRUCT
查询对其进行转换。 (免责声明:我是作者)
我将使用 Apache Jena,它采用 RDF 作为输入格式。但我有 CSV 格式的数据。我研究了很多,但找不到转换它的方法。有谁知道如何有效地做到这一点。
我已经使用了 xml123 等工具,但下载 link 无法正常工作。
使用 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
输出(海龟中的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"
] .
您还可以使用 https://github.com/AtomGraph/CSV2RDF 构建通用 CSV/RDF 图,然后使用 SPARQL CONSTRUCT
查询对其进行转换。 (免责声明:我是作者)