【问题标题】:SPARQL: Get "most specific property"SPARQL:获取“最具体的属性”
【发布时间】:2012-08-29 15:51:07
【问题描述】:

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

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

所以我想要的是一个通用查询,如果我输入 Populationonly 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

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

【问题讨论】:

标签: sparql semantic-web


【解决方案1】:

这比我自己尝试时的预期要复杂。 但是,您需要做的是稍微扩展您的 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:Refugee 的超类(前两个 BGP)。但是接下来我们要过滤 出那些存在子属性的属性也有 域,它是(超类)ex:Refugee。请注意,我们使用的是 子属性 (?d) 的域的不同变量,毕竟它 不一定必须与属性具有完全相同的域 我们正在选择。

以上适用于简单的(非蕴含或 RDF(S) 蕴含) Triplestore,前提是每个子属性只有其最具体的 定义域类,也就是说,你有三重'ex:currentLocation rdfs:domain ex:Refugee' 但没有明确地 'ex:currentLocation rdfs:domain ex:Population'。

【讨论】:

  • 谢谢,珍。我正准备把你的答案贴在这里,以防其他人将来遇到同样的问题。
  • @Carsten,你不认为我会让你摆脱那些业力点,对吧? :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-11
  • 2015-07-24
  • 2017-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多