我从SPARQL Explorer at DBpedia开始。我希望每个总统只有一次,但由于他们中的一些人有多个出生地条目,它会提供多行。
SELECT DISTINCT ?person ?birthPlace ?presidentStart ?presidentEnd
WHERE {
?person dct:subject dbc:Presidents_of_the_United_States.
?person dbo:birthPlace ?birthPlace .
OPTIONAL { ?person dbp:presidentEnd ?presidentEnd } .
OPTIONAL { ?person dbp:presidentStart ?presidentStart } .
FILTER ( regex(?birthPlace, "_") OR
regex(?birthPlace, ";_")
) .
}
GROUP BY ?person
ORDER BY ?presidentStart ?person
LIMIT 100
我想只有他们出生的STATE。
:Abraham_Lincoln [http] :Hodgenville,_Kentucky [http] - -
:Barack_Obama [http] :Kapiolani_Medical_Center_for_Women_and_Children [http] - -
:Bill_Clinton [http] :Hope,_Arkansas [http] - -
:Dwight_D._Eisenhower [http] :Denison,_Texas [http] - -
:George_W._Bush [http] :New_Haven,_Connecticut [http] - -
:George_Washington [http] :Westmoreland_County,_Virginia [http] - -
:George_Washington [http] :British_America [http] - -
:George_Washington [http] :George_Washington_Birthplace_National_Monument [http] - -
:James_A._Garfield [http] :Orange,_Ohio [http] - -
:James_A._Garfield [http] :Moreland_Hills,_Ohio [http] - -
:Jimmy_Carter [http] :Plains,_Georgia
答案 0 :(得分:2)
由于SPARQL是一种模式匹配语言,当您的查询结果过于宽泛/一般"时,诀窍是创建更具体的模式。在这种情况下,您的目的不仅仅是获取标记为dbo:birthPlace
值的所有资源,而仅 那些代表美国州的资源。
因此,我们需要弄清楚美国各州与DBPedia中其他地方的区别。
让我们以肯塔基州为例。代表肯塔基州的资源是http://dbpedia.org/resource/Kentucky。如果我们向下滚动页面概述该资源的属性,我们会找到rdf:type
关系的多个条目,但最适合我跳出的条目是yago:WikicatStatesOfTheUnitedStates
(http://dbpedia.org/class/yago/WikicatStatesOfTheUnitedStates)
如果我们修改你的查询以将其作为额外的限制,并删除奇怪的正则表达式,如下所示:
SELECT DISTINCT ?person ?birthPlace ?presidentStart ?presidentEnd
WHERE {
?person dct:subject dbc:Presidents_of_the_United_States.
?person dbo:birthPlace ?birthPlace .
?birthPlace a yago:WikicatStatesOfTheUnitedStates .
OPTIONAL { ?person dbp:presidentEnd ?presidentEnd } .
OPTIONAL { ?person dbp:presidentStart ?presidentStart } .
}
GROUP BY ?person
ORDER BY ?presidentStart ?person
LIMIT 100
你应该得到你需要的东西。
不幸的是,如果你尝试,你会发现你没有。这是因为DBPedia数据凌乱。上面的查询只返回三个结果,更糟糕的是,一个结果显然不正确:
person birthPlace presidentStart presidentEnd
dbr:Barack_Obama dbr:Hawaii
dbr:George_Washington dbr:Virginia
dbr:Theodore_Roosevelt dbr:New_York_City
这里有两件事:首先,纽约市在DBPedia中被错误地归类为州。其次,大多数总统都没有明确表示他们的国家被标记为他们的出生地,而只是像他们的家乡一样。
幸运的是,我们可以稍微修改一下。 DBPedia知道肯塔基州的HodgenVille位于肯塔基州。怎么知道的?那么,看看Hodgenville的资源页面:http://dbpedia.org/resource/Hodgenville,_Kentucky。您将看到它与代表肯塔基州的资源有dbo:isPartOf
关系。
所以,我们需要再次重新考虑我们的问题:我们希望每个总统的州都是他们的出生地是该州的一部分。在SPARQL中:
SELECT DISTINCT ?person ?birthState ?presidentStart ?presidentEnd
WHERE {
?person dct:subject dbc:Presidents_of_the_United_States.
?person dbo:birthPlace ?birthPlace .
?birthPlace dbo:isPartOf ?birthState .
?birthState a yago:WikicatStatesOfTheUnitedStates .
OPTIONAL { ?person dbp:presidentEnd ?presidentEnd } .
OPTIONAL { ?person dbp:presidentStart ?presidentStart } .
}
GROUP BY ?person
ORDER BY ?presidentStart ?person
LIMIT 100
这几乎可以让你获得所需的结果。
如你所知,更新,唐纳德特朗普在名单中失踪。这看起来是因为DBPedia落后于时代,他仍然被归类为总统候选人"而不是总统。
至于格罗弗·克利夫兰出现四次,这是一个有趣的异常现象。从1885年到1889年,以及从1893年到1897年,克利夫兰担任总统两个非连续条款。因此,有两个开始日期和两个结束日期。因为在DBPeda中没有明确建模哪个开始日期属于哪个结束日期,所以您只需获得开始日期和结束日期的每个组合的结果,总共四个。可能有一种方法来查询这个(一个选项是使用group_concat
聚合将开始日期和结束日期组合在一起),但是这样的边缘情况可能更简单地处理它在后期处理中。
答案 1 :(得分:0)
专注于
我想只有他们出生的国家
而不是
如何使用DBPEDIA SPARQL删除多行
这可能是一个解决方案:
SELECT DISTINCT ?person ?birthState ?presidentStart ?presidentEnd
WHERE {
?person dct:subject dbc:Presidents_of_the_United_States.
OPTIONAL { ?person dbp:presidentEnd ?presidentEnd } .
OPTIONAL { ?person dbp:presidentStart ?presidentStart } .
OPTIONAL {?person dbo:birthPlace/dbp:subdivisionType/dbp:territory ?birthState } .
FILTER ( regex(?birthState, "_") OR
regex(?birthState, ";_")
) .
}
GROUP BY ?person
ORDER BY ?presidentStart ?person
LIMIT 100