我使用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的新手。)
答案 0 :(得分:2)
你说的一些事情让这个问题有点混乱:
我从类A,类B和类C开始。类C包含 子类x,y和z。
...
由于x和y属于C类,
我们通常不会说类包含子类;我们只是说一个类有子类,或者一个类是另一个类的子类。当A是B的子类时,那么只要某个i是A(即,我们有三个[i rdf:A型]),那么我也是一个B(即,我们有三个[i rdf:B型] ])。
无论如何,您可以执行以下操作,找出具有ont:hasH属性但不是ont:z实例的每个人,无论是ont:x还是ont:y:
SELECT ?individual ?class WHERE {
#-- The first part, which you already provided, ensures that
#-- ?individual has a value for ont:hasH, and does not have
#-- type ont:z .
?individual ont:hasH ?individual.
FILTER( NOT EXISTS { ?individual rdf:type ont:z } )
#-- Since each of these individuals also has type ont:x or
#-- ont:y, you can bind a variable to ont:x and ont:y and
#-- match against it, too. For each result, ?xy will be
#-- bound to either ont:X or ont:y, depending on what type
#-- ?individual has.
values ?xy { ont:x ont:y }
?individual rdf:type ?xy
}