SPARQL查询优化:获取未关联Computer子类的Accessory实例k2
问题:检索未与Computer及其子类绑定的Accessory实例k2
示例本体(Turtle格式)
@prefix : <http://example.org/> . @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . @prefix owl: <http://www.w3.org/2002/07/owl#> . @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . :Product a owl:Class . :Accessories rdfs:subClassOf :Product . :hasAccessories a rdf:Property . :hasAccessories rdfs:domain :Product. :hasAccessories rdfs:range :Accessories. :Mouse rdfs:subClassOf :Accessories. :Keyboard rdfs:subClassOf :Accessories. :Computer rdfs:subClassOf :Product . :Desktop rdfs:subClassOf :Computer . :Laptop rdfs:subClassOf :Computer . :m1 a :Mouse . :m2 a :Mouse . :k1 a :Keyboard . :k2 a :Keyboard . # 关联对象错误 :k3 a :Keyboard . # 未关联任何对象 :c1 a :Computer . :c2 a :Computer . :d1 a :Desktop . :d2 a :Desktop . :l1 a :Laptop . :s a :Storage :c1 :hasAccessories :m1 , :k1 . :d1 :hasAccessories :m1 . :d2 :hasAccessories :m2 . :s :hasAccessories :k2 # <---- 故意设计的错误关联
需求说明
需要检索唯一未与Computer及其子类绑定的Accessory实例k2,要求查询不能使用任何Storage相关内容,仅基于Computer子类进行过滤。
此前尝试的查询及问题
第一个查询(返回空)
该查询逻辑错误,试图找出未被某个Computer实例关联的Accessory,实际返回空:
SELECT DISTINCT ?a WHERE { ?c a :Computer. ?a a :Accessories . FILTER NOT EXISTS {?c :hasAccessories ?a .} }
第二个查询(返回空)
若不存在Storage实例s,该查询可获取所有未关联的Accessories,但当前因s关联了k2导致返回空:
SELECT DISTINCT ?c ?a WHERE { ?acc rdfs:subClassOf* :Accessories . ?a a ?acc . FILTER NOT EXISTS {?c :hasAccessories ?a .} }
第三个查询(返回多余实例k1、k2、m1、m2)
该查询遍历了继承关系,但逻辑为“存在某个Computer实例未关联该Accessory”,导致像l1未关联k1这类情况会错误匹配出多余结果:
SELECT DISTINCT ?a WHERE { ?computer rdfs:subClassOf* :Computer . ?c a ?computer. ?acc rdfs:subClassOf* :Accessories . ?a a ?acc . FILTER NOT EXISTS {?c :hasAccessories ?a .} }
正确的SPARQL查询
要实现需求,需明确过滤条件:Accessory实例,且不存在任何Computer或其子类的实例关联它,不管其他类的实例是否关联该Accessory。基础查询如下:
SELECT DISTINCT ?a WHERE { # 匹配所有Accessories及其子类的实例 ?acc rdfs:subClassOf* :Accessories . ?a a ?acc . # 过滤:不存在任何Computer或其子类的实例关联该Accessory FILTER NOT EXISTS { ?computerType rdfs:subClassOf* :Computer . ?computerInstance a ?computerType . ?computerInstance :hasAccessories ?a . } }
该查询会返回k2和k3,若仅需k2,可额外添加条件过滤未被任何对象关联的实例:
SELECT DISTINCT ?a WHERE { ?acc rdfs:subClassOf* :Accessories . ?a a ?acc . # 确保该实例被至少某个对象关联 ?someInstance :hasAccessories ?a . # 过滤:不存在任何Computer或其子类的实例关联该Accessory FILTER NOT EXISTS { ?computerType rdfs:subClassOf* :Computer . ?computerInstance a ?computerType . ?computerInstance :hasAccessories ?a . } }
这个版本会仅返回k2。
内容的提问来源于stack exchange,提问作者Daraan
相关产品推荐
相关产品推荐

