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

19

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

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

尽管有一个满足此约束条件的三元组,但这并没有给我任何结果。

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

所使用的查询是:

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

请告诉我我做错了什么,以及这种行为的原因是什么。

1个回答

30
我假设引号周围的转义符只是复制和粘贴的残留物。regex 的第一个参数必须是文字,但文字不能成为 RDF 三元组的主语,因此您没有应该匹配此模式的数据。但是,您可能具有 URI 包含字符串“alice”的主题,并且您可以使用 str 函数获取 URI 的字符串表示形式。例如,
SELECT ?s ?p ?o  WHERE { ?s ?p ?o .FILTER regex(str(?s), "alice") .}

为了举例说明,让我们使用两个值<http://example.org>"包含示例的字符串",并像您在原始查询中所做的那样进行过滤:
select ?x where {
  values ?x { <http://example.org> "string containing example" }
  filter( regex(?x, "exam" ))
}

-------------------------------
| x                           |
===============================
| "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" |
-------------------------------

在DBPedia的sparql端点上测试您的第一个代码片段会同时返回两个值,而不仅仅是字符串。 - DieterDP
4
DBpedia使用Virtuoso作为它的终端节点。虽然标准规定regex需要以字面量作为参数,但是它的实现“友好地”扩展了regex以接受非字符串类型的参数。我说“友好”是因为虽然这可以使在Virtuoso上查询更容易,但你最终得到的查询将不具备可移植性,在将其应用到其他环境时会失败。如果你关心查询的可移植性和符合标准,那么在sparql.org的通用查询引擎中测试查询可能会有所帮助。 - Joshua Taylor
我也是这么想的。还没有接触过sparql.org引擎,看起来很方便。但我不太明白它查询了哪些数据(如果有的话)。你怎样才能在一个图上运行它(例如:dbpedia)? - DieterDP
对于在线可用的小型数据集,您可以将数据集的URL粘贴到“目标图形URI”字段中。对于具有远程端点的大型数据集,您可以在查询中使用service关键字,但这将依赖于远程服务器执行查询,因此您可能仍会获得Virtuoso特定的结果。 - Joshua Taylor
2
只想提一下,在问题的确切查询中,contains() 的工作方式与 regex() 相同或更正确(因为它采用字面字符串)。 - phiresky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接