【问题标题】:DBPedia SPARQL OPTIONALDBPedia SPARQL 可选
【发布时间】:2015-04-02 13:21:12
【问题描述】:

我在 http://dbpedia.org/sparql 上运行这个简单的查询

PREFIX p: <http://dbpedia.org/property/>
SELECT * WHERE {
    ?person dcterms:subject category:British_journalists .
    OPTIONAL { ?person p:name ?name } .
    OPTIONAL { ?person p:dateOfBirth ?dob } .

}
LIMIT 10

我希望从http://dbpedia.org/resource/Category:British_journalists 获得前 10 人,无论他们是否有namedateOfBirth。我得到了前 10 个同时拥有这两个属性的人。例如在 Andrew Rothstein 之后还有 2 人失踪。

我做错了什么?

【问题讨论】:

  • “我希望从……获得前 10 个人”——为什么?是什么让您认为在没有指定的情况下可以依赖任何特定的排序?
  • 正如@O.R.Mapper 建议的那样,您的问题含糊不清。你真正想做什么?
  • @O.R.Mapper 点已被占用。删除限制会带来完整的结果集,这表明 OPTIONAL 实际上正在工作。

标签: sparql dbpedia


【解决方案1】:

您的查询的问题在于 a) LIMIT 限制了返回的 的数量,而不是主题,并且 b) 有些人有多个名字。

例如,记者 Daniel Singer (http://dbpedia.org/resource/Daniel_Singer_(journalist)) 至少有两个名字:"Daniel Singer"@en"Singer, Daniel"@en。以他为主题的行数增加了一倍。

如果您GROUP BY ?person 您确保每行只有一个人。然后,您需要SAMPLE 姓名和 dobs 才能为每个人选择一个。

PREFIX p: <http://dbpedia.org/property/>
SELECT ?person (SAMPLE(?name) as ?aname) (SAMPLE(?dob) as ?adob) WHERE {
    ?person dcterms:subject category:British_journalists .
    OPTIONAL { ?person p:name ?name } .
    OPTIONAL { ?person p:dateOfBirth ?dob } .
}
GROUP BY ?person
LIMIT 10

(我不确定SAMPLE 处理未绑定案例的效果如何,即没有名称的地方)

【讨论】:

  • 谢谢!当每个人需要一条记录并且任何样本名称都可以接受时,这是一个很好的技巧。原始查询给了我所有的名称变体。
  • 如果您想要所有变体,您可以使用不同的聚合器:GROUP_CONCAT(?name ; separator=",") 而不是 SAMPLE。这会产生一个包含所有名称的单个值。
【解决方案2】:

根据 O.R Mapper 的评论 - 删除限制会带来完整的结果集,这表明 OPTIONAL 实际上正在工作。 谢谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-28
    • 1970-01-01
    • 2017-04-16
    • 1970-01-01
    • 1970-01-01
    • 2010-11-01
    • 2023-03-17
    • 1970-01-01
    相关资源
    最近更新 更多