【问题标题】:SPARQL Construct Clause to include predicate literalsSPARQL 构造子句以包含谓词文字
【发布时间】:2013-10-26 23:35:00
【问题描述】:

我正在尝试使用 SPARQL CONSTRUCT 从 dbpedia 中删除一组数据 - 我只对一组艺术家感兴趣,并且我希望 Sesame 尽可能小以提高速度。

我认为我可以做的是使用 CONSTRUCT 来获取给定艺术家的每个谓词。我可以让第一个 CONSTRUCT 子句起作用,以确保我输入“Person”,但这只会让我满足该子句的三倍 - 我想要他们的名字、标签、出生地等。我下面的查询试图在第二个 CONSTRUCT 子句中捕获莫奈的名字?如果我做对了,这会给我三倍的

<http://dbpedia.org/resource/Claude_Monet>  
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type>   
<http://xmlns.com/foaf/0.1/Person>

还有这样的三元组

<http://dbpedia.org/resource/Claude_Monet>  
<http://xmlns.com/foaf/0.1/name>
"Claude Monet"@en

如何让我的查询使用莫奈名字的对象作为变量,以便在我插入空引号的地方使用?这是查询

PREFIX purl: <http://purl.org/dc/elements/1.1/>
PREFIX foaf:    <http://xmlns.com/foaf/0.1/>
CONSTRUCT {
  ?s a foaf:Person .
  ?s foaf:name ""
} WHERE { 
  ?s foaf:surname "Monet"@en . 
  ?s purl:description "Painter"@en
} LIMIT 100

非常感谢任何帮助

迈克

【问题讨论】:

  • 很高兴看到您回答了您的问题!你可能也想accept it。 (接受您自己的答案是完全可以的;毕竟,您可以知道什么最适合您。)不过,您的答案中的代码可以简化一点,我确实在my answer 中展示了如何.

标签: rdf sparql sesame


【解决方案1】:

我们到了,就是这样。一旦我弄清楚了 CONSTRUCT 和 WHERE 之间的变量绑定,它实际上就很简单了。

每个 WHERE 语句从 repo 中选择这些值,并且需要在 CONSTRUCT 中引用相同变量的匹配模板语句。该值刚刚被替换。我想很明显。

自我注意 - 必须停止像 RDBMS 那样思考。

PREFIX purl: <http://purl.org/dc/elements/1.1/>
PREFIX foaf:    <http://xmlns.com/foaf/0.1/>
PREFIX dbont:  <http://dbpedia.org/ontology/>
PREFIX w3: <http://www.w3.org/2000/01/rdf-schema#>

CONSTRUCT 
{
    ?s a foaf:Person .
    ?s foaf:name ?a .
    ?s foaf:surname ?b .
    ?s foaf:givenName ?c .
    ?s w3:label ?d .
    ?s purl:description ?e .
    ?s dbont:birthPlace ?f .
    ?s dbont:deathPlace ?g .
    ?s dbont:birthDate ?h .
    ?s dbont:deathDate ?i
}  
WHERE {
    ?s foaf:name ?a .
    ?s foaf:surname ?b .
    ?s foaf:givenName ?c .
    ?s w3:label ?d .
    ?s purl:description ?e .
    ?s dbont:birthPlace ?f .
    ?s dbont:deathPlace ?g .
    ?s dbont:birthDate ?h .
    ?s dbont:deathDate ?i .
    ?s purl:description "Painter"@en
}

【讨论】:

  • 我认为由于您的CONSTRUCT 将包含来自WHERE 的所有三元组,因此您可以只使用CONSTRUCT WHERE { ... }(参见SPARQL 1.1 建议中的CONSTRUCT WHERE)。我意识到?s purl:description "Painter"@en 不在CONSTRUCT 部分,但同样的三元组将匹配?s purl:description ?e,所以你也会在结构中得到那个三元组。
  • 这也意味着你可以使用construct where { ... ?s purl:description ?e, "Painter"@en },它会更短一些。事实上,你可以这样做construct where { ?s foaf:name ?a ; foaf:surname ?b ; ... ; purl:description ?e, "Painter"@en }
【解决方案2】:

作为替代/速记,您还可以使用 DESCRIBE 查询,例如:

DESCRIBE <http://dbpedia.org/resource/Claude_Monet>

将为您提供一个包含&lt;http://dbpedia.org/resource/Claude_Monet&gt; 的所有传入和传出属性的子图,或者:

DESCRIBE ?x WHERE { ?x purl:description "Painter"@en }

将为您提供具有匹配purl:description 的所有?x 的子图。

当然,这使您对提取的确切三元组的控制较少,但从好的方面来说,它更短,并且如果特定资源不存在某些三元组模式(例如,您的 CONSTRUCT 查询不会如果出于某种原因特定画家没有 deathDatefoaf:surname 或 WHERE 子句中的任何其他属性,则匹配)。

一个小警告:DESCRIBE 查询结果的精确内容取决于实现。例如,一些三元存储可能选择只返回传出属性。但是 Sesame(我相信还有 DBPedia 端点)会返回所谓的Symmetric Concise Bounded Description

【讨论】:

    【解决方案3】:

    我看到你已经answered you own question,但我想指出的是,当construct 查询返回的三元组与where 部分匹配的三元组完全相同时,并且where 部分没有太花哨的东西,你可以使用特殊的速记construct where

    16.2.4 CONSTRUCT WHERE

    为案例提供了一个简短的 CONSTRUCT 查询表单 其中模板和模式相同且模式为 只是一个基本的图形模式(没有FILTERs,也没有复杂的图形模式 允许以简写形式)。关键字 WHERE 是必需的 简短的形式。

    使用construct where,以及使用DBpedia SPARQL endpoint 已经定义的相同namespaces(这是常规的,例如rdfs 而不是w3,和dc 而不是purl ),您的查询变为:

    construct where {
        ?s foaf:name ?a ;
           foaf:surname ?b ;
           foaf:givenName ?c ;
           rdfs:label ?d ;
           dc:description ?e, "Painter"@en ;
           dbpedia-owl:birthPlace ?f ;
           dbpedia-owl:deathPlace ?g ;
           dbpedia-owl:birthDate ?h ;
           dbpedia-owl:deathDate ?i .
    }
    

    SPARQL results

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-20
      • 2011-09-25
      • 1970-01-01
      • 2010-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多