Java 检索OWL交集类隐含的超类

Java 检索OWL交集类隐含的超类,java,rdf,sparql,semantic-web,owl,Java,Rdf,Sparql,Semantic Web,Owl,OWL本体可以有类A、B和C,以及axiom(DL表示法): A&SQQ子部分;(B⊓C) 或者使用近似的曼彻斯特OWL语法: A子类(B和C) 从逻辑上讲,A是B的一个子类,A是C的一个子类,但三元组 A rdfs:subClassOf B A rdfs:subClassOf C 不一定存在于OWL本体的RDF序列化中。例如,在PRDE GEY中考虑这个非常简单的本体及其RDF/XML和Turt: @前缀:。 @前缀rdfs:。 @前缀owl:。 @前缀xsd:。 @前缀r

OWL本体可以有类A、B和C,以及axiom(DL表示法):

A&SQQ子部分;(B⊓C)

或者使用近似的曼彻斯特OWL语法:

A子类(BC)

从逻辑上讲,A是B的一个子类,A是C的一个子类,但三元组

A rdfs:subClassOf B
A rdfs:subClassOf C
不一定存在于OWL本体的RDF序列化中。例如,在PRDE GEY中考虑这个非常简单的本体及其RDF/XML和Turt:


@前缀:。
@前缀rdfs:。
@前缀owl:。
@前缀xsd:。
@前缀rdf:。
猫头鹰:本体论。
:B猫头鹰:上课。
:C猫头鹰:上课。
:猫头鹰:类;
rdfs:subassof[a owl:Class;
owl:intersectionOf(:B:C)
] .
序列化有一个带有
rdfs:subassof
的三元组,但对象不是
:B
:C
,因此

:A rdfs:subClassOf ?superclass

不会返回
:A的超类。我如何编写一个SPARQL查询来返回那些
:a
的超类?

听起来像是有一个类是某个交集类的子类。例如,你可能有

学生个人&sqcap参加一些课程

在ProtégéOWL本体编辑器中,如下所示:

如果为子类编写SPARQL查询,例如

前缀rdfs:
选择?子类?超类,其中{
?子类rdfs:子类?超类
}
如果没有推理器推断其他数据,则不会在结果中将学生视为子类,但可能会看到一个空白(匿名)节点:

---------------------------------------------------------
|子类|超类|
=========================================================
|| u0:b0|
---------------------------------------------------------
要理解为什么会出现这种情况,您需要了解本体的RDF序列化。在本例中,它是(在RDF/XML中):


或者在更易于理解的Turtle中(也更像SPARQL查询语法):

@前缀:。
@前缀rdfs:。
@前缀owl:。
@前缀xsd:。
@前缀rdf:。
:学生a猫头鹰:班级;
rdfs:subassof[a owl:Class;
owl:intersectionOf(:Person[a owl:Restriction;
owl:onProperty:enrolledIn;
猫头鹰:一些价值来自:课程
] )
] .
:人猫头鹰:班级。
:在owl:ObjectProperty中注册。
:课程a猫头鹰:上课。
猫头鹰:本体论。
事实上,数据中有一个
学生rdfs:subassof[…]
三元组,但是
[…]
是一个空白节点;它是一个匿名的owl:Class,它是一些其他类的交集。推理者可以告诉您,如果X&sqsubsetq;(Y和Z)然后X&sq子节;Y和X&SQQ子类;Z、 但SPARQL查询本身无法做到这一点。您可以进行更复杂的SPARQL查询,如下所示:

前缀rdfs:
前缀owl:
前缀rdf:
选择?子类?超类,其中{
{?子类rdfs:子类?超类}
联盟
{?子类rdfs:subassof[owl:intersectionOf[rdf:rest*[rdf:first?superclass]]]}
}
--------------------------------------------------------------------------------------
|子类|超类|
======================================================================================
|| u0:b0|
|  |  |
|| u1:b1|
--------------------------------------------------------------------------------------
两个空白节点是匿名交叉点类和匿名限制类(在某个课程中注册)。如果您只需要IRI结果,可以使用
过滤器

前缀rdfs:
前缀owl:
前缀rdf:
选择?子类?超类,其中{
{?子类rdfs:子类?超类}
联盟
{?子类rdfs:subassof[owl:intersectionOf[rdf:rest*[rdf:first?superclass]]]}
过滤器(isIRI(?超类))
}
--------------------------------------------------------------------------------------
|子类|超类|
======================================================================================
|  |  |
--------------------------------------------------------------------------------------
现在,作为最后一步,如果您想使查询稍微小一点,因为这两个
联合
ed模式的唯一区别是连接
?子类
?超类
的路径,您实际上可以只使用一个属性路径来编写它。(尽管,如中所述,如果您这样做,您可能会遇到一些Protégé问题。)想法是您可以重写以下内容:

{?子类rdfs:子类?超类}
联盟
{?子类rdfs:subassof[owl:intersectionOf[rdf:rest*[rdf:first?superclass]]]}
因此,通过使用属性路径,也可以