Rdf 如何使用SPARQL为个人显示特定类?

Rdf 如何使用SPARQL为个人显示特定类?,rdf,sparql,owl,Rdf,Sparql,Owl,我用Protege创建了一个小本体 我从类a、类B和类C开始。类C包含子类x、y和z。填充此本体的个体分为两类:第一类是A或B,第二类是C的子类之一 我想检索所有具有属性H的个体,它们也是类x或y的一部分,但不是z。通过以下查询,我能够做到这一点: SELECT ?individual WHERE {?individual ont:hasH ?individual. FILTER(NOT EXISTS { ?individual rdf:type ont:z } )}

我用Protege创建了一个小本体

我从类a、类B和类C开始。类C包含子类x、y和z。填充此本体的个体分为两类:第一类是A或B,第二类是C的子类之一

我想检索所有具有属性H的个体,它们也是类x或y的一部分,但不是z。通过以下查询,我能够做到这一点:

SELECT ?individual
    WHERE {?individual ont:hasH ?individual.
        FILTER(NOT EXISTS { ?individual rdf:type ont:z } )}
(ont是我的本体的前缀)

这个查询符合我的要求。但对于这些人,我也想知道他们是属于x类还是y类。我已尝试将查询更改为以下内容,但无效:

SELECT ?individual ?class
    WHERE {?individual ont:hasH ?individual.
        FILTER(NOT EXISTS { ?individual rdf:type ont:z } ) ?class rdf:type ont:C}
因为x和y属于C类,所以我需要知道所选个体的C类是什么。我怎么能这么做


(请记住,我对SPARQL完全是新手。)

你说的几句话让这个问题有点困惑:

我从a类、B类和C类开始。C类包含 子类x、y和z

由于x和y属于C类

我们通常不会说一个类包含子类;我们只是说一个类有子类,或者说一个类是另一个类的子类。当A是B的一个子类时,那么每当某个i是A(即,我们有三元组[i rdf:type A]),那么i也是B(即,我们有三元组[i rdf:type B])

无论如何,对于具有ont:hasH属性且不是ont:z实例的每个个体,您可以执行以下操作,以确定它是ont:x还是ont:y:

选择“个人”类,其中{
#--您已经提供的第一部分确保
#--?个人有一个ont:hasH值,但没有
#--字体:z。
?个人:散列?个人。
筛选器(不存在{?单个rdf:type ont:z})
#--因为每个人都有ont:x或
#--ont:y,可以将变量绑定到ont:x和ont:y,然后
#--也与之匹配。对于每个结果,xy将为
#--绑定到ont:X或ont:y,具体取决于类型
#--?个人拥有。
值?xy{ont:x ont:y}
?单个rdf:xy型
}

感谢您的详细解释!“values”关键字正是我想要的。你可以在。作为一般实践,最好至少浏览一下您正在使用的工具的规范或手册。你不需要记住关于它的一切,但是播下种子,这样当一个问题出现时,你的大脑会说“我想我看到了一些可能有用的东西”,这是非常有帮助的。