我正在尝试构建一个描述有限数量对象的(本地)本体,并通过owl:sameAs谓词将这些对象链接到外部资源。但是,当我只是查询那种对象的数量时,我获得的对象数量是所描述对象的两倍。很明显,外部资源也是独立计算的,因为所考虑的是URI的数量,而不是不同对象的数量。 我已经通过以下方式解决了这个问题:我假设本地本体可以被看作是了解这些对象的基本内容的“参考中心”,所以我选择了某种类型的所有对象,然后只筛选出那些包含本地本体的基URI,即:
# How many objects are there?
PREFIX ch: <http://www.example.com/ontologies/domain#>
SELECT (COUNT(DISTINCT ?elem) AS ?count) WHERE {
?elem a ch:Element.
FILTER (REGEX (STR(?elem) ,"http://www.example.com/ontologies/domain") ).
}
但是,我对这种做法有两个顾虑:
1)它看起来有点像黑客(即使有某种原则),而我想要的东西更符合逻辑
2)我的印象是这个查询效率不高。
我在这里搜索了很多,在google上,但没有找到更好的解决方案......这里有什么建议吗?
非常感谢您的帮助!
答案 0 :(得分:2)
如果某些属性应该为每个人设置不同的值,那么您可以使用它来强加&#34;等效类&#34;你需要的结构。例如,像这样:
prefix ch: <http://www.example.com/ontologies/domain#>
select (count(?label) as ?count) where {
?elem a ch:element ;
rdfs:label ?label .
}
group by ?label
如果不存在将由等价类中的所有元素共享的值,您仍然可以通过询问每个等价中的最小元素来获取集合中的代表元素类。我们可以使用元素的IRI对元素进行排序,并使用它来选择唯一个体。这确实假设每个?elem和所有相同的东西在 str 函数(和IRIs)下具有明确定义的行为。
prefix ch: <http://www.example.com/ontologies/domain#>
select (count(distinct ?elem) as ?count) where {
?elem a ch:element .
filter not exists {
?elem (owl:sameAs|^owl:sameAs)* ?elem_
filter( str(?elem_) < str(?elem) )
}
}