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é 中用 OWL 解决爱因斯坦之谜时获得个人结果?
买了瓶红酒,酒标上的“pays d'oc” “Indication Géographique Protégée”是啥意思?