dbpediasparql可选

dbpediasparql可选,sparql,dbpedia,Sparql,Dbpedia,我正在运行这个简单的查询 前缀p: 选择*WHERE{ ?个人术语:主题类别:英国新闻工作者。 可选{个人p:name?name}。 可选{个人p:dateOfBirth?dob}。 } 限制10 我希望从他们是否有姓名和出生日期中获得前10名。我得到了前10个人谁拥有这两个属性。例如,安德鲁·罗斯坦之后有两名失踪人员 我做错了什么?您的查询的问题是a)限制限制返回的行数,而不是主题,以及b)有些人有多个名字 例如,记者丹尼尔·辛格(http://dbpedia.org/resource/Da

我正在运行这个简单的查询

前缀p:
选择*WHERE{
?个人术语:主题类别:英国新闻工作者。
可选{个人p:name?name}。
可选{个人p:dateOfBirth?dob}。
}
限制10

我希望从他们是否有
姓名
出生日期
中获得前10名。我得到了前10个人谁拥有这两个属性。例如,安德鲁·罗斯坦之后有两名失踪人员


我做错了什么?

您的查询的问题是a)
限制
限制返回的行数,而不是主题,以及b)有些人有多个名字

例如,记者丹尼尔·辛格(
http://dbpedia.org/resource/Daniel_Singer_(记者)
)至少有两个名字:
“丹尼尔·辛格”@en
“辛格,丹尼尔”@en
。这使他作为主题的行数增加了一倍

如果您
按人分组
,则确保每行只有一人。然后,您需要对姓名和出生日期进行抽样,以便每人只挑选一个

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
前缀p:
选择人员(样本(?姓名)作为名称(样本(?dob)作为adob),其中{
?个人术语:主题类别:英国新闻工作者。
可选{个人p:name?name}。
可选{个人p:dateOfBirth?dob}。
}
按人分组
限制10

(我不确定
SAMPLE
如何处理未绑定的情况,即没有名称的情况)

根据O.R Mapper的评论-删除限制会带来完整的结果集,这表明可选实际上是有效的。
谢谢。

“我希望能从……得到前10个人-为什么?当没有指定订单时,是什么让您认为您可以依赖任何特定的订单?正如@O.R.Mapper所说,您的问题很模糊。你到底想干什么?@O.R.Mapper点击点。删除限制带来了完整的结果集,这表明可选的事实上是工作的。谢谢!当每个人都需要一个记录并且任何样本名称都可以接受时,这是一个很好的技巧。原始查询为我提供了所有名称变体。如果需要所有变体,可以使用不同的聚合器:
GROUP\u CONCAT(?.name;separator=“,”)
而不是
SAMPLE
。这将生成一个包含所有名称的单一值。
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