我有一个返回几列的查询,即:
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实现此目的,还是需要对结果进行后处理以合并和去重复值?顺序不重要。
答案 0 :(得分:3)
SELECT DISTINCT ?d {
...
VALUES ?i { 1 2 3 }
BIND (if(?i=1, ?a, if(?i=2, ?b, ?c)) AS ?d)
}
这是做什么的?
VALUES
子句为每个解决方案创建三个副本,并用变量?i
对其进行编号BIND
子句创建一个新变量?d
,其值是?a
,?b
或?c
,具体取决于?i
是否为1 ,给定解决方案中的2或3 SELECT DISTINCT ?d
仅返回?d
并删除重复项