6

我正在尝试获取一个类的最具体的属性,但我被卡住了。我想提取所有适用于给定类的属性(包括从超类继承的属性),但结果集中具有子属性的属性除外。

例如,如果我有一个类Population,其属性之一是atLocation,以及一个名为Refugees的Population子类。Refugees有一个属性currentLocation,它是atLocation的一个子属性。

所以我想要的是一个通用查询,如果我输入Population只会给我 atLocation,如果我输入Refugees只会给我currentLocation。我所拥有的是:

prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
prefix ex: <http://example.org/vocabulary#>

SELECT DISTINCT ?prop WHERE {
  ex:Refugee rdfs:subClassOf* ?domain  .
  ?prop rdfs:domain ?domain .
  ?subprop rdfs:domain ?domain .
  FILTER NOT EXISTS { ?subprop rdfs:subPropertyOf ?prop . }  
} ORDER BY ?prop

不过,这给了我atLocation currentLocation

这可能在一个查询中吗?任何有关如何解决此问题的想法表示赞赏!

4

1 回答 1

4

当我自己尝试时,这比我预期的要棘手。但是,您需要做的是稍微扩展您的 NOT EXISTS 子句。

SELECT ?prop WHERE {
  ?prop rdfs:domain ?domain .
  ?class rdfs:subClassOf* ?domain .
  FILTER NOT EXISTS {
        ?sub rdfs:subPropertyOf ?prop.
        ?sub rdfs:domain ?d.
        ?class rdfs:subClassOf* ?d .
  }
  FILTER (?class = ex:Refugee)
}

我们选择域为 ex:Refugee 或 ex:Refugee 的超类(前两个 BGP)的所有属性。但是随后我们想要过滤掉那些存在子属性的属性,这些属性也有一个域是 ex:Refugee 的(超类)。请注意,我们为子属性 (?d) 的域使用了不同的变量,毕竟它不一定必须与我们选择的属性具有完全相同的域。

以上适用于简单的(非蕴含或 RDF(S) 蕴含)三元组,前提是每个子属性仅定义了其最具体的域类,即您具有三元组 'ex:currentLocation rdfs:domain ex:Refugee ' 但没有明确地 'ex:currentLocation rdfs:domain ex:Population'。

于 2012-08-29T23:33:10.447 回答