【问题标题】:SPARQL query for specific informationSPARQL 查询特定信息
【发布时间】:2018-07-05 12:46:01
【问题描述】:

我正在努力创建一些 SPARQL 查询。我需要 3 个具体的东西,这就是我目前所拥有的:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX dbpedia: <http://dbpedia.org/resource/>
PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX dbp: <http://dbpedia.org/property/>

select distinct ?title ?author ?country ?genre ?language
where {
  ?s rdf:type dbo:Book;
  dbp:title ?title;
  dbp:author ?author;
  dbp:country ?country;
  dbp:genre ?genre;
  dbp:language ?language.

}

此查询将为我提供所有书籍的列表。我真正需要的是能够向此代码添加一些过滤器。我想过滤 3 件事:

  • 特定的标题名称(例如,使用“harry potter”搜索标题)
  • 具体的作者姓名(例如,使用“J. K. Rowling”搜索作者)
  • 特定类型(例如,使用“冒险”搜索类型)

我已经为此苦苦挣扎了太久,我根本无法定义这 3 个查询。我正在尝试实现一个函数,该函数将使用用户表单传递的参数执行 SPARQL 语句。我在这里和网络上找到了一些示例,但我无法构建这 3 个特定的查询。

【问题讨论】:

  • 您想通过给定的字符串查找书籍吗?在代表过滤条件的资源标签上使用正则表达式。更好的是,使用bif:contains。例如,获取作者的英文标签,然后对其进行过滤。
  • 您还需要查看您要查找的内容示例的描述,例如 dbpedia.org/resource/Harry_Potter_and_the_Goblet_of_Fire>。 (“太长”是多长时间?这感觉很像最后一刻的功课……)
  • 你讽刺的这个“太长”就像一个月。我必须为使用系统推荐、用户界面等的新网站系统创建很多东西,但我根本无法理解 RDF/SPARQL。这是我项目中唯一缺少的部分。目前,我可以执行上面列出的 SPARQL 并使用从此查询中检索到的信息填充网页,但我需要一些返回相同列的特定查询,以便我可以使用特定结果填充搜索页面。我希望能够指定来自网站输入的作者类型或名称
  • @AKSW 我从您那里看到了一个允许搜索特定书名的示例,但即使使用该示例,我也无法看到如何为这 3 个目的构建查询。不仅如此,我不知道如何只接收那些字段(而不是 SELECT *)。我不擅长 RDF/SPARQL,但无论如何感谢您的建议。
  • 最小化的例子:select * where { ?s rdf:type dbo:Book; dbo:author ?author . ?author rdfs:label ?authorLabel . FILTER(LANGMATCHES(LANG(?authorLabel), 'en')) ?authorLabel bif:contains "Rowling" }

标签: sparql virtuoso


【解决方案1】:

如上所述,并非每本书都有所有属性,您的某些属性可能根本不存在。比如我根据Harry Potter and the Goblet of Fire的描述把dbp:genre改成了dbo:literaryGenre。请参阅query formresults

SELECT *
WHERE
 { ?s rdf:type dbo:Book .
   ?s rdfs:label ?bookLabel . 
      FILTER(LANGMATCHES(LANG(?bookLabel), 'en')) 
   ?s dbo:author ?author . 
   ?author rdfs:label ?authorLabel . 
      FILTER(LANGMATCHES(LANG(?authorLabel), 'en')) 
   ?authorLabel bif:contains "Rowling" 
   OPTIONAL { ?s dbp:country ?country .
              ?country rdfs:label ?countryLabel .
                 FILTER(LANGMATCHES(LANG(?countryLabel), 'en')) }
   OPTIONAL { ?s dbo:literaryGenre ?genre .
              ?genre rdfs:label ?genreLabel .
                 FILTER(LANGMATCHES(LANG(?genreLabel), 'en')) }
   OPTIONAL { ?s dbp:language ?language .
              ?language rdfs:label ?languageLabel .
                 FILTER(LANGMATCHES(LANG(?languageLabel), 'en')) }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    • 2022-08-25
    相关资源
    最近更新 更多