Java 添加更复杂的子类公理

Java 添加更复杂的子类公理,java,jena,owl,description-logic,Java,Jena,Owl,Description Logic,我偶然发现了另一个问题 我想实现类似的目标: 我想使用RDFList实现这一点,在列表中添加必要的属性,然后调用方法createUnionClass(或createIntersectionClass)并将其组合在一起。然后,使用addSuperClass()将此方法的结果添加到特定的ontClass中 这是错的吗?我从一些非常简单的事情开始,比如: RDFList RDFList=ontModel.createList(); rdfList.addProperty(例如Resource1);

我偶然发现了另一个问题

我想实现类似的目标:

我想使用RDFList实现这一点,在列表中添加必要的属性,然后调用方法createUnionClass(或createIntersectionClass)并将其组合在一起。然后,使用addSuperClass()将此方法的结果添加到特定的ontClass中

这是错的吗?我从一些非常简单的事情开始,比如:

RDFList RDFList=ontModel.createList();
rdfList.addProperty(例如Resource1);
rdfList.addProperty(例如Resource2);
UnionClass uc=ontModel.createUnionClass(null,rdfList);
ExampleClass.addSuperClass(uc);
但结果不是前面所述的两个并集的子类,而是nil子类


任何帮助都将不胜感激。

在Jena中创建此功能有点棘手,因为对限定基数限制的支持是OWL2功能,而Jena对OWL2的支持有限:

请注意,目前Jena本体API的支持有限 对于OWL2的限定基数限制(即基数yq, minCardinalityQ和maxCardinalityQ)。限定基数 限制封装在接口中 基数限制,最小基数限制和 基数限制。OntModel还提供了创建 以及访问限定的基数限制。因为他们不是 OWL1.0语言定义的一部分,限定基数 OWL本体中不支持限制。有资格的 基数限制被添加到OWL2更新中。OWL2支持 在耶拿,将在适当的时候加入

您可能还会看到我在Jena邮件列表上发布的关于类似问题的回复

不过,您可以通过以下Java代码非常接近<代码>3。是我们希望能够编写的代码,但我们最终不得不使用
3a。
来代替。您可以开始深入研究RDF序列化,从而获得真正的限定限制。我已经在一个相关问题中展示了如何做到这一点:

import com.hp.hpl.jena.ontology.OntClass;
导入com.hp.hpl.jena.ontology.OntModel;
导入com.hp.hpl.jena.ontology.OntModelSpec;
导入com.hp.hpl.jena.ontology.ontroperty;
导入com.hp.hpl.jena.rdf.model.ModelFactory;
导入com.hp.hpl.jena.rdf.model.RDFNode;
公共类UnionClassExample{
公共静态void main(字符串[]args)抛出FileNotFoundException、IOException{
字符串NS=”https://stackoverflow.com/q/20561994/1281433/";
OntModel model=ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM);
型号:setNsPrefix(“so”,NS);
OntClass a=model.createClass(NS+“a”);
OntClass b=model.createClass(NS+“b”);
OntClass c=model.createClass(NS+“c”);
OntProperty p=model.createObjectProperty(NS+“p”);
OntProperty q=model.createObjectProperty(NS+“q”);
//1.B或C
OntClass b_或_c=model.createUnionClass(null,model.createList(新的RDFNode[]{b,c}));
//2.仅p(B或C)
OntClass p_only_b_或_c=model.createAllValuesFromRestriction(null、p、b_或_c);
//3.q正好是1 C
//OntClass q_恰好为_1_C=model.createCardinalityQRestriction(null,q,1,C);
//3a.q正是1
OntClass q_\u 1=model.createCardinalityRestriction(null,q,1);
//(2)及(3a)
OntClass _2_和_3a=model.createIntersectionClass(null,model.createList(新的RDFNode[]{p_only_b_或_c,q_justice_1}));
//a子类((仅p(B或C))和(q)(1))
a、 addSuperClass(2_和_3a);
model.write(System.out,“RDF/XML-ABBREV”);
}
}
输出:


1.
加载到Protégé:


很难阅读图像中的文字。你能把它贴成文本吗
createUnionClass
需要一个表示联合类的资源列表,这并不奇怪,正如文档所述。如果Protégé接受了您显示的输入,那么显然您已经定义了类ExampleSource1和ExampleSource2(但resource在OWL上下文中表示个人,所以这是一种糟糕的名称选择)
uc
将是类
ExResource1或ExResource2
,您需要添加axiom
ExampleClass子类(ExResource1或ExResource2)
。你的实际产出是什么?“我偶然发现了另一个问题……”,这个问题似乎是对上一个问题的起诉……非常感谢,它几乎回答了我需要知道的一切。。。我的错误是初始化RDFList。更好的文档和一些代码示例会有很大帮助。@Hawk我认为您的RDFList初始化很好;但是,您没有正确地向其添加元素。您应该已经使用添加元素了(尽管如果您事先有了它们,我使用的数组语法也会非常方便)。@Hawk虽然,由于您从一个空的RDFList开始,您可能希望使用as
RDFList list=model.creatList();list=list.cons(i1);list=list.cons(i2)