如何使用Jena在Ontology中实例化一个概念?

时间:2012-06-14 10:12:06

标签: java jena ontology

我正在研究如何使用Jena自动实例化本体。我有兴趣实例化从一组数据中发现的概念。

我的问题是,有时我只需要实例化一个本体的概念。我很困惑,因为在耶拿,我们需要一个完整的声明来实例化本体。

假设我有以下本体论。

enter image description here

例如EventType只能在本体上实例化一个概念的声明是什么?

是否需要Statement来实例化本体?

或者我的本体论不够表达吗?

版本:我的耶拿代码

public static void manageOntologies() throws FileNotFoundException{     

    int i,inFrame, lineSize;
    int frameNum = 0;

    Individual individu;
    Resource   resource;
    Statement  statement;
    OntModel   domainModel;

    Vector<String> lines = readFile("data/Trace.dat");

    String[] parts = null;
    String   event = null;

    domainModel = ModelFactory.createOntologyModel(ProfileRegistry.OWL_DL_LANG);
    domainModel.read((new FileInputStream(ontopath)), null);

    lineSize = lines.size(); 

    for(i = 0; i < lineSize; i++){
        parts = lines.elementAt(i).split(" ");
        event = parts[parts.length - 1];            
        resource = domainModel.createResource(xmlbase + "frame" + frameNum);//, domainModel.getOntClass(xmlbase + "Event"));
        domainModel.add(resource, RDF.type, domainModel.getOntClass("Event"));

    }

    System.out.println("Numbre de frame = " + frameNum);

    domainModel.write(System.out);
}

以下是遇到的问题

Exception in thread "main" java.lang.NullPointerException
    at com.hp.hpl.jena.rdf.model.impl.ModelCom.add(ModelCom.java:929)
    at soctrace.Intology.manageOntologies(Intology.java:87) -- domainModel.add(...)
    at soctrace.Intology.main(Intology.java:38)

第2版:我的OWL / XML代码

<?xml version="1.0"?>
<!DOCTYPE rdf:RDF [
    <!ENTITY xsd "http://www.w3.org/2001/XMLSchema#" >
    <!ENTITY rdfs "http://www.w3.org/2000/01/rdf-schema#" >
    <!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#" >
    <!ENTITY tima "http://www.soctrace.org/ontologies/tima.owl#" >
]>


<rdf:RDF xmlns="http://www.w3.org/2002/07/owl#"
     xml:base="http://www.w3.org/2002/07/owl"
     xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
     xmlns:tima="http://www.soctrace.org/ontologies/tima.owl#"
     xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
    <Ontology rdf:about="http://www.soctrace.org/ontologies/tima.owl">       
</Ontology>


<!-- http://www.soctrace.org/ontologies/tima.owl#Event -->

<Class rdf:about="&tima;Event">
    <rdfs:subClassOf rdf:resource="http://www.w3.org/2002/07/owl#Thing"/>
</Class>



<!-- http://www.soctrace.org/ontologies/tima.owl#EventDuration -->

<Class rdf:about="&tima;EventDuration">
    <rdfs:subClassOf rdf:resource="&tima;ValuePartition"/>
</Class>



<!-- http://www.soctrace.org/ontologies/tima.owl#EventType -->

<Class rdf:about="&tima;EventType">
    <rdfs:subClassOf rdf:resource="&tima;ValuePartition"/>
</Class>



<!-- http://www.soctrace.org/ontologies/tima.owl#ValuePartition -->

    <Class rdf:about="&tima;ValuePartition"/>
</rdf:RDF>

感谢您的回复!

2 个答案:

答案 0 :(得分:1)

你是正确的,在RDF中存储语句,而不是单个术语或概念。 但是,所有内容都有一个类型,即使它只是rdfs:Resource(或者通常是猫头鹰owl:Individualowl:Class)。因此,你们总是通过thing rdf:type Type形式的陈述添加一些东西,只需选择合适的类型。

在这种情况下,大概EventType是一个类?在那种情况下:

Resource eventTypeResource = model.createResource(eventTypeURI);
model.add(eventTypeResource, RDF.type, OWL.class);

然而,您可以使用这种常见模式:

Resource eventTypeResource = model.createResource(eventTypeURI, OWL.class);

甚至更好地使用Jena本体API:

OntClass eventTypeResource = ontModel.createClass(eventTypeURI);

OntClass仍然是Resource,但添加了一些非常有用的方法)

耶拿提供了一个不错的introduction to the ontology api

答案 1 :(得分:1)

很难准确,因为您没有提供数据或本体(因此我们无法尝试您的代码)。但是,这很可能是问题所在:

domainModel.getOntClass("Event")

"Event"不是URI,因此您的本体不太可能具有该名称的事件类(如果是,则应将其更改为使用完整URI!)。

您需要向getOntClass提供完整的URI,否则它将返回null,因为它无法识别该类。假设您为EVENT_NS提供了合适的值,那么:

domainModel.getOntClass( EVENT_NS + "Event")