В Йене нет встроенного способа конвертировать TSV в RDF, поскольку TSV (как и CSV) не является форматом для RDF,
скорее для любых данных, которые представимы в форме таблицы.
Возможно, по этой причине поддержка CSV была удалена из Jena (последняя версия jena-csv - 3.9.0).
Но TSV - t ab s разделено v alues - это очень простой формат.
А преобразование данных TSV в RDF - действительно простая задача (кодирование около 10 минут).
Вы можете делать все что угодно с TSV, например, вы можете просто добавить все TSV в виде огромного литерала.
Но следующий способ демонстрирует разумный подход, при котором каждая строка является индивидом OWL с утверждениями о свойстве данных.
String tsv = "Sepal length\tSepal width\tPetal length\tPetal width\tSpecies\n" +
"5.1\t3.5\t1.4\t0.2\tI. setosa\n" +
"4.9\t3.0\t1.4\t0.2\tI. setosa";
Charset ch = StandardCharsets.UTF_8;
String separator = "\t";
String ns = "http://ex#";
UnaryOperator<String> nameToURI = s -> ns + s.toLowerCase().replace(" ", "_");
Model m = ModelFactory.createDefaultModel()
.setNsPrefixes(PrefixMapping.Standard)
.setNsPrefix("ex", ns);
Resource clazz = m.createResource(ns + "MyClass", OWL.Class);
try (InputStream is = new ByteArrayInputStream(tsv.getBytes(ch));
Reader r = new InputStreamReader(is, ch);
BufferedReader br = new BufferedReader(r)) {
String first = br.lines().findFirst().orElseThrow(IllegalArgumentException::new);
List<Property> props = Arrays.stream(first.split(separator))
.map(s -> m.createResource(nameToURI.apply(s), OWL.DatatypeProperty)
.addProperty(RDFS.label, s).as(Property.class))
.collect(Collectors.toList());
br.lines().forEach(line -> {
String[] data = line.split(separator);
if (data.length != props.size()) throw new IllegalArgumentException();
Resource individual = m.createResource(clazz);
for (int i = 0; i < data.length; i++) {
individual.addProperty(props.get(i), data[i]);
}
});
}
m.write(System.out, "ttl");
Выход:
@prefix ex: <http://ex#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix dc: <http://purl.org/dc/elements/1.1/> .
ex:MyClass a owl:Class .
ex:sepal_width a owl:DatatypeProperty ;
rdfs:label "Sepal width" .
ex:species a owl:DatatypeProperty ;
rdfs:label "Species" .
ex:sepal_length a owl:DatatypeProperty ;
rdfs:label "Sepal length" .
ex:petal_length a owl:DatatypeProperty ;
rdfs:label "Petal length" .
ex:petal_width a owl:DatatypeProperty ;
rdfs:label "Petal width" .
[ a ex:MyClass ;
ex:petal_length "1.4" ;
ex:petal_width "0.2" ;
ex:sepal_length "5.1" ;
ex:sepal_width "3.5" ;
ex:species "I. setosa"
] .
[ a ex:MyClass ;
ex:petal_length "1.4" ;
ex:petal_width "0.2" ;
ex:sepal_length "4.9" ;
ex:sepal_width "3.0" ;
ex:species "I. setosa"
] .