0

我使用 Jena API 创建了一个本体,其中包含以下类和 DataType 属性:

public class Onto {
 OntClass USER,...;

 OntModel model;

        String uriBase;
        DatatypeProperty Name,Surname,..;
 ObjectProperty has_EDUCATION_LEVEL;
public Onto (){
            model = ModelFactory.createOntologyModel( OntModelSpec.OWL_MEM_MICRO_RULE_INF );
            uriBase = "http://www.something.com/";
            model.createOntology(uriBase);

            //Classes
 USER=model.createClass(uriBase+"USER");

...

   //DatatTypesProperties   
            Name= model.createDatatypeProperty(uriBase+"Name"); 
            Name.setDomain(USER_AUTNENTIFICATION);
            Name.setRange(XSD.xstring);

Surname= model.createDatatypeProperty(uriBase+"Surname"); 
            Surname.setDomain(USER_AUTNENTIFICATION);
            Surname.setRange(XSD.xstring);
...

   //ObjectProperties
            has_EDUCATION_LEVEL= model.createObjectProperty(uriBase+"has_EDUCATION_LEVEL");
            has_EDUCATION_LEVEL.setDomain(USER);
            has_EDUCATION_LEVEL.setRange(EDUCATION_LEVEL);}

然后我创建了“USER”类的实例,我在其中插入了一些数据类型属性“Name”和“Surname”通过Web 的值。我的代码输出是一个 .owl 文件。但是当我用 Protege 阅读它时,我发现我所有的 Data Properties ,我的 Object Properties 甚至我的类都包含两个前缀 j.1 和 j.0 。这是我在 OWL 文件中的实例的代码:

 <j.1:USER rdf:about="http://www.something.com/#Jhon">
    <j.0:has_EDUCATION_LEVEL rdf:resource="http://www.something.com/HIGH_EDUCATION_LEVEL"/>
    <j.0:Surname>Smith</j.0:Surname>
    <j.0:Name>Jhon</j.0:Name>
  </j.1:USER>

我会感谢任何帮助或建议

4

1 回答 1

2

您将在 RDF/XML 文档开头的某处看到前缀j.1j.0已适当定义,因此http://www.something.com/has_EDUCATION_LEVELj.0:has_EDUCATION_LEVEL. Jena 没有做任何改变属性 URI 的事情,所以如果您重新读入您的模型,或者将其发送给其他人,他们仍然会看到完全相同的数据。使用的前缀只对阅读 XML 文本的人有意义。

也就是说,Jena 模型是PrefixMapping,因此您可以使用它setNsPrefix来定义在编写模型时将使用的名称和前缀。这是一个示例,大致基于您提供的数据:

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;

public class PrefixDemo {
  public static void main(String[] args) {
    Model model = ModelFactory.createDefaultModel();
    String base = "http://www.something.com/";

    Resource john = model.createResource( base + "John" );
    Property hasSurname = model.createProperty( base + "hasSurname" );

    model.add( john, hasSurname, "Smith" );

    // Before defining a prefix
    model.write( System.out, "RDF/XML" );

    // After defining a prefix
    model.setNsPrefix( "something", base );
    model.write( System.out, "RDF/XML" );
  }
}

输出(模型之间有一个额外的换行符)是:

<rdf:RDF
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:j.0="http://www.something.com/" > 
  <rdf:Description rdf:about="http://www.something.com/John">
    <j.0:hasSurname>Smith</j.0:hasSurname>
  </rdf:Description>
</rdf:RDF>

<rdf:RDF
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:something="http://www.something.com/" > 
  <rdf:Description rdf:about="http://www.something.com/John">
    <something:hasSurname>Smith</something:hasSurname>
  </rdf:Description>
</rdf:RDF>

第一次打印模型时,您会看到自动生成的命名空间前缀j.0。但是,当我们显式定义前缀时,它会被使用,如第二个示例所示。

于 2013-05-17T02:45:42.043 回答