SPARQL:Get";“最特殊的财产”;

SPARQL:Get";“最特殊的财产”;,sparql,semantic-web,Sparql,Semantic Web,我正在尝试获取类的最特定属性,但我被卡住了。我想提取适用于给定类的所有属性(包括从超类继承的属性),除了结果集中包含子属性的属性 例如,如果我有一个类Population,它的一个属性是atLocation,而Population的一个子类称为savents。难民有一个属性currentLocation,它是atLocation的子属性 因此,我想要的是一个通用查询,如果我输入人口,它将只给我一个位置,如果输入难民,它只给我当前位置。我所拥有的是: prefix rdfs: <http:/

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

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

因此,我想要的是一个通用查询,如果我输入人口,它将只给我一个位置,如果输入难民,它只给我当前位置。我所拥有的是:

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
前缀rdfs:
前缀ex:
选择DISTINCT?prop WHERE{
例:难民RDF:子类*?领域。
?道具rdfs:域?域。
?子计划rdfs:域?域。
筛选器不存在{?subop rdfs:subpertyof?prop.}
}道具订购
这给了我atLocationcurrentLocation


这在一个查询中可能吗?任何关于如何解决这个问题的想法都将受到赞赏

这比我自己尝试时预想的要复杂。 然而,您需要做的是稍微扩展一下notexists子句

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:Sarrainer或a的所有属性 ex的超类:难民(前两个BGP)。但是我们要过滤 输出存在子属性且子属性也具有 域(一个超类)例如:难民。请注意,我们使用的是 子属性(?d)域的不同变量,毕竟 不必与属性具有完全相同的域 我们正在选择

上述内容适用于简单(非蕴涵或RDF(S)蕴涵) triplestore,前提是每个子属性只有其最特定的 定义了域类,也就是说,您有三个“ex:currentLocation” rdfs:domain ex:sarrainer'但不明确'ex:currentLocation'
rdfs:domain ex:Population.

同样的问题也发布(并回答)在W3C sparql开发人员邮件列表上,请参阅谢谢,Jeen。我正要把你的答案贴在这里,以防将来有其他人也有同样的问题。@Carsten,你没想到我会让你逃脱那些因果报应,对吗?:)