使用SPARQL通过字符串名称检索DBpedia资源,而不知道其类型

11

这个问题 所示,我想通过知道其部分名称来检索一个dbpedia资源。当涉及到SPARQL这样的东西时,我是个初学者,但该问题中的示例帮了我很多,因为作者搜索了“罗马尼亚”,而回答者提供了一个Sparql请求来完成任务。 这很好,但事实是:

在示例中,他们已经“知道”罗马尼亚是一个国家,因此

    ?c a dbpedia-owl:Country ;

在WHERE子句中。完整的SPARQL请求如下:

    SELECT ?c
    WHERE {
    ?c a dbpedia-owl:Country ;
    foaf:name "Romania"@en .
    FILTER NOT EXISTS {?c dbpedia-owl:dissolutionYear ?y}
    } 

然而,这个问题并没有完全回答我们的需求,因此我们需要搜索任何资源的名称,"名称"是实际资源的名称或其中一部分,而不考虑其(rdf:)类型。目标是搜索"任何东西",只知道名称或其中一部分。

在向你们提问之前,我已经做过一些研究,我已经知道"名称的一部分"问题可以通过bif函数解决(这是不符合Sparql标准的不良方法),或者使用CONTAINS子句,但我找不到任何示例说明如何使用它。

现在假设有一个要在dbpedia资源中搜索的"单词",该单词将是某个用户输入的。让我们称之为"INPUT"。

我想象中的请求应该是:

   SELECT ?something WHERE
   {
    ?something a (dbpedia Resource).
    CONTAINS(?something,"INPUT")
   }

我的主要问题涉及两个方面:

  1. 是否有任何描述Dbpedia资源类型的东西?我认为这不在本体论或其他任何地方。通过了解这一点,我想在所有资源中搜索一个匹配项...
  2. 我会提供一个特定名称或某个字符串。我考虑了“FILTER”选项,但那意味着获取所有资源,然后在检索到它们之后按名称过滤它们,这可能不是最优的。

因此,是否有人知道通过提供其名称或其中一部分来获取资源的“主查询”?(例如提供“Obama”,并获得不仅针对巴拉克,还包括米歇尔的结果)。

提前感谢你。

1个回答

15

我假设你在第一个问题中只对实例资源感兴趣。我不知道在一般情况下是否可以明确地仅查询实例资源,因为在RDF中一切都是资源。如果您特别需要DBpedia数据集中的这种资源,您可以查询具有dcterms:subject属性的资源(在DBPedia中,仅实例资源具有dcterms:subject)。因此,您可以像这样查询:

SELECT DISTINCT ?s ?label WHERE {
            ?s rdfs:label ?label . 
            FILTER (lang(?label) = 'en'). 
            ?label bif:contains "Obama" . 
            ?s dcterms:subject ?sub 
}
同样的,对于您的第二个问题-如果您只使用DBpedia数据集,您可能需要使用“bif:contains”,尽管它不符合SPARQL规范。我认为没有其他最佳方法来解决这个问题,正如您所说,如果您需要快速执行查询,使用FILTER将不是最优的选择。我认为关键字搜索和索引是由每个三元组存储库按需处理的,目前还没有标准化的全文搜索方式。

因此,总结一下,如果您只使用dbpedia,请使用存储库的特性和数据集的详细信息来解决您的问题。


其实很遗憾我们必须通过“技巧”(dcterms:subject)来解决问题,但是嘿,我的请求只针对dbpedia资源。所以你的回答非常棒,让我省了很多麻烦。非常感谢你。至于bif函数,我知道它们不符合SPARQL标准,这就是为什么我寻找CONTAINS的原因,尽管我认为我仍然会寻找使用此子句的示例。所以再次感谢您的回答,我的dbpedia和rdf之旅才刚刚开始,但是您已经给了我需要的起点。 - Ged ort
这种方法有一些痛苦的限制。它不允许空格。因此,如果您尝试获取“Barak Obama”的规范实体表示(或以编程方式遇到的任何名称字符串,这是我的情况),则不能使用bif:contains。然后我想,也许对字符串进行URL编码??label bif:contains "barak%20obama" .没有用。也许两个单独的语句来捕获组成部分?不行。:(Virtuoso 37000错误SP031:SPARQL编译器:在单个组中为“$label”变量有多个bif:contains()或类似谓词有什么想法吗? - sands
3
@sands 你可以执行以下操作吗?标签为 bif:contains,并包含 "barak obama"(请注意引号)的内容。 - MrM
1
@MrM 很好的观点,我们也可以使用下划线连接,例如 'barak_obama'。 - user1583465

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