【问题标题】:RDF/XML how to define RDFS classes,subclasses and link them as a typeRDF/XML 如何定义 RDFS 类、子类并将它们链接为一个类型
【发布时间】:2026-02-18 15:00:01
【问题描述】:

我们如何在 Jena 中定义类和子类,然后将它们添加为其他资源的类型? 我使用 Java、Jena 和 RDF/XML 表示法。我想创建类似的东西:

<rdfs:Class rdf:about="http://www.help.me/NS/Classname"/>
<rdfs:Class rdf:about="http://www.help.me/NS/Subclassname">
    <rdfs:subClassOf rdf:resource="http://www.help.me/NS/Classname"/>
</rdfs:Class>

之后:将资源链接到子类:

<rdf:Description rdf:about="http://www.help.me/NS/NewResource">
    <rdf:type rdf:resource="http://www.help.me/NS/Subclassname"/>
    ...
</rdf:Description>

编辑:

到目前为止,我找到了如何定义一个类:

model.createResource("http://www.help.me/NS/", RDFS.Class);

【问题讨论】:

    标签: java rdf jena rdfs


    【解决方案1】:

    一般来说,您应该阅读 Model 的 javadoc 以及与之相关的类和接口(例如,资源)。你不需要记住所有的细节,但至少要熟悉它们提供的方法类型,这样你就会知道如何完成某事。我建议您阅读 OntModel 及其相关的类和接口(例如,Individual)。

    创建子类

    您可以通过直接向模型添加语句或向资源添加属性来创建子类关系,或者,如果您使用 OntModel 和 OntClasses,则使用 addSubClass 和 addSuperClass 方法。

    import com.hp.hpl.jena.ontology.OntClass;
    import com.hp.hpl.jena.ontology.OntModel;
    import com.hp.hpl.jena.ontology.OntModelSpec;
    import com.hp.hpl.jena.rdf.model.Model;
    import com.hp.hpl.jena.rdf.model.ModelFactory;
    import com.hp.hpl.jena.rdf.model.Resource;
    import com.hp.hpl.jena.vocabulary.RDFS;
    
    public class AddTypesExample {
        final private static String NS = "http://*.com/q/20222080/1281433/";
    
        public static void main( String[] args ) {
            subclassModel().write( System.out, "RDF/XML" );
            System.out.println();
            subclassOntModel().write( System.out, "RDF/XML" );
        }
    
        public static Model subclassModel() {
            final Model model = ModelFactory.createDefaultModel();
            final Resource classA = model.createResource( NS+"A" );
            final Resource classB = model.createResource( NS+"B" );
            final Resource classC = model.createResource( NS+"C" );
            classB.addProperty( RDFS.subClassOf, classA );
            model.add( classC, RDFS.subClassOf, classA );
            return model;
        }
    
        public static OntModel subclassOntModel() { 
            final OntModel model = ModelFactory.createOntologyModel( OntModelSpec.RDFS_MEM );
            final OntClass a = model.createClass( NS+"A" );
            final OntClass b = model.createClass( NS+"B" );
            final OntClass c = model.createClass( NS+"C" );
            a.addSubClass( b );
            c.addSuperClass( a );
            return model;
        }
    }
    
    <!-- the plain Model -->
    <rdf:RDF
        xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
        xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" > 
      <rdf:Description rdf:about="http://*.com/q/20222080/1281433/C">
        <rdfs:subClassOf rdf:resource="http://*.com/q/20222080/1281433/A"/>
      </rdf:Description>
      <rdf:Description rdf:about="http://*.com/q/20222080/1281433/B">
        <rdfs:subClassOf rdf:resource="http://*.com/q/20222080/1281433/A"/>
      </rdf:Description>
    </rdf:RDF>
    
    <!-- the OntModel -->
    <rdf:RDF
        xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
        xmlns:owl="http://www.w3.org/2002/07/owl#"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
        xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" > 
      <rdf:Description rdf:about="http://*.com/q/20222080/1281433/C">
        <rdfs:subClassOf rdf:resource="http://*.com/q/20222080/1281433/A"/>
        <rdf:type rdf:resource="http://www.w3.org/2000/01/rdf-schema#Class"/>
      </rdf:Description>
      <rdf:Description rdf:about="http://*.com/q/20222080/1281433/B">
        <rdfs:subClassOf rdf:resource="http://*.com/q/20222080/1281433/A"/>
        <rdf:type rdf:resource="http://www.w3.org/2000/01/rdf-schema#Class"/>
      </rdf:Description>
      <rdf:Description rdf:about="http://*.com/q/20222080/1281433/A">
        <rdf:type rdf:resource="http://www.w3.org/2000/01/rdf-schema#Class"/>
      </rdf:Description>
    </rdf:RDF>
    

    向资源(或个人)添加类型

    不过,在这种情况下,您已经使用了一些可用于向资源添加类型的方法,因此您已经回答了自己的问题。创建资源时,可以指定类型。例如,得到 ​​p>

    <rdf:Description rdf:about="http://www.help.me/NS/NewResource">
        <rdf:type rdf:resource="http://www.help.me/NS/Subclassname"/>
        ...
    </rdf:Description>
    

    你可以这样做:

    model.createResource( "http://www.help.me/NS/NewResource",
                          model.createResource( "http://www.help.me/NS/Subclassname" ));
    

    更一般地说,看看这样的代码:

    import com.hp.hpl.jena.rdf.model.Model;
    import com.hp.hpl.jena.rdf.model.ModelFactory;
    import com.hp.hpl.jena.rdf.model.Resource;
    import com.hp.hpl.jena.vocabulary.RDF;
    
    public class AddTypesExample {
        public static void main(String[] args) {
            final String NS = "http://*.com/q/20222080/1281433/";
            final Model model = ModelFactory.createDefaultModel();
    
            final Resource classA = model.createResource( NS+"A" );
            final Resource classB = model.createResource( NS+"B" );
            final Resource classC = model.createResource( NS+"C" );
            final Resource classD = model.createResource( NS+"D" );
    
            // You can create a resource with a specified type.
            final Resource x = model.createResource( NS+"x", classA );
    
            // And subsequent calls to createResource will add more types.
            model.createResource( NS+"x", classB );
    
            // You could also add the type to the resource
            x.addProperty( RDF.type, classC );
    
            // Or add the statement to the model
            model.add( x, RDF.type, classD );
    
            model.write( System.out, "RDF/XML" );
        }
    }
    

    作为输出产生:

    <rdf:RDF
        xmlns:j.0="http://*.com/q/20222080/1281433/"
        xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" > 
      <rdf:Description rdf:about="http://*.com/q/20222080/1281433/x">
        <rdf:type rdf:resource="http://*.com/q/20222080/1281433/D"/>
        <rdf:type rdf:resource="http://*.com/q/20222080/1281433/C"/>
        <rdf:type rdf:resource="http://*.com/q/20222080/1281433/B"/>
        <rdf:type rdf:resource="http://*.com/q/20222080/1281433/A"/>
      </rdf:Description>
    </rdf:RDF>
    

    如果你使用的是OntModel,你可以使用createIndividual创建一个指定类型的新个体,你可以使用它的addRDFType方法添加另一个类型,你也可以从一个OntClass 对象:

    public static void main( String[] args ) {
        final OntModel ontModel = ModelFactory.createOntologyModel( OntModelSpec.RDFS_MEM );
        ontModel.setNsPrefix( "so", NS );
        final OntClass classA = ontModel.createClass( NS+"A" );
        final OntClass classB = ontModel.createClass( NS+"B" );
        final OntClass classC = ontModel.createClass( NS+"C" );
    
        final Individual x = ontModel.createIndividual( NS+"x", classA );
        x.addRDFType( classB );
        classC.createIndividual( NS+"x" );
    
        ontModel.write( System.out, "RDF/XML" );
    }
    
    <rdf:RDF
        xmlns:so="http://*.com/q/20222080/1281433/"
        xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
        xmlns:owl="http://www.w3.org/2002/07/owl#"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
        xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" > 
      <rdf:Description rdf:about="http://*.com/q/20222080/1281433/C">
        <rdf:type rdf:resource="http://www.w3.org/2000/01/rdf-schema#Class"/>
      </rdf:Description>
      <rdf:Description rdf:about="http://*.com/q/20222080/1281433/B">
        <rdf:type rdf:resource="http://www.w3.org/2000/01/rdf-schema#Class"/>
      </rdf:Description>
      <rdf:Description rdf:about="http://*.com/q/20222080/1281433/x">
        <rdf:type rdf:resource="http://*.com/q/20222080/1281433/C"/>
        <rdf:type rdf:resource="http://*.com/q/20222080/1281433/B"/>
        <rdf:type rdf:resource="http://*.com/q/20222080/1281433/A"/>
      </rdf:Description>
      <rdf:Description rdf:about="http://*.com/q/20222080/1281433/A">
        <rdf:type rdf:resource="http://www.w3.org/2000/01/rdf-schema#Class"/>
      </rdf:Description>
    </rdf:RDF>
    

    【讨论】:

    • 哇,这么多方法。我创建了类,但如何创建子类 (RDFS.subClassOf)?
    • @user2692669 我发布了显示它工作的代码……你能把你的代码展示在它不工作的地方吗?我敢打赌你错过了什么……
    • @user2692669 抱歉,在回复您的第二条评论之前,我没有看到您的第一条评论。我可以用如何创建子类来更新问题,但我会再次指出,如果您通读文档,这在文档中非常清楚。
    • 您指的是哪个文档,也许我正在查看“错误”的文档。这比文档(老实说,或者互联网上的任何材料)要好得多。
    • @user2692669 我的意思是您正在使用的类的 Javadoc。您显然对Model 足够熟悉,可以使用它的一些功能。它的一些方法返回Resources,Javadoc 链接到Resource 接口,它有一堆有用的方法。至少浏览一下文档/手册/等几乎总是一个好主意。与软件库相关联,让您稍微熟悉它所包含的内容。当然,你不会一个字一个字地记住它,但你读得够多了……