SPARQL:获取“最具体的财产”

时间:2012-08-29 15:51:07

标签: sparql semantic-web

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

例如,如果我有一个 Population 类,其中一个属性为 atLocation ,而 Population 的子类名为难民 Refugees 有一个属性 currentLocation ,它是 atLocation 的子属性。

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

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

这在一个查询中是否可行?关于如何解决这个问题的任何想法都赞赏!

1 个答案:

答案 0 :(得分: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或a的所有属性 ex的超类:难民(前两个BGP)。但后来我们要过滤 out存在也存在subProperty的属性 领域是(超类)ex:难民。请注意,我们正在使用 毕竟它是子属性域(?d)的不同变量 不一定必须与该属性具有完全相同的域 我们正在选择。

上述工作简单(非蕴涵或RDF(S)蕴含) triplestore,前提是每个子属性只有最具体的属性 定义了域类,也就是说,你有三个'ex:currentLocation rdfs:domain ex:Refugee'但不明确'ex:currentLocation rdfs:domain ex:Population'。