如果我有这些数据:
:a :p :x; a :C .
:b :p :y; a :C .
:c :p :y; a :C .
:d :q :z; a :C .
:e :p :y; a :C .
如何使SPARQL查询选择第一个?s :p :y
并排除任何其他。
换句话说,如何更改此查询:
SELECT *
WHERE {?s a :C}
因此,对于此数据,应该只有两个结果,:d
和:b
或:c
或:e
。无论哪个,因为它取决于匹配模式的顺序,我猜这是在查询的控制范围之外。
注意:我正在简化实际案例,其中有一组模式,而不仅仅是?sa:C,但想法是,如果某些匹配的三元组也与:p
链接,则应该有?o
模式中相同?s :p ?o
的一个结果。
答案 0 :(得分:4)
您可以按?p和?o进行分组,然后从每组中的?s值中进行采样:
select (sample(?s_) as ?s) ?p ?o where {
?s_ a :C .
?s_ ?p ?o.
#-- Filter here is used to exclude the property that was used
#-- for selecting individuals (?s_ a :C). In general, this
#-- just needs to make sure that the selection criteria aren't
#-- the same as what we're grouping on. If the candidate values
#-- of ?p are known in advance, this could replaced by
#-- `values ?p { :p :q ... }`.
filter(?p != rdf:type)
}
group by ?p ?o
答案 1 :(得分:0)
您可以使用LIMIT
将结果限制为仅一行:
SELECT ?s {
?s :p :y .
} LIMIT 1
您可以使用ORDER BY
来影响结果的顺序,从而影响将要选择的资源。