我需要为目标集中的每个资源检索单个图像,使用优先级顺序测试多个非独占谓词。
我currently使用标准的可选后备模式
select ?r ?i where {
?r a dbo:Automobile .
optional { ?r <http://dbpedia.org/ontology/thumbnail> ?i }
optional { ?r <http://xmlns.com/foaf/0.1/depiction> ?i }
optional { ?r <http://xmlns.com/foaf/0.1/logo> ?i }
optional { ?r <http://schema.org/image> ?i }
}
但是这种方法在一些后端上变得很麻烦:是否有人知道任何简单/有效的替代方案?
答案 0 :(得分:3)
选项有什么问题?重复使用?i
?
另一种方法是获取每个替代方案并选择第一组。
select ?r ?i where {
?r a dbo:Automobile .
optional { ?r <http://dbpedia.org/ontology/thumbnail> ?i1 }
optional { ?r <http://xmlns.com/foaf/0.1/depiction> ?i2 }
optional { ?r <http://xmlns.com/foaf/0.1/logo> ?i3 }
optional { ?r <http://schema.org/image> ?i4 }
BIND(COALESCE(?i1,?i2,?i3,?i4) AS ?i)
}
答案 1 :(得分:0)
我认为你只需要过滤谓词。这样的事情可能会有所帮助:
prefix schema:<http://schema.org/>
prefix foaf:<http://xmlns.com/foaf/0.1/>
prefix dbpedia-owl:<http://dbpedia.org/ontology/>
select distinct ?r ?i
where {
?r a dbpedia-owl:Automobile .
?r ?p ?i.
values ?p { foaf:logo foaf:depiction dbpedia-owl:thumbnail schema:image}
}
答案 2 :(得分:0)
来自Artemis原创的高尔夫球场,问题在于谓词的排序。因此,我们可以使用以下内容而不是简单的值:
values (?p ?pref) {
(dbpedia-owl:thumbnail 1)
(foaf:depiction 2)
(foaf:logo 3)
(schema:image 4)
}
现在我们可以按顺序选择:
prefix schema:<http://schema.org/>
prefix foaf:<http://xmlns.com/foaf/0.1/>
prefix dbpedia-owl:<http://dbpedia.org/ontology/>
select distinct ?r ?i
where {
?r a dbpedia-owl:Automobile .
?r ?p ?i.
values (?p ?pref) {
(dbpedia-owl:thumbnail 1)
(foaf:depiction 2)
(foaf:logo 3)
(schema:image 4)
}
}
order by ?r ?pref
这给了我们几乎所需要的东西。我们所需要的只是按?r分组并选择最大的行?pref。
不幸的是,这在SPARQL中并不简单。