我想在其主题中提取包含单词“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\") .}
请让我知道我哪里出错了,这种行为的原因是什么。
答案 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" |
-------------------------------