SPARQL 查询检索由 Protégé 中某个类的另一个个体拥有的子类的个体?

Posted

技术标签:

【中文标题】SPARQL 查询检索由 Protégé 中某个类的另一个个体拥有的子类的个体?【英文标题】:SPARQL Query that retrieves individuals of a subclass that owned by another individual of a class in Protégé? 【发布时间】:2021-12-02 22:14:00 【问题描述】:

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

我想到了一个问题:

假设我有一个这样的本体:

????owl:think
     ???? Fruit
          - Apples
          - Bananas
     -Owner

现在,我有一个子类“Apples”的个体,我们将其命名为“GreenApple”。也用于子类“香蕉”并称为“SweetyBanana”。

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

hasName 为“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”拥有并属于“Apples”子类的水果。这种查询的正确结构是什么。我尝试了很多,但没有一个完美。

我试过了,但没有希望:

?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 的子类。我不想看到 Bananas 个人,也不想看到其他所有者拥有的果实。

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

【问题讨论】:

您能否提供几个您尝试过的 SPARQL 查询示例以及获得的结果? `````?ID :hasName "Jimmy"^^xsd:string 。 ?ID rdf:subClassOf :Fruit 。 ?ID rdf:subClassOf ?FruitList 。 ?FruitList :hasFruit ?JimmyFruit 。 ```` ?ID rdf:subClassOf :Fruit . 意味着 Jimmy 是 Fruit 的子类 - 我怀疑是这种情况,对吧?为什么不SELECT * WHERE ?ID :hasName "Jimmy"^^xsd:string . ?ID :hasFruit ?JimmyFruit . - 请注意,您的数据模型中没有 FruitList,因此,查询这样的内容没有意义。 SPARQL 确实与数据完全匹配。你有图表。 问题是我想要属于“Apples”子类的水果,所以 GreenApple,然而,你的查询给了我所有的水果,包括 SweetyBanana。这就是为什么我也尝试使用 rdf:subClassOf :Apples 将我的结果分类为全部在 Apples 范围内,但不能。 【参考方案1】:

你需要类似的东西:

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

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

针对您的评论,我们可以使用属性路径:

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

表示?fruit:Apples 的实例,或者是:Apples 的(直接或间接)子类的实例。

【讨论】:

那么,如果 Apples 子类有/在其他子类下,像这样:Fruit > Apples > App1、App2、App3 和 App2 hasFruit GreenApple1(individual) / App3 hasFruit GreenApple2(individual)。我想检索 Apples 子类下的所有苹果。如果我只是命名直接持有通缉人员的子类,你的就可以了。所以像这样 SELECT * WHERE ?id :hasName "Jimmy" ; :hasFruit ? 水果。 ?fruit rdf:type :App2 它只是给了我 GreenApple1。但如果我用 Apples 代替 App2,我什么也得不到。 我添加到我的答案来处理这个问题。基本上,您可以使用属性路径沿层次结构向上移动,直到到达 :Apples :Apples 不能有子路径,只有子类。使用rdfs:subClassOf*,我们正在做的是检索:Apples 的所有直接AND indirect 子类。试一试,看看我们是否遗漏了任何苹果。

以上是关于SPARQL 查询检索由 Protégé 中某个类的另一个个体拥有的子类的个体?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 python 中使用 sparql、rdflib 询问本体

如何用 Protégé 中的其他标准本体扩展本体?

如何在 Protégé 中用 OWL 解决爱因斯坦之谜时获得个人结果?

买了瓶红酒,酒标上的“pays d'oc” “Indication Géographique Protégée”是啥意思?

针对 InterSystems Caché 中 DeepSee MDX 查询的 JSON 数据

可视化本体的最佳工具? [关闭]