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


如图所示 这个问题 它具有相似的标题,我想通过知道其名称的一部分来检索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资源中有一个“单词”来搜索,该单词将是来自某个用户的输入。我们称之为“输入”。

我想,请求看起来像:

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

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

  1. 有没有描述Dbpedia资源类型的东西?我认为这不是本体论或其他任何东西。通过knwoing我想搜索所有资源,找到一个匹配...
  2. 我将提供的特定名称,或一些字符串。我考虑了FILTER选项,但这意味着获取所有资源,然后在它们被检索后按名称过滤它们,我猜,这不是那么优化。

那么,是否有人知道这个“主查询”通过提供其名称或其中的一部分来获取资源? (一个例子是提供“奥巴马”,并且不仅为巴拉克,而且为米歇尔获得结果)。

先谢谢你。


1385
2017-12-26 13:53


起源



答案:


我假设您在第一个问题中感兴趣的是只关注实例资源。我不知道你是否可以在一般情况下明确询问实例资源,因为在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,只需使用商店的功能和数据集的细节来解决您的问题。


15
2017-12-26 23:43



实际上,我们必须经历一个“技巧”(dcterms:subject),这真是一个耻辱,但是,嘿,我的请求仅适用于dbpedia资源。所以你的答案绝对令人惊讶,让我免于头痛。非常感谢。至于bif函数,我知道它们不符合SPARQL,这就是我寻找CONTAINS的原因,尽管我认为我仍然在寻找他们使用这个子句的例子。再次感谢您的回答,我与dbpedia&rdf的旅程才刚刚开始,但您刚刚给了我我需要的开始。 - Ged ort
这种方法存在一些痛苦的限制。它不允许空格。因此,如果您尝试获取“Barak Obama”的规范实体表示(或者以编程方式,您遇到的任何名称字符串,这是我的情况),则不能使用bif:contains。然后我想,也许URL编码字符串? ?label bif:contains "barak%20obama" .    没有骰子。也许两个单独的陈述来捕捉组成部分?不。 :( Virtuoso 37000 Error SP031: SPARQL compiler: More than one bif:contains() or similar predicate for '$label' variable in a single group  有任何想法吗? - sands
@sands你可以吗?标签bif:包含'“barak obama”'(注意额外的引号) - MrM
@MrM好点,我们也可以使用下划线来像'barak_obama'那样连接。 - user1583465


答案:


我假设您在第一个问题中感兴趣的是只关注实例资源。我不知道你是否可以在一般情况下明确询问实例资源,因为在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,只需使用商店的功能和数据集的细节来解决您的问题。


15
2017-12-26 23:43



实际上,我们必须经历一个“技巧”(dcterms:subject),这真是一个耻辱,但是,嘿,我的请求仅适用于dbpedia资源。所以你的答案绝对令人惊讶,让我免于头痛。非常感谢。至于bif函数,我知道它们不符合SPARQL,这就是我寻找CONTAINS的原因,尽管我认为我仍然在寻找他们使用这个子句的例子。再次感谢您的回答,我与dbpedia&rdf的旅程才刚刚开始,但您刚刚给了我我需要的开始。 - Ged ort
这种方法存在一些痛苦的限制。它不允许空格。因此,如果您尝试获取“Barak Obama”的规范实体表示(或者以编程方式,您遇到的任何名称字符串,这是我的情况),则不能使用bif:contains。然后我想,也许URL编码字符串? ?label bif:contains "barak%20obama" .    没有骰子。也许两个单独的陈述来捕捉组成部分?不。 :( Virtuoso 37000 Error SP031: SPARQL compiler: More than one bif:contains() or similar predicate for '$label' variable in a single group  有任何想法吗? - sands
@sands你可以吗?标签bif:包含'“barak obama”'(注意额外的引号) - MrM
@MrM好点,我们也可以使用下划线来像'barak_obama'那样连接。 - user1583465