如何编写SPARQL语句查询OWL本体中Bob的所有子女及后代
首先请确保你的SPARQL查询引擎开启了RDFS/OWL推理支持,否则属性层级的继承规则不会自动生效,两种场景的查询语句分别如下:
查询Bob的所有子女
开启推理的场景下,直接基于hasChild属性查询即可,会自动包含hasSon、hasDaughter两种子属性关联的个体:
PREFIX : <http://ex.org#> SELECT ?child WHERE { :Bob :hasChild ?child . }
返回结果为:Mary、:John。
如果未开启推理,可以用属性路径匹配所有hasChild的直接/间接子属性:
PREFIX : <http://ex.org#> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> SELECT ?child WHERE { :Bob ?p ?child . ?p rdfs:subPropertyOf* :hasChild . }
查询Bob的所有后代
你的现有本体中未将hasDescendant声明为传递属性,有两种实现方案:
- 先修改本体,给
:hasDescendant添加传递属性声明:
:hasDescendant rdf:type owl:ObjectProperty, owl:TransitiveProperty .
开启推理后直接查询即可拿到所有后代:
PREFIX : <http://ex.org#> SELECT ?descendant WHERE { :Bob :hasDescendant ?descendant . }
- 不修改本体、不依赖推理,直接用SPARQL属性路径实现递归查询:
PREFIX : <http://ex.org#> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> SELECT ?descendant WHERE { :Bob (^rdfs:subPropertyOf/:hasChild)+ ?descendant . }
两种方案返回结果均为:Mary、:John、:LittleBoy、:LittleGirl。
内容的提问来源于stack exchange,提问作者joylix
相关产品推荐
相关产品推荐

