当前位置: 首页 > 知识库问答 >
问题:

如何用Jena实例化本体中的一个概念?

艾意蕴
2023-03-14

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

我的问题是,有时我只需要实例化本体的一个概念。我很困惑,因为在Jena中,我们需要一个完整的语句来实例化一个本体。

假设我有以下本体论。

在本体上只实例化一个概念的语句是什么,例如eventtype

是否有必要使用语句来实例化本体?

还是我的本体论表现力不够?

版本:我的耶拿代码

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个答案

庞修贤
2023-03-14

很难精确,因为您还没有提供您的数据或本体(所以我们无法尝试您的代码)。不过,很可能问题就出在这里:

domainModel.getOntClass("Event")

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

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

domainModel.getOntClass( EVENT_NS + "Event")
西门山
2023-03-14

您是正确的,在RDF中,您存储的是语句,而不是单独的术语或概念。但是,所有东西都有一个类型,即使只是rdfs:resource(在owl中通常是owl:indiversityowl:class)。因此,您总是通过格式为thing rdf:type的语句添加一些内容,只需选择适当的类型。

在本例中,eventtype可能是一个类?在这种情况下:

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

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

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

或者更好地使用Jena ontology API:

OntClass eventTypeResource = ontModel.createClass(eventTypeURI);

(ontclass仍然是资源,但添加了一些非常有用的方法

Jena为本体API提供了一个很好的介绍。

 类似资料:
  • 问题内容: 我的代码中需要一个单例。我用Java实现了它,并且效果很好。我这样做的原因是为了确保在多种环境中只有一个此类的实例。 但是现在我想用单元测试在本地测试我的Singleton对象。因此,我需要模拟此Singleton的另一个实例(该对象可能来自另一个设备)。那么是否有可能第二次实例化Singleton以进行测试,还是我必须对其进行模拟? 我不确定,但是我认为可以通过使用其他类加载器来实现

  • 有人能解释一下下面的代码是如何毫无例外地工作的吗。我在想,当为星期天创建新实例时,它也会为星期一(星期天内)创建一个新实例,然后再为星期天(星期一内)创建一个新实例,以此类推。。。类似递归的东西,因为它们都是课程周的一部分。但我的理解是错误的,因为下面的代码运行良好。 我有这个疑问,当我读到java枚举。

  • 我正在尝试创建一些类,但它们的数量由用户决定。我要制作的类: 主类:

  • 问题内容: 我使用JAXB创建XML消息。我需要创建的XML是(为简单起见): 我的代码如下所示: 问题:该元素未显示(标题为)。将header设置为空字符串时,将显示以下内容: 当我使用type 代替时,结果甚至更糟: 顺便说一句:我正在使用此代码来创建XML字符串。 是否可以获取空标签? 问题答案: 在XML中,并且是同一个东西。如果您真的想要前者,请使用修饰词。可能会为您做到这一点。

  • 我有一个特点,它是由同一个结构以不同的方式实现的。为了实现这一点,我有不同的结构,它们有不同的实现。对于抽象,我将这些结构称为A-Z: 有没有其他方法来实现这一点,以便结构的每个实例都有一个不同的trait实现,或者创建一个新结构是最好的方法? 我不熟悉编译语言。我所做的大部分工作都是使用Python和TypeScript。

  • 我尝试实例化以下Java代码中定义的内部类: 我得到了这个例外: 我错过了什么?