Альтернатива Йене ModelBuilder в RDF4J
Есть ли какой-то интерфейс, доступный в Apache Jena, например ModelBuilder
в RDF4J?
я могу видеть ModelMaker
в Йене, но это не то, что похоже на застройщика. Ниже приведена функция, использующая rdf4j, которая должна быть реализована в Йене:
public static org.eclipse.rdf4j.model.Model convertGraph2RDFModel(Graph graph, String label) {
ModelBuilder builder = new ModelBuilder();
GraphTraversalSource t = graph.traversal();
GraphTraversal<Vertex, Vertex> hasLabel = t.V().hasLabel(label);
Vertex s;
if(hasLabel.hasNext()){
s = hasLabel.next();
extractModelFromVertex(builder, s);
}
return builder.build();
}
private static void extractModelFromVertex(ModelBuilder builder, Vertex s) {
builder.subject(s.label());
Iterator<VertexProperty<String>> propertyIter = s.properties();
while (propertyIter.hasNext()){
VertexProperty<String> property = propertyIter.next();
builder.add(property.label(), property.value());
}
Iterator<Edge> edgeIter = s.edges(Direction.OUT);
Edge edge;
Stack<Vertex> vStack = new Stack<Vertex>();
while(edgeIter.hasNext()){
edge = edgeIter.next();
s = edge.inVertex();
builder.add(edge.label(), s.label());
vStack.push(s);
}
Iterator<Vertex> vIterator = vStack.iterator();
while(vIterator.hasNext()){
s = vIterator.next();
extractModelFromVertex(builder,s);
}
}
1 ответ
Я не знаю, имеет ли Jena схожую функциональность, но вы, конечно, могли бы просто продолжать использовать RDF4J ModelBuilder, сериализовать его выходную модель, скажем, в строку (или файл) Turtle или TriG, а затем использовать Jena, чтобы снова прочитать ее.
org.eclipse.rdf4j.model.Model m = ...; // RDF4J Model built by the ModelBuilder
java.io.Writer writer = new StringWriter();
org.eclipse.rdf4j.rio.Rio.write(m, writer, RDFFormat.TRIG);
String = writer.toString();
// Use Jena's parser to read the string back in.
Или, в качестве альтернативы, просто переберите модель RDF4J и преобразуйте каждый оператор напрямую (без сериализации и десериализации между ними):
org.eclipse.rdf4j.model.Model rdf4jModel = ...; // RDF4J Model built by the ModelBuilder
org.apache.jena.rdf.model.Model jenaModel = ...; // (empty) Jena model to receive converted rdf4j model
rdf4jModel.forEach(stmt -> jenaModel.add(convert(stmt)));
...
public org.apache.jena.rdf.model.Statement convert(
org.eclipse.rdf4j.model.Statement stmt) {
... // create a Jena statement from the RDF4J one.
}
Я признаю, что в большинстве приложений, вероятно, проще остановиться на использовании единого фреймворка, но нет никакой фундаментальной причины, по которой вы не можете использовать биты RDF4J и Jena в комбинации.