如何在Protégé中编写SPARQL查询获取Jimmy拥有的Apples子类水果个体
正确SPARQL查询实现方案
你之前写法的核心问题:
- 混淆了类间继承属性
rdfs:subClassOf和个体所属类的属性rdf:type:rdfs:subClassOf仅用于描述类和类的从属关系(比如Apples是Fruit的子类就用这个属性定义),个体属于某个类需要用rdf:type - 关系方向写反:
hasFruit是Owner类个体指向水果个体的对象属性,你之前的写法把关系主体和客体搞反了 - 错误使用了属性的命名空间:子类继承关系属于RDFS词汇集,正确写法是
rdfs:subClassOf而非rdf:subClassOf
可用的查询代码
请先将代码中的默认前缀替换为你自己本体的命名空间:
PREFIX : <http://替换为你的本体命名空间#> PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> SELECT ?JimmyOwnedApple WHERE { # 匹配到名字为Jimmy的Owner个体 ?jimmy :hasName "Jimmy"^^xsd:string . # 匹配Jimmy拥有的所有水果个体 ?jimmy :hasFruit ?JimmyOwnedApple . # 过滤出仅属于Apples类的水果个体 ?JimmyOwnedApple rdf:type :Apples . }
可选增强写法
如果你的Apples类下还有多层子类,需要查询所有属于Apples及其所有子类的个体,可以开启OWL推理,或者修改过滤逻辑为:
PREFIX : <http://替换为你的本体命名空间#> PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> SELECT ?JimmyOwnedApple WHERE { ?jimmy :hasName "Jimmy"^^xsd:string . ?jimmy :hasFruit ?JimmyOwnedApple . ?fruitType rdfs:subClassOf* :Apples . ?JimmyOwnedApple rdf:type ?fruitType . }
其中rdfs:subClassOf*是SPARQL的属性路径写法,表示匹配零层或多层的子类继承关系。
内容的提问来源于stack exchange,提问作者Sarah Zida
相关产品推荐
相关产品推荐

