假设我有一个充满视频元数据的三重商店。视频可以有任意选择的预定义标签,如下所示:
v1 ex:hasTag A.
v2 ex:hasTag B.
v3 ex:hasTag A;
ex:hasTag B.
因此,为了这个例子,只有两个预定义的标签A
和B
。
现在我想概述哪个视频附加了哪些标签,在这样的矩阵中(或类似):
A B
v1 true false
v2 false true
v3 true true
然而,我不知道如何实现这一目标。首先,我需要一个布尔测试,例如像isTrue(?video ex:hasTag A)
或类似的东西。即便如此,我也不知道该把它放在哪里。如果我将前一个语句放在WHERE子句中,那么查询结果当然只包含标记为A
的视频。
来自SQL,我可以想象我需要以某种方式使用子查询,but these seem not to be standardized at the moment。我也看到了FILTER
关键字,但我觉得这不是我想要的。
我目前不知所措,但总是愿意学习。任何帮助表示赞赏。
答案 0 :(得分:5)
子查询位于SPARQL 1.1中,现在已冻结。已经有几个完整的实现。
除嵌套SELECT子查询外,SPARQL 1.1还具有EXISTS和NOT EXISTS函数,用于测试模式是否匹配。它是一种子查询形式。您可以在FILTER中使用它,或者如果您确实想要返回true / false:
BIND(EXISTS{?video ex:hasTag "A"} AS ?a)
甚至:
SELECT ?video (EXISTS{?video ex:hasTag "A"} AS ?a) (EXISTS{?video ex:hasTag "B"} AS ?b)
{
?video a ex:Video .
}
答案 1 :(得分:3)
尝试从以下内容开始:
SELECT ?video ?tagA ?tagB {
?video a ex:Video .
OPTIONAL { ?video ex:hasTag ?tagA . FILTER (?tagA = "A") }
OPTIONAL { ?video ex:hasTab ?tagB . FILTER (?tagB = "B") }
}
那将大致是你想要的。如果你真的必须有布尔值而不是简单检查未绑定的val,请使用:
SELECT ?video (bound(?tagA) as ?a) (bound(?tagB) as ?b) { ... }
P.S。子查询是(在编写本文时提议的建议)standardised in SPARQL 1.1。