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个人,无论他们是name
还是dateOfBirth
。我得到了前两个有两个属性的人。对于例如Andrew Rothstein之后有2名失踪人员。
我做错了什么?
答案 0 :(得分:2)
您的查询存在的问题是:a)LIMIT
限制了返回的行的数量,而不是主题; b)某些人拥有多个名称。
因此,例如,记者Daniel Singer(http://dbpedia.org/resource/Daniel_Singer_(journalist)
)至少有两个名字:"Daniel Singer"@en
和"Singer, Daniel"@en
。这使他作为主题的行数增加了一倍。
如果您GROUP BY ?person
,每行只能确保一个人。然后,您需要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
(我不确定SAMPLE
对未绑定的案件有多好,即没有名字的情况下)
答案 1 :(得分:0)
根据O.R Mapper的评论 - 删除限制会带来完整的结果集,这表明OPTIONAL实际上正在运行。 谢谢。