首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >RDF4J中ModelBuilder的Jena替代方案

RDF4J中ModelBuilder的Jena替代方案
EN

Stack Overflow用户
提问于 2018-02-20 16:36:59
回答 1查看 552关注 0票数 0

在Apache Jena中有像RDF4J中的ModelBuilder这样的接口吗?

我可以在Jena中看到ModelMaker,但我想这和builder不太一样。以下是需要在Jena中实现的使用rdf4j的函数:

代码语言:javascript
运行
复制
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);
        }
    }
EN

回答 1

Stack Overflow用户

发布于 2018-02-21 10:16:41

我不知道Jena是否具有类似的功能,但您当然可以继续使用RDF4J ModelBuilder,将其输出模型序列化为,比如说,一个海龟或TriG字符串(或文件),然后使用Jena再次读取它。

代码语言:javascript
运行
复制
 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模型并直接转换每个语句(而无需在其间进行序列化和反序列化):

代码语言:javascript
运行
复制
 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的一些内容。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48880884

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档