【问题标题】:Writing nested rdf:Description elements in RDF/XML with Jena使用 Jena 在 RDF/XML 中编写嵌套的 rdf:Description 元素
【发布时间】:2014-06-10 10:44:30
【问题描述】:

我想要一个这样的文件:

<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns="http://stackoverflow.com/q/24084473/1281433/"
    xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
    xmlns:j.0="http://stackoverflow.com/q/24084473/1281433/relations/">
  <rdf:Property rdf:about="http://stackoverflow.com/q/24084473/1281433/Regione">
    <rdfs:label>Regione</rdfs:label>
  </rdf:Property>
  <rdf:Property rdf:about="http://stackoverflow.com/q/24084473/1281433/Nome">
    <rdfs:label>Nome</rdfs:label>
  </rdf:Property>
  <rdf:Description rdf:about="http://stackoverflow.com/q/24084473/1281433/soggetto">
    <j.0:Nome>Vercelli</j.0:Nome>
    <j.0:Regione>
      <rdf:Description rdf:about="http://stackoverflow.com/q/24084473/1281433/Piemonte">
        <rdfs:label>Piemonte</rdfs:label>
      </rdf:Description>
    </j.0:Regione>
  </rdf:Description>
  <rdf:Description rdf:about="http://stackoverflow.com/q/24084473/1281433/Vercelli">
    <rdfs:label>Vercelli</rdfs:label>
  </rdf:Description>
</rdf:RDF>

我特别想知道如何用 Java 代码(使用 Jena 库)编写以下部分:

<rdf:Description rdf:about="http://stackoverflow.com/q/24084473/1281433/soggetto">
    <j.0:Nome>Vercelli</j.0:Nome>
    <j.0:Regione>
      <rdf:Description rdf:about="http://stackoverflow.com/q/24084473/1281433/Piemonte">
        <rdfs:label>Piemonte</rdfs:label>
      </rdf:Description>
    </j.0:Regione>
  </rdf:Description>

我在文献中看到,&lt;rdf:Description rdf:about="http://stackoverflow.com/q/24084473/1281433/Piemonte"&gt; 对象(或资源?)是一个空白节点,但我不知道怎么写。我尝试使用以下代码:

public Model BlankNodeCode (Model model){
  Model model1 = model;
  StmtIterator stmt = model.listStatements();
  while (stmt.hasNext()){
    Statement statement = stmt.next();
    Resource subject = statement.getSubject();
    Property pred = statement.getPredicate();
    RDFNode object = statement.getObject();
    Object res = null;
    @SuppressWarnings("unchecked")
    Resource resource = object.as((Class<Resource>) res);
    model1.createResource(subject).addProperty(pred,model1.createResource(resource));
  }
  return model1;
}

但我得到一个例外:

Exception in thread "main" java.lang.NullPointerException
    at com.hp.hpl.jena.enhanced.Polymorphic.findExistingView(Polymorphic.java:75)
    at com.hp.hpl.jena.enhanced.Polymorphic.asInternal(Polymorphic.java:61)
    at com.hp.hpl.jena.enhanced.EnhNode.as(EnhNode.java:107)

我在这里做错了什么?

【问题讨论】:

    标签: java rdf jena semantic-web rdfs


    【解决方案1】:

    在你标注的部分:

    <rdf:Description rdf:about="http://stackoverflow.com/q/24084473/1281433/soggetto">
        <j.0:Nome>Vercelli</j.0:Nome>
        <j.0:Regione>
          <rdf:Description rdf:about="http://stackoverflow.com/q/24084473/1281433/Piemonte">
            <rdfs:label>Piemonte</rdfs:label>
          </rdf:Description>
        </j.0:Regione>
      </rdf:Description>
    

    没有空白节点。只有三个三元组:

    <http://.../soggetto>   j.0:Nome      "Vercelli" .
    <http://.../soggetto>   j.0:Regione   <http://.../Piemonte> .
    <http://.../Piemonte>   rdfs:label    "Piemonte" .
    

    这里是重现此模型的 Java 代码:

    import org.apache.jena.riot.Lang;
    import org.apache.jena.riot.RDFDataMgr;
    
    import com.hp.hpl.jena.rdf.model.Model;
    import com.hp.hpl.jena.rdf.model.ModelFactory;
    import com.hp.hpl.jena.rdf.model.Property;
    import com.hp.hpl.jena.rdf.model.Resource;
    import com.hp.hpl.jena.vocabulary.RDFS;
    
    
    public class RegioneExample {
        public static void main(String[] args) {
            String ns = "http://stackoverflow.com/q/24084473/1281433/";
    
            Model model = ModelFactory.createDefaultModel();
    
            Resource soggetto = model.createResource( ns+"soggetto" );
            Resource piemonte = model.createResource( ns+"Piemonte" );
    
            Property nome = model.createProperty( ns+"Nome" );
            Property regione = model.createProperty( ns+"Regione" );
    
            soggetto.addProperty( nome, "Vercelli" );
            soggetto.addProperty( regione, piemonte );
            piemonte.addProperty( RDFS.label, "Piemonte" );
    
            RDFDataMgr.write( System.out, model, Lang.RDFXML );
        }
    }
    

    输出:

    <rdf:RDF
        xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
        xmlns:j.0="http://stackoverflow.com/q/24084473/1281433/"
        xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#">
      <rdf:Description rdf:about="http://stackoverflow.com/q/24084473/1281433/soggetto">
        <j.0:Regione>
          <rdf:Description rdf:about="http://stackoverflow.com/q/24084473/1281433/Piemonte">
            <rdfs:label>Piemonte</rdfs:label>
          </rdf:Description>
        </j.0:Regione>
        <j.0:Nome>Vercelli</j.0:Nome>
      </rdf:Description>
    </rdf:RDF>
    

    【讨论】:

    • stackoverflow.com/q/24084473/1281433/Piemonte"> 资源中的 stackoverflow.com/q/24084473/1281433/soggetto"> 资源是什么?在网上阅读,我以为是一个空白节点。我如何用 Java 代码编写这一部分?
    • rdf:Description 始终代表资源。如果它没有rdf:aboutrdf:ID,那么它是一个代表一个空白节点。如果它具有rdf:aboutrdf:ID,则该属性的值用于指示资源的 URI。
    • 查看代码更新。我认为这很简单耶拿代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多