首页 文章

Jena 替代 RDF4J 中的 ModelBuilder

提问于
浏览
0

Apache Jena 中是否有一些接口可用,例如 RDF4J 中的ModelBuilder

我可以在耶拿看到ModelMaker,但这与我认为的建造者不相似。以下是需要在 Jena 中实现的使用 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 回答

  • 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。

相关问题