如何构建更好的SPARQL查询,以便仅从DBpedia获取所需的数据?(was:“如何使用dbpediasparql摆脱多行”)

如何构建更好的SPARQL查询,以便仅从DBpedia获取所需的数据?(was:“如何使用dbpediasparql摆脱多行”),sparql,dbpedia,Sparql,Dbpedia,我跑了。我希望每位总统只获得一次提名,但由于其中一些人的出生地有多个条目,所以会有多行。 我只想要他们出生的州 :Abraham_Lincoln [http] :Hodgenville,_Kentucky [http] - - :Barack_Obama [http] :Kapiolani_Medical_Center_for_Women_and_Children [http] - - :Bill_Clinton [http] :Hope,_Arkansas [http

我跑了。我希望每位总统只获得一次提名,但由于其中一些人的出生地有多个条目,所以会有多行。

我只想要他们出生的州

: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 
专注于

我只想要他们出生的州

而不是

如何使用dbpediasparql消除多行

这可能是一个解决方案:

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
专注于

我只想要他们出生的州

而不是

如何使用dbpediasparql消除多行

这可能是一个解决方案:

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

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

因此,我们需要弄清楚美国各州是如何区别于DBPedia中的其他地方的

让我们以肯塔基州为例。代表肯塔基州的资源是。如果我们向下滚动概述该资源属性的页面,我们会发现
rdf:type
关系的多个条目,但最适合我的条目是
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知道肯塔基州的霍奇维尔位于肯塔基州。它怎么知道?好的,看看霍奇维尔的资源页面:。您将看到它与代表肯塔基州的资源之间存在
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中,没有显式地对哪个开始日期属于哪个结束日期进行建模,所以您只需为开始日期和结束日期的每个组合得到一个结果,总共四个。也许有一种方法可以查询(一种方法是使用
组concat
聚合将开始日期和结束日期分组在一起),但这种边缘情况可能更容易在后处理中处理它。

因为SPARQL是一种模式匹配语言,所以当您的查询结果“太宽/太一般”时,就是创建一个更具体的模式。在这种情况下,您的目的不仅仅是要取回标记为
dbo:birthPlace
值的所有资源,而是只取回那些代表美国各州的资源

因此,我们需要弄清楚美国各州是如何区别于DBPedia中的其他地方的

让我们以肯塔基州为例。代表肯塔基州的资源是。如果我们向下滚动概述该资源属性的页面,我们会发现
rdf:type
关系的多个条目,但最适合我的条目是
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知道肯塔基州的霍奇维尔位于肯塔基州。它怎么知道?好的,看看霍奇维尔的资源页面:。您将看到它与代表肯塔基州的资源之间存在
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中,没有显式地对哪个开始日期属于哪个结束日期进行建模,所以您只需为开始日期和结束日期的每个组合得到一个结果,总共四个。可能有一种方法可以对此进行查询(一种方法是