在SPARQL中进行布尔检查,检查是否存在语句

cyr*_*oxx 4 rdf boolean semantic-web sparql

假设我有一个充满视频元数据的三重存储.视频可以任意选择预定义的标签,如下所示:

v1 ex:hasTag A.
v2 ex:hasTag B.
v3 ex:hasTag A;
   ex:hasTag B.
Run Code Online (Sandbox Code Playgroud)

因此,为了这个例子,只有两个预定义的标签AB.

现在我想概述哪个视频附加了哪个标签,在这样的矩阵中(或者类似):

    A     B 

v1  true  false
v2  false true
v3  true  true
Run Code Online (Sandbox Code Playgroud)

但是,我不知道如何实现这一目标.首先,我需要一个布尔测试,例如类似isTrue(?video ex:hasTag A)或类似的东西.即便如此,我也不知道该把它放在哪里.如果我将前一个语句放在WHERE子句中,查询结果当然只包含带有标记的视频A.

来自SQL,我可以想象我需要以某种方式使用子查询,但这些似乎不是标准化的.我也看到了FILTER关键字,但我觉得这不是我想要的.

我现在不知所措,但总是愿意学习.任何帮助表示赞赏.

And*_*dyS 5

子查询位于SPARQL 1.1中,现在已冻结.已经有几个完整的实现.

除了嵌套SELECT子查询外,SPARQL 1.1还具有EXISTS和NOT EXISTS函数,用于测试模式是否匹配.它是一种子查询形式.您可以在FILTER中使用它,或者如果您确实想要返回true/false:

BIND(EXISTS{?video ex:hasTag "A"} AS ?a)
Run Code Online (Sandbox Code Playgroud)

甚至:

SELECT ?video (EXISTS{?video ex:hasTag "A"} AS ?a) (EXISTS{?video ex:hasTag "B"} AS ?b)
{           
  ?video a ex:Video .
}
Run Code Online (Sandbox Code Playgroud)

  • 这是一个完整的模式: `EXISTS{ ?video ex:hasTag ?X 。过滤器(?X IN(“A”,“B”))}` (2认同)

use*_*512 4

尝试从这样的事情开始:

SELECT ?video ?tagA ?tagB {
  ?video a ex:Video .
  OPTIONAL { ?video ex:hasTag ?tagA . FILTER (?tagA = "A") }
  OPTIONAL { ?video ex:hasTab ?tagB . FILTER (?tagB = "B") }
}
Run Code Online (Sandbox Code Playgroud)

这将大致是你想要的。如果您确实必须有布尔值而不是简单检查未绑定的值,请使用:

SELECT ?video (bound(?tagA) as ?a) (bound(?tagB) as ?b) { ... }
Run Code Online (Sandbox Code Playgroud)

PS 子查询(非常接近,在撰写本文时提出的建议)在 SPARQL 1.1 中标准化