SPARQL:获取"最具体的财产"

Car*_*ten 6 semantic-web sparql

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

举例来说,如果我有一类群体,其属性是一个atLocation,和子类人群称为难民.难民有一个属性currentLocation,它是atLocation的子属性.

所以我想要的是一个通用查询,如果我放入人口,给我一个 位置,如果我放入难民,给我一个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
Run Code Online (Sandbox Code Playgroud)

这给了我atLocation currentLocation.

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

Jee*_*tra 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)
}
Run Code Online (Sandbox Code Playgroud)

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

上面的代码适用于简单的(非蕴涵或 RDF(S) 蕴涵)三元组存储,前提是每个子属性仅定义了其最具体的域类,也就是说,您有三元组 'ex:currentLocation rdfs:domain ex:Refugee '但没有明确'ex:currentLocation rdfs:domain ex:Population'。