Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Type inference 类级上的OWL交集_Type Inference_Owl_Inference_Reasoning - Fatal编程技术网

Type inference 类级上的OWL交集

Type inference 类级上的OWL交集,type-inference,owl,inference,reasoning,Type Inference,Owl,Inference,Reasoning,我有这样的类层次结构: Thing - ClassA -ClassC -ClassD - ClassB -ClassC -ClassE C类是ClassA和ClassB的子类,而ClassD和ClassE只是ClassA或ClassB的子类 现在我想指定一个类,它相当于ClassA和ClassB子类的交集。以下操作不起作用: NamedClass a owl:Class NamedClass owl:equivalentClass (ClassA and

我有这样的类层次结构:

Thing
  - ClassA
    -ClassC
    -ClassD
  - ClassB
    -ClassC
    -ClassE
C类是ClassA和ClassB的子类,而ClassD和ClassE只是ClassA或ClassB的子类

现在我想指定一个类,它相当于ClassA和ClassB子类的交集。以下操作不起作用:

NamedClass a owl:Class
NamedClass owl:equivalentClass (ClassA and ClassB)
原因是推理者将使用这种规则对个体进行分类,即如果我有一个个体Ind1,它的类型为ClassA和ClassB,它也将被分类为NamedClass类型。这不仅仅是我想要的。我希望ClassC本身是NamedClass的一个子类


我知道使用规则(例如旋转)可以实现这一点,但是没有规则可以实现吗?

是的,您可以使用OWL将一个类定义为其他两个类的交集。 检查一下

希望我能帮忙


PS如果您想对您的模型应用更高级的规则,我建议使用w3c推荐的规则。

让我们从初始层次结构开始,包括F,但在我们声明F相当于a和B的交集之前:

然后我们添加(A和B)作为与F等价的类。Protégé足够聪明,可以在每个相交类下呈现等价的事物或相交的子类,因此我们在这里看到F出现在两个地方

推理者也可以证实这种关系。在这里,我打开了Pellet,在DL查询中输入F,并请求子类。果然,C是F的一个子类:

以下是您可以复制和粘贴的本体:

@prefix :      <http://stackoverflow.com/q/22221549/1281433/> .
@prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#> .
@prefix owl:   <http://www.w3.org/2002/07/owl#> .
@prefix xsd:   <http://www.w3.org/2001/XMLSchema#> .
@prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .

:ontology a owl:Ontology .

:A a owl:Class .
:B a owl:Class .
:C a owl:Class ; rdfs:subClassOf  :A , :B .
:D a owl:Class ; rdfs:subClassOf  :A .
:E a owl:Class ; rdfs:subClassOf  :B .
:F a owl:Class ;
     owl:equivalentClass [ a owl:Class ;
                           owl:intersectionOf  ( :A :B ) ] .
@前缀:。
@前缀rdfs:。
@前缀owl:。
@前缀xsd:。
@前缀rdf:。
:ontology猫头鹰:ontology。
:猫头鹰:上课。
:B猫头鹰:上课。
:C猫头鹰:类;rdfs:子类:A,:B。
:D猫头鹰:类;rdfs:子类:A。
:E猫头鹰:类;rdfs:子类:B。
:F猫头鹰:类;
owl:equivalentClass[一个owl:Class;
owl:intersectionOf(:A:B)]。

我试图这样定义它,但如上所述,这只适用于个人。我知道我可以使用SWRL(我更喜欢SPIN),但是如果没有它会更好。有些类c是另外两个类的子类,这一点都没有问题。没有类不相交的假设,所以既有类a又有类B的东西没有问题,所以C类的东西没有问题。所有的子类关系都是if-then,形式为“如果X是C,那么X是a”,“如果X是C,那么X是B”。除非另有说明,A和B都是绝对没有错的。你是对的。。。我将删除我的编辑,以防止可能的读者产生混淆。
F owl:equivalentClass(A和B)
有什么不起作用?如果你向推理机查询,你会发现
C
F
的一个子类。这是一个简单的推论:某物是C,那么它是a;如果某物是C,那么它是B;因此,如果某物是C,那么它是a和B;因此,如果是A和B,那么它就是F;因此,如果某个东西是C,那么它就是F。这就是子类关系的定义。不,Joshua,它不起作用。例如,当我有一个类似owl:equivalentClass(property1-someclassb)的关系时,它确实起作用,但我的示例中的交集不起作用。当我启动reasoner(不管是哪一个)时,ClassC并没有被归类为NamedClass的子类。Pellet正确地将我的C类分类为F的子类(你一直称之为NamedClass)。我看到你已经接受了答案,谢谢!你有没有可能指出你所看到的有问题的行为?有可能其他一些建模构造没有达到预期效果,我们可能能够找到……请参阅我对您答案的评论:)谢谢,我注意到我有一个不同的问题,出于某种原因,它阻止了类级推断在我的模型中持久化,因此当我在Protege中推理后打开它(使用Jena API)时,它并不完整,在不完整的模型上使用reasoner也没有帮助。虽然我用完全不同的方式解决了我的问题,但你的回答很好地说明了十字路口。啊,我明白了。嗯,回答你自己的问题没什么问题;如果你认为你实际遇到的问题可能会发生在其他人身上,你可以把它写成一个问题并提供答案!