使用SPARQL提取包含特定子字符串的三元组

时间:2014-02-11 12:26:39

标签: regex sparql

我想在其主题中提取包含单词“alice”的三元组。我使用的查询是:

SELECT ?s ?p ?o  WHERE { ?s ?p ?o .FILTER regex(?s, \"alice\") .}

尽管有三重符合这一约束条件,但这并没有给我任何结果。

另一方面,当我使用相同的查询来提取其对象中包含单词brillant的三元组时。它只返回两个可能匹配中的一个。

使用的查询是:

SELECT ?s ?p ?o  WHERE { ?s ?p ?o .FILTER regex(?o, \"brillant\") .}

请让我知道我哪里出错了,这种行为的原因是什么。

1 个答案:

答案 0 :(得分:18)

我会假设引号周围的转义只是复制和粘贴的残余。 regex的第一个参数必须是文字,但文字不能成为RDF中三元组的主题,因此您拥有的数据不应与此模式匹配。但是,您可能拥有的主题是URI,其URI包含字符串“alice”,您可以使用str函数获取URI的字符串表示形式。例如,

SELECT ?s ?p ?o  WHERE { ?s ?p ?o .FILTER regex(str(?s), "alice") .}

为了说明这一点,让我们使用两个值<http://example.org>"string containing example",然后像在原始查询中一样进行过滤:

select ?x where {
  values ?x { <http://example.org> "string containing example" }
  filter( regex(?x, "exam" ))
}
-------------------------------
| x                           |
===============================
| "string containing example" |
-------------------------------

我们只有"string containing example",因为另一个值不是字符串,因此不适合regex。但是,如果我们将调用添加到str,那么它是regex将考虑的URI的字符串表示形式:

select ?x where {
  values ?x { <http://example.org> "string containing example" }
  filter( regex(str(?x), "exam" ))
}
-------------------------------
| x                           |
===============================
| <http://example.org>        |
| "string containing example" |
-------------------------------