排除具有相同属性和值

时间:2016-05-18 16:13:23

标签: sparql

如果我有这些数据:

: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的一个结果。

2 个答案:

答案 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来影响结果的顺序,从而影响将要选择的资源。