如何构建更好的SPARQL查询,以便只从DBpedia获取我想要的数据? (是:"如何使用DBPEDIA SPARQL排除多行")

时间:2017-12-07 20:58:46

标签: sparql dbpedia

我从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 

2 个答案:

答案 0 :(得分:2)

由于SPARQL是一种模式匹配语言,当您的查询结果过于宽泛/一般"时,诀窍是创建更具体的模式。在这种情况下,您的目的不仅仅是获取标记为dbo:birthPlace值的所有资源,而仅 那些代表美国州的资源。

因此,我们需要弄清楚美国各州与DBPedia中其他地方的区别。

让我们以肯塔基州为例。代表肯塔基州的资源是http://dbpedia.org/resource/Kentucky。如果我们向下滚动页面概述该资源的属性,我们会找到rdf:type关系的多个条目,但最适合我跳出的条目是yago:WikicatStatesOfTheUnitedStateshttp://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