SPARQL 用于所有列和行的唯一值集

SPARQL for unique set of values from all columns and rows

我有一个查询 returns 几列,即:

SELECT ?a ?b ?c
WHERE { ... }

每个列变量都是一个 IRI。显然,这 returns 列值的每个组合的唯一行(请注意,列值可能不是唯一的):

<urn:id:x:1> <urn:id:a:2> <urn:id:j:3>
<urn:id:x:1> <urn:id:a:2> <urn:id:j:4>
<urn:id:x:1> <urn:id:j:4> <urn:id:k:5>
<urn:id:y:2> <urn:id:j:4> <urn:id:k:6>
...

但是,我所需要的只是跨越所有行和列的唯一 IRI。即:

<urn:id:x:1>
<urn:id:a:2>
<urn:id:j:3>
<urn:id:j:4>
<urn:id:k:5>
<urn:id:y:2>
<urn:id:k:6>
...

是否可以使用 SPARQL 实现此目的,或者我是否需要 post 处理结果以合并和删除重复值?顺序并不重要。

SELECT DISTINCT ?d {
    ...
    VALUES ?i { 1 2 3 }
    BIND (if(?i=1, ?a, if(?i=2, ?b, ?c)) AS ?d)
}

这是做什么的?

  1. VALUES 子句为每个解决方案创建三个副本,并用变量 ?i
  2. 对它们进行编号
  3. BIND子句创建一个新变量?d,其值为?a?b?c,取决于是否?i在给定的解决方案中是 1、2 或 3
  4. SELECT DISTINCT ?d returns 仅 ?d 并删除重复项