SPARQL可获取所有列和行中的唯一值集

时间:2019-05-24 00:14:12

标签: sparql marklogic marklogic-9

我有一个返回几列的查询,即:

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

每个列变量都是一个IRI。显然,这会为列值的每种组合返回唯一行(请注意,值可能并非列唯一):

<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实现此目的,还是需要对结果进行后处理以合并和去重复值?顺序不重要。

1 个答案:

答案 0 :(得分:3)

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

这是做什么的?

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