SPARQL 查询检索 Protégé 中 class 的另一个人所拥有的 subclass 的个人?

SPARQL Query that retrieves individuals of a subclass that owned by another individual of a class in Protégé?

我开始根据工作需要使用 Protégé,目前正在学习如何使用 SPARQL Query。

我有一个问题如下:

假设我有一个 ontology 是这样的:

owl:think
      Fruit
          - Apples
          - Bananas
     -Owner

现在,我有一个子class“Apples”,我们将其命名为“GreenApple”。也为子class“Bananas”而称“SweetyBanana”。

我有很多个人class“所有者”,但让我们通过数据属性将其中一个“hasName”命名为“Jimmy”。

名字为“Jimmy”的人通过名为“hasFruit”的对象属性建立关系,并将他与“GreenApple”和“SweetyBanana”个人联系起来,如下所示:

{ Individual (which is named "Jimmy" by the hasName property) hasFruit GreenApple }.
{ Individual (which is named "Jimmy" by the hasName property) hasFruit SweetyBanana }.

现在我的问题是,如果我想执行 SPARQL 查询来检索个人“Jimmy”拥有并属于“Apple”子class 的水果。这种查询的正确结构是什么。我尝试了很多,但没有一个是完美的。

我试过了,但没有希望:

?ID :hasName "Jimmy"^^xsd:string .
?ID rdf:subClassOf :Fruit .
?ID rdf:subClassOf ?FruitList  .
?FruitList :hasFruit ?JimmyFruit . 

也尝试过这个,但也没有希望:

?ID :hasName "Jimmy"^^xsd:string .
?ID rdf:subClassOf :Apples .
?ID rdf:subClassOf ?AppleFruit  .
?AppleFruit :hasFruit ?JimmyFruit .

如此简单,我只想让查询显示 Jimmy 拥有的水果,该水果位于 Apples 的子 class 下。我不想看到香蕉个体,也不想看到其他所有者拥有的水果。

记住: hasName 是一个数据属性。 hasFriut 是一个对象 属性。 Apples 是 class 水果的子 class。 香蕉是 class 水果的子 class。 所有者是 class 。 “吉米”是一种价值。 GreenApple是Apples子class中的一个人。 SweetyBanana是Bananas子class.

中的一个人

你需要这样的东西:

SELECT *
WHERE {
?id :hasName "Jimmy" ;
    :hasFruit ?fruit .
?fruit rdf:type/rdfs:subClassOf* :Apples }

现在,:Apples 是否是 :Fruit 的子类并不重要,因为无论如何您只对苹果感兴趣。

为了回应您的评论,我们可以使用 属性 路径:

?fruit rdf:type/rdfs:subClassOf* :Apples

表示 ?fruit:Apples 的实例,或者是 :Apples.

的(直接或间接)子类的实例