【问题标题】:Extract triples containing particular substring using SPARQL使用 SPARQL 提取包含特定子字符串的三元组
【发布时间】:2014-02-11 12:26:38
【问题描述】:

我想提取一个三元组,它的主题中包含“爱丽丝”这个词。我使用的查询是:

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\") .}

请让我知道我哪里出了问题以及这种行为的原因是什么。

【问题讨论】:

    标签: regex sparql


    【解决方案1】:

    我假设引号周围的转义只是复制和粘贴的残余。 regex 的第一个参数必须是文字,但文字不能是 RDF 中三元组的主题,因此您的数据不应该与此模式匹配。但是,您可能拥有的是 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,那么正则表达式将考虑 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 DBpedia 使用 Virtuoso 作为其端点。它的实现“有用地”扩展了 regex 以接受非字符串,即使标准说 regex 将文字作为其参数。我说“有帮助”是因为虽然它可能使 Virtuoso 的查询变得更简单,但最终会遇到不可移植的查询,当您将它们带到其他环境时会失败。如果您关心可移植性和遵守标准,可以通过sparql.org's general purpose query engine 测试查询。
    • 我也是这么想的。还没有遇到 sparql.org 引擎,看起来很方便。但我真的不明白它查询什么数据(如果有的话)。你如何让它在图表上运行(例如:dbpedia?)。
    • 对于在线可用的小型数据集,您只需将数据集的 URL 粘贴到“目标图 URI”字段中即可。对于具有远程端点的较大数据集,您可以在查询中使用 service 关键字,但这将依赖于执行查询的远程服务器,因此您可能仍会获得 Virtuoso 特定的结果。
    • 只想提一下,对于有问题的精确查询,contains() 的工作方式与 regex() 相同或更正确(因为它需要文字字符串)
    猜你喜欢
    • 2023-03-24
    • 1970-01-01
    • 2016-08-31
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多