2015-04-02 73 views
0

我上http://dbpedia.org/sparqlDBpedia的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人失踪。

我在做什么错?

+1

“我希望得到前10个人......” - 为什么?什么让你认为你可以依赖任何特定的订单,当没有指定时? – 2015-04-02 13:24:40

+0

由于@ O.R.Mapper建议你的问题含糊不清。你真的想做什么? – Artemis 2015-04-02 13:58:59

+0

@ O.R.Mapper Point采取。删除限制带来了完整的结果集,显示OPTIONAL实际上正在工作。 – Gemseeker 2015-04-02 14:49:29

回答

2

与您的查询的问题是,a)LIMIT限制行的数量返回,而不是主题,和b)有些人有多个名称。例如,记者丹尼尔·辛格(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结合的情况下,即扮演那里是不是名字)

+0

谢谢!当每个人需要单个记录并且任何样本名称都可接受时,这是一个很棒的技巧。最初的查询给了我所有的名字变体。 – Gemseeker 2015-04-02 14:54:47

+0

如果你想要所有的变体,你可以使用不同的聚合器:'GROUP_CONCAT(?name; separator =“,”)'而不是'SAMPLE'。这对所有名称都是唯一的价值。 – user205512 2015-04-02 15:22:35

+0

太棒了!谢谢。 – Gemseeker 2015-04-02 15:30:46

0

按OR映射的评论 - 去除限制带来的整个结果集,这表明可选实际上是有效的。 谢谢。