1

最近,我正在尝试使用 Jena 来处理语义网来创建 RDF 并进行查询。现在,我已经成功地在 Jena 中制作了一个基于 owl 的 RDF 文件。但是,当我尝试使用不同的本体(例如:cidoc-crm)时,我不知道如何将这些本体导入 Jena。有谁知道如何将它们导入耶拿?我需要创建一个新的本体模型吗?

4

1 回答 1

3

Jena 的OntModel接口提供了一种使用本体(包括 RDFS 本​​体)的便捷方式。以下代码展示了如何获取包含本体数据的 OntModel。然后,在此代码中,我创建了另一个具有推理支持的 OntModel,其中包括我创建的 CIDOC 模型。使用推理模型,很容易创建个体并查看他们的计算类型,或者查看推理模型派生的子类关系。

import com.hp.hpl.jena.ontology.Individual;
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.ModelFactory;
import com.hp.hpl.jena.rdf.model.Resource;
import com.hp.hpl.jena.util.iterator.ExtendedIterator;

public class CIDOCExample {

    final static String CIDOCNS = "http://www.cidoc-crm.org/cidoc-crm/";

    public static void main( String[] args ) {
        // Load the CIDOC-CRM into an OntModel.  We won't add any reasoning capability to this model, but
        // we'll use it as a submodel of OntModels that do.  Jena can pull the document from the web, but
        // you could also download a local copy and read that.  It would certainly a bit quicker than 
        // downloading it every time.
        final OntModel cidocModel = ModelFactory.createOntologyModel( OntModelSpec.RDFS_MEM );
        cidocModel.read( "http://www.cidoc-crm.org/rdfs/cidoc_crm_v5.1-draft-2013May.rdfs" );

        // Create an OntModel that imports the cidocModel, and give it inference support.
        final OntModel model = ModelFactory.createOntologyModel( OntModelSpec.RDFS_MEM_RDFS_INF );
        model.addSubModel( cidocModel );

        // Retrieve a class from the OntModel and shows its subclasses.
        final OntClass e5_event = model.getOntClass( CIDOCNS+"E5_Event" );
        System.out.println( "Subclasses of E5_Event:" );
        for ( final ExtendedIterator<OntClass> it = e5_event.listSubClasses(); it.hasNext() ;) {
            System.out.println( "\t* "+it.next() );
        }

        // Create your own instance data in an OntModel that imports the cidocModel
        final Individual someJoining = model.createIndividual( "http://example.org/someJoining", cidocModel.getOntClass( CIDOCNS+"E85_Joining"));
        System.out.println( "Types of "+someJoining );
        for ( final ExtendedIterator<Resource> types = someJoining.listRDFTypes(false); types.hasNext(); ) {
            System.out.println( "\t* "+types.next() );
        }
    }
}

必须使用获取类OntModel.getOntClass(CIDCOCNS+"...")有点笨拙,而且很容易打错字。Jena 提供了一个出色的schemagen工具,它采用本体并生成一个常量类,这些常量表示本体中声明的类、属性和个体。例如,您可以使用schemagen创建一个CIDOC类,例如,一个常量OntClass对象E5_Event,而不是

final OntClass e5_event = model.getOntClass( CIDOCNS+"E5_Event" );
System.out.println( "Subclasses of E5_Event:" );
for ( final ExtendedIterator<OntClass> it = e5_event.listSubClasses(); it.hasNext() ;) {
  System.out.println( "\t* "+it.next() );
}

你可以做

System.out.println( "Subclasses of E5_Event:" );
for ( final ExtendedIterator<OntClass> it = CIDOC.E5_Event.inModel( model ).listSubClasses(); it.hasNext() ;) {
  System.out.println( "\t* "+it.next() );
}
于 2013-07-15T16:50:30.340 回答