如何查询构成owl:unionOf的类?OWL本体属性域场景实践
如何获取OWL属性域中联合类的成员类?
我需要从OWL本体中提取某属性域(类联合类型)里的具体类成员,不管这个域是显式命名类还是匿名类。以下是示例本体:
@prefix : http://example.com/forso/ . @prefix forso: http://example.com/forso/ . @prefix owl: http://www.w3.org/2002/07/owl# . @prefix rdf: http://www.w3.org/1999/02/22-rdf-syntax-ns# . @prefix xml: http://www.w3.org/XML/1998/namespace . @prefix xsd: http://www.w3.org/2001/XMLSchema# . @prefix rdfs: http://www.w3.org/2000/01/rdf-schema# . @base http://example.com/forso/ . http://example.com/forso/ rdf:type owl:Ontology . forso:TypeA rdf:type owl:Class . forso:TypeB rdf:type owl:Class . forso:PropertyDomain rdf:type owl:Class ; owl:equivalentClass [ rdf:type owl:Class ; owl:unionOf ( forso:TypeA forso:TypeB ) ] . forso:TheProperty rdf:type owl:ObjectProperty ; rdf:type owl:FunctionalProperty , owl:AsymmetricProperty ; rdfs:domain forso:PropertyDomain .
尝试过的方法及问题
- 基础查询获取属性域:
SELECT ?domain WHERE { forso:TheProperty rdfs:domain ?domain . }
结果仅返回forso:PropertyDomain,无法直接拿到内部的TypeA和TypeB。
- 子类查询:
误以为联合类的成员是命名域类的子类,尝试:
SELECT * WHERE { ?cls rdfs:subClassOf forso:PropertyDomain . }
无结果;改用传递属性rdfs:subClassOf*也仅返回forso:PropertyDomain本身。
- 等价类查询:
后来找到以下查询,但仅适用于有显式等价类的命名域,对匿名类场景无效:
SELECT ?cls WHERE { forso:TheProperty rdfs:domain ?domain . ?domain owl:equivalentClass [ rdf:type owl:Class ; owl:unionOf [ rdf:rest*/rdf:first ?cls ] ] . }
通用解决方案
以下SPARQL查询同时支持命名域类(等价于联合类)和匿名联合类两种场景:
SELECT ?cls WHERE { forso:TheProperty rdfs:domain ?domain . # 覆盖两种情况:域本身是联合类,或域等价于联合类 { ?domain owl:unionOf ?list } UNION { ?domain owl:equivalentClass/owl:unionOf ?list } # 遍历RDF列表提取每个类成员 ?list rdf:rest*/rdf:first ?cls . # 确保结果是OWL类 ?cls a owl:Class . }
说明
- 用
UNION处理两种常见的联合类域定义方式:属性域直接是匿名联合类,或者命名类等价于匿名联合类 - 通过
rdf:rest*/rdf:first遍历RDF集合列表,提取所有类成员 - 最后通过
?cls a owl:Class过滤,确保结果是合法的OWL类
内容的提问来源于stack exchange,提问作者JCK
相关产品推荐
相关产品推荐

