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:)type是什么。目标是搜索“任何东西”,只知道名称或其中的一部分。

在问你们这个问题之前,我一直在做一些研究,我已经知道可以使用 bif 函数(不好的方法,因为它不符合 sparql)或 CONTAINS 子句来解决“名称的一部分”问题,但我找不到任何展示如何使用它的例子。

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

我想,请求看起来像:

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

我的主要问题是关于两个主要方面:

  1. 是否有任何描述 Dbpedia Resource 类型的内容?我不认为它存在于本体或任何东西中。通过知道我想在所有资源中搜索以找到一个匹配...
  2. 我将提供的特定名称或一些字符串。我考虑了 FILTER 选项,但这意味着获取所有资源,然后在它们被检索后按它们的名称过滤它们,我想这不是那么理想。

那么,有没有人知道这个“主查询”通过提供它的名称来获取资源,或者它的一部分?(一个例子是提供“奥巴马”,不仅为 Barrack,而且为 Michelle 获得结果)。

先感谢您。

4

1 回答 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 仅使用商店的功能和数据集的细节来解决您的问题。

于 2011-12-26T23:43:05.893 回答