【发布时间】: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 范围内,但不能。
标签: sparql rdf ontology protege object-property